Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Folia Support + Platform Abstraction #14

Merged
merged 77 commits into from
Jun 23, 2024
Merged
Changes from 1 commit
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
c7d50ab
Abstract away basic bukkit api, incomplete
CoPokBl May 23, 2024
0e824e4
Abstract blocks and effects and enchantments
CoPokBl May 24, 2024
a21d068
More item data, tester, player invs, general improvements
CoPokBl May 24, 2024
168f864
More meta, nbt, general movement towards abstraction
CoPokBl May 24, 2024
3b14263
IT BUILDS
CoPokBl May 24, 2024
74cd83e
The plugin now enables
CoPokBl May 24, 2024
f0298d6
Make everything work on regular bukkit
CoPokBl May 24, 2024
9a7ff27
Abstract logger, fix depends, fix tp, start implement scheduler, fix …
CoPokBl May 24, 2024
b56a0a2
Folia partial support, fix bugs with stuff
CoPokBl May 25, 2024
16fa4b4
Start implementing events, more fixes
CoPokBl May 25, 2024
86167a5
Implement all events
CoPokBl May 26, 2024
62878ba
Fix resource overlap warns
CoPokBl May 26, 2024
3a2db3d
Abstract commands and fix many commands
CoPokBl May 26, 2024
1916337
New config system, various fixes, vault signs
CoPokBl May 26, 2024
ed4944e
Remove /music todo
CoPokBl May 26, 2024
77b19fe
Attempt fix cchests config
CoPokBl May 27, 2024
7646e67
Attempt reflection janky fix
CoPokBl May 28, 2024
5923211
Full normal non janky CChests saving
CoPokBl May 30, 2024
f4c8b4a
Start working on BukkitConfigMigrator
CoPokBl May 30, 2024
70b234a
Finish config migrator
CoPokBl May 31, 2024
77efd74
Potions saving to YML (untested)
CoPokBl Jun 3, 2024
b74915f
Work towards fixing Potion saving in CChests
CoPokBl Jun 5, 2024
cc66a63
Stop events messing with the current cancellation state and messing u…
CoPokBl Jun 5, 2024
f631b91
Made EsSerialisableItemStack work with any NBT data/meta, and fixed b…
Calcilore Jun 15, 2024
41cd4e0
Relocations, fix EsSerialisableItemStack potions and folia bugs
CoPokBl Jun 15, 2024
aff8e2f
Compatability improvemetns
Calcilore Jun 15, 2024
f2cc2de
Fix /editsign target block broken null
CoPokBl Jun 16, 2024
f2884ef
Testing, fix registry old version issues
CoPokBl Jun 16, 2024
8a17da9
Fix give bug where conflict and default config override actual becaus…
CoPokBl Jun 16, 2024
410ed0f
Fix when EquipmentSlots weren't used in PlayerInventory (1.12 done)
CoPokBl Jun 17, 2024
8594683
Fix sounds not existing in old versions and fix old enchants not bein…
CoPokBl Jun 17, 2024
4dd563e
Equipment slots and brainless potion implement
CoPokBl Jun 17, 2024
1e1bf68
Fix stuff for 1.7.10
CoPokBl Jun 17, 2024
dafc410
Moved away for using Strings for Materials, Enchantments and Effects …
Calcilore Jun 18, 2024
d3e815f
Fixed name of Helpers package for bukkit
CoPokBl Jun 18, 2024
64cc35f
Added EsSound for sound effects (some old sounds in old versions do n…
Calcilore Jun 19, 2024
517943f
spelling and grammar in BukkitSoundEnumConverter
CoPokBl Jun 19, 2024
3eed408
Update README.md
CoPokBl Jun 21, 2024
42bcef2
Fix movement away from String ids from breaking serialisation
CoPokBl Jun 21, 2024
3556fb0
Refactor, fix bugs that never surfaced and fixed getinfo bug from EsE…
CoPokBl Jun 21, 2024
da96981
Added missing commands to /estools test
Calcilore Jun 21, 2024
4f72b66
Fixed HideFlags error when you are not holding anything
Calcilore Jun 21, 2024
7099bed
Fixed Ench error when you are not holding anything
Calcilore Jun 21, 2024
978a2aa
Fixed GetInfo amplifier starting at 0
Calcilore Jun 21, 2024
5fb4562
Fix dumb Folia in bukkit error
CoPokBl Jun 21, 2024
f39d085
Fixed setItem with equipment slot checking the wrong version
Calcilore Jun 21, 2024
5b3c593
Fixed give commands breaking in 1.13 specifically
Calcilore Jun 21, 2024
b49ada6
Fix dumb Folia in bukkit errors again
CoPokBl Jun 21, 2024
545fe1e
Merge remote-tracking branch 'origin/folia' into folia
CoPokBl Jun 21, 2024
51d98d2
Fix signs and remove Vault support
CoPokBl Jun 21, 2024
d80407d
Fixed give commands breaking in 1.13 specifically
Calcilore Jun 21, 2024
cc1b2a7
Fix mount error on invalid rider
CoPokBl Jun 21, 2024
6349fd0
Fixed getInventory having wrong version for compat in 1.9-1.10
Calcilore Jun 21, 2024
2acd27e
Fixed /back not seeing /tp as a valid teleport reason
Calcilore Jun 21, 2024
4f2696a
Fix tester invalid coords
CoPokBl Jun 21, 2024
264450c
Merge remote-tracking branch 'origin/folia' into folia
CoPokBl Jun 21, 2024
ce9a4f3
Fix get entity failing
CoPokBl Jun 21, 2024
10f953c
Fixed potion amplifiers starting at 1 in older versions
Calcilore Jun 21, 2024
6695ab0
Fix locations on old versions (and remove unneeded code), test versions
CoPokBl Jun 21, 2024
659bf7a
Change SemanticVersion methods
CoPokBl Jun 21, 2024
df967eb
Remove Vault softdepend
CoPokBl Jun 21, 2024
e14e460
Fix 1.4 support, events not working
CoPokBl Jun 22, 2024
bc489a6
Fix 1.3 support, fix setmaxhealth min version
CoPokBl Jun 22, 2024
f51ffd5
Fix 1.2 support, move Sounds away
CoPokBl Jun 22, 2024
2666265
Fix 1.1 support, move more events and methods
CoPokBl Jun 23, 2024
786a86f
Add version specific tests
CoPokBl Jun 23, 2024
b4adb1b
Fix non player send message bugs on old versions
CoPokBl Jun 23, 2024
9bc8e87
Make /estools reset and reload work properly
CoPokBl Jun 23, 2024
98c2f56
Fix potions in pre 1.4 and move funcs for 1.0 support
CoPokBl Jun 23, 2024
e136d34
Fix /rename not checking if meta is null, also removed MetaHandler wh…
CoPokBl Jun 23, 2024
895ad71
Fix events not behaving properly on old versions
CoPokBl Jun 23, 2024
4f64462
Change version of getClickedInventory being added
CoPokBl Jun 23, 2024
ff2a4ae
Fix version where potion amp is limited
CoPokBl Jun 23, 2024
f3effc3
Changed the version where InventoryView.getInventory(int slot) was ad…
Calcilore Jun 23, 2024
4774cc5
Fix folia creating BukkitPotion
CoPokBl Jun 23, 2024
fb04e42
Added old version support for Signs and changed SemanticVersion .getS…
Calcilore Jun 23, 2024
b800fb3
Merge branch 'master' into folia
CoPokBl Jun 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Folia partial support, fix bugs with stuff
CoPokBl committed May 25, 2024

Verified

This commit was signed with the committer’s verified signature.
commit b56a0a2b9b541ef2b213c29c7ca7e250b112cb2d
6 changes: 4 additions & 2 deletions src/main/java/net/serble/estools/Commands/Buddha.java
Original file line number Diff line number Diff line change
@@ -4,11 +4,13 @@
import net.serble.estools.EntityCommand;
import net.serble.estools.Entrypoints.EsToolsBukkit;
import net.serble.estools.Main;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaLivingEntity;
import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
import org.bukkit.Bukkit;
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;
@@ -120,11 +122,11 @@ private void setDamageFromEvent(EntityDamageEvent e, @SuppressWarnings("SamePara

@EventHandler
public void damage(EntityDamageEvent e) {
if (!(e.getEntity() instanceof EsLivingEntity) || !currentPlayers.containsKey(e.getEntity().getUniqueId())) {
if (!(e.getEntity() instanceof LivingEntity) || !currentPlayers.containsKey(e.getEntity().getUniqueId())) {
return;
}

EsLivingEntity entity = (EsLivingEntity) e.getEntity();
EsLivingEntity entity = new FoliaLivingEntity((LivingEntity) e.getEntity());

// Get all our vars since Minecraft broke everything in 1.6
double damage = getDamageFromEvent(e);
14 changes: 7 additions & 7 deletions src/main/java/net/serble/estools/Commands/CChest.java
Original file line number Diff line number Diff line change
@@ -5,8 +5,8 @@
import net.serble.estools.ConfigManager;
import net.serble.estools.Main;
import net.serble.estools.ServerApi.EsGameMode;
import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitInventory;
import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitPlayer;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaInventory;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaPlayer;
import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
import net.serble.estools.ServerApi.Interfaces.EsInventory;
import net.serble.estools.ServerApi.Interfaces.EsItemStack;
@@ -119,7 +119,7 @@ public void inventoryClick(final InventoryClickEvent e) {
}

// If player inventory
if (!e.getClickedInventory().equals(((BukkitInventory)cChests.get(uid)).getBukkitInventory())) {
if (!e.getClickedInventory().equals(((FoliaInventory)cChests.get(uid)).getBukkitInventory())) { // TODO: Reliance
// Shift click into cChest
if (equalsOr(e.getClick(), ClickType.SHIFT_LEFT, ClickType.SHIFT_RIGHT) && currentItem != null) {
e.setCancelled(true);
@@ -175,7 +175,7 @@ private static boolean isSameInv(Inventory a, EsInventory b) {
if (a == null || b == null) {
return false;
}
return a.equals(((BukkitInventory) b).getBukkitInventory());
return a.equals(((FoliaInventory) b).getBukkitInventory());
}

// Cancel drag if inside cChest
@@ -231,19 +231,19 @@ public void onClose(InventoryCloseEvent e) {
UUID uid = e.getPlayer().getUniqueId();

if (isSameInv(e.getInventory(), cChests.get(uid))) {
savePlayer(new BukkitPlayer((Player) e.getPlayer()));
savePlayer(new FoliaPlayer((Player) e.getPlayer())); // TODO: Fix
}
}

@EventHandler
public void onQuit(PlayerQuitEvent e) {
savePlayer(new BukkitPlayer(e.getPlayer()));
savePlayer(new FoliaPlayer(e.getPlayer()));
cChests.remove(e.getPlayer().getUniqueId());
}

@EventHandler
public void onKick(PlayerKickEvent e) {
savePlayer(new BukkitPlayer(e.getPlayer()));
savePlayer(new FoliaPlayer(e.getPlayer()));
cChests.remove(e.getPlayer().getUniqueId());
}
}
13 changes: 7 additions & 6 deletions src/main/java/net/serble/estools/Commands/Infinite.java
Original file line number Diff line number Diff line change
@@ -3,8 +3,8 @@
import net.serble.estools.Entrypoints.EsToolsBukkit;
import net.serble.estools.EsToolsCommand;
import net.serble.estools.Main;
import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitItemStack;
import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitPlayer;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaItemStack;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaPlayer;
import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
import net.serble.estools.ServerApi.Interfaces.EsItemStack;
import net.serble.estools.ServerApi.Interfaces.EsPlayer;
@@ -50,13 +50,14 @@ public void blockPlace(BlockPlaceEvent e) {
return;
}

EsItemStack item = new BukkitItemStack(e.getItemInHand().clone());
EsPlayer p = new BukkitPlayer(e.getPlayer());
// TODO: Migrate
EsItemStack item = new FoliaItemStack(e.getItemInHand().clone());
EsPlayer p = new FoliaPlayer(e.getPlayer());

// TODO: This is a terrible way of implementing this btw
Main.server.runTaskLater(() -> {
Main.server.runTask(() -> {
p.setMainHand(item);
p.updateInventory(); // A bug makes this necessary
}, 0);
});
}
}
15 changes: 14 additions & 1 deletion src/main/java/net/serble/estools/Entrypoints/EsToolsBukkit.java
Original file line number Diff line number Diff line change
@@ -4,17 +4,30 @@
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() {
plugin = this;
Main main = new Main(ServerPlatform.Bukkit, this);

ServerPlatform platform = isFolia() ? ServerPlatform.Folia : ServerPlatform.Bukkit;

Main main = new Main(platform, this);
main.enable();
}

@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;
}
}
}
7 changes: 4 additions & 3 deletions src/main/java/net/serble/estools/EsToolsCommand.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package net.serble.estools;

import net.serble.estools.ServerApi.EsLocation;
import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitHelper;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaHelper;
import net.serble.estools.ServerApi.Interfaces.EsCommandSender;
import net.serble.estools.ServerApi.Interfaces.EsPlayer;

@@ -10,6 +10,7 @@
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;

import java.util.*;

@@ -28,8 +29,8 @@ public List<String> onTabComplete(EsCommandSender sender, Command command, Strin
}

@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return execute(BukkitHelper.fromBukkitCommandSender(sender), args);
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
return execute(FoliaHelper.fromBukkitCommandSender(sender), args); // TODO: This is dependent on Folia
}

public static List<String> fixTabComplete(List<String> inList, String arg) {
2 changes: 2 additions & 0 deletions src/main/java/net/serble/estools/Main.java
Original file line number Diff line number Diff line change
@@ -51,6 +51,8 @@ public void enable() {
server = platform.getServerInstance(context);
logger = server.getLogger();

logger.info("Starting EsTools on platform: " + platform.name());

minecraftVersion = server.getVersion();

Effects.load();
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.serble.estools.ServerApi.Implementations.Bukkit;

import net.serble.estools.ServerApi.EsPersistentDataType;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaHelper;
import net.serble.estools.ServerApi.Interfaces.EsPersistentDataContainer;
import org.bukkit.persistence.PersistentDataContainer;

@@ -18,12 +19,12 @@ public BukkitPersistentDataContainer(PersistentDataContainer container) {

@Override
public void set(String key, EsPersistentDataType type, Object val) {
bukkitContainer.set(Objects.requireNonNull(getNamespacedKey(key)), BukkitHelper.toBukkitPersistentDataType(type), val);
bukkitContainer.set(Objects.requireNonNull(getNamespacedKey(key)), FoliaHelper.toBukkitPersistentDataType(type), val);
}

@Override
public Object get(String key, EsPersistentDataType type) {
return null;
return bukkitContainer.get(Objects.requireNonNull(getNamespacedKey(key)), FoliaHelper.toBukkitPersistentDataType(type));
}

@Override
Original file line number Diff line number Diff line change
@@ -6,7 +6,6 @@
import net.serble.estools.SemanticVersion;
import net.serble.estools.ServerApi.EsPotType;
import net.serble.estools.ServerApi.Interfaces.*;
import org.apache.commons.lang.NotImplementedException;
import org.bukkit.*;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
@@ -243,13 +242,12 @@ public String getPluginName() {

@Override
public void runTaskLater(Runnable task, long ticks) {
if (!BukkitHelper.isFolia()) {
Bukkit.getScheduler().runTaskLater(EsToolsBukkit.plugin, task, ticks);
return;
}
Bukkit.getScheduler().runTaskLater(EsToolsBukkit.plugin, task, ticks);
}

// TODO: Folia
throw new NotImplementedException();
@Override
public void runTask(Runnable task) {
Bukkit.getScheduler().runTask(EsToolsBukkit.plugin, task);
}

@Override
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitBlock;
import org.bukkit.block.BlockState;

public class FoliaBlock extends BukkitBlock {
private final BlockState bukkitState;

public FoliaBlock(BlockState block) {
super(block);
bukkitState = block;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitCommandBlockSender;
import org.bukkit.command.BlockCommandSender;

public class FoliaCommandBlockSender extends BukkitCommandBlockSender {
private final BlockCommandSender bukkitSender;

public FoliaCommandBlockSender(BlockCommandSender child) {
super(child);
bukkitSender = child;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitConsoleSender;
import org.bukkit.command.ConsoleCommandSender;

public class FoliaConsoleSender extends BukkitConsoleSender {
private final ConsoleCommandSender bukkitSender;

public FoliaConsoleSender(ConsoleCommandSender child) {
super(child);
bukkitSender = child;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitEnchantmentsHelper;

// 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 FoliaEnchantmentsHelper extends BukkitEnchantmentsHelper { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import io.papermc.lib.PaperLib;
import net.serble.estools.ServerApi.EsLocation;
import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitEntity;
import org.bukkit.entity.Entity;

public class FoliaEntity extends BukkitEntity {
private final org.bukkit.entity.Entity bukkitEntity;

public FoliaEntity(Entity bukkitEntity) {
super(bukkitEntity);
this.bukkitEntity = bukkitEntity;
}

@Override
public void teleport(EsLocation loc) {
PaperLib.teleportAsync(bukkitEntity, FoliaHelper.toBukkitLocation(loc));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import io.papermc.paper.threadedregions.scheduler.EntityScheduler;
import io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler;
import io.papermc.paper.threadedregions.scheduler.RegionScheduler;
import net.serble.estools.Entrypoints.EsToolsBukkit;
import net.serble.estools.Main;
import net.serble.estools.ServerApi.EsLocation;
import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitHelper;
import net.serble.estools.ServerApi.Interfaces.*;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class FoliaHelper extends BukkitHelper {

private static GlobalRegionScheduler getGlobalScheduler() {
GlobalRegionScheduler grs;
try {
Object serverInstance = EsToolsBukkit.plugin.getServer();

Method getSchedulerMethod = serverInstance.getClass().getMethod("getGlobalRegionScheduler");
Object schObject = getSchedulerMethod.invoke(serverInstance);

if (schObject instanceof GlobalRegionScheduler) {
grs = (GlobalRegionScheduler) schObject;
} else {
Main.logger.severe("schObject is not an instance of GlobalRegionScheduler");
throw new RuntimeException("Failed to get global scheduler, are you running folia?");
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException("Failed to get global scheduler, are you running folia?");
}

return grs;
}

private static RegionScheduler getRegionScheduler() {
RegionScheduler grs;
try {
Object serverInstance = EsToolsBukkit.plugin.getServer();

Method getSchedulerMethod = serverInstance.getClass().getMethod("getRegionScheduler");
Object schObject = getSchedulerMethod.invoke(serverInstance);

if (schObject instanceof RegionScheduler) {
grs = (RegionScheduler) schObject;
} else {
Main.logger.severe("schObject is not an instance of RegionScheduler");
throw new RuntimeException("Failed to get regional scheduler, are you running folia?");
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException("Failed to get regional scheduler, are you running folia?");
}

return grs;
}

private static EntityScheduler getEntityScheduler(Entity entity) {
EntityScheduler grs;
try {
Method getSchedulerMethod = entity.getClass().getMethod("getScheduler");
Object schObject = getSchedulerMethod.invoke(entity);

if (schObject instanceof EntityScheduler) {
grs = (EntityScheduler) schObject;
} else {
Main.logger.severe("schObject is not an instance of EntityScheduler");
throw new RuntimeException("Failed to get entity scheduler, are you running folia?");
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException("Failed to get entity scheduler, are you running folia?");
}

return grs;
}

public static void runTaskLater(Runnable task, long ticks) {
getGlobalScheduler().runDelayed(EsToolsBukkit.plugin, (t) -> task.run(), ticks);
}

public static void runTaskOnNextTick(Runnable task) {
getGlobalScheduler().run(EsToolsBukkit.plugin, (t) -> task.run());
}

public static void runFromLocation(EsLocation loc, Runnable task) {
runFromLocation(toBukkitLocation(loc), task);
}

public static void runFromLocation(Location loc, Runnable task) {
getRegionScheduler().run(EsToolsBukkit.plugin, loc, (t) -> task.run());
}

public static void runFromEntity(EsEntity entity, Runnable task) {
runFromEntity(((FoliaEntity)entity).getBukkitEntity(), task);
}

public static void runFromEntity(Entity entity, Runnable task) {
getEntityScheduler(entity).run(EsToolsBukkit.plugin, (t) -> task.run(), null);
}

public static void runSync(Runnable task) {
//getGlobalScheduler().execute(EsToolsBukkit.plugin, task);
//Bukkit.getScheduler().runTask(EsToolsBukkit.plugin, task);
//runTaskLater(task, 1);
//getGlobalScheduler().run(EsToolsBukkit.plugin, (t) -> task.run());
Bukkit.getScheduler().scheduleSyncDelayedTask(EsToolsBukkit.plugin, task, 1);
}

public static EsCommandSender fromBukkitCommandSender(org.bukkit.command.CommandSender sender) {
if (sender instanceof Player) {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaPlayer((Player) sender);
}

if (sender instanceof LivingEntity) {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaLivingEntity((org.bukkit.entity.LivingEntity) sender);
}

if (sender instanceof Entity) {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaEntity((org.bukkit.entity.Entity) sender);
}

if (sender instanceof ConsoleCommandSender) {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaConsoleSender((ConsoleCommandSender) sender);
}

if (sender instanceof BlockCommandSender) {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaCommandBlockSender((BlockCommandSender) sender);
}

throw new RuntimeException("Unrecognised command sender");
}

public static CommandSender toBukkitCommandSender(EsCommandSender sender) {
if (sender instanceof EsPlayer) {
return ((net.serble.estools.ServerApi.Implementations.Folia.FoliaPlayer) sender).getBukkitPlayer();
}

if (sender instanceof EsLivingEntity) {
return ((net.serble.estools.ServerApi.Implementations.Folia.FoliaLivingEntity) sender).getBukkitEntity();
}

if (sender instanceof EsEntity) {
return ((net.serble.estools.ServerApi.Implementations.Folia.FoliaEntity) sender).getBukkitEntity();
}

if (sender instanceof EsConsoleSender) {
return Bukkit.getConsoleSender();
}

if (sender instanceof EsCommandBlockSender) {
return ((net.serble.estools.ServerApi.Implementations.Folia.FoliaCommandBlockSender) sender).getBukkitSender();
}

throw new RuntimeException("Unrecognised command sender");
}

public static EsEntity fromBukkitEntity(org.bukkit.entity.Entity entity) {
if (entity instanceof org.bukkit.entity.LivingEntity) {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaLivingEntity((LivingEntity) entity);
}

return new net.serble.estools.ServerApi.Implementations.Folia.FoliaEntity(entity);
}

public static EsBlock fromBukkitBlock(Block block) {
BlockState state = block.getState();

if (state instanceof Sign) {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaSign((Sign) state);
}

return new net.serble.estools.ServerApi.Implementations.Folia.FoliaBlock(state);
}

@SuppressWarnings("deprecation")
public static Enchantment getBukkitEnchantment(String name) {
if (Main.minecraftVersion.getMinor() >= 13) {
Enchantment ench = Registry.ENCHANTMENT.get(NamespacedKey.minecraft(name));
if (ench == null) {
// Dump info and throw
Bukkit.getLogger().severe("Failed to find enchantment: " + name);
for (Enchantment e : Registry.ENCHANTMENT) {
Bukkit.getLogger().severe("This exists: " + e.getName());
}
throw new RuntimeException("Could not find enchantment: " + name);
}
}

// We have to use deprecated method for pre 1.13
return Enchantment.getByName(FoliaEnchantmentsHelper.getByName(name));
}

public static EsBlock fromBukkitBlock(BlockState block) {
if (block instanceof Sign) {
return new FoliaSign((Sign) block);
}

return new FoliaBlock(block);
}

public static boolean isFolia() {
try {
Class.forName("io.papermc.paper.threadedregions.RegionizedServer");
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitInventory;
import net.serble.estools.ServerApi.Interfaces.EsItemStack;
import org.bukkit.inventory.Inventory;

public class FoliaInventory extends BukkitInventory {
private final Inventory bukkitInv;

public FoliaInventory(Inventory inv) {
super(inv);
bukkitInv = inv;
}

@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] = new FoliaItemStack(bukkitItems[i]);
}
return items;
}

@Override
public EsItemStack getItem(int slot) {
return new FoliaItemStack(bukkitInv.getItem(slot));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitItemMeta;
import net.serble.estools.ServerApi.Interfaces.EsPersistentDataContainer;
import org.bukkit.inventory.meta.ItemMeta;

public class FoliaItemMeta extends BukkitItemMeta {
private final ItemMeta bukkitMeta;

public FoliaItemMeta(ItemMeta meta) {
super(meta);
bukkitMeta = meta;
}

@Override
public EsPersistentDataContainer getPersistentDataContainer() {
return new FoliaPersistentDataContainer(bukkitMeta.getPersistentDataContainer());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitItemStack;
import net.serble.estools.ServerApi.Interfaces.EsItemMeta;
import org.bukkit.Material;

public class FoliaItemStack extends BukkitItemStack {
private final org.bukkit.inventory.ItemStack bukkitItem;

public FoliaItemStack(String mat, int amount) {
super(mat, amount);
bukkitItem = new org.bukkit.inventory.ItemStack(Material.valueOf(mat), amount);
}

public FoliaItemStack(org.bukkit.inventory.ItemStack child) {
super(child);
bukkitItem = child;
}

@Override
public EsItemMeta getItemMeta() {
return new FoliaItemMeta(bukkitItem.getItemMeta());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.Main;
import net.serble.estools.ServerApi.Interfaces.EsLivingEntity;
import net.serble.estools.ServerApi.Interfaces.EsWorld;
import org.bukkit.Bukkit;
import org.bukkit.Registry;
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;

// Can't extend BukkitEntity because it needs to extend FoliaEntity for it to work
public class FoliaLivingEntity extends FoliaEntity implements EsLivingEntity {
private final org.bukkit.entity.LivingEntity bukkitEntity;

public FoliaLivingEntity(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(String effect, int duration, int amplifier) {
bukkitEntity.addPotionEffect(new PotionEffect(Objects.requireNonNull(Registry.EFFECT.match(effect)), duration, amplifier));
}

@Override
public void removePotionEffect(String effect) {
bukkitEntity.removePotionEffect(Objects.requireNonNull(Registry.EFFECT.match(effect)));
}

@SuppressWarnings("deprecation") // Gotta love backwards compatibility
@Override
public List<String> getActivePotionEffects() {
Collection<PotionEffect> bukkitEffects = bukkitEntity.getActivePotionEffects();
List<String> out = new ArrayList<>();
for (PotionEffect eff : bukkitEffects) {
out.add(eff.getType().getName());
}
return out;
}

@Override
public EsWorld getWorld() {
return new FoliaWorld(bukkitEntity.getWorld());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitLogger;

public class FoliaLogger extends BukkitLogger { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitPersistentDataContainer;
import org.bukkit.persistence.PersistentDataContainer;

public class FoliaPersistentDataContainer extends BukkitPersistentDataContainer {
private final PersistentDataContainer bukkitContainer;

public FoliaPersistentDataContainer(PersistentDataContainer container) {
super(container);
bukkitContainer = container;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.Main;
import net.serble.estools.ServerApi.EsGameMode;
import net.serble.estools.ServerApi.EsLocation;
import net.serble.estools.ServerApi.Interfaces.*;
import org.bukkit.Bukkit;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.entity.LivingEntity;
import org.jetbrains.annotations.Nullable;

import java.util.HashSet;
import java.util.Objects;

// Can't extend BukkitEntity because it needs to extend FoliaLivingEntity for it to work
public class FoliaPlayer extends FoliaLivingEntity implements EsPlayer {
private final org.bukkit.entity.Player bukkitPlayer;

public FoliaPlayer(org.bukkit.entity.Player entity) {
super(entity);
bukkitPlayer = entity;
}

public org.bukkit.entity.Player getBukkitPlayer() {
return bukkitPlayer;
}

@Override
public int getFoodLevel() {
return bukkitPlayer.getFoodLevel();
}

@Override
public void setFoodLevel(int val) {
bukkitPlayer.setFoodLevel(val);
}

@Override
public double getSaturation() {
return bukkitPlayer.getSaturation();
}

@Override
public void setSaturation(double val) {
bukkitPlayer.setSaturation((float) val);
}

@Override
public EsItemStack getMainHand() {
return new FoliaItemStack(bukkitGetMainHand());
}

@Override
public void setMainHand(EsItemStack item) {
setMainHandBukkit(bukkitPlayer, ((FoliaItemStack) item).getBukkitItem());
}

@Override
public void openInventory(EsInventory inv) {
bukkitPlayer.openInventory(((FoliaInventory) inv).getBukkitInventory());
}

@Override
public void closeInventory() {
bukkitPlayer.closeInventory();
}

@Override
public EsPlayerInventory getInventory() {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaPlayerInventory(bukkitPlayer.getInventory());
}

@Override
public void setFlySpeed(float val) {
bukkitPlayer.setFlySpeed(val);
}

@Override
public void setWalkSpeed(float val) {
bukkitPlayer.setWalkSpeed(val);
}

@Override
public void setGameMode(EsGameMode mode) {
bukkitPlayer.setGameMode(FoliaHelper.toBukkitGameMode(mode));
}

@Override
public EsGameMode getGameMode() {
return FoliaHelper.fromBukkitGameMode(bukkitPlayer.getGameMode());
}

@Override
public @Nullable EsBlock getTargetBlock() {
return FoliaHelper.fromBukkitBlock(Objects.requireNonNull(bukkitGetTargetBlock()).getState());
}

@Override
public boolean getAllowFlight() {
return bukkitPlayer.getAllowFlight();
}

@Override
public void setAllowFlight(boolean val) {
bukkitPlayer.setAllowFlight(val);
}

@Override
public boolean isFlying() {
return bukkitPlayer.isFlying();
}

@Override
public void playSound(String sound, EsLocation loc, int volume, int pitch) {
bukkitPlayer.playSound(FoliaHelper.toBukkitLocation(loc), Sound.valueOf(sound), volume, pitch);
}

@SuppressWarnings("UnstableApiUsage") // Yes I know it's a bug
@Override
public void updateInventory() {
bukkitPlayer.updateInventory();
}

private Block bukkitGetTargetBlock() {
if (Main.minecraftVersion.getMinor() > 12) {
return bukkitPlayer.getTargetBlockExact(5);
} else if (Main.minecraftVersion.getMinor() > 7) {
return bukkitPlayer.getTargetBlock(null, 5);
} else {
try {
//noinspection JavaReflectionMemberAccess
return (Block) LivingEntity.class.getMethod("getTargetBlock", HashSet.class, int.class).invoke(bukkitPlayer, null, 5);
}
catch (Exception e) {
Bukkit.getLogger().severe(e.toString());
return null;
}
}
}

private org.bukkit.inventory.ItemStack bukkitGetMainHand() {
if (Main.minecraftVersion.getMinor() > 8) {
return bukkitPlayer.getInventory().getItemInMainHand();
} else {
//noinspection deprecation
return bukkitPlayer.getInventory().getItemInHand();
}
}

private void setMainHandBukkit(org.bukkit.entity.Player p, org.bukkit.inventory.ItemStack is) {
if (Main.minecraftVersion.getMinor() > 8) {
p.getInventory().setItemInMainHand(is);
} else {
//noinspection deprecation
p.getInventory().setItemInHand(is);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Interfaces.EsItemStack;
import net.serble.estools.ServerApi.Interfaces.EsPlayerInventory;
import org.bukkit.inventory.PlayerInventory;

public class FoliaPlayerInventory extends FoliaInventory implements EsPlayerInventory {
private final PlayerInventory bukkitInv;

public FoliaPlayerInventory(PlayerInventory inv) {
super(inv);
bukkitInv = inv;
}

@Override
public PlayerInventory getBukkitInventory() {
return bukkitInv;
}

@Override
public EsItemStack getOffHand() {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaItemStack(bukkitInv.getItemInOffHand());
}

@Override
public EsItemStack getMainHand() {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaItemStack(bukkitInv.getItemInMainHand());
}

@Override
public EsItemStack getHelmet() {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaItemStack(bukkitInv.getHelmet());
}

@Override
public EsItemStack getLeggings() {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaItemStack(bukkitInv.getLeggings());
}

@Override
public EsItemStack getChestplate() {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaItemStack(bukkitInv.getChestplate());
}

@Override
public EsItemStack getBoots() {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaItemStack(bukkitInv.getBoots());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,256 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.Effects;
import net.serble.estools.Main;
import net.serble.estools.SemanticVersion;
import net.serble.estools.ServerApi.EsPotType;
import net.serble.estools.ServerApi.Interfaces.*;
import org.bukkit.*;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;

import java.io.File;
import java.util.*;

public class FoliaServer implements EsServerSoftware {
private final JavaPlugin plugin;

public FoliaServer(Object pluginObj) {
plugin = (JavaPlugin) pluginObj;
}

@Override
public EsPlayer getPlayer(String name) {
Player p = Bukkit.getPlayer(name);
if (p == null) {
return null;
}
return new FoliaPlayer(p);
}

@Override
public EsEntity getEntity(UUID uuid) {
if (Main.minecraftVersion.getMinor() > 11) {
Entity entity = Bukkit.getEntity(uuid);
if (entity == null) {
return null;
}
return new FoliaEntity(entity);
}

for (World world : Bukkit.getWorlds()) {
for (Entity entity : world.getEntities()) {
if (entity.getUniqueId() == uuid) {
return new FoliaEntity(entity);
}
}
}

return null;
}

@Override
public SemanticVersion getVersion() { // Parse the minecraft version from the Bukkit version string
String versionS = Bukkit.getVersion();
int minor = 0;
int patch = 0;

if (versionS.contains("(MC: ")) {
int posOfMC = versionS.indexOf("(MC: ") + 5;
versionS = versionS.substring(posOfMC, versionS.indexOf(')', posOfMC));
} else {
Main.logger.warning("Could not detect version from: " + versionS);
throw new RuntimeException("Could not detect version");
}

for (int i = 0; i < 99; i++) {
if (versionS.contains("1." + i)) {
minor = i;
}
}

for (int i = 0; i < 99; i++) {
if (versionS.contains("1." + minor + '.' + i)) {
patch = i;
}
}

Main.logger.info("Version detected as: 1." + minor + '.' + patch + " from: " + versionS);
return new SemanticVersion(1, minor, patch);
}

@Override
public Collection<? extends EsPlayer> getOnlinePlayers() {
try {
if (Bukkit.class.getMethod("getOnlinePlayers").getReturnType() == Collection.class) {
List<EsPlayer> players = new ArrayList<>();
for (org.bukkit.entity.Player p : Bukkit.getOnlinePlayers()) {
players.add(new FoliaPlayer(p));
}
return players;
}
else {
org.bukkit.entity.Player[] players = (org.bukkit.entity.Player[]) Bukkit.class.getMethod("getOnlinePlayers").invoke(null, new Object[0]);
List<EsPlayer> users = new ArrayList<>();
for (org.bukkit.entity.Player p : players) {
users.add(new FoliaPlayer(p));
}
return users;
}

} catch (Exception e) {
Bukkit.getLogger().severe(e.toString());
return new ArrayList<>();
}
}

@Override
public EsItemStack createItemStack(String material, int amount) {
return new FoliaItemStack(material, amount);
}

@SuppressWarnings("deprecation")
@Override
public EsItemStack createPotion(EsPotType potType, String effect, int duration, int amp, int amount) {
if (Main.minecraftVersion.getMinor() >= 9) {
String type = potType == EsPotType.drink ?
"POTION" :
potType.toString().toUpperCase() + "_POTION";
ItemStack pot = new ItemStack(Material.valueOf(type), amount);

String effType;
try {
effType = Effects.getByName(effect);
} catch (IllegalArgumentException e) {
return null;
}

PotionMeta meta = (PotionMeta) pot.getItemMeta();
assert meta != null;
meta.addCustomEffect(new PotionEffect(Objects.requireNonNull(Registry.EFFECT.match(effType)), duration, amp-1), true);
pot.setItemMeta(meta);
return new FoliaItemStack(pot);
} else if (Main.minecraftVersion.getMinor() >= 4) {
String effType;
try {
effType = Effects.getPotionByName(effect);
} catch (IllegalArgumentException e) {
return null;
}

org.bukkit.potion.Potion potion = new org.bukkit.potion.Potion(Objects.requireNonNull(Registry.POTION.match(effType)), amp);
potion.setSplash(potType == EsPotType.splash);
return new FoliaItemStack(potion.toItemStack(1));
} else { // This isn't possible to get to because this class won't load on 1.3 and below
return null;
}
}

@Override
public EsInventory createInventory(EsPlayer owner, int size, String title) {
InventoryHolder holder = owner == null ? null : ((FoliaPlayer) owner).getBukkitPlayer();
return new FoliaInventory(Bukkit.createInventory(holder, size, title));
}

@SuppressWarnings("deprecation")
@Override
public String[] getPotionEffectTypes() {
// We need to use the deprecated .values() method because Registry doesn't exist in old versions
PotionEffectType[] effectTypes = PotionEffectType.values();
String[] out = new String[effectTypes.length];
for (int i = 0; i < effectTypes.length; i++) {
out[i] = effectTypes[i].getName(); // Same reason as above for deprecated method
}
return out;
}

@Override
public String[] getEnchantments() {
if (Main.minecraftVersion.getMinor() > 12) {
String[] out = new String[(int) Registry.ENCHANTMENT.stream().count()];
int i = 0;
for (Enchantment e : Registry.ENCHANTMENT) {
out[i] = e.getKey().getKey();
i++;
}
return out;
}

// Pre 1.13, we need to use the helper to get all the keys
Set<Map.Entry<String, String>> enchSet = FoliaEnchantmentsHelper.entrySet();
String[] enchs = new String[enchSet.size()];
int i = 0;
for (Map.Entry<String, String> enchEntry : enchSet) {
enchs[i] = enchEntry.getKey();
i++;
}

return enchs;
}

@Override
public String[] getSounds() {
Sound[] sounds = Sound.values();
String[] strSounds = new String[sounds.length];
for (int i = 0; i < sounds.length; i++) {
strSounds[i] = sounds[i].name();
}
return strSounds;
}

@Override
public boolean doesEnchantmentExist(String name) {
try {
return FoliaHelper.getBukkitEnchantment(name) != null;
} catch (Exception e) {
return false;
}
}

@Override
public File getDataFolder() {
return plugin.getDataFolder();
}

@Override
public void dispatchCommand(EsCommandSender sender, String cmd) {
FoliaHelper.runSync(() -> Bukkit.dispatchCommand(FoliaHelper.toBukkitCommandSender(sender), cmd));
}

@Override
public EsCommandSender getConsoleSender() {
return null;
}

@Override
public SemanticVersion getPluginVersion() {
return new SemanticVersion(plugin.getDescription().getVersion());
}

@Override
public String getPluginName() {
return plugin.getDescription().getName();
}

@Override
public void runTaskLater(Runnable task, long ticks) {
FoliaHelper.runTaskLater(task, ticks);
}

@Override
public void runTask(Runnable task) {
FoliaHelper.runTaskOnNextTick(task);
}

@Override
public EsLogger getLogger() {
return new FoliaLogger();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import net.serble.estools.ServerApi.Interfaces.EsSign;
import net.serble.estools.ServerApi.Interfaces.EsSignSide;
import org.bukkit.block.Sign;

public class FoliaSign extends net.serble.estools.ServerApi.Implementations.Folia.FoliaBlock implements EsSign {
private final Sign bukkitSign;

public FoliaSign(Sign block) {
super(block);
bukkitSign = block;
}

@Override
public void update() {
bukkitSign.update();
}

@SuppressWarnings("deprecation") // Method is version specific
@Override
public void setGlowingText(boolean glowing) {
bukkitSign.setGlowingText(glowing);
}

@SuppressWarnings("deprecation") // Method is version specific
@Override
public boolean isGlowingText() {
return bukkitSign.isGlowingText();
}

@SuppressWarnings("deprecation") // Method is version specific
@Override
public void setLine(int line, String text) {
bukkitSign.setLine(line, text);
}

@Override
public EsSignSide getTargetSide(EsPlayer player) {
return new net.serble.estools.ServerApi.Implementations.Folia.FoliaSignSide(bukkitSign.getTargetSide(((net.serble.estools.ServerApi.Implementations.Folia.FoliaPlayer) player).getBukkitPlayer()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitSignSide;
import org.bukkit.block.sign.SignSide;

public class FoliaSignSide extends BukkitSignSide {
private final SignSide bukkitSide;

public FoliaSignSide(SignSide side) {
super(side);
this.bukkitSide = side;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package net.serble.estools.ServerApi.Implementations.Folia;

import net.serble.estools.ServerApi.EsLocation;
import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitWorld;
import net.serble.estools.ServerApi.Interfaces.EsEntity;
import org.bukkit.World;
import org.bukkit.entity.Entity;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class FoliaWorld extends BukkitWorld {
private final org.bukkit.World bukkitWorld;

public FoliaWorld(World world) {
super(world);
bukkitWorld = world;
}

@Override
public List<EsEntity> getEntities() {
List<org.bukkit.entity.Entity> bEntities = bukkitWorld.getEntities();
List<EsEntity> entities = new ArrayList<>();
for (org.bukkit.entity.Entity bEntity : bEntities) {
entities.add(FoliaHelper.fromBukkitEntity(bEntity));
}
return entities;
}

@Override
public List<EsEntity> getNearbyEntities(EsLocation loc, double xoff, double yoff, double zoff) {
Collection<Entity> bEntities = bukkitWorld.getNearbyEntities(FoliaHelper.toBukkitLocation(loc), xoff, yoff, zoff);
List<EsEntity> entities = new ArrayList<>();
for (org.bukkit.entity.Entity bEntity : bEntities) {
entities.add(FoliaHelper.fromBukkitEntity(bEntity));
}
return entities;
}

@Override
public void setTime(long time) {
FoliaHelper.runTaskOnNextTick(() -> bukkitWorld.setTime(time));
}

@Override
public void setStorming(boolean val) {
FoliaHelper.runTaskOnNextTick(() -> bukkitWorld.setStorm(false));
}

@Override
public void setThundering(boolean val) {
FoliaHelper.runTaskOnNextTick(() -> bukkitWorld.setThundering(val));
}

@Override
public void strikeLightning(EsLocation loc) {
bukkitWorld.strikeLightning(FoliaHelper.toBukkitLocation(loc));
}
}
Original file line number Diff line number Diff line change
@@ -25,5 +25,6 @@ public interface EsServerSoftware {
SemanticVersion getPluginVersion();
String getPluginName();
void runTaskLater(Runnable task, long ticks);
void runTask(Runnable task);
EsLogger getLogger();
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.serble.estools.ServerApi;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitServer;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaServer;
import net.serble.estools.ServerApi.Interfaces.EsServerSoftware;

public enum ServerPlatform {
@@ -12,6 +13,9 @@ public EsServerSoftware getServerInstance(Object context) {
case Bukkit:
return new BukkitServer(context);

case Folia:
return new FoliaServer(context);

default:
throw new IllegalArgumentException("Unsupported server software");
}
4 changes: 2 additions & 2 deletions src/main/java/net/serble/estools/Signs/Balance.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package net.serble.estools.Signs;

import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitPlayer;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaPlayer;
import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import net.serble.estools.Vault;

public class Balance extends SignType {

@Override
public void run(EsPlayer p, String[] lines) {
send(p, "&aYour current balance is &6$%s", String.valueOf(Vault.economy.getBalance(((BukkitPlayer)p).getBukkitPlayer())));
send(p, "&aYour current balance is &6$%s", String.valueOf(Vault.economy.getBalance(((FoliaPlayer)p).getBukkitPlayer())));
}
}
4 changes: 2 additions & 2 deletions src/main/java/net/serble/estools/Signs/SignMain.java
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@

import net.serble.estools.Entrypoints.EsToolsBukkit;
import net.serble.estools.EsToolsCommand;
import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitPlayer;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaPlayer;
import org.bukkit.Bukkit;
import org.bukkit.block.Sign;
import org.bukkit.event.EventHandler;
@@ -45,7 +45,7 @@ public void interact(PlayerInteractEvent e) {

if (signType != null) {
e.setCancelled(true);
signType.run(new BukkitPlayer(e.getPlayer()), state.getLines());
signType.run(new FoliaPlayer(e.getPlayer()), state.getLines());
}
}
}
9 changes: 4 additions & 5 deletions src/main/java/net/serble/estools/Vault.java
Original file line number Diff line number Diff line change
@@ -2,10 +2,9 @@

import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse;
import net.serble.estools.ServerApi.Implementations.Bukkit.BukkitPlayer;
import net.serble.estools.ServerApi.Implementations.Folia.FoliaPlayer;
import net.serble.estools.ServerApi.Interfaces.EsPlayer;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.RegisteredServiceProvider;

public class Vault {
@@ -42,12 +41,12 @@ public static boolean takeMoney(double price, EsPlayer p) {
return false;
}

if (Vault.economy.getBalance(((BukkitPlayer) p).getBukkitPlayer()) < price) {
if (Vault.economy.getBalance(((FoliaPlayer) p).getBukkitPlayer()) < price) {
EsToolsCommand.send(p, "&cYou do not have enough money to purchase this item.");
return false;
}

Vault.economy.withdrawPlayer(((BukkitPlayer) p).getBukkitPlayer(), price);
Vault.economy.withdrawPlayer(((FoliaPlayer) p).getBukkitPlayer(), price);
return true;
}

@@ -57,7 +56,7 @@ public static boolean payMoney(double price, EsPlayer p) {
return false;
}

EconomyResponse economyResponse = Vault.economy.depositPlayer(((BukkitPlayer) p).getBukkitPlayer(), price);
EconomyResponse economyResponse = Vault.economy.depositPlayer(((FoliaPlayer) p).getBukkitPlayer(), price);
return economyResponse.transactionSuccess();
}
}