Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ jobs:
spigot
paper
purpur
folia
game-versions: |
1.16.5
1.17.1
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ jobs:
spigot
paper
purpur
folia
game-versions: |
1.16.5
1.17.1
Expand Down
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ allprojects {
maven { url 'https://libraries.minecraft.net/' }
maven { url 'https://api.modrinth.com/maven' }
maven { url 'https://repo.papermc.io/repository/maven-public/' }
maven { url 'https://mvn-repo.arim.space/lesser-gpl3/' }
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
maven { url 'https://repo.spongepowered.org/repository/maven-public/' }
maven { url 'https://repo.extendedclip.com/content/repositories/placeholderapi/' }
Expand Down
4 changes: 3 additions & 1 deletion bukkit/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ dependencies {

implementation 'org.bstats:bstats-bukkit:3.0.2'
implementation 'io.papermc:paperlib:1.0.8'
implementation 'space.arim.morepaperlib:morepaperlib:0.4.2'
implementation 'me.lucko:commodore:2.2'
implementation 'net.kyori:adventure-platform-bukkit:4.3.0'

Expand All @@ -12,7 +13,7 @@ dependencies {
compileOnly 'net.william278:Annotaml:2.0.1'
compileOnly 'net.william278:DesertWell:2.0.2'
compileOnly 'com.github.MilkBowl:VaultAPI:1.7.1'
compileOnly 'com.github.Emibergo02:RedisEconomy:4.0-SNAPSHOT'
compileOnly 'com.github.Emibergo02:RedisEconomy:master-SNAPSHOT'
compileOnly 'me.clip:placeholderapi:2.11.3'

testImplementation 'com.github.seeseemelk:MockBukkit-v1.16:1.5.2'
Expand Down Expand Up @@ -46,5 +47,6 @@ shadowJar {
relocate 'net.kyori', 'net.william278.huskhomes.libraries'
relocate 'org.bstats', 'net.william278.huskhomes.libraries.bstats'
relocate 'io.papermc.lib', 'net.william278.huskhomes.libraries.paperlib'
relocate 'space.arim.morepaperlib', 'net.william278.huskhomes.libraries.paperlib'
relocate 'me.lucko.commodore', 'net.william278.huskhomes.libraries.commodore'
}
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,15 @@
import org.bukkit.plugin.messaging.PluginMessageListener;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import space.arim.morepaperlib.MorePaperLib;
import space.arim.morepaperlib.scheduling.GracefulScheduling;
import space.arim.morepaperlib.scheduling.ScheduledTask;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.stream.Collectors;

Expand All @@ -76,6 +80,7 @@ public class BukkitHuskHomes extends JavaPlugin implements HuskHomes, BukkitTask
* Metrics ID for <a href="https://bstats.org/plugin/bukkit/HuskHomes/8430">HuskHomes on Bukkit</a>.
*/
private static final int METRICS_ID = 8430;
private ConcurrentHashMap<Integer, ScheduledTask> tasks;
private Set<SavedUser> savedUsers;
private Settings settings;
private Locales locales;
Expand All @@ -94,6 +99,7 @@ public class BukkitHuskHomes extends JavaPlugin implements HuskHomes, BukkitTask
@Nullable
private Broker broker;
private BukkitAudiences audiences;
private MorePaperLib paperLib;

private static BukkitHuskHomes instance;

Expand Down Expand Up @@ -122,6 +128,8 @@ public void onLoad() {
public void onEnable() {
// Create adventure audience
this.audiences = BukkitAudiences.create(this);
this.paperLib = new MorePaperLib(this);
this.tasks = new ConcurrentHashMap<>();
this.savedUsers = new HashSet<>();
this.globalPlayerList = new HashMap<>();
this.currentlyOnWarmup = new HashSet<>();
Expand Down Expand Up @@ -460,10 +468,21 @@ && getSettings().getBrokerType() == Broker.Type.PLUGIN_MESSAGE) {
}
}

@Override
@NotNull
public GracefulScheduling getScheduler() {
return paperLib.scheduling();
}

@Override
@NotNull
public ConcurrentHashMap<Integer, ScheduledTask> getTasks() {
return tasks;
}

@Override
@NotNull
public HuskHomes getPlugin() {
return this;
}

}
24 changes: 15 additions & 9 deletions bukkit/src/main/java/net/william278/huskhomes/user/BukkitUser.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import net.william278.huskhomes.position.Position;
import net.william278.huskhomes.teleport.TeleportationException;
import net.william278.huskhomes.util.BukkitAdapter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.metadata.MetadataValue;
Expand All @@ -35,6 +34,7 @@

import java.util.Map;
import java.util.Optional;
import java.util.logging.Level;
import java.util.stream.Collectors;

/**
Expand Down Expand Up @@ -65,7 +65,7 @@ public static BukkitUser adapt(@NotNull Player player) {
@Override
public Position getPosition() {
return Position.at(BukkitAdapter.adaptLocation(player.getLocation())
.orElseThrow(() -> new IllegalStateException("Failed to get the position of a BukkitPlayer (null)")),
.orElseThrow(() -> new IllegalStateException("Failed to get the position of a BukkitPlayer (null)")),
plugin.getServerName());

}
Expand Down Expand Up @@ -105,23 +105,29 @@ public Audience getAudience() {

@Override
public void teleportLocally(@NotNull Location location, boolean asynchronous) throws TeleportationException {
// Ensure the world exists
final Optional<org.bukkit.Location> resolvedLocation = BukkitAdapter.adaptLocation(location);
if (resolvedLocation.isEmpty() || resolvedLocation.get().getWorld() == null) {
throw new TeleportationException(TeleportationException.Type.WORLD_NOT_FOUND);
}

// Ensure the coordinates are within the world limits
final org.bukkit.Location bukkitLocation = resolvedLocation.get();
if (!bukkitLocation.getWorld().getWorldBorder().isInside(resolvedLocation.get())) {
throw new TeleportationException(TeleportationException.Type.ILLEGAL_TARGET_COORDINATES);
}

Bukkit.getScheduler().runTask(plugin, () -> {
if (asynchronous) {
PaperLib.teleportAsync(player, bukkitLocation, PlayerTeleportEvent.TeleportCause.PLUGIN);
} else {
player.teleport(bukkitLocation, PlayerTeleportEvent.TeleportCause.PLUGIN);
}
});
// Run on the appropriate thread scheduler for this platform
plugin.getScheduler().entitySpecificScheduler(player).run(
() -> {
if (asynchronous || plugin.getScheduler().isUsingFolia()) {
PaperLib.teleportAsync(player, bukkitLocation, PlayerTeleportEvent.TeleportCause.PLUGIN);
return;
}
player.teleport(bukkitLocation, PlayerTeleportEvent.TeleportCause.PLUGIN);
},
() -> plugin.getLogger().log(Level.WARNING, "User offline when teleporting: " + player.getName())
);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,54 +19,76 @@

package net.william278.huskhomes.util;

import net.william278.huskhomes.BukkitHuskHomes;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.NotNull;
import space.arim.morepaperlib.scheduling.GracefulScheduling;
import space.arim.morepaperlib.scheduling.ScheduledTask;

import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;

public interface BukkitTaskRunner extends TaskRunner {

@Override
default int runAsync(@NotNull Runnable runnable) {
return Bukkit.getScheduler().runTaskAsynchronously((BukkitHuskHomes) getPlugin(), runnable).getTaskId();
final int taskId = getTasks().size();
getTasks().put(taskId, getScheduler().asyncScheduler().run(runnable));
return taskId;
}

@Override
default <T> CompletableFuture<T> supplyAsync(@NotNull Supplier<T> supplier) {
final CompletableFuture<T> future = new CompletableFuture<>();
Bukkit.getScheduler().runTaskAsynchronously((BukkitHuskHomes) getPlugin(),
() -> future.complete(supplier.get()));
getScheduler().asyncScheduler().run(() -> future.complete(supplier.get()));
return future;
}

@Override
default void runSync(@NotNull Runnable runnable) {
Bukkit.getScheduler().runTask((BukkitHuskHomes) getPlugin(), runnable).getTaskId();
getScheduler().globalRegionalScheduler().run(runnable);
}

@Override
default int runAsyncRepeating(@NotNull Runnable runnable, long period) {
AtomicInteger taskId = new AtomicInteger();
taskId.set(Bukkit.getScheduler().runTaskTimerAsynchronously((BukkitHuskHomes) getPlugin(),
runnable, 0, period).getTaskId());
return taskId.get();
final int taskId = getTasks().size();
getTasks().put(taskId, getScheduler().asyncScheduler().runAtFixedRate(
runnable,
Duration.ZERO,
getDurationTicks(period)
));
return taskId;
}

@Override
default void runLater(@NotNull Runnable runnable, long delay) {
Bukkit.getScheduler().runTaskLater((BukkitHuskHomes) getPlugin(), runnable, delay).getTaskId();
getScheduler().asyncScheduler().runDelayed(runnable, getDurationTicks(delay));
}

@Override
default void cancelTask(int taskId) {
Bukkit.getScheduler().cancelTask(taskId);
if (getTasks().containsKey(taskId)) {
getTasks().get(taskId).cancel();
}
}

@Override
default void cancelAllTasks() {
Bukkit.getScheduler().cancelTasks((BukkitHuskHomes) getPlugin());
getTasks().values().forEach(ScheduledTask::cancel);
getTasks().clear();
getScheduler().cancelGlobalTasks();
}

@NotNull
GracefulScheduling getScheduler();

@NotNull
ConcurrentHashMap<Integer, ScheduledTask> getTasks();

@NotNull
default Duration getDurationTicks(long ticks) {
return Duration.of(ticks * 50, ChronoUnit.MILLIS);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,22 @@
import java.util.function.Supplier;

public interface TaskRunner {

int runAsync(@NotNull Runnable runnable);

<T> CompletableFuture<T> supplyAsync(@NotNull Supplier<T> supplier);

void runSync(@NotNull Runnable runnable);

int runAsyncRepeating(@NotNull Runnable runnable, long delay);

void runLater(@NotNull Runnable runnable, long delay);

void cancelTask(int taskId);

void cancelAllTasks();

@NotNull
HuskHomes getPlugin();

}
1 change: 1 addition & 0 deletions paper/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ shadowJar {
relocate 'net.kyori', 'net.william278.huskhomes.libraries'
relocate 'org.bstats', 'net.william278.huskhomes.libraries.bstats'
relocate 'io.papermc.lib', 'net.william278.huskhomes.libraries.paperlib'
relocate 'space.arim.morepaperlib', 'net.william278.huskhomes.libraries.paperlib'
relocate 'me.lucko.commodore', 'net.william278.huskhomes.libraries.commodore'
}

Expand Down
1 change: 1 addition & 0 deletions paper/src/main/resources/paper-plugin.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ main: 'net.william278.huskhomes.PaperHuskHomes'
loader: 'net.william278.huskhomes.PaperHuskHomesLoader'
version: '${version}'
api-version: 1.19
folia-supported: true
dependencies:
- name: Vault
required: false
Expand Down