Skip to content

Commit

Permalink
chore: remove hard depend on bukkit scheduler to support folia
Browse files Browse the repository at this point in the history
  • Loading branch information
derklaro committed Apr 7, 2023
1 parent 74c7d19 commit c977006
Show file tree
Hide file tree
Showing 5 changed files with 194 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,10 @@
import com.github.juliarn.npclib.api.Platform;
import com.github.juliarn.npclib.api.log.PlatformLogger;
import com.github.juliarn.npclib.bukkit.protocol.BukkitProtocolAdapter;
import com.github.juliarn.npclib.bukkit.util.BukkitPlatformUtil;
import com.github.juliarn.npclib.common.platform.CommonPlatform;
import com.github.juliarn.npclib.common.platform.CommonPlatformBuilder;
import com.github.juliarn.npclib.common.task.AsyncPlatformTaskManager;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
Expand All @@ -54,7 +56,11 @@ protected void prepareBuild() {

// set the default task manager
if (this.taskManager == null) {
this.taskManager = BukkitPlatformTaskManager.taskManager(this.extension);
if (BukkitPlatformUtil.runsOnFolia()) {
this.taskManager = AsyncPlatformTaskManager.taskManager(this.extension.getName());
} else {
this.taskManager = BukkitPlatformTaskManager.taskManager(this.extension);
}
}

// set the default version accessor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,23 @@

import com.github.juliarn.npclib.api.Npc;
import com.github.juliarn.npclib.api.Position;
import com.github.juliarn.npclib.common.util.ClassHelper;
import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;

public final class BukkitPlatformUtil {

private static final boolean FOLIA =
ClassHelper.classExists("io.papermc.paper.threadedregions.RegionizedServerInitEvent");

private BukkitPlatformUtil() {
throw new UnsupportedOperationException();
}

public static boolean runsOnFolia() {
return FOLIA;
}

public static double distance(@NotNull Npc<?, ?, ?, ?> npc, @NotNull Location location) {
Position pos = npc.position();
return square(location.getX() - pos.x()) + square(location.getY() - pos.y()) + square(location.getZ() - pos.z());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* This file is part of npc-lib, licensed under the MIT License (MIT).
*
* Copyright (c) 2022-2023 Julian M., Pasqual K. and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

package com.github.juliarn.npclib.common.task;

import com.github.juliarn.npclib.api.PlatformTaskManager;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import org.jetbrains.annotations.NotNull;

public final class AsyncPlatformTaskManager implements PlatformTaskManager {

private static final long ONE_TICK_MS = 1000 / 20;

private final ExecutorService runOnceExecutorService;
private final ScheduledExecutorService scheduledExecutorService;

private AsyncPlatformTaskManager(@NotNull String extensionId) {
ThreadFactory runOnceThreadFactory = AsyncTaskThreadFactory.create(extensionId + " NPC-Lib Task #%d");
this.runOnceExecutorService = Executors.newCachedThreadPool(runOnceThreadFactory);

ThreadFactory scheduledThreadFactory = AsyncTaskThreadFactory.create(extensionId + " NPC-Lib Scheduled Task #%d");
this.scheduledExecutorService = Executors.newScheduledThreadPool(0, scheduledThreadFactory);
}

public static @NotNull PlatformTaskManager taskManager(@NotNull String extensionIdentifier) {
Objects.requireNonNull(extensionIdentifier, "extensionIdentifier");
return new AsyncPlatformTaskManager(extensionIdentifier);
}

@Override
public void scheduleSync(@NotNull Runnable task) {
this.runOnceExecutorService.execute(task);
}

@Override
public void scheduleDelayedSync(@NotNull Runnable task, int delayTicks) {
this.scheduledExecutorService.schedule(task, delayTicks * ONE_TICK_MS, TimeUnit.MILLISECONDS);
}

@Override
public void scheduleAsync(@NotNull Runnable task) {
this.runOnceExecutorService.execute(task);
}

@Override
public void scheduleDelayedAsync(@NotNull Runnable task, int delayTicks) {
this.scheduledExecutorService.schedule(task, delayTicks * ONE_TICK_MS, TimeUnit.MILLISECONDS);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* This file is part of npc-lib, licensed under the MIT License (MIT).
*
* Copyright (c) 2022-2023 Julian M., Pasqual K. and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

package com.github.juliarn.npclib.common.task;

import java.util.Objects;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicLong;
import org.jetbrains.annotations.NotNull;

final class AsyncTaskThreadFactory implements ThreadFactory {

private final String threadNameFormat;
private final ThreadGroup parentThreadGroup;

private final AtomicLong createdThreadCount = new AtomicLong(0);

private AsyncTaskThreadFactory(@NotNull String threadNameFormat) {
this.threadNameFormat = threadNameFormat;
this.parentThreadGroup = Thread.currentThread().getThreadGroup();
}

public static @NotNull ThreadFactory create(@NotNull String threadNameFormat) {
Objects.requireNonNull(threadNameFormat, "threadNameFormat");
return new AsyncTaskThreadFactory(threadNameFormat);
}

@Override
public @NotNull Thread newThread(@NotNull Runnable runnable) {
// construct the name thread
String threadName = String.format(this.threadNameFormat, this.createdThreadCount.incrementAndGet());
Thread thread = new Thread(this.parentThreadGroup, runnable, threadName, 0);

// set up the thread configuration
thread.setDaemon(true);
thread.setPriority(Thread.NORM_PRIORITY);
return thread;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* This file is part of npc-lib, licensed under the MIT License (MIT).
*
* Copyright (c) 2022-2023 Julian M., Pasqual K. and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

package com.github.juliarn.npclib.common.util;

import org.jetbrains.annotations.NotNull;

public final class ClassHelper {

private ClassHelper() {
throw new UnsupportedOperationException();
}

public static boolean classExists(@NotNull String className) {
try {
ClassLoader classLoader = ClassHelper.class.getClassLoader();
Class.forName(className, false, classLoader);
return true;
} catch (ClassNotFoundException exception) {
return false;
}
}
}

0 comments on commit c977006

Please sign in to comment.