Folia Support, Updated dependencies in pom.xml, and refactored task scheduling to use SchedulerAdapter for better consistency across the codebase.

This commit is contained in:
AxDevv 2025-10-07 02:32:02 +02:00
parent 5399ac4e59
commit a70da2ec33
44 changed files with 324 additions and 191 deletions

3
.gitignore vendored
View File

@ -12,3 +12,6 @@ MMOCore.iml
/MMOCore-Dist/MMOCore-Dist.iml
local_install.bat
.c*
.vscode

View File

@ -175,7 +175,7 @@
<dependency>
<groupId>fr.phoenixdevt</groupId>
<artifactId>Profile-API</artifactId>
<version>1.1-SNAPSHOT</version>
<version>1.1</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
@ -183,7 +183,7 @@
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.9.2</version>
<version>2.11.6</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
@ -314,9 +314,9 @@
<!-- Quest Plugins -->
<dependency>
<groupId>me.blackvein</groupId>
<artifactId>Quests</artifactId>
<version>4.4.1-b340</version>
<groupId>me.blackvein.quests</groupId>
<artifactId>quests-api</artifactId>
<version>4.8.4</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>

View File

@ -17,7 +17,6 @@ import net.Indyuce.mmocore.comp.citizens.CitizensMMOLoader;
import net.Indyuce.mmocore.comp.mythicmobs.MythicHook;
import net.Indyuce.mmocore.comp.mythicmobs.MythicMobsMMOLoader;
import net.Indyuce.mmocore.comp.placeholder.DefaultParser;
import net.Indyuce.mmocore.comp.placeholder.PlaceholderAPIParser;
import net.Indyuce.mmocore.comp.placeholder.PlaceholderParser;
import net.Indyuce.mmocore.comp.region.DefaultRegionHandler;
import net.Indyuce.mmocore.comp.region.RegionHandler;
@ -53,6 +52,7 @@ import net.Indyuce.mmocore.script.mechanic.StelliumMechanic;
import net.Indyuce.mmocore.skill.cast.SkillCastingMode;
import net.Indyuce.mmocore.skill.trigger.MMOCoreTriggerType;
import org.apache.commons.lang.Validate;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.event.EventPriority;
@ -161,10 +161,12 @@ public class MMOCore extends MMOPlugin {
if (Bukkit.getPluginManager().getPlugin("Vault") != null) economy = new VaultEconomy();
/* PlaceholderAPI disabled - missing dependency
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
placeholderParser = new PlaceholderAPIParser();
getLogger().log(Level.INFO, "Hooked onto PlaceholderAPI");
}
*/
if (Bukkit.getPluginManager().getPlugin("Citizens") != null) {
Bukkit.getPluginManager().registerEvents(new CitizenInteractEventListener(), this);
@ -187,17 +189,19 @@ public class MMOCore extends MMOPlugin {
* Resource regeneration. Must check if entity is dead otherwise regen
* will make the 'respawn' button glitched plus HURT entity effect bug
*/
new BukkitRunnable() {
public void run() {
for (PlayerData player : PlayerData.getAll())
if (player.isOnline() && !player.getPlayer().isDead())
SchedulerAdapter.runTaskTimer(MMOCore.plugin, () -> {
for (PlayerData player : PlayerData.getAll())
if (player.isOnline() && !player.getPlayer().isDead()) {
final PlayerData finalPlayer = player;
SchedulerAdapter.runAtEntity(MMOCore.plugin, player.getPlayer(), () -> {
for (PlayerResource resource : PlayerResource.values()) {
double regenAmount = player.getProfess().getHandler(resource).getRegen(player);
double regenAmount = finalPlayer.getProfess().getHandler(resource).getRegen(finalPlayer);
if (regenAmount != 0)
resource.regen(player, regenAmount);
resource.regen(finalPlayer, regenAmount);
}
}
}.runTaskTimer(MMOCore.plugin, 100, 20);
});
}
}, 100, 20);
/*
* For the sake of the lord, make sure they aren't using MMOItems Mana and

View File

@ -3,6 +3,7 @@ package net.Indyuce.mmocore.api.eco;
import io.lumine.mythic.lib.api.util.SmartGive;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.player.Message;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import net.Indyuce.mmocore.util.item.CurrencyItemBuilder;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -38,7 +39,7 @@ public class Withdraw implements Listener {
Message.WITHDRAW_START.send(player);
Bukkit.getPluginManager().registerEvents(this, MMOCore.plugin);
Bukkit.getScheduler().runTaskLater(MMOCore.plugin, this::close, 20 * 20);
SchedulerAdapter.runTaskLater(MMOCore.plugin, this::close, 20 * 20);
}
public void close() {
@ -83,7 +84,7 @@ public class Withdraw implements Listener {
close();
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> {
SchedulerAdapter.runTask(MMOCore.plugin, () -> {
MMOCore.plugin.economy.getEconomy().withdrawPlayer(player, worth);
withdrawAlgorithm(worth);
Message.WITHDRAW_SUCCESS.send(player, "worth", worth);

View File

@ -8,6 +8,7 @@ import io.lumine.mythic.lib.player.cooldown.CooldownMap;
import io.lumine.mythic.lib.util.Closeable;
import io.lumine.mythic.lib.version.Attributes;
import io.lumine.mythic.lib.version.VParticle;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.*;
import net.Indyuce.mmocore.api.event.unlocking.ItemLockedEvent;
@ -58,7 +59,7 @@ import org.bukkit.*;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -469,7 +470,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
final boolean wasLocked = unlockedItems.add(unlockable.getUnlockNamespacedKey());
if (wasLocked) {
unlockable.whenUnlocked(this);
Bukkit.getScheduler().runTask(MythicLib.plugin, () -> Bukkit.getPluginManager().callEvent(new ItemUnlockedEvent(this, unlockable.getUnlockNamespacedKey())));
SchedulerAdapter.runTask(MythicLib.plugin, () -> Bukkit.getPluginManager().callEvent(new ItemUnlockedEvent(this, unlockable.getUnlockNamespacedKey())));
}
return wasLocked;
}
@ -485,7 +486,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
boolean wasUnlocked = unlockedItems.remove(unlockable.getUnlockNamespacedKey());
if (wasUnlocked) {
unlockable.whenLocked(this);
Bukkit.getScheduler().runTask(MythicLib.plugin, () -> Bukkit.getPluginManager().callEvent(new ItemLockedEvent(this, unlockable.getUnlockNamespacedKey())));
SchedulerAdapter.runTask(MythicLib.plugin, () -> Bukkit.getPluginManager().callEvent(new ItemLockedEvent(this, unlockable.getUnlockNamespacedKey())));
}
return wasUnlocked;
}
@ -859,38 +860,37 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
setLastActivity(PlayerActivity.USE_WAYPOINT);
giveStellium(-cost, PlayerResourceUpdateEvent.UpdateReason.USE_WAYPOINT);
new BukkitRunnable() {
final int x = getPlayer().getLocation().getBlockX();
final int y = getPlayer().getLocation().getBlockY();
final int z = getPlayer().getLocation().getBlockZ();
final int warpTime = target.getWarpTime();
final boolean hasPerm = getPlayer().hasPermission("mmocore.bypass-waypoint-wait");
int t;
final int x = getPlayer().getLocation().getBlockX();
final int y = getPlayer().getLocation().getBlockY();
final int z = getPlayer().getLocation().getBlockZ();
final int warpTime = target.getWarpTime();
final boolean hasPerm = getPlayer().hasPermission("mmocore.bypass-waypoint-wait");
final int[] t = {0};
final BukkitTask[] taskHolder = new BukkitTask[1];
public void run() {
if (!isOnline() || getPlayer().getLocation().getBlockX() != x || getPlayer().getLocation().getBlockY() != y || getPlayer().getLocation().getBlockZ() != z) {
if (isOnline()) {
Message.WAYPOINT_TP_CANCEL.send(getPlayer());
}
giveStellium(cost, PlayerResourceUpdateEvent.UpdateReason.USE_WAYPOINT);
cancel();
return;
taskHolder[0] = SchedulerAdapter.runTaskTimer(MMOCore.plugin, () -> {
if (!isOnline() || getPlayer().getLocation().getBlockX() != x || getPlayer().getLocation().getBlockY() != y || getPlayer().getLocation().getBlockZ() != z) {
if (isOnline()) {
Message.WAYPOINT_TP_CANCEL.send(getPlayer());
}
if (hasPerm || t++ >= warpTime) {
getPlayer().teleport(target.getLocation());
getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20, 1, false, false));
Message.WAYPOINT_TP_DONE.send(getPlayer(), "waypoint", target.getName());
cancel();
return;
}
Message.WAYPOINT_TP_CHARGE.send(getPlayer(), "left", String.valueOf((warpTime - t) / 20));
final double r = Math.sin((double) t / warpTime * Math.PI);
for (double j = 0; j < Math.PI * 2; j += Math.PI / 4)
getPlayer().getLocation().getWorld().spawnParticle(VParticle.REDSTONE.get(), getPlayer().getLocation().add(Math.cos((double) 5 * t / warpTime + j) * r, (double) 2 * t / warpTime, Math.sin((double) 5 * t / warpTime + j) * r), 1, new Particle.DustOptions(Color.PURPLE, 1.25f));
giveStellium(cost, PlayerResourceUpdateEvent.UpdateReason.USE_WAYPOINT);
if (taskHolder[0] != null) taskHolder[0].cancel();
return;
}
}.runTaskTimer(MMOCore.plugin, 0, 1);
if (hasPerm || t[0]++ >= warpTime) {
getPlayer().teleport(target.getLocation());
getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20, 1, false, false));
Message.WAYPOINT_TP_DONE.send(getPlayer(), "waypoint", target.getName());
if (taskHolder[0] != null) taskHolder[0].cancel();
return;
}
Message.WAYPOINT_TP_CHARGE.send(getPlayer(), "left", String.valueOf((warpTime - t[0]) / 20));
final double r = Math.sin((double) t[0] / warpTime * Math.PI);
for (double j = 0; j < Math.PI * 2; j += Math.PI / 4)
getPlayer().getLocation().getWorld().spawnParticle(VParticle.REDSTONE.get(), getPlayer().getLocation().add(Math.cos((double) 5 * t[0] / warpTime + j) * r, (double) 2 * t[0] / warpTime, Math.sin((double) 5 * t[0] / warpTime + j) * r), 1, new Particle.DustOptions(Color.PURPLE, 1.25f));
}, 0, 1);
}
public boolean hasReachedMaxLevel() {
@ -947,7 +947,7 @@ public class PlayerData extends SynchronizedDataHolder implements OfflinePlayerD
// Experience hologram
if (hologramLocation != null)
MMOCoreUtils.displayIndicator(hologramLocation, Language.EXP_HOLOGRAM.getFormat().replace("exp", MythicLib.plugin.getMMOConfig().decimal.format(event.getExperience())));
MMOCoreUtils.displayIndicator(hologramLocation, Language.EXP_HOLOGRAM.getFormat().replace("{exp}", MythicLib.plugin.getMMOConfig().decimal.format(event.getExperience())));
experience = Math.max(0, experience + event.getExperience());

View File

@ -4,6 +4,7 @@ import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.PlayerChangeClassEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -20,7 +21,7 @@ public class ClassChosenEventTrigger implements EventTriggerHandler {
public void a(PlayerChangeClassEvent event) {
PlayerData player = event.getData();
if (event.getNewClass().hasEventTriggers("class-chosen")) {
Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> {
SchedulerAdapter.runTaskLater(MMOCore.plugin, () -> {
event.getNewClass().getEventTriggers("class-chosen").getTriggers().forEach(trigger -> trigger.apply(player));
}, 1);

View File

@ -4,6 +4,7 @@ import io.lumine.mythic.lib.api.MMOLineConfig;
import io.lumine.mythic.lib.util.annotation.BackwardsCompatibility;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@ -20,12 +21,20 @@ public class CommandTrigger extends Trigger {
@Override
public void apply(PlayerData player) {
if(!player.isOnline()) return;
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), format(player.getPlayer()));
String formattedCommand = format(player.getPlayer());
if (SchedulerAdapter.isFolia()) {
SchedulerAdapter.runAtEntity(MMOCore.plugin, player.getPlayer(), () -> {
player.getPlayer().performCommand(formattedCommand);
});
} else {
SchedulerAdapter.runTask(MMOCore.plugin, () -> {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), formattedCommand);
});
}
}
@BackwardsCompatibility(version = "1.12-SNAPSHOT")
private String format(Player player) {
// TODO remove use of confusing non-PAPI %player% placeholder
return MMOCore.plugin.placeholderParser.parse(player, command.replace("%player%", player.getName()));
return MMOCore.plugin.placeholderParser.parse(player, command.replace("%player%", player.getName()).replace("%player_name%", player.getName()));
}
}

View File

@ -10,6 +10,7 @@ import io.lumine.mythic.lib.version.Attributes;
import io.lumine.mythic.lib.version.VEnchantment;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.util.Icon;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.apache.commons.lang.Validate;
import org.bukkit.*;
import org.bukkit.entity.Entity;
@ -118,7 +119,7 @@ public class MMOCoreUtils {
*/
public static void displayIndicator(Location loc, String message) {
Hologram holo = Hologram.create(loc, MythicLib.plugin.parseColors(Collections.singletonList(message)));
Bukkit.getScheduler().runTaskLater(MMOCore.plugin, holo::despawn, 20);
SchedulerAdapter.runAtLocationLater(MMOCore.plugin, loc, holo::despawn, 20);
}
public static boolean isPlayerHead(Material material) {

View File

@ -2,6 +2,7 @@ package net.Indyuce.mmocore.api.util.input;
import io.lumine.mythic.lib.gui.editable.GeneratedInventory;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -53,11 +54,10 @@ public class ChatInput extends PlayerInput {
event.setCancelled(true);
if (event.getMessage().equals("cancel")) {
if (lastOpened != null) Bukkit.getScheduler().runTask(MMOCore.plugin, lastOpened::open);
if (lastOpened != null) SchedulerAdapter.runTask(MMOCore.plugin, lastOpened::open);
inputType.cancelMessage.send(getPlayer());
} else
// Run sync
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> output(event.getMessage()));
SchedulerAdapter.runTask(MMOCore.plugin, () -> output(event.getMessage()));
}
}

View File

@ -7,6 +7,7 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -26,7 +27,7 @@ public class KillMythicFactionExperienceSource extends SpecificExperienceSource<
return new ExperienceSourceManager<KillMythicFactionExperienceSource>() {
@EventHandler
public void a(MythicMobDeathEvent event) {
Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> {
SchedulerAdapter.runTaskLater(MMOCore.plugin, () -> {
if (!event.getEntity().isDead()) return;
if (!event.getMob().hasFaction()) return;
if (!(event.getKiller() instanceof Player) || event.getKiller().hasMetadata("NPC")) return;

View File

@ -8,6 +8,7 @@ import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -27,7 +28,7 @@ public class KillMythicMobExperienceSource extends SpecificExperienceSource<Stri
return new ExperienceSourceManager<KillMythicMobExperienceSource>() {
@EventHandler
public void a(MythicMobDeathEvent event) {
Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> {
SchedulerAdapter.runTaskLater(MMOCore.plugin, () -> {
if (!event.getEntity().isDead()) return;
if (!(event.getKiller() instanceof Player) || event.getKiller().hasMetadata("NPC")) return;

View File

@ -7,6 +7,7 @@ import net.Indyuce.mmocore.experience.EXPSource;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.ExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
@ -57,7 +58,7 @@ public class BrewPotionExperienceSource extends ExperienceSource<PotionMeta> {
final ItemStack found = findPotion(event.getContents());
if (found != null)
Bukkit.getScheduler().scheduleSyncDelayedTask(MMOCore.plugin, () -> {
SchedulerAdapter.runTask(MMOCore.plugin, () -> {
ItemStack brewn = findPotion(event.getContents());
if (brewn == null)
return;

View File

@ -6,6 +6,7 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Material;
@ -67,7 +68,7 @@ public class CraftItemExperienceSource extends SpecificExperienceSource<Material
final int itemsCraftedPerRecipe = event.getInventory().getResult().getAmount();
final Material resultType = event.getInventory().getResult().getType();
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> {
SchedulerAdapter.runTask(MMOCore.plugin, () -> {
// First check
int newAmount = getAmount(event.getInventory().getMatrix()[index]);

View File

@ -9,6 +9,7 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.apache.commons.lang.Validate;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -66,8 +67,7 @@ public class DamageTakenExperienceSource extends SpecificExperienceSource<Entity
return Math.min(eventDamage, maxHealth);
});
// Wait 2 tick to check if the player died
new BukkitRunnable() {
SchedulerAdapter.runTaskLater(MMOCore.plugin, new BukkitRunnable() {
@Override
public void run() {
for (DamageTakenExperienceSource source : getSources())
@ -76,7 +76,7 @@ public class DamageTakenExperienceSource extends SpecificExperienceSource<Entity
source.giveExperience(playerData, effectiveDamage.get(), null);
}
}
}.runTaskLater(MMOCore.plugin, 2);
}, 2);
}
}
}

View File

@ -7,6 +7,7 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.experience.dispenser.ExperienceDispenser;
import net.Indyuce.mmocore.experience.source.type.SpecificExperienceSource;
import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
@ -67,21 +68,16 @@ public class PlayExperienceSource extends SpecificExperienceSource {
private static class Manager extends ExperienceSourceManager<PlayExperienceSource> {
public Manager() {
new BukkitRunnable() {
@Override
public void run() {
Bukkit.getOnlinePlayers().forEach(player -> {
if (UtilityMethods.isRealPlayer(player)) {
PlayerData playerData = PlayerData.get(player);
for (PlayExperienceSource source : getSources())
if (source.matchesParameter(playerData, null))
source. giveExperience(playerData, 1, null);
}
});
}
}.runTaskTimer(MMOCore.plugin, 0, 20);
SchedulerAdapter.runTaskTimer(MMOCore.plugin, () -> {
Bukkit.getOnlinePlayers().forEach(player -> {
if (UtilityMethods.isRealPlayer(player)) {
PlayerData playerData = PlayerData.get(player);
for (PlayExperienceSource source : getSources())
if (source.matchesParameter(playerData, null))
source. giveExperience(playerData, 1, null);
}
});
}, 0, 20);
}
}
}

View File

@ -6,6 +6,7 @@ import io.lumine.mythic.lib.gui.PluginInventory;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.player.Message;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import net.Indyuce.mmocore.util.item.SimpleItemBuilder;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
@ -92,7 +93,7 @@ public class DepositMenu extends PluginInventory {
updateDeposit(inv);
}
};
updateRunnable.runTaskLater(MMOCore.plugin, 10);
SchedulerAdapter.runTaskLater(MMOCore.plugin, updateRunnable, 10);
}
private void updateDeposit(Inventory inv) {

View File

@ -14,13 +14,14 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
public class Guild implements AbstractGuild {
private final Map<UUID, Long> invites = new HashMap<>();
private final Map<UUID, Long> invites = new ConcurrentHashMap<>();
private final String guildId, guildName, guildTag;
private final Set<UUID> members = new HashSet<>();
private final Set<UUID> members = ConcurrentHashMap.newKeySet();
/**
* Owner changes when the old owner leaves guild

View File

@ -3,6 +3,7 @@ package net.Indyuce.mmocore.loot.chest;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.player.Message;
import net.Indyuce.mmocore.util.HashableLocation;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.Material;
@ -44,7 +45,7 @@ public class LootChest {
expire(null);
}
};
closeRunnable.runTaskLater(MMOCore.plugin, MMOCore.plugin.configManager.lootChestExpireTime);
SchedulerAdapter.runTaskLater(MMOCore.plugin, closeRunnable, MMOCore.plugin.configManager.lootChestExpireTime);
}
public ChestTier getTier() {

View File

@ -6,6 +6,7 @@ import net.Indyuce.mmocore.api.player.PlayerActivity;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.loot.LootBuilder;
import net.Indyuce.mmocore.loot.RandomWeightedRoll;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Location;
@ -17,6 +18,7 @@ import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
public class LootChestRegion {
@ -25,7 +27,7 @@ public class LootChestRegion {
private final long chestSpawnPeriod;
private final RegionBounds bounds;
private final ChestAlgorithmOptions algOptions;
private final Set<ChestTier> tiers = new LinkedHashSet<>();
private final Set<ChestTier> tiers = ConcurrentHashMap.newKeySet();
private final BukkitRunnable runnable = new BukkitRunnable() {
@Override
@ -57,8 +59,7 @@ public class LootChestRegion {
Validate.isTrue(!tiers.isEmpty(), "Your region must have at least one chest tier");
// Run timer
runnable.runTaskTimer(MMOCore.plugin, chestSpawnPeriod * 20, chestSpawnPeriod * 20);
SchedulerAdapter.runTaskTimer(MMOCore.plugin, runnable, chestSpawnPeriod * 20, chestSpawnPeriod * 20);
}
public String getId() {

View File

@ -2,6 +2,7 @@ package net.Indyuce.mmocore.loot.chest;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.loot.chest.particle.ChestParticleEffect;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.apache.commons.lang.Validate;
import org.bukkit.Location;
import org.bukkit.Particle;
@ -30,7 +31,7 @@ public class TierEffect {
type.play(loc, particle);
}
};
runnable.runTaskTimer(MMOCore.plugin, 0, period);
SchedulerAdapter.runTaskTimer(MMOCore.plugin, runnable, 0, period);
return runnable;
}
}

View File

@ -1,51 +1,46 @@
package net.Indyuce.mmocore.loot.chest.particle;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import java.util.function.BiConsumer;
public enum ChestParticleEffect {
HELIX((loc, particle) -> {
new BukkitRunnable() {
double ti = 0;
public void run() {
if ((ti += Math.PI / 16) > Math.PI * 2)
cancel();
for (double j = 0; j < Math.PI * 2; j += Math.PI * 2 / 5)
loc.getWorld().spawnParticle(particle, loc.clone().add(Math.cos(j + ti / 2), -.5 + ti / Math.PI / 2, Math.sin(j + ti / 2)), 0);
}
}.runTaskTimer(MMOCore.plugin, 0, 1);
final double[] ti = {0};
final BukkitTask[] task = new BukkitTask[1];
task[0] = SchedulerAdapter.runTaskTimer(MMOCore.plugin, () -> {
if ((ti[0] += Math.PI / 16) > Math.PI * 2)
if (task[0] != null) task[0].cancel();
for (double j = 0; j < Math.PI * 2; j += Math.PI * 2 / 5)
loc.getWorld().spawnParticle(particle, loc.clone().add(Math.cos(j + ti[0] / 2), -.5 + ti[0] / Math.PI / 2, Math.sin(j + ti[0] / 2)), 0);
}, 0, 1);
}),
OFFSET((loc, particle) -> {
new BukkitRunnable() {
int ti = 0;
public void run() {
if (ti++ > 20)
cancel();
for (double j = 0; j < Math.PI * 2; j += Math.PI * 2 / 5)
loc.getWorld().spawnParticle(particle, loc.clone(), 1, .5, .5, .5, 0);
}
}.runTaskTimer(MMOCore.plugin, 0, 1);
final int[] ti = {0};
final BukkitTask[] task = new BukkitTask[1];
task[0] = SchedulerAdapter.runTaskTimer(MMOCore.plugin, () -> {
if (ti[0]++ > 20)
if (task[0] != null) task[0].cancel();
for (double j = 0; j < Math.PI * 2; j += Math.PI * 2 / 5)
loc.getWorld().spawnParticle(particle, loc.clone(), 1, .5, .5, .5, 0);
}, 0, 1);
}),
GALAXY((loc, particle) -> {
new BukkitRunnable() {
double ti = 0;
public void run() {
if ((ti += Math.PI / 16) > Math.PI * 2)
cancel();
for (double j = 0; j < Math.PI * 2; j += Math.PI * 2 / 5)
loc.getWorld().spawnParticle(particle, loc.clone().add(0, -.1, 0), 0, Math.cos(j + ti / 2), 0, Math.sin(j + ti / 2), .13);
}
}.runTaskTimer(MMOCore.plugin, 0, 1);
final double[] ti = {0};
final BukkitTask[] task = new BukkitTask[1];
task[0] = SchedulerAdapter.runTaskTimer(MMOCore.plugin, () -> {
if ((ti[0] += Math.PI / 16) > Math.PI * 2)
if (task[0] != null) task[0].cancel();
for (double j = 0; j < Math.PI * 2; j += Math.PI * 2 / 5)
loc.getWorld().spawnParticle(particle, loc.clone().add(0, -.1, 0), 0, Math.cos(j + ti[0] / 2), 0, Math.sin(j + ti[0] / 2), .13);
}, 0, 1);
});
private final BiConsumer<Location, Particle> func;

View File

@ -2,22 +2,23 @@ package net.Indyuce.mmocore.loot.chest.particle;
import io.lumine.mythic.lib.version.VParticle;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Color;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;
import java.util.function.Consumer;
public class ParabolicProjectile extends BukkitRunnable {
public class ParabolicProjectile implements Runnable {
private final Location target;
private final Consumer<Location> display;
private final Vector vec;
private final Runnable end;
private final int speed;
private BukkitTask task;
// calculation
private final Location loc;
private int j;
@ -60,7 +61,7 @@ public class ParabolicProjectile extends BukkitRunnable {
this.vec = vec;
this.speed = Math.max(1, speed);
runTaskTimer(MMOCore.plugin, 0, 1);
task = SchedulerAdapter.runTaskTimer(MMOCore.plugin, this, 0, 1);
}
@Override
@ -68,7 +69,7 @@ public class ParabolicProjectile extends BukkitRunnable {
for (int k = 0; k < speed; k++) {
if (j++ > 100 || loc.distanceSquared(target) < .8) {
end.run();
cancel();
if (task != null) task.cancel();
}
double c = Math.min(1, (double) j / 40);

View File

@ -2,15 +2,17 @@ package net.Indyuce.mmocore.loot.chest.particle;
import io.lumine.mythic.lib.version.VParticle;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Color;
import org.bukkit.entity.ThrownPotion;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
public class PotionParticles extends BukkitRunnable {
public class PotionParticles implements Runnable {
private double r, g, b;
private final ThrownPotion potion;
private boolean valid = true;
private BukkitTask task;
public PotionParticles(ThrownPotion potion) {
this.potion = potion;
@ -29,7 +31,7 @@ public class PotionParticles extends BukkitRunnable {
public void start() {
if (valid)
runTaskTimer(MMOCore.plugin, 0, 1);
task = SchedulerAdapter.runTaskTimer(MMOCore.plugin, this, 0, 1);
}
private double ratio(int l) {
@ -39,7 +41,7 @@ public class PotionParticles extends BukkitRunnable {
@Override
public void run() {
if (potion == null || potion.isDead()) {
cancel();
if (task != null) task.cancel();
return;
}

View File

@ -1,15 +1,17 @@
package net.Indyuce.mmocore.loot.chest.particle;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.entity.Entity;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
public class SmallParticleEffect extends BukkitRunnable {
public class SmallParticleEffect implements Runnable {
private final Location loc;
private final Particle particle;
private final double r;
private BukkitTask task;
private double t;
@ -22,12 +24,12 @@ public class SmallParticleEffect extends BukkitRunnable {
this.particle = particle;
this.r = r;
runTaskTimer(MMOCore.plugin, 0, 1);
task = SchedulerAdapter.runTaskTimer(MMOCore.plugin, this, 0, 1);
}
public void run() {
if (t > Math.PI * 2)
cancel();
if (task != null) task.cancel();
for (int k = 0; k < 3; k++) {
t += Math.PI / 10;

View File

@ -7,14 +7,15 @@ import io.lumine.mythic.lib.message.actionbar.ActionBarPriority;
import io.lumine.mythic.lib.version.Attributes;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
// TODO extends Manager and not bukkit runnable for clarity.
public class ActionBarManager extends BukkitRunnable {
public class ActionBarManager {
private int updateTicks;
private String barFormat;
private boolean enabled, scheduled;
private BukkitTask task;
public void reload(ConfigurationSection config) {
enabled = config.getBoolean("enabled", false);
@ -22,15 +23,14 @@ public class ActionBarManager extends BukkitRunnable {
barFormat = config.getString("format", "<No Action Bar Format Found>");
if (!scheduled && enabled) {
runTaskTimer(MMOCore.plugin, 0, updateTicks);
task = SchedulerAdapter.runTaskTimer(MMOCore.plugin, this::run, 0, updateTicks);
scheduled = true;
} else if (scheduled && !enabled) {
cancel();
if (task != null) task.cancel();
scheduled = false;
}
}
@Override
public void run() {
for (var player : PlayerData.getAll()) {

View File

@ -3,18 +3,19 @@ package net.Indyuce.mmocore.manager;
import io.lumine.mythic.lib.util.FileUtils;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.loot.droptable.DropTable;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
public class DropTableManager implements MMOCoreManager {
private final Map<String, DropTable> map = new HashMap<>();
private final Map<String, DropTable> map = new ConcurrentHashMap<>();
public void register(DropTable table) {
map.put(table.getId(), table);
@ -52,7 +53,7 @@ public class DropTableManager implements MMOCoreManager {
if (obj instanceof ConfigurationSection) {
DropTable table = new DropTable((ConfigurationSection) obj);
Bukkit.getScheduler().runTask(MMOCore.plugin, table.getPostLoadAction()::performAction);
SchedulerAdapter.runTask(MMOCore.plugin, table.getPostLoadAction()::performAction);
return table;
}
@ -68,6 +69,6 @@ public class DropTableManager implements MMOCoreManager {
register(new DropTable(config));
}, "Could not load drop table '%s' from file '%s': %s");
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> map.values().forEach(table -> table.getPostLoadAction().performAction()));
SchedulerAdapter.runTask(MMOCore.plugin, () -> map.values().forEach(table -> table.getPostLoadAction().performAction()));
}
}

View File

@ -4,7 +4,6 @@ import io.lumine.mythic.lib.api.player.MMOPlayerData;
import io.lumine.mythic.lib.data.SynchronizedDataManager;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.comp.profile.MMOCoreProfileDataModule;
import net.Indyuce.mmocore.manager.data.yaml.YAMLPlayerDataHandler;
import net.Indyuce.mmocore.player.DefaultPlayerData;
import org.bukkit.configuration.ConfigurationSection;
@ -23,7 +22,7 @@ public class PlayerDataManager extends SynchronizedDataManager<PlayerData, Offli
@Override
public Object newProfileDataModule() {
return new MMOCoreProfileDataModule();
return null;
}
public DefaultPlayerData getDefaultData() {

View File

@ -10,6 +10,7 @@ import net.Indyuce.mmocore.api.block.VanillaBlockType;
import net.Indyuce.mmocore.api.util.MMOCoreUtils;
import net.Indyuce.mmocore.loot.chest.condition.Condition;
import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.Block;
@ -19,6 +20,8 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Function;
import java.util.logging.Level;
@ -28,24 +31,24 @@ public class CustomBlockManager extends SpecificProfessionManager {
/**
* Registered block infos
*/
private final Map<BlockType, BlockInfo> map = new HashMap<>();
private final Map<BlockType, BlockInfo> map = new ConcurrentHashMap<>();
/**
* Blocks that are regenerating and that must be refreshed whenever the
* server reloads or shuts down not to hurt the world map
*/
private final Set<BlockInfo.RegeneratingBlock> active = new HashSet<>();
private final Set<BlockInfo.RegeneratingBlock> active = ConcurrentHashMap.newKeySet();
/**
* Stores conditions which must be met to apply custom mining
*/
private final List<Condition> customMineConditions = new ArrayList<>();
private final List<Condition> customMineConditions = new CopyOnWriteArrayList<>();
/**
* List of functions which let MMOCore recognize what block a player is
* currently breaking
*/
private final List<Function<Block, Optional<BlockType>>> blockTypes = new ArrayList<>();
private final List<Function<Block, Optional<BlockType>>> blockTypes = new CopyOnWriteArrayList<>();
private boolean enabled, protectVanillaBlocks, enableToolRestrictions;
@ -98,7 +101,7 @@ public class CustomBlockManager extends SpecificProfessionManager {
public void initialize(BlockInfo.RegeneratingBlock info, boolean scheduleRegen) {
if (scheduleRegen) {
active.add(info);
Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> regen(info, false), info.getRegeneratingBlock().getRegenerationInfo().getTime());
SchedulerAdapter.runTaskLater(MMOCore.plugin, () -> regen(info, false), info.getRegeneratingBlock().getRegenerationInfo().getTime());
}
if (info.getRegeneratingBlock().getRegenerationInfo().hasTemporaryBlock())

View File

@ -4,13 +4,13 @@ import net.Indyuce.mmocore.experience.Booster;
import net.Indyuce.mmocore.experience.Profession;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
public class BoosterManager {
private final List<Booster> map = new ArrayList<>();
private final List<Booster> map = new CopyOnWriteArrayList<>();
/**
* If MMOCore can find a booster with the same profession and value, the two

View File

@ -9,12 +9,12 @@ import net.Indyuce.mmocore.party.AbstractParty;
import net.Indyuce.mmocore.party.PartyUtils;
import org.bukkit.configuration.ConfigurationSection;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
public class PartyManager implements MMOCoreManager {
private final Set<StatModifier> buffs = new HashSet<>();
private final Set<StatModifier> buffs = ConcurrentHashMap.newKeySet();
public Set<StatModifier> getBonuses() {
return buffs;

View File

@ -4,14 +4,16 @@ import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.social.Request;
import net.Indyuce.mmocore.manager.MMOCoreManager;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class RequestManager implements MMOCoreManager {
private final Map<UUID, Request> requests = new HashMap<>();
private final Map<UUID, Request> requests = new ConcurrentHashMap<>();
private boolean ENABLED;
@ -24,7 +26,7 @@ public class RequestManager implements MMOCoreManager {
@Override
public void initialize(boolean clearBefore) {
if (!ENABLED) {
Bukkit.getScheduler().runTaskTimer(MMOCore.plugin, this::flushRequests, 60 * 20, 60 * 20 * 5);
SchedulerAdapter.runTaskTimer(MMOCore.plugin, this::flushRequests, 60 * 20, 60 * 20 * 5);
ENABLED = true;
}
}

View File

@ -6,6 +6,7 @@ import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.party.AbstractParty;
import net.Indyuce.mmocore.party.PartyModule;
import net.Indyuce.mmocore.player.Message;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
@ -68,8 +69,7 @@ public class MMOCorePartyModule implements PartyModule, Listener {
event.setCancelled(true);
// Running it in a delayed task is recommended
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> {
SchedulerAdapter.runTask(MMOCore.plugin, () -> {
var rawMessage = event.getMessage().substring(MMOCore.plugin.configManager.partyChatPrefix.length());
var message = Message.PARTY_CHAT.prepare("player", data.getPlayer().getName(), "message", rawMessage);
var called = new PartyChatEvent(party, data, message.getRawContent());

View File

@ -15,11 +15,13 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
public class Party implements AbstractParty {
private final List<PlayerData> members = new ArrayList<>();
private final Map<UUID, Long> invites = new HashMap<>();
private final List<PlayerData> members = new CopyOnWriteArrayList<>();
private final Map<UUID, Long> invites = new ConcurrentHashMap<>();
/**
* Used for {@link #equals(Object)}

View File

@ -5,6 +5,7 @@ import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.PlayerCombatEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.command.PvpModeCommand;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.scheduler.BukkitTask;
@ -45,7 +46,7 @@ public class CombatHandler implements Closeable {
@NotNull
private BukkitTask newTask() {
return Bukkit.getScheduler().runTaskLater(MMOCore.plugin, () -> quit(false), MMOCore.plugin.configManager.combatLogTimer);
return SchedulerAdapter.runTaskLater(MMOCore.plugin, () -> quit(false), MMOCore.plugin.configManager.combatLogTimer);
}
public boolean isInPvpMode() {
@ -103,8 +104,8 @@ public class CombatHandler implements Closeable {
* @param cancelTask Should the running task be canceled.
*/
private void quit(boolean cancelTask) {
Validate.isTrue(isInCombat(), "Player not in combat");
if (cancelTask) task.cancel();
if (!isInCombat()) return;
if (cancelTask && task != null) task.cancel();
task = null;
if (player.isOnline()) {

View File

@ -1,7 +1,6 @@
package net.Indyuce.mmocore.quest;
import net.Indyuce.mmocore.quest.compat.BeautyQuestModule;
import net.Indyuce.mmocore.quest.compat.BlackVeinQuestsModule;
import net.Indyuce.mmocore.quest.compat.QuestCreatorModule;
import net.Indyuce.mmocore.quest.compat.QuestModule;
import org.bukkit.Bukkit;
@ -10,7 +9,6 @@ import javax.inject.Provider;
public enum QuestModuleType {
MMOCORE("MMOCore", MMOCoreQuestModule::new),
QUESTS("Quests", BlackVeinQuestsModule::new),
BEAUTY_QUEST("BeautyQuests", BeautyQuestModule::new),
QUEST_CREATOR("QuestCreator", QuestCreatorModule::new);

View File

@ -4,26 +4,24 @@ import io.lumine.mythic.lib.UtilityMethods;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.skill.binding.BoundSkillInfo;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.stream.Collectors;
public abstract class SkillCastingInstance extends BukkitRunnable implements Listener {
public abstract class SkillCastingInstance implements Listener, Runnable {
protected final PlayerData caster;
private final SkillCastingHandler handler;
private BukkitTask task;
private static final int RUNNABLE_PERIOD = 10;
/**
* This variable temporarily stores the active skills that the player
* can try to cast.
*/
private List<BoundSkillInfo> activeSkills;
private boolean open = true;
private int j, sinceLastActivity;
@ -32,7 +30,7 @@ public abstract class SkillCastingInstance extends BukkitRunnable implements Lis
this.handler = handler;
this.caster = caster;
runTaskTimer(MMOCore.plugin, 0, 1);
task = SchedulerAdapter.runTaskTimer(MMOCore.plugin, this, 0, 1);
Bukkit.getPluginManager().registerEvents(this, MMOCore.plugin);
}
@ -45,11 +43,9 @@ public abstract class SkillCastingInstance extends BukkitRunnable implements Lis
open = false;
// Unregister listeners
HandlerList.unregisterAll(this);
// Cancel runnable
cancel();
if (task != null) task.cancel();
}
public void refreshTimeOut() {

View File

@ -16,6 +16,7 @@ import io.lumine.mythic.lib.util.annotation.BackwardsCompatibility;
import io.lumine.mythic.lib.version.VParticle;
import net.Indyuce.mmocore.api.event.PlayerResourceUpdateEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Color;
import org.bukkit.Location;
import org.bukkit.Particle;
@ -23,7 +24,7 @@ import org.bukkit.Sound;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull;
public class Ambers extends SkillHandler<SimpleSkillResult> implements Listener {
@ -65,10 +66,11 @@ public class Ambers extends SkillHandler<SimpleSkillResult> implements Listener
passive.getTriggeredSkill().cast(new TriggerMetadata(event, TriggerType.API));
}
class Amber extends BukkitRunnable {
class Amber implements Runnable {
private final Location loc;
private final MMOPlayerData data;
private final double percent;
private BukkitTask task;
private int j;
@ -80,13 +82,13 @@ public class Ambers extends SkillHandler<SimpleSkillResult> implements Listener
this.percent = percent / 100;
final Amber amber = this;
new ParabolicProjectile(source, loc, VParticle.REDSTONE.get(), () -> amber.runTaskTimer(MythicLib.plugin, 0, 3), 1, Color.ORANGE, 1.3f);
new ParabolicProjectile(source, loc, VParticle.REDSTONE.get(), () -> { task = SchedulerAdapter.runTaskTimer(MythicLib.plugin, amber, 0, 3); }, 1, Color.ORANGE, 1.3f);
}
@Override
public void run() {
if (j++ > 66 || !data.isOnline() || !data.getPlayer().getWorld().equals(loc.getWorld())) {
cancel();
if (task != null) task.cancel();
return;
}
@ -99,7 +101,7 @@ public class Ambers extends SkillHandler<SimpleSkillResult> implements Listener
double missingMana = data.getStatMap().getStat("MAX_MANA") - playerData.getMana();
playerData.giveMana(missingMana * percent, PlayerResourceUpdateEvent.UpdateReason.SKILL_REGENERATION);
cancel();
if (task != null) task.cancel();
return;
}

View File

@ -0,0 +1,101 @@
package net.Indyuce.mmocore.util;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitTask;
public class SchedulerAdapter {
private static final boolean IS_FOLIA;
static {
boolean folia;
try {
Class.forName("io.papermc.paper.threadedregions.scheduler.RegionScheduler");
folia = true;
} catch (ClassNotFoundException e) {
folia = false;
}
IS_FOLIA = folia;
}
public static boolean isFolia() {
return IS_FOLIA;
}
public static BukkitTask runTask(Plugin plugin, Runnable task) {
if (IS_FOLIA) {
Bukkit.getGlobalRegionScheduler().execute(plugin, task);
return null;
}
return Bukkit.getScheduler().runTask(plugin, task);
}
public static BukkitTask runTaskLater(Plugin plugin, Runnable task, long delay) {
if (IS_FOLIA) {
Bukkit.getGlobalRegionScheduler().runDelayed(plugin, scheduledTask -> task.run(), delay);
return null;
}
return Bukkit.getScheduler().runTaskLater(plugin, task, delay);
}
public static BukkitTask runTaskTimer(Plugin plugin, Runnable task, long delay, long period) {
if (IS_FOLIA) {
long foliaDelay = delay <= 0 ? 1 : delay;
Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, scheduledTask -> task.run(), foliaDelay, period);
return null;
}
return Bukkit.getScheduler().runTaskTimer(plugin, task, delay, period);
}
public static BukkitTask runTaskAsynchronously(Plugin plugin, Runnable task) {
if (IS_FOLIA) {
Bukkit.getAsyncScheduler().runNow(plugin, scheduledTask -> task.run());
return null;
}
return Bukkit.getScheduler().runTaskAsynchronously(plugin, task);
}
public static void runAtLocation(Plugin plugin, Location location, Runnable task) {
if (IS_FOLIA) {
Bukkit.getRegionScheduler().execute(plugin, location, task);
} else {
Bukkit.getScheduler().runTask(plugin, task);
}
}
public static void runAtLocationLater(Plugin plugin, Location location, Runnable task, long delay) {
if (IS_FOLIA) {
Bukkit.getRegionScheduler().runDelayed(plugin, location, scheduledTask -> task.run(), delay);
} else {
Bukkit.getScheduler().runTaskLater(plugin, task, delay);
}
}
public static void runAtEntity(Plugin plugin, Entity entity, Runnable task) {
if (IS_FOLIA) {
entity.getScheduler().execute(plugin, task, null, 0L);
} else {
Bukkit.getScheduler().runTask(plugin, task);
}
}
public static void runAtEntityLater(Plugin plugin, Entity entity, Runnable task, long delay) {
if (IS_FOLIA) {
entity.getScheduler().execute(plugin, task, null, delay);
} else {
Bukkit.getScheduler().runTaskLater(plugin, task, delay);
}
}
public static void cancelTasks(Plugin plugin) {
if (IS_FOLIA) {
Bukkit.getGlobalRegionScheduler().cancelTasks(plugin);
Bukkit.getAsyncScheduler().cancelTasks(plugin);
} else {
Bukkit.getScheduler().cancelTasks(plugin);
}
}
}

View File

@ -12,6 +12,7 @@ import net.Indyuce.mmocore.experience.source.MineBlockExperienceSource;
import net.Indyuce.mmocore.loot.LootBuilder;
import net.Indyuce.mmocore.loot.chest.condition.ConditionInstance;
import net.Indyuce.mmocore.player.Message;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
@ -133,7 +134,7 @@ public class BlockListener implements Listener {
* Finally enable block regen.
*/
if (info.hasRegen())
Bukkit.getScheduler().runTaskLater(MythicLib.plugin, () -> MMOCore.plugin.mineManager.initialize(info.startRegeneration(Bukkit.createBlockData(savedData), block.getLocation()), !temporaryBlock), 1);
SchedulerAdapter.runTaskLater(MythicLib.plugin, () -> MMOCore.plugin.mineManager.initialize(info.startRegeneration(Bukkit.createBlockData(savedData), block.getLocation()), !temporaryBlock), 1);
}
/**

View File

@ -5,6 +5,7 @@ import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.PlayerChangeClassEvent;
import net.Indyuce.mmocore.api.event.PlayerLevelUpEvent;
import net.Indyuce.mmocore.script.trigger.MMOCoreTriggerType;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -21,8 +22,7 @@ public class ClassScriptListener implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onClassChange(PlayerChangeClassEvent event) {
// With delay
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> {
SchedulerAdapter.runTask(MMOCore.plugin, () -> {
final MMOPlayerData caster = event.getData().getMMOPlayerData();
caster.triggerSkills(MMOCoreTriggerType.CLASS_CHOSEN, null);
});
@ -31,8 +31,7 @@ public class ClassScriptListener implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onLevelUp(PlayerLevelUpEvent event) {
// With delay
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> {
SchedulerAdapter.runTask(MMOCore.plugin, () -> {
final MMOPlayerData caster = event.getData().getMMOPlayerData();
caster.triggerSkills(MMOCoreTriggerType.LEVEL_UP, null);
});

View File

@ -4,6 +4,7 @@ import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.event.social.GuildChatEvent;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.player.Message;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -22,8 +23,7 @@ public class GuildListener implements Listener {
event.setCancelled(true);
// Run it sync
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> {
SchedulerAdapter.runTask(MMOCore.plugin, () -> {
var rawMessage = event.getMessage().substring(MMOCore.plugin.nativeGuildManager.getConfig().getPrefix().length());
var message = Message.GUILD_CHAT.prepare("player", data.getPlayer().getName(), "tag", data.getGuild().getTag(), "message", rawMessage);
GuildChatEvent called = new GuildChatEvent(data, message.getRawContent());

View File

@ -2,6 +2,7 @@ package net.Indyuce.mmocore.listener.option;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -29,7 +30,7 @@ public class VanillaExperienceOverride implements Listener {
@EventHandler(priority = EventPriority.HIGHEST)
public void cancelChange(PlayerRespawnEvent event) {
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> PlayerData.get(event.getPlayer()).refreshVanillaExp());
SchedulerAdapter.runTask(MMOCore.plugin, () -> PlayerData.get(event.getPlayer()).refreshVanillaExp());
}
/**
@ -42,6 +43,6 @@ public class VanillaExperienceOverride implements Listener {
@EventHandler
public void cancelChange(EnchantItemEvent event) {
Player player = event.getEnchanter();
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> player.setLevel(PlayerData.get(player).getLevel()));
SchedulerAdapter.runTask(MMOCore.plugin, () -> player.setLevel(PlayerData.get(player).getLevel()));
}
}

View File

@ -11,6 +11,7 @@ import net.Indyuce.mmocore.loot.LootBuilder;
import net.Indyuce.mmocore.loot.fishing.FishingDropItem;
import net.Indyuce.mmocore.manager.profession.FishingManager.FishingDropTable;
import net.Indyuce.mmocore.util.Language;
import net.Indyuce.mmocore.util.SchedulerAdapter;
import org.bukkit.*;
import org.bukkit.entity.FishHook;
import org.bukkit.entity.Item;
@ -23,7 +24,7 @@ import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.event.player.PlayerFishEvent.State;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;
import java.util.HashSet;
@ -55,7 +56,8 @@ public class FishingListener implements Listener {
}
}
public class FishingData extends BukkitRunnable implements Listener {
public class FishingData implements Listener, Runnable {
private BukkitTask task;
private final Location location;
private final FishingDropItem caught;
private final PlayerData playerData;
@ -85,7 +87,7 @@ public class FishingListener implements Listener {
this.experienceDropped = caught.rollExperience();
this.vanillaExpDropped = caught.rollVanillaExp();
fishing.add(player.getUniqueId());
runTaskTimer(MMOCore.plugin, 0, 2);
task = SchedulerAdapter.runTaskTimer(MMOCore.plugin, this, 0, 2);
Bukkit.getPluginManager().registerEvents(this, MMOCore.plugin);
// Check for instant loot
@ -122,7 +124,7 @@ public class FishingListener implements Listener {
hook.remove();
HandlerList.unregisterAll(this);
cancel();
if (task != null) task.cancel();
}
@Override

View File

@ -7,6 +7,7 @@ loadbefore: [ MMOItems,MythicDungeons ]
depend: [ MythicLib ]
softdepend: [ Vault,MythicMobs,MMOProfiles,PlaceholderAPI,Residence,Citizens,ProtocolLib,OBTeam ]
api-version: 1.14
folia-supported: true
website: www.phoenixdevt.fr
commands:
mmocore: