Skip to content
Open
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
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import org.tabooproject.reflex.Reflex.Companion.invokeConstructor
import org.tabooproject.reflex.Reflex.Companion.invokeMethod
import org.tabooproject.reflex.Reflex.Companion.setProperty
import org.tabooproject.reflex.Reflex.Companion.unsafeInstance
import taboolib.common.platform.function.submit
import taboolib.platform.util.submit
import taboolib.common.util.unsafeLazy
import taboolib.library.xseries.XMaterial
import taboolib.platform.util.ItemBuilder
Expand Down Expand Up @@ -255,7 +255,7 @@ class NMSMap(val image: BufferedImage, var hand: Hand = Hand.MAIN, val builder:
}

fun sendTo(player: Player) {
submit(delay = 3) {
player.submit(delay = 3) {
val container = if (MinecraftVersion.isUniversal) {
player.getProperty<Any>("entity/inventoryMenu")
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ import com.google.gson.JsonObject
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.NamespacedKey
import org.bukkit.advancement.Advancement
import org.bukkit.entity.Player
import org.tabooproject.reflex.Reflex.Companion.getProperty
import org.tabooproject.reflex.Reflex.Companion.invokeMethod
import org.tabooproject.reflex.Reflex.Companion.setProperty
import taboolib.common.UnsupportedVersionException
import taboolib.common.platform.function.submit
import taboolib.common.platform.function.warning
import taboolib.common.util.t
import taboolib.common.util.unsafeLazy
Expand All @@ -21,6 +21,8 @@ import taboolib.module.nms.type.Toast
import taboolib.module.nms.type.ToastBackground
import taboolib.module.nms.type.ToastFrame
import taboolib.platform.BukkitPlugin
import taboolib.platform.util.submit
import taboolib.platform.util.submitGlobal
import java.util.*
import java.util.concurrent.ConcurrentHashMap

Expand Down Expand Up @@ -100,47 +102,49 @@ fun Player.sendToast(icon: Material, message: String, frame: ToastFrame = ToastF
}
val cache = Toast(icon, message, frame)
val jsonToast = toJsonToast(icon.invokeMethod<Any>("getKey").toString(), message, frame, background)
// 在主线程操作
submit {
// 向服务器注册成就
val namespaceKey = toastMap.getOrPut(cache) {
injectAdvancement(NamespacedKey(BukkitPlugin.getInstance(), "toast_${UUID.randomUUID()}"), jsonToast)
// 服务端成就注册必须在全局线程执行
submitGlobal {
val namespaceKey = toastMap.compute(cache) { _, cachedKey ->
if (cachedKey == null || Bukkit.getAdvancement(cachedKey) == null) {
injectAdvancement(NamespacedKey(BukkitPlugin.getInstance(), "toast_${UUID.randomUUID()}"), jsonToast)
} else {
cachedKey
}
} ?: return@submitGlobal
val advancement = Bukkit.getAdvancement(namespaceKey)
if (advancement == null) {
warning("Advancement $namespaceKey not found.")
return@submitGlobal
}
// 向玩家注册成就
awardAdvancement(this@sendToast, namespaceKey)
// 延迟注销,否则会出问题
submit(delay = 20) {
revokeAdvancement(this@sendToast, namespaceKey)
ejectAdvancement(namespaceKey)
// 玩家进度必须在玩家所属线程修改
this@sendToast.submit(now = true) {
awardAdvancement(this@sendToast, advancement)
// 延迟注销,否则会出问题
this@sendToast.submit(delay = 20) {
revokeAdvancement(this@sendToast, advancement)
submitGlobal { ejectAdvancement(namespaceKey) }
}
}
}
}

/**
* 赋予玩家成就
*/
private fun awardAdvancement(player: Player, key: NamespacedKey) {
val advancement = Bukkit.getAdvancement(key)
if (advancement == null) {
warning("Advancement $key not found.")
return
}
if (!player.getAdvancementProgress(advancement).isDone) {
player.getAdvancementProgress(advancement).remainingCriteria.forEach {
player.getAdvancementProgress(advancement).awardCriteria(it)
}
private fun awardAdvancement(player: Player, advancement: Advancement) {
val progress = player.getAdvancementProgress(advancement)
if (!progress.isDone) {
progress.remainingCriteria.forEach { progress.awardCriteria(it) }
}
}

/**
* 注销玩家成就
*/
private fun revokeAdvancement(player: Player, key: NamespacedKey) {
val advancement = Bukkit.getAdvancement(key)
if (advancement != null && player.getAdvancementProgress(advancement).isDone) {
player.getAdvancementProgress(advancement).awardedCriteria.forEach {
player.getAdvancementProgress(advancement).revokeCriteria(it)
}
private fun revokeAdvancement(player: Player, advancement: Advancement) {
val progress = player.getAdvancementProgress(advancement)
if (progress.isDone) {
progress.awardedCriteria.forEach { progress.revokeCriteria(it) }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,8 @@ import taboolib.common.Inject
import taboolib.common.platform.Platform
import taboolib.common.platform.PlatformSide
import taboolib.common.platform.event.SubscribeEvent
import taboolib.common.platform.function.submit
import taboolib.common.util.unsafeLazy
import taboolib.platform.BukkitPlugin
import taboolib.platform.Folia
import taboolib.platform.FoliaExecutor
import taboolib.platform.util.runTask
import java.lang.reflect.Constructor
import java.util.concurrent.ConcurrentHashMap

Expand Down Expand Up @@ -145,13 +142,7 @@ private object NMSSignListener {
MinecraftVersion.isHigherOrEqual(MinecraftVersion.V1_9) -> e.packet.read<Array<String>>("b")!!
else -> e.packet.read<Array<Any>>("b")!!.map { nmsProxy<NMSSign>().deserialize(it) }.toTypedArray()
}
if (Folia.isFolia) {
FoliaExecutor.REGION_SCHEDULER.run(BukkitPlugin.getInstance(), e.player.location) {
function.invoke(lines)
}
} else {
submit { function.invoke(lines) }
}
e.player.runTask(Runnable { function.invoke(lines) })
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import taboolib.common.Inject
import taboolib.common.platform.Platform
import taboolib.common.platform.PlatformSide
import taboolib.common.platform.event.SubscribeEvent
import taboolib.common.platform.function.submit
import taboolib.common.platform.function.submitAsync
import taboolib.common.reflect.ClassHelper
import java.lang.reflect.Constructor
import java.util.concurrent.ConcurrentHashMap
Expand Down Expand Up @@ -247,6 +247,6 @@ object PacketSender {

@SubscribeEvent
private fun onQuit(e: PlayerQuitEvent) {
submit(delay = 20) { playerConnectionMap.remove(e.player.name) }
submitAsync(delay = 20) { playerConnectionMap.remove(e.player.name) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import taboolib.common.inject.ClassVisitor
import taboolib.common.platform.Awake
import taboolib.common.platform.function.registerBukkitListener
import taboolib.common.platform.function.submit
import taboolib.platform.Folia
import taboolib.platform.FoliaExecutor
import taboolib.common.util.unsafeLazy
import taboolib.platform.BukkitPlugin
import java.util.function.Supplier
Expand Down Expand Up @@ -138,7 +140,11 @@ interface PlaceholderExpansion {
if (expansion.autoReload) {
registerBukkitListener(ExpansionUnregisterEvent::class.java) {
if (it.expansion == papiExpansion) {
submit { papiExpansion.register() }
if (Folia.isFolia) {
FoliaExecutor.runGlobal { papiExpansion.register() }
} else {
submit { papiExpansion.register() }
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ import taboolib.common.platform.Ghost
import taboolib.common.platform.Platform
import taboolib.common.platform.PlatformSide
import taboolib.common.platform.event.SubscribeEvent
import taboolib.common.platform.function.submit
import taboolib.common.platform.function.submitAsync
import taboolib.module.ui.type.impl.ChestImpl
import taboolib.platform.util.isNotAir
import taboolib.platform.util.runTask
import taboolib.platform.util.setMeta

@Inject
Expand All @@ -30,22 +30,24 @@ internal object ClickListener {

@Awake(LifeCycle.DISABLE)
fun onDisable() {
Bukkit.getOnlinePlayers().forEach {
if (MenuHolder.fromInventory(InventoryViewProxy.getTopInventory(it.openInventory)) != null) {
it.closeInventory()
}
Bukkit.getOnlinePlayers().forEach { player ->
player.runTask(Runnable {
if (MenuHolder.fromInventory(InventoryViewProxy.getTopInventory(player.openInventory)) != null) {
player.closeInventory()
}
})
}
}

@SubscribeEvent
fun onOpen(e: InventoryOpenEvent) {
val builder = MenuHolder.fromInventory(e.inventory) as? ChestImpl ?: return
val player = e.player as Player
// 构建回调
submit {
// 构建回调必须在玩家所属线程执行
player.runTask(Runnable {
builder.buildCallback(player, e.inventory)
builder.finalBuildCallback(player, e.inventory)
}
})
// 异步构建回调
submitAsync {
builder.asyncBuildCallback(player, e.inventory)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import taboolib.module.ui.virtual.VirtualInventory
import taboolib.module.ui.virtual.inject
import taboolib.module.ui.virtual.openVirtualInventory
import taboolib.platform.util.isNotAir
import taboolib.platform.util.isOwnedByCurrentRegion
import taboolib.platform.util.runTask

/**
* 允许在 Vanilla Inventory 中使用 Raw Title
Expand Down Expand Up @@ -84,18 +86,29 @@ inline fun <reified T : Menu> buildMenu(title: String = "chest", builder: T.() -
/**
* 构建一个菜单并为玩家打开
*/
inline fun <reified T : Menu> HumanEntity.openMenu(title: String = "chest", builder: T.() -> Unit) {
try {
openMenu(buildMenu(title, builder))
} catch (ex: Throwable) {
ex.printStackTrace()
inline fun <reified T : Menu> HumanEntity.openMenu(title: String = "chest", crossinline builder: T.() -> Unit) {
val openAction = Runnable {
try {
openMenu(buildMenu(title, builder))
} catch (ex: Throwable) {
ex.printStackTrace()
}
}
if (isOwnedByCurrentRegion()) {
openAction.run()
} else {
runTask(openAction)
}
}

/**
* 打开一个构建后的菜单
*/
fun HumanEntity.openMenu(buildMenu: Inventory, changeId: Boolean = true) {
if (!isOwnedByCurrentRegion()) {
runTask(Runnable { openMenu(buildMenu, changeId) })
return
}
try {
if (buildMenu is VirtualInventory) {
val remoteInventory = openVirtualInventory(buildMenu, changeId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ inline fun <reified T : Menu> buildMenu(title: Source, builder: T.() -> Unit): I
return buildMenu(title.toRawMessage(), builder)
}

inline fun <reified T : Menu> HumanEntity.openMenu(title: Source, builder: T.() -> Unit) {
inline fun <reified T : Menu> HumanEntity.openMenu(title: Source, crossinline builder: T.() -> Unit) {
openMenu(title.toRawMessage(), builder)
}
Loading
Loading