diff --git a/README.md b/README.md
index 15c9f0d..ae99890 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,9 @@ To find out what versions have been tested look at TestedVersions.txt in the pro
We will likely be slow to test new Minecraft versions, but you can probably assume
that EsTools will be fully functional on new versions.
-**We officially support Spigot/Bukkit/Paper 1.0.0 and above.**
+**We officially support the following:**
+- Bukkit/Spigot/Paper 1.0.0+
+- Folia Latest Build
For support DM us at: Discord: @copokbl and @calcilore. Or email support@serble.net.
diff --git a/TestedVersions.txt b/TestedVersions.txt
index 2804932..499f5be 100644
--- a/TestedVersions.txt
+++ b/TestedVersions.txt
@@ -1,5 +1,11 @@
-1.20.4
+Folia:
+1.20.4 Failing (/estools test)
+
+Bukkit:
+1.21
+1.20.6
1.19.4
+1.18.2
1.17.1
1.16.1
1.15.2
@@ -15,6 +21,4 @@
1.5.2
1.4.7
1.3.2
-1.2.5
-1.1.0
-1.0.0
\ No newline at end of file
+1.2.5
\ No newline at end of file
diff --git a/abstraction.md b/abstraction.md
new file mode 100644
index 0000000..c62ed5f
--- /dev/null
+++ b/abstraction.md
@@ -0,0 +1,3 @@
+# TODO
+- Fix testing on folia
+- Fix teleport event not working on folia
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 6764ab7..b6b4a7a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
net.serble.EsTools
EsTools
- 4.3.2
+ 5.0.0
jar
EsTools
@@ -37,7 +37,36 @@
org.bstats
net.serble.estools
+
+ co.aikar.taskchain
+ net.serble.taskchain
+
+
+ org.yaml.snakeyaml
+ net.serble.snakeyaml
+
+
+ com.google.gson
+ net.serble.gson
+
+
+
+ *:*
+
+ META-INF/*.SF
+ META-INF/*.DSA
+ META-INF/*.RSA
+ META-INF/MANIFEST.MF
+
+
+
+
+
+
+
+
+
@@ -70,6 +99,19 @@
jitpack.io
https://jitpack.io
+
+ papermc
+ https://repo.papermc.io/repository/maven-public/
+
+
+ aikar
+ https://repo.aikar.co/content/groups/aikar/
+
+
+ Sonatype-public
+ SnakeYAML repository
+ http://oss.sonatype.org/content/groups/public/
+
@@ -95,6 +137,29 @@
com.google.code.gson
gson
2.11.0
+ compile
+
+
+ io.papermc
+ paperlib
+ 1.0.7
+ compile
+
+
+ dev.folia
+ folia-api
+ 1.20.4-R0.1-SNAPSHOT
+ provided
+
+
+ co.aikar
+ taskchain-bukkit
+ 3.7.2
+
+
+ org.yaml
+ snakeyaml
+ 2.2-SNAPSHOT
diff --git a/src/main/java/net/serble/estools/Bitmask.java b/src/main/java/net/serble/estools/Bitmask.java
new file mode 100644
index 0000000..59b9b49
--- /dev/null
+++ b/src/main/java/net/serble/estools/Bitmask.java
@@ -0,0 +1,26 @@
+package net.serble.estools;
+
+public class Bitmask {
+ private final boolean[] bits;
+
+ public Bitmask(int value) {
+ bits = new boolean[32];
+ for (int i = 0; i < 32; i++) {
+ bits[i] = (value & (1 << i)) != 0;
+ }
+ }
+
+ public boolean getBit(int i) {
+ return bits[i];
+ }
+
+ public int getValueOfFirstBits(int amount) {
+ int value = 0;
+ for (int i = 0; i < amount; i++) {
+ if (bits[i]) {
+ value |= 1 << i;
+ }
+ }
+ return value;
+ }
+}
diff --git a/src/main/java/net/serble/estools/Commands/Back.java b/src/main/java/net/serble/estools/Commands/Back.java
index 6db555a..50a9c64 100644
--- a/src/main/java/net/serble/estools/Commands/Back.java
+++ b/src/main/java/net/serble/estools/Commands/Back.java
@@ -3,35 +3,38 @@
import java.util.HashMap;
import java.util.UUID;
+import net.serble.estools.ServerApi.EsEventListener;
+import net.serble.estools.ServerApi.EsLocation;
import net.serble.estools.Main;
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.entity.EntityEvent;
-import org.bukkit.event.entity.PlayerDeathEvent;
+import net.serble.estools.ServerApi.EsTeleportCause;
+import net.serble.estools.ServerApi.Events.EsPlayerDeathEvent;
+import net.serble.estools.ServerApi.Events.EsPlayerTeleportEvent;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.event.player.PlayerTeleportEvent;
+import net.serble.estools.ServerApi.ServerPlatform;
-public class Back extends EsToolsCommand implements Listener {
- private static final HashMap prevLocations = new HashMap<>();
+public class Back extends EsToolsCommand implements EsEventListener {
+ private static final HashMap prevLocations = new HashMap<>();
@Override
public void onEnable() {
- Bukkit.getServer().getPluginManager().registerEvents(this, Main.plugin);
+ Main.registerEvents(this);
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
+
+ if (Main.platform == ServerPlatform.Folia) {
+ send(sender, "&cCurrently due to Folia issues /back only works for death locations");
+ }
- Player p = (Player) sender;
+ EsPlayer p = (EsPlayer) sender;
if (prevLocations.containsKey(p.getUniqueId())) {
p.teleport(prevLocations.get(p.getUniqueId()));
send(sender, "&aTeleported to last location!");
@@ -42,24 +45,22 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return true;
}
- @EventHandler
- public void onDeath(PlayerDeathEvent e) {
- if (Main.majorVersion > 1) {
- prevLocations.put(e.getEntity().getUniqueId(), e.getEntity().getLocation());
- return;
- }
+ @Override
+ public void executeEvent(EsEvent event) {
+ if (event instanceof EsPlayerDeathEvent) {
+ EsPlayerDeathEvent e = (EsPlayerDeathEvent) event;
- try {
- Player p = (Player)EntityEvent.class.getMethod("getEntity").invoke(e);
+ EsPlayer p = e.getPlayer();
prevLocations.put(p.getUniqueId(), p.getLocation());
- } catch (Exception ex) {
- Bukkit.getLogger().severe(ex.toString());
+ return;
}
- }
- @EventHandler
- public void onTeleport(PlayerTeleportEvent e) {
- if (equalsOr(e.getCause(), PlayerTeleportEvent.TeleportCause.COMMAND, PlayerTeleportEvent.TeleportCause.PLUGIN)) {
+ if (event instanceof EsPlayerTeleportEvent) {
+ EsPlayerTeleportEvent e = (EsPlayerTeleportEvent) event;
+ if (Main.minecraftVersion.getMinor() > 9 &&
+ !equalsOr(e.getCause(), EsTeleportCause.Command, EsTeleportCause.Plugin, EsTeleportCause.Unknown)) {
+ return;
+ }
prevLocations.put(e.getPlayer().getUniqueId(), e.getPlayer().getLocation());
}
}
diff --git a/src/main/java/net/serble/estools/Commands/Buddha.java b/src/main/java/net/serble/estools/Commands/Buddha.java
index 2aa7029..8e8d6fa 100644
--- a/src/main/java/net/serble/estools/Commands/Buddha.java
+++ b/src/main/java/net/serble/estools/Commands/Buddha.java
@@ -1,36 +1,33 @@
package net.serble.estools.Commands;
-import net.serble.estools.ConfigManager;
+import net.serble.estools.Config.ConfigManager;
import net.serble.estools.EntityCommand;
import net.serble.estools.Main;
-import org.bukkit.Bukkit;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.entity.EntityDamageEvent;
+import net.serble.estools.ServerApi.EsEventListener;
+import net.serble.estools.ServerApi.Events.EsEntityDamageEvent;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
import java.util.*;
-public class Buddha extends EntityCommand implements Listener {
+public class Buddha extends EntityCommand implements EsEventListener {
private static final HashMap currentPlayers = new HashMap<>();
private static final String usage = genUsage("/buddha [entity] [time]");
+ private static final String configFile = "buddhas.yml";
- @Override
+ @SuppressWarnings("unchecked") // I'm right, trust me
+ @Override
public void onEnable() {
- Bukkit.getServer().getPluginManager().registerEvents(this, Main.plugin);
+ Main.registerEvents(this);
- FileConfiguration f = ConfigManager.load("gods.yml");
- List buddhas = f.getStringList("buddhas");
- buddhas.forEach(w -> currentPlayers.put(UUID.fromString(w), -1));
+ List f = (List) ConfigManager.load(configFile, ArrayList.class);
+ f.forEach(w -> currentPlayers.put(UUID.fromString(w), -1));
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- LivingEntity p;
+ public boolean execute(EsCommandSender sender, String[] args) {
+ EsLivingEntity p;
int timer = -1;
if (args.length == 0) {
@@ -38,7 +35,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- p = (LivingEntity) sender;
+ p = (EsLivingEntity) sender;
} else {
p = getEntity(sender, args[0]);
@@ -65,10 +62,10 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
if (taskId == -1) {
save();
} else {
- Bukkit.getScheduler().cancelTask(taskId);
+ Main.server.cancelTask(taskId);
}
- send(sender, "&aBuddha mode &6disabled&a for &6%s", getEntityName(p));
+ send(sender, "&aBuddha mode &6disabled&a for &6%s", p.getName());
}
else {
int taskId = -1;
@@ -77,7 +74,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
if (timer >= 0) {
timerStr = timer / 20d + " seconds";
- taskId = Bukkit.getScheduler().scheduleSyncDelayedTask(Main.plugin, () -> currentPlayers.remove(uid), timer);
+ taskId = Main.server.runTaskLater(() -> currentPlayers.remove(uid), timer);
}
currentPlayers.put(uid, taskId);
@@ -85,51 +82,40 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
save();
}
- send(sender, "&aBuddha mode &6enabled&a for &6%s&a for &6%s", getEntityName(p), timerStr);
+ send(sender, "&aBuddha mode &6enabled&a for &6%s&a for &6%s", p.getName(), timerStr);
}
return true;
}
- private double getDamageFromEvent(EntityDamageEvent e) {
- if (Main.majorVersion > 5) {
- return e.getDamage();
+ private static void save() {
+ List buddhas = new ArrayList<>();
+ for (Map.Entry kv : currentPlayers.entrySet()) {
+ // only save if there isn't a time limit!
+ if (kv.getValue() == -1) {
+ buddhas.add(kv.getKey().toString());
+ }
}
- try {
- return (double)(int)EntityDamageEvent.class.getMethod("getDamage").invoke(e);
- } catch (Exception ex) {
- Bukkit.getLogger().severe(ex.toString());
- return 0d;
- }
+ ConfigManager.save(configFile, buddhas);
}
- private void setDamageFromEvent(EntityDamageEvent e, @SuppressWarnings("SameParameterValue") double d) {
- if (Main.majorVersion > 5) {
- e.setDamage(d);
+ @Override
+ public void executeEvent(EsEvent event) {
+ if (!(event instanceof EsEntityDamageEvent)) {
return;
}
+ EsEntityDamageEvent e = (EsEntityDamageEvent) event;
- try {
- //noinspection JavaReflectionMemberAccess, It's an int in older versions
- EntityDamageEvent.class.getMethod("setDamage", int.class).invoke(e, (int) d);
- } catch (Exception ex) {
- Bukkit.getLogger().severe(ex.toString());
- }
- }
-
- @EventHandler
- public void damage(EntityDamageEvent e) {
- if (!(e.getEntity() instanceof LivingEntity) || !currentPlayers.containsKey(e.getEntity().getUniqueId())) {
+ if (!(e.getEntity() instanceof EsLivingEntity) || !currentPlayers.containsKey(e.getEntity().getUniqueId())) {
return;
}
-
- LivingEntity entity = (LivingEntity) e.getEntity();
+ EsLivingEntity entity = (EsLivingEntity) e.getEntity();
// Get all our vars since Minecraft broke everything in 1.6
- double damage = getDamageFromEvent(e);
- double health = getHealth(entity);
- double maxHealth = getMaxHealth(entity);
+ double damage = e.getDamage();
+ double health = entity.getHealth();
+ double maxHealth = entity.getMaxHealth();
if (damage < health) { // Not lethal
return;
@@ -139,22 +125,7 @@ public void damage(EntityDamageEvent e) {
double extraDamage = damage - health;
double resultingDamageTaken = extraDamage % maxHealth;
- setDamageFromEvent(e, 0);
- setHealth(entity, maxHealth - resultingDamageTaken);
- }
-
- private static void save() {
- FileConfiguration f = new YamlConfiguration();
-
- List buddhas = new ArrayList<>();
- for (Map.Entry kv : currentPlayers.entrySet()) {
- // only save if there isn't a time limit!
- if (kv.getValue() == -1) {
- buddhas.add(kv.getKey().toString());
- }
- }
-
- f.set("buddhas", buddhas);
- ConfigManager.save("gods.yml", f);
+ e.setDamage(0);
+ entity.setHealth(maxHealth - resultingDamageTaken);
}
}
diff --git a/src/main/java/net/serble/estools/Commands/CChest.java b/src/main/java/net/serble/estools/Commands/CChest.java
index 271ad1c..f29b923 100644
--- a/src/main/java/net/serble/estools/Commands/CChest.java
+++ b/src/main/java/net/serble/estools/Commands/CChest.java
@@ -1,49 +1,38 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import net.serble.estools.ConfigManager;
+import net.serble.estools.Config.ConfigManager;
import net.serble.estools.Main;
-import org.bukkit.Bukkit;
-import org.bukkit.GameMode;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.inventory.*;
-import org.bukkit.event.player.PlayerKickEvent;
-import org.bukkit.event.player.PlayerQuitEvent;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.ItemStack;
+import net.serble.estools.ServerApi.*;
+import net.serble.estools.ServerApi.Events.*;
+import net.serble.estools.ServerApi.Interfaces.*;
import java.util.*;
-public class CChest extends EsToolsCommand implements Listener {
+public class CChest extends EsToolsCommand implements EsEventListener {
- public static HashMap cChests = new HashMap<>();
+ public static HashMap cChests = new HashMap<>();
@Override
public void onEnable() {
- if (Main.majorVersion > 4) {
- Bukkit.getServer().getPluginManager().registerEvents(this, Main.plugin);
+ if (Main.minecraftVersion.getMinor() > 4) {
+ Main.registerEvents(this);
}
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- if (Main.majorVersion < 7) {
+ if (Main.minecraftVersion.getMinor() < 7) {
send(sender, "&cWarning: CChest doesn't work to full capacity");
}
- Player p = (Player)sender;
+ EsPlayer p = (EsPlayer) sender;
- if (p.getGameMode().equals(GameMode.CREATIVE)) {
+ if (p.getGameMode().equals(EsGameMode.Creative)) {
if (checkPerms(sender, "cchest.creative")) {
return false;
}
@@ -54,14 +43,14 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
UUID uid = p.getUniqueId();
- Inventory inv = cChests.get(uid);
+ EsInventory inv = cChests.get(uid);
if (inv == null) {
- Inventory loaded = loadPlayer(p);
+ EsInventory loaded = loadPlayer(p);
if (loaded != null) {
inv = loaded;
} else {
- inv = Bukkit.createInventory(null, 54, translate("&1Creative Chest"));
+ inv = Main.server.createInventory(null, 54, translate("&1Creative Chest"));
}
}
@@ -71,28 +60,27 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
cChests.put(uid, inv);
return true;
}
-
- @EventHandler
- public void inventoryClick(final InventoryClickEvent e) {
- UUID uid = e.getWhoClicked().getUniqueId();
- ItemStack currentItem = e.getCurrentItem();
-
+
+ private void onInventoryClick(final EsInventoryClickEvent e) {
+ UUID uid = e.getPlayer().getUniqueId();
+ EsItemStack currentItem = e.getCurrentItem();
+
// Check if inventory is cChest
- if (!cChests.containsKey(uid) || !cChests.get(uid).equals(e.getInventory()) || e.getClickedInventory() == null) {
+ if (!cChests.containsKey(uid) || !e.getInventory().isEqualTo(cChests.get(uid)) || e.getClickedInventory() == null) {
return;
}
- if (e.getAction().equals(InventoryAction.COLLECT_TO_CURSOR)) {
+ if (e.getAction().equals(EsInventoryAction.CollectToCursor)) {
e.setCancelled(true);
- ItemStack cursor = e.getCursor();
+ EsItemStack cursor = e.getCursor();
if (cursor == null) {
return;
}
- Inventory pInv = e.getWhoClicked().getInventory();
- for (Map.Entry i : pInv.all(cursor.getType()).entrySet()) {
- ItemStack item = i.getValue();
+ EsInventory pInv = e.getPlayer().getInventory();
+ for (Map.Entry i : pInv.all(cursor.getType()).entrySet()) {
+ EsItemStack item = i.getValue();
if (item == null) {
continue;
@@ -113,9 +101,9 @@ public void inventoryClick(final InventoryClickEvent e) {
}
// If player inventory
- if (!e.getClickedInventory().equals(cChests.get(uid))) {
+ if (!e.getClickedInventory().isEqualTo(cChests.get(uid))) {
// Shift click into cChest
- if (equalsOr(e.getClick(), ClickType.SHIFT_LEFT, ClickType.SHIFT_RIGHT) && currentItem != null) {
+ if (equalsOr(e.getClick(), EsClickType.ShiftLeft, EsClickType.ShiftRight) && currentItem != null) {
e.setCancelled(true);
e.getInventory().addItem(currentItem.clone());
@@ -125,23 +113,23 @@ public void inventoryClick(final InventoryClickEvent e) {
}
// Right click in cChest (clear item)
- if (e.getClick().equals(ClickType.RIGHT) && currentItem != null) {
+ if (e.getClick().equals(EsClickType.Right) && currentItem != null) {
e.setCancelled(true);
e.getClickedInventory().setItem(e.getSlot(), null);
return;
}
// Add to chest
- if (equalsOr(e.getAction(), InventoryAction.PLACE_ALL, InventoryAction.PLACE_ONE, InventoryAction.PLACE_SOME)) {
+ if (equalsOr(e.getAction(), EsInventoryAction.PlaceAll, EsInventoryAction.PlaceOne, EsInventoryAction.PlaceSome)) {
e.setCancelled(true);
- ItemStack item = e.getCursor();
+ EsItemStack item = e.getCursor();
if (item == null) {
return;
}
- ItemStack finalItem = item.clone();
+ EsItemStack finalItem = item.clone();
- if (equalsOr(e.getAction(), InventoryAction.PLACE_ONE, InventoryAction.PLACE_SOME)) {
+ if (equalsOr(e.getAction(), EsInventoryAction.PlaceOne, EsInventoryAction.PlaceSome)) {
finalItem.setAmount(1);
}
@@ -150,83 +138,116 @@ public void inventoryClick(final InventoryClickEvent e) {
}
// Remove from cChest
- if (equalsOr(e.getClick(), ClickType.LEFT, ClickType.DROP, ClickType.CONTROL_DROP,
- ClickType.SHIFT_LEFT, ClickType.SHIFT_RIGHT) && currentItem != null) {
- ItemStack item = currentItem.clone();
+ if (equalsOr(e.getClick(), EsClickType.Left, EsClickType.Drop, EsClickType.ControlDrop,
+ EsClickType.ShiftLeft, EsClickType.ShiftRight) && currentItem != null) {
+ EsItemStack item = currentItem.clone();
setItemTask(e.getInventory(), e.getSlot(), item);
}
}
- private static void setItemTask(Inventory inv, int slot, ItemStack item) {
- Bukkit.getScheduler().runTask(Main.plugin, () -> inv.setItem(slot, item));
+ private static void setItemTask(EsInventory inv, int slot, EsItemStack item) {
+ Main.server.runTask(() -> inv.setItem(slot, item));
}
// Cancel drag if inside cChest
- @EventHandler
- public void onInventoryDrag(final InventoryDragEvent e) {
- Inventory inv = cChests.get(e.getWhoClicked().getUniqueId());
- if (!e.getInventory().equals(inv)) {
+ private void onInventoryDrag(final EsInventoryDragEvent e) {
+ EsInventory inv = cChests.get(e.getPlayer().getUniqueId());
+ if (!e.getInventory().isEqualTo(inv)) {
return;
}
// Check if any of the slots dragged are in the cChest
- for (int slot : e.getRawSlots()) {
- if (inv.equals(e.getView().getInventory(slot))) {
+ for (int slot : e.getChangedSlots()) {
+ if (e.getView().getInventory(slot).isEqualTo(inv)) {
e.setCancelled(true);
return;
}
}
}
- public static Inventory loadPlayer(Player p) {
+ public static EsInventory loadPlayer(EsPlayer p) {
UUID uid = p.getUniqueId();
- FileConfiguration f = ConfigManager.load("cchests/" + uid + ".yml");
-
- if (!f.contains("items")) {
- return null;
- }
-
- @SuppressWarnings("unchecked")
- ItemStack[] content = ((ArrayList) Objects.requireNonNull(f.get("items"))).toArray(new ItemStack[0]);
+ @SuppressWarnings("unchecked")
+ List f = (List) ConfigManager.load(
+ "cchests/" + uid + ".yml",
+ ArrayList.class,
+ EsSerialisableItemStack.class);
+ EsItemStack[] content = new EsItemStack[f.size()];
+ for (int i = 0; i < content.length; i++) {
+ if (f.get(i) == null) {
+ content[i] = null;
+ continue;
+ }
+ content[i] = f.get(i).toItemStack();
+ }
- Inventory inv = Bukkit.createInventory(null, 54, translate("&1Creative Chest"));
+ EsInventory inv = Main.server.createInventory(null, 54, translate("&1Creative Chest"));
inv.setContents(content);
cChests.put(uid, inv);
return inv;
}
-
- public static void savePlayer(Player p) {
+
+ public static void savePlayer(EsPlayer p) {
UUID uid = p.getUniqueId();
if (!cChests.containsKey(uid)) {
return;
}
-
- FileConfiguration f = new YamlConfiguration();
- f.set("items", cChests.get(uid).getContents());
- ConfigManager.save("cchests/" + uid + ".yml", f);
+
+ EsInventory inv = cChests.get(uid);
+ EsSerialisableItemStack[] contents = new EsSerialisableItemStack[inv.getContents().length];
+ for (int i = 0; i < inv.getContents().length; i++) {
+ EsItemStack stack = inv.getContents()[i];
+ contents[i] = stack == null ? null : EsSerialisableItemStack.generate(stack);
+ }
+
+ ConfigManager.save("cchests/" + uid + ".yml", contents);
}
- @EventHandler
- public void onClose(InventoryCloseEvent e) {
+ private void onClose(EsInventoryCloseEvent e) {
UUID uid = e.getPlayer().getUniqueId();
- if (e.getInventory().equals(cChests.get(uid))) {
- savePlayer((Player)e.getPlayer());
+ if (e.getInventory().isEqualTo(cChests.get(uid))) {
+ savePlayer(e.getPlayer());
}
}
- @EventHandler
- public void onQuit(PlayerQuitEvent e) {
+ private void onQuit(EsPlayerQuitEvent e) {
savePlayer(e.getPlayer());
cChests.remove(e.getPlayer().getUniqueId());
}
-
- @EventHandler
- public void onKick(PlayerKickEvent e) {
+
+ private void onKick(EsPlayerKickEvent e) {
savePlayer(e.getPlayer());
cChests.remove(e.getPlayer().getUniqueId());
}
+
+ @Override
+ public void executeEvent(EsEvent event) {
+ if (event instanceof EsPlayerQuitEvent) {
+ onQuit((EsPlayerQuitEvent) event);
+ return;
+ }
+
+ if (event instanceof EsPlayerKickEvent) {
+ onKick((EsPlayerKickEvent) event);
+ return;
+ }
+
+ if (event instanceof EsInventoryClickEvent) {
+ onInventoryClick((EsInventoryClickEvent) event);
+ return;
+ }
+
+ if (event instanceof EsInventoryCloseEvent) {
+ onClose((EsInventoryCloseEvent) event);
+ return;
+ }
+
+ if (event instanceof EsInventoryDragEvent) {
+ onInventoryDrag((EsInventoryDragEvent) event);
+ }
+ }
}
diff --git a/src/main/java/net/serble/estools/Commands/ClearInv.java b/src/main/java/net/serble/estools/Commands/ClearInv.java
index 99983b7..d84f683 100644
--- a/src/main/java/net/serble/estools/Commands/ClearInv.java
+++ b/src/main/java/net/serble/estools/Commands/ClearInv.java
@@ -1,9 +1,8 @@
package net.serble.estools.Commands;
import net.serble.estools.MultiPlayerCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
@@ -11,15 +10,15 @@ public class ClearInv extends MultiPlayerCommand {
private static final String usage = genUsage("/ci [player2]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- ArrayList players = new ArrayList<>();
+ public boolean execute(EsCommandSender sender, String[] args) {
+ ArrayList players = new ArrayList<>();
if (args.length == 0) {
if (isNotPlayer(sender, usage)) {
return false;
}
- players.add((Player)sender);
+ players.add((EsPlayer) sender);
} else {
players = getPlayers(sender, args);
@@ -28,7 +27,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
}
- for (Player p : players) {
+ for (EsPlayer p : players) {
p.getInventory().clear();
}
diff --git a/src/main/java/net/serble/estools/Commands/Day.java b/src/main/java/net/serble/estools/Commands/Day.java
index ff18a30..7b60114 100644
--- a/src/main/java/net/serble/estools/Commands/Day.java
+++ b/src/main/java/net/serble/estools/Commands/Day.java
@@ -1,19 +1,18 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class Day extends EsToolsCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- ((Player)sender).getWorld().setTime(1000);
+ ((EsPlayer) sender).getWorld().setTime(1000);
send(sender, "&aSet time to &6day");
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/Dismount.java b/src/main/java/net/serble/estools/Commands/Dismount.java
index dd76759..7a1f84f 100644
--- a/src/main/java/net/serble/estools/Commands/Dismount.java
+++ b/src/main/java/net/serble/estools/Commands/Dismount.java
@@ -2,10 +2,8 @@
import net.serble.estools.EntityCommand;
import net.serble.estools.Main;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.LivingEntity;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsEntity;
import java.util.ArrayList;
import java.util.List;
@@ -13,10 +11,10 @@
public class Dismount extends EntityCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- List targets = new ArrayList<>();
+ public boolean execute(EsCommandSender sender, String[] args) {
+ List targets = new ArrayList<>();
for (String arg : args) { // Can only be living Entity in pre 1.2
- Entity entity = Main.majorVersion >= 2 ? getNonLivingEntity(sender, arg) : getEntity(sender, arg);
+ EsEntity entity = Main.minecraftVersion.getMinor() >= 2 ? getNonLivingEntity(sender, arg) : getEntity(sender, arg);
if (entity == null) {
return false;
}
@@ -24,21 +22,17 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
if (targets.isEmpty()) {
- if (!(sender instanceof Entity)) {
+ if (!(sender instanceof EsEntity)) {
send(sender, "&cConsole must specify a rider");
return false;
}
- targets.add((Entity) sender);
+ targets.add((EsEntity) sender);
}
boolean anySuccess = false;
- for (Entity entity : targets) {
- if (Main.majorVersion >= 2) {
- anySuccess = anySuccess || entity.leaveVehicle();
- } else {
- anySuccess = anySuccess || ((LivingEntity) sender).leaveVehicle();
- }
+ for (EsEntity entity : targets) {
+ anySuccess = anySuccess || entity.leaveVehicle();
}
if (!anySuccess) {
diff --git a/src/main/java/net/serble/estools/Commands/EditSign.java b/src/main/java/net/serble/estools/Commands/EditSign.java
index 521d8ee..d7940ec 100644
--- a/src/main/java/net/serble/estools/Commands/EditSign.java
+++ b/src/main/java/net/serble/estools/Commands/EditSign.java
@@ -2,24 +2,16 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.Bukkit;
-import org.bukkit.block.Block;
-import org.bukkit.block.Sign;
-import org.bukkit.block.sign.SignSide;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.*;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
public class EditSign extends EsToolsCommand {
private static final String usage = genUsage("/editsign [line]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
@@ -29,16 +21,16 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- Player p = (Player) sender;
+ EsPlayer p = (EsPlayer) sender;
- Block signB = getTargetBlock(p);
+ EsBlock signB = p.getTargetBlock();
- if (signB == null || !(signB.getState() instanceof Sign)) {
+ if (!(signB instanceof EsSign)) {
send(sender, "&cYou must be looking at a sign!");
return false;
}
- Sign sign = (Sign) signB.getState();
+ EsSign sign = (EsSign) signB;
switch (args[0].toLowerCase()) {
case "glow":
@@ -79,11 +71,10 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
String lineText = translate(lineTextBuilder.toString()).trim();
- if (Main.majorVersion >= 20) {
- SignSide side = sign.getTargetSide(p);
+ if (Main.minecraftVersion.getMinor() >= 20) {
+ EsSignSide side = sign.getTargetSide(p);
side.setLine(lineNum - 1, lineText);
} else {
- //noinspection deprecation
sign.setLine(lineNum - 1, lineText);
}
sign.update();
@@ -98,7 +89,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
if (args.length == 1) {
@@ -107,7 +98,7 @@ public List tabComplete(CommandSender sender, String[] args, String lArg
tab.add("3");
tab.add("4");
- if (Main.majorVersion >= 17) { // only add glow autocomplete if it exists
+ if (Main.minecraftVersion.getMinor() >= 17) { // only add glow autocomplete if it exists
tab.add("glow");
tab.add("unglow");
}
@@ -116,27 +107,9 @@ public List tabComplete(CommandSender sender, String[] args, String lArg
return tab;
}
- public Block getTargetBlock(Player p) {
- if (Main.majorVersion > 12) {
- return p.getTargetBlockExact(5);
- } else if (Main.majorVersion > 7) {
- return p.getTargetBlock(null, 5);
- } else {
- try {
- //noinspection JavaReflectionMemberAccess
- return (Block) LivingEntity.class.getMethod("getTargetBlock", HashSet.class, int.class).invoke(p, null, 5);
- }
- catch (Exception e) {
- Bukkit.getLogger().severe(e.toString());
- return null;
- }
- }
- }
-
- @SuppressWarnings("deprecation")
- public boolean setGlow(Sign sign, Player p, boolean glow) {
- if (Main.majorVersion >= 20) {
- SignSide side = sign.getTargetSide(p);
+ public boolean setGlow(EsSign sign, EsPlayer p, boolean glow) {
+ if (Main.minecraftVersion.getMinor() >= 20) {
+ EsSignSide side = sign.getTargetSide(p);
if (side.isGlowingText() == glow) {
if (glow) {
@@ -150,7 +123,7 @@ public boolean setGlow(Sign sign, Player p, boolean glow) {
side.setGlowingText(glow);
}
- else if (Main.majorVersion >= 17) {
+ else if (Main.minecraftVersion.getMinor() >= 17) {
if (sign.isGlowingText() == glow) {
if (glow) {
send(p, "&cThis sign is already &6glowing!");
diff --git a/src/main/java/net/serble/estools/Commands/Eff.java b/src/main/java/net/serble/estools/Commands/Eff.java
index 5fe7935..c0fc81d 100644
--- a/src/main/java/net/serble/estools/Commands/Eff.java
+++ b/src/main/java/net/serble/estools/Commands/Eff.java
@@ -1,31 +1,27 @@
package net.serble.estools.Commands;
-import net.serble.estools.Effects;
+import net.serble.estools.ServerApi.EsPotionEffect;
+import net.serble.estools.ServerApi.EsPotionEffectType;
import net.serble.estools.Main;
import net.serble.estools.MultiPlayerCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.potion.PotionEffect;
-import org.bukkit.potion.PotionEffectType;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public class Eff extends MultiPlayerCommand {
private static final String usage = genUsage("/eff [amplifier] [duration] [players]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, usage);
return false;
}
- PotionEffectType effect = Effects.getByName(args[0]);
-
- if (effect == null) {
+ EsPotionEffectType effectType = EsPotionEffectType.fromKey(args[0]);
+ if (effectType == null) {
send(sender, "&cEffect not found!");
return false;
}
@@ -54,7 +50,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
durationStr = String.format("%s seconds", duration / 20);
if (duration == 32767) {
- if (Main.majorVersion >= 19) {
+ if (Main.minecraftVersion.getMinor() >= 19) {
duration = -1;
}
@@ -62,14 +58,14 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
}
- ArrayList players = new ArrayList<>();
+ ArrayList players = new ArrayList<>();
if (args.length < 4) {
if (isNotPlayer(sender, usage)) {
return false;
}
- players.add((Player)sender);
+ players.add((EsPlayer) sender);
} else {
players = getPlayers(sender, removeArgs(args, 3));
@@ -78,12 +74,12 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
}
- for (Player p : players) {
- p.removePotionEffect(effect);
- p.addPotionEffect(new PotionEffect(effect, duration, amplifier));
+ for (EsPlayer p : players) {
+ p.removePotionEffect(effectType);
+ p.addPotionEffect(new EsPotionEffect(effectType, amplifier, duration));
}
- send(sender, "&aAdded effect &6%s&a at level &6%s&a for &6%s", Effects.getName(effect), amplifier + 1, durationStr);
+ send(sender, "&aAdded effect &6%s&a at level &6%s&a for &6%s", effectType.getKey(), amplifier + 1, durationStr);
return true;
}
@@ -106,12 +102,12 @@ private int calculateDuration(String input) {
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
switch (args.length) {
case 1:
- for (Map.Entry e : Effects.entrySet()) {
+ for (EsPotionEffectType e : Main.server.getPotionEffectTypes()) {
tab.add(e.getKey().toLowerCase());
}
break;
diff --git a/src/main/java/net/serble/estools/Commands/Ench.java b/src/main/java/net/serble/estools/Commands/Ench.java
index 8af2cc8..b4ddb0c 100644
--- a/src/main/java/net/serble/estools/Commands/Ench.java
+++ b/src/main/java/net/serble/estools/Commands/Ench.java
@@ -2,17 +2,14 @@
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
+import java.util.Objects;
-import net.serble.estools.Enchantments;
import net.serble.estools.Main;
-import org.bukkit.NamespacedKey;
-import org.bukkit.Registry;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
+import net.serble.estools.ServerApi.EsEnchantment;
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import net.serble.estools.EsToolsCommand;
@@ -20,13 +17,17 @@ public class Ench extends EsToolsCommand {
private static final String usage = genUsage("/ench [level] [player]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, usage);
return false;
}
-
- ItemStack is;
+
+ EsEnchantment enchantment = EsEnchantment.fromKey(args[0]);
+ if (enchantment == null) {
+ send(sender, "&cEnchantment does not exist!");
+ return false;
+ }
int level = 1;
if (args.length > 1) {
@@ -37,66 +38,52 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
}
-
+
+ EsItemStack is;
if (args.length <= 2) {
if (isNotPlayer(sender, usage)) {
return false;
}
- is = getMainHand(((Player) sender));
+ is = ((EsPlayer) sender).getMainHand();
+
+ if (is == null || Objects.equals(is.getType(), EsMaterial.createUnchecked("AIR"))) {
+ send(sender, "&cYou must be holding an item to enchant it");
+ return false;
+ }
} else {
- Player p = getPlayer(sender, args[2]);
+ EsPlayer p = getPlayer(sender, args[2]);
if (p == null) {
return false;
}
- is = getMainHand(p);
- }
-
- Enchantment ench;
- try {
- if (Main.majorVersion > 12) {
- ench = Registry.ENCHANTMENT.get(NamespacedKey.minecraft(args[0].toLowerCase()));
- } else {
- ench = Enchantments.getByName(args[0].toLowerCase());
- }
- } catch (IllegalArgumentException e) {
- send(sender, usage);
- return false;
- }
-
-
- if (ench != null && is != null) {
- is.addUnsafeEnchantment(ench, level);
- send(sender, "&aEnchantment &6%s&a at level &6%s&a was added!", args[0].toLowerCase(), level);
- }
- else {
- send(sender, usage);
+ is = p.getMainHand();
+
+ if (is == null || Objects.equals(is.getType(), EsMaterial.createUnchecked("AIR"))) {
+ send(sender, "&c" + p.getName() + " isn't holding an item");
+ return false;
+ }
}
+
+ is.addEnchantment(enchantment, level);
+ send(sender, "&aEnchantment &6%s&a at level &6%s&a was added!", args[0].toLowerCase(), level);
return true;
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
switch (args.length) {
case 1:
- if (Main.majorVersion > 12) {
- for (Enchantment e : Registry.ENCHANTMENT) {
- tab.add(e.getKey().getKey());
- }
- } else {
- for (Map.Entry e : Enchantments.entrySet()) {
- tab.add(e.getKey());
- }
+ for (EsEnchantment enchantment : Main.server.getEnchantments()) {
+ tab.add(enchantment.getKey());
}
-
break;
case 3:
- for (Player p : getOnlinePlayers()) {
+ for (EsPlayer p : Main.server.getOnlinePlayers()) {
tab.add(p.getName());
}
break;
diff --git a/src/main/java/net/serble/estools/Commands/EsTools.java b/src/main/java/net/serble/estools/Commands/EsTools.java
index 85b7ee9..e6449b8 100644
--- a/src/main/java/net/serble/estools/Commands/EsTools.java
+++ b/src/main/java/net/serble/estools/Commands/EsTools.java
@@ -1,23 +1,28 @@
package net.serble.estools.Commands;
import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.ArrayList;
+import java.util.Comparator;
import java.util.List;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+import net.serble.estools.ServerApi.ServerPlatform;
import net.serble.estools.Tester;
import net.serble.estools.Updater;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
import net.serble.estools.EsToolsCommand;
-import net.serble.estools.Commands.Give.Give;
import net.serble.estools.Main;
public class EsTools extends EsToolsCommand {
- @Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ @SuppressWarnings({"resource", "ResultOfMethodCallIgnored"})
+ @Override
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
if (checkPerms(sender, "version")) {
return false;
@@ -34,15 +39,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
send(sender, "&aReloading...");
- Give.enable();
-
- for (Player p : getOnlinePlayers()) {
- CChest.savePlayer(p);
- }
-
- for (Player p : getOnlinePlayers()) {
- CChest.loadPlayer(p);
- }
+ Main.plugin.enable();
send(sender, "&aReloaded!");
} else if (args[0].equalsIgnoreCase("reset")) { // Resets all configuration files
@@ -51,14 +48,18 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
if (args.length > 1 && args[1].equalsIgnoreCase("confirm")) {
- File f = new File(Main.plugin.getDataFolder(), "give.yml");
- if (!f.delete()) {
+ File f = Main.server.getDataFolder();
+ try {
+ Files.walk(Paths.get(f.getPath()))
+ .sorted(Comparator.reverseOrder())
+ .map(Path::toFile)
+ .forEach(File::delete);
+ } catch (IOException e) {
send(sender, "&cFailed to delete data.");
return false;
}
-
- Give.enable();
- send(sender, "&cAll data deleted!");
+
+ send(sender, "&cAll data has been deleted, &6/estools reload &cto apply changes!");
return true;
}
@@ -68,12 +69,17 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- if (!(sender instanceof Player)) {
+ if (!(sender instanceof EsPlayer)) {
send(sender, "&cYou must be a player to use this command.");
return false;
}
- Player p = (Player) sender;
+ if (Main.platform == ServerPlatform.Folia) { // TODO: Fix
+ send(sender, "&cDue to scheduler limitations, /estools test is not currently supported on Folia");
+ return false;
+ }
+
+ EsPlayer p = (EsPlayer) sender;
Tester tester = Tester.runningTests.get(p.getUniqueId());
if (tester != null) {
@@ -104,7 +110,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- send(sender, "&aDownloading version: &6" + Main.newVersion.getString());
+ send(sender, "&aDownloading version: &6" + Main.newVersion);
Updater.downloadNewUpdate(sender);
} else if (args[0].equalsIgnoreCase("forceupdate")) {
send(sender, "&aForce updating &c(This might downgrade your plugin)");
@@ -117,7 +123,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
if (args.length == 1) {
@@ -134,12 +140,12 @@ public List tabComplete(CommandSender sender, String[] args, String lArg
return tab;
}
- private void sendVersion(CommandSender sender) {
+ private void sendVersion(EsCommandSender sender) {
if (Main.newVersion == null) {
- send(sender, "&aEsTools v" + Main.plugin.getDescription().getVersion());
+ send(sender, "&aEsTools v" + Main.server.getPluginVersion().toString());
} else {
- send(sender, "&aEsTools &cv" + Main.plugin.getDescription().getVersion() + ".&c An update is available, use " +
- "&6/estools update&c to update to &6v" + Main.newVersion.getString());
+ send(sender, "&aEsTools &cv" + Main.server.getPluginVersion().toString() + ".&c An update is available, use " +
+ "&6/estools update&c to update to &6v" + Main.newVersion.toString());
}
}
diff --git a/src/main/java/net/serble/estools/Commands/Feed.java b/src/main/java/net/serble/estools/Commands/Feed.java
index 3a80dcd..55ac241 100644
--- a/src/main/java/net/serble/estools/Commands/Feed.java
+++ b/src/main/java/net/serble/estools/Commands/Feed.java
@@ -1,9 +1,8 @@
package net.serble.estools.Commands;
import net.serble.estools.MultiPlayerCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
@@ -11,15 +10,15 @@ public class Feed extends MultiPlayerCommand {
private static final String usage = genUsage("/feed ");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- ArrayList players = new ArrayList<>();
+ public boolean execute(EsCommandSender sender, String[] args) {
+ ArrayList players = new ArrayList<>();
if (args.length == 0) {
if (isNotPlayer(sender, usage)) {
return false;
}
- players.add((Player) sender);
+ players.add((EsPlayer) sender);
} else {
players = getPlayers(sender, args);
@@ -28,7 +27,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
}
- for (Player p : players) {
+ for (EsPlayer p : players) {
p.setFoodLevel(20);
p.setSaturation(20);
}
diff --git a/src/main/java/net/serble/estools/Commands/Fix.java b/src/main/java/net/serble/estools/Commands/Fix.java
index a55bf81..b272787 100644
--- a/src/main/java/net/serble/estools/Commands/Fix.java
+++ b/src/main/java/net/serble/estools/Commands/Fix.java
@@ -4,13 +4,7 @@
import java.util.List;
import net.serble.estools.Main;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.PlayerInventory;
-import org.bukkit.inventory.meta.Damageable;
-import org.bukkit.inventory.meta.ItemMeta;
+import net.serble.estools.ServerApi.Interfaces.*;
import net.serble.estools.PlayerCommand;
@@ -18,15 +12,15 @@ public class Fix extends PlayerCommand {
private static final String usage = genUsage("/fix [hand/offhand/helmet/chestplate/leggings/boots/all] [player]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- Player p;
+ public boolean execute(EsCommandSender sender, String[] args) {
+ EsPlayer p;
if (args.length < 2) {
if (isNotPlayer(sender, usage)) {
return false;
}
- p = (Player) sender;
+ p = (EsPlayer) sender;
} else {
p = getPlayer(sender, args[1]);
@@ -35,16 +29,16 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
}
- PlayerInventory pInv = p.getInventory();
- ItemStack is = getMainHand(p);
+ EsPlayerInventory pInv = p.getInventory();
+ EsItemStack is = p.getMainHand();
boolean all = false;
if (args.length > 0) {
switch (args[0].toLowerCase()) {
case "offhand":
- if (Main.majorVersion > 8) {
- is = pInv.getItemInOffHand();
+ if (Main.minecraftVersion.getMinor() > 8) {
+ is = pInv.getOffHand();
}
break;
@@ -71,8 +65,8 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
if (all) {
- ItemStack[] contents = p.getInventory().getContents();
- for (ItemStack i : contents) {
+ EsItemStack[] contents = p.getInventory().getContents();
+ for (EsItemStack i : contents) {
repair(i);
}
@@ -81,37 +75,27 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
repair(is);
}
- send(sender, "&aRepaired &6%s's &aitem(s)!", getEntityName(p));
+ send(sender, "&aRepaired &6%s's &aitem(s)!", p.getName());
return true;
}
- public static void repair(ItemStack is) {
+ public static void repair(EsItemStack is) {
if (is == null) {
return;
}
- if (Main.majorVersion > 12) {
- ItemMeta im = is.getItemMeta();
- if (im == null) return;
-
- ((Damageable) im).setDamage(0);
-
- is.setItemMeta(im);
- } else {
- //noinspection deprecation
- is.setDurability((short) 0);
- }
+ is.setDamage(0);
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
if (args.length == 1) {
tab.add("hand"); tab.add("helmet"); tab.add("chestplate");
tab.add("leggings"); tab.add("boots"); tab.add("all");
- if (Main.majorVersion > 8) {
+ if (Main.minecraftVersion.getMinor() > 8) {
tab.add("offhand");
}
} else if (args.length == 2) {
diff --git a/src/main/java/net/serble/estools/Commands/Fly.java b/src/main/java/net/serble/estools/Commands/Fly.java
index 62ca1eb..9306f56 100644
--- a/src/main/java/net/serble/estools/Commands/Fly.java
+++ b/src/main/java/net/serble/estools/Commands/Fly.java
@@ -1,9 +1,8 @@
package net.serble.estools.Commands;
import net.serble.estools.MultiPlayerCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
import java.util.Objects;
@@ -12,15 +11,15 @@ public class Fly extends MultiPlayerCommand {
private static final String usage = genUsage("/fly [Player]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- ArrayList players = new ArrayList<>();
+ public boolean execute(EsCommandSender sender, String[] args) {
+ ArrayList players = new ArrayList<>();
if (args.length == 0) {
if (isNotPlayer(sender, usage)) {
return false;
}
- players.add((Player) sender);
+ players.add((EsPlayer) sender);
} else {
players = getPlayers(sender, args[0]);
@@ -29,7 +28,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
}
- for (Player p : players) {
+ for (EsPlayer p : players) {
boolean isFly = p.getAllowFlight();
if (args.length != 0 && !Objects.equals(args[0], "*")) {
diff --git a/src/main/java/net/serble/estools/Commands/GameModeCommand.java b/src/main/java/net/serble/estools/Commands/GameModeCommand.java
index a2c591e..fceea8d 100644
--- a/src/main/java/net/serble/estools/Commands/GameModeCommand.java
+++ b/src/main/java/net/serble/estools/Commands/GameModeCommand.java
@@ -1,33 +1,31 @@
package net.serble.estools.Commands;
import net.serble.estools.MultiPlayerCommand;
-import org.bukkit.GameMode;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.EsGameMode;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
public class GameModeCommand extends MultiPlayerCommand {
- private GameMode gameMode;
+ private final EsGameMode gameMode;
+ private final String cmd;
- public GameModeCommand(String gameMode) {
- // If it's an old version it will throw when trying to get Enum Value, so we ignore it.
- try {
- this.gameMode = GameMode.valueOf(gameMode);
- } catch (IllegalArgumentException ignored) {}
+ public GameModeCommand(EsGameMode gameMode, String cmd) {
+ this.gameMode = gameMode;
+ this.cmd = cmd;
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- ArrayList ps = new ArrayList<>();
+ public boolean execute(EsCommandSender sender, String[] args) {
+ ArrayList ps = new ArrayList<>();
if (args.length == 0) {
- if (isNotPlayer(sender, genUsage("/%s [player]"), label)) {
+ if (isNotPlayer(sender, genUsage("/%s [player]"), cmd)) {
return false;
}
- ps.add((Player) sender);
+ ps.add((EsPlayer) sender);
send(sender, "&aGamemode set to &6%s", gameMode.toString());
} else {
@@ -39,7 +37,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
send(sender, "&aGamemode set to &6%s&a for &6%s", gameMode.toString(), argsToString(args, 0));
}
- for (Player p : ps) {
+ for (EsPlayer p : ps) {
p.setGameMode(gameMode);
}
diff --git a/src/main/java/net/serble/estools/Commands/GetInfo.java b/src/main/java/net/serble/estools/Commands/GetInfo.java
index d6116a9..c852b25 100644
--- a/src/main/java/net/serble/estools/Commands/GetInfo.java
+++ b/src/main/java/net/serble/estools/Commands/GetInfo.java
@@ -1,36 +1,36 @@
package net.serble.estools.Commands;
-import net.serble.estools.Effects;
+import net.serble.estools.ServerApi.EsPotionEffect;
+import net.serble.estools.ServerApi.EsLocation;
import net.serble.estools.Main;
-import org.bukkit.Location;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.LivingEntity;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
import net.serble.estools.EntityCommand;
-import org.bukkit.entity.Player;
-import org.bukkit.potion.PotionEffect;
+import net.serble.estools.ServerApi.Interfaces.EsEntity;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+import java.util.List;
import java.util.Objects;
+import java.util.stream.Collectors;
public class GetInfo extends EntityCommand {
private static final String usage = genUsage("/getinfo ");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, usage);
return false;
}
- Entity entity = getNonLivingEntity(sender, args[0]);
+ EsEntity entity = getNonLivingEntity(sender, args[0]);
if (entity == null) {
return false;
}
- Location loc = entity.getLocation();
- String name = getEntityName(entity);
+ EsLocation loc = entity.getLocation();
+ String name = entity.getName();
// Global Values
String info =
@@ -43,7 +43,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
info = String.format(info,
name,
- entity.getType().name(),
+ entity.getType(),
loc.getBlockX(),
loc.getBlockY(),
loc.getBlockZ(),
@@ -51,11 +51,11 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
entity.getUniqueId());
// Passengers
- if (Main.majorVersion > 12) {
+ if (Main.minecraftVersion.getMinor() > 12) {
StringBuilder passengerText = new StringBuilder("&aPassengers: &6");
boolean passengersExist = false;
- for (Entity passenger : entity.getPassengers()) {
- passengerText.append(getEntityName(passenger)).append(" (").append(passenger.getType()).append("), ");
+ for (EsEntity passenger : entity.getPassengers()) {
+ passengerText.append(passenger.getName()).append(" (").append(passenger.getType()).append("), ");
passengersExist = true;
}
@@ -68,23 +68,20 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
}
- if (entity instanceof LivingEntity) { // Living entity
- LivingEntity le = (LivingEntity) entity;
- String maxHealth = String.valueOf(Math.round(getMaxHealth(le)));
+ if (entity instanceof EsLivingEntity) { // Living entity
+ EsLivingEntity le = (EsLivingEntity) entity;
+ String maxHealth = String.valueOf(Math.round(le.getMaxHealth()));
StringBuilder potionEffects = new StringBuilder();
{
- Object[] pos = le.getActivePotionEffects().toArray();
+ List potions = le.getActivePotionEffects();
- if (pos.length == 0) {
+ if (potions.isEmpty()) {
potionEffects.append("None");
} else {
- for (int i = 0; i < pos.length - 1; i++) {
- PotionEffect po = (PotionEffect) pos[i];
- potionEffects.append(Effects.getName(po.getType())).append(", ");
- }
-
- potionEffects.append(Effects.getName(((PotionEffect) pos[pos.length - 1]).getType()));
+ potionEffects.append(potions.stream()
+ .map(pot -> String.format("%s at %s for %s seconds", pot.getType(), pot.getAmp()+1, pot.getDuration()/20))
+ .collect(Collectors.joining(", ")));
}
}
@@ -93,13 +90,13 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
"&aMax Health: &6%s\n" +
"&aPotion Effects: &6%s\n";
livingEntityInfo = String.format(livingEntityInfo,
- getHealth(le),
+ le.getHealth(),
maxHealth,
potionEffects);
info += livingEntityInfo;
- if (Main.majorVersion > 12) {
+ if (Main.minecraftVersion.getMinor() > 12) {
// Scoreboard tags
StringBuilder tags = new StringBuilder("&aScoreboard Tags: &6");
boolean tagsExist = false;
@@ -118,8 +115,8 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
}
- if (entity instanceof Player) { // Players
- Player player = (Player) entity;
+ if (entity instanceof EsPlayer) { // Players
+ EsPlayer player = (EsPlayer) entity;
String playerInfo =
"&aHunger: &6%s\n" +
@@ -129,7 +126,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
player.getFoodLevel(),
player.getSaturation());
- if (Main.majorVersion > 1) {
+ if (Main.minecraftVersion.getMinor() > 1) {
playerInfo += "&aCan Fly: &6%s\n" +
"&aIs Flying: &6%s\n";
diff --git a/src/main/java/net/serble/estools/Commands/GetPersistentData.java b/src/main/java/net/serble/estools/Commands/GetPersistentData.java
index d1e356b..97eac1e 100644
--- a/src/main/java/net/serble/estools/Commands/GetPersistentData.java
+++ b/src/main/java/net/serble/estools/Commands/GetPersistentData.java
@@ -1,17 +1,10 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import net.serble.estools.Main;
+import net.serble.estools.ServerApi.EsPersistentDataType;
+import net.serble.estools.ServerApi.Interfaces.*;
import net.serble.estools.Tuple;
import org.apache.commons.lang.ArrayUtils;
-import org.bukkit.NamespacedKey;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-import org.bukkit.persistence.PersistentDataContainer;
-import org.bukkit.persistence.PersistentDataType;
import java.util.ArrayList;
import java.util.List;
@@ -20,7 +13,7 @@ public class GetPersistentData extends EsToolsCommand {
public static final String usage = genUsage("/getpersistentdata ");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender))
return false;
@@ -29,27 +22,27 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- String tagString = args[0].toLowerCase();
+ String key = args[0].toLowerCase();
String typeString = args[1].toLowerCase();
- ItemStack item = getMainHand((Player) sender);
- NamespacedKey key = getNamespacedKey(tagString);
- if (key == null) {
- send(sender, "&cInvalid key! examples: 'estools:count', 'backpacks:size', etc");
- return false;
- }
+ EsItemStack item = ((EsPlayer) sender).getMainHand();
+// NamespacedKey key = getNamespacedKey(key);
+// if (key == null) {
+// send(sender, "&cInvalid key! examples: 'estools:count', 'backpacks:size', etc");
+// return false;
+// }
- ItemMeta meta = item.getItemMeta();
+ EsItemMeta meta = item.getItemMeta();
if (meta == null) {
send(sender, "&cItem does not have nbt tags!");
return false;
}
- PersistentDataContainer data = meta.getPersistentDataContainer();
+ EsPersistentDataContainer data = meta.getPersistentDataContainer();
Tuple value = getData(typeString, key, data);
if (value.a() == 3) {
- send(sender, "&cNBT tag &e\"" + tagString + "\"&c does not exist!");
+ send(sender, "&cNBT tag &e\"" + key + "\"&c does not exist!");
return false;
}
@@ -59,19 +52,19 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
if (value.a() == 2) {
- send(sender, "&cNBT tag &e\"" + tagString + "\"&c exists, but is not a " + typeString + "!");
+ send(sender, "&cNBT tag &e\"" + key + "\"&c exists, but is not a " + typeString + "!");
return false;
}
- send(sender, "&aNBT tag &e\"" + tagString + "\"&a is &e" + value.b() + "&a!");
+ send(sender, "&aNBT tag &e\"" + key + "\"&a is &e" + value.b() + "&a!");
return true;
}
- private static Tuple getData(String type, NamespacedKey key, PersistentDataContainer data) {
+ private static Tuple getData(String type, String key, EsPersistentDataContainer data) {
try {
switch (type) {
case "string": {
- String value = data.get(key, PersistentDataType.STRING);
+ String value = (String) data.get(key, EsPersistentDataType.String);
if (value == null) {
return new Tuple<>(3, null);
}
@@ -80,7 +73,7 @@ private static Tuple getData(String type, NamespacedKey key, Pe
}
case "integer": {
- Integer value = data.get(key, PersistentDataType.INTEGER);
+ Integer value = (Integer) data.get(key, EsPersistentDataType.Integer);
if (value == null) {
return new Tuple<>(3, null);
}
@@ -88,7 +81,7 @@ private static Tuple getData(String type, NamespacedKey key, Pe
}
case "double": {
- Double value = data.get(key, PersistentDataType.DOUBLE);
+ Double value = (Double) data.get(key, EsPersistentDataType.Double);
if (value == null) {
return new Tuple<>(3, null);
}
@@ -96,7 +89,7 @@ private static Tuple getData(String type, NamespacedKey key, Pe
}
case "float": {
- Float value = data.get(key, PersistentDataType.FLOAT);
+ Float value = (Float) data.get(key, EsPersistentDataType.Float);
if (value == null) {
return new Tuple<>(3, null);
}
@@ -104,7 +97,7 @@ private static Tuple getData(String type, NamespacedKey key, Pe
}
case "long": {
- Long value = data.get(key, PersistentDataType.LONG);
+ Long value = (Long) data.get(key, EsPersistentDataType.Long);
if (value == null) {
return new Tuple<>(3, null);
}
@@ -112,7 +105,7 @@ private static Tuple getData(String type, NamespacedKey key, Pe
}
case "short": {
- Short value = data.get(key, PersistentDataType.SHORT);
+ Short value = (Short) data.get(key, EsPersistentDataType.Short);
if (value == null) {
return new Tuple<>(3, null);
}
@@ -120,7 +113,7 @@ private static Tuple getData(String type, NamespacedKey key, Pe
}
case "byte": {
- Byte value = data.get(key, PersistentDataType.BYTE);
+ Byte value = (Byte) data.get(key, EsPersistentDataType.Byte);
if (value == null) {
return new Tuple<>(3, null);
}
@@ -128,7 +121,7 @@ private static Tuple getData(String type, NamespacedKey key, Pe
}
case "byte_array": {
- byte[] value = data.get(key, PersistentDataType.BYTE_ARRAY);
+ byte[] value = (byte[]) data.get(key, EsPersistentDataType.ByteArray);
if (value == null) {
return new Tuple<>(3, null);
}
@@ -137,7 +130,7 @@ private static Tuple getData(String type, NamespacedKey key, Pe
}
case "int_array": {
- int[] value = data.get(key, PersistentDataType.INTEGER_ARRAY);
+ int[] value = (int[]) data.get(key, EsPersistentDataType.IntArray);
if (value == null) {
return new Tuple<>(3, null);
}
@@ -146,7 +139,7 @@ private static Tuple getData(String type, NamespacedKey key, Pe
}
case "long_array": {
- long[] value = data.get(key, PersistentDataType.LONG_ARRAY);
+ long[] value = (long[]) data.get(key, EsPersistentDataType.LongArray);
if (value == null) {
return new Tuple<>(3, null);
}
@@ -161,23 +154,6 @@ private static Tuple getData(String type, NamespacedKey key, Pe
return new Tuple<>(1, null);
}
- @SuppressWarnings("UnstableApiUsage")
- public static NamespacedKey getNamespacedKey(String keyString) {
- if (Main.majorVersion >= 16) {
- return NamespacedKey.fromString(keyString, Main.plugin);
- }
-
- String[] parts = keyString.split(":");
- if (parts.length == 2) {
- return new NamespacedKey(parts[0], parts[1]);
- } else if (parts.length == 1) { // Incorrectly formatted key
- String pluginName = Main.getPlugin(Main.class).getName();
- return new NamespacedKey(pluginName, parts[0]);
- }
-
- return null;
- }
-
private static StringBuilder buildString(T[] values) {
StringBuilder sb = new StringBuilder("[");
for (T value : values) {
@@ -190,7 +166,7 @@ private static StringBuilder buildString(T[] values) {
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
if (args.length == 2) {
diff --git a/src/main/java/net/serble/estools/Commands/Give/Give.java b/src/main/java/net/serble/estools/Commands/Give/Give.java
index 98ec0f3..f87d807 100644
--- a/src/main/java/net/serble/estools/Commands/Give/Give.java
+++ b/src/main/java/net/serble/estools/Commands/Give/Give.java
@@ -1,35 +1,31 @@
package net.serble.estools.Commands.Give;
import net.serble.estools.*;
-import org.bukkit.Bukkit;
-import org.bukkit.Material;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.inventory.ItemStack;
-
-import java.io.*;
-import java.nio.file.Files;
+import net.serble.estools.Config.ConfigManager;
+import net.serble.estools.Config.Schemas.Give.GiveConfig;
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+
import java.util.*;
import java.util.Map.Entry;
public class Give implements EsToolsTabCompleter {
- private static HashMap materialNames;
+ private static HashMap materialNames;
- public static ItemStack getItem(String name, int amount) {
- name = name.toUpperCase();
- Material mat = materialNames.get(name);
+ public static EsItemStack getItem(String name, int amount) {
+ name = name.toLowerCase();
+ EsMaterial mat = materialNames.get(name);
if (mat == null) {
return null;
}
- return new ItemStack(mat, amount);
+ return Main.server.createItemStack(mat, amount);
}
@Override
- public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
+ public List onTabComplete(EsCommandSender sender, String[] args) {
List tab = new ArrayList<>();
if (args.length == 1) {
@@ -44,49 +40,30 @@ public List onTabComplete(CommandSender sender, Command command, String
return EsToolsCommand.fixTabComplete(tab, args[args.length - 1]);
}
-
- @SuppressWarnings("DataFlowIssue") // Not possible
+
public static void enable() {
// initialise hashmaps
//noinspection Convert2Diamond
- materialNames = new HashMap();
+ materialNames = new HashMap();
// Load config
- FileConfiguration f = ConfigManager.load("give.yml");
+ GiveConfig config = ConfigManager.load("give.yml", GiveConfig.class);
// check if it has settings
- HashMap materials = new HashMap<>();
-
- if ( f.contains("settings") &&
- f.contains("settings.addWithoutUnderscores") &&
- f.contains("settings.removeWithUnderscores")) { // if it has these values then load files
-
- materials = loadItems(f);
- }
-
- if (materials.isEmpty()) { // if it hasn't loaded or if it cant load anything
- Bukkit.getLogger().info("Creating new give.yml");
-
- try {
- copyDefaultGiveYML();
- f = ConfigManager.load(new File(Main.plugin.getDataFolder(), "give.yml"));
- materials = loadItems(f);
- } catch (Exception ignored) { }
- }
+ Map materials = config.getItems();
// Load normal items
- boolean addWithoutUnderscores = (boolean) f.get("settings.addWithoutUnderscores");
- boolean removeWithUnderscores = (boolean) f.get("settings.removeWithUnderscores");
-
- for (Material mat : Material.values()) {
- if (Main.majorVersion >= 12 && !mat.isItem()) continue;
-
- String name = mat.toString().toUpperCase();
+ Set builtinMats = Main.server.getMaterials(true);
+ for (EsMaterial mat : builtinMats) {
+ if (mat == null) {
+ continue;
+ }
- if (name.contains("_") && addWithoutUnderscores) {
+ String name = mat.getKey().toLowerCase();
+ if (name.contains("_") && config.getSettings().isAddWithoutUnderscores()) {
materialNames.put(name.replace("_",""), mat);
- if (removeWithUnderscores) {
+ if (config.getSettings().isRemoveWithUnderscores()) {
continue;
}
}
@@ -96,53 +73,20 @@ public static void enable() {
// Load custom items
for (Entry s : materials.entrySet()) {
- Material mat = Material.getMaterial(s.getValue().toUpperCase());
+ if (s == null) {
+ continue;
+ }
- if (mat != null) {
- materialNames.put(s.getKey().toUpperCase(), mat);
+ EsMaterial material = EsMaterial.fromKey(s.getValue().toLowerCase());
+ if (material == null) {
+ continue; // Don't trust users, if it doesn't exist then skip
}
+
+ materialNames.put(s.getKey().toLowerCase(), material);
}
}
-
- private static HashMap loadItems(FileConfiguration f) {
- HashMap ms = new HashMap<>();
-
- if (f.contains("items")) {
- ConfigurationSection itemsSection = f.getConfigurationSection("items");
- assert itemsSection != null;
-
- itemsSection.getKeys(false).forEach(key -> {
- String content = (String) f.get("items." + key);
- ms.put(key, content);
- });
- }
-
- return ms;
- }
-
- private static void copyDefaultGiveYML() throws IOException {
- // The class loader that loaded the class
- ClassLoader classLoader = Give.class.getClassLoader();
- InputStream inputStream = classLoader.getResourceAsStream("give.yml");
-
- // the stream holding the file content
- if (inputStream == null) {
- return;
- }
-
- byte[] buffer = new byte[inputStream.available()];
- //noinspection ResultOfMethodCallIgnored
- inputStream.read(buffer);
-
- File targetFile = new File(Main.plugin.getDataFolder(), "give.yml");
- OutputStream outStream = Files.newOutputStream(targetFile.toPath());
- outStream.write(buffer);
-
- inputStream.close();
- outStream.close();
- }
-
- public static ItemStack parseArgs(String[] args) {
+
+ public static EsItemStack parseArgs(String[] args) {
if (args.length == 0) {
throw new IllegalArgumentException();
}
diff --git a/src/main/java/net/serble/estools/Commands/Give/GiveItem.java b/src/main/java/net/serble/estools/Commands/Give/GiveItem.java
index 5bbae96..0c61b88 100644
--- a/src/main/java/net/serble/estools/Commands/Give/GiveItem.java
+++ b/src/main/java/net/serble/estools/Commands/Give/GiveItem.java
@@ -1,22 +1,21 @@
package net.serble.estools.Commands.Give;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
import net.serble.estools.EsToolsCommand;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class GiveItem extends EsToolsCommand {
private static final String usage = genUsage("/i - [amount]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- ItemStack item;
+ EsItemStack item;
try {
item = Give.parseArgs(args);
} catch (IllegalArgumentException e) {
@@ -24,11 +23,11 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- Player p = (Player) sender;
+ EsPlayer p = (EsPlayer) sender;
if (item != null) {
p.getInventory().addItem(item);
- send(sender, "&aGave &6%s", item.getType().name());
+ send(sender, "&aGave &6%s", item.getType());
} else {
send(sender, "&cItem &6%s&c not found", args[0]);
}
diff --git a/src/main/java/net/serble/estools/Commands/Give/SetHandItem.java b/src/main/java/net/serble/estools/Commands/Give/SetHandItem.java
index 617bc7d..b4b5ab9 100644
--- a/src/main/java/net/serble/estools/Commands/Give/SetHandItem.java
+++ b/src/main/java/net/serble/estools/Commands/Give/SetHandItem.java
@@ -1,22 +1,21 @@
package net.serble.estools.Commands.Give;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
import net.serble.estools.EsToolsCommand;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class SetHandItem extends EsToolsCommand {
private static final String usage = genUsage("/h
- [amount]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- ItemStack item;
+ EsItemStack item;
try {
item = Give.parseArgs(args);
} catch (IllegalArgumentException e) {
@@ -24,11 +23,11 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- Player p = (Player) sender;
+ EsPlayer p = (EsPlayer) sender;
if (item != null) {
- setMainHand(p, item);
- send(sender, "&aGave &6%s", item.getType().name());
+ p.setMainHand(item);
+ send(sender, "&aGave &6%s", item.getType());
} else {
send(sender, "&cItem &6%s&c not found", args[0]);
}
diff --git a/src/main/java/net/serble/estools/Commands/God.java b/src/main/java/net/serble/estools/Commands/God.java
index c12950b..42ffa60 100644
--- a/src/main/java/net/serble/estools/Commands/God.java
+++ b/src/main/java/net/serble/estools/Commands/God.java
@@ -1,36 +1,33 @@
package net.serble.estools.Commands;
-import net.serble.estools.ConfigManager;
+import net.serble.estools.Config.ConfigManager;
import net.serble.estools.EntityCommand;
import net.serble.estools.Main;
-import org.bukkit.Bukkit;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.entity.EntityDamageEvent;
+import net.serble.estools.ServerApi.EsEventListener;
+import net.serble.estools.ServerApi.Events.EsEntityDamageEvent;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
import java.util.*;
-public class God extends EntityCommand implements Listener {
+public class God extends EntityCommand implements EsEventListener {
private static final HashMap currentPlayers = new HashMap<>();
private static final String usage = genUsage("/god [entity] [time]");
+ private static final String configFile = "gods.yml";
+ @SuppressWarnings("unchecked") // I'm right, trust me
@Override
public void onEnable() {
- Bukkit.getServer().getPluginManager().registerEvents(this, Main.plugin);
+ Main.registerEvents(this);
- FileConfiguration f = ConfigManager.load("gods.yml");
- List godList = f.getStringList("gods");
- godList.forEach(w -> currentPlayers.put(UUID.fromString(w), -1));
+ List f = (List) ConfigManager.load(configFile, ArrayList.class);
+ f.forEach(w -> currentPlayers.put(UUID.fromString(w), -1));
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- LivingEntity p;
+ public boolean execute(EsCommandSender sender, String[] args) {
+ EsLivingEntity p;
int timer = -1;
if (args.length == 0) {
@@ -38,7 +35,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- p = (LivingEntity) sender;
+ p = (EsLivingEntity) sender;
} else {
p = getEntity(sender, args[0]);
@@ -65,10 +62,10 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
if (taskId == -1) {
save();
} else {
- Bukkit.getScheduler().cancelTask(taskId);
+ Main.server.cancelTask(taskId);
}
- send(sender, "&aGod mode &6disabled&a for &6%s", getEntityName(p));
+ send(sender, "&aGod mode &6disabled&a for &6%s", p.getName());
}
else {
int taskId = -1;
@@ -77,7 +74,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
if (timer >= 0) {
timerStr = timer / 20d + " seconds";
- taskId = Bukkit.getScheduler().scheduleSyncDelayedTask(Main.plugin, () -> currentPlayers.remove(uid), timer);
+ taskId = Main.server.runTaskLater(() -> currentPlayers.remove(uid), timer);
}
currentPlayers.put(uid, taskId);
@@ -85,22 +82,13 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
save();
}
- send(sender, "&aGod mode &6enabled&a for &6%s&a for &6%s", getEntityName(p), timerStr);
+ send(sender, "&aGod mode &6enabled&a for &6%s&a for &6%s", p.getName(), timerStr);
}
return true;
}
- @EventHandler
- public void damage(EntityDamageEvent e) {
- if (currentPlayers.containsKey(e.getEntity().getUniqueId())) {
- e.setCancelled(true);
- }
- }
-
private static void save() {
- FileConfiguration f = new YamlConfiguration();
-
List gods = new ArrayList<>();
for (Map.Entry kv : currentPlayers.entrySet()) {
// only save if there isn't a time limit!
@@ -109,7 +97,18 @@ private static void save() {
}
}
- f.set("gods", gods);
- ConfigManager.save("gods.yml", f);
+ ConfigManager.save(configFile, gods);
+ }
+
+ @Override
+ public void executeEvent(EsEvent event) {
+ if (!(event instanceof EsEntityDamageEvent)) {
+ return;
+ }
+ EsEntityDamageEvent e = (EsEntityDamageEvent) event;
+
+ if (currentPlayers.containsKey(e.getEntity().getUniqueId())) {
+ e.setCancelled(true);
+ }
}
}
diff --git a/src/main/java/net/serble/estools/Commands/Heal.java b/src/main/java/net/serble/estools/Commands/Heal.java
index 00af820..9c2f487 100644
--- a/src/main/java/net/serble/estools/Commands/Heal.java
+++ b/src/main/java/net/serble/estools/Commands/Heal.java
@@ -1,22 +1,21 @@
package net.serble.estools.Commands;
import net.serble.estools.EntityCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.LivingEntity;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
public class Heal extends EntityCommand {
private static final String usage = genUsage("/heal [entity]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- LivingEntity entity;
+ public boolean execute(EsCommandSender sender, String[] args) {
+ EsLivingEntity entity;
if (args.length == 0) {
if (isNotEntity(sender, usage)) {
return false;
}
- entity = (LivingEntity) sender;
+ entity = (EsLivingEntity) sender;
send(sender, "&aHealed!");
} else {
entity = getEntity(sender, args[0]);
@@ -25,11 +24,11 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- send(sender, "&aHealed &6%s", getEntityName(entity));
+ send(sender, "&aHealed &6%s", entity.getName());
}
- setHealth(entity, getMaxHealth(entity));
- entity.setFireTicks(0);
+ entity.setHealth(entity.getMaxHealth());
+ entity.setOnFireTicks(0);
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/HideFlags.java b/src/main/java/net/serble/estools/Commands/HideFlags.java
index 09c0c68..6285b7a 100644
--- a/src/main/java/net/serble/estools/Commands/HideFlags.java
+++ b/src/main/java/net/serble/estools/Commands/HideFlags.java
@@ -1,37 +1,38 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.Material;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemFlag;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
+import net.serble.estools.ServerApi.EsItemFlag;
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemMeta;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+import java.util.Objects;
public class HideFlags extends EsToolsCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- ItemStack is = getMainHand((Player) sender);
+ EsItemStack is = ((EsPlayer) sender).getMainHand();
- if (is == null || is.getType() == Material.AIR || is.getItemMeta() == null) {
+ if (is == null || Objects.equals(is.getType(), EsMaterial.createUnchecked("AIR")) || is.getItemMeta() == null) {
send(sender, "&cMust be a damageable item");
return false;
}
- ItemMeta im = is.getItemMeta();
+ EsItemMeta im = is.getItemMeta();
String un;
if (!im.getItemFlags().isEmpty()) {
- im.removeItemFlags(ItemFlag.values());
+ im.removeItemFlags(EsItemFlag.values());
un = "&aRemoved Item Flags";
} else {
- im.addItemFlags(ItemFlag.values());
+ im.addItemFlags(EsItemFlag.values());
un = "&aAdded Item Flags";
}
diff --git a/src/main/java/net/serble/estools/Commands/Infinite.java b/src/main/java/net/serble/estools/Commands/Infinite.java
index 71ad4c0..220dc30 100644
--- a/src/main/java/net/serble/estools/Commands/Infinite.java
+++ b/src/main/java/net/serble/estools/Commands/Infinite.java
@@ -2,33 +2,32 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.Bukkit;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.block.BlockPlaceEvent;
-import org.bukkit.inventory.ItemStack;
+import net.serble.estools.ServerApi.EsEquipmentSlot;
+import net.serble.estools.ServerApi.EsEventListener;
+import net.serble.estools.ServerApi.Events.EsBlockPlaceEvent;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
import java.util.UUID;
-public class Infinite extends EsToolsCommand implements Listener {
+public class Infinite extends EsToolsCommand implements EsEventListener {
private static final ArrayList currentPlayers = new ArrayList<>();
@Override
public void onEnable() {
- Bukkit.getServer().getPluginManager().registerEvents(this, Main.plugin);
+ Main.registerEvents(this);
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- UUID pu = ((Player)sender).getUniqueId();
+ UUID pu = ((EsPlayer) sender).getUniqueId();
if (!currentPlayers.contains(pu)) {
currentPlayers.add(pu);
@@ -41,19 +40,20 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return true;
}
- @EventHandler
- public void blockPlace(BlockPlaceEvent e) {
+ @Override
+ public void executeEvent(EsEvent event) {
+ if (!(event instanceof EsBlockPlaceEvent)) {
+ return;
+ }
+ EsBlockPlaceEvent e = (EsBlockPlaceEvent) event;
+
if (!currentPlayers.contains(e.getPlayer().getUniqueId())) {
return;
}
- ItemStack item = e.getItemInHand().clone();
+ EsItemStack item = e.getPlacedItem().clone();
+ EsEquipmentSlot slot = e.getHand();
- Bukkit.getScheduler().runTask(Main.plugin, () -> {
- setMainHand(e.getPlayer(), item);
- // A bug exists where the item is not updated in the player's inventory, this is needed for that
- //noinspection UnstableApiUsage
- e.getPlayer().updateInventory();
- });
+ Main.server.runTask(() -> e.getPlayer().getInventory().setItem(slot, item));
}
}
diff --git a/src/main/java/net/serble/estools/Commands/InvSee.java b/src/main/java/net/serble/estools/Commands/InvSee.java
index 000d764..7a43aa4 100644
--- a/src/main/java/net/serble/estools/Commands/InvSee.java
+++ b/src/main/java/net/serble/estools/Commands/InvSee.java
@@ -1,15 +1,14 @@
package net.serble.estools.Commands;
import net.serble.estools.PlayerCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class InvSee extends PlayerCommand {
private static final String usage = genUsage("/invsee ");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
@@ -19,13 +18,13 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- Player target = getPlayer(sender, args[0]);
+ EsPlayer target = getPlayer(sender, args[0]);
if (target == null) {
return false;
}
- ((Player) sender).openInventory(target.getInventory());
+ ((EsPlayer) sender).openInventory(target.getInventory());
send(sender, "&aOpened &6%s's &aInventory", target.getName());
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/Lore.java b/src/main/java/net/serble/estools/Commands/Lore.java
index ae1b157..bc01cb5 100644
--- a/src/main/java/net/serble/estools/Commands/Lore.java
+++ b/src/main/java/net/serble/estools/Commands/Lore.java
@@ -1,11 +1,10 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import net.serble.estools.MetaHandler;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemMeta;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
import java.util.Arrays;
@@ -17,7 +16,7 @@ public class Lore extends EsToolsCommand {
"/lore ");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
@@ -27,15 +26,17 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- Player p = (Player)sender;
- ItemStack is = getMainHand(p);
+ EsPlayer p = (EsPlayer)sender;
+ EsItemStack is = p.getMainHand();
if (is.getItemMeta() == null) {
send(sender, "&cThis item cannot have lore!");
return false;
}
- List lore = MetaHandler.getLore(is);
+ EsItemMeta meta = is.getItemMeta();
+
+ List lore = meta.getLore();
switch (args[0].toLowerCase()) {
case "add": {
@@ -82,11 +83,12 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- MetaHandler.setLore(is, lore);
+ meta.setLore(lore);
+ is.setItemMeta(meta);
return true;
}
- private int getLine(CommandSender sender, String num, int limit) {
+ private int getLine(EsCommandSender sender, String num, int limit) {
try {
int line = Integer.parseInt(num) - 1;
@@ -108,7 +110,7 @@ private String getLore(String[] args, int start) {
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
if (args.length == 1) {
@@ -117,13 +119,13 @@ public List tabComplete(CommandSender sender, String[] args, String lArg
tab.add("insert");
tab.add("remove");
} else if (args.length == 2 && equalsOr(args[0].toLowerCase(), "set", "insert", "remove")) {
- if (!(sender instanceof Player)) {
+ if (!(sender instanceof EsPlayer)) {
tab.add("1");
return tab;
}
- ItemStack is = getMainHand((Player)sender);
- List lore = MetaHandler.getLore(is);
+ EsItemStack is = ((EsPlayer)sender).getMainHand();
+ List lore = is.getItemMeta().getLore();
for (int i = 1; i <= lore.size(); i++) {
tab.add(String.valueOf(i));
}
diff --git a/src/main/java/net/serble/estools/Commands/Midnight.java b/src/main/java/net/serble/estools/Commands/Midnight.java
index fcc0c76..c1ce3c3 100644
--- a/src/main/java/net/serble/estools/Commands/Midnight.java
+++ b/src/main/java/net/serble/estools/Commands/Midnight.java
@@ -1,19 +1,18 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class Midnight extends EsToolsCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- ((Player)sender).getWorld().setTime(18000);
+ ((EsPlayer)sender).getWorld().setTime(18000);
send(sender, "&aSet time to &6midnight");
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/Mount.java b/src/main/java/net/serble/estools/Commands/Mount.java
index 3cc82af..fd7a1fc 100644
--- a/src/main/java/net/serble/estools/Commands/Mount.java
+++ b/src/main/java/net/serble/estools/Commands/Mount.java
@@ -1,10 +1,8 @@
package net.serble.estools.Commands;
import net.serble.estools.EntityCommand;
-import net.serble.estools.Main;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Entity;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsEntity;
import java.util.ArrayList;
import java.util.List;
@@ -13,38 +11,42 @@ public class Mount extends EntityCommand {
private static final String usage = genUsage("/mount [rider1] [rider2]...");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, usage);
return false;
}
- Entity target = getNonLivingEntity(sender, args[0]);
+ EsEntity target = getNonLivingEntity(sender, args[0]);
if (target == null) {
return false;
}
- List riders = new ArrayList<>();
+ List riders = new ArrayList<>();
for (int i = 1; i < args.length; i++) {
- riders.add(getNonLivingEntity(sender, args[i]));
+ EsEntity rider = getNonLivingEntity(sender, args[i]);
+ if (rider == null) {
+ return false;
+ }
+ riders.add(rider);
}
if (riders.isEmpty()) {
- if (!(sender instanceof Entity)) {
+ if (!(sender instanceof EsEntity)) {
send(sender, "&cConsole must specify a rider");
return false;
}
- riders.add((Entity) sender);
+ riders.add((EsEntity) sender);
}
- for (Entity entity : riders) {
- if (Main.majorVersion > 11) {
- target.addPassenger(entity);
- } else {
- //noinspection deprecation
- target.setPassenger(entity);
+ for (EsEntity entity : riders) {
+ if (entity.getUniqueId() == target.getUniqueId()) {
+ send(sender, "&cSorry, but you cant ride yourself! (the world ends)");
+ return false;
}
+
+ target.addPassenger(entity);
target = entity;
}
diff --git a/src/main/java/net/serble/estools/Commands/MoveSpeed/FlySpeed.java b/src/main/java/net/serble/estools/Commands/MoveSpeed/FlySpeed.java
index ac4c109..98379c7 100644
--- a/src/main/java/net/serble/estools/Commands/MoveSpeed/FlySpeed.java
+++ b/src/main/java/net/serble/estools/Commands/MoveSpeed/FlySpeed.java
@@ -1,9 +1,8 @@
package net.serble.estools.Commands.MoveSpeed;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import net.serble.estools.Tuple;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
import java.util.List;
@@ -16,14 +15,14 @@ public String getUsage() {
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- Tuple
, Float> result = getTargets(sender, args);
+ public boolean execute(EsCommandSender sender, String[] args) {
+ Tuple, Float> result = getTargets(sender, args);
if (result == null) {
return false;
}
- for (Player p : result.a()) {
+ for (EsPlayer p : result.a()) {
p.setFlySpeed(result.b());
}
diff --git a/src/main/java/net/serble/estools/Commands/MoveSpeed/MoveSpeed.java b/src/main/java/net/serble/estools/Commands/MoveSpeed/MoveSpeed.java
index f1080a4..209dea2 100644
--- a/src/main/java/net/serble/estools/Commands/MoveSpeed/MoveSpeed.java
+++ b/src/main/java/net/serble/estools/Commands/MoveSpeed/MoveSpeed.java
@@ -1,9 +1,9 @@
package net.serble.estools.Commands.MoveSpeed;
import net.serble.estools.MultiPlayerCommand;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import net.serble.estools.Tuple;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
@@ -11,20 +11,20 @@
public abstract class MoveSpeed extends MultiPlayerCommand {
protected abstract String getUsage();
- public Tuple, Float> getTargets(CommandSender sender, String[] args) {
+ public Tuple, Float> getTargets(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, getUsage());
return null;
}
- ArrayList players = new ArrayList<>();
+ ArrayList players = new ArrayList<>();
if (args.length == 1) {
if (isNotPlayer(sender, getUsage())) {
return null;
}
- players.add((Player)sender);
+ players.add((EsPlayer)sender);
} else {
players = getPlayers(sender, removeArgs(args, 1));
@@ -51,7 +51,7 @@ public Tuple, Float> getTargets(CommandSender sender, String[] args
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
if (args.length == 1) {
diff --git a/src/main/java/net/serble/estools/Commands/MoveSpeed/WalkSpeed.java b/src/main/java/net/serble/estools/Commands/MoveSpeed/WalkSpeed.java
index e012537..479e01d 100644
--- a/src/main/java/net/serble/estools/Commands/MoveSpeed/WalkSpeed.java
+++ b/src/main/java/net/serble/estools/Commands/MoveSpeed/WalkSpeed.java
@@ -1,9 +1,8 @@
package net.serble.estools.Commands.MoveSpeed;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import net.serble.estools.Tuple;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
import java.util.List;
@@ -16,14 +15,14 @@ protected String getUsage() {
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- Tuple, Float> result = getTargets(sender, args);
+ public boolean execute(EsCommandSender sender, String[] args) {
+ Tuple, Float> result = getTargets(sender, args);
if (result == null) {
return false;
}
- for (Player p : result.a()) {
+ for (EsPlayer p : result.a()) {
p.setWalkSpeed(result.b());
}
diff --git a/src/main/java/net/serble/estools/Commands/Music.java b/src/main/java/net/serble/estools/Commands/Music.java
index ed9f72d..6264788 100644
--- a/src/main/java/net/serble/estools/Commands/Music.java
+++ b/src/main/java/net/serble/estools/Commands/Music.java
@@ -2,92 +2,70 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.*;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.EsSound;
+import net.serble.estools.ServerApi.EsSoundCategory;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Music extends EsToolsCommand {
- private static final String usage = genUsage("/music [song]");
- private static final List musics = new ArrayList<>();
+ private static final List randomDiscs = new ArrayList<>(); // discs that can be picked randomly
private static final List tabComplete = new ArrayList<>();
private static final Random random = new Random();
@Override
public void onEnable() {
- if (Main.majorVersion > 12) {
- for (Sound s : Sound.values()) {
- if (s.name().startsWith("MUSIC_DISC")) {
- musics.add(s);
- tabComplete.add(s.name().toLowerCase().substring(11));
- }
- }
-
- musics.remove(Sound.MUSIC_DISC_13);
- musics.remove(Sound.MUSIC_DISC_11);
- } else {
- for (Sound s : Sound.values()) {
- String name = s.name();
- if (name.startsWith("RECORD")) {
- tabComplete.add(s.name().toLowerCase().substring(7));
-
- if (!name.equals("RECORD_11") && !name.equals("RECORD_13")) {
- musics.add(s);
- }
- }
+ for (EsSound s : Main.server.getSounds()) {
+ if (s.getKey().startsWith("music_disc")) {
+ randomDiscs.add(s);
+ tabComplete.add(s.getKey().substring(11));
}
}
+ randomDiscs.remove(EsSound.createUnchecked("music_disc.13"));
+ randomDiscs.remove(EsSound.createUnchecked("music_disc.11"));
+ randomDiscs.remove(EsSound.createUnchecked("music_disc.5"));
+
tabComplete.add("random");
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
-
- Player p = (Player) sender;
- Sound sound;
+ EsPlayer p = (EsPlayer) sender;
+
+ EsSound sound;
if (args.length > 0 && !args[0].equalsIgnoreCase("random")) {
- try {
- if (Main.majorVersion > 12) {
- sound = Sound.valueOf("MUSIC_DISC_" + args[0].toUpperCase());
- }
- else {
- sound = Sound.valueOf("RECORD_" + args[0].toUpperCase());
- }
- } catch (IllegalArgumentException e) {
- send(sender, usage);
+ sound = EsSound.fromKey("music_disc." + args[0]);
+
+ if (sound == null) {
+ send(sender, "&cThat music disc does not exist!");
return false;
}
} else {
- sound = musics.get(random.nextInt(musics.size()));
+ sound = randomDiscs.get(random.nextInt(randomDiscs.size()));
}
- if (Main.majorVersion >= 11) {
- p.playSound(p.getLocation().add(0, 1000, 0), sound, SoundCategory.RECORDS, 100000, 1);
- }
- else {
- p.playSound(p.getLocation().add(0, 1000, 0), sound, 100000, 1);
- }
+ // play very high up and with large volume so that the sound doesn't pan
+ // volume doesn't make the sound louder, it just increases its range.
+ p.playSound(sound, EsSoundCategory.Records, p.getLocation().add(0, 1000, 0), 100000, 1);
- // Substring away the MUSIC_DISK_ or the RECORD_ depending on the version
- // then reformat to be all lowercase except for the first character
- String name = sound.name().toLowerCase().substring(Main.majorVersion > 12 ? 11 : 7);
+ // Substring away the music_disc, then reformat to capitalise the first letter
+ String name = sound.getKey().toLowerCase().substring(11);
name = String.valueOf(name.charAt(0)).toUpperCase() + name.substring(1);
-
+
send(sender, "&aNow Playing: &6%s", name);
return true;
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
if (args.length == 1) {
return new ArrayList<>(tabComplete);
}
diff --git a/src/main/java/net/serble/estools/Commands/Night.java b/src/main/java/net/serble/estools/Commands/Night.java
index 3d4233e..4089b4d 100644
--- a/src/main/java/net/serble/estools/Commands/Night.java
+++ b/src/main/java/net/serble/estools/Commands/Night.java
@@ -1,19 +1,18 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class Night extends EsToolsCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- ((Player)sender).getWorld().setTime(13000);
+ ((EsPlayer)sender).getWorld().setTime(13000);
send(sender, "&aSet time to &6night");
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/Noon.java b/src/main/java/net/serble/estools/Commands/Noon.java
index d177ad2..fb115aa 100644
--- a/src/main/java/net/serble/estools/Commands/Noon.java
+++ b/src/main/java/net/serble/estools/Commands/Noon.java
@@ -1,19 +1,18 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class Noon extends EsToolsCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- ((Player)sender).getWorld().setTime(6000);
+ ((EsPlayer)sender).getWorld().setTime(6000);
send(sender, "&aSet time to &6noon");
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/Potion.java b/src/main/java/net/serble/estools/Commands/Potion.java
index 154abd0..2b8e5c0 100644
--- a/src/main/java/net/serble/estools/Commands/Potion.java
+++ b/src/main/java/net/serble/estools/Commands/Potion.java
@@ -1,70 +1,84 @@
package net.serble.estools.Commands;
-import net.serble.estools.Effects;
+import net.serble.estools.ServerApi.EsPotionEffect;
+import net.serble.estools.ServerApi.EsPotionEffectType;
import net.serble.estools.EntityCommand;
import net.serble.estools.Main;
-import net.serble.estools.MetaHandler;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.potion.PotionEffectType;
-import org.bukkit.potion.PotionType;
+import net.serble.estools.ServerApi.EsPotType;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
public class Potion extends EntityCommand {
private static final String usage = genUsage("/potion [amplifier] [duration] [amount] [drink/splash/lingering] [player]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, usage);
return false;
}
+ EsPotionEffectType type = EsPotionEffectType.fromKey(args[0]);
+ if (type == null) {
+ send(sender, "Potion type does not exist!");
+ return false;
+ }
+
int amount = 1;
if (args.length >= 4) {
amount = tryParseInt(args[3], 1);
}
- int amp = 1;
+ int amp = 0;
if (args.length >= 2) {
- amp = tryParseInt(args[1], 1);
+ // amp 0 is level 1, so subtract 1 from player input
+ amp = tryParseInt(args[1], 1) - 1;
+
+ if (Main.minecraftVersion.getMinor() <= 7 && amp < 0 || amp > 1) {
+ send(sender, "&cAmplifier must be 1 or 2!");
+ return false;
+ }
}
int duration = 60*20*5;
if (args.length >= 3) {
- duration = tryParseInt(args[2], 60*5)*20;
+ duration = (int) (tryParseDouble(args[2], 60d*5d)*20d);
}
- PotType potType = PotType.drink;
+ EsPotType potType = EsPotType.drink;
if (args.length >= 5) {
try {
- potType = PotType.valueOf(args[4].toLowerCase());
+ potType = EsPotType.valueOf(args[4].toLowerCase());
} catch (IllegalArgumentException ignored) {
- send(sender, "&cInvalid potion type, must be drink, splash, or lingering (if on 1.9+)");
+ if (Main.minecraftVersion.getMinor() >= 9) {
+ send(sender, "&cInvalid potion type, must be drink, splash, or lingering");
+ } else {
+ send(sender, "&cInvalid potion type, must be drink or splash");
+ }
+
return false;
}
// Check versions
- if (Main.majorVersion < 9 && potType == PotType.lingering) {
+ if (Main.minecraftVersion.getMinor() < 9 && potType == EsPotType.lingering) {
// Doesn't exist
send(sender, "&cLingering potions don't exist in this version");
return false;
}
}
- Player player;
+ EsPlayer player;
if (args.length >= 6) {
player = getPlayer(sender, args[5]);
if (player == null) return false;
} else {
- if (sender instanceof Player) {
+ if (sender instanceof EsPlayer) {
// Give to them
- player = (Player) sender;
+ player = (EsPlayer) sender;
} else {
// They are console
send(sender, "&cConsole must specify a player");
@@ -72,13 +86,9 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
}
- if (Main.majorVersion <= 3) {
- send(sender, "&cPotions are not yet supported in this version, they may be in the future.");
- return false;
- }
-
- ItemStack pot = MetaHandler.getPotion(sender, potType, args[0], duration, amp, amount);
+ EsItemStack pot = Main.server.createPotion(potType, new EsPotionEffect(type, amp, duration), amount);
if (pot == null) {
+ send(sender, "&cInvalid potion effect!");
return false;
}
@@ -92,26 +102,20 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return true;
}
- public enum PotType {
- drink,
- splash,
- lingering
- }
-
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
// /potion [amplifier] [duration] [amount] [drink/splash/lingering] [player]
switch (args.length) {
case 1:
- if (Main.majorVersion <= 8) {
- for (Map.Entry e : Effects.potionEntrySet()) {
+ if (Main.minecraftVersion.getMinor() <= 8) {
+ for (EsPotionEffectType e : Main.server.getOldPotionTypes()) {
tab.add(e.getKey().toLowerCase());
}
}
else {
- for (Map.Entry e : Effects.entrySet()) {
+ for (EsPotionEffectType e : Main.server.getPotionEffectTypes()) {
tab.add(e.getKey().toLowerCase());
}
}
@@ -129,7 +133,7 @@ public List tabComplete(CommandSender sender, String[] args, String lArg
case 5:
tab.add("drink");
tab.add("splash");
- if (Main.majorVersion >= 9) tab.add("lingering");
+ if (Main.minecraftVersion.getMinor() >= 9) tab.add("lingering");
break;
case 6:
diff --git a/src/main/java/net/serble/estools/Commands/PowerPick/PowerAxe.java b/src/main/java/net/serble/estools/Commands/PowerPick/PowerAxe.java
index 54c7749..36bdda2 100644
--- a/src/main/java/net/serble/estools/Commands/PowerPick/PowerAxe.java
+++ b/src/main/java/net/serble/estools/Commands/PowerPick/PowerAxe.java
@@ -2,28 +2,27 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.Material;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.inventory.ItemStack;
+import net.serble.estools.ServerApi.EsEnchantment;
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
public class PowerAxe extends EsToolsCommand {
- private static ItemStack powerItem;
+ private static EsItemStack powerItem;
public static void init() {
- if (Main.majorVersion > 15) {
- powerItem = new ItemStack(Material.NETHERITE_AXE);
+ if (Main.minecraftVersion.getMinor() > 15) {
+ powerItem = Main.server.createItemStack(EsMaterial.fromKey("NETHERITE_AXE"), 1);
}
else {
- powerItem = new ItemStack(Material.DIAMOND_AXE, 1);
+ powerItem = Main.server.createItemStack(EsMaterial.fromKey("DIAMOND_AXE"), 1);
}
- PowerTool.setupItem(powerItem, Enchantment.DIG_SPEED);
+ PowerTool.setupItem(powerItem, EsEnchantment.createUnchecked("efficiency"));
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
PowerTool.cmd(sender, powerItem);
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/PowerPick/PowerHoe.java b/src/main/java/net/serble/estools/Commands/PowerPick/PowerHoe.java
index c194248..1038a13 100644
--- a/src/main/java/net/serble/estools/Commands/PowerPick/PowerHoe.java
+++ b/src/main/java/net/serble/estools/Commands/PowerPick/PowerHoe.java
@@ -2,28 +2,27 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.Material;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.inventory.ItemStack;
+import net.serble.estools.ServerApi.EsEnchantment;
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
public class PowerHoe extends EsToolsCommand {
- private static ItemStack powerItem;
+ private static EsItemStack powerItem;
public static void init() {
- if (Main.majorVersion > 15) {
- powerItem = new ItemStack(Material.NETHERITE_HOE);
+ if (Main.minecraftVersion.getMinor() > 15) {
+ powerItem = Main.server.createItemStack(EsMaterial.fromKey("NETHERITE_HOE"), 1);
}
else {
- powerItem = new ItemStack(Material.DIAMOND_HOE, 1);
+ powerItem = Main.server.createItemStack(EsMaterial.fromKey("DIAMOND_HOE"), 1);
}
- PowerTool.setupItem(powerItem, Enchantment.DIG_SPEED);
+ PowerTool.setupItem(powerItem, EsEnchantment.createUnchecked("efficiency"));
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
PowerTool.cmd(sender, powerItem);
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/PowerPick/PowerPick.java b/src/main/java/net/serble/estools/Commands/PowerPick/PowerPick.java
index c9e59fb..dd85779 100644
--- a/src/main/java/net/serble/estools/Commands/PowerPick/PowerPick.java
+++ b/src/main/java/net/serble/estools/Commands/PowerPick/PowerPick.java
@@ -2,28 +2,27 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.Material;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.inventory.ItemStack;
+import net.serble.estools.ServerApi.EsEnchantment;
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
public class PowerPick extends EsToolsCommand {
- private static ItemStack powerItem;
+ private static EsItemStack powerItem;
public static void init() {
- if (Main.majorVersion > 15) {
- powerItem = new ItemStack(Material.NETHERITE_PICKAXE);
+ if (Main.minecraftVersion.getMinor() > 15) {
+ powerItem = Main.server.createItemStack(EsMaterial.fromKey("NETHERITE_PICKAXE"), 1);
}
else {
- powerItem = new ItemStack(Material.DIAMOND_PICKAXE, 1);
+ powerItem = Main.server.createItemStack(EsMaterial.fromKey("DIAMOND_PICKAXE"), 1);
}
- PowerTool.setupItem(powerItem, Enchantment.DIG_SPEED);
+ PowerTool.setupItem(powerItem, EsEnchantment.createUnchecked("efficiency"));
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
PowerTool.cmd(sender, powerItem);
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/PowerPick/PowerShovel.java b/src/main/java/net/serble/estools/Commands/PowerPick/PowerShovel.java
index 9f20a2e..ef908be 100644
--- a/src/main/java/net/serble/estools/Commands/PowerPick/PowerShovel.java
+++ b/src/main/java/net/serble/estools/Commands/PowerPick/PowerShovel.java
@@ -2,31 +2,28 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.Material;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.Objects;
+import net.serble.estools.ServerApi.EsEnchantment;
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
public class PowerShovel extends EsToolsCommand {
- private static ItemStack powerItem;
+ private static EsItemStack powerItem;
public static void init() {
- if (Main.majorVersion > 15) {
- powerItem = new ItemStack(Material.NETHERITE_SHOVEL);
- } else if (Main.majorVersion > 12) {
- powerItem = new ItemStack(Material.DIAMOND_SHOVEL);
+ if (Main.minecraftVersion.getMinor() > 15) {
+ powerItem = Main.server.createItemStack(EsMaterial.fromKey("NETHERITE_SHOVEL"), 1);
+ } else if (Main.minecraftVersion.getMinor() > 12) {
+ powerItem = Main.server.createItemStack(EsMaterial.fromKey("DIAMOND_SHOVEL"), 1);
} else {
- powerItem = new ItemStack(Objects.requireNonNull(Material.getMaterial("DIAMOND_SPADE")), 1);
+ powerItem = Main.server.createItemStack(EsMaterial.fromKey("DIAMOND_SPADE"), 1);
}
- PowerTool.setupItem(powerItem, Enchantment.DIG_SPEED);
+ PowerTool.setupItem(powerItem, EsEnchantment.createUnchecked("efficiency"));
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
PowerTool.cmd(sender, powerItem);
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/PowerPick/PowerSword.java b/src/main/java/net/serble/estools/Commands/PowerPick/PowerSword.java
index a4cba1a..b0c5982 100644
--- a/src/main/java/net/serble/estools/Commands/PowerPick/PowerSword.java
+++ b/src/main/java/net/serble/estools/Commands/PowerPick/PowerSword.java
@@ -2,29 +2,26 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.Material;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.Objects;
+import net.serble.estools.ServerApi.EsEnchantment;
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
public class PowerSword extends EsToolsCommand {
- private static ItemStack powerPick;
+ private static EsItemStack powerPick;
public static void init() {
- if (Main.majorVersion > 12) {
- powerPick = new ItemStack(Material.SALMON);
+ if (Main.minecraftVersion.getMinor() > 12) {
+ powerPick = Main.server.createItemStack(EsMaterial.fromKey("SALMON"), 1);
} else {
- powerPick = new ItemStack(Objects.requireNonNull(Material.getMaterial("RAW_FISH")), 1);
+ powerPick = Main.server.createItemStack(EsMaterial.fromKey("RAW_FISH"), 1);
}
- PowerTool.setupItem(powerPick, Enchantment.DAMAGE_ALL);
+ PowerTool.setupItem(powerPick, EsEnchantment.createUnchecked("sharpness"));
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
PowerTool.cmd(sender, powerPick);
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/PowerPick/PowerTool.java b/src/main/java/net/serble/estools/Commands/PowerPick/PowerTool.java
index c35b416..b49f7d2 100644
--- a/src/main/java/net/serble/estools/Commands/PowerPick/PowerTool.java
+++ b/src/main/java/net/serble/estools/Commands/PowerPick/PowerTool.java
@@ -2,11 +2,11 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.command.CommandSender;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
+import net.serble.estools.ServerApi.EsEnchantment;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemMeta;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class PowerTool {
public static void init() {
@@ -17,25 +17,24 @@ public static void init() {
PowerSword.init();
}
- public static void setupItem(ItemStack item, Enchantment enchantment) {
- item.addUnsafeEnchantment(enchantment, 32767);
+ public static void setupItem(EsItemStack item, EsEnchantment enchantment) {
+ item.addEnchantment(enchantment, 32767);
- if (Main.majorVersion > 10) {
- ItemMeta im = item.getItemMeta();
- assert im != null;
+ if (Main.minecraftVersion.getMinor() > 10) {
+ EsItemMeta im = item.getItemMeta();
im.setUnbreakable(true);
item.setItemMeta(im);
} else {
- item.addUnsafeEnchantment(Enchantment.DURABILITY, 32767);
+ item.addEnchantment(EsEnchantment.createUnchecked("unbreaking"), 32767);
}
}
- public static void cmd(CommandSender sender, ItemStack pp) {
+ public static void cmd(EsCommandSender sender, EsItemStack pp) {
if (EsToolsCommand.isNotPlayer(sender)) {
return;
}
- Player p = (Player)sender;
+ EsPlayer p = (EsPlayer) sender;
p.getInventory().addItem(pp);
EsToolsCommand.send(sender, "&aThere you go!");
diff --git a/src/main/java/net/serble/estools/Commands/Rain.java b/src/main/java/net/serble/estools/Commands/Rain.java
index f67b839..5453b1e 100644
--- a/src/main/java/net/serble/estools/Commands/Rain.java
+++ b/src/main/java/net/serble/estools/Commands/Rain.java
@@ -1,21 +1,20 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.World;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+import net.serble.estools.ServerApi.Interfaces.EsWorld;
public class Rain extends EsToolsCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- World world = ((Player) sender).getWorld();
- world.setStorm(true);
+ EsWorld world = ((EsPlayer) sender).getWorld();
+ world.setStorming(true);
world.setThundering(false);
send(sender, "&aSet weather to &6rain");
diff --git a/src/main/java/net/serble/estools/Commands/RemovePersistentData.java b/src/main/java/net/serble/estools/Commands/RemovePersistentData.java
index f694ff4..25cf4f5 100644
--- a/src/main/java/net/serble/estools/Commands/RemovePersistentData.java
+++ b/src/main/java/net/serble/estools/Commands/RemovePersistentData.java
@@ -1,18 +1,16 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.NamespacedKey;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemMeta;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class RemovePersistentData extends EsToolsCommand {
public static final String usage = genUsage("/removepersistentdata ");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender))
return false;
@@ -21,16 +19,16 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return true;
}
- String tagString = args[0].toLowerCase();
+ String key = args[0].toLowerCase();
- ItemStack item = getMainHand((Player) sender);
- NamespacedKey key = GetPersistentData.getNamespacedKey(tagString);
- if (key == null) {
- send(sender, "&cInvalid key! examples: 'estools:count', 'backpacks:size', etc");
- return false;
- }
+ EsItemStack item = ((EsPlayer) sender).getMainHand();
+// NamespacedKey key = GetPersistentData.getNamespacedKey(tagString);
+// if (key == null) {
+// send(sender, "&cInvalid key! examples: 'estools:count', 'backpacks:size', etc");
+// return false;
+// }
- ItemMeta meta = item.getItemMeta();
+ EsItemMeta meta = item.getItemMeta();
if (meta == null) {
send(sender, "&cItem does not have nbt tags!");
return false;
@@ -39,7 +37,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
meta.getPersistentDataContainer().remove(key);
item.setItemMeta(meta);
- send(sender, "&aRemove NBT tag &e\"" + tagString + "\"&a!");
+ send(sender, "&aRemove NBT tag &e\"" + key + "\"&a!");
return true;
}
}
diff --git a/src/main/java/net/serble/estools/Commands/Rename.java b/src/main/java/net/serble/estools/Commands/Rename.java
index 26da7aa..22d2366 100644
--- a/src/main/java/net/serble/estools/Commands/Rename.java
+++ b/src/main/java/net/serble/estools/Commands/Rename.java
@@ -1,33 +1,40 @@
package net.serble.estools.Commands;
-import net.serble.estools.MetaHandler;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
import net.serble.estools.EsToolsCommand;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemMeta;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class Rename extends EsToolsCommand {
public static final String usage = genUsage("/rename [name]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- Player p = (Player)sender;
- ItemStack is = getMainHand(p);
+ EsPlayer p = (EsPlayer) sender;
+ EsItemStack is = p.getMainHand();
+
+ EsItemMeta meta = is.getItemMeta();
+
+ if (meta == null) {
+ send(sender, "&cYou must be holding an item");
+ return false;
+ }
if (args.length == 0) {
- MetaHandler.renameItem(is, "");
+ meta.setDisplayName("");
+ is.setItemMeta(meta);
send(sender, "&aRemoved item name");
return false;
}
String name = translate("&r" + String.join(" ", args));
- MetaHandler.renameItem(is, name);
+ meta.setDisplayName(name);
+ is.setItemMeta(meta);
send(sender, "&aItem renamed to &6%s", name);
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/SafeTp.java b/src/main/java/net/serble/estools/Commands/SafeTp.java
index f03ec1f..20f305d 100644
--- a/src/main/java/net/serble/estools/Commands/SafeTp.java
+++ b/src/main/java/net/serble/estools/Commands/SafeTp.java
@@ -2,24 +2,29 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.Bukkit;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.player.PlayerTeleportEvent;
-
-public class SafeTp extends EsToolsCommand implements Listener {
+import net.serble.estools.ServerApi.EsEventListener;
+import net.serble.estools.ServerApi.EsTeleportCause;
+import net.serble.estools.ServerApi.Events.EsPlayerTeleportEvent;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.ServerPlatform;
+
+public class SafeTp extends EsToolsCommand implements EsEventListener {
public static boolean enabled = true;
@Override
public void onEnable() {
- enabled = Main.plugin.getConfig().getBoolean("safetp", true);
- Bukkit.getServer().getPluginManager().registerEvents(this, Main.plugin);
+ enabled = Main.plugin.getConfig().isSafeTp();
+ Main.registerEvents(this);
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
+ if (Main.platform == ServerPlatform.Folia) {
+ send(sender, "&cCurrently due to Folia issues SafeTP is not supported");
+ return false;
+ }
+
if (enabled) {
enabled = false;
send(sender, "&aTeleporting now &6&lWILL&a make you take fall damage!");
@@ -28,15 +33,19 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
send(sender, "&aTeleporting now &6&lWILL NOT&a make you take fall damage!");
}
- Main.plugin.getConfig().set("safetp", enabled);
+ Main.plugin.getConfig().setSafeTp(enabled);
Main.plugin.saveConfig();
return true;
}
- @EventHandler
- public void teleport(final PlayerTeleportEvent e) {
- if (enabled && equalsOr(e.getCause(), PlayerTeleportEvent.TeleportCause.COMMAND,
- PlayerTeleportEvent.TeleportCause.PLUGIN, PlayerTeleportEvent.TeleportCause.UNKNOWN)) {
+ @Override
+ public void executeEvent(EsEvent event) {
+ if (!(event instanceof EsPlayerTeleportEvent)) {
+ return;
+ }
+ EsPlayerTeleportEvent e = (EsPlayerTeleportEvent) event;
+
+ if (enabled && equalsOr(e.getCause(), EsTeleportCause.Command, EsTeleportCause.Plugin, EsTeleportCause.Unknown)) {
e.getPlayer().setFallDistance(0);
}
}
diff --git a/src/main/java/net/serble/estools/Commands/SetHealth.java b/src/main/java/net/serble/estools/Commands/SetHealth.java
index 61f1f59..ea4c885 100644
--- a/src/main/java/net/serble/estools/Commands/SetHealth.java
+++ b/src/main/java/net/serble/estools/Commands/SetHealth.java
@@ -1,20 +1,19 @@
package net.serble.estools.Commands;
import net.serble.estools.EntityCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.LivingEntity;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
public class SetHealth extends EntityCommand {
private static final String usage = genUsage("/sethealth [entity]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, usage);
}
- LivingEntity entity;
+ EsLivingEntity entity;
if (args.length > 1) {
entity = getEntity(sender, args[1]);
@@ -26,7 +25,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- entity = (LivingEntity) sender;
+ entity = (EsLivingEntity) sender;
}
double health;
@@ -42,15 +41,15 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- double maxhealth = getMaxHealth(entity);
+ double maxhealth = entity.getMaxHealth();
if (maxhealth < health) {
health = maxhealth;
}
- setHealth(entity, health);
+ entity.setHealth(health);
if (args.length > 1) {
- send(sender, "&aSet health for &6%s&a to &6%s", getEntityName(entity), String.valueOf(health));
+ send(sender, "&aSet health for &6%s&a to &6%s", entity.getName(), String.valueOf(health));
} else {
send(sender, "&aSet health to &6%s", String.valueOf(health));
}
diff --git a/src/main/java/net/serble/estools/Commands/SetHunger.java b/src/main/java/net/serble/estools/Commands/SetHunger.java
index d358956..28da151 100644
--- a/src/main/java/net/serble/estools/Commands/SetHunger.java
+++ b/src/main/java/net/serble/estools/Commands/SetHunger.java
@@ -2,21 +2,20 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.PlayerCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class SetHunger extends PlayerCommand {
private static final String usage = genUsage("/sethunger [player]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, usage);
return false;
}
- Player p;
+ EsPlayer p;
int hunger;
if (args.length > 1) {
@@ -30,7 +29,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- p = (Player)sender;
+ p = (EsPlayer)sender;
}
try {
diff --git a/src/main/java/net/serble/estools/Commands/SetMaxHealth.java b/src/main/java/net/serble/estools/Commands/SetMaxHealth.java
index 9a740e4..aea70d3 100644
--- a/src/main/java/net/serble/estools/Commands/SetMaxHealth.java
+++ b/src/main/java/net/serble/estools/Commands/SetMaxHealth.java
@@ -1,15 +1,14 @@
package net.serble.estools.Commands;
import net.serble.estools.EntityCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.LivingEntity;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
public class SetMaxHealth extends EntityCommand {
private static final String usage = genUsage("/setmaxhealth [entity]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, usage);
}
@@ -22,7 +21,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- LivingEntity entity;
+ EsLivingEntity entity;
if (args.length > 1) {
entity = getEntity(sender, args[1]);
@@ -30,18 +29,18 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- send(sender, "&aSet max health for &6%s&a to &6%s", getEntityName(entity), String.valueOf(health));
+ send(sender, "&aSet max health for &6%s&a to &6%s", entity.getName(), String.valueOf(health));
} else {
if (isNotEntity(sender)) {
return false;
}
- entity = (LivingEntity) sender;
+ entity = (EsLivingEntity) sender;
send(sender, "&aSet max health to &6%s", String.valueOf(health));
}
- setMaxHealth(entity, health);
+ entity.setMaxHealth(health);
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/SetPersistentData.java b/src/main/java/net/serble/estools/Commands/SetPersistentData.java
index 468ef94..8c2af43 100644
--- a/src/main/java/net/serble/estools/Commands/SetPersistentData.java
+++ b/src/main/java/net/serble/estools/Commands/SetPersistentData.java
@@ -1,14 +1,8 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.NamespacedKey;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-import org.bukkit.persistence.PersistentDataContainer;
-import org.bukkit.persistence.PersistentDataType;
+import net.serble.estools.ServerApi.EsPersistentDataType;
+import net.serble.estools.ServerApi.Interfaces.*;
import java.util.ArrayList;
import java.util.List;
@@ -17,7 +11,7 @@ public class SetPersistentData extends EsToolsCommand {
public static final String usage = genUsage("/setpersistentdata ");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender))
return false;
@@ -26,7 +20,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return true;
}
- String keyString = args[0].toLowerCase();
+ String key = args[0].toLowerCase();
String typeString = args[1].toLowerCase();
String valueString;
@@ -40,21 +34,21 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
valueString = valueBuilder.toString();
}
- ItemStack item = getMainHand((Player) sender);
- NamespacedKey key = GetPersistentData.getNamespacedKey(keyString);
+ EsItemStack item = ((EsPlayer) sender).getMainHand();
+// NamespacedKey key = GetPersistentData.getNamespacedKey(key);
+//
+// if (key == null) {
+// send(sender, "&cInvalid key! examples: 'estools:count', 'backpacks:size', etc");
+// return false;
+// }
- if (key == null) {
- send(sender, "&cInvalid key! examples: 'estools:count', 'backpacks:size', etc");
- return false;
- }
-
- ItemMeta meta = item.getItemMeta();
+ EsItemMeta meta = item.getItemMeta();
if (meta == null) {
send(sender, "&cItem does not have nbt tags!");
return false;
}
- PersistentDataContainer data = meta.getPersistentDataContainer();
+ EsPersistentDataContainer data = meta.getPersistentDataContainer();
int code = setNbt(typeString, key, data, valueString);
if (code == 1) {
@@ -74,15 +68,15 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
}
// 0 = success, 1 = unsupported, 2 = invalid value
- public static int setNbt(String type, NamespacedKey key, PersistentDataContainer data, String value) {
+ public static int setNbt(String type, String key, EsPersistentDataContainer data, String value) {
switch (type) {
case "string":
- data.set(key, PersistentDataType.STRING, value);
+ data.set(key, EsPersistentDataType.String, value);
break;
case "integer":
try {
- data.set(key, PersistentDataType.INTEGER, Integer.parseInt(value));
+ data.set(key, EsPersistentDataType.Integer, Integer.parseInt(value));
}
catch (NumberFormatException e) {
return 2;
@@ -91,7 +85,7 @@ public static int setNbt(String type, NamespacedKey key, PersistentDataContainer
case "double":
try {
- data.set(key, PersistentDataType.DOUBLE, Double.parseDouble(value));
+ data.set(key, EsPersistentDataType.Double, Double.parseDouble(value));
}
catch (NumberFormatException e) {
return 2;
@@ -100,7 +94,7 @@ public static int setNbt(String type, NamespacedKey key, PersistentDataContainer
case "float":
try {
- data.set(key, PersistentDataType.FLOAT, Float.parseFloat(value));
+ data.set(key, EsPersistentDataType.Float, Float.parseFloat(value));
}
catch (NumberFormatException e) {
return 2;
@@ -109,7 +103,7 @@ public static int setNbt(String type, NamespacedKey key, PersistentDataContainer
case "long":
try {
- data.set(key, PersistentDataType.LONG, Long.parseLong(value));
+ data.set(key, EsPersistentDataType.Long, Long.parseLong(value));
}
catch (NumberFormatException e) {
return 2;
@@ -118,7 +112,7 @@ public static int setNbt(String type, NamespacedKey key, PersistentDataContainer
case "short":
try {
- data.set(key, PersistentDataType.SHORT, Short.parseShort(value));
+ data.set(key, EsPersistentDataType.Short, Short.parseShort(value));
}
catch (NumberFormatException e) {
return 2;
@@ -127,7 +121,7 @@ public static int setNbt(String type, NamespacedKey key, PersistentDataContainer
case "byte":
try {
- data.set(key, PersistentDataType.BYTE, Byte.parseByte(value));
+ data.set(key, EsPersistentDataType.Byte, Byte.parseByte(value));
}
catch (NumberFormatException e) {
return 2;
@@ -147,7 +141,7 @@ public static int setNbt(String type, NamespacedKey key, PersistentDataContainer
}
}
- data.set(key, PersistentDataType.BYTE_ARRAY, bytes);
+ data.set(key, EsPersistentDataType.ByteArray, bytes);
break;
}
@@ -164,7 +158,7 @@ public static int setNbt(String type, NamespacedKey key, PersistentDataContainer
}
}
- data.set(key, PersistentDataType.INTEGER_ARRAY, ints);
+ data.set(key, EsPersistentDataType.IntArray, ints);
break;
}
@@ -181,7 +175,7 @@ public static int setNbt(String type, NamespacedKey key, PersistentDataContainer
}
}
- data.set(key, PersistentDataType.LONG_ARRAY, longs);
+ data.set(key, EsPersistentDataType.LongArray, longs);
break;
}
@@ -194,7 +188,7 @@ public static int setNbt(String type, NamespacedKey key, PersistentDataContainer
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
if (args.length == 2) {
diff --git a/src/main/java/net/serble/estools/Commands/SetSaturation.java b/src/main/java/net/serble/estools/Commands/SetSaturation.java
index fbc9f55..7408a70 100644
--- a/src/main/java/net/serble/estools/Commands/SetSaturation.java
+++ b/src/main/java/net/serble/estools/Commands/SetSaturation.java
@@ -2,21 +2,20 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.PlayerCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class SetSaturation extends PlayerCommand {
private static final String usage = genUsage("/setsaturation [player]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, usage);
return false;
}
- Player p;
+ EsPlayer p;
if (args.length > 1) {
p = EsToolsCommand.getPlayer(sender, args[1]);
@@ -28,7 +27,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- p = (Player)sender;
+ p = (EsPlayer) sender;
}
float saturation;
diff --git a/src/main/java/net/serble/estools/Commands/SetStack.java b/src/main/java/net/serble/estools/Commands/SetStack.java
index d1690ff..cd2b708 100644
--- a/src/main/java/net/serble/estools/Commands/SetStack.java
+++ b/src/main/java/net/serble/estools/Commands/SetStack.java
@@ -1,16 +1,15 @@
package net.serble.estools.Commands;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
import net.serble.estools.EsToolsCommand;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class SetStack extends EsToolsCommand {
private static final String usage = genUsage("/setstack ");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
@@ -28,7 +27,7 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- getMainHand(((Player)sender)).setAmount(amount);
+ ((EsPlayer)sender).getMainHand().setAmount(amount);
send(sender, "&aSet stack size to &6%d", amount);
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/SetUnbreakable.java b/src/main/java/net/serble/estools/Commands/SetUnbreakable.java
index 69cc8b8..9f49c2d 100644
--- a/src/main/java/net/serble/estools/Commands/SetUnbreakable.java
+++ b/src/main/java/net/serble/estools/Commands/SetUnbreakable.java
@@ -2,32 +2,33 @@
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
-import org.bukkit.Material;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
+import net.serble.estools.ServerApi.EsEnchantment;
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsItemMeta;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+import java.util.Objects;
public class SetUnbreakable extends EsToolsCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- ItemStack item = getMainHand((Player) sender);
- if (item == null || item.getType() == Material.AIR || (Main.majorVersion > 10 && item.getItemMeta() == null)) {
+ EsItemStack item = ((EsPlayer) sender).getMainHand();
+ if (item == null || Objects.equals(item.getType(), EsMaterial.createUnchecked("AIR")) || (Main.minecraftVersion.getMinor() > 10 && item.getItemMeta() == null)) {
send(sender, "&cMust be a damageable item");
return false;
}
String message = "&aSet item to &6Breakable!";
- if (Main.majorVersion > 10) {
- ItemMeta itemMeta = item.getItemMeta();
+ if (Main.minecraftVersion.getMinor() > 10) {
+ EsItemMeta itemMeta = item.getItemMeta();
itemMeta.setUnbreakable(!itemMeta.isUnbreakable());
item.setItemMeta(itemMeta);
@@ -35,10 +36,11 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
message = "&aSet item to &6Unbreakable!";
}
} else {
- if (item.getEnchantments().containsKey(Enchantment.DURABILITY)) {
- item.removeEnchantment(Enchantment.DURABILITY);
+ if (item.getEnchantments().keySet().stream()
+ .anyMatch(c -> c != null && c.getKey().equalsIgnoreCase("unbreaking"))) {
+ item.removeEnchantment(EsEnchantment.createUnchecked("unbreaking"));
} else {
- item.addUnsafeEnchantment(Enchantment.DURABILITY, 32767);
+ item.addEnchantment(EsEnchantment.createUnchecked("unbreaking"), 32767);
message = "&aSet item to &6Unbreakable!";
}
}
diff --git a/src/main/java/net/serble/estools/Commands/Smite.java b/src/main/java/net/serble/estools/Commands/Smite.java
index 4fc7a27..11fd29c 100644
--- a/src/main/java/net/serble/estools/Commands/Smite.java
+++ b/src/main/java/net/serble/estools/Commands/Smite.java
@@ -1,23 +1,21 @@
package net.serble.estools.Commands;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.LivingEntity;
-
import net.serble.estools.EntityCommand;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
public class Smite extends EntityCommand {
private static final String usage = genUsage("/smite [entity2] [entity3]...");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
send(sender, usage);
return false;
}
for (String arg : args) {
- LivingEntity target = getEntity(sender, arg);
+ EsLivingEntity target = getEntity(sender, arg);
if (target == null) {
return false;
diff --git a/src/main/java/net/serble/estools/Commands/Sudo.java b/src/main/java/net/serble/estools/Commands/Sudo.java
index ebbf79f..137bbc3 100644
--- a/src/main/java/net/serble/estools/Commands/Sudo.java
+++ b/src/main/java/net/serble/estools/Commands/Sudo.java
@@ -1,31 +1,29 @@
package net.serble.estools.Commands;
-import org.bukkit.Bukkit;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-
+import net.serble.estools.Main;
import net.serble.estools.PlayerCommand;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
public class Sudo extends PlayerCommand {
private static final String usage = genUsage("/sudo ");
@Override
- public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length < 2) {
send(sender, usage);
return false;
}
- Player p = getPlayer(sender, args[0]);
+ EsPlayer p = getPlayer(sender, args[0]);
if (p == null) {
return false;
}
String command = argsToString(args, 1);
-
- Bukkit.dispatchCommand(p, command);
+
+ Main.server.dispatchCommand(p, command);
send(sender, "&aExecuted command &6%s&a as &6%s", command, p.getName());
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/Suicide.java b/src/main/java/net/serble/estools/Commands/Suicide.java
index b4b7f46..8a3f076 100644
--- a/src/main/java/net/serble/estools/Commands/Suicide.java
+++ b/src/main/java/net/serble/estools/Commands/Suicide.java
@@ -1,22 +1,20 @@
package net.serble.estools.Commands;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.LivingEntity;
-
import net.serble.estools.PlayerCommand;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
public class Suicide extends PlayerCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- LivingEntity p = (LivingEntity) sender;
+ EsLivingEntity p = (EsLivingEntity) sender;
- setHealth(p, 0);
+ p.setHealth(0);
send(sender, "&aRest in peace");
return true;
}
diff --git a/src/main/java/net/serble/estools/Commands/Sun.java b/src/main/java/net/serble/estools/Commands/Sun.java
index 0e97077..510188c 100644
--- a/src/main/java/net/serble/estools/Commands/Sun.java
+++ b/src/main/java/net/serble/estools/Commands/Sun.java
@@ -1,21 +1,20 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.World;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+import net.serble.estools.ServerApi.Interfaces.EsWorld;
public class Sun extends EsToolsCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- World world = ((Player) sender).getWorld();
- world.setStorm(false);
+ EsWorld world = ((EsPlayer) sender).getWorld();
+ world.setStorming(false);
world.setThundering(false);
send(sender, "&aSet weather to &6clear");
diff --git a/src/main/java/net/serble/estools/Commands/Teleport/TpAll.java b/src/main/java/net/serble/estools/Commands/Teleport/TpAll.java
index b48bf03..d721fd0 100644
--- a/src/main/java/net/serble/estools/Commands/Teleport/TpAll.java
+++ b/src/main/java/net/serble/estools/Commands/Teleport/TpAll.java
@@ -1,19 +1,19 @@
package net.serble.estools.Commands.Teleport;
import net.serble.estools.EntityCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.LivingEntity;
+import net.serble.estools.Main;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
public class TpAll extends EntityCommand {
private static final String usage = genUsage("/tpall [entity]");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
- LivingEntity p;
+ public boolean execute(EsCommandSender sender, String[] args) {
+ EsLivingEntity p;
if (args.length == 0) {
- p = (LivingEntity) sender;
+ p = (EsLivingEntity) sender;
if (isNotEntity(sender, usage)) {
return false;
@@ -22,13 +22,13 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
p = getEntity(sender, args[0]);
}
- for (LivingEntity t : getOnlinePlayers()) {
+ for (EsLivingEntity t : Main.server.getOnlinePlayers()) {
assert p != null;
- t.teleport(p);
+ t.teleport(p.getLocation());
}
assert p != null;
- send(sender, "&aTeleported all players to &6%s", getEntityName(p));
+ send(sender, "&aTeleported all players to &6%s", p.getName());
return true;
}
}
diff --git a/src/main/java/net/serble/estools/Commands/Teleport/TpHere.java b/src/main/java/net/serble/estools/Commands/Teleport/TpHere.java
index df845c1..2ffed2d 100644
--- a/src/main/java/net/serble/estools/Commands/Teleport/TpHere.java
+++ b/src/main/java/net/serble/estools/Commands/Teleport/TpHere.java
@@ -1,15 +1,14 @@
package net.serble.estools.Commands.Teleport;
import net.serble.estools.EntityCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.LivingEntity;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
public class TpHere extends EntityCommand {
private static final String usage = genUsage("/tphere [entity2] [entity3]...");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotEntity(sender)) {
return false;
}
@@ -19,18 +18,18 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- LivingEntity p = (LivingEntity) sender;
+ EsLivingEntity p = (EsLivingEntity) sender;
for (String arg : args) {
- LivingEntity t = getEntity(sender, arg);
+ EsLivingEntity t = getEntity(sender, arg);
if (t != null) {
- t.teleport(p);
+ t.teleport(p.getLocation());
} else {
return false;
}
}
- send(sender, "&aTeleported &6%s&a to &6%s", argsToString(args, 0), getEntityName(p));
+ send(sender, "&aTeleported &6%s&a to &6%s", argsToString(args, 0), p.getName());
return true;
}
}
diff --git a/src/main/java/net/serble/estools/Commands/Thunder.java b/src/main/java/net/serble/estools/Commands/Thunder.java
index 88920c7..05b514e 100644
--- a/src/main/java/net/serble/estools/Commands/Thunder.java
+++ b/src/main/java/net/serble/estools/Commands/Thunder.java
@@ -1,21 +1,20 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.World;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+import net.serble.estools.ServerApi.Interfaces.EsWorld;
public class Thunder extends EsToolsCommand {
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- World world = ((Player) sender).getWorld();
- world.setStorm(true);
+ EsWorld world = ((EsPlayer) sender).getWorld();
+ world.setStorming(true);
world.setThundering(true);
send(sender, "&aSet weather to &6thunder");
diff --git a/src/main/java/net/serble/estools/Commands/Warps/Warp.java b/src/main/java/net/serble/estools/Commands/Warps/Warp.java
index 93b20f4..311ff75 100644
--- a/src/main/java/net/serble/estools/Commands/Warps/Warp.java
+++ b/src/main/java/net/serble/estools/Commands/Warps/Warp.java
@@ -1,9 +1,8 @@
package net.serble.estools.Commands.Warps;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
import java.util.List;
@@ -12,12 +11,12 @@ public class Warp extends EsToolsCommand {
private static final String usage = genUsage("/warp ");
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (isNotPlayer(sender)) {
return false;
}
- Player p = (Player)sender;
+ EsPlayer p = (EsPlayer) sender;
if (args.length == 0) {
send(p, usage);
@@ -37,22 +36,22 @@ public boolean onCommand(CommandSender sender, Command command, String label, St
return false;
}
- p.teleport(warp.location);
+ p.teleport(warp.getLocation());
send(p, "&aTeleported to warp &6%s&a.", warpName);
return true;
}
- private static boolean canUseWarp(Player p, WarpLocation warp) {
+ private static boolean canUseWarp(EsPlayer p, WarpLocation warp) {
if (warp == null) {
return false;
}
boolean hasManage = p.hasPermission("estools.warps.manage");
boolean hasDefault = p.hasPermission("estools.warps.default");
- String warpPermission = "estools.warp." + warp.name;
+ String warpPermission = "estools.warp." + warp.getName();
// you can only use global warps if you are in the same world, or have manage permission
- if (!warp.global && !hasManage && !p.getWorld().equals(warp.location.getWorld())) {
+ if (!warp.isGlobal() && !hasManage && !p.getWorld().equals(warp.getLocation().getWorld())) {
return false;
}
@@ -62,17 +61,17 @@ private static boolean canUseWarp(Player p, WarpLocation warp) {
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
- Player p = (Player)sender;
+ EsPlayer p = (EsPlayer)sender;
if (args.length == 1) {
for (WarpLocation warp : WarpManager.warps.values()) {
- boolean inSameWorld = p.getWorld().equals(warp.location.getWorld());
+ boolean inSameWorld = p.getWorld().equals(warp.getLocation().getWorld());
- if (canUseWarp(p, warp) && (warp.global || inSameWorld)) {
- tab.add(warp.name);
+ if (canUseWarp(p, warp) && (warp.isGlobal() || inSameWorld)) {
+ tab.add(warp.getName());
}
}
}
diff --git a/src/main/java/net/serble/estools/Commands/Warps/WarpLocation.java b/src/main/java/net/serble/estools/Commands/Warps/WarpLocation.java
index eb7ce60..8768997 100644
--- a/src/main/java/net/serble/estools/Commands/Warps/WarpLocation.java
+++ b/src/main/java/net/serble/estools/Commands/Warps/WarpLocation.java
@@ -1,37 +1,33 @@
package net.serble.estools.Commands.Warps;
-import org.bukkit.Location;
-import org.bukkit.configuration.serialization.ConfigurationSerializable;
-import org.bukkit.configuration.serialization.SerializableAs;
+import net.serble.estools.ServerApi.EsLocation;
-import java.util.Map;
-import java.util.HashMap;
+public class WarpLocation {
+ private EsLocation location;
+ private String name;
+ private boolean global;
-@SerializableAs("WarpLocation")
-public class WarpLocation implements ConfigurationSerializable {
- public Location location;
- public String name;
- public boolean global;
-
- @Override
- public Map serialize() {
- Map result = new HashMap<>();
+ public String getName() {
+ return name;
+ }
- result.put("location", location);
- result.put("name", name);
- result.put("global", global);
+ public EsLocation getLocation() {
+ return location;
+ }
- return result;
+ public boolean isGlobal() {
+ return global;
}
- @SuppressWarnings("unused")
- public static WarpLocation deserialize(Map args) {
- WarpLocation warp = new WarpLocation();
+ public void setLocation(EsLocation location) {
+ this.location = location;
+ }
- warp.location = (Location)args.get("location");
- warp.name = (String)args.get("name");
- warp.global = (boolean)args.get("global");
+ public void setGlobal(boolean global) {
+ this.global = global;
+ }
- return warp;
+ public void setName(String name) {
+ this.name = name;
}
}
diff --git a/src/main/java/net/serble/estools/Commands/Warps/WarpManager.java b/src/main/java/net/serble/estools/Commands/Warps/WarpManager.java
index 42d6a67..b9e329e 100644
--- a/src/main/java/net/serble/estools/Commands/Warps/WarpManager.java
+++ b/src/main/java/net/serble/estools/Commands/Warps/WarpManager.java
@@ -1,18 +1,15 @@
package net.serble.estools.Commands.Warps;
import net.serble.estools.EsToolsCommand;
-import net.serble.estools.ConfigManager;
-import org.bukkit.Location;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.configuration.serialization.ConfigurationSerialization;
-import org.bukkit.entity.Player;
+import net.serble.estools.Config.ConfigManager;
+import net.serble.estools.ServerApi.EsLocation;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.Map;
// this command is /warps
public class WarpManager extends EsToolsCommand {
@@ -23,48 +20,19 @@ public class WarpManager extends EsToolsCommand {
private static final String consoleUsage = genUsage("/warps list");
- public static final HashMap warps = new HashMap<>();
+ public static Map warps = new HashMap<>();
+ @SuppressWarnings("unchecked")
@Override
public void onEnable() {
- ConfigurationSerialization.registerClass(WarpLocation.class, "WarpLocation");
-
- FileConfiguration f = ConfigManager.load("warps.yml");
-
- List> warpList = f.getList("warps");
- if (warpList == null) {
- return;
- }
-
- warpList.sort((w1, w2) -> {
- if (w1 instanceof WarpLocation && w2 instanceof WarpLocation) {
- WarpLocation warp1 = (WarpLocation)w1;
- WarpLocation warp2 = (WarpLocation)w1;
-
- return warp1.name.compareTo(warp2.name);
- }
-
- return 0;
- });
-
- warpList.forEach(w -> {
- if (w instanceof WarpLocation) {
- WarpLocation warp = (WarpLocation)w;
- warps.put(warp.name, warp);
- }
- });
+ warps = ConfigManager.load("warps.yml", HashMap.class, WarpLocation.class);
}
private static void saveWarps() {
- FileConfiguration f = new YamlConfiguration();
-
- List warpList = new ArrayList<>(warps.values());
- f.set("warps", warpList);
-
- ConfigManager.save("warps.yml", f);
+ ConfigManager.save("warps.yml", warps);
}
- public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
if (isNotPlayer(sender, consoleUsage)) {
return false;
@@ -86,8 +54,8 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
for (WarpLocation warp : warps.values()) {
warpList.append(translate("\n&6%s &aat &6%s &ain &6%s &ais &6%s",
- warp.name, locationToString(warp.location),
- warp.location.getWorld().getName(), warp.global ? "global" : "local"));
+ warp.getName(), locationToString(warp.getLocation()),
+ warp.getLocation().getWorld().getName(), warp.isGlobal() ? "global" : "local"));
}
send(sender, warpList.toString());
@@ -138,11 +106,11 @@ warp.name, locationToString(warp.location),
switch (args[0].toLowerCase()) {
case "add": {
if (warp != null) {
- send(sender, "&cWarp does not exist, please use add to create it.");
+ send(sender, "&cWarp already exists.");
return false;
}
- if (createWarp((Player)sender, warpName, args, global)) {
+ if (createWarp((EsPlayer)sender, warpName, args, global)) {
return false;
}
@@ -156,7 +124,7 @@ warp.name, locationToString(warp.location),
return false;
}
- if (createWarp((Player)sender, warpName, args, global)) {
+ if (createWarp((EsPlayer)sender, warpName, args, global)) {
return false;
}
@@ -172,10 +140,10 @@ warp.name, locationToString(warp.location),
}
// returns true if failed
- private static boolean createWarp(Player p, String warpName, String[] args, boolean global) {
+ private static boolean createWarp(EsPlayer p, String warpName, String[] args, boolean global) {
// /warps [LOCAL/global] [x] [y] [z] [yaw] [pitch]
- Location loc;
+ EsLocation loc;
if (args.length <= 3) {
loc = p.getLocation();
}
@@ -184,7 +152,7 @@ else if (args.length < 6) { // if you supplied only some of the coordinates, wha
return true;
}
else {
- loc = new Location(p.getWorld(),
+ loc = new EsLocation(p.getWorld(),
parseCoordinate(args[3], p.getLocation().getX()),
parseCoordinate(args[4], p.getLocation().getY()),
parseCoordinate(args[5], p.getLocation().getZ())
@@ -210,9 +178,9 @@ else if (args.length < 6) { // if you supplied only some of the coordinates, wha
}
WarpLocation warp = new WarpLocation();
- warp.location = loc;
- warp.global = global;
- warp.name = warpName;
+ warp.setLocation(loc);
+ warp.setGlobal(global);
+ warp.setName(warpName);
warps.put(warpName, warp);
saveWarps();
@@ -221,7 +189,7 @@ else if (args.length < 6) { // if you supplied only some of the coordinates, wha
}
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
// /warps [LOCAL/global] [x] [y] [z] [yaw] [pitch]
// /warps remove
diff --git a/src/main/java/net/serble/estools/Commands/WrongVersion.java b/src/main/java/net/serble/estools/Commands/WrongVersion.java
index e3665e8..f11dc39 100644
--- a/src/main/java/net/serble/estools/Commands/WrongVersion.java
+++ b/src/main/java/net/serble/estools/Commands/WrongVersion.java
@@ -1,8 +1,7 @@
package net.serble.estools.Commands;
import net.serble.estools.EsToolsCommand;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
public class WrongVersion extends EsToolsCommand {
private final String minVersion;
@@ -16,7 +15,7 @@ public WrongVersion(String ver) {
}
@Override
- public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
+ public boolean execute(EsCommandSender sender, String[] args) {
send(sender, "&cThis command requires Minecraft to be at least 1.%s", minVersion);
return true;
}
diff --git a/src/main/java/net/serble/estools/Config/ConfigManager.java b/src/main/java/net/serble/estools/Config/ConfigManager.java
new file mode 100644
index 0000000..18552fd
--- /dev/null
+++ b/src/main/java/net/serble/estools/Config/ConfigManager.java
@@ -0,0 +1,94 @@
+package net.serble.estools.Config;
+
+import java.io.*;
+import java.util.Arrays;
+
+import net.serble.estools.Main;
+import org.jetbrains.annotations.NotNull;
+import org.yaml.snakeyaml.LoaderOptions;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+import org.yaml.snakeyaml.inspector.TagInspector;
+
+public class ConfigManager {
+
+ @SuppressWarnings("rawtypes")
+ public static T load(String fileName, Class extends T> base, Class... allowedClasses) {
+ String[] cs = new String[allowedClasses.length];
+ for (int i = 0; i < cs.length; i++) {
+ cs[i] = allowedClasses[i].getName();
+ }
+ File file = new File(Main.server.getDataFolder(), fileName);
+ return load(file, base, cs);
+ }
+
+ public static T load(String fileName, Class extends T> base, String... allowedClasses) {
+ File file = new File(Main.server.getDataFolder(), fileName);
+ return load(file, base, allowedClasses);
+ }
+
+ // Exists so the above 2 don't make ambig reference when array is not supplied
+ public static T load(String fileName, Class extends T> base) {
+ File file = new File(Main.server.getDataFolder(), fileName);
+ return load(file, base);
+ }
+
+ public static T load(File configFile, Class extends T> base, String... allowedClasses) {
+ if (!configFile.exists()) {
+ // Save a default version
+ try {
+ Object instance = base.newInstance();
+ save(configFile, instance);
+ } catch (IllegalAccessException | InstantiationException e) {
+ Main.logger.severe("Failed to save default config, this is a bug");
+ throw new RuntimeException("Bug with saving default config: " + e);
+ }
+ }
+
+ Yaml yaml = createYamlLoader(base, allowedClasses);
+ try {
+ return yaml.load(new FileInputStream(configFile));
+ } catch (FileNotFoundException e) {
+ Main.logger.severe("Impossible situation reached, files that we created don't exist");
+ throw new RuntimeException("Impossible");
+ }
+ }
+
+ private static @NotNull Yaml createYamlLoader(Class extends T> base, String[] allowedClasses) {
+ LoaderOptions options = new LoaderOptions();
+ TagInspector taginspector = tag ->
+ tag.getClassName().equals(base.getName()) ||
+ Arrays.stream(allowedClasses).anyMatch(c -> c.equals(tag.getClassName())) ||
+ Arrays.stream(Main.server.getRelevantInternalTypes()).anyMatch(c -> tag.getClassName().endsWith(c) ||
+ tag.getClassName().startsWith("net.serble.estools.ServerApi")); // Allow all server api classes (Stuff like EsMaterial)
+ options.setTagInspector(taginspector);
+ return new Yaml(new Constructor(base, options));
+ }
+
+ public static void save(String file, Object obj) {
+ File configFile = new File(Main.server.getDataFolder(), file);
+ save(configFile, obj);
+ }
+
+ @SuppressWarnings("ResultOfMethodCallIgnored")
+ public static void save(File configFile, Object obj) {
+ if (!configFile.exists()) {
+ configFile.getParentFile().mkdirs();
+ try {
+ configFile.createNewFile();
+ } catch (IOException e) {
+ Main.logger.warning("Failed to create config file: " + e);
+ }
+ }
+
+ Yaml yaml = new Yaml();
+ String contents = yaml.dump(obj);
+ try {
+ FileWriter writer = new FileWriter(configFile);
+ writer.write(contents);
+ writer.close();
+ } catch (IOException e) {
+ Main.logger.severe("Failed to save config file: " + e);
+ }
+ }
+}
diff --git a/src/main/java/net/serble/estools/Config/Schemas/GeneralConfig/EsToolsConfig.java b/src/main/java/net/serble/estools/Config/Schemas/GeneralConfig/EsToolsConfig.java
new file mode 100644
index 0000000..205eb83
--- /dev/null
+++ b/src/main/java/net/serble/estools/Config/Schemas/GeneralConfig/EsToolsConfig.java
@@ -0,0 +1,32 @@
+package net.serble.estools.Config.Schemas.GeneralConfig;
+
+@SuppressWarnings("unused") // SnakeYAML needs the setters
+public class EsToolsConfig {
+ private boolean safeTp = false;
+ private boolean metrics = true;
+ private UpdaterConfig updater = new UpdaterConfig();
+
+ public boolean isSafeTp() {
+ return safeTp;
+ }
+
+ public void setSafeTp(boolean safeTp) {
+ this.safeTp = safeTp;
+ }
+
+ public boolean isMetrics() {
+ return metrics;
+ }
+
+ public void setMetrics(boolean metrics) {
+ this.metrics = metrics;
+ }
+
+ public UpdaterConfig getUpdater() {
+ return updater;
+ }
+
+ public void setUpdater(UpdaterConfig updater) {
+ this.updater = updater;
+ }
+}
diff --git a/src/main/java/net/serble/estools/Config/Schemas/GeneralConfig/UpdaterConfig.java b/src/main/java/net/serble/estools/Config/Schemas/GeneralConfig/UpdaterConfig.java
new file mode 100644
index 0000000..5097183
--- /dev/null
+++ b/src/main/java/net/serble/estools/Config/Schemas/GeneralConfig/UpdaterConfig.java
@@ -0,0 +1,41 @@
+package net.serble.estools.Config.Schemas.GeneralConfig;
+
+@SuppressWarnings("unused") // SnakeYAML needs the setters
+public class UpdaterConfig {
+ private String githubReleasesUrl = "https://api.github.com/repos/CoPokBl/EsTools/releases/latest";
+ private boolean autoUpdate = false;
+ private boolean warnOnOutdated = false;
+ private boolean logOnOutdated = true;
+
+ public boolean isAutoUpdate() {
+ return autoUpdate;
+ }
+
+ public boolean isLogOnOutdated() {
+ return logOnOutdated;
+ }
+
+ public boolean isWarnOnOutdated() {
+ return warnOnOutdated;
+ }
+
+ public void setAutoUpdate(boolean autoUpdate) {
+ this.autoUpdate = autoUpdate;
+ }
+
+ public String getGithubReleasesUrl() {
+ return githubReleasesUrl;
+ }
+
+ public void setGithubReleasesUrl(String githubReleasesUrl) {
+ this.githubReleasesUrl = githubReleasesUrl;
+ }
+
+ public void setLogOnOutdated(boolean logOnOutdated) {
+ this.logOnOutdated = logOnOutdated;
+ }
+
+ public void setWarnOnOutdated(boolean warnOnOutdated) {
+ this.warnOnOutdated = warnOnOutdated;
+ }
+}
diff --git a/src/main/java/net/serble/estools/Config/Schemas/Give/GiveConfig.java b/src/main/java/net/serble/estools/Config/Schemas/Give/GiveConfig.java
new file mode 100644
index 0000000..da31169
--- /dev/null
+++ b/src/main/java/net/serble/estools/Config/Schemas/Give/GiveConfig.java
@@ -0,0 +1,43 @@
+package net.serble.estools.Config.Schemas.Give;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@SuppressWarnings("unused") // SnakeYAML needs the setters
+public class GiveConfig {
+ private GiveSettings settings = new GiveSettings();
+ private Map items = new HashMap() {{
+ put("boat", "oak_boat");
+ put("pearl", "ender_pearl");
+ put("sign", "oak_sign");
+ put("button", "stone_button");
+ put("sapling", "oak_sapling");
+ put("log", "oak_log");
+ put("door", "oak_door");
+ put("fence", "oak_fence");
+ put("fence_gate", "oak_fence_gate");
+ put("leaves", "oak_leaves");
+ put("planks", "oak_planks");
+ put("pressure_plate", "stone_pressure_plate");
+ put("trapdoor", "oak_trapdoor");
+ put("steak", "cooked_beef");
+ put("water", "water_bucket");
+ put("lava", "lava_bucket");
+ }};
+
+ public GiveSettings getSettings() {
+ return settings;
+ }
+
+ public void setSettings(GiveSettings settings) {
+ this.settings = settings;
+ }
+
+ public Map getItems() {
+ return items;
+ }
+
+ public void setItems(Map items) {
+ this.items = items;
+ }
+}
diff --git a/src/main/java/net/serble/estools/Config/Schemas/Give/GiveSettings.java b/src/main/java/net/serble/estools/Config/Schemas/Give/GiveSettings.java
new file mode 100644
index 0000000..54b3bee
--- /dev/null
+++ b/src/main/java/net/serble/estools/Config/Schemas/Give/GiveSettings.java
@@ -0,0 +1,23 @@
+package net.serble.estools.Config.Schemas.Give;
+
+@SuppressWarnings("unused") // SnakeYAML needs the setters
+public class GiveSettings {
+ private boolean addWithoutUnderscores = true;
+ private boolean removeWithUnderscores = false;
+
+ public boolean isAddWithoutUnderscores() {
+ return addWithoutUnderscores;
+ }
+
+ public boolean isRemoveWithUnderscores() {
+ return removeWithUnderscores;
+ }
+
+ public void setAddWithoutUnderscores(boolean addWithoutUnderscores) {
+ this.addWithoutUnderscores = addWithoutUnderscores;
+ }
+
+ public void setRemoveWithUnderscores(boolean removeWithUnderscores) {
+ this.removeWithUnderscores = removeWithUnderscores;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ConfigManager.java b/src/main/java/net/serble/estools/ConfigManager.java
deleted file mode 100644
index af3acbf..0000000
--- a/src/main/java/net/serble/estools/ConfigManager.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package net.serble.estools;
-
-import java.io.*;
-import java.util.Set;
-
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.configuration.InvalidConfigurationException;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-
-public class ConfigManager {
-
- public static final Main plugin = Main.plugin;
-
- public static FileConfiguration load(String fileName) {
- return load(new File(plugin.getDataFolder(), fileName));
- }
-
- @SuppressWarnings("ResultOfMethodCallIgnored")
- public static FileConfiguration load(File configFile) {
- if (!configFile.exists()) {
- configFile.getParentFile().mkdirs();
- try {
- configFile.createNewFile();
- } catch (IOException e) {
- Bukkit.getLogger().warning("Failed to create config file: " + e);
- }
- }
-
- FileConfiguration config = new YamlConfiguration();
- try {
- config.load(configFile);
- } catch (IOException | InvalidConfigurationException | IllegalArgumentException e) {
- Bukkit.getLogger().severe("Failed to read config file: " + e);
- }
-
- return config;
- }
-
- @SuppressWarnings("ResultOfMethodCallIgnored")
- public static void save(String file, FileConfiguration config) {
- File configFile = new File(plugin.getDataFolder(), file);
- if (!configFile.exists()) {
- configFile.getParentFile().mkdirs();
- try {
- configFile.createNewFile();
- } catch (IOException e) {
- Bukkit.getLogger().warning("Failed to create config file: " + e);
- }
- }
-
- try {
- config.save(configFile);
- } catch (IOException e) {
- Bukkit.getLogger().severe("Failed to save config file: " + e);
- }
- }
-
- // Make sure to save the file after you run this, we don't do that automatically
- public static boolean patchDefaults(FileConfiguration config, FileConfiguration defaults) {
- return patchDefaults("", config, defaults);
- }
-
- // Patch a section, needed because we must recursively traverse the key hierarchy
- private static boolean patchDefaults(String path, FileConfiguration config, FileConfiguration defaults) {
- Main.asrt(path != null);
- Main.asrt(config != null);
- Main.asrt(defaults != null);
-
- boolean changedAnything = false;
-
- ConfigurationSection section = defaults.getConfigurationSection(path);
- if (section == null) {
- if (!config.contains(path)) {
- config.set(path, defaults.get(path));
- changedAnything = true;
- }
- } else {
- Set keys = section.getKeys(false);
- for (String key : keys) {
- String updatedPath = path.isEmpty() ? key : path + "." + key;
- changedAnything = patchDefaults(updatedPath, config, defaults) || changedAnything;
- }
- }
-
- return changedAnything;
- }
-
- public static boolean patchDefaults(FileConfiguration config, InputStream defaultsRes) {
- InputStreamReader reader = new InputStreamReader(defaultsRes);
- FileConfiguration defaults = new YamlConfiguration();
- String fileContents;
- try {
- StringBuilder contentsBuilder = new StringBuilder();
- BufferedReader bufferedReader = new BufferedReader(reader);
-
- String line;
- while ((line = bufferedReader.readLine()) != null) {
- contentsBuilder.append(line).append("\n");
- }
-
- bufferedReader.close();
- fileContents = contentsBuilder.toString();
- defaults.loadFromString(fileContents);
- } catch (IOException | InvalidConfigurationException e) {
- Bukkit.getLogger().severe("Could not load default config file, there is a good chance this is bug with EsTools");
- return false;
- }
-
- return patchDefaults(config, defaults);
- }
-}
diff --git a/src/main/java/net/serble/estools/Effects.java b/src/main/java/net/serble/estools/Effects.java
deleted file mode 100644
index 6bb0915..0000000
--- a/src/main/java/net/serble/estools/Effects.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package net.serble.estools;
-
-import org.bukkit.potion.PotionEffectType;
-import org.bukkit.potion.PotionType;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-@SuppressWarnings("deprecation")
-public class Effects {
- private static final Map EFFECTS = new HashMap<>();
- private static final Map POTIONS = new HashMap<>();
-
- public static PotionEffectType getByName(String name) {
- return EFFECTS.get(name.toLowerCase(Locale.ENGLISH));
- }
-
- public static PotionType getPotionByName(String name) {
- return POTIONS.get(name.toLowerCase(Locale.ENGLISH));
- }
-
- public static String getName(PotionEffectType effect) {
- for (Map.Entry a : EFFECTS.entrySet()) {
- if (a.getValue().equals(effect)) {
- return a.getKey();
- }
- }
-
- return "invalid";
- }
-
- public static Set> entrySet() {
- return EFFECTS.entrySet();
- }
-
- public static Set> potionEntrySet() {
- return POTIONS.entrySet();
- }
-
- static {
- if (Main.majorVersion <= 8) { // 1.8 only potions be funky
- POTIONS.put("regeneration", PotionType.REGEN);
- POTIONS.put("speed", PotionType.SPEED);
- POTIONS.put("fire_resistance", PotionType.FIRE_RESISTANCE);
- POTIONS.put("poison", PotionType.POISON);
- POTIONS.put("instant_health", PotionType.INSTANT_HEAL);
- POTIONS.put("weakness", PotionType.WEAKNESS);
- POTIONS.put("strength", PotionType.STRENGTH);
- POTIONS.put("slowness", PotionType.SLOWNESS);
- POTIONS.put("instant_damage", PotionType.INSTANT_DAMAGE);
-
- if (Main.majorVersion >= 4 && Main.minorVersion >= 2) { // Night vision was added in 1.4.2
- POTIONS.put("night_vision", PotionType.NIGHT_VISION);
- POTIONS.put("invisibility", PotionType.INVISIBILITY);
- }
-
- if (Main.majorVersion >= 7 && Main.minorVersion >= 2) { // 1.7.2
- POTIONS.put("water_breathing", PotionType.WATER);
- }
-
- if (Main.majorVersion >= 8) { // 1.8
- POTIONS.put("jump_boost", PotionType.JUMP);
- }
- }
-
- HashMap nameReplacers = new HashMap() {{
- put("confusion", "nausea");
- put("damage_resistance", "resistance");
- put("fast_digging", "haste");
- put("harm", "instant_damage");
- put("heal", "instant_health");
- put("increase_damage", "strength");
- put("slow", "slowness");
- put("slow_digging", "mining_fatigue");
- put("jump", "jump_boost");
- }};
-
- for (PotionEffectType p : PotionEffectType.values()) {
- if (p == null) { // 1.1 has null values in here...
- continue;
- }
-
- String name = p.getName().toLowerCase(Locale.ENGLISH);
-
- if (nameReplacers.containsKey(name)) {
- name = nameReplacers.get(name);
- }
-
- EFFECTS.put(name, p);
- }
- }
-}
diff --git a/src/main/java/net/serble/estools/Enchantments.java b/src/main/java/net/serble/estools/Enchantments.java
deleted file mode 100644
index bdae7df..0000000
--- a/src/main/java/net/serble/estools/Enchantments.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package net.serble.estools;
-
-import org.bukkit.enchantments.Enchantment;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-// This class exists because the registry doesn't exist pre 1.13, so all the enchantments names have to be hardcoded.
-// only enchantments before 1.13 need to be here because this class isn't used past 1.13
-public class Enchantments {
- private static final Map ENCHANTMENTS = new HashMap<>();
-
- public static Enchantment getByName(String name) {
- return ENCHANTMENTS.get(name.toLowerCase(Locale.ENGLISH));
- }
-
- public static Set> entrySet() {
- return ENCHANTMENTS.entrySet();
- }
-
- static { AddEnchants(); }
-
- private static void AddEnchants() {
- ENCHANTMENTS.put("sharpness", Enchantment.DAMAGE_ALL);
- ENCHANTMENTS.put("baneofarthropods", Enchantment.DAMAGE_ARTHROPODS);
- ENCHANTMENTS.put("smite", Enchantment.DAMAGE_UNDEAD);
- ENCHANTMENTS.put("efficiency", Enchantment.DIG_SPEED);
- ENCHANTMENTS.put("unbreaking", Enchantment.DURABILITY);
- ENCHANTMENTS.put("fireaspect", Enchantment.FIRE_ASPECT);
- ENCHANTMENTS.put("knockback", Enchantment.KNOCKBACK);
- ENCHANTMENTS.put("looting", Enchantment.LOOT_BONUS_MOBS);
- ENCHANTMENTS.put("respiration", Enchantment.OXYGEN);
- ENCHANTMENTS.put("protection", Enchantment.PROTECTION_ENVIRONMENTAL);
- ENCHANTMENTS.put("blastprotect", Enchantment.PROTECTION_EXPLOSIONS);
- ENCHANTMENTS.put("featherfall", Enchantment.PROTECTION_FALL);
- ENCHANTMENTS.put("projectileprotection", Enchantment.PROTECTION_PROJECTILE);
- ENCHANTMENTS.put("silktouch", Enchantment.SILK_TOUCH);
- ENCHANTMENTS.put("aquaaffinity", Enchantment.WATER_WORKER);
- ENCHANTMENTS.put("flame", Enchantment.ARROW_FIRE);
- ENCHANTMENTS.put("power", Enchantment.ARROW_DAMAGE);
- ENCHANTMENTS.put("punch", Enchantment.ARROW_KNOCKBACK);
- ENCHANTMENTS.put("infinity", Enchantment.ARROW_INFINITE);
- ENCHANTMENTS.put("fortune", Enchantment.LOOT_BONUS_BLOCKS);
-
- if (Main.majorVersion <= 3) return;
- ENCHANTMENTS.put("thorns", Enchantment.THORNS);
-
- if (Main.majorVersion <= 6) return;
- ENCHANTMENTS.put("luck", Enchantment.LUCK);
- ENCHANTMENTS.put("lure", Enchantment.LURE);
-
- if (Main.majorVersion <= 7) return;
- ENCHANTMENTS.put("depthstrider", Enchantment.DEPTH_STRIDER);
-
- if (Main.majorVersion <= 8) return;
- ENCHANTMENTS.put("frostwalker", Enchantment.FROST_WALKER);
- ENCHANTMENTS.put("mending", Enchantment.MENDING);
-
- if (Main.majorVersion <= 10) return;
- ENCHANTMENTS.put("bindingcurse", Enchantment.BINDING_CURSE);
- ENCHANTMENTS.put("vanishingcurse", Enchantment.VANISHING_CURSE);
- ENCHANTMENTS.put("sweepingedge", Enchantment.SWEEPING_EDGE);
- }
-}
diff --git a/src/main/java/net/serble/estools/EntityCommand.java b/src/main/java/net/serble/estools/EntityCommand.java
index ceccabb..4d0c756 100644
--- a/src/main/java/net/serble/estools/EntityCommand.java
+++ b/src/main/java/net/serble/estools/EntityCommand.java
@@ -1,71 +1,56 @@
package net.serble.estools;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsEntity;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+import net.serble.estools.ServerApi.Position;
+
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-import org.bukkit.util.Vector;
-
public abstract class EntityCommand extends EsToolsCommand {
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
- if (sender instanceof Player) {
- Player p = (Player) sender;
+ if (sender instanceof EsPlayer) {
+ EsPlayer p = (EsPlayer) sender;
- List ens = p.getNearbyEntities(5, 5, 5);
+ List ens = p.getWorld().getNearbyEntities(p.getLocation(), 5, 5, 5);
- Entity en = getTarget(p, ens);
+ EsEntity en = getTarget(p, ens);
- if (en != null && !(en instanceof Player)) {
+ if (en != null && !(en instanceof EsPlayer)) {
String eu = en.getUniqueId().toString();
tab.add(eu);
}
}
- for (Player p : Bukkit.getOnlinePlayers()) {
+ for (EsPlayer p : Main.server.getOnlinePlayers()) {
tab.add(p.getName());
}
return tab;
}
- public static LivingEntity getEntity(CommandSender sender, String name) {
- Entity entity = getNonLivingEntity(sender, name);
- if (entity instanceof LivingEntity) return (LivingEntity) entity;
+ public static EsLivingEntity getEntity(EsCommandSender sender, String name) {
+ EsEntity entity = getNonLivingEntity(sender, name);
+ if (entity instanceof EsLivingEntity) return (EsLivingEntity) entity;
if (entity != null) {
send(sender, "&cPlayer/Entity not found.");
}
return null;
}
- public static Entity getNonLivingEntity(CommandSender sender, String name) {
- Entity p = Bukkit.getPlayer(name);
+ public static EsEntity getNonLivingEntity(EsCommandSender sender, String name) {
+ EsEntity p = Main.server.getPlayer(name);
if (p == null) {
try {
UUID uid = UUID.fromString(name);
-
- if (Main.majorVersion > 11) {
- p = Bukkit.getEntity(uid);
- } else {
- if (sender instanceof Player) {
- List entities = ((Player)sender).getWorld().getEntities();
-
- for (Entity e : entities) {
- if (e.getUniqueId().equals(uid)) {
- p = e;
- break;
- }
- }
- }
- }
+ p = Main.server.getEntity(uid);
if (p != null) {
return p;
@@ -78,39 +63,39 @@ public static Entity getNonLivingEntity(CommandSender sender, String name) {
return p;
}
- public static T getTarget(final Entity entity,
- final Iterable entities) {
+ public static T getTarget(final EsEntity entity,
+ final Iterable entities) {
if (entity == null)
return null;
T target = null;
final double threshold = 1;
for (final T other : entities) {
- final Vector n = other.getLocation().toVector()
- .subtract(entity.getLocation().toVector());
- if (entity.getLocation().getDirection().normalize().crossProduct(n)
+ final Position n = other.getLocation()
+ .subtract(entity.getLocation()).toPosition();
+ if (entity.getLocation().getDirection().normalise().crossProduct(n)
.lengthSquared() < threshold
- && n.normalize().dot(
- entity.getLocation().getDirection().normalize()) >= 0) {
+ && n.normalise().dot(
+ entity.getLocation().getDirection().normalise()) >= 0) {
if (target == null
|| target.getLocation().distanceSquared(
- entity.getLocation()) > other.getLocation()
- .distanceSquared(entity.getLocation()))
+ entity.getLocation().toPosition()) > other.getLocation()
+ .distanceSquared(entity.getLocation().toPosition()))
target = other;
}
}
return target;
}
- public static boolean isNotEntity(CommandSender sender, String usage, Object... a) {
- if (!(sender instanceof LivingEntity)) {
+ public static boolean isNotEntity(EsCommandSender sender, String usage, Object... a) {
+ if (!(sender instanceof EsLivingEntity)) {
send(sender, usage, a);
return true;
}
return false;
}
- public static boolean isNotEntity(CommandSender sender) {
- if (!(sender instanceof LivingEntity)) {
+ public static boolean isNotEntity(EsCommandSender sender) {
+ if (!(sender instanceof EsLivingEntity)) {
send(sender, "&cYou must be a player to run this command!");
return true;
}
diff --git a/src/main/java/net/serble/estools/Entrypoints/EsToolsBukkit.java b/src/main/java/net/serble/estools/Entrypoints/EsToolsBukkit.java
new file mode 100644
index 0000000..582b476
--- /dev/null
+++ b/src/main/java/net/serble/estools/Entrypoints/EsToolsBukkit.java
@@ -0,0 +1,46 @@
+package net.serble.estools.Entrypoints;
+
+import net.serble.estools.Main;
+import net.serble.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitEffectHelper;
+import net.serble.estools.ServerApi.ServerPlatform;
+import org.bukkit.plugin.java.JavaPlugin;
+
+/** This will be called for Bukkit and Folia platforms */
+public class EsToolsBukkit extends JavaPlugin {
+ /** Will be null if plugin is not Bukkit */
+ public static EsToolsBukkit plugin;
+
+ @Override
+ public void onEnable() {
+ // This is needed for SnakeYAML to work on Spigot, see https://www.spigotmc.org/threads/cannot-use-shaded-snakeyaml-to-construct-class-object.136707/#post-4329381
+ Thread.currentThread().setContextClassLoader(this.getClassLoader());
+
+ plugin = this;
+
+ ServerPlatform platform = isFolia() ? ServerPlatform.Folia : ServerPlatform.Bukkit;
+
+ Main main = new Main(platform, this);
+ main.enable();
+
+ // Init any Bukkit helpers that need it.
+ // It's best to do it here because Folia and Bukkit
+ // need it.
+ // This must come after Main.enable() so that mcVersion is set.
+ // It also only works on 1.1+
+ if (Main.minecraftVersion.isAtLeast(1, 1, 0)) {
+ BukkitEffectHelper.load();
+ }
+ }
+
+ @Override
+ public void onDisable() { /* Needed for older versions, which require an onDisable method */ }
+
+ private static boolean isFolia() {
+ try {
+ Class.forName("io.papermc.paper.threadedregions.RegionizedServer");
+ return true;
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+}
diff --git a/src/main/java/net/serble/estools/EsToolsCommand.java b/src/main/java/net/serble/estools/EsToolsCommand.java
index cb8e49d..9caaa54 100644
--- a/src/main/java/net/serble/estools/EsToolsCommand.java
+++ b/src/main/java/net/serble/estools/EsToolsCommand.java
@@ -1,26 +1,18 @@
package net.serble.estools;
-import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
-import org.bukkit.Location;
-import org.bukkit.attribute.Attribute;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandExecutor;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
+import net.serble.estools.ServerApi.EsLocation;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.*;
-public abstract class EsToolsCommand implements CommandExecutor, EsToolsTabCompleter {
+public abstract class EsToolsCommand implements EsToolsTabCompleter {
- public void onEnable() {}
+ public void onEnable() { }
@Override
- public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
- if (Main.majorVersion < 7) {
+ public List onTabComplete(EsCommandSender sender, String[] args) {
+ if (Main.minecraftVersion.getMinor() < 7) {
return new ArrayList<>();
}
@@ -35,12 +27,14 @@ public static List fixTabComplete(List inList, String arg) {
return inList;
}
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
return new ArrayList<>();
}
+
+ public abstract boolean execute(EsCommandSender sender, String[] args);
- public static void send(CommandSender s, String m, Object... a) {
- if (Main.majorVersion > 1) {
+ public static void send(EsCommandSender s, String m, Object... a) {
+ if (Main.minecraftVersion.getMinor() > 1) {
s.sendMessage(translate(m, a));
return;
}
@@ -53,30 +47,21 @@ public static void send(CommandSender s, String m, Object... a) {
}
}
- public static void send(Player s, String m, Object... a) {
- s.sendMessage(translate(m, a));
- }
-
public static String translate(String m, Object... a) {
- if (Main.majorVersion > 1) {
- return ChatColor.translateAlternateColorCodes('&', String.format(m, a));
- }
-
- // translateAlternateColorCodes doesn't exist in 1.1 and 1.0
- // do it manually
+ // This works for every Minecraft :)
return String.format(m, a).replace('&', '§');
}
- public static boolean isNotPlayer(CommandSender sender, String usage, Object... a) {
- if (!(sender instanceof Player)) {
+ public static boolean isNotPlayer(EsCommandSender sender, String usage, Object... a) {
+ if (!(sender instanceof EsPlayer)) {
send(sender, usage, a);
return true;
}
return false;
}
- public static boolean isNotPlayer(CommandSender sender) {
- if (!(sender instanceof Player)) {
+ public static boolean isNotPlayer(EsCommandSender sender) {
+ if (!(sender instanceof EsPlayer)) {
send(sender, "&cYou must be a player to run this command!");
return true;
}
@@ -100,11 +85,11 @@ public static double tryParseDouble(String obj, double defaultValue) {
}
// This is different from checkPerms because it doesn't display any messages
- public static boolean hasPerm(CommandSender sender, String perm) {
+ public static boolean hasPerm(EsCommandSender sender, String perm) {
return sender.hasPermission("estools." + perm);
}
- public static boolean checkPerms(CommandSender sender, String perm) {
+ public static boolean checkPerms(EsCommandSender sender, String perm) {
if (!sender.hasPermission("estools." + perm)) {
send(sender, "&cYou do not have permission to run this command.");
return true;
@@ -116,8 +101,8 @@ public static String genUsage(String use) {
return "&r&c&lUsage: &r&c" + use.replace("\n", "\n ");
}
- public static Player getPlayer(CommandSender sender, String name) {
- Player p = Bukkit.getPlayer(name);
+ public static EsPlayer getPlayer(EsCommandSender sender, String name) {
+ EsPlayer p = Main.server.getPlayer(name);
if (p == null) {
send(sender, "&cPlayer not found.");
@@ -158,127 +143,7 @@ public static double parseCoordinate(String coord, double playerLoc) {
return tryParseDouble(coord, 0);
}
- public static String locationToString(Location loc) {
+ public static String locationToString(EsLocation loc) {
return String.format("%d %d %d", Math.round(loc.getX()), Math.round(loc.getY()), Math.round(loc.getZ()));
}
-
- public static ItemStack getMainHand(Player p) {
- if (Main.majorVersion > 8) {
- return p.getInventory().getItemInMainHand();
- } else {
- //noinspection deprecation
- return p.getInventory().getItemInHand();
- }
- }
-
- public static void setMainHand(Player p, ItemStack is) {
- if (Main.majorVersion > 8) {
- p.getInventory().setItemInMainHand(is);
- } else {
- //noinspection deprecation
- p.getInventory().setItemInHand(is);
- }
- }
-
- public static double getMaxHealth(LivingEntity p) {
- if (Main.majorVersion > 8) {
- return Objects.requireNonNull(p.getAttribute(Attribute.GENERIC_MAX_HEALTH)).getValue();
- } else {
- if (Main.majorVersion > 5) {
- //noinspection deprecation
- return p.getMaxHealth();
- }
-
- try {
- return (double)(int)LivingEntity.class.getMethod("getMaxHealth").invoke(p);
- } catch(Exception e) {
- Bukkit.getLogger().severe(e.toString());
- return 20d;
- }
- }
- }
-
- public static void setMaxHealth(LivingEntity p, double value) {
- if (Main.majorVersion > 8) {
- Objects.requireNonNull(p.getAttribute(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(value);
- } else {
- if (Main.majorVersion > 5) {
- //noinspection deprecation
- p.setMaxHealth(value);
- return;
- }
-
- try {
- //noinspection JavaReflectionMemberAccess
- LivingEntity.class.getMethod("setMaxHealth", int.class).invoke(p, (int)value);
- }
- catch (Exception ex) {
- Bukkit.getLogger().severe(ex.toString());
- }
- }
- }
-
- public static double getHealth(LivingEntity p) {
- if (Main.majorVersion > 5) {
- return p.getHealth();
- }
-
- try {
- return (double)(int)LivingEntity.class.getMethod("getHealth").invoke(p);
- }
- catch (Exception ex) {
- Bukkit.getLogger().severe(ex.toString());
- return 20d;
- }
- }
-
- public static void setHealth(LivingEntity p, double value) {
- if (Main.majorVersion > 5) {
- p.setHealth(value);
- return;
- }
-
- try {
- //noinspection JavaReflectionMemberAccess
- LivingEntity.class.getMethod("setHealth", int.class).invoke(p, (int)value);
- }
- catch (Exception ex) {
- Bukkit.getLogger().severe(ex.toString());
- }
- }
-
- public static String getEntityName(Entity p) {
- if (Main.majorVersion > 7) {
- return p.getName();
- }
-
- if (p instanceof Player) {
- return ((Player)p).getDisplayName();
- }
-
- if (p instanceof LivingEntity) {
- String name = ((LivingEntity)p).getCustomName();
- if (name != null) {
- return name;
- }
- }
-
- return "Entity";
- }
-
- public static Collection extends Player> getOnlinePlayers() {
- try {
- if (Bukkit.class.getMethod("getOnlinePlayers").getReturnType() == Collection.class) {
- return Bukkit.getOnlinePlayers();
- }
- else {
- Player[] players = (Player[]) Bukkit.class.getMethod("getOnlinePlayers").invoke(null, new Object[0]);
- return Arrays.asList(players);
- }
-
- } catch (Exception e) {
- Bukkit.getLogger().severe(e.toString());
- return new ArrayList<>();
- }
- }
}
diff --git a/src/main/java/net/serble/estools/EsToolsTabCompleter.java b/src/main/java/net/serble/estools/EsToolsTabCompleter.java
index e539383..3347f05 100644
--- a/src/main/java/net/serble/estools/EsToolsTabCompleter.java
+++ b/src/main/java/net/serble/estools/EsToolsTabCompleter.java
@@ -1,15 +1,9 @@
package net.serble.estools;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.command.PluginCommand;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
import java.util.List;
public interface EsToolsTabCompleter {
- default void register(PluginCommand cmd) {
- cmd.setTabCompleter(TabCompleteGenerator.generate(this));
- }
-
- List onTabComplete(CommandSender sender, Command command, String alias, String[] args);
+ List onTabComplete(EsCommandSender sender, String[] args);
}
diff --git a/src/main/java/net/serble/estools/Main.java b/src/main/java/net/serble/estools/Main.java
index 473265b..78c44e7 100644
--- a/src/main/java/net/serble/estools/Main.java
+++ b/src/main/java/net/serble/estools/Main.java
@@ -8,76 +8,86 @@
import net.serble.estools.Commands.PowerPick.*;
import net.serble.estools.Commands.Teleport.*;
import net.serble.estools.Commands.Warps.*;
+import net.serble.estools.Config.ConfigManager;
+import net.serble.estools.Config.Schemas.GeneralConfig.EsToolsConfig;
+import net.serble.estools.Entrypoints.EsToolsBukkit;
+import net.serble.estools.ServerApi.EsEventListener;
+import net.serble.estools.ServerApi.EsGameMode;
+import net.serble.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitConfigMigrator;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.Interfaces.EsLogger;
+import net.serble.estools.ServerApi.Interfaces.EsServer;
+import net.serble.estools.ServerApi.ServerPlatform;
import net.serble.estools.Signs.SignMain;
import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie;
-import org.bukkit.Bukkit;
-import org.bukkit.command.PluginCommand;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.plugin.java.JavaPlugin;
import net.serble.estools.Commands.*;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
@SuppressWarnings("UnusedReturnValue")
-public class Main extends JavaPlugin {
+public class Main {
public static Main plugin;
- public static int majorVersion;
- public static int minorVersion;
+ public static ServerPlatform platform;
+ public static SemanticVersion minecraftVersion;
public static boolean tabCompleteEnabled = true;
- private static FileConfiguration config; // Get with overriden getConfig() method
- public static PluginVersion newVersion = null; // The version available to download
+ private static EsToolsConfig config; // Get with overriden getConfig() method
+ public static SemanticVersion newVersion = null; // The version available to download
public static boolean newVersionReady = false;
+ public static EsServer server;
+ public static EsLogger logger;
+ private final Object context;
+ private static final List eventListeners = new ArrayList<>();
+ private static final Map commands = new HashMap<>();
private static final int bStatsId = 21760;
-
- @Override
- public void onEnable() {
- plugin = this;
- try {
- Vault.setupEconomy();
- } catch (Exception e) {
- Bukkit.getLogger().warning("No Vault plugin found, please install vault for economy functionality.");
- }
+ public Main(ServerPlatform plat, Object context) {
+ platform = plat;
+ this.context = context;
+ }
- getVersion(); // Set the major and minor version variables
+ public void enable() {
+ plugin = this;
+ server = platform.getServerInstance(context);
+ logger = server.getLogger();
- // Create config if not exists, saveDefaultConfig() doesn't exist in 1.0
- File configFile = new File(plugin.getDataFolder(), "config.yml");
- if (!configFile.exists()) {
- saveResource("config.yml", false);
- }
- config = ConfigManager.load("config.yml");
+ minecraftVersion = server.getVersion();
+ server.initialise();
+ logger.info("Starting EsTools on platform: " + platform.name() + " (MC: " + minecraftVersion.toString() + ")");
- // Add keys that don't exist from the default config
- if (ConfigManager.patchDefaults(getConfig(), getResource("config.yml"))) {
- ConfigManager.save("config.yml", getConfig()); // Only save if something changed
+ if (platform == ServerPlatform.Bukkit) {
+ // We have to support old configs
+ BukkitConfigMigrator.checkPerformMigration();
}
+ // Load the config
+ config = ConfigManager.load("config.yml", EsToolsConfig.class);
+
// Metrics
- if (getConfig().getBoolean("metrics", true)) {
- Metrics metrics = new Metrics(this, bStatsId);
- metrics.addCustomChart(new SimplePie("vault_enabled", () -> String.valueOf(Vault.economy != null)));
- Bukkit.getLogger().info("Started bStat metrics");
+ if (config.isMetrics() && platform.supportsMetrics()) {
+ Metrics metrics = new Metrics(EsToolsBukkit.plugin, bStatsId);
+ metrics.addCustomChart(new SimplePie("vault_enabled", () -> "false"));
+ logger.info("Started bStat metrics");
} else {
- Bukkit.getLogger().info("Metrics are disabled");
+ logger.info("Metrics are disabled");
}
- if (majorVersion <= 2) {
- Bukkit.getLogger().info("Tab completion is not supported for versions 1.2 and below.");
+ if (minecraftVersion.getMinor() <= 2) {
+ logger.info("Tab completion is not supported for versions 1.2 and below.");
tabCompleteEnabled = false;
}
// Commands
- sc("gms", "gamemode.survival", new GameModeCommand("SURVIVAL"));
- sc("gmc", "gamemode.creative", new GameModeCommand("CREATIVE"));
- sc("gma", "gamemode.adventure", new GameModeCommand("ADVENTURE"), 3);
- sc("gmsp", "gamemode.spectator", new GameModeCommand("SPECTATOR"), 8);
+ sc("gms", "gamemode.survival", new GameModeCommand(EsGameMode.Survival, "gms"));
+ sc("gmc", "gamemode.creative", new GameModeCommand(EsGameMode.Creative, "gmc"));
+ sc("gma", "gamemode.adventure", new GameModeCommand(EsGameMode.Adventure, "gma"), 3);
+ sc("gmsp", "gamemode.spectator", new GameModeCommand(EsGameMode.Spectator, "gmsp"), 8);
sc("tphere", "tp", new TpHere());
sc("tpall", "tp", new TpAll());
sc("feed", "feed", new Feed());
@@ -94,7 +104,7 @@ public void onEnable() {
sc("setstack", "setstack", new SetStack());
sc("ci", "clearinv", new ClearInv());
sc("day", "time", new Day());
- sc("moon", "time", new Night());
+ sc("night", "time", new Night());
sc("noon", "time", new Noon());
sc("midnight", "time", new Midnight());
sc("sun", "weather", new Sun());
@@ -132,7 +142,7 @@ public void onEnable() {
sc("buddha", "god", new Buddha(), 1);
sc("music", "music", new Music(), 9);
- sc("potion", "potion", new Potion(), 4);
+ sc("potion", "potion", new Potion());
sc("setpersistentdata", "setpersistentdata", new SetPersistentData(), 14);
sc("getpersistentdata", "getpersistentdata", new GetPersistentData(), 14);
@@ -145,139 +155,95 @@ public void onEnable() {
sc("dismount", "mount", new Dismount());
// Load other features
- if (majorVersion > 0) { // Enchants and events don't work on 1.0.0
+ if (minecraftVersion.getMinor() > 0) { // Enchants and events don't work on 1.0.0
PowerTool.init();
SignMain.init();
}
Give.enable();
Updater.checkForUpdate();
+
+ server.startEvents(); // Events will now trigger
+ }
+
+ public static void callEvent(EsEvent event) {
+ for (EsEventListener listener : eventListeners) {
+ listener.executeEvent(event);
+ }
}
- @Override
- public void onDisable() { /* Needed for older versions, which require an onDisable method */ }
+ public static boolean executeCommand(EsCommandSender sender, String cmd, String[] args) {
+ if (!commands.containsKey(cmd)) {
+ logger.severe("&cThe command: '" + cmd + "', does not exist");
+ return false;
+ }
+
+ return commands.get(cmd).execute(sender, args);
+ }
+ public static void registerEvents(EsEventListener listener) {
+ eventListeners.add(listener);
+ }
// Setup Command Overloads
- public PluginCommand sc(String name, EsToolsCommand ce) {
- PluginCommand cmd = getCommand(name);
- assert cmd != null;
- cmd.setExecutor(ce);
+ public void sc(String name, EsToolsCommand ce) {
+ server.registerCommand(name, ce);
+ commands.put(name, ce);
ce.onEnable();
-
- if (tabCompleteEnabled && cmd.getTabCompleter() == null) {
- ce.register(cmd);
- }
- return cmd;
}
- public PluginCommand sc(String name, EsToolsCommand ce, int minVer) {
- if (Main.majorVersion >= minVer) return sc(name, ce);
- else return sc(name, new WrongVersion(minVer));
+ public void sc(String name, EsToolsCommand ce, int minVer) {
+ if (minecraftVersion.getMinor() >= minVer) {
+ sc(name, ce);
+ return;
+ }
+ sc(name, new WrongVersion(minVer));
}
- public PluginCommand sc(String name, EsToolsCommand ce, EsToolsTabCompleter tc) {
- PluginCommand cmd = sc(name, ce);
+ public void sc(String name, EsToolsCommand ce, EsToolsTabCompleter tc) {
+ sc(name, ce);
if (tabCompleteEnabled) {
- tc.register(cmd);
+ server.setTabCompleter(name, tc);
}
- return cmd;
}
- public PluginCommand sc(String name, String perm, EsToolsCommand ce, EsToolsTabCompleter tc, int minMajor, int minMinor) {
+ public void sc(String name, String perm, EsToolsCommand ce, EsToolsTabCompleter tc, int minMajor, int minMinor) {
String versionName = minMajor + "." + minMinor;
- if (Main.majorVersion > minMajor || (Main.majorVersion == minMajor && Main.minorVersion >= minMinor)) {
+ if (minecraftVersion.getMinor() > minMajor || (minecraftVersion.getMinor() == minMajor && minecraftVersion.getPatch() >= minMinor)) {
if (tc == null) {
- return sc(name, perm, ce);
+ sc(name, perm, ce);
+ return;
}
- return sc(name, perm, ce, tc);
- } else return sc(name, new WrongVersion(versionName), new WrongVersion(versionName));
+ sc(name, perm, ce, tc);
+ } else sc(name, new WrongVersion(versionName), new WrongVersion(versionName));
}
- public PluginCommand sc(String name, String perm, EsToolsCommand ce) {
- PluginCommand cmd = sc(name, ce);
- cmd.setPermission("estools." + perm);
-
- if (Main.majorVersion > 0) { // Permission errors weren't a thing in 1.0
- //noinspection deprecation, is still useful in pre 1.13 and technically is useful in rare situations post 1.13
- cmd.setPermissionMessage(EsToolsCommand.translate("&cYou do not have permission to run this command."));
- }
-
- if (tabCompleteEnabled && cmd.getTabCompleter() == null) { // Give every command tab complete if they haven't already registered it
- ce.register(cmd);
- }
- return cmd;
+ public void sc(String name, String perm, EsToolsCommand ce) {
+ sc(name, ce);
+ server.setCommandPermission(name, "estools." + perm);
}
- public PluginCommand sc(String name, String perm, EsToolsCommand ce, int minVer) {
- if (Main.majorVersion >= minVer) return sc(name, perm, ce);
- else return sc(name, perm, new WrongVersion(minVer));
+ public void sc(String name, String perm, EsToolsCommand ce, int minVer) {
+ if (minecraftVersion.getMinor() >= minVer) sc(name, perm, ce);
+ else sc(name, perm, new WrongVersion(minVer));
}
- public PluginCommand sc(String name, String perm, EsToolsCommand ce, EsToolsTabCompleter tc) {
- PluginCommand cmd = sc(name, perm, ce);
+ public void sc(String name, String perm, EsToolsCommand ce, EsToolsTabCompleter tc) {
+ sc(name, perm, ce);
if (tabCompleteEnabled) {
- tc.register(cmd);
+ server.setTabCompleter(name, tc);
}
- return cmd;
- }
-
- private void getVersion() { // Parse the minecraft version from the Bukkit version string
- String versionS = Bukkit.getVersion();
-
- if (versionS.contains("(MC: ")) {
- int posOfMC = versionS.indexOf("(MC: ") + 5;
- versionS = versionS.substring(posOfMC, versionS.indexOf(')', posOfMC));
- } else {
- Bukkit.getLogger().warning("Could not detect version from: " + versionS);
- return;
- }
-
- for (int i = 0; i < 99; i++) {
- if (versionS.contains("1." + i)) {
- majorVersion = i;
- }
- }
-
- for (int i = 0; i < 99; i++) {
- if (versionS.contains("1." + majorVersion + '.' + i)) {
- minorVersion = i;
- }
- }
-
- Bukkit.getLogger().info("Version detected as: 1." + majorVersion + '.' + minorVersion + " from: " + versionS);
}
// Overriding to create more predictable behaviour between versions
- @Override
- public FileConfiguration getConfig() {
+ public EsToolsConfig getConfig() {
return config;
}
- // Overriding because method doesn't exist in very early versions
- public void saveResource(String res, boolean replace) {
- InputStream resource = getResource(res);
- File file = new File(getDataFolder(), res);
-
- if (file.exists()) {
- Bukkit.getLogger().info("Tried to copy resource but it already exists: " + res);
- return;
- }
-
- try {
- Files.createDirectories(file.getParentFile().toPath());
- asrt(resource != null);
- Files.copy(resource, file.toPath());
- Bukkit.getLogger().info("Copied " + res + " to " + file.toPath());
- } catch (IOException e) {
- e.printStackTrace();
- Bukkit.getLogger().severe("Failed to save resource: " + e);
- }
- }
-
- public static void asrt(boolean condition) {
+ @SuppressWarnings("unused")
+ public static void asrt(boolean condition) {
asrt(condition, "Condition is false");
}
@@ -285,12 +251,18 @@ public static void asrt(boolean condition) {
public static void asrt(boolean condition, String msg) {
assert condition : msg;
- if (condition) {
+ // Asserts aren't enforced most of the time
+ //noinspection ConstantValue
+ if (condition) {
return;
}
- Bukkit.getLogger().severe("Assertion failed: " + msg);
+ logger.severe("Assertion failed: " + msg);
throw new AssertionError(msg);
}
+
+ public void saveConfig() {
+ ConfigManager.save("config.yml", config);
+ }
}
diff --git a/src/main/java/net/serble/estools/MetaHandler.java b/src/main/java/net/serble/estools/MetaHandler.java
deleted file mode 100644
index d8ac910..0000000
--- a/src/main/java/net/serble/estools/MetaHandler.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package net.serble.estools;
-
-import net.serble.estools.Commands.Potion;
-import org.bukkit.Material;
-import org.bukkit.command.CommandSender;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-import org.bukkit.inventory.meta.PotionMeta;
-import org.bukkit.potion.PotionEffect;
-import org.bukkit.potion.PotionEffectType;
-import org.bukkit.potion.PotionType;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-// This class exists because Minecraft < 1.4 doesn't have ItemMeta. It just encapsulates all ItemMeta methods.
-public class MetaHandler {
-
- public static ItemStack getPotion(CommandSender sender, Potion.PotType potType, String effect, int duration, int amp, int amount) {
- if (Main.majorVersion >= 9) {
- String type = potType == Potion.PotType.drink ?
- "POTION" :
- potType.toString().toUpperCase() + "_POTION";
- ItemStack pot = new ItemStack(Material.valueOf(type), amount);
-
- PotionEffectType effType;
- try {
- effType = Effects.getByName(effect);
- } catch (IllegalArgumentException e) {
- EsToolsCommand.send(sender, "&cInvalid potion effect");
- return null;
- }
-
- PotionMeta meta = (PotionMeta) pot.getItemMeta();
- assert meta != null;
- meta.addCustomEffect(new PotionEffect(effType, duration, amp-1), true);
- pot.setItemMeta(meta);
- return pot;
- } else if (Main.majorVersion >= 4) {
- PotionType effType;
- try {
- effType = Effects.getPotionByName(effect);
- } catch (IllegalArgumentException e) {
- EsToolsCommand.send(sender, "&cInvalid potion effect");
- return null;
- }
-
- @SuppressWarnings("deprecation")
- org.bukkit.potion.Potion potion = new org.bukkit.potion.Potion(effType, amp);
- potion.setSplash(potType == Potion.PotType.splash);
- return potion.toItemStack(1);
- } else { // This isn't possible to get to because this class won't load on 1.3 and below
- EsToolsCommand.send(sender, "&cPotions are not yet supported in this version, they may be in the future.");
- return null;
- }
- }
-
- public static void renameItem(ItemStack item, String name) {
- ItemMeta meta = Objects.requireNonNull(item.getItemMeta());
- meta.setDisplayName(name);
- item.setItemMeta(meta);
- }
-
- public static List getLore(ItemStack item) {
- ItemMeta meta = item.getItemMeta();
- if (meta == null || !meta.hasLore()) {
- return new ArrayList<>();
- }
-
- return meta.getLore();
- }
-
- public static void setLore(ItemStack item, List lore) {
- ItemMeta meta = Objects.requireNonNull(item.getItemMeta());
- meta.setLore(lore);
- item.setItemMeta(meta);
- }
-}
diff --git a/src/main/java/net/serble/estools/MultiPlayerCommand.java b/src/main/java/net/serble/estools/MultiPlayerCommand.java
index 0e40e23..3f69b3b 100644
--- a/src/main/java/net/serble/estools/MultiPlayerCommand.java
+++ b/src/main/java/net/serble/estools/MultiPlayerCommand.java
@@ -1,8 +1,7 @@
package net.serble.estools;
-import org.bukkit.Bukkit;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
import java.util.List;
@@ -10,10 +9,10 @@
public abstract class MultiPlayerCommand extends EsToolsCommand {
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
- for (Player p : getOnlinePlayers()) {
+ for (EsPlayer p : Main.server.getOnlinePlayers()) {
tab.add(p.getName());
}
@@ -22,19 +21,19 @@ public List tabComplete(CommandSender sender, String[] args, String lArg
return tab;
}
- public static ArrayList getPlayers(CommandSender sender, String[] names) {
+ public static ArrayList getPlayers(EsCommandSender sender, String[] names) {
if (names.length == 0) {
return new ArrayList<>();
}
if (names[0].equals("*")) {
- return new ArrayList<>(getOnlinePlayers());
+ return new ArrayList<>(Main.server.getOnlinePlayers());
}
- ArrayList players = new ArrayList<>();
+ ArrayList players = new ArrayList<>();
for (String name : names) {
- Player p = Bukkit.getPlayer(name);
+ EsPlayer p = Main.server.getPlayer(name);
if (p == null) {
send(sender, "&cPlayer &6%s&c not found.", name);
@@ -46,14 +45,14 @@ public static ArrayList getPlayers(CommandSender sender, String[] names)
return players;
}
- public static ArrayList getPlayers(CommandSender sender, String name) {
+ public static ArrayList getPlayers(EsCommandSender sender, String name) {
if (name.equals("*")) {
- return new ArrayList<>(getOnlinePlayers());
+ return new ArrayList<>(Main.server.getOnlinePlayers());
}
- ArrayList players = new ArrayList<>();
+ ArrayList players = new ArrayList<>();
- Player p = Bukkit.getPlayer(name);
+ EsPlayer p = Main.server.getPlayer(name);
if (p == null) {
send(sender, "&cPlayer &6%s&c not found.", name);
diff --git a/src/main/java/net/serble/estools/PlayerCommand.java b/src/main/java/net/serble/estools/PlayerCommand.java
index c7b3480..f557cd1 100644
--- a/src/main/java/net/serble/estools/PlayerCommand.java
+++ b/src/main/java/net/serble/estools/PlayerCommand.java
@@ -1,7 +1,7 @@
package net.serble.estools;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
+import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import java.util.ArrayList;
import java.util.List;
@@ -9,10 +9,10 @@
public abstract class PlayerCommand extends EsToolsCommand {
@Override
- public List tabComplete(CommandSender sender, String[] args, String lArg) {
+ public List tabComplete(EsCommandSender sender, String[] args, String lArg) {
List tab = new ArrayList<>();
- for (Player p : getOnlinePlayers()) {
+ for (EsPlayer p : Main.server.getOnlinePlayers()) {
tab.add(p.getName());
}
diff --git a/src/main/java/net/serble/estools/PluginVersion.java b/src/main/java/net/serble/estools/PluginVersion.java
deleted file mode 100644
index 31d3537..0000000
--- a/src/main/java/net/serble/estools/PluginVersion.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package net.serble.estools;
-
-public class PluginVersion {
- private final int major;
- private final int minor;
- private final int patch;
- private final String string;
-
- public PluginVersion(String str) {
- String[] parts = str.split("\\.");
- major = Integer.parseInt(parts[0]);
- minor = Integer.parseInt(parts[1]);
- patch = Integer.parseInt(parts[2]);
- string = str;
- }
-
- public int getMajor() {
- return major;
- }
-
- public int getMinor() {
- return minor;
- }
-
- public int getPatch() {
- return patch;
- }
-
- public String getString() {
- return string;
- }
-
- public boolean isLowerThan(PluginVersion other) {
- if (getMajor() < other.getMajor()) {
- return true;
- } else if (getMajor() > other.getMajor()) {
- return false;
- }
-
- if (getMinor() < other.getMinor()) {
- return true;
- } else if (getMinor() > other.getMinor()) {
- return false;
- }
-
- return getPatch() < other.getPatch();
- }
-}
diff --git a/src/main/java/net/serble/estools/SemanticVersion.java b/src/main/java/net/serble/estools/SemanticVersion.java
new file mode 100644
index 0000000..ff86a76
--- /dev/null
+++ b/src/main/java/net/serble/estools/SemanticVersion.java
@@ -0,0 +1,101 @@
+package net.serble.estools;
+
+@SuppressWarnings("unused") // Future-proof, it's a util class why not
+public class SemanticVersion {
+ private final int major;
+ private final int minor;
+ private final int patch;
+ private final String string;
+
+ public SemanticVersion(String str) {
+ String[] parts = str.split("\\.");
+ major = Integer.parseInt(parts[0]);
+ minor = Integer.parseInt(parts[1]);
+ patch = Integer.parseInt(parts[2]);
+ string = str;
+ }
+
+ public SemanticVersion(int major, int minor, int patch) {
+ this.major = major;
+ this.minor = minor;
+ this.patch = patch;
+ string = major + "." + minor + "." + patch;
+ }
+
+ public int getMajor() {
+ return major;
+ }
+
+ public int getMinor() {
+ return minor;
+ }
+
+ public int getPatch() {
+ return patch;
+ }
+
+ @Override
+ public String toString() {
+ return string;
+ }
+
+ public boolean isLowerThan(SemanticVersion other) {
+ return isLowerThan(other.major, other.minor, other.patch);
+ }
+
+ public boolean isLowerThan(int major, int minor, int patch) {
+ if (getMajor() < major) {
+ return true;
+ } else if (getMajor() > major) {
+ return false;
+ }
+
+ if (getMinor() < minor) {
+ return true;
+ } else if (getMinor() > minor) {
+ return false;
+ }
+
+ return getPatch() < patch;
+ }
+
+ public boolean isAtLeast(SemanticVersion other) {
+ return isAtLeast(other.major, other.minor, other.patch);
+ }
+
+ public boolean isAtLeast(int major, int minor, int patch) {
+ if (getMajor() < major) {
+ return false;
+ } else if (getMajor() > major) {
+ return true;
+ }
+
+ if (getMinor() < minor) {
+ return false;
+ } else if (getMinor() > minor) {
+ return true;
+ }
+
+ return getPatch() >= patch;
+ }
+
+ public boolean isMoreThan(int major, int minor, int patch) {
+ if (getMajor() > major) {
+ return true;
+ } else if (getMajor() < major) {
+ return false;
+ }
+
+ if (getMinor() > minor) {
+ return true;
+ } else if (getMinor() < minor) {
+ return false;
+ }
+
+ return getPatch() > patch;
+ }
+
+ public boolean isMoreThan(SemanticVersion other) {
+ return isMoreThan(other.major, other.minor, other.patch);
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsAction.java b/src/main/java/net/serble/estools/ServerApi/EsAction.java
new file mode 100644
index 0000000..fcec21a
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsAction.java
@@ -0,0 +1,32 @@
+package net.serble.estools.ServerApi;
+
+public enum EsAction {
+ /**
+ * Left-clicking a block
+ */
+ LeftClickBlock,
+ /**
+ * Right-clicking a block
+ */
+ RightClickBlock,
+ /**
+ * Left-clicking the air
+ */
+ LeftClickAir,
+ /**
+ * Right-clicking the air
+ */
+ RightClickAir,
+ /**
+ * Stepping onto or into a block (Ass-pressure)
+ *
+ * Examples:
+ *
+ * - Jumping on soil
+ *
- Standing on pressure plate
+ *
- Triggering redstone ore
+ *
- Triggering tripwire
+ *
+ */
+ Physical
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsClickType.java b/src/main/java/net/serble/estools/ServerApi/EsClickType.java
new file mode 100644
index 0000000..6f048d7
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsClickType.java
@@ -0,0 +1,129 @@
+package net.serble.estools.ServerApi;
+
+import org.jetbrains.annotations.ApiStatus;
+
+/**
+ * How the action was triggered, not what it did, see {@link net.serble.estools.ServerApi.EsInventoryAction}
+ * for the action.
+ */
+public enum EsClickType {
+
+ /**
+ * The left (or primary) mouse button.
+ */
+ Left,
+ /**
+ * Holding shift while pressing the left mouse button.
+ */
+ ShiftLeft,
+ /**
+ * The right mouse button.
+ */
+ Right,
+ /**
+ * Holding shift while pressing the right mouse button.
+ */
+ ShiftRight,
+ /**
+ * Clicking the left mouse button on the grey area around the inventory.
+ */
+ WindowBorderLeft,
+ /**
+ * Clicking the right mouse button on the grey area around the inventory.
+ */
+ WindowBorderRight,
+ /**
+ * The middle mouse button, or a "scrollwheel click".
+ */
+ Middle,
+ /**
+ * One of the number keys 1-9, correspond to slots on the hotbar.
+ */
+ NumberKey,
+ /**
+ * Pressing the left mouse button twice in quick succession.
+ */
+ DoubleClick,
+ /**
+ * The "Drop" key (defaults to Q).
+ */
+ Drop,
+ /**
+ * Holding Ctrl while pressing the "Drop" key (defaults to Q).
+ */
+ ControlDrop,
+ /**
+ * Any action done with the Creative inventory open.
+ */
+ Creative,
+ /**
+ * The "swap item with offhand" key (defaults to F).
+ */
+ SwapOffhand,
+ /**
+ * Should only be called if the implementation is not updated for a Minecraft version.
+ * Getting this value is a sign of a bug.
+ */
+ @ApiStatus.Experimental
+ Unknown,
+ ;
+
+ /**
+ * Gets whether this ClickType represents the pressing of a key on a
+ * keyboard.
+ *
+ * @return true if this ClickType represents the pressing of a key
+ */
+ public boolean isKeyboardClick() {
+ return (this == EsClickType.NumberKey) || (this == EsClickType.Drop) || (this == EsClickType.ControlDrop) || (this == EsClickType.SwapOffhand);
+ }
+
+ /**
+ * Gets whether this ClickType represents the pressing of a mouse button
+ *
+ * @return true if this ClickType represents the pressing of a mouse button
+ */
+ public boolean isMouseClick() {
+ return (this == EsClickType.DoubleClick) || (this == EsClickType.Left) || (this == EsClickType.Right) || (this == EsClickType.Middle)
+ || (this == EsClickType.WindowBorderLeft) || (this == EsClickType.ShiftLeft) || (this == EsClickType.ShiftRight) || (this == EsClickType.WindowBorderRight);
+ }
+
+ /**
+ * Gets whether this ClickType represents an action that can only be
+ * performed by a Player in creative mode.
+ *
+ * @return true if this action requires Creative mode
+ */
+ public boolean isCreativeAction() {
+ // Why use middle click?
+ return (this == EsClickType.Middle) || (this == EsClickType.Creative);
+ }
+
+ /**
+ * Gets whether this ClickType represents a right click.
+ *
+ * @return true if this ClickType represents a right click
+ */
+ public boolean isRightClick() {
+ return (this == EsClickType.Right) || (this == EsClickType.ShiftRight);
+ }
+
+ /**
+ * Gets whether this ClickType represents a left click.
+ *
+ * @return true if this ClickType represents a left click
+ */
+ public boolean isLeftClick() {
+ return (this == EsClickType.Left) || (this == EsClickType.ShiftLeft) || (this == EsClickType.DoubleClick) || (this == EsClickType.Creative);
+ }
+
+ /**
+ * Gets whether this ClickType indicates that the shift key was pressed
+ * down when the click was made.
+ *
+ * @return true if the action uses Shift.
+ */
+ public boolean isShiftClick() {
+ return (this == EsClickType.ShiftLeft) || (this == EsClickType.ShiftRight);
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsEnchantment.java b/src/main/java/net/serble/estools/ServerApi/EsEnchantment.java
new file mode 100644
index 0000000..e7b5743
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsEnchantment.java
@@ -0,0 +1,54 @@
+package net.serble.estools.ServerApi;
+
+import net.serble.estools.Main;
+import net.serble.estools.Utils;
+import org.jetbrains.annotations.Nullable;
+
+public class EsEnchantment {
+ private String key;
+
+ public static EsEnchantment createUnchecked(String key) {
+ EsEnchantment type = new EsEnchantment();
+ type.key = key.toLowerCase();
+
+ return type;
+ }
+
+ public static @Nullable EsEnchantment fromKey(String key) {
+ EsEnchantment type = EsEnchantment.createUnchecked(key);
+
+ if (Main.server.getEnchantments().contains(type)) {
+ return type;
+ }
+
+ return null;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ /** This exists for YAML serialisation only, DO NOT USE, use EsSound.fromKey(String) instead. */
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof EsEnchantment) {
+ return ((EsEnchantment) obj).getKey().equals(key);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return Utils.keyToDisplayName(key);
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsEquipmentSlot.java b/src/main/java/net/serble/estools/ServerApi/EsEquipmentSlot.java
new file mode 100644
index 0000000..46492a7
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsEquipmentSlot.java
@@ -0,0 +1,10 @@
+package net.serble.estools.ServerApi;
+
+public enum EsEquipmentSlot {
+ Hand,
+ OffHand,
+ Feet,
+ Legs,
+ Chest,
+ Head
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsEventListener.java b/src/main/java/net/serble/estools/ServerApi/EsEventListener.java
new file mode 100644
index 0000000..7cb0793
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsEventListener.java
@@ -0,0 +1,7 @@
+package net.serble.estools.ServerApi;
+
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+
+public interface EsEventListener {
+ void executeEvent(EsEvent event);
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsEventResult.java b/src/main/java/net/serble/estools/ServerApi/EsEventResult.java
new file mode 100644
index 0000000..5c9e797
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsEventResult.java
@@ -0,0 +1,7 @@
+package net.serble.estools.ServerApi;
+
+public enum EsEventResult {
+ DENY,
+ DEFAULT,
+ ALLOW
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsGameMode.java b/src/main/java/net/serble/estools/ServerApi/EsGameMode.java
new file mode 100644
index 0000000..8a5bae2
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsGameMode.java
@@ -0,0 +1,18 @@
+package net.serble.estools.ServerApi;
+
+public enum EsGameMode {
+ Survival(0),
+ Creative(1),
+ Adventure(2),
+ Spectator(3);
+
+ private final int ordinal;
+
+ EsGameMode(int val) {
+ ordinal = val;
+ }
+
+ public int getOrdinal() {
+ return ordinal;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsInventoryAction.java b/src/main/java/net/serble/estools/ServerApi/EsInventoryAction.java
new file mode 100644
index 0000000..7450df0
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsInventoryAction.java
@@ -0,0 +1,88 @@
+package net.serble.estools.ServerApi;
+
+/**
+ * The action that was triggered by the player's input
+ */
+public enum EsInventoryAction {
+ /**
+ * Nothing happened, I'm not sure why you would ever call the event for this, but it's here.
+ */
+ Nothing,
+ /**
+ * All the items on the clicked slot are moved to the cursor.
+ */
+ PickupAll,
+ /**
+ * Some of the items on the clicked slot are moved to the cursor.
+ */
+ PickupSome,
+ /**
+ * Half of the items on the clicked slot are moved to the cursor.
+ */
+ PickupHalf,
+ /**
+ * One of the items on the clicked slot are moved to the cursor.
+ */
+ PickupOne,
+ /**
+ * All the items on the cursor are moved to the clicked slot.
+ */
+ PlaceAll,
+ /**
+ * Some of the items from the cursor are moved to the clicked slot
+ * (usually up to the max stack size).
+ */
+ PlaceSome,
+ /**
+ * A single item from the cursor is moved to the clicked slot.
+ */
+ PlaceOne,
+ /**
+ * The clicked item and the cursor are exchanged.
+ */
+ SwapWithCursor,
+ /**
+ * The entire cursor item is dropped.
+ */
+ DropAllCursor,
+ /**
+ * One item is dropped from the cursor.
+ */
+ DropOneCursor,
+ /**
+ * The entire clicked slot is dropped.
+ */
+ DropAllSlot,
+ /**
+ * One item is dropped from the clicked slot.
+ */
+ DropOneSlot,
+ /**
+ * The item is moved to the opposite inventory if a space is found.
+ */
+ MoveToOtherInventory,
+ /**
+ * The clicked item is moved to the hotbar, and the item currently there
+ * is re-added to the player's inventory.
+ * The hotbar includes the player's offhand.
+ */
+ HotbarMoveAndReadd,
+ /**
+ * The clicked slot and the picked hotbar slot are swapped.
+ * The hotbar includes the player's offhand.
+ */
+ HotbarSwap,
+ /**
+ * A max-size stack of the clicked item is put on the cursor.
+ */
+ CloneStack,
+ /**
+ * The inventory is searched for the same material, and they are put on
+ * the cursor up to the max stack size.
+ */
+ CollectToCursor,
+ /**
+ * An unrecognized ClickType.
+ */
+ Unknown
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsItemFlag.java b/src/main/java/net/serble/estools/ServerApi/EsItemFlag.java
new file mode 100644
index 0000000..5e5cc56
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsItemFlag.java
@@ -0,0 +1,37 @@
+package net.serble.estools.ServerApi;
+
+public enum EsItemFlag {
+ /**
+ * Setting to show/hide enchants
+ */
+ HIDE_ENCHANTS,
+ /**
+ * Setting to show/hide Attributes like Damage
+ */
+ HIDE_ATTRIBUTES,
+ /**
+ * Setting to show/hide the unbreakable State
+ */
+ HIDE_UNBREAKABLE,
+ /**
+ * Setting to show/hide what the ItemStack can break/destroy
+ */
+ HIDE_DESTROYS,
+ /**
+ * Setting to show/hide where this ItemStack can be build/placed on
+ */
+ HIDE_PLACED_ON,
+ /**
+ * Setting to show/hide potion effects, book and firework information, map
+ * tooltips, patterns of banners, and enchantments of enchanted books.
+ */
+ HIDE_POTION_EFFECTS,
+ /**
+ * Setting to show/hide dyes from colored leather armor.
+ */
+ HIDE_DYE,
+ /**
+ * Setting to show/hide armor trim from leather armor.
+ */
+ HIDE_ARMOR_TRIM;
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsLocation.java b/src/main/java/net/serble/estools/ServerApi/EsLocation.java
new file mode 100644
index 0000000..8fb42e4
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsLocation.java
@@ -0,0 +1,105 @@
+package net.serble.estools.ServerApi;
+
+import net.serble.estools.Main;
+import net.serble.estools.ServerApi.Interfaces.EsWorld;
+
+@SuppressWarnings("unused") // SnakeYAML needs the setters
+public class EsLocation extends Position {
+ private EsWorld world;
+ private String worldName;
+ private Position direction;
+ private double yaw;
+ private double pitch;
+
+ public EsLocation(EsWorld world, double x, double y, double z) {
+ this.world = world;
+ this.worldName = world.getName();
+ setX(x);
+ setY(y);
+ setZ(z);
+ }
+
+ public EsLocation(EsWorld world, Position dir, double x, double y, double z) {
+ this.world = world;
+ this.worldName = world.getName();
+ direction = dir;
+ setX(x);
+ setY(y);
+ setZ(z);
+ }
+
+ public EsLocation(EsWorld world, Position dir, double x, double y, double z, double yaw, double pitch) {
+ this.world = world;
+ this.worldName = world.getName();
+ direction = dir;
+ this.yaw = yaw;
+ this.pitch = pitch;
+ setX(x);
+ setY(y);
+ setZ(z);
+ }
+
+ /** You probably shouldn't use this, it's here for SnakeYAML */
+ public EsLocation() { }
+
+ public EsWorld getWorld() {
+ return world;
+ }
+
+ public String getWorldName() {
+ return worldName;
+ }
+
+ public void setWorldName(String worldName) { // Sets world based on name, for SnakeYAML to correctly use locations
+ this.worldName = worldName;
+ world = Main.server.getWorld(worldName);
+ }
+
+ public double distanceTo(EsLocation other) {
+ return super.distanceTo(other);
+ }
+
+ public Position getDirection() {
+ return direction;
+ }
+
+ public void setDirection(Position direction) {
+ this.direction = direction;
+ }
+
+ public double getPitch() {
+ return pitch;
+ }
+
+ public double getYaw() {
+ return yaw;
+ }
+
+ public void setPitch(double pitch) {
+ this.pitch = pitch;
+ }
+
+ public void setYaw(double yaw) {
+ this.yaw = yaw;
+ }
+
+ public int getBlockX() {
+ return (int) Math.round(getX());
+ }
+
+ public int getBlockY() {
+ return (int) Math.round(getY());
+ }
+
+ public int getBlockZ() {
+ return (int) Math.round(getZ());
+ }
+
+ public EsLocation add(Position other) {
+ return add(other.getX(), other.getY(), other.getZ());
+ }
+
+ public EsLocation add(double x, double y, double z) {
+ return new EsLocation(world, getX() + x, getY() + y, getZ() + z);
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsMaterial.java b/src/main/java/net/serble/estools/ServerApi/EsMaterial.java
new file mode 100644
index 0000000..9f6c153
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsMaterial.java
@@ -0,0 +1,54 @@
+package net.serble.estools.ServerApi;
+
+import net.serble.estools.Main;
+import net.serble.estools.Utils;
+import org.jetbrains.annotations.Nullable;
+
+public class EsMaterial {
+ private String key;
+
+ public static EsMaterial createUnchecked(String key) {
+ EsMaterial type = new EsMaterial();
+ type.key = key.toLowerCase();
+
+ return type;
+ }
+
+ public static @Nullable EsMaterial fromKey(String key) {
+ EsMaterial type = EsMaterial.createUnchecked(key);
+
+ if (Main.server.getMaterials(false).contains(type)) {
+ return type;
+ }
+
+ return null;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ /** This exists for YAML serialisation only, DO NOT USE, use EsMaterial.fromKey(String) instead. */
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof EsMaterial) {
+ return ((EsMaterial) obj).getKey().equals(key);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return Utils.keyToDisplayName(key);
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsPersistentDataType.java b/src/main/java/net/serble/estools/ServerApi/EsPersistentDataType.java
new file mode 100644
index 0000000..286ad77
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsPersistentDataType.java
@@ -0,0 +1,15 @@
+package net.serble.estools.ServerApi;
+
+public enum EsPersistentDataType {
+ String,
+ Boolean,
+ Integer,
+ Byte,
+ Float,
+ Double,
+ Short,
+ Long,
+ ByteArray,
+ IntArray,
+ LongArray
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsPotType.java b/src/main/java/net/serble/estools/ServerApi/EsPotType.java
new file mode 100644
index 0000000..b6e9de8
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsPotType.java
@@ -0,0 +1,7 @@
+package net.serble.estools.ServerApi;
+
+public enum EsPotType {
+ drink,
+ lingering,
+ splash
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsPotionEffect.java b/src/main/java/net/serble/estools/ServerApi/EsPotionEffect.java
new file mode 100644
index 0000000..7a079a2
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsPotionEffect.java
@@ -0,0 +1,42 @@
+package net.serble.estools.ServerApi;
+
+@SuppressWarnings("unused") // Needs the methods for serialiser
+public class EsPotionEffect {
+ private EsPotionEffectType type;
+ private int amp;
+ private int duration;
+
+ public EsPotionEffect(EsPotionEffectType type, int amp, int duration) {
+ this.type = type;
+ this.amp = amp;
+ this.duration = duration;
+ }
+
+ public EsPotionEffect() { // Serialiser needs this
+
+ }
+
+ public int getAmp() {
+ return amp;
+ }
+
+ public int getDuration() {
+ return duration;
+ }
+
+ public EsPotionEffectType getType() {
+ return type;
+ }
+
+ public void setAmp(int amp) {
+ this.amp = amp;
+ }
+
+ public void setDuration(int duration) {
+ this.duration = duration;
+ }
+
+ public void setType(EsPotionEffectType type) {
+ this.type = type;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsPotionEffectType.java b/src/main/java/net/serble/estools/ServerApi/EsPotionEffectType.java
new file mode 100644
index 0000000..33519ed
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsPotionEffectType.java
@@ -0,0 +1,54 @@
+package net.serble.estools.ServerApi;
+
+import net.serble.estools.Main;
+import net.serble.estools.Utils;
+import org.jetbrains.annotations.Nullable;
+
+public class EsPotionEffectType {
+ private String key;
+
+ public static EsPotionEffectType createUnchecked(String key) {
+ EsPotionEffectType type = new EsPotionEffectType();
+ type.key = key.toLowerCase();
+
+ return type;
+ }
+
+ public static @Nullable EsPotionEffectType fromKey(String key) {
+ EsPotionEffectType type = EsPotionEffectType.createUnchecked(key);
+
+ if (Main.server.getPotionEffectTypes().contains(type)) {
+ return type;
+ }
+
+ return null;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ /** This exists for YAML serialisation only, DO NOT USE, use EsPotionEffectType.fromKey(String) instead. */
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof EsPotionEffectType) {
+ return ((EsPotionEffectType) obj).getKey().equals(key);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return Utils.keyToDisplayName(key);
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsSerialisableItemStack.java b/src/main/java/net/serble/estools/ServerApi/EsSerialisableItemStack.java
new file mode 100644
index 0000000..d5f80de
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsSerialisableItemStack.java
@@ -0,0 +1,99 @@
+package net.serble.estools.ServerApi;
+
+import net.serble.estools.Main;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPotion;
+
+import java.util.Map;
+
+/**
+ * This class is entirely platform independent and replies on the ability to export ItemMeta is a string.
+ */
+@SuppressWarnings("unused") // Needs the methods for YAML serialiser
+public class EsSerialisableItemStack {
+ private EsMaterial material;
+ private int amount;
+ private String itemMeta;
+ private Map enchantments;
+ private boolean isPotion;
+ private EsPotType potType;
+
+ /** Public constructor for serialiser */
+ public EsSerialisableItemStack() { }
+
+ public static EsSerialisableItemStack generate(EsItemStack stack) {
+ EsSerialisableItemStack result = new EsSerialisableItemStack();
+ result.setMaterial(stack.getType());
+ result.setAmount(stack.getAmount());
+ result.setEnchantments(stack.getEnchantments());
+ result.setItemMeta(stack.exportItemMeta());
+
+ if (stack instanceof EsPotion) {
+ EsPotion pot = (EsPotion) stack;
+ result.setPotType(pot.getPotionType());
+ result.setIsPotion(true);
+ } else {
+ result.setIsPotion(false);
+ }
+
+ return result;
+ }
+
+ public EsItemStack toItemStack() {
+ EsItemStack stack = isPotion ?
+ Main.server.createPotion(potType) :
+ Main.server.createItemStack(material, 1);
+
+ stack.setAmount(amount);
+ stack.importItemMeta(itemMeta);
+ return stack;
+ }
+
+ public int getAmount() {
+ return amount;
+ }
+
+ public EsMaterial getMaterial() {
+ return material;
+ }
+
+ public void setAmount(int amount) {
+ this.amount = amount;
+ }
+
+ public void setMaterial(EsMaterial material) {
+ this.material = material;
+ }
+
+ public Map getEnchantments() {
+ return enchantments;
+ }
+
+ public void setEnchantments(Map enchantments) {
+ this.enchantments = enchantments;
+ }
+
+ public String getItemMeta() {
+ return itemMeta;
+ }
+
+ public void setItemMeta(String itemMeta) {
+ this.itemMeta = itemMeta;
+ }
+
+ public boolean getIsPotion() {
+ return isPotion;
+ }
+
+ public void setIsPotion(boolean isPotion) {
+ this.isPotion = isPotion;
+ }
+
+ public EsPotType getPotType() {
+ return potType;
+ }
+
+ public void setPotType(EsPotType potType) {
+ this.potType = potType;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsSound.java b/src/main/java/net/serble/estools/ServerApi/EsSound.java
new file mode 100644
index 0000000..136a0a3
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsSound.java
@@ -0,0 +1,54 @@
+package net.serble.estools.ServerApi;
+
+import net.serble.estools.Main;
+import net.serble.estools.Utils;
+import org.jetbrains.annotations.Nullable;
+
+public class EsSound {
+ private String key;
+
+ public static EsSound createUnchecked(String key) {
+ EsSound type = new EsSound();
+ type.key = key.toLowerCase();
+
+ return type;
+ }
+
+ public static @Nullable EsSound fromKey(String key) {
+ EsSound type = EsSound.createUnchecked(key);
+
+ if (Main.server.getSounds().contains(type)) {
+ return type;
+ }
+
+ return null;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ /** This exists for YAML serialisation only, DO NOT USE, use EsSound.fromKey(String) instead. */
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof EsSound) {
+ return ((EsSound) obj).getKey().equals(key);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return key.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return Utils.keyToDisplayName(key);
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsSoundCategory.java b/src/main/java/net/serble/estools/ServerApi/EsSoundCategory.java
new file mode 100644
index 0000000..cafc14e
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsSoundCategory.java
@@ -0,0 +1,14 @@
+package net.serble.estools.ServerApi;
+
+public enum EsSoundCategory {
+ Master,
+ Music,
+ Records,
+ Weather,
+ Blocks,
+ Hostile,
+ Neutral,
+ Players,
+ Ambient,
+ Voice
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/EsTeleportCause.java b/src/main/java/net/serble/estools/ServerApi/EsTeleportCause.java
new file mode 100644
index 0000000..875268b
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/EsTeleportCause.java
@@ -0,0 +1,15 @@
+package net.serble.estools.ServerApi;
+
+public enum EsTeleportCause {
+ EnderPearl,
+ Command,
+ Plugin,
+ NetherPortal,
+ EndPortal,
+ Spectate,
+ EndGateway,
+ ChorusFruit,
+ Dismount,
+ ExitBed,
+ Unknown
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsBlockPlaceEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsBlockPlaceEvent.java
new file mode 100644
index 0000000..0a35056
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsBlockPlaceEvent.java
@@ -0,0 +1,30 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.EsEquipmentSlot;
+import net.serble.estools.ServerApi.Interfaces.EsCancellableEvent;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+public class EsBlockPlaceEvent extends EsCancellableEvent {
+ private final EsPlayer player;
+ private final EsItemStack placedItem;
+ private final EsEquipmentSlot hand;
+
+ public EsBlockPlaceEvent(EsPlayer p, EsItemStack item, EsEquipmentSlot ha) {
+ player = p;
+ placedItem = item;
+ hand = ha;
+ }
+
+ public EsPlayer getPlayer() {
+ return player;
+ }
+
+ public EsItemStack getPlacedItem() {
+ return placedItem;
+ }
+
+ public EsEquipmentSlot getHand() {
+ return hand;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsEntityDamageEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsEntityDamageEvent.java
new file mode 100644
index 0000000..0db45e9
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsEntityDamageEvent.java
@@ -0,0 +1,26 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.Interfaces.EsCancellableEvent;
+import net.serble.estools.ServerApi.Interfaces.EsEntity;
+
+public class EsEntityDamageEvent extends EsCancellableEvent {
+ private final EsEntity entity;
+ private double damage;
+
+ public EsEntityDamageEvent(EsEntity entity, double dmg) {
+ this.entity = entity;
+ damage = dmg;
+ }
+
+ public EsEntity getEntity() {
+ return entity;
+ }
+
+ public double getDamage() {
+ return damage;
+ }
+
+ public void setDamage(double damage) {
+ this.damage = damage;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsInventoryClickEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsInventoryClickEvent.java
new file mode 100644
index 0000000..02f662b
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsInventoryClickEvent.java
@@ -0,0 +1,62 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.EsClickType;
+import net.serble.estools.ServerApi.EsInventoryAction;
+import net.serble.estools.ServerApi.Interfaces.EsCancellableEvent;
+import net.serble.estools.ServerApi.Interfaces.EsInventory;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+public class EsInventoryClickEvent extends EsCancellableEvent {
+ private final EsInventory clickedInv;
+ private final EsInventory inv;
+ private final EsItemStack currentItem;
+ private final EsInventoryAction action;
+ private final EsClickType click;
+ private final EsPlayer player;
+ private final EsItemStack cursor;
+ private final int slot;
+
+ public EsInventoryClickEvent(EsPlayer player, int slot, EsItemStack cursor, EsInventory inv, EsInventory clickedInv, EsItemStack currentItem, EsInventoryAction action, EsClickType click) {
+ this.clickedInv = clickedInv;
+ this.inv = inv;
+ this.currentItem = currentItem;
+ this.action = action;
+ this.click = click;
+ this.player = player;
+ this.cursor = cursor;
+ this.slot = slot;
+ }
+
+ public EsInventory getClickedInventory() {
+ return clickedInv;
+ }
+
+ public EsItemStack getCurrentItem() {
+ return currentItem;
+ }
+
+ public EsInventoryAction getAction() {
+ return action;
+ }
+
+ public EsClickType getClick() {
+ return click;
+ }
+
+ public EsPlayer getPlayer() {
+ return player;
+ }
+
+ public EsInventory getInventory() {
+ return inv;
+ }
+
+ public EsItemStack getCursor() {
+ return cursor;
+ }
+
+ public int getSlot() {
+ return slot;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsInventoryCloseEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsInventoryCloseEvent.java
new file mode 100644
index 0000000..710dae0
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsInventoryCloseEvent.java
@@ -0,0 +1,23 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.Interfaces.EsInventory;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+public class EsInventoryCloseEvent implements EsEvent {
+ private final EsPlayer player;
+ private final EsInventory inv;
+
+ public EsInventoryCloseEvent(EsPlayer player, EsInventory inv) {
+ this.player = player;
+ this.inv = inv;
+ }
+
+ public EsPlayer getPlayer() {
+ return player;
+ }
+
+ public EsInventory getInventory() {
+ return inv;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsInventoryDragEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsInventoryDragEvent.java
new file mode 100644
index 0000000..a126ac2
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsInventoryDragEvent.java
@@ -0,0 +1,38 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.Interfaces.EsCancellableEvent;
+import net.serble.estools.ServerApi.Interfaces.EsInventory;
+import net.serble.estools.ServerApi.Interfaces.EsInventoryView;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+import java.util.Set;
+
+public class EsInventoryDragEvent extends EsCancellableEvent {
+ private final EsPlayer player;
+ private final EsInventory inv;
+ private final Set changedSlots;
+ private final EsInventoryView view;
+
+ public EsInventoryDragEvent(EsPlayer player, EsInventory inv, Set changedSlots, EsInventoryView view) {
+ this.player = player;
+ this.inv = inv;
+ this.changedSlots = changedSlots;
+ this.view = view;
+ }
+
+ public EsPlayer getPlayer() {
+ return player;
+ }
+
+ public EsInventory getInventory() {
+ return inv;
+ }
+
+ public Set getChangedSlots() {
+ return changedSlots;
+ }
+
+ public EsInventoryView getView() {
+ return view;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerDeathEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerDeathEvent.java
new file mode 100644
index 0000000..6dd6b09
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerDeathEvent.java
@@ -0,0 +1,16 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+public class EsPlayerDeathEvent implements EsEvent {
+ private final EsPlayer player;
+
+ public EsPlayerDeathEvent(EsPlayer p) {
+ player = p;
+ }
+
+ public EsPlayer getPlayer() {
+ return player;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerInteractEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerInteractEvent.java
new file mode 100644
index 0000000..796ac4a
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerInteractEvent.java
@@ -0,0 +1,50 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.EsAction;
+import net.serble.estools.ServerApi.EsEventResult;
+import net.serble.estools.ServerApi.Interfaces.EsBlock;
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+import org.jetbrains.annotations.Nullable;
+
+public class EsPlayerInteractEvent implements EsEvent {
+ private final EsPlayer player;
+ private final @Nullable EsBlock clickedBlock;
+ private final EsAction action;
+ private EsEventResult useInteractedBlock;
+ private EsEventResult useItemInHand;
+
+ public EsPlayerInteractEvent(EsPlayer player, @Nullable EsBlock clickedBlock, EsAction action) {
+ this.player = player;
+ this.clickedBlock = clickedBlock;
+ this.action = action;
+ }
+
+ public EsPlayer getPlayer() {
+ return player;
+ }
+
+ public EsAction getAction() {
+ return action;
+ }
+
+ public @Nullable EsBlock getClickedBlock() {
+ return clickedBlock;
+ }
+
+ public EsEventResult getUseItemInHand() {
+ return useItemInHand;
+ }
+
+ public void setUseItemInHand(EsEventResult useItemInHand) {
+ this.useItemInHand = useItemInHand;
+ }
+
+ public EsEventResult getUseInteractedBlock() {
+ return useInteractedBlock;
+ }
+
+ public void setUseInteractedBlock(EsEventResult useInteractedBlock) {
+ this.useInteractedBlock = useInteractedBlock;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerKickEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerKickEvent.java
new file mode 100644
index 0000000..5e957a0
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerKickEvent.java
@@ -0,0 +1,16 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+public class EsPlayerKickEvent implements EsEvent {
+ private final EsPlayer player;
+
+ public EsPlayerKickEvent(EsPlayer player) {
+ this.player = player;
+ }
+
+ public EsPlayer getPlayer() {
+ return player;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerQuitEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerQuitEvent.java
new file mode 100644
index 0000000..a588eb6
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerQuitEvent.java
@@ -0,0 +1,16 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.Interfaces.EsEvent;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+public class EsPlayerQuitEvent implements EsEvent {
+ private final EsPlayer player;
+
+ public EsPlayerQuitEvent(EsPlayer player) {
+ this.player = player;
+ }
+
+ public EsPlayer getPlayer() {
+ return player;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerTeleportEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerTeleportEvent.java
new file mode 100644
index 0000000..7fe9bcb
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsPlayerTeleportEvent.java
@@ -0,0 +1,26 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.EsLocation;
+import net.serble.estools.ServerApi.EsTeleportCause;
+import net.serble.estools.ServerApi.Interfaces.EsCancellableEvent;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+public class EsPlayerTeleportEvent extends EsCancellableEvent {
+ private final EsPlayer player;
+ private final EsTeleportCause cause;
+ private final EsLocation to;
+
+ public EsPlayerTeleportEvent(EsPlayer p, EsTeleportCause c, EsLocation to) {
+ player = p;
+ cause = c;
+ this.to = to;
+ }
+
+ public EsPlayer getPlayer() {
+ return player;
+ }
+
+ public EsTeleportCause getCause() {
+ return cause;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Events/EsSignChangeEvent.java b/src/main/java/net/serble/estools/ServerApi/Events/EsSignChangeEvent.java
new file mode 100644
index 0000000..373b28d
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Events/EsSignChangeEvent.java
@@ -0,0 +1,30 @@
+package net.serble.estools.ServerApi.Events;
+
+import net.serble.estools.ServerApi.Interfaces.EsCancellableEvent;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+
+public class EsSignChangeEvent extends EsCancellableEvent {
+ private final EsPlayer player;
+ private final String[] lines;
+
+ public EsSignChangeEvent(EsPlayer player, String[] lines) {
+ this.player = player;
+ this.lines = lines;
+ }
+
+ public EsPlayer getPlayer() {
+ return player;
+ }
+
+ public String[] getLines() {
+ return lines;
+ }
+
+ public String getLine(int line) {
+ return lines[line];
+ }
+
+ public void setLine(int line, String text) {
+ lines[line] = text;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitBlock.java b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitBlock.java
new file mode 100644
index 0000000..9dc3ddf
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitBlock.java
@@ -0,0 +1,42 @@
+package net.serble.estools.ServerApi.Implementations.Bukkit;
+
+import net.serble.estools.ServerApi.Interfaces.EsBlock;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockState;
+
+public class BukkitBlock implements EsBlock {
+ private final BlockState bukkitState;
+
+ public BukkitBlock(BlockState block) {
+ bukkitState = block;
+ }
+
+ private Block getBukkitBlock() {
+ return bukkitState.getBlock();
+ }
+
+ @Override
+ public boolean breakNaturally() {
+ return getBukkitBlock().breakNaturally();
+ }
+
+ @Override
+ public int getX() {
+ return getBukkitBlock().getX();
+ }
+
+ @Override
+ public int getY() {
+ return getBukkitBlock().getY();
+ }
+
+ @Override
+ public int getZ() {
+ return getBukkitBlock().getZ();
+ }
+
+ @Override
+ public String getType() {
+ return bukkitState.getType().name();
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitCommandBlockSender.java b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitCommandBlockSender.java
new file mode 100644
index 0000000..5374df2
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitCommandBlockSender.java
@@ -0,0 +1,32 @@
+package net.serble.estools.ServerApi.Implementations.Bukkit;
+
+import net.serble.estools.ServerApi.Interfaces.EsCommandBlockSender;
+import net.serble.estools.ServerApi.Interfaces.EsConsoleSender;
+import org.bukkit.command.BlockCommandSender;
+
+public class BukkitCommandBlockSender implements EsCommandBlockSender {
+ private final BlockCommandSender bukkitSender;
+
+ public BukkitCommandBlockSender(BlockCommandSender child) {
+ bukkitSender = child;
+ }
+
+ public BlockCommandSender getBukkitSender() {
+ return bukkitSender;
+ }
+
+ @Override
+ public void sendMessage(String... msg) {
+ bukkitSender.sendMessage(msg);
+ }
+
+ @Override
+ public boolean hasPermission(String node) {
+ return bukkitSender.hasPermission(node);
+ }
+
+ @Override
+ public boolean isPermissionSet(String node) {
+ return bukkitSender.isPermissionSet(node);
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitConsoleSender.java b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitConsoleSender.java
new file mode 100644
index 0000000..ffebb26
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitConsoleSender.java
@@ -0,0 +1,73 @@
+package net.serble.estools.ServerApi.Implementations.Bukkit;
+
+import net.serble.estools.Main;
+import net.serble.estools.ServerApi.Interfaces.EsConsoleSender;
+import net.serble.estools.Utils;
+import org.bukkit.command.ConsoleCommandSender;
+
+// We have to execute methods using reflection because
+// in 1.0 ConsoleCommandSender is a class not an interface
+public class BukkitConsoleSender implements EsConsoleSender {
+ private final ConsoleCommandSender bukkitSender;
+
+ public BukkitConsoleSender(ConsoleCommandSender child) {
+ bukkitSender = child;
+ }
+
+ @Override
+ public void sendMessage(String... msg) {
+ if (Main.minecraftVersion.isAtLeast(1, 2, 0)) {
+ bukkitSender.sendMessage(msg);
+ return;
+ }
+
+ // The sendMessage(String[]) method doesn't exist
+ // So combine the args into one String
+ StringBuilder sb = new StringBuilder();
+ for (String s : msg) {
+ sb.append(s);
+ }
+
+ if (Main.minecraftVersion.isLowerThan(1, 1, 0)) {
+ try {
+ ConsoleCommandSender.class.getMethod("sendMessage", String.class).invoke(bukkitSender, sb.toString());
+ } catch (Exception e) {
+ Main.logger.severe(Utils.getStacktrace(e));
+ }
+ return;
+ }
+ bukkitSender.sendMessage(sb.toString());
+ }
+
+ @Override
+ public boolean hasPermission(String node) {
+ if (Main.minecraftVersion.isLowerThan(1, 1, 0)) {
+ try {
+ return (boolean) ConsoleCommandSender.class
+ .getMethod("hasPermission", String.class)
+ .invoke(bukkitSender, node);
+ } catch (Exception e) {
+ Main.logger.severe(Utils.getStacktrace(e));
+ }
+ return false;
+ }
+
+ return bukkitSender.hasPermission(node);
+ }
+
+ @Override
+ public boolean isPermissionSet(String node) {
+ if (Main.minecraftVersion.isLowerThan(1, 1, 0)) {
+ try {
+ return (boolean) ConsoleCommandSender.class
+ .getMethod("isPermissionSet", String.class)
+ .invoke(bukkitSender, node);
+ } catch (Exception e) {
+ Main.logger.severe(Utils.getStacktrace(e));
+ }
+ return false;
+ }
+
+ return bukkitSender.isPermissionSet(node);
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitEntity.java b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitEntity.java
new file mode 100644
index 0000000..39fbf56
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitEntity.java
@@ -0,0 +1,156 @@
+package net.serble.estools.ServerApi.Implementations.Bukkit;
+
+import net.serble.estools.ServerApi.EsLocation;
+import net.serble.estools.Main;
+import net.serble.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitHelper;
+import net.serble.estools.ServerApi.Interfaces.EsEntity;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+public class BukkitEntity implements EsEntity {
+ private final Entity bukkitEntity;
+
+ public BukkitEntity(Entity bukkitEntity) {
+ this.bukkitEntity = bukkitEntity;
+ }
+
+ public Entity getBukkitEntity() {
+ return bukkitEntity;
+ }
+
+ @Override
+ public void teleport(EsLocation loc) {
+ // This was moved from PaperLib.teleport() because the PaperLib class imports
+ // things that don't exist in Bukkit 1.0 and therefore can't load.
+ bukkitEntity.teleport(BukkitHelper.toBukkitLocation(loc));
+ }
+
+ @Override
+ public String getType() {
+ if (Main.minecraftVersion.isAtLeast(1, 1, 0)) {
+ return bukkitEntity.getType().name();
+ }
+
+ // getType() doesn't exist
+ return "ID " + bukkitEntity.getEntityId();
+ }
+
+ @Override
+ public String getName() {
+ if (Main.minecraftVersion.getMinor() > 7) {
+ return bukkitEntity.getName();
+ }
+
+ if (bukkitEntity instanceof Player) {
+ return ((Player)bukkitEntity).getDisplayName();
+ }
+
+ if (bukkitEntity instanceof LivingEntity) {
+ // Cast isn't redundant because that method is only in LivingEntity in old versions
+ @SuppressWarnings("RedundantCast") String name = ((LivingEntity)bukkitEntity).getCustomName();
+ if (name != null) {
+ return name;
+ }
+ }
+
+ return "Entity";
+ }
+
+ @Override
+ public UUID getUniqueId() {
+ return bukkitEntity.getUniqueId();
+ }
+
+ @Override
+ public boolean hasPermission(String node) {
+ return bukkitEntity.hasPermission(node);
+ }
+
+ @Override
+ public boolean isPermissionSet(String node) {
+ return bukkitEntity.isPermissionSet(node);
+ }
+
+ @Override
+ public void sendMessage(String... msg) {
+ if (Main.minecraftVersion.isAtLeast(1, 2, 0)) {
+ bukkitEntity.sendMessage(msg);
+ return;
+ }
+
+ // The sendMessage(String[]) method doesn't exist
+ // So combine the args into one String
+ StringBuilder sb = new StringBuilder();
+ for (String s : msg) {
+ sb.append(s);
+ }
+ bukkitEntity.sendMessage(sb.toString());
+ }
+
+ @Override
+ public EsLocation getLocation() {
+ return BukkitHelper.fromBukkitLocation(bukkitEntity.getLocation());
+ }
+
+ @Override
+ public boolean leaveVehicle() {
+ if (bukkitEntity instanceof LivingEntity) {
+ // Not redundant for below 1.3
+ //noinspection RedundantCast
+ return ((LivingEntity) bukkitEntity).leaveVehicle();
+ } else {
+ return bukkitEntity.leaveVehicle();
+ }
+ }
+
+ @Override
+ public List getPassengers() {
+ List bukkitList = bukkitEntity.getPassengers();
+ List list = new ArrayList<>();
+ for (Entity entity : bukkitList) {
+ list.add(BukkitHelper.fromBukkitEntity(entity));
+ }
+ return list;
+ }
+
+ @Override
+ public Set getScoreboardTags() {
+ return bukkitEntity.getScoreboardTags();
+ }
+
+ @Override
+ public void addScoreboardTag(String tag) {
+ bukkitEntity.addScoreboardTag(tag);
+ }
+
+ @Override
+ public boolean hasScoreboardTag(String tag) {
+ return bukkitEntity.getScoreboardTags().contains(tag);
+ }
+
+ @Override
+ public void setOnFireTicks(int ticks) {
+ bukkitEntity.setFireTicks(ticks);
+ }
+
+ @Override
+ public void addPassenger(EsEntity entity) {
+ if (Main.minecraftVersion.getMinor() > 11) {
+ bukkitEntity.addPassenger(((BukkitEntity) entity).getBukkitEntity());
+ } else {
+ //noinspection deprecation
+ bukkitEntity.setPassenger(((BukkitEntity) entity).getBukkitEntity());
+ }
+ }
+
+ @Override
+ public void setFallDistance(float dis) {
+ bukkitEntity.setFallDistance(dis);
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitInventory.java b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitInventory.java
new file mode 100644
index 0000000..dba4330
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitInventory.java
@@ -0,0 +1,104 @@
+package net.serble.estools.ServerApi.Implementations.Bukkit;
+
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitHelper;
+import net.serble.estools.ServerApi.Interfaces.EsInventory;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import org.bukkit.Material;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.*;
+
+public class BukkitInventory implements EsInventory {
+ private final org.bukkit.inventory.Inventory bukkitInv;
+
+ public BukkitInventory(Inventory inv) {
+ bukkitInv = inv;
+ if (inv == null) {
+ throw new NullPointerException("inv");
+ }
+ }
+
+ public BukkitInventory() {
+ bukkitInv = null;
+ }
+
+ @Override
+ public void setItem(int slot, EsItemStack item) {
+ ItemStack stack = item == null ? null : ((BukkitItemStack) item).getBukkitItem();
+ bukkitInv.setItem(slot, stack);
+ }
+
+ @Override
+ public EsItemStack getItem(int slot) {
+ return BukkitHelper.fromBukkitItem(bukkitInv.getItem(slot));
+ }
+
+ @Override
+ public void addItem(EsItemStack stack) {
+ bukkitInv.addItem(((BukkitItemStack) stack).getBukkitItem());
+ }
+
+ @Override
+ public void setContents(EsItemStack[] items) {
+ ItemStack[] bukkitItems = new ItemStack[items.length];
+ for (int i = 0; i < items.length; i++) {
+ if (items[i] == null) {
+ bukkitItems[i] = null;
+ continue;
+ }
+ bukkitItems[i] = ((BukkitItemStack) items[i]).getBukkitItem();
+ }
+ bukkitInv.setContents(bukkitItems);
+ }
+
+ @Override
+ public EsItemStack[] getContents() {
+ org.bukkit.inventory.ItemStack[] bukkitItems = bukkitInv.getContents();
+ EsItemStack[] items = new EsItemStack[bukkitItems.length];
+ for (int i = 0; i < bukkitItems.length; i++) {
+ if (bukkitItems[i] == null) {
+ items[i] = null;
+ continue;
+ }
+ items[i] = BukkitHelper.fromBukkitItem(bukkitItems[i]);
+ }
+ return items;
+ }
+
+ @Override
+ public void clear() {
+ bukkitInv.clear();
+ }
+
+ public Inventory getBukkitInventory() {
+ return bukkitInv;
+ }
+
+ @Override
+ public boolean isEqualTo(EsInventory inv) {
+ if (inv == null) {
+ return false;
+ }
+ return ((BukkitInventory) inv).getBukkitInventory().equals(bukkitInv);
+ }
+
+ @Override
+ public int getSize() {
+ return bukkitInv.getSize();
+ }
+
+ @Override
+ public Map all(EsMaterial material) {
+ Material mat = BukkitHelper.toBukkitMaterial(material);
+ Map out = new HashMap<>();
+
+ assert bukkitInv != null;
+ for (Map.Entry entry : bukkitInv.all(mat).entrySet()) {
+ out.put(entry.getKey(), BukkitHelper.fromBukkitItem(entry.getValue()));
+ }
+
+ return out;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitInventoryView.java b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitInventoryView.java
new file mode 100644
index 0000000..88528c1
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitInventoryView.java
@@ -0,0 +1,43 @@
+package net.serble.estools.ServerApi.Implementations.Bukkit;
+
+import net.serble.estools.Main;
+import net.serble.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitHelper;
+import net.serble.estools.ServerApi.Interfaces.EsInventory;
+import net.serble.estools.ServerApi.Interfaces.EsInventoryView;
+import net.serble.estools.ServerApi.Interfaces.EsPlayer;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.InventoryView;
+
+public class BukkitInventoryView implements EsInventoryView {
+ private final InventoryView bukkitView;
+
+ public BukkitInventoryView(InventoryView child) {
+ bukkitView = child;
+ }
+
+ @Override
+ public EsInventory getTopInventory() {
+ return BukkitHelper.fromBukkitInventory(bukkitView.getTopInventory());
+ }
+
+ @Override
+ public EsInventory getBottomInventory() {
+ return BukkitHelper.fromBukkitInventory(bukkitView.getBottomInventory());
+ }
+
+ @Override
+ public EsInventory getInventory(int slot) {
+ if (Main.minecraftVersion.getMinor() <= 12) { // .getInventory(slot) doesn't exist
+ if (slot >= getTopInventory().getSize()) { // Bottom inv
+ return getBottomInventory();
+ }
+ return getTopInventory();
+ }
+ return BukkitHelper.fromBukkitInventory(bukkitView.getInventory(slot));
+ }
+
+ @Override
+ public EsPlayer getPlayer() {
+ return new BukkitPlayer((Player) bukkitView.getPlayer());
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitItemMeta.java b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitItemMeta.java
new file mode 100644
index 0000000..24c28f6
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitItemMeta.java
@@ -0,0 +1,96 @@
+package net.serble.estools.ServerApi.Implementations.Bukkit;
+
+import net.serble.estools.ServerApi.EsItemFlag;
+import net.serble.estools.ServerApi.Interfaces.EsItemMeta;
+import net.serble.estools.ServerApi.Interfaces.EsPersistentDataContainer;
+import org.bukkit.inventory.ItemFlag;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class BukkitItemMeta implements EsItemMeta {
+ private final ItemMeta bukkitMeta;
+
+ public BukkitItemMeta(ItemMeta meta) {
+ if (meta == null) {
+ throw new NullPointerException("Meta is null");
+ }
+ bukkitMeta = meta;
+ }
+
+ @Override
+ public void setUnbreakable(boolean val) {
+ bukkitMeta.setUnbreakable(val);
+ }
+
+ @Override
+ public boolean isUnbreakable() {
+ return bukkitMeta.isUnbreakable();
+ }
+
+ @Override
+ public Set getItemFlags() {
+ Set bukkitFlags = bukkitMeta.getItemFlags();
+ Set out = new HashSet<>();
+ for (ItemFlag flag : bukkitFlags) {
+ out.add(EsItemFlag.valueOf(flag.name()));
+ }
+ return out;
+ }
+
+ @Override
+ public void addItemFlags(EsItemFlag... flags) {
+ bukkitMeta.addItemFlags(convertFlags(flags));
+ }
+
+ @Override
+ public void removeItemFlags(EsItemFlag... flags) {
+ bukkitMeta.removeItemFlags(convertFlags(flags));
+ }
+
+ private ItemFlag[] convertFlags(EsItemFlag[] flags) {
+ List bukkitFlags = new ArrayList<>(flags.length);
+ for (EsItemFlag flag : flags) {
+ try {
+ bukkitFlags.add(ItemFlag.valueOf(flag.name()));
+ } catch (IllegalArgumentException ignored) {} // doesnt exist, dont add
+ }
+
+ return bukkitFlags.toArray(new ItemFlag[0]);
+ }
+
+ @Override
+ public void setDisplayName(String val) {
+ bukkitMeta.setDisplayName(val);
+ }
+
+ @Override
+ public String getDisplayName() {
+ return bukkitMeta.getDisplayName();
+ }
+
+ @Override
+ public List getLore() {
+ if (!bukkitMeta.hasLore()) {
+ return new ArrayList<>();
+ }
+ return bukkitMeta.getLore();
+ }
+
+ @Override
+ public void setLore(List val) {
+ bukkitMeta.setLore(val);
+ }
+
+ @Override
+ public EsPersistentDataContainer getPersistentDataContainer() {
+ return new BukkitPersistentDataContainer(bukkitMeta.getPersistentDataContainer());
+ }
+
+ public ItemMeta getBukkitMeta() {
+ return bukkitMeta;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitItemStack.java b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitItemStack.java
new file mode 100644
index 0000000..559eb11
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitItemStack.java
@@ -0,0 +1,160 @@
+package net.serble.estools.ServerApi.Implementations.Bukkit;
+
+import net.serble.estools.Main;
+import net.serble.estools.ServerApi.EsEnchantment;
+import net.serble.estools.ServerApi.EsMaterial;
+import net.serble.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitEnchantmentHelper;
+import net.serble.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitHelper;
+import net.serble.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitMetaHelper;
+import net.serble.estools.ServerApi.Interfaces.EsItemMeta;
+import net.serble.estools.ServerApi.Interfaces.EsItemStack;
+import org.bukkit.configuration.InvalidConfigurationException;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.Damageable;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+public class BukkitItemStack implements EsItemStack {
+ private final ItemStack bukkitItem;
+
+ public BukkitItemStack(EsMaterial mat, int amount) {
+ bukkitItem = new ItemStack(BukkitHelper.toBukkitMaterial(mat), amount);
+ }
+
+ public BukkitItemStack(ItemStack child) {
+ bukkitItem = child;
+ }
+
+ public ItemStack getBukkitItem() {
+ return bukkitItem;
+ }
+
+ @Override
+ public EsMaterial getType() {
+ return BukkitHelper.fromBukkitMaterial(bukkitItem.getType());
+ }
+
+ @Override
+ public void setType(EsMaterial val) {
+ bukkitItem.setType(BukkitHelper.toBukkitMaterial(val));
+ }
+
+ @Override
+ public int getAmount() {
+ return bukkitItem.getAmount();
+ }
+
+ @Override
+ public void setAmount(int val) {
+ bukkitItem.setAmount(val);
+ }
+
+ @Override
+ public void addEnchantment(EsEnchantment enchantment, int level) {
+ bukkitItem.addUnsafeEnchantment(BukkitEnchantmentHelper.toBukkitEnchantment(enchantment), level);
+ }
+
+ @Override
+ public void removeEnchantment(EsEnchantment enchantment) {
+ bukkitItem.removeEnchantment(BukkitEnchantmentHelper.toBukkitEnchantment(enchantment));
+ }
+
+ @Override
+ public EsItemMeta getItemMeta() {
+ return BukkitMetaHelper.fromBukkitItemMeta(bukkitItem.getItemMeta());
+ }
+
+ @Override
+ public String exportItemMeta() {
+ YamlConfiguration config = new YamlConfiguration();
+ config.set("item", bukkitItem.getItemMeta());
+ return config.saveToString();
+ }
+
+ @Override
+ public void importItemMeta(String meta) {
+ YamlConfiguration config = new YamlConfiguration();
+ try {
+ config.loadFromString(meta);
+ } catch (InvalidConfigurationException e) {
+ throw new RuntimeException(e);
+ }
+
+ ItemMeta itemMeta = (ItemMeta)config.get("item");
+ bukkitItem.setItemMeta(itemMeta);
+ }
+
+ @Override
+ public void setItemMeta(EsItemMeta meta) {
+ bukkitItem.setItemMeta(((BukkitItemMeta) meta).getBukkitMeta());
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public void setDamage(int val) {
+ if (Main.minecraftVersion.getMinor() > 12) {
+ ItemMeta meta = bukkitItem.getItemMeta();
+ if (meta instanceof Damageable) {
+ ((Damageable) meta).setDamage(val);
+ }
+ bukkitItem.setItemMeta(meta);
+ } else {
+ if (val > Short.MAX_VALUE) {
+ val = Short.MAX_VALUE;
+ }
+
+ bukkitItem.setDurability((short) val);
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ public int getDamage() {
+ if (Main.minecraftVersion.getMinor() > 12) {
+ return bukkitItem.getDurability();
+ }
+
+ ItemMeta meta = bukkitItem.getItemMeta();
+ if (meta instanceof Damageable) {
+ return ((Damageable) meta).getDamage();
+ }
+ return 0;
+ }
+
+ @SuppressWarnings("MethodDoesntCallSuperMethod") // I don't care, it doesn't work like that
+ @Override
+ public EsItemStack clone() {
+ return BukkitHelper.fromBukkitItem(bukkitItem.clone());
+ }
+
+ @Override
+ public boolean isSimilar(EsItemStack stack) {
+ return ((BukkitItemStack) stack).getBukkitItem().isSimilar(bukkitItem);
+ }
+
+ @Override
+ public int getMaxStackSize() {
+ return bukkitItem.getMaxStackSize();
+ }
+
+ @Override
+ public Object getInternalObject() {
+ return bukkitItem;
+ }
+
+ @Override
+ public Map getEnchantments() {
+ Set> bEnchs = bukkitItem.getEnchantments().entrySet();
+ Map enchs = new HashMap<>(bEnchs.size());
+ for (Map.Entry ench : bEnchs) {
+ enchs.put(BukkitEnchantmentHelper.fromBukkitEnchantment(ench.getKey()), ench.getValue());
+ }
+
+ return enchs;
+ }
+}
diff --git a/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitLivingEntity.java b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitLivingEntity.java
new file mode 100644
index 0000000..10a3997
--- /dev/null
+++ b/src/main/java/net/serble/estools/ServerApi/Implementations/Bukkit/BukkitLivingEntity.java
@@ -0,0 +1,132 @@
+package net.serble.estools.ServerApi.Implementations.Bukkit;
+
+import net.serble.estools.Main;
+import net.serble.estools.ServerApi.EsPotionEffect;
+import net.serble.estools.ServerApi.EsPotionEffectType;
+import net.serble.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitEffectHelper;
+import net.serble.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitHelper;
+import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
+import net.serble.estools.ServerApi.Interfaces.EsWorld;
+import org.bukkit.Bukkit;
+import org.bukkit.attribute.Attribute;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.potion.PotionEffect;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+public class BukkitLivingEntity extends BukkitEntity implements EsLivingEntity {
+ private final org.bukkit.entity.LivingEntity bukkitEntity;
+
+ public BukkitLivingEntity(org.bukkit.entity.LivingEntity entity) {
+ super(entity);
+ bukkitEntity = entity;
+ }
+
+ public LivingEntity getBukkitEntity() {
+ return bukkitEntity;
+ }
+
+ @Override
+ public double getMaxHealth() {
+ if (Main.minecraftVersion.getMinor() > 8) {
+ return Objects.requireNonNull(bukkitEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH)).getValue();
+ } else {
+ if (Main.minecraftVersion.getMinor() > 5) {
+ //noinspection deprecation
+ return bukkitEntity.getMaxHealth();
+ }
+
+ try {
+ return (double)(int) org.bukkit.entity.LivingEntity.class.getMethod("getMaxHealth").invoke(bukkitEntity);
+ } catch(Exception e) {
+ Bukkit.getLogger().severe(e.toString());
+ return 20d;
+ }
+ }
+ }
+
+ @Override
+ public void setMaxHealth(double val) {
+ if (Main.minecraftVersion.getMinor() > 8) {
+ Objects.requireNonNull(bukkitEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(val);
+ } else {
+ if (Main.minecraftVersion.getMinor() > 5) {
+ //noinspection deprecation
+ bukkitEntity.setMaxHealth(val);
+ return;
+ }
+
+ try {
+ //noinspection JavaReflectionMemberAccess
+ org.bukkit.entity.LivingEntity.class.getMethod("setMaxHealth", int.class).invoke(bukkitEntity, (int)val);
+ }
+ catch (Exception ex) {
+ Bukkit.getLogger().severe(ex.toString());
+ }
+ }
+ }
+
+ @Override
+ public double getHealth() {
+ if (Main.minecraftVersion.getMinor() > 5) {
+ return bukkitEntity.getHealth();
+ }
+
+ try {
+ return (double)(int) org.bukkit.entity.LivingEntity.class.getMethod("getHealth").invoke(bukkitEntity);
+ }
+ catch (Exception ex) {
+ Bukkit.getLogger().severe(ex.toString());
+ return 20d;
+ }
+ }
+
+ @Override
+ public void setHealth(double val) {
+ if (Main.minecraftVersion.getMinor() > 5) {
+ bukkitEntity.setHealth(val);
+ return;
+ }
+
+ try {
+ //noinspection JavaReflectionMemberAccess
+ org.bukkit.entity.LivingEntity.class.getMethod("setHealth", int.class).invoke(bukkitEntity, (int)val);
+ }
+ catch (Exception ex) {
+ Bukkit.getLogger().severe(ex.toString());
+ }
+ }
+
+ @Override
+ public void addPotionEffect(EsPotionEffect effect) {
+ bukkitEntity.addPotionEffect(BukkitHelper.toBukkitPotionEffect(effect));
+ }
+
+ @Override
+ public void removePotionEffect(EsPotionEffectType effect) {
+ bukkitEntity.removePotionEffect(BukkitEffectHelper.toBukkitEffectType(effect));
+ }
+
+ @Override
+ public List