Skip to content

Commit

Permalink
Rewrite & optimize boss bar
Browse files Browse the repository at this point in the history
  • Loading branch information
Krakenied committed Sep 24, 2023
1 parent a101ba1 commit c7c9acf
Show file tree
Hide file tree
Showing 50 changed files with 146 additions and 141 deletions.
Expand Up @@ -27,10 +27,10 @@
import com.leonardobishop.quests.bukkit.command.QuestsCommandSwitcher;
import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig;
import com.leonardobishop.quests.bukkit.config.BukkitQuestsLoader;
import com.leonardobishop.quests.bukkit.hook.actionbar.ActionBar;
import com.leonardobishop.quests.bukkit.hook.actionbar.QuestsActionBar;
import com.leonardobishop.quests.bukkit.hook.actionbar.ActionBar_Bukkit;
import com.leonardobishop.quests.bukkit.hook.actionbar.ActionBar_Nothing;
import com.leonardobishop.quests.bukkit.hook.bossbar.BossBar;
import com.leonardobishop.quests.bukkit.hook.bossbar.QuestsBossBar;
import com.leonardobishop.quests.bukkit.hook.bossbar.BossBar_Bukkit;
import com.leonardobishop.quests.bukkit.hook.bossbar.BossBar_Nothing;
import com.leonardobishop.quests.bukkit.hook.coreprotect.AbstractCoreProtectHook;
Expand All @@ -53,7 +53,6 @@
import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler11;
import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler16;
import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler17;
import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler20;
import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler8;
import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler9;
import com.leonardobishop.quests.bukkit.item.ParsedQuestItem;
Expand Down Expand Up @@ -163,8 +162,8 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
private AbstractPlayerBlockTrackerHook playerBlockTrackerHook;
private ItemGetter itemGetter;
private Title titleHandle;
private BossBar bossBarHandle;
private ActionBar actionBarHandle;
private QuestsBossBar bossBarHandle;
private QuestsActionBar actionBarHandle;
private VersionSpecificHandler versionSpecificHandler;

private LogHistory logHistory;
Expand Down Expand Up @@ -302,8 +301,7 @@ public void onEnable() {
case 9, 10 -> versionSpecificHandler = new VersionSpecificHandler9();
case 11, 12, 13, 14, 15 -> versionSpecificHandler = new VersionSpecificHandler11();
case 16 -> versionSpecificHandler = new VersionSpecificHandler16();
case 17, 18, 19 -> versionSpecificHandler = new VersionSpecificHandler17();
default -> versionSpecificHandler = new VersionSpecificHandler20();
default -> versionSpecificHandler = new VersionSpecificHandler17();
}

