Citizens2/main/src/main/java/net/citizensnpcs/trait/versioned/BossBarTrait.java

281 lines
8.2 KiB
Java
Raw Normal View History

package net.citizensnpcs.trait.versioned;
2019-04-24 15:01:22 +02:00
import java.util.Collection;
import java.util.List;
2023-10-20 16:08:37 +02:00
import java.util.function.Supplier;
2019-04-24 15:01:22 +02:00
import org.bukkit.Bukkit;
import org.bukkit.attribute.Attribute;
2019-04-24 15:01:22 +02:00
import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarFlag;
import org.bukkit.boss.BarStyle;
2019-04-24 15:01:22 +02:00
import org.bukkit.boss.BossBar;
2022-07-09 19:53:34 +02:00
import org.bukkit.command.CommandSender;
2019-04-24 15:01:22 +02:00
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
2019-04-24 15:01:22 +02:00
2022-07-09 19:53:34 +02:00
import com.google.common.base.Splitter;
2019-04-24 15:01:22 +02:00
import com.google.common.collect.Lists;
2023-01-03 13:55:27 +01:00
import com.google.common.primitives.Doubles;
2019-04-24 15:01:22 +02:00
import net.citizensnpcs.Settings.Setting;
2022-12-03 17:59:16 +01:00
import net.citizensnpcs.api.CitizensAPI;
2022-07-09 19:53:34 +02:00
import net.citizensnpcs.api.command.Command;
import net.citizensnpcs.api.command.CommandContext;
import net.citizensnpcs.api.command.Flag;
2022-07-09 19:53:34 +02:00
import net.citizensnpcs.api.command.Requirements;
import net.citizensnpcs.api.command.exception.CommandException;
import net.citizensnpcs.api.npc.NPC;
2019-04-24 15:01:22 +02:00
import net.citizensnpcs.api.persistence.Persist;
import net.citizensnpcs.api.trait.Trait;
import net.citizensnpcs.api.trait.TraitName;
2022-12-18 06:50:19 +01:00
import net.citizensnpcs.api.util.Messaging;
import net.citizensnpcs.api.util.Placeholders;
import net.citizensnpcs.util.NMS;
2022-07-09 19:53:34 +02:00
import net.citizensnpcs.util.Util;
2019-04-24 15:01:22 +02:00
@TraitName("bossbar")
public class BossBarTrait extends Trait {
2023-11-15 15:39:09 +01:00
private BossBar activeBar;
@Persist
private BarColor color = BarColor.PURPLE;
@Persist
2019-04-24 15:01:22 +02:00
private List<BarFlag> flags = Lists.newArrayList();
2023-10-20 16:08:37 +02:00
private Supplier<Double> progressProvider;
@Persist
private int range = -1;
@Persist
private BarStyle style = BarStyle.SOLID;
@Persist
private String title = "";
@Persist
private String track;
@Persist
2023-06-24 18:25:49 +02:00
private String viewPermission;
@Persist
2019-04-24 15:01:22 +02:00
private boolean visible = true;
public BossBarTrait() {
super("bossbar");
}
2022-04-09 05:41:12 +02:00
private BossBar getBar() {
2023-07-15 17:02:02 +02:00
if (npc.isSpawned() && isBoss(npc.getEntity()) && NMS.getBossBar(npc.getEntity()) != null)
2022-04-09 05:41:12 +02:00
return (BossBar) NMS.getBossBar(npc.getEntity());
2023-10-20 16:08:37 +02:00
2023-11-15 15:39:09 +01:00
if (activeBar == null) {
activeBar = Bukkit.getServer().createBossBar(npc.getFullName(), color, style,
2022-04-09 05:41:12 +02:00
flags.toArray(new BarFlag[flags.size()]));
}
2023-11-15 15:39:09 +01:00
return activeBar;
2022-04-09 05:41:12 +02:00
}
2020-10-07 13:16:41 +02:00
public BarColor getColor() {
return color;
}
public List<BarFlag> getFlags() {
return flags;
}
public int getRange() {
return range;
}
public BarStyle getStyle() {
return style;
}
2020-10-07 13:16:41 +02:00
public String getTitle() {
return title;
}
public String getTrackingVariable() {
return track;
}
2023-06-24 18:25:49 +02:00
public String getViewPermission() {
return viewPermission;
}
2019-04-24 15:01:22 +02:00
private boolean isBoss(Entity entity) {
2023-07-15 17:02:02 +02:00
boolean isBoss = entity.getType() == EntityType.ENDER_DRAGON || entity.getType() == EntityType.WITHER;
if (isBoss) {
2023-07-15 17:02:02 +02:00
onDespawn();
}
return isBoss;
2019-04-24 15:01:22 +02:00
}
2020-10-07 13:16:41 +02:00
public boolean isVisible() {
return visible;
}
2022-04-09 05:41:12 +02:00
@Override
public void onDespawn() {
2023-11-15 15:39:09 +01:00
if (activeBar == null)
return;
2023-10-20 16:08:37 +02:00
2023-11-15 15:39:09 +01:00
activeBar.removeAll();
activeBar.hide();
activeBar = null;
2022-04-09 05:41:12 +02:00
}
2022-11-23 12:13:17 +01:00
@Override
public void onRemove() {
onDespawn();
}
2019-04-24 15:01:22 +02:00
@Override
public void run() {
if (!npc.isSpawned())
2019-04-24 15:01:22 +02:00
return;
2023-10-20 16:08:37 +02:00
2022-04-09 05:41:12 +02:00
BossBar bar = getBar();
2023-07-15 17:02:02 +02:00
if (bar == null)
return;
2023-07-15 17:02:02 +02:00
2023-08-12 14:31:15 +02:00
if (track != null && !track.isEmpty()) {
if (track.equalsIgnoreCase("health")) {
2023-08-12 14:31:15 +02:00
if (npc.getEntity() instanceof LivingEntity) {
2023-08-12 15:09:46 +02:00
LivingEntity entity = (LivingEntity) npc.getEntity();
2023-08-12 14:31:15 +02:00
double maxHealth = entity.getMaxHealth();
if (SUPPORT_ATTRIBUTES) {
try {
maxHealth = entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue();
} catch (Throwable t) {
SUPPORT_ATTRIBUTES = false;
}
}
2023-08-12 14:31:15 +02:00
bar.setProgress(entity.getHealth() / maxHealth);
}
2023-08-12 14:31:15 +02:00
} else {
String replaced = Placeholders.replace(track,
npc.getEntity() instanceof Player ? (Player) npc.getEntity() : null);
2023-01-03 13:55:27 +01:00
Double number = Doubles.tryParse(replaced);
if (number == null)
return;
if (number >= 1 && number <= 100) {
number /= 100.0;
}
2023-08-12 14:31:15 +02:00
bar.setProgress(Math.max(0, Math.min(1, number)));
}
}
2022-07-16 20:10:38 +02:00
bar.setTitle(title);
2019-04-24 15:01:22 +02:00
bar.setVisible(visible);
2023-10-20 16:08:37 +02:00
if (progressProvider != null) {
bar.setProgress(progressProvider.get());
}
2022-07-16 20:10:38 +02:00
if (style != null) {
bar.setStyle(style);
}
2019-04-24 15:01:22 +02:00
if (color != null) {
bar.setColor(color);
}
for (BarFlag flag : BarFlag.values()) {
bar.removeFlag(flag);
}
for (BarFlag flag : flags) {
bar.addFlag(flag);
}
2023-07-15 17:02:02 +02:00
bar.removeAll();
2023-10-20 16:08:37 +02:00
2023-07-15 17:02:02 +02:00
for (Player player : CitizensAPI.getLocationLookup().getNearbyPlayers(npc.getEntity().getLocation(),
range > 0 ? range : Setting.BOSSBAR_RANGE.asInt())) {
2024-03-23 16:46:09 +01:00
if (viewPermission != null && !player.hasPermission(viewPermission))
2023-07-15 17:02:02 +02:00
continue;
2024-03-23 16:46:09 +01:00
2023-07-15 17:02:02 +02:00
bar.addPlayer(player);
}
2019-04-24 15:01:22 +02:00
}
public void setColor(BarColor color) {
this.color = color;
}
public void setFlags(Collection<BarFlag> flags) {
this.flags = Lists.newArrayList(flags);
}
2020-10-07 13:16:41 +02:00
public void setFlags(List<BarFlag> flags) {
this.flags = flags;
}
2023-10-20 16:08:37 +02:00
public void setProgressProvider(Supplier<Double> provider) {
progressProvider = provider;
2023-10-20 16:08:37 +02:00
}
public void setRange(int range) {
this.range = range;
}
public void setStyle(BarStyle style) {
this.style = style;
}
2019-04-24 15:01:22 +02:00
public void setTitle(String title) {
this.title = title;
}
public void setTrackVariable(String variable) {
track = variable;
}
2023-06-24 18:25:49 +02:00
public void setViewPermission(String viewpermission) {
viewPermission = viewpermission;
2023-06-24 18:25:49 +02:00
}
2019-04-24 15:01:22 +02:00
public void setVisible(boolean visible) {
this.visible = visible;
}
2022-07-09 19:53:34 +02:00
@Command(
aliases = { "npc" },
2023-06-24 18:25:49 +02:00
usage = "bossbar --style [style] --color [color] --title [title] --visible [visible] --viewpermission [permission] --flags [flags] --track [health | placeholder] --range [range]",
2024-02-29 18:03:30 +01:00
desc = "",
2022-07-09 19:53:34 +02:00
modifiers = { "bossbar" },
min = 1,
max = 1)
@Requirements(selected = true, ownership = true)
public static void bossbar(CommandContext args, CommandSender sender, NPC npc, @Flag("style") BarStyle style,
@Flag("track") String track, @Flag("color") BarColor color, @Flag("visible") Boolean visible,
2023-06-24 18:25:49 +02:00
@Flag("range") Integer range, @Flag("title") String title, @Flag("flags") String flags,
@Flag("viewpermission") String viewpermission) throws CommandException {
2022-07-09 19:53:34 +02:00
BossBarTrait trait = npc.getOrAddTrait(BossBarTrait.class);
if (style != null) {
trait.setStyle(style);
2022-07-09 19:53:34 +02:00
}
if (color != null) {
trait.setColor(color);
2022-07-09 19:53:34 +02:00
}
if (track != null) {
trait.setTrackVariable(track);
2022-07-09 19:53:34 +02:00
}
if (title != null) {
2022-12-18 06:50:19 +01:00
trait.setTitle(Messaging.parseComponents(title));
2022-07-09 19:53:34 +02:00
}
if (visible != null) {
trait.setVisible(visible);
2022-07-09 19:53:34 +02:00
}
if (range != null) {
trait.setRange(range);
}
2023-06-24 18:25:49 +02:00
if (viewpermission != null) {
trait.setViewPermission(viewpermission);
}
if (flags != null) {
List<BarFlag> parsed = Lists.newArrayList();
for (String s : Splitter.on(',').omitEmptyStrings().trimResults().split(flags)) {
2022-07-09 19:53:34 +02:00
BarFlag flag = Util.matchEnum(BarFlag.values(), s);
if (flag != null) {
parsed.add(flag);
2022-07-09 19:53:34 +02:00
}
}
trait.setFlags(parsed);
2022-07-09 19:53:34 +02:00
}
}
private static boolean SUPPORT_ATTRIBUTES = true;
2019-04-24 15:01:22 +02:00
}