questsConfig.setItemGetter(itemGetter);
Expand Down Expand Up @@ -690,12 +688,12 @@ public ItemGetter getItemGetter() {
public Title getTitleHandle() {
return titleHandle;
}
public BossBar getBossBarHandle() {

public QuestsBossBar getBossBarHandle() {
return bossBarHandle;
}
public ActionBar getActionBarHandle() {

public QuestsActionBar getActionBarHandle() {
return actionBarHandle;
}

Expand Down
Expand Up @@ -5,7 +5,7 @@
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;

public class ActionBar_Bukkit implements ActionBar {
public class ActionBar_Bukkit implements QuestsActionBar {

@SuppressWarnings("deprecation")
@Override
Expand Down
Expand Up @@ -2,7 +2,7 @@

import org.bukkit.entity.Player;

public class ActionBar_Nothing implements ActionBar {
public class ActionBar_Nothing implements QuestsActionBar {

@Override
public void sendActionBar(Player p, String line) {
Expand Down
Expand Up @@ -2,7 +2,7 @@

import org.bukkit.entity.Player;

public interface ActionBar {
public interface QuestsActionBar {

void sendActionBar(Player p, String line);

Expand Down

This file was deleted.

@@ -1,76 +1,60 @@
package com.leonardobishop.quests.bukkit.hook.bossbar;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.RemovalListener;
import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarStyle;
import org.bukkit.boss.BossBar;
import org.bukkit.entity.Player;

import com.google.common.collect.Lists;
import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

public class BossBar_Bukkit implements BossBar {
public class BossBar_Bukkit implements QuestsBossBar {

private BukkitQuestsPlugin plugin;
private final ConcurrentHashMap<NamespacedKey, Long> players = new ConcurrentHashMap<>();
private static final RemovalListener<String, BossBar> removalListener = removal -> removal.getValue().removeAll();

// use cache because of its concurrency and automatic player on quit removal
private final Cache<Player, Cache<String, BossBar>> playerQuestBarCache = CacheBuilder.newBuilder().weakKeys().build();
private final BukkitQuestsPlugin plugin;

public BossBar_Bukkit(BukkitQuestsPlugin plugin) {
this.plugin = plugin;
String pluginNamespace = new NamespacedKey(plugin, "test").getNamespace(); // get namespace
Lists.newArrayList(Bukkit.getBossBars()).forEach(bb -> { // copy list to prevent current modification
if(bb.getKey().namespace().equals(pluginNamespace)) {
bb.removeAll(); // hide it
Bukkit.removeBossBar(bb.getKey()); // remove it
}
});
plugin.getScheduler().runTaskTimer(() -> {
for (Entry<NamespacedKey, Long> entry : new HashMap<>(players).entrySet()) {
if (entry.getValue() < System.currentTimeMillis()) {
NamespacedKey key = entry.getKey();
players.remove(key);
org.bukkit.boss.BossBar oldBar = Bukkit.getBossBar(key);
if(oldBar != null) { // if exist
oldBar.removeAll(); // remove all players on it
Bukkit.removeBossBar(key); // remove it
}
}
}
}, 20, 20);
}

@Override
public void sendBossBar(Player p, String questKey, String title, int time) {
NamespacedKey spaceKey = getKeyFor(p, questKey);
org.bukkit.boss.BossBar bar = Bukkit.getBossBar(spaceKey);
if (bar == null) {// if none exist
bar = Bukkit.createBossBar(spaceKey, title, BarColor.BLUE, BarStyle.SOLID);
} else {
bar.setTitle(title);
}
players.put(spaceKey, System.currentTimeMillis() + time * 1000);
bar.addPlayer(p); // be sure it see it
public void sendBossBar(Player player, String questId, String title, int time) {
sendBossBar(player, questId, title, time, 1.0f);
}

@Override
public void sendBossBar(Player p, String questKey, String title, int percent, int time) {
NamespacedKey spaceKey = getKeyFor(p, questKey);
org.bukkit.boss.BossBar bar = Bukkit.getBossBar(spaceKey);
if (bar == null) {// if none exist
bar = Bukkit.createBossBar(spaceKey, title, BarColor.BLUE, BarStyle.SOLID);
} else {
public void sendBossBar(Player player, String questId, String title, int time, float progress) {
CompletableFuture<BossBar> future = new CompletableFuture<>();
future.thenAccept(bar -> bar.addPlayer(player));

this.plugin.getScheduler().runTaskAsynchronously(() -> {
Cache<String, BossBar> questBarCache = playerQuestBarCache.asMap()
.computeIfAbsent(player, k -> {
//noinspection CodeBlock2Expr (for readability)
return CacheBuilder.newBuilder()
.expireAfterAccess(time, TimeUnit.SECONDS)
.removalListener(removalListener)
.build();
});

BossBar bar = questBarCache.asMap()
.computeIfAbsent(questId, k -> {
//noinspection CodeBlock2Expr (for readability)
return Bukkit.createBossBar(null, BarColor.BLUE, BarStyle.SOLID);
});

bar.setTitle(title);
}
players.put(spaceKey, System.currentTimeMillis() + time * 1000);
double progress = ((double) percent) / 100;
bar.setProgress(progress < 0 ? 0 : (progress > 1 ? 1 : progress));
bar.addPlayer(p); // be sure it see it
}
bar.setProgress(progress);

private NamespacedKey getKeyFor(Player p, String questKey) {
return new NamespacedKey(plugin, "bossbar_" + p.getName().toLowerCase() + "_" + questKey.toLowerCase().replace(" ", ""));
future.complete(bar);
});
}
}
Expand Up @@ -2,15 +2,15 @@

import org.bukkit.entity.Player;

public class BossBar_Nothing implements BossBar {
public class BossBar_Nothing implements QuestsBossBar {

@Override
public void sendBossBar(Player p, String questKey, String title, int time) {
public void sendBossBar(Player player, String questId, String title, int time) {
// old versions as 1.8
}

@Override
public void sendBossBar(Player p, String questKey, String title, int progress, int time) {
public void sendBossBar(Player player, String questId, String title, int time, float progress) {
// old versions as 1.8
}

Expand Down
@@ -0,0 +1,11 @@
package com.leonardobishop.quests.bukkit.hook.bossbar;

import org.bukkit.entity.Player;

public interface QuestsBossBar {

void sendBossBar(Player player, String questId, String title, int time);

void sendBossBar(Player player, String questId, String title, int time, float progress);

}
Expand Up @@ -61,7 +61,7 @@ public void onPlayerShearBlock(PlayerShearBlockEvent event) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}
Expand Up @@ -111,7 +111,7 @@ private void handle(Player player, Entity entity) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}
Expand Up @@ -124,7 +124,7 @@ public void onBrew(BrewEvent event) {
taskProgress.setProgress(amount);
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}
Expand Up @@ -56,7 +56,7 @@ public void onBucket(Player player, Material bucket, BukkitQuestsPlugin plugin)
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}

Expand Down
Expand Up @@ -65,7 +65,7 @@ public void onBlockPlace(BlockPlaceEvent event) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}

Expand Down
Expand Up @@ -82,7 +82,7 @@ public void onPlayerItemConsume(PlayerItemConsumeEvent event) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}
Expand Up @@ -112,7 +112,7 @@ public void onCraftItem(CraftItemEvent event) {
taskProgress.setProgress(amount);
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}

Expand Down
Expand Up @@ -70,7 +70,7 @@ public void onDamage(EntityDamageByEntityEvent event) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}
Expand Up @@ -109,7 +109,7 @@ public void onEnchant(EnchantItemEvent e) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}
Expand Up @@ -54,7 +54,7 @@ public void onExpEarn(PlayerExpChangeEvent e) {
taskProgress.setProgress(expNeeded);
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}
Expand Up @@ -89,7 +89,7 @@ private void handle(Player player, Block block, BlockData blockData, String mode
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}
Expand Up @@ -95,7 +95,7 @@ public void onFishCaught(PlayerFishEvent event) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}
Expand Up @@ -105,7 +105,7 @@ public void onPlayerInteract(PlayerInteractEvent event) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}
Expand Up @@ -164,7 +164,7 @@ private void checkInventory(Player player) {
}
}
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}

Expand Down
Expand Up @@ -58,7 +58,7 @@ public void onMilk(PlayerInteractEntityEvent event) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}

Expand Down
Expand Up @@ -104,7 +104,7 @@ public void onBlockBreak(BlockBreakEvent event) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
};

boolean coreProtectEnabled = TaskUtils.getConfigBoolean(task, "check-coreprotect");
Expand Down
Expand Up @@ -130,7 +130,7 @@ public void onEntityDeath(EntityDeathEvent event) {
super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
taskProgress.setCompleted(true);
}
TaskUtils.sendTrackAdvancement(player, quest, taskProgress);
TaskUtils.sendTrackAdvancement(player, quest, task, taskProgress);
}
}
}

0 comments on commit c7c9acf

Please sign in to comment.