Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9fad798af8 | ||
|
|
f3cbbfb2b5 | ||
|
|
4d1d5ca25e | ||
|
|
cd53aaf8e3 | ||
|
|
36a0ef0dfd | ||
|
|
232ed9be84 | ||
|
|
7e3d7d7918 | ||
|
|
f277ee4de2 | ||
|
|
1613c8d2c5 | ||
|
|
91d74ddf4e | ||
|
|
45544a71c7 | ||
|
|
a454dff208 | ||
|
|
6075333d7b | ||
|
|
9d16e5fe32 | ||
|
|
b8babc7542 | ||
|
|
80cb76e98b | ||
|
|
1e6c8a033a | ||
|
|
cd09080ced | ||
|
|
bf01337fcf | ||
|
|
ef3998bd3b | ||
|
|
38d006cf6e | ||
|
|
d19f997846 | ||
|
|
92d3281fad | ||
|
|
538edffa1a |
No files matched your search
+20
-17
@@ -1,6 +1,6 @@
|
||||
# Installation
|
||||
|
||||
Latest version: `2.6.0`
|
||||
Latest version: `2.7.0`
|
||||
|
||||
## Gradle
|
||||
|
||||
@@ -10,13 +10,11 @@ repositories {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
val scoreboardLibraryVersion = "{VERSION HERE}"
|
||||
implementation("net.megavex:scoreboard-library-api:$scoreboardLibraryVersion")
|
||||
runtimeOnly("net.megavex:scoreboard-library-implementation:$scoreboardLibraryVersion")
|
||||
implementation("net.megavex:scoreboard-library-extra-kotlin:$scoreboardLibraryVersion") // Kotlin specific extensions (optional)
|
||||
implementation("net.megavex:scoreboard-library-api:2.7.0")
|
||||
runtimeOnly("net.megavex:scoreboard-library-implementation:2.7.0")
|
||||
|
||||
// If targeting a Minecraft version without native Adventure support, add it as well:
|
||||
implementation("net.kyori:adventure-platform-bukkit:4.3.4")
|
||||
// If targeting a server version without native Adventure support, add it as well:
|
||||
implementation("net.kyori:adventure-platform-bukkit:4.4.1")
|
||||
}
|
||||
```
|
||||
|
||||
@@ -30,28 +28,33 @@ like [Shadow](https://gradleup.com/shadow/).
|
||||
<dependency>
|
||||
<groupId>net.megavex</groupId>
|
||||
<artifactId>scoreboard-library-api</artifactId>
|
||||
<version>{VERSION HERE}</version>
|
||||
<version>2.7.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.megavex</groupId>
|
||||
<artifactId>scoreboard-library-implementation</artifactId>
|
||||
<version>{VERSION HERE}</version>
|
||||
<version>2.7.0</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<!-- Kotlin specific extensions (optional) -->
|
||||
<dependency>
|
||||
<groupId>net.megavex</groupId>
|
||||
<artifactId>scoreboard-library-extra-kotlin</artifactId>
|
||||
<version>{VERSION HERE}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- If targeting a Minecraft version without native Adventure support, add it as well: -->
|
||||
<!-- If targeting a server version without native Adventure support, add it as well: -->
|
||||
<dependency>
|
||||
<groupId>net.kyori</groupId>
|
||||
<artifactId>adventure-platform-bukkit</artifactId>
|
||||
<version>4.0.1</version>
|
||||
<version>4.4.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
```
|
||||
|
||||
You will need to shade these dependencies and relocate them with [maven-shade-plugin](https://maven.apache.org/plugins/maven-shade-plugin/).
|
||||
|
||||
## ViaVersion awareness
|
||||
|
||||
For [ViaVersion awareness](https://github.com/vytskalt/scoreboard-library?tab=readme-ov-file#features) to be enabled, make sure to add `ViaVersion`
|
||||
to `softdepend` or `depend` of your `plugin.yml`:
|
||||
|
||||
```yaml
|
||||
softdepend: ["ViaVersion"]
|
||||
# or
|
||||
depend: ["ViaVersion"]
|
||||
```
|
||||
@@ -13,17 +13,19 @@ Join the [Discord](https://discord.gg/v7nmTDTW8W) or create an issue for support
|
||||
players
|
||||
- Objectives.
|
||||
- Full support for new 1.20.4 features (score display names, custom score formats)
|
||||
- Doesn't require extra dependencies (assuming you're targeting modern versions of Paper)
|
||||
- No extra dependencies (assuming you're targeting modern versions of Paper)
|
||||
- Packet-level, meaning it works with other scoreboard plugins
|
||||
- Supports [Folia](https://github.com/PaperMC/Folia)
|
||||
- Fully async. All packet work is done asynchronously, so you can use the library from the main
|
||||
thread without sacrificing any performance
|
||||
- Automatically works with `TranslatableComponent`s. All components are translated using `GlobalTranslator` for
|
||||
each player's client locale and automatically update whenever the player changes it in their settings
|
||||
- ViaVersion awareness: automatically detects 1.12.2- on 1.13+ servers connected through ViaVersion and sends them
|
||||
the optimal packets to maximise sidebar line lengths
|
||||
|
||||
## Supported server versions
|
||||
|
||||
All Paper and Spigot versions from 1.7.10 to 1.21.11 are now natively supported.
|
||||
All Paper and Spigot versions from 1.7.10 to 26.1 are natively supported.
|
||||
|
||||
## Installation
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
class NoopObjectiveManager implements ObjectiveManager {
|
||||
private final Map<String, ScoreboardObjective> objectives = new HashMap<>();
|
||||
@@ -42,6 +43,12 @@ class NoopObjectiveManager implements ObjectiveManager {
|
||||
return players.remove(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> removePlayerFuture(@NotNull Player player) {
|
||||
players.remove(player);
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
isClosed = true;
|
||||
|
||||
@@ -48,11 +48,21 @@ class NoopTeamDisplay implements TeamDisplay {
|
||||
return entries.add(entry);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addEntries(@NotNull final Collection<String> entries) {
|
||||
return this.entries.addAll(entries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeEntry(@NotNull String entry) {
|
||||
return entries.remove(entry);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeEntries(@NotNull final Collection<String> entries) {
|
||||
return this.entries.removeAll(entries);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Component displayName() {
|
||||
return displayName;
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
|
||||
@@ -48,6 +49,12 @@ class NoopTeamManager implements TeamManager {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> removePlayerFuture(@NotNull Player player) {
|
||||
this.removePlayer(player);
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Collection<ScoreboardTeam> teams() {
|
||||
return closed ? Collections.emptySet() : Collections.unmodifiableCollection(teams.values());
|
||||
@@ -80,6 +87,7 @@ class NoopTeamManager implements TeamManager {
|
||||
validateTeamDisplay(team, teamDisplay);
|
||||
team.displayMap().put(player, teamDisplay);
|
||||
}
|
||||
teams.put(name, team);
|
||||
|
||||
return team;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
/**
|
||||
* Represents a group of {@link ScoreboardObjective}s.
|
||||
@@ -85,6 +86,14 @@ public interface ObjectiveManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a viewer from this ObjectiveManager.
|
||||
*
|
||||
* @param player viewer to remove
|
||||
* @return future that will be completed once all removal packets have been sent in an async task
|
||||
*/
|
||||
CompletableFuture<Void> removePlayerFuture(@NotNull Player player);
|
||||
|
||||
/**
|
||||
* Closes this ObjectiveManager.
|
||||
* This must be called once you no longer need this ObjectiveManager to prevent a memory leak.
|
||||
|
||||
@@ -42,6 +42,15 @@ public interface TeamDisplay {
|
||||
*/
|
||||
boolean addEntry(@NotNull String entry);
|
||||
|
||||
/**
|
||||
* Adds multiple entries.
|
||||
*
|
||||
* @param entries entries to add
|
||||
* @return whether any entry was added
|
||||
* @see #entries
|
||||
*/
|
||||
boolean addEntries(@NotNull Collection<String> entries);
|
||||
|
||||
/**
|
||||
* Removes an entry.
|
||||
*
|
||||
@@ -51,6 +60,15 @@ public interface TeamDisplay {
|
||||
*/
|
||||
boolean removeEntry(@NotNull String entry);
|
||||
|
||||
/**
|
||||
* Removes multiple entries.
|
||||
*
|
||||
* @param entries entries to remove
|
||||
* @return whether any entry was removed
|
||||
* @see #entries
|
||||
*/
|
||||
boolean removeEntries(@NotNull Collection<String> entries);
|
||||
|
||||
// Properties
|
||||
|
||||
/**
|
||||
|
||||
@@ -7,6 +7,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
|
||||
@@ -104,7 +105,7 @@ public interface TeamManager {
|
||||
* The TeamManager will internally be added to a queue for this player who
|
||||
* will start seeing it once they are removed from all previous TeamManagers.
|
||||
*
|
||||
* @param player player to add
|
||||
* @param player player to add
|
||||
* @param teamDisplayFunction a function that provides the team display to set for each team
|
||||
* @return whether the player was added
|
||||
*/
|
||||
@@ -152,6 +153,14 @@ public interface TeamManager {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes a viewer from this TeamManager.
|
||||
*
|
||||
* @param player viewer to remove
|
||||
* @return future that will be completed once all removal packets have been sent in an async task
|
||||
*/
|
||||
CompletableFuture<Void> removePlayerFuture(@NotNull Player player);
|
||||
|
||||
// Close
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
allprojects {
|
||||
version = "2.6.0"
|
||||
version = "2.7.1-SNAPSHOT"
|
||||
group = "net.megavex"
|
||||
description = "Powerful packet-level scoreboard library for Paper/Spigot servers"
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
plugins {
|
||||
id("net.megavex.scoreboardlibrary.base-conventions")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api(project(":scoreboard-library-api"))
|
||||
compileOnly(libs.spigotApi)
|
||||
}
|
||||
-66
@@ -1,66 +0,0 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.commons;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodHandles.Lookup;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.util.*;
|
||||
|
||||
public final class CollectionProvider {
|
||||
private static final MethodHandle mapConstructor, setConstructor, listConstructor;
|
||||
|
||||
static {
|
||||
Lookup lookup = MethodHandles.publicLookup();
|
||||
MethodType parameters = MethodType.methodType(void.class, int.class);
|
||||
mapConstructor = getConstructor(lookup, "it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap", HashMap.class, parameters);
|
||||
setConstructor = getConstructor(lookup, "it.unimi.dsi.fastutil.objects.ObjectOpenHashSet", HashSet.class, parameters);
|
||||
listConstructor = getConstructor(lookup, "it.unimi.dsi.fastutil.objects.ObjectArrayList", ArrayList.class, parameters);
|
||||
}
|
||||
|
||||
private CollectionProvider() {
|
||||
}
|
||||
|
||||
private static MethodHandle getConstructor(Lookup lookup, String fastUtilClass, Class<?> fallback, MethodType parameters) {
|
||||
Class<?> clazz;
|
||||
try {
|
||||
clazz = Class.forName(fastUtilClass);
|
||||
} catch (ClassNotFoundException e) {
|
||||
clazz = fallback;
|
||||
}
|
||||
|
||||
try {
|
||||
return lookup.findConstructor(clazz, parameters);
|
||||
} catch (NoSuchMethodException | IllegalAccessException e) {
|
||||
throw new ExceptionInInitializerError(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static <K, V> @NotNull Map<K, V> map(int capacity) {
|
||||
try {
|
||||
// noinspection unchecked
|
||||
return (Map<K, V>) mapConstructor.invokeWithArguments(capacity);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static <E> @NotNull Set<E> set(int capacity) {
|
||||
try {
|
||||
// noinspection unchecked
|
||||
return (Set<E>) setConstructor.invokeWithArguments(capacity);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static <E> @NotNull List<E> list(int capacity) {
|
||||
try {
|
||||
// noinspection unchecked
|
||||
return (List<E>) listConstructor.invokeWithArguments(capacity);
|
||||
} catch (Throwable e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,9 @@
|
||||
inherit system;
|
||||
}));
|
||||
in {
|
||||
devShells = forAllSystems (pkgs: {
|
||||
devShells = forAllSystems (pkgs: rec {
|
||||
default = jdk25;
|
||||
|
||||
jdk25 = pkgs.mkShellNoCC {
|
||||
buildInputs = with pkgs; [
|
||||
jdk25_headless
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
plugins {
|
||||
id("net.megavex.scoreboardlibrary.base-conventions")
|
||||
//id("io.papermc.paperweight.userdev") version "2.0.0-beta.19"
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven("https://repo.viaversion.com")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api(project(":scoreboard-library-api"))
|
||||
implementation(project(":scoreboard-library-packet-adapter-base"))
|
||||
compileOnly(libs.spigotApi)
|
||||
|
||||
implementation(project(":scoreboard-library-modern"))
|
||||
implementation(project(":scoreboard-library-legacy"))
|
||||
compileOnly("com.viaversion:viaversion-api:5.7.1")
|
||||
compileOnly("io.netty:netty-buffer:4.2.10.Final")
|
||||
compileOnly("io.netty:netty-handler:4.2.10.Final")
|
||||
}
|
||||
+13
-10
@@ -3,25 +3,24 @@ package net.megavex.scoreboardlibrary.implementation;
|
||||
import net.megavex.scoreboardlibrary.api.exception.NoPacketAdapterAvailableException;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PacketAdapterProvider;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public final class PacketAdapterLoader {
|
||||
private static final String MODERN = "modern", LEGACY = "legacy";
|
||||
|
||||
private PacketAdapterLoader() {
|
||||
}
|
||||
|
||||
public static @NotNull PacketAdapterProvider loadPacketAdapter() throws NoPacketAdapterAvailableException {
|
||||
public static @NotNull PacketAdapterProvider loadPacketAdapter(Plugin plugin) throws NoPacketAdapterAvailableException {
|
||||
Class<?> nmsClass = findAndLoadImplementationClass();
|
||||
if (nmsClass == null) {
|
||||
throw new NoPacketAdapterAvailableException();
|
||||
}
|
||||
|
||||
try {
|
||||
return (PacketAdapterProvider) nmsClass.getConstructors()[0].newInstance();
|
||||
return (PacketAdapterProvider) nmsClass.getConstructors()[0].newInstance(plugin);
|
||||
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
|
||||
throw new RuntimeException("couldn't initialize packet adapter", e);
|
||||
}
|
||||
@@ -60,7 +59,11 @@ public final class PacketAdapterLoader {
|
||||
case "1.12":
|
||||
case "1.12.1":
|
||||
case "1.12.2":
|
||||
return tryLoadImplementationClass(LEGACY);
|
||||
try {
|
||||
return Class.forName("net.megavex.scoreboardlibrary.implementation.packetAdapter.legacy.PacketAdapterProviderImpl");
|
||||
} catch (ClassNotFoundException ignored) {
|
||||
return null;
|
||||
}
|
||||
case "1.13":
|
||||
case "1.13.1":
|
||||
case "1.13.2":
|
||||
@@ -107,22 +110,22 @@ public final class PacketAdapterLoader {
|
||||
case "1.21.9":
|
||||
case "1.21.10":
|
||||
case "1.21.11":
|
||||
return tryLoadImplementationClass(MODERN);
|
||||
case "26.1":
|
||||
return tryLoadModern();
|
||||
default:
|
||||
// Hide from relocation checkers
|
||||
String property = "net.mega".concat("vex.scoreboardlibrary.forceModern");
|
||||
if (System.getProperty(property, "").equalsIgnoreCase("true")) {
|
||||
return tryLoadImplementationClass(MODERN);
|
||||
return tryLoadModern();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static @Nullable Class<?> tryLoadImplementationClass(@NotNull String name) {
|
||||
private static Class<?> tryLoadModern() {
|
||||
try {
|
||||
String path = "net.megavex.scoreboardlibrary.implementation.packetAdapter." + name + ".PacketAdapterProviderImpl";
|
||||
return Class.forName(path);
|
||||
return Class.forName("net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAdapterProviderImpl");
|
||||
} catch (ClassNotFoundException ignored) {
|
||||
return null;
|
||||
}
|
||||
|
||||
+2
-2
@@ -30,7 +30,7 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class ScoreboardLibraryImpl implements ScoreboardLibrary {
|
||||
public final class ScoreboardLibraryImpl implements ScoreboardLibrary {
|
||||
private final Plugin plugin;
|
||||
private final PacketAdapterProvider packetAdapter;
|
||||
private final TaskScheduler taskScheduler;
|
||||
@@ -59,7 +59,7 @@ public class ScoreboardLibraryImpl implements ScoreboardLibrary {
|
||||
}
|
||||
|
||||
this.plugin = plugin;
|
||||
this.packetAdapter = PacketAdapterLoader.loadPacketAdapter();
|
||||
this.packetAdapter = PacketAdapterLoader.loadPacketAdapter(plugin);
|
||||
this.taskScheduler = TaskScheduler.create(plugin);
|
||||
|
||||
boolean localeEventExists = false;
|
||||
|
||||
+12
-6
@@ -8,6 +8,7 @@ import net.kyori.adventure.translation.GlobalTranslator;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
@@ -17,17 +18,16 @@ import static net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializ
|
||||
import static net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.parseChar;
|
||||
|
||||
public final class LegacyFormatUtil {
|
||||
private static final Map<NamedTextColor, Character> legacyMap;
|
||||
private static final Map<NamedTextColor, ChatColor> chatColorMap;
|
||||
|
||||
static {
|
||||
ChatColor[] values = ChatColor.values();
|
||||
legacyMap = CollectionProvider.map(values.length);
|
||||
chatColorMap = new HashMap<>(values.length);
|
||||
for (ChatColor value : values) {
|
||||
if (!value.isColor()) continue;
|
||||
|
||||
char c = value.getChar();
|
||||
LegacyFormat format = Objects.requireNonNull(parseChar(c));
|
||||
legacyMap.put((NamedTextColor) format.color(), c);
|
||||
LegacyFormat format = Objects.requireNonNull(parseChar(value.getChar()));
|
||||
chatColorMap.put((NamedTextColor) format.color(), value);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,6 +63,12 @@ public final class LegacyFormatUtil {
|
||||
public static char getChar(@Nullable NamedTextColor color) {
|
||||
if (color == null) return 'r';
|
||||
|
||||
return legacyMap.getOrDefault(color, '\0');
|
||||
ChatColor chatColor = chatColorMap.getOrDefault(color, ChatColor.WHITE);
|
||||
return chatColor.getChar();
|
||||
}
|
||||
|
||||
public static int getIndex(@Nullable NamedTextColor color) {
|
||||
ChatColor chatColor = chatColorMap.getOrDefault(color == null ? NamedTextColor.WHITE : color, ChatColor.WHITE);
|
||||
return chatColor.ordinal();
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -9,7 +9,7 @@ public enum LineRenderingStrategy {
|
||||
*/
|
||||
LEGACY,
|
||||
/**
|
||||
* For versions 1.13-1.20.2, where team properties are stored as components with no limits.
|
||||
* For versions 1.13+, where team properties are stored as components with no limits.
|
||||
*/
|
||||
MODERN,
|
||||
/**
|
||||
+5
-2
@@ -12,10 +12,13 @@ import java.util.function.Function;
|
||||
|
||||
public final class LocaleProvider {
|
||||
private static final Locale DEFAULT_LOCALE = Locale.US;
|
||||
private static final Function<Player, Locale> provider = get();
|
||||
private static final Function<Player, Locale> PROVIDER = get();
|
||||
|
||||
private LocaleProvider() {
|
||||
}
|
||||
|
||||
public static @NotNull Locale locale(Player player) {
|
||||
return provider.apply(player);
|
||||
return PROVIDER.apply(player);
|
||||
}
|
||||
|
||||
private static @NotNull Function<Player, Locale> get() {
|
||||
+25
-9
@@ -6,7 +6,6 @@ import net.megavex.scoreboardlibrary.api.objective.ObjectiveManager;
|
||||
import net.megavex.scoreboardlibrary.api.objective.ObjectiveScore;
|
||||
import net.megavex.scoreboardlibrary.api.objective.ScoreboardObjective;
|
||||
import net.megavex.scoreboardlibrary.implementation.ScoreboardLibraryImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.CollectionProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.objective.ObjectivePacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.player.PlayerDisplayable;
|
||||
@@ -15,16 +14,17 @@ import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
public class ObjectiveManagerImpl implements ObjectiveManager, PlayerDisplayable {
|
||||
public final class ObjectiveManagerImpl implements ObjectiveManager, PlayerDisplayable {
|
||||
private final ScoreboardLibraryImpl library;
|
||||
private final Map<String, ScoreboardObjectiveImpl> objectives = new ConcurrentHashMap<>();
|
||||
private final Map<ObjectiveDisplaySlot, ScoreboardObjectiveImpl> displaySlots = new HashMap<>();
|
||||
|
||||
private final Set<Player> players = CollectionProvider.set(8);
|
||||
private final Set<Player> displayingPlayers = CollectionProvider.set(8);
|
||||
private final Set<Player> players = new HashSet<>(8);
|
||||
private final Set<Player> displayingPlayers = new HashSet<>(8);
|
||||
private final Queue<ObjectiveManagerTask> taskQueue = new ConcurrentLinkedQueue<>();
|
||||
private boolean closed;
|
||||
|
||||
@@ -108,10 +108,23 @@ public class ObjectiveManagerImpl implements ObjectiveManager, PlayerDisplayable
|
||||
return false;
|
||||
}
|
||||
|
||||
taskQueue.add(new ObjectiveManagerTask.RemovePlayer(player));
|
||||
taskQueue.add(new ObjectiveManagerTask.RemovePlayer(player, null));
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> removePlayerFuture(@NotNull Player player) {
|
||||
Preconditions.checkNotNull(player);
|
||||
checkClosed();
|
||||
if (!players.remove(player)) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
||||
CompletableFuture<Void> future = new CompletableFuture<>();
|
||||
taskQueue.add(new ObjectiveManagerTask.RemovePlayer(player, future));
|
||||
return future;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
if (!closed) {
|
||||
@@ -146,14 +159,17 @@ public class ObjectiveManagerImpl implements ObjectiveManager, PlayerDisplayable
|
||||
@NotNull ScoreboardLibraryPlayer slPlayer = library.getOrCreatePlayer(player);
|
||||
slPlayer.objectiveManagerQueue().add(this);
|
||||
} else if (task instanceof ObjectiveManagerTask.RemovePlayer) {
|
||||
Player player = ((ObjectiveManagerTask.RemovePlayer) task).player();
|
||||
Collection<Player> singleton = Collections.singleton(player);
|
||||
ObjectiveManagerTask.RemovePlayer removePlayerTask = (ObjectiveManagerTask.RemovePlayer) task;
|
||||
Collection<Player> singleton = Collections.singleton(removePlayerTask.player());
|
||||
for (ScoreboardObjectiveImpl objective : objectives.values()) {
|
||||
objective.packetAdapter().remove(singleton);
|
||||
}
|
||||
|
||||
displayingPlayers.remove(player);
|
||||
Objects.requireNonNull(library.getPlayer(player)).objectiveManagerQueue().remove(this);
|
||||
displayingPlayers.remove(removePlayerTask.player());
|
||||
Objects.requireNonNull(library.getPlayer(removePlayerTask.player())).objectiveManagerQueue().remove(this);
|
||||
if (removePlayerTask.future() != null) {
|
||||
removePlayerTask.future().complete(null);
|
||||
}
|
||||
} else if (task instanceof ObjectiveManagerTask.ReloadPlayer) {
|
||||
Player player = ((ObjectiveManagerTask.ReloadPlayer) task).player();
|
||||
Collection<Player> singleton = Collections.singleton(player);
|
||||
|
||||
+9
-1
@@ -6,6 +6,8 @@ import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class ObjectiveManagerTask {
|
||||
private ObjectiveManagerTask() {
|
||||
}
|
||||
@@ -31,14 +33,20 @@ public class ObjectiveManagerTask {
|
||||
|
||||
public static final class RemovePlayer extends ObjectiveManagerTask {
|
||||
private final Player player;
|
||||
private final CompletableFuture<Void> future;
|
||||
|
||||
public RemovePlayer(@NotNull Player player) {
|
||||
public RemovePlayer(@NotNull Player player, @Nullable CompletableFuture<Void> future) {
|
||||
this.player = player;
|
||||
this.future = future;
|
||||
}
|
||||
|
||||
public @NotNull Player player() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public @Nullable CompletableFuture<Void> future() {
|
||||
return future;
|
||||
}
|
||||
}
|
||||
|
||||
public static final class ReloadPlayer extends ObjectiveManagerTask {
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.Iterator;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class ObjectiveUpdaterTask implements Runnable {
|
||||
public final class ObjectiveUpdaterTask implements Runnable {
|
||||
private final ScoreboardLibraryImpl scoreboardLibrary;
|
||||
private final RunningTask task;
|
||||
private final Object lock = new Object();
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ import java.util.*;
|
||||
|
||||
import static net.kyori.adventure.text.Component.empty;
|
||||
|
||||
public class ScoreboardObjectiveImpl implements ScoreboardObjective {
|
||||
public final class ScoreboardObjectiveImpl implements ScoreboardObjective {
|
||||
private final ObjectivePacketAdapter packetAdapter;
|
||||
private final Queue<ObjectiveManagerTask> taskQueue;
|
||||
private final String name;
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
-1
@@ -18,7 +18,7 @@ import java.util.Collection;
|
||||
|
||||
import static net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection;
|
||||
|
||||
public class ObjectivePacketAdapterImpl implements ObjectivePacketAdapter {
|
||||
public final class ObjectivePacketAdapterImpl implements ObjectivePacketAdapter {
|
||||
private final String objectiveName;
|
||||
private Object removePacket;
|
||||
|
||||
File renamed without changes.
+4
-1
@@ -5,10 +5,13 @@ import net.megavex.scoreboardlibrary.implementation.packetAdapter.objective.Obje
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PacketAdapterProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamsPacketAdapter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class PacketAdapterProviderImpl implements PacketAdapterProvider {
|
||||
public final class PacketAdapterProviderImpl implements PacketAdapterProvider {
|
||||
public PacketAdapterProviderImpl(Plugin plugin) {}
|
||||
|
||||
@Override
|
||||
public @NotNull TeamsPacketAdapter createTeamPacketAdapter(@NotNull String teamName) {
|
||||
return new TeamsPacketAdapterImpl(teamName);
|
||||
+15
-15
@@ -19,7 +19,7 @@ import java.util.Locale;
|
||||
|
||||
import static net.megavex.scoreboardlibrary.implementation.commons.LegacyFormatUtil.limitLegacyText;
|
||||
|
||||
public class TeamsPacketAdapterImpl implements TeamsPacketAdapter {
|
||||
public final class TeamsPacketAdapterImpl implements TeamsPacketAdapter {
|
||||
private final String teamName;
|
||||
private Object removePacket;
|
||||
|
||||
@@ -27,17 +27,6 @@ public class TeamsPacketAdapterImpl implements TeamsPacketAdapter {
|
||||
this.teamName = teamName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeTeam(@NotNull Iterable<Player> players) {
|
||||
if (removePacket == null) {
|
||||
removePacket = PacketAccessors.TEAM_CONSTRUCTOR.invoke();
|
||||
PacketAccessors.TEAM_NAME_FIELD.set(removePacket, teamName);
|
||||
PacketAccessors.TEAM_MODE_FIELD.set(removePacket, TeamConstants.MODE_REMOVE);
|
||||
}
|
||||
|
||||
LegacyPacketSender.INSTANCE.sendPacket(players, removePacket);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull TeamDisplayPacketAdapter createTeamDisplayAdapter(@NotNull ImmutableTeamProperties<Component> properties) {
|
||||
return new AdventureTeamDisplayPacketAdapter(properties);
|
||||
@@ -55,6 +44,17 @@ public class TeamsPacketAdapterImpl implements TeamsPacketAdapter {
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeTeam(@NotNull Iterable<Player> players) {
|
||||
if (removePacket == null) {
|
||||
removePacket = PacketAccessors.TEAM_CONSTRUCTOR.invoke();
|
||||
PacketAccessors.TEAM_NAME_FIELD.set(removePacket, teamName);
|
||||
PacketAccessors.TEAM_MODE_FIELD.set(removePacket, TeamConstants.MODE_REMOVE);
|
||||
}
|
||||
|
||||
LegacyPacketSender.INSTANCE.sendPacket(players, removePacket);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendEntries(@NotNull EntriesPacketType packetType, @NotNull Collection<Player> players, @NotNull Collection<String> entries) {
|
||||
Object packet = PacketAccessors.TEAM_CONSTRUCTOR.invoke();
|
||||
@@ -70,9 +70,9 @@ public class TeamsPacketAdapterImpl implements TeamsPacketAdapter {
|
||||
LegacyPacketSender.INSTANCE,
|
||||
players,
|
||||
locale -> {
|
||||
String displayName = limitLegacyText(toLegacy(properties.displayName(), locale), TeamConstants.LEGACY_CHAR_LIMIT);
|
||||
String prefix = limitLegacyText(toLegacy(properties.prefix(), locale), TeamConstants.LEGACY_CHAR_LIMIT);
|
||||
String suffix = limitLegacyText(toLegacy(properties.suffix(), locale), TeamConstants.LEGACY_CHAR_LIMIT);
|
||||
String displayName = limitLegacyText(toLegacy(properties.displayName(), locale), TeamConstants.DISPLAY_NAME_LEGACY_LIMIT);
|
||||
String prefix = limitLegacyText(toLegacy(properties.prefix(), locale), TeamConstants.PREFIX_SUFFIX_LEGACY_LIMIT);
|
||||
String suffix = limitLegacyText(toLegacy(properties.suffix(), locale), TeamConstants.PREFIX_SUFFIX_LEGACY_LIMIT);
|
||||
|
||||
Object packet = PacketAccessors.TEAM_CONSTRUCTOR.invoke();
|
||||
PacketAccessors.TEAM_NAME_FIELD.set(packet, teamName);
|
||||
+3
-2
@@ -184,10 +184,11 @@ public final class PacketAccessors {
|
||||
Object[] chatFormattings = CHAT_FORMATTING_CLASS.getEnumConstants();
|
||||
FieldAccessor<Object, Object> charField = ReflectUtil.findFieldUnchecked(CHAT_FORMATTING_CLASS, 0, char.class);
|
||||
|
||||
outer: for (NamedTextColor color : NamedTextColor.NAMES.values()) {
|
||||
outer:
|
||||
for (NamedTextColor color : NamedTextColor.NAMES.values()) {
|
||||
char c = LegacyFormatUtil.getChar(color);
|
||||
for (Object chatFormatting : chatFormattings) {
|
||||
if (c == (char)charField.get(chatFormatting)) {
|
||||
if (c == (char) charField.get(chatFormatting)) {
|
||||
NMS_CHAT_FORMATTING_MAP.put(color, chatFormatting);
|
||||
continue outer;
|
||||
}
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern;
|
||||
|
||||
import com.viaversion.viaversion.api.Via;
|
||||
import com.viaversion.viaversion.api.ViaAPI;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.LineRenderingStrategy;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PacketAdapterProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.objective.PaperObjectivePacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.objective.SpigotObjectivePacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.team.PaperTeamsPacketAdapterImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.team.SpigotTeamsPacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernComponentProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernPacketSender;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.objective.ObjectivePacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamsPacketAdapter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.WeakHashMap;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public final class PacketAdapterProviderImpl implements PacketAdapterProvider {
|
||||
private final ViaAPI<Player> via;
|
||||
private final ModernPacketSender packetSender;
|
||||
private final WeakHashMap<Player, Integer> viaTeamPacketIds = new WeakHashMap<>();
|
||||
|
||||
public PacketAdapterProviderImpl(Plugin plugin) {
|
||||
final String viaPlugin = "ViaVersion";
|
||||
boolean isViaEnabled = plugin.getServer().getPluginManager().isPluginEnabled(viaPlugin);
|
||||
boolean isViaAllowed = plugin.getDescription().getSoftDepend().contains(viaPlugin) || plugin.getDescription().getDepend().contains(viaPlugin);
|
||||
if (isViaEnabled && isViaAllowed) {
|
||||
//noinspection unchecked
|
||||
this.via = (ViaAPI<Player>) Via.getAPI();
|
||||
} else {
|
||||
this.via = null;
|
||||
}
|
||||
this.packetSender = new ModernPacketSender(this.via);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ObjectivePacketAdapter createObjectiveAdapter(@NotNull String objectiveName) {
|
||||
return ModernComponentProvider.IS_NATIVE_ADVENTURE
|
||||
? new PaperObjectivePacketAdapter(this, objectiveName)
|
||||
: new SpigotObjectivePacketAdapter(this, objectiveName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull TeamsPacketAdapter createTeamPacketAdapter(@NotNull String teamName) {
|
||||
return ModernComponentProvider.IS_NATIVE_ADVENTURE
|
||||
? new PaperTeamsPacketAdapterImpl(this, teamName)
|
||||
: new SpigotTeamsPacketAdapter(this, teamName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull LineRenderingStrategy lineRenderingStrategy(@NotNull Player player) {
|
||||
if (this.via != null) {
|
||||
final ProtocolVersion ver = this.via.getPlayerProtocolVersion(player);
|
||||
if (ver.olderThan(ProtocolVersion.v1_13)) {
|
||||
//System.out.println("[DEBUG] " + player.getName() + " is legacy player");
|
||||
return LineRenderingStrategy.LEGACY;
|
||||
}
|
||||
}
|
||||
//System.out.println("[DEBUG] is modern player");
|
||||
return LineRenderingStrategy.MODERN;
|
||||
}
|
||||
|
||||
public @Nullable ViaAPI<Player> via() {
|
||||
return via;
|
||||
}
|
||||
|
||||
public @NotNull ModernPacketSender packetSender() {
|
||||
return packetSender;
|
||||
}
|
||||
|
||||
public @NotNull WeakHashMap<Player, Integer> viaTeamPacketIds() {
|
||||
return viaTeamPacketIds;
|
||||
}
|
||||
}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.reflect.MethodAccessor;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.reflect.ReflectUtil;
|
||||
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public final class RelocatedGson {
|
||||
public static final String SERVER_GSON_PKG = "com.go".concat("ogle.gson");
|
||||
public static final boolean IS_GSON_RELOCATED;
|
||||
public static final Object JSON_PARSER;
|
||||
public static final MethodAccessor PARSE_STRING_METHOD;
|
||||
|
||||
private RelocatedGson() {
|
||||
}
|
||||
|
||||
static {
|
||||
IS_GSON_RELOCATED = !JsonElement.class.getName().equals(SERVER_GSON_PKG + ".JsonElement");
|
||||
|
||||
if (IS_GSON_RELOCATED) {
|
||||
try {
|
||||
Class<?> jsonElementClass = Class.forName(SERVER_GSON_PKG + ".JsonElement");
|
||||
Class<?> jsonParserClass = Class.forName(SERVER_GSON_PKG + ".JsonParser");
|
||||
JSON_PARSER = jsonParserClass.getConstructors()[0].newInstance();
|
||||
PARSE_STRING_METHOD = ReflectUtil.findMethod(jsonParserClass, false, MethodType.methodType(jsonElementClass, String.class), "parse");
|
||||
} catch (ClassNotFoundException | InvocationTargetException | InstantiationException | IllegalAccessException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
} else {
|
||||
JSON_PARSER = null;
|
||||
PARSE_STRING_METHOD = null;
|
||||
}
|
||||
//System.out.println("GSON RELOCATED = " + IS_GSON_RELOCATED);
|
||||
}
|
||||
|
||||
public static Object convertToServerGson(final JsonElement element) {
|
||||
if (IS_GSON_RELOCATED) {
|
||||
assert PARSE_STRING_METHOD != null;
|
||||
//System.out.println("fixed");
|
||||
return PARSE_STRING_METHOD.invoke(JSON_PARSER, element.toString());
|
||||
}
|
||||
return element;
|
||||
}
|
||||
}
|
||||
+7
-5
@@ -4,7 +4,7 @@ import net.megavex.scoreboardlibrary.api.objective.ObjectiveDisplaySlot;
|
||||
import net.megavex.scoreboardlibrary.api.objective.ObjectiveRenderType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAccessors;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernPacketSender;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAdapterProviderImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.objective.ObjectiveConstants;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.objective.ObjectivePacketAdapter;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -16,10 +16,12 @@ import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
public abstract class AbstractObjectivePacketAdapter implements ObjectivePacketAdapter {
|
||||
protected final PacketAdapterProviderImpl provider;
|
||||
protected final String objectiveName;
|
||||
private Object removePacket;
|
||||
|
||||
public AbstractObjectivePacketAdapter(@NotNull String objectiveName) {
|
||||
public AbstractObjectivePacketAdapter(@NotNull PacketAdapterProviderImpl provider, @NotNull String objectiveName) {
|
||||
this.provider = provider;
|
||||
this.objectiveName = objectiveName;
|
||||
}
|
||||
|
||||
@@ -30,7 +32,7 @@ public abstract class AbstractObjectivePacketAdapter implements ObjectivePacketA
|
||||
|
||||
@Override
|
||||
public void display(@NotNull Collection<Player> players, @NotNull ObjectiveDisplaySlot slot) {
|
||||
ModernPacketSender.INSTANCE.sendPacket(players, createDisplayPacket(slot));
|
||||
provider.packetSender().sendPacket(players, createDisplayPacket(slot));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -40,7 +42,7 @@ public abstract class AbstractObjectivePacketAdapter implements ObjectivePacketA
|
||||
PacketAccessors.OBJECTIVE_NAME_FIELD.set(removePacket, objectiveName);
|
||||
PacketAccessors.OBJECTIVE_MODE_FIELD.set(removePacket, ObjectiveConstants.MODE_REMOVE);
|
||||
}
|
||||
ModernPacketSender.INSTANCE.sendPacket(players, removePacket);
|
||||
provider.packetSender().sendPacket(players, removePacket);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -53,7 +55,7 @@ public abstract class AbstractObjectivePacketAdapter implements ObjectivePacketA
|
||||
packet = Objects.requireNonNull(PacketAccessors.SCORE_CONSTRUCTOR)
|
||||
.invoke(PacketAccessors.SCORE_1_20_2_METHOD_REMOVE, objectiveName, entry, 0);
|
||||
}
|
||||
ModernPacketSender.INSTANCE.sendPacket(players, packet);
|
||||
provider.packetSender().sendPacket(players, packet);
|
||||
}
|
||||
|
||||
protected @NotNull Object createDisplayPacket(@NotNull ObjectiveDisplaySlot displaySlot) {
|
||||
+6
-6
@@ -5,17 +5,17 @@ import net.megavex.scoreboardlibrary.api.objective.ObjectiveRenderType;
|
||||
import net.megavex.scoreboardlibrary.api.objective.ScoreFormat;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAccessors;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAdapterProviderImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernComponentProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernPacketSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class PaperObjectivePacketAdapter extends AbstractObjectivePacketAdapter {
|
||||
public PaperObjectivePacketAdapter(@NotNull String objectiveName) {
|
||||
super(objectiveName);
|
||||
public final class PaperObjectivePacketAdapter extends AbstractObjectivePacketAdapter {
|
||||
public PaperObjectivePacketAdapter(@NotNull PacketAdapterProviderImpl provider, @NotNull String objectiveName) {
|
||||
super(provider, objectiveName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -23,7 +23,7 @@ public class PaperObjectivePacketAdapter extends AbstractObjectivePacketAdapter
|
||||
Object nmsDisplay = display == null ? null : ModernComponentProvider.fromAdventure(display, null);
|
||||
Object numberFormat = ScoreFormatConverter.convert(null, scoreFormat);
|
||||
Object packet = createScorePacket(entry, value, nmsDisplay, numberFormat);
|
||||
ModernPacketSender.INSTANCE.sendPacket(players, packet);
|
||||
provider.packetSender().sendPacket(players, packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -37,6 +37,6 @@ public class PaperObjectivePacketAdapter extends AbstractObjectivePacketAdapter
|
||||
Object nmsValue = PacketAccessors.fromAdventureComponent(value);
|
||||
Object numberFormat = ScoreFormatConverter.convert(null, scoreFormat);
|
||||
Object packet = createObjectivePacket(packetType, nmsValue, renderType, numberFormat);
|
||||
ModernPacketSender.INSTANCE.sendPacket(players, packet);
|
||||
provider.packetSender().sendPacket(players, packet);
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.objective;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import net.megavex.scoreboardlibrary.api.objective.ScoreFormat;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAccessors;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.RelocatedGson;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernComponentProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.reflect.ConstructorAccessor;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.reflect.ReflectUtil;
|
||||
@@ -50,7 +50,7 @@ public final class ScoreFormatConverter {
|
||||
if (format == ScoreFormat.blank()) {
|
||||
return BLANK;
|
||||
} else if (format instanceof ScoreFormat.Styled) {
|
||||
JsonElement json = gson().serializer().toJsonTree(((ScoreFormat.Styled) format).style());
|
||||
Object json = RelocatedGson.convertToServerGson(gson().serializer().toJsonTree(((ScoreFormat.Styled) format).style()));
|
||||
Object result = PacketAccessors.CODEC_PARSE.invoke(STYLE_CODEC, PacketAccessors.JSON_OPS, json);
|
||||
//noinspection OptionalGetWithoutIsPresent
|
||||
Object style = ((Optional<?>) PacketAccessors.RESULT_UNWRAP_METHOD.invoke(result)).get();
|
||||
+6
-6
@@ -4,8 +4,8 @@ import net.kyori.adventure.text.Component;
|
||||
import net.megavex.scoreboardlibrary.api.objective.ObjectiveRenderType;
|
||||
import net.megavex.scoreboardlibrary.api.objective.ScoreFormat;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAdapterProviderImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernComponentProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernPacketSender;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.LocalePacketUtil;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -13,14 +13,14 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public class SpigotObjectivePacketAdapter extends AbstractObjectivePacketAdapter {
|
||||
public SpigotObjectivePacketAdapter(@NotNull String objectiveName) {
|
||||
super(objectiveName);
|
||||
public final class SpigotObjectivePacketAdapter extends AbstractObjectivePacketAdapter {
|
||||
public SpigotObjectivePacketAdapter(@NotNull PacketAdapterProviderImpl provider, @NotNull String objectiveName) {
|
||||
super(provider, objectiveName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendScore(@NotNull Collection<Player> players, @NotNull String entry, int value, @Nullable Component display, @Nullable ScoreFormat scoreFormat) {
|
||||
LocalePacketUtil.sendLocalePackets(ModernPacketSender.INSTANCE, players, locale -> {
|
||||
LocalePacketUtil.sendLocalePackets(provider.packetSender(), players, locale -> {
|
||||
Object nmsDisplay = display == null ? null : ModernComponentProvider.fromAdventure(display, locale);
|
||||
Object numberFormat = ScoreFormatConverter.convert(locale, scoreFormat);
|
||||
return createScorePacket(entry, value, nmsDisplay, numberFormat);
|
||||
@@ -36,7 +36,7 @@ public class SpigotObjectivePacketAdapter extends AbstractObjectivePacketAdapter
|
||||
@Nullable ScoreFormat scoreFormat
|
||||
) {
|
||||
LocalePacketUtil.sendLocalePackets(
|
||||
ModernPacketSender.INSTANCE,
|
||||
provider.packetSender(),
|
||||
players,
|
||||
locale -> {
|
||||
Object numberFormat = ScoreFormatConverter.convert(locale, scoreFormat);
|
||||
+30
-23
@@ -4,7 +4,7 @@ import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAccessors;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernPacketSender;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAdapterProviderImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.EntriesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamConstants;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamDisplayPacketAdapter;
|
||||
@@ -19,33 +19,18 @@ import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
|
||||
public abstract class AbstractTeamsPacketAdapterImpl implements TeamsPacketAdapter {
|
||||
protected final PacketAdapterProviderImpl provider;
|
||||
protected final String teamName;
|
||||
private Object removePacket;
|
||||
|
||||
public AbstractTeamsPacketAdapterImpl(@NotNull String teamName) {
|
||||
public AbstractTeamsPacketAdapterImpl(@NotNull PacketAdapterProviderImpl provider, @NotNull String teamName) {
|
||||
this.provider = provider;
|
||||
this.teamName = teamName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeTeam(@NotNull Iterable<Player> players) {
|
||||
if (removePacket == null) {
|
||||
if (PacketAccessors.IS_1_17_OR_ABOVE) {
|
||||
removePacket = PacketAccessors.TEAM_PACKET_CONSTRUCTOR.invoke(
|
||||
teamName,
|
||||
TeamConstants.MODE_REMOVE,
|
||||
null,
|
||||
Collections.emptyList()
|
||||
);
|
||||
} else {
|
||||
assert PacketAccessors.TEAM_NAME_FIELD != null;
|
||||
assert PacketAccessors.TEAM_MODE_FIELD != null;
|
||||
|
||||
removePacket = PacketAccessors.TEAM_PACKET_CONSTRUCTOR.invoke();
|
||||
PacketAccessors.TEAM_NAME_FIELD.set(removePacket, teamName);
|
||||
PacketAccessors.TEAM_MODE_FIELD.set(removePacket, TeamConstants.MODE_REMOVE);
|
||||
}
|
||||
}
|
||||
ModernPacketSender.INSTANCE.sendPacket(players, removePacket);
|
||||
public @NotNull TeamDisplayPacketAdapter createLegacyTeamDisplayAdapter(@NotNull ImmutableTeamProperties<String> properties) {
|
||||
return new LegacyTeamDisplayPacketAdapter(provider, teamName, properties);
|
||||
}
|
||||
|
||||
public abstract class TeamDisplayPacketAdapterImpl implements TeamDisplayPacketAdapter {
|
||||
@@ -55,6 +40,28 @@ public abstract class AbstractTeamsPacketAdapterImpl implements TeamsPacketAdapt
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeTeam(@NotNull Iterable<Player> players) {
|
||||
if (removePacket == null) {
|
||||
if (PacketAccessors.IS_1_17_OR_ABOVE) {
|
||||
removePacket = PacketAccessors.TEAM_PACKET_CONSTRUCTOR.invoke(
|
||||
teamName,
|
||||
TeamConstants.MODE_REMOVE,
|
||||
null,
|
||||
Collections.emptyList()
|
||||
);
|
||||
} else {
|
||||
assert PacketAccessors.TEAM_NAME_FIELD != null;
|
||||
assert PacketAccessors.TEAM_MODE_FIELD != null;
|
||||
|
||||
removePacket = PacketAccessors.TEAM_PACKET_CONSTRUCTOR.invoke();
|
||||
PacketAccessors.TEAM_NAME_FIELD.set(removePacket, teamName);
|
||||
PacketAccessors.TEAM_MODE_FIELD.set(removePacket, TeamConstants.MODE_REMOVE);
|
||||
}
|
||||
}
|
||||
provider.packetSender().sendPacket(players, removePacket);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendEntries(@NotNull EntriesPacketType packetType, @NotNull Collection<Player> players, @NotNull Collection<String> entries) {
|
||||
if (PacketAccessors.IS_1_17_OR_ABOVE) {
|
||||
@@ -64,7 +71,7 @@ public abstract class AbstractTeamsPacketAdapterImpl implements TeamsPacketAdapt
|
||||
Optional.empty(),
|
||||
entries
|
||||
);
|
||||
ModernPacketSender.INSTANCE.sendPacket(players, packet);
|
||||
provider.packetSender().sendPacket(players, packet);
|
||||
} else {
|
||||
assert PacketAccessors.TEAM_NAME_FIELD != null;
|
||||
assert PacketAccessors.TEAM_MODE_FIELD != null;
|
||||
@@ -74,7 +81,7 @@ public abstract class AbstractTeamsPacketAdapterImpl implements TeamsPacketAdapt
|
||||
PacketAccessors.TEAM_NAME_FIELD.set(packet, teamName);
|
||||
PacketAccessors.TEAM_MODE_FIELD.set(packet, TeamConstants.mode(packetType));
|
||||
PacketAccessors.TEAM_ENTRIES_FIELD.set(packet, entries);
|
||||
ModernPacketSender.INSTANCE.sendPacket(players, packet);
|
||||
provider.packetSender().sendPacket(players, packet);
|
||||
}
|
||||
}
|
||||
|
||||
+162
@@ -0,0 +1,162 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.team;
|
||||
|
||||
import com.viaversion.viaversion.api.ViaAPI;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.protocol.Protocol;
|
||||
import com.viaversion.viaversion.api.protocol.packet.PacketType;
|
||||
import com.viaversion.viaversion.api.protocol.packet.State;
|
||||
import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypeMap;
|
||||
import com.viaversion.viaversion.api.protocol.version.ProtocolVersion;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.LegacyFormatUtil;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAdapterProviderImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.EntriesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamConstants;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamDisplayPacketAdapter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import static net.megavex.scoreboardlibrary.implementation.commons.LegacyFormatUtil.limitLegacyText;
|
||||
|
||||
public final class LegacyTeamDisplayPacketAdapter implements TeamDisplayPacketAdapter {
|
||||
private final PacketAdapterProviderImpl provider;
|
||||
private final String teamName;
|
||||
private final ImmutableTeamProperties<String> properties;
|
||||
|
||||
public LegacyTeamDisplayPacketAdapter(final PacketAdapterProviderImpl provider, final String teamName, final ImmutableTeamProperties<String> properties) {
|
||||
this.provider = provider;
|
||||
this.teamName = teamName;
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
// have to send every team packet from viaversion otherwise it won't work on 1.7 players
|
||||
// because ViaRewind's 1.8->1.7 conversion cancels team packets it doesn't recognize and fucks everything up
|
||||
// https://github.com/ViaVersion/ViaRewind/blob/e0c1f5311521bf062bbdae9f96dc9149d8c13e28/common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/rewriter/ScoreboardPacketRewriter1_8.java#L179
|
||||
|
||||
@Override
|
||||
public void removeTeam(@NotNull Iterable<Player> players) {
|
||||
ViaAPI<Player> via = provider.via();
|
||||
assert via != null;
|
||||
for (final Player player : players) {
|
||||
final UserConnection conn = via.getConnection(player.getUniqueId());
|
||||
if (conn == null) continue;
|
||||
|
||||
final ByteBuf buf = Unpooled.buffer(128);
|
||||
Types.VAR_INT.writePrimitive(buf, teamsPacketId(player, conn));
|
||||
Types.STRING.write(buf, teamName);
|
||||
Types.BYTE.writePrimitive(buf, (byte) TeamConstants.MODE_REMOVE);
|
||||
|
||||
via.sendRawPacket(player.getUniqueId(), buf);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendEntries(@NotNull EntriesPacketType packetType, @NotNull Collection<Player> players, @NotNull Collection<String> entries) {
|
||||
ViaAPI<Player> via = provider.via();
|
||||
assert via != null;
|
||||
for (final Player player : players) {
|
||||
final UserConnection conn = via.getConnection(player.getUniqueId());
|
||||
if (conn == null) continue;
|
||||
|
||||
final ByteBuf buf = Unpooled.buffer(128);
|
||||
Types.VAR_INT.writePrimitive(buf, teamsPacketId(player, conn));
|
||||
|
||||
Types.STRING.write(buf, teamName);
|
||||
|
||||
Types.BYTE.writePrimitive(buf, (byte) TeamConstants.mode(packetType));
|
||||
|
||||
if (conn.getProtocolInfo().protocolVersion().olderThanOrEqualTo(ProtocolVersion.v1_7_6)) {
|
||||
Types.SHORT.writePrimitive(buf, (short) properties.syncedEntries().size());
|
||||
} else {
|
||||
Types.VAR_INT.writePrimitive(buf, properties.syncedEntries().size());
|
||||
}
|
||||
|
||||
for (final String entry : entries) {
|
||||
Types.STRING.write(buf, entry);
|
||||
}
|
||||
|
||||
via.sendRawPacket(player.getUniqueId(), buf);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendProperties(@NotNull PropertiesPacketType packetType, @NotNull Collection<Player> players) {
|
||||
ViaAPI<Player> via = provider.via();
|
||||
assert via != null;
|
||||
for (final Player player : players) {
|
||||
final UserConnection conn = via.getConnection(player.getUniqueId());
|
||||
if (conn == null) continue;
|
||||
|
||||
final ByteBuf buf = Unpooled.buffer(128);
|
||||
Types.VAR_INT.writePrimitive(buf, teamsPacketId(player, conn));
|
||||
|
||||
Types.STRING.write(buf, teamName);
|
||||
|
||||
Types.BYTE.writePrimitive(buf, (byte) TeamConstants.mode(packetType));
|
||||
|
||||
final String displayName = limitLegacyText(properties.displayName(), TeamConstants.DISPLAY_NAME_LEGACY_LIMIT);
|
||||
final String prefix = limitLegacyText(properties.prefix(), TeamConstants.PREFIX_SUFFIX_LEGACY_LIMIT);
|
||||
final String suffix = limitLegacyText(properties.suffix(), TeamConstants.PREFIX_SUFFIX_LEGACY_LIMIT);
|
||||
Types.STRING.write(buf, displayName);
|
||||
Types.STRING.write(buf, prefix);
|
||||
Types.STRING.write(buf, suffix);
|
||||
|
||||
Types.BYTE.writePrimitive(buf, (byte) properties.packOptions());
|
||||
|
||||
final boolean is1_7 = conn.getProtocolInfo().protocolVersion().olderThanOrEqualTo(ProtocolVersion.v1_7_6);
|
||||
if (!is1_7) {
|
||||
Types.STRING.write(buf, properties.nameTagVisibility().key());
|
||||
}
|
||||
|
||||
if (conn.getProtocolInfo().protocolVersion().newerThanOrEqualTo(ProtocolVersion.v1_9)) {
|
||||
Types.STRING.write(buf, properties.collisionRule().key());
|
||||
}
|
||||
|
||||
if (!is1_7) {
|
||||
Types.BYTE.writePrimitive(buf, (byte) LegacyFormatUtil.getIndex(properties.playerColor()));
|
||||
}
|
||||
|
||||
if (packetType == PropertiesPacketType.CREATE) {
|
||||
if (is1_7) {
|
||||
Types.SHORT.writePrimitive(buf, (short) properties.syncedEntries().size());
|
||||
} else {
|
||||
Types.VAR_INT.writePrimitive(buf, properties.syncedEntries().size());
|
||||
}
|
||||
|
||||
for (final String entry : properties.syncedEntries()) {
|
||||
Types.STRING.write(buf, entry);
|
||||
}
|
||||
}
|
||||
|
||||
via.sendRawPacket(player.getUniqueId(), buf);
|
||||
}
|
||||
}
|
||||
|
||||
private @NotNull Integer teamsPacketId(final Player player, final UserConnection conn) {
|
||||
ViaAPI<Player> via = provider.via();
|
||||
assert via != null;
|
||||
|
||||
Integer teamsPacketId = this.provider.viaTeamPacketIds().get(player);
|
||||
if (teamsPacketId != null) return teamsPacketId;
|
||||
|
||||
for (final Protocol<?, ?, ?, ?> proto : conn.getProtocolInfo().getPipeline().pipes()) {
|
||||
final PacketTypeMap<?> map = proto.getPacketTypesProvider().mappedClientboundPacketTypes().get(State.PLAY);
|
||||
if (map == null) continue;
|
||||
final PacketType type = map.typeByName("SET_PLAYER_TEAM");
|
||||
if (type == null) continue;
|
||||
teamsPacketId = type.getId();
|
||||
break;
|
||||
}
|
||||
if (teamsPacketId == null) {
|
||||
throw new IllegalStateException("team packet id for " + conn.getProtocolInfo().protocolVersion() + " not found");
|
||||
}
|
||||
this.provider.viaTeamPacketIds().put(player, teamsPacketId);
|
||||
return teamsPacketId;
|
||||
}
|
||||
}
|
||||
+6
-7
@@ -1,12 +1,11 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.team;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.gson.Gson;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAccessors;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernPacketSender;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAdapterProviderImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamConstants;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamDisplayPacketAdapter;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -17,9 +16,9 @@ import java.util.Collection;
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
|
||||
public class PaperTeamsPacketAdapterImpl extends AbstractTeamsPacketAdapterImpl {
|
||||
public PaperTeamsPacketAdapterImpl(@NotNull String teamName) {
|
||||
super(teamName);
|
||||
public final class PaperTeamsPacketAdapterImpl extends AbstractTeamsPacketAdapterImpl {
|
||||
public PaperTeamsPacketAdapterImpl(PacketAdapterProviderImpl provider, @NotNull String teamName) {
|
||||
super(provider, teamName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -88,10 +87,10 @@ public class PaperTeamsPacketAdapterImpl extends AbstractTeamsPacketAdapterImpl
|
||||
|
||||
switch (packetType) {
|
||||
case CREATE:
|
||||
ModernPacketSender.INSTANCE.sendPacket(players, createPacket);
|
||||
provider.packetSender().sendPacket(players, createPacket);
|
||||
break;
|
||||
case UPDATE:
|
||||
ModernPacketSender.INSTANCE.sendPacket(players, updatePacket);
|
||||
provider.packetSender().sendPacket(players, updatePacket);
|
||||
break;
|
||||
}
|
||||
}
|
||||
+5
-5
@@ -5,8 +5,8 @@ import net.kyori.adventure.text.Component;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAccessors;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAdapterProviderImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernComponentProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernPacketSender;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamConstants;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamDisplayPacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.LocalePacketUtil;
|
||||
@@ -18,9 +18,9 @@ import java.util.Collection;
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
|
||||
public class SpigotTeamsPacketAdapter extends AbstractTeamsPacketAdapterImpl {
|
||||
public SpigotTeamsPacketAdapter(@NotNull String teamName) {
|
||||
super(teamName);
|
||||
public final class SpigotTeamsPacketAdapter extends AbstractTeamsPacketAdapterImpl {
|
||||
public SpigotTeamsPacketAdapter(PacketAdapterProviderImpl provider, @NotNull String teamName) {
|
||||
super(provider, teamName);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -37,7 +37,7 @@ public class SpigotTeamsPacketAdapter extends AbstractTeamsPacketAdapterImpl {
|
||||
public void sendProperties(@NotNull PropertiesPacketType packetType, @NotNull Collection<Player> players) {
|
||||
Collection<String> entries = ImmutableList.copyOf(properties.syncedEntries());
|
||||
LocalePacketUtil.sendLocalePackets(
|
||||
ModernPacketSender.INSTANCE,
|
||||
provider.packetSender(),
|
||||
players,
|
||||
locale -> {
|
||||
|
||||
+4
-3
@@ -1,9 +1,9 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util;
|
||||
|
||||
import com.google.gson.JsonElement;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.translation.GlobalTranslator;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAccessors;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.RelocatedGson;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.reflect.MinecraftClasses;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.reflect.ReflectUtil;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -62,7 +62,7 @@ public final class ModernComponentProvider {
|
||||
for (Method method : PacketAccessors.CHAT_SERIALIZER_CLASS.getMethods()) {
|
||||
if (method.getParameterCount() >= 1 &&
|
||||
method.getParameterCount() <= 2 &&
|
||||
method.getParameterTypes()[0] == JsonElement.class
|
||||
method.getParameterTypes()[0].getName().equals(RelocatedGson.SERVER_GSON_PKG + ".JsonElement")
|
||||
) {
|
||||
try {
|
||||
handle = MethodHandles.lookup().unreflect(method);
|
||||
@@ -91,7 +91,8 @@ public final class ModernComponentProvider {
|
||||
if (locale != null) {
|
||||
translated = GlobalTranslator.render(adventure, locale);
|
||||
}
|
||||
JsonElement json = gson().serializeToTree(translated);
|
||||
|
||||
Object json = RelocatedGson.convertToServerGson(gson().serializeToTree(translated));
|
||||
|
||||
if (FROM_JSON_METHOD == null) {
|
||||
// 1.21.6+
|
||||
+28
-7
@@ -1,5 +1,8 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util;
|
||||
|
||||
import com.viaversion.viaversion.api.ViaAPI;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import io.netty.channel.Channel;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PacketSender;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAccessors;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.reflect.MinecraftClasses;
|
||||
@@ -11,13 +14,14 @@ import java.lang.invoke.MethodType;
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public final class ModernPacketSender implements PacketSender<Object> {
|
||||
public static final ModernPacketSender INSTANCE = new ModernPacketSender();
|
||||
|
||||
private static final MethodHandle GET_HANDLE;
|
||||
private static final MethodHandle PLAYER_CONNECTION;
|
||||
private static final MethodHandle SEND_PACKET;
|
||||
|
||||
private ModernPacketSender() {
|
||||
private final ViaAPI<Player> via;
|
||||
|
||||
public ModernPacketSender(final ViaAPI<Player> via) {
|
||||
this.via = via;
|
||||
}
|
||||
|
||||
static {
|
||||
@@ -46,7 +50,7 @@ public final class ModernPacketSender implements PacketSender<Object> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (playerConnection == null) {
|
||||
throw new ExceptionInInitializerError("failed to find player connection field");
|
||||
}
|
||||
@@ -74,10 +78,27 @@ public final class ModernPacketSender implements PacketSender<Object> {
|
||||
|
||||
@Override
|
||||
public void sendPacket(Player player, Object packet) {
|
||||
if (this.via != null) {
|
||||
final UserConnection conn = this.via.getConnection(player.getUniqueId());
|
||||
if (conn != null) {
|
||||
final Channel channel = conn.getChannel();
|
||||
if (channel != null) {
|
||||
// Paper has some "network optimization" patch that makes the NMS sendPacket method
|
||||
// not always send the packet immediately to the player's netty channel,
|
||||
// and this is a problem when we send some packets using ViaVersion API because it always sends
|
||||
// the packet to the channel immediately, so the packet order between NMS and ViaVersion API can
|
||||
// get messed up. So for ViaVersion players we send the packet directly to the player's channel
|
||||
// bypassing Paper logic to work around this. Fortunately ViaVersion provides easy access to the player's channel.
|
||||
channel.eventLoop().execute(() -> channel.writeAndFlush(packet));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Object handle = GET_HANDLE.invoke(player);
|
||||
Object connection = PLAYER_CONNECTION.invoke(handle);
|
||||
SEND_PACKET.invoke(connection, packet);
|
||||
Object handle = GET_HANDLE.invoke(player);
|
||||
Object connection = PLAYER_CONNECTION.invoke(handle);
|
||||
SEND_PACKET.invoke(connection, packet);
|
||||
} catch (Throwable e) {
|
||||
throw new IllegalStateException("couldn't send packet to player", e);
|
||||
}
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
+2
-1
@@ -4,7 +4,8 @@ import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPack
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public final class TeamConstants {
|
||||
public static final int LEGACY_CHAR_LIMIT = 16;
|
||||
public static final int DISPLAY_NAME_LEGACY_LIMIT = 32;
|
||||
public static final int PREFIX_SUFFIX_LEGACY_LIMIT = 16;
|
||||
|
||||
public static final int MODE_CREATE = 0,
|
||||
MODE_REMOVE = 1,
|
||||
+2
@@ -7,6 +7,8 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.Collection;
|
||||
|
||||
public interface TeamDisplayPacketAdapter {
|
||||
void removeTeam(@NotNull Iterable<Player> players);
|
||||
|
||||
default void updateTeamPackets() {
|
||||
}
|
||||
|
||||
-2
@@ -6,8 +6,6 @@ import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public interface TeamsPacketAdapter {
|
||||
void removeTeam(@NotNull Iterable<Player> players);
|
||||
|
||||
@NotNull TeamDisplayPacketAdapter createTeamDisplayAdapter(@NotNull ImmutableTeamProperties<Component> properties);
|
||||
|
||||
default @NotNull TeamDisplayPacketAdapter createLegacyTeamDisplayAdapter(@NotNull ImmutableTeamProperties<String> properties) {
|
||||
+2
-2
@@ -1,12 +1,12 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.packetAdapter.util;
|
||||
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.CollectionProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.LocaleProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PacketSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
@@ -31,7 +31,7 @@ public final class LocalePacketUtil {
|
||||
return;
|
||||
}
|
||||
|
||||
Map<Locale, P> map = CollectionProvider.map(1);
|
||||
Map<Locale, P> map = new HashMap<>(1);
|
||||
for (Player player : players) {
|
||||
Locale locale = LocaleProvider.locale(player);
|
||||
P packet = map.computeIfAbsent(locale, i -> packetFunction.apply(locale));
|
||||
+1
-1
@@ -5,7 +5,7 @@ import org.jetbrains.annotations.UnknownNullability;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
|
||||
public class ConstructorAccessor<T> {
|
||||
public final class ConstructorAccessor<T> {
|
||||
private final MethodHandle handle;
|
||||
|
||||
public ConstructorAccessor(@NotNull MethodHandle handle) {
|
||||
+1
-1
@@ -6,7 +6,7 @@ import org.jetbrains.annotations.UnknownNullability;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
|
||||
public class FieldAccessor<T, V> {
|
||||
public final class FieldAccessor<T, V> {
|
||||
private final MethodHandle getter, setter;
|
||||
|
||||
public FieldAccessor(@NotNull MethodHandle getter, @Nullable MethodHandle setter) {
|
||||
+1
-1
@@ -5,7 +5,7 @@ import org.jetbrains.annotations.UnknownNullability;
|
||||
|
||||
import java.lang.invoke.MethodHandle;
|
||||
|
||||
public class MethodAccessor {
|
||||
public final class MethodAccessor {
|
||||
private final MethodHandle handle;
|
||||
|
||||
public MethodAccessor(@NotNull MethodHandle handle) {
|
||||
File renamed without changes.
File renamed without changes.
+1
-1
@@ -9,7 +9,7 @@ import java.lang.invoke.MethodType;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
public class ReflectUtil {
|
||||
public final class ReflectUtil {
|
||||
// Inspired by
|
||||
// https://github.com/dmulloy2/ProtocolLib/blob/02e917cd08cf5b37a52052e22b223272a040e0df/src/main/java/com/comphenix/protocol/reflect/accessors/MethodHandleHelper.java
|
||||
|
||||
+41
-35
@@ -1,60 +1,66 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.player;
|
||||
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.CollectionProvider;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public class DisplayableQueue<T extends PlayerDisplayable> {
|
||||
public final class DisplayableQueue<T extends PlayerDisplayable> {
|
||||
private final UUID playerUuid;
|
||||
private final List<T> queue = CollectionProvider.list(1);
|
||||
private final List<T> queue = new ArrayList<>(1);
|
||||
|
||||
public DisplayableQueue(@NotNull UUID playerUuid) {
|
||||
this.playerUuid = playerUuid;
|
||||
}
|
||||
|
||||
public synchronized @Nullable T current() {
|
||||
if (queue.isEmpty()) {
|
||||
return null;
|
||||
} else {
|
||||
return queue.get(0);
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void add(@NotNull T displayable) {
|
||||
if (queue.contains(displayable)) {
|
||||
throw new IllegalStateException("displayable already registered");
|
||||
}
|
||||
|
||||
queue.add(displayable);
|
||||
|
||||
if (current() == displayable) {
|
||||
Player player = Bukkit.getPlayer(playerUuid);
|
||||
if (player != null) {
|
||||
displayable.display(player);
|
||||
public @Nullable T current() {
|
||||
synchronized (this) {
|
||||
if (queue.isEmpty()) {
|
||||
return null;
|
||||
} else {
|
||||
return queue.get(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void remove(@NotNull T displayable) {
|
||||
boolean wasCurrent = displayable == current();
|
||||
if (!queue.remove(displayable)) {
|
||||
throw new IllegalStateException("displayable not registered");
|
||||
}
|
||||
public void add(@NotNull T displayable) {
|
||||
synchronized (this) {
|
||||
if (queue.contains(displayable)) {
|
||||
throw new IllegalStateException("displayable already registered");
|
||||
}
|
||||
|
||||
if (!wasCurrent) {
|
||||
return;
|
||||
}
|
||||
queue.add(displayable);
|
||||
|
||||
T newDisplayable = current();
|
||||
if (newDisplayable != null) {
|
||||
Player player = Bukkit.getPlayer(playerUuid);
|
||||
if (player != null) {
|
||||
newDisplayable.display(player);
|
||||
if (current() == displayable) {
|
||||
Player player = Bukkit.getPlayer(playerUuid);
|
||||
if (player != null) {
|
||||
displayable.display(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void remove(@NotNull T displayable) {
|
||||
synchronized (this) {
|
||||
boolean wasCurrent = displayable == current();
|
||||
if (!queue.remove(displayable)) {
|
||||
throw new IllegalStateException("displayable not registered");
|
||||
}
|
||||
|
||||
if (!wasCurrent) {
|
||||
return;
|
||||
}
|
||||
|
||||
T newDisplayable = current();
|
||||
if (newDisplayable != null) {
|
||||
Player player = Bukkit.getPlayer(playerUuid);
|
||||
if (player != null) {
|
||||
newDisplayable.display(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -15,7 +15,7 @@ import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerLocaleChangeEvent;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class LocaleListener implements Listener {
|
||||
public final class LocaleListener implements Listener {
|
||||
private final ScoreboardLibraryImpl scoreboardLibrary;
|
||||
|
||||
public LocaleListener(@NotNull ScoreboardLibraryImpl scoreboardLibrary) {
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class ScoreboardLibraryPlayer {
|
||||
public final class ScoreboardLibraryPlayer {
|
||||
private final DisplayableQueue<TeamManagerImpl> teamManagerQueue;
|
||||
private final DisplayableQueue<ObjectiveManagerImpl> objectiveManagerQueue;
|
||||
private final DisplayableQueue<AbstractSidebar> sidebarQueue;
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ package net.megavex.scoreboardlibrary.implementation.scheduler;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
class BukkitTaskScheduler implements TaskScheduler {
|
||||
final class BukkitTaskScheduler implements TaskScheduler {
|
||||
private final Plugin plugin;
|
||||
|
||||
public BukkitTaskScheduler(@NotNull Plugin plugin) {
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ import java.lang.invoke.MethodType;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
class FoliaTaskScheduler implements TaskScheduler {
|
||||
final class FoliaTaskScheduler implements TaskScheduler {
|
||||
private static final Class<?> asyncSchedulerClass;
|
||||
private static final Class<?> scheduledTaskClass;
|
||||
private static final Class<?> cancelledStateClass;
|
||||
|
||||
+3
-7
@@ -6,18 +6,14 @@ import net.megavex.scoreboardlibrary.api.objective.ObjectiveRenderType;
|
||||
import net.megavex.scoreboardlibrary.api.objective.ScoreFormat;
|
||||
import net.megavex.scoreboardlibrary.api.sidebar.Sidebar;
|
||||
import net.megavex.scoreboardlibrary.implementation.ScoreboardLibraryImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.CollectionProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.objective.ObjectivePacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.player.PlayerDisplayable;
|
||||
import net.megavex.scoreboardlibrary.implementation.player.ScoreboardLibraryPlayer;
|
||||
import net.megavex.scoreboardlibrary.implementation.sidebar.line.GlobalLineInfo;
|
||||
import net.megavex.scoreboardlibrary.implementation.sidebar.line.LocaleLineHandler;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Objects;
|
||||
import java.util.Queue;
|
||||
import java.util.Set;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.function.Consumer;
|
||||
import net.kyori.adventure.text.Component;
|
||||
@@ -38,7 +34,7 @@ public abstract class AbstractSidebar implements Sidebar, PlayerDisplayable {
|
||||
private final GlobalLineInfo[] lines;
|
||||
private Component title = empty();
|
||||
|
||||
private final Set<Player> players = CollectionProvider.set(8);
|
||||
private final Set<Player> players = new HashSet<>(8);
|
||||
|
||||
private boolean closed;
|
||||
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@ import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class PlayerDependantLocaleSidebar extends AbstractSidebar {
|
||||
public final class PlayerDependantLocaleSidebar extends AbstractSidebar {
|
||||
private final Map<Player, LocaleLineHandler> playerMap = new HashMap<>();
|
||||
private final Map<Locale, LocaleLineHandler> localeMap = new HashMap<>();
|
||||
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.Iterator;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class SidebarUpdaterTask implements Runnable {
|
||||
public final class SidebarUpdaterTask implements Runnable {
|
||||
private final ScoreboardLibraryImpl scoreboardLibrary;
|
||||
private final RunningTask task;
|
||||
private final Object lock = new Object();
|
||||
|
||||
+3
-4
@@ -1,26 +1,25 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.sidebar;
|
||||
|
||||
import net.megavex.scoreboardlibrary.implementation.ScoreboardLibraryImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.CollectionProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.sidebar.line.LocaleLineHandler;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class SingleLocaleSidebar extends AbstractSidebar {
|
||||
public final class SingleLocaleSidebar extends AbstractSidebar {
|
||||
private final Locale locale;
|
||||
private final LocaleLineHandler sidebar;
|
||||
private final Set<Player> internalPlayers;
|
||||
private final Set<Player> internalPlayers = new HashSet<>(8);
|
||||
|
||||
public SingleLocaleSidebar(@NotNull ScoreboardLibraryImpl scoreboardLibrary, int size, @NotNull String objectiveName, @NotNull Locale locale) {
|
||||
super(scoreboardLibrary, size, objectiveName);
|
||||
this.locale = locale;
|
||||
this.sidebar = new LocaleLineHandler(this, locale);
|
||||
this.internalPlayers = CollectionProvider.set(8);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ import net.megavex.scoreboardlibrary.implementation.sidebar.AbstractSidebar;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public class GlobalLineInfo {
|
||||
public final class GlobalLineInfo {
|
||||
private final String player;
|
||||
private final int line;
|
||||
private final TeamsPacketAdapter packetAdapter;
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.Collections;
|
||||
import java.util.Locale;
|
||||
|
||||
public class LocaleLineHandler {
|
||||
public final class LocaleLineHandler {
|
||||
private final AbstractSidebar sidebar;
|
||||
private final Locale locale;
|
||||
private final SidebarLineHandler[] lineHandlers;
|
||||
|
||||
+3
-3
@@ -2,7 +2,6 @@ package net.megavex.scoreboardlibrary.implementation.sidebar.line;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.translation.GlobalTranslator;
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.CollectionProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.LineRenderingStrategy;
|
||||
import net.megavex.scoreboardlibrary.implementation.sidebar.line.locale.LegacyLocaleLine;
|
||||
import net.megavex.scoreboardlibrary.implementation.sidebar.line.locale.LocaleLine;
|
||||
@@ -12,12 +11,13 @@ import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
public class SidebarLineHandler {
|
||||
public final class SidebarLineHandler {
|
||||
private final LineRenderingStrategy strategy;
|
||||
private final LocaleLineHandler localeLineHandler;
|
||||
private final Set<Player> players = CollectionProvider.set(1);
|
||||
private final Set<Player> players = new HashSet<>(1);
|
||||
private final LocaleLine[] lines;
|
||||
|
||||
public SidebarLineHandler(@NotNull LineRenderingStrategy strategy, @NotNull LocaleLineHandler localeLineHandler) {
|
||||
|
||||
+2
-2
@@ -21,7 +21,7 @@ import java.util.Set;
|
||||
import static net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection;
|
||||
|
||||
// Implementation for versions below 1.13
|
||||
public class LegacyLocaleLine implements LocaleLine, ImmutableTeamProperties<String> {
|
||||
public final class LegacyLocaleLine implements LocaleLine, ImmutableTeamProperties<String> {
|
||||
private final GlobalLineInfo info;
|
||||
private final SidebarLineHandler handler;
|
||||
private final TeamDisplayPacketAdapter packetAdapter;
|
||||
@@ -157,7 +157,7 @@ public class LegacyLocaleLine implements LocaleLine, ImmutableTeamProperties<Str
|
||||
}
|
||||
|
||||
pd.removeScore(players, player);
|
||||
info.packetAdapter().removeTeam(players);
|
||||
packetAdapter.removeTeam(players);
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -15,7 +15,7 @@ import java.util.Collection;
|
||||
import static net.kyori.adventure.text.Component.empty;
|
||||
|
||||
// Implementation for versions above 1.13
|
||||
public class ModernLocaleLine implements LocaleLine, ImmutableTeamProperties<Component> {
|
||||
public final class ModernLocaleLine implements LocaleLine, ImmutableTeamProperties<Component> {
|
||||
private final GlobalLineInfo info;
|
||||
private final SidebarLineHandler handler;
|
||||
private final Collection<String> entries;
|
||||
@@ -61,7 +61,7 @@ public class ModernLocaleLine implements LocaleLine, ImmutableTeamProperties<Com
|
||||
@Override
|
||||
public void hide(@NotNull Collection<Player> players) {
|
||||
handler.localeLineHandler().sidebar().packetAdapter().removeScore(players, info.player());
|
||||
info.packetAdapter().removeTeam(players);
|
||||
packetAdapter.removeTeam(players);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ import java.util.Collection;
|
||||
// Implementation for versions 1.20.3+
|
||||
// This is not yet being used as it might break on servers with plugins such as ViaBackwards,
|
||||
// however it will once Mojang decides to remove legacy chat format support
|
||||
public class PostModernLocaleLine implements LocaleLine {
|
||||
public final class PostModernLocaleLine implements LocaleLine {
|
||||
private final GlobalLineInfo info;
|
||||
private final SidebarLineHandler handler;
|
||||
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
public class ScoreboardTeamImpl implements ScoreboardTeam {
|
||||
public final class ScoreboardTeamImpl implements ScoreboardTeam {
|
||||
private final TeamManagerImpl teamManager;
|
||||
private final String name;
|
||||
private final TeamsPacketAdapter packetAdapter;
|
||||
@@ -97,7 +97,7 @@ public class ScoreboardTeamImpl implements ScoreboardTeam {
|
||||
public void removePlayer(@NotNull Player player) {
|
||||
TeamDisplayImpl teamDisplay = Objects.requireNonNull(displayMap.remove(player));
|
||||
if (teamDisplay.players().remove(player)) {
|
||||
packetAdapter.removeTeam(Collections.singleton(player));
|
||||
teamDisplay.packetAdapter().removeTeam(Collections.singleton(player));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+31
-5
@@ -8,7 +8,6 @@ import net.megavex.scoreboardlibrary.api.team.ScoreboardTeam;
|
||||
import net.megavex.scoreboardlibrary.api.team.TeamDisplay;
|
||||
import net.megavex.scoreboardlibrary.api.team.enums.CollisionRule;
|
||||
import net.megavex.scoreboardlibrary.api.team.enums.NameTagVisibility;
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.CollectionProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.EntriesPacketType;
|
||||
@@ -21,12 +20,12 @@ import java.util.*;
|
||||
|
||||
import static net.kyori.adventure.text.Component.empty;
|
||||
|
||||
public class TeamDisplayImpl implements TeamDisplay, ImmutableTeamProperties<Component> {
|
||||
public final class TeamDisplayImpl implements TeamDisplay, ImmutableTeamProperties<Component> {
|
||||
private final ScoreboardTeamImpl team;
|
||||
private final TeamDisplayPacketAdapter packetAdapter;
|
||||
private final Set<Player> players = CollectionProvider.set(4);
|
||||
private final List<String> entries = CollectionProvider.list(4);
|
||||
private final List<String> syncedEntries = CollectionProvider.list(4);
|
||||
private final Set<Player> players = new HashSet<>(4);
|
||||
private final List<String> entries = new ArrayList<>(4);
|
||||
private final List<String> syncedEntries = new ArrayList<>(4);
|
||||
private Component displayName = empty(),
|
||||
prefix = empty(),
|
||||
suffix = empty();
|
||||
@@ -67,6 +66,20 @@ public class TeamDisplayImpl implements TeamDisplay, ImmutableTeamProperties<Com
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addEntries(@NotNull Collection<String> entries) {
|
||||
Set<String> existing = new HashSet<>(this.entries);
|
||||
List<String> toAdd = new ArrayList<>(entries);
|
||||
toAdd.removeIf(existing::contains);
|
||||
if (!toAdd.isEmpty()) {
|
||||
this.entries.addAll(toAdd);
|
||||
team.teamManager().taskQueue().add(new TeamManagerTask.AddEntries(this, toAdd));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeEntry(@NotNull String entry) {
|
||||
if (entries.remove(entry)) {
|
||||
@@ -77,6 +90,19 @@ public class TeamDisplayImpl implements TeamDisplay, ImmutableTeamProperties<Com
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeEntries(@NotNull Collection<String> entries) {
|
||||
List<String> toRemove = new ArrayList<>(entries);
|
||||
toRemove.retainAll(this.entries);
|
||||
if (!toRemove.isEmpty()) {
|
||||
this.entries.removeAll(toRemove);
|
||||
team.teamManager().taskQueue().add(new TeamManagerTask.RemoveEntries(this, toRemove));
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull Component displayName() {
|
||||
return displayName;
|
||||
|
||||
+26
-17
@@ -5,7 +5,6 @@ import net.megavex.scoreboardlibrary.api.team.ScoreboardTeam;
|
||||
import net.megavex.scoreboardlibrary.api.team.TeamDisplay;
|
||||
import net.megavex.scoreboardlibrary.api.team.TeamManager;
|
||||
import net.megavex.scoreboardlibrary.implementation.ScoreboardLibraryImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.CollectionProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
|
||||
import net.megavex.scoreboardlibrary.implementation.player.PlayerDisplayable;
|
||||
import net.megavex.scoreboardlibrary.implementation.player.ScoreboardLibraryPlayer;
|
||||
@@ -14,16 +13,17 @@ import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class TeamManagerImpl implements TeamManager, PlayerDisplayable {
|
||||
public final class TeamManagerImpl implements TeamManager, PlayerDisplayable {
|
||||
private final ScoreboardLibraryImpl scoreboardLibrary;
|
||||
|
||||
private final Set<Player> players = CollectionProvider.set(8);
|
||||
private final List<Player> internalPlayers = CollectionProvider.list(8);
|
||||
private final Set<Player> players = new HashSet<>(8);
|
||||
private final List<Player> internalPlayers = new ArrayList<>(8);
|
||||
|
||||
private final Map<String, ScoreboardTeamImpl> teams = new ConcurrentHashMap<>();
|
||||
private final Queue<TeamManagerTask> taskQueue = new ConcurrentLinkedQueue<>();
|
||||
@@ -144,11 +144,26 @@ public class TeamManagerImpl implements TeamManager, PlayerDisplayable {
|
||||
return false;
|
||||
}
|
||||
|
||||
TeamManagerTask.RemovePlayer task = new TeamManagerTask.RemovePlayer(player);
|
||||
TeamManagerTask.RemovePlayer task = new TeamManagerTask.RemovePlayer(player, null);
|
||||
taskQueue.add(task);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CompletableFuture<Void> removePlayerFuture(@NotNull Player player) {
|
||||
Preconditions.checkNotNull(player);
|
||||
checkClosed();
|
||||
|
||||
if (!players.remove(player)) {
|
||||
return CompletableFuture.completedFuture(null);
|
||||
}
|
||||
|
||||
CompletableFuture<Void> future = new CompletableFuture<>();
|
||||
TeamManagerTask.RemovePlayer task = new TeamManagerTask.RemovePlayer(player, future);
|
||||
taskQueue.add(task);
|
||||
return future;
|
||||
}
|
||||
|
||||
public @NotNull ScoreboardLibraryImpl scoreboardLibrary() {
|
||||
return scoreboardLibrary;
|
||||
}
|
||||
@@ -173,11 +188,9 @@ public class TeamManagerImpl implements TeamManager, PlayerDisplayable {
|
||||
|
||||
if (task instanceof TeamManagerTask.Close) {
|
||||
for (ScoreboardTeamImpl team : teams.values()) {
|
||||
Set<Player> removePlayers = CollectionProvider.set(internalPlayers.size());
|
||||
for (TeamDisplayImpl value : team.displayMap().values()) {
|
||||
removePlayers.addAll(value.players());
|
||||
value.packetAdapter().removeTeam(value.players());
|
||||
}
|
||||
team.packetAdapter().removeTeam(removePlayers);
|
||||
}
|
||||
|
||||
for (Player player : internalPlayers) {
|
||||
@@ -197,6 +210,9 @@ public class TeamManagerImpl implements TeamManager, PlayerDisplayable {
|
||||
|
||||
internalPlayers.remove(removePlayerTask.player());
|
||||
Objects.requireNonNull(scoreboardLibrary.getPlayer(removePlayerTask.player())).teamManagerQueue().remove(this);
|
||||
if (removePlayerTask.future() != null) {
|
||||
removePlayerTask.future().complete(null);
|
||||
}
|
||||
} else if (task instanceof TeamManagerTask.ReloadPlayer) {
|
||||
TeamManagerTask.ReloadPlayer reloadPlayerTask = (TeamManagerTask.ReloadPlayer) task;
|
||||
for (ScoreboardTeamImpl team : teams.values()) {
|
||||
@@ -216,16 +232,9 @@ public class TeamManagerImpl implements TeamManager, PlayerDisplayable {
|
||||
}
|
||||
} else if (task instanceof TeamManagerTask.RemoveTeam) {
|
||||
TeamManagerTask.RemoveTeam removeTeamTask = (TeamManagerTask.RemoveTeam) task;
|
||||
List<Player> playersInTeam = CollectionProvider.list(removeTeamTask.team().displayMap().size());
|
||||
for (Map.Entry<Player, TeamDisplayImpl> entry : removeTeamTask.team().displayMap().entrySet()) {
|
||||
Player player = entry.getKey();
|
||||
TeamDisplayImpl teamDisplay = entry.getValue();
|
||||
if (teamDisplay.players().contains(player)) {
|
||||
playersInTeam.add(player);
|
||||
}
|
||||
for (TeamDisplayImpl value : removeTeamTask.team().displayMap().values()) {
|
||||
value.packetAdapter().removeTeam(value.players());
|
||||
}
|
||||
|
||||
removeTeamTask.team().packetAdapter().removeTeam(playersInTeam);
|
||||
} else if (task instanceof TeamManagerTask.UpdateTeamDisplay) {
|
||||
TeamManagerTask.UpdateTeamDisplay updateTeamDisplayTask = (TeamManagerTask.UpdateTeamDisplay) task;
|
||||
@NotNull TeamDisplayImpl teamDisplay = updateTeamDisplayTask.teamDisplay();
|
||||
|
||||
+9
-1
@@ -2,8 +2,10 @@ package net.megavex.scoreboardlibrary.implementation.team;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class TeamManagerTask {
|
||||
private TeamManagerTask() {
|
||||
@@ -30,14 +32,20 @@ public class TeamManagerTask {
|
||||
|
||||
public static final class RemovePlayer extends TeamManagerTask {
|
||||
private final Player player;
|
||||
private final CompletableFuture<Void> future;
|
||||
|
||||
public RemovePlayer(@NotNull Player player) {
|
||||
public RemovePlayer(@NotNull Player player, @Nullable CompletableFuture<Void> future) {
|
||||
this.player = player;
|
||||
this.future = future;
|
||||
}
|
||||
|
||||
public @NotNull Player player() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public @Nullable CompletableFuture<Void> future() {
|
||||
return future;
|
||||
}
|
||||
}
|
||||
|
||||
public static final class ReloadPlayer extends TeamManagerTask {
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
import java.util.Iterator;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class TeamUpdaterTask implements Runnable {
|
||||
public final class TeamUpdaterTask implements Runnable {
|
||||
private final ScoreboardLibraryImpl scoreboardLibrary;
|
||||
private final RunningTask task;
|
||||
private final Object lock = new Object();
|
||||
|
||||
@@ -1,27 +1,10 @@
|
||||
rootProject.name = "scoreboard-library"
|
||||
|
||||
include(":api")
|
||||
include(":commons")
|
||||
include(":implementation")
|
||||
include(":extra-kotlin")
|
||||
include(":test-plugin")
|
||||
|
||||
include(":packet-adapter-base")
|
||||
project(":packet-adapter-base").projectDir = file("versions/packet-adapter-base")
|
||||
|
||||
include(":packetevents")
|
||||
project(":packetevents").projectDir = file("versions/packetevents")
|
||||
|
||||
include(":modern")
|
||||
project(":modern").projectDir = file("versions/modern")
|
||||
|
||||
include(":legacy")
|
||||
project(":legacy").projectDir = file("versions/legacy")
|
||||
|
||||
// For backwards compatibility
|
||||
include(":v1_8_R3")
|
||||
project(":v1_8_R3").projectDir = file("versions/v1_8_R3")
|
||||
|
||||
val modulePrefix = rootProject.name
|
||||
rootProject.children.forEach {
|
||||
it.name = "$modulePrefix-${it.name}"
|
||||
|
||||
+35
-20
@@ -6,6 +6,7 @@ port_cursor=25570
|
||||
create_server() {
|
||||
local name=$1
|
||||
local nixshell=$2
|
||||
local enable_via=$3
|
||||
|
||||
local root=$(pwd)
|
||||
|
||||
@@ -21,7 +22,7 @@ create_server() {
|
||||
printf "Creating server \033[32m$name\033[0m on port \033[32m$port\033[0m\n"
|
||||
|
||||
echo "eula=true" > eula.txt
|
||||
printf "server-port=$port\ndifficulty=peaceful\ngenerate-structures=false\nlevel-type=flat\nallow-nether=false" > server.properties
|
||||
printf "server-port=$port\ndifficulty=peaceful\ngenerate-structures=false\nlevel-type=flat\nallow-nether=false\nonline-mode=false" > server.properties
|
||||
cp "$root/bukkit.yml" .
|
||||
|
||||
mkdir -p config
|
||||
@@ -30,6 +31,12 @@ create_server() {
|
||||
ln -sf "$plugin_path" plugins/test.jar
|
||||
ln -sf "$jar_path" server.jar
|
||||
|
||||
if [ "$enable_via" = "true" ]; then
|
||||
ln -sf $root/cache/viaversion.jar plugins/viaversion.jar
|
||||
ln -sf $root/cache/viabackwards.jar plugins/viabackwards.jar
|
||||
ln -sf $root/cache/viarewind.jar plugins/viarewind.jar
|
||||
fi
|
||||
|
||||
local flags="-DPaper.IgnoreJavaVersion=true -Xms512M -Xmx1024M -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20"
|
||||
|
||||
printf "#!/bin/sh\nnix develop .#$nixshell -c sh -c 'java $flags -jar server.jar nogui'" > start
|
||||
@@ -82,20 +89,24 @@ download_file() {
|
||||
local path="cache/$name"
|
||||
mkdir -p cache
|
||||
|
||||
if [ ! -f "$path" ]; then
|
||||
if [ ! -f "$path" ] || [ "$(sha256sum "$path" | cut -f 1 -d ' ')" != "$expected_sha256_hash" ]; then
|
||||
echo "Downloading $name..."
|
||||
curl --silent --location --output "$path" "$url"
|
||||
fi
|
||||
|
||||
local actual_hash=$(sha256sum "$path" | cut -f 1 -d ' ')
|
||||
if [ "$expected_sha256_hash" != "$actual_hash" ]; then
|
||||
local actual_hash="$(sha256sum "$path" | cut -f 1 -d ' ')"
|
||||
if [ "$actual_hash" != "$expected_sha256_hash" ]; then
|
||||
echo "ERROR: hashes for $name do not match! expected: $expected_sha256_hash, but got $actual_hash"
|
||||
rm "$path"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
download_file "buildtools.jar" "https://hub.spigotmc.org/jenkins/job/BuildTools/197/artifact/target/BuildTools.jar" "9a5b059ace22eaef28fb62f96970f0abe1490f06c860229b94627cd72eaf6ea5"
|
||||
download_file "buildtools.jar" "https://hub.spigotmc.org/jenkins/job/BuildTools/198/artifact/target/BuildTools.jar" "23eefb5a08655fe83c40ddac7a4ca78b6b2583efccd9c98c58b27df0aa31fa35"
|
||||
|
||||
download_file "viaversion.jar" "https://ci.viaversion.com/job/ViaVersion-Java8/38/artifact/build/libs/ViaVersion-5.7.1-downgraded.jar" "dcce3d30e195de9a3372616298bac1acd29196e5c3676a0fba745be9e3d91808"
|
||||
download_file "viabackwards.jar" "https://ci.viaversion.com/view/ViaBackwards/job/ViaBackwards-Java8/31/artifact/build/libs/ViaBackwards-5.7.1-downgraded.jar" "9727fd246d3566bffc3f71e1bda0e6db71bf5814a254e7ab5a2941ca0e94ecd6"
|
||||
download_file "viarewind.jar" "https://ci.viaversion.com/view/ViaRewind/job/ViaRewind-Java8/28/artifact/build/libs/ViaRewind-4.0.14-downgraded.jar" "e84c7afa696b898a99747edba2458dd9e9f5d7c1ee2f604c409964dd4d4d784d"
|
||||
|
||||
# --- 1.7.10 ---
|
||||
download_file "1.7.10-paper.jar" "https://fill-data.papermc.io/v1/objects/33772078d92e9dbb027602da016524ef29af5b4c12eaddac1fe2465b01108185/paper-1.7.10-2025.jar" "33772078d92e9dbb027602da016524ef29af5b4c12eaddac1fe2465b01108185"
|
||||
@@ -135,7 +146,7 @@ create_spigot_server "1.12.2" "jdk8"
|
||||
|
||||
# --- 1.13 ---
|
||||
download_file "1.13-paper.jar" "https://fill-data.papermc.io/v1/objects/00db82d214242c9345266d44ff8d11a8e857a1a02edf7cb5fcc2d1d973283129/paper-1.13-173.jar" "00db82d214242c9345266d44ff8d11a8e857a1a02edf7cb5fcc2d1d973283129"
|
||||
create_server "1.13-paper" "jdk8"
|
||||
create_server "1.13-paper" "jdk8" "true"
|
||||
|
||||
create_spigot_server "1.13" "jdk8"
|
||||
|
||||
@@ -143,11 +154,11 @@ create_spigot_server "1.13" "jdk8"
|
||||
download_file "1.14.4-paper.jar" "https://fill-data.papermc.io/v1/objects/bd8ec5cdb22370d37816a6de26798df3d2b0d6f9c7c96c88ca45a1303fea50e8/paper-1.14.4-245.jar" "bd8ec5cdb22370d37816a6de26798df3d2b0d6f9c7c96c88ca45a1303fea50e8"
|
||||
create_server "1.14.4-paper" "jdk8"
|
||||
|
||||
create_spigot_server "1.14.4" "jdk8"
|
||||
create_spigot_server "1.14.4" "jdk8" "true"
|
||||
|
||||
# --- 1.15.2 ---
|
||||
download_file "1.15.2-paper.jar" "https://fill-data.papermc.io/v1/objects/bd2dd6f2cc489cf9e2bb800cb4fb6d63e9d293945d3ac10b09dd9c6098fa9f34/paper-1.15.2-393.jar" "bd2dd6f2cc489cf9e2bb800cb4fb6d63e9d293945d3ac10b09dd9c6098fa9f34"
|
||||
create_server "1.15.2-paper" "jdk8"
|
||||
create_server "1.15.2-paper" "jdk8" "true"
|
||||
|
||||
create_spigot_server "1.15.2" "jdk8"
|
||||
|
||||
@@ -155,11 +166,11 @@ create_spigot_server "1.15.2" "jdk8"
|
||||
download_file "1.16.5-paper.jar" "https://fill-data.papermc.io/v1/objects/e67da4851d08cde378ab2b89be58849238c303351ed2482181a99c2c2b489276/paper-1.16.5-794.jar" "e67da4851d08cde378ab2b89be58849238c303351ed2482181a99c2c2b489276"
|
||||
create_server "1.16.5-paper" "jdk8"
|
||||
|
||||
create_spigot_server "1.16.5" "jdk8"
|
||||
create_spigot_server "1.16.5" "jdk8" "true"
|
||||
|
||||
# --- 1.17 ---
|
||||
download_file "1.17-paper.jar" "https://fill-data.papermc.io/v1/objects/760a93b94a58d619bd647d71af84688617d0444d22b716500bc6b343858dc871/paper-1.17-79.jar" "760a93b94a58d619bd647d71af84688617d0444d22b716500bc6b343858dc871"
|
||||
create_server "1.17-paper" "jdk17"
|
||||
create_server "1.17-paper" "jdk17" "true"
|
||||
|
||||
create_spigot_server "1.17" "jdk17"
|
||||
|
||||
@@ -167,11 +178,11 @@ create_spigot_server "1.17" "jdk17"
|
||||
download_file "1.18.2-paper.jar" "https://fill-data.papermc.io/v1/objects/0578f18f4d632b494b468ec56b3b414b5b56fea087ee7d39cf6dcdf4c9d01f05/paper-1.18.2-388.jar" "0578f18f4d632b494b468ec56b3b414b5b56fea087ee7d39cf6dcdf4c9d01f05"
|
||||
create_server "1.18.2-paper" "jdk17"
|
||||
|
||||
create_spigot_server "1.18.2" "jdk17"
|
||||
create_spigot_server "1.18.2" "jdk17" "true"
|
||||
|
||||
# --- 1.19.4 ---
|
||||
download_file "1.19.4-paper.jar" "https://fill-data.papermc.io/v1/objects/e587d78cba3e99ef8c4bc24cf20cc3bdbbe89e33b0b572070446af4eb6be5ccf/paper-1.19.4-550.jar" "e587d78cba3e99ef8c4bc24cf20cc3bdbbe89e33b0b572070446af4eb6be5ccf"
|
||||
create_server "1.19.4-paper" "jdk17"
|
||||
create_server "1.19.4-paper" "jdk17" "true"
|
||||
|
||||
create_spigot_server "1.19.4" "jdk17"
|
||||
|
||||
@@ -179,11 +190,11 @@ create_spigot_server "1.19.4" "jdk17"
|
||||
download_file "1.20.2-paper.jar" "https://fill-data.papermc.io/v1/objects/07f57cdc5948dcf3cb3358e43b9a46fbbe8b595fa30c8749cfc102bf44897b69/paper-1.20.2-318-mojang.jar" "07f57cdc5948dcf3cb3358e43b9a46fbbe8b595fa30c8749cfc102bf44897b69"
|
||||
create_server "1.20.2-paper" "jdk21"
|
||||
|
||||
create_spigot_server "1.20.2" "jdk21"
|
||||
create_spigot_server "1.20.2" "jdk21" "true"
|
||||
|
||||
# --- 1.20.4 ---
|
||||
download_file "1.20.4-paper.jar" "https://fill-data.papermc.io/v1/objects/e84aa4943cc51d7545b1c9b669bb1e0b143323d248ebb89012182f5554bc13d7/paper-1.20.4-499-mojang.jar" "e84aa4943cc51d7545b1c9b669bb1e0b143323d248ebb89012182f5554bc13d7"
|
||||
create_server "1.20.4-paper" "jdk21"
|
||||
create_server "1.20.4-paper" "jdk21" "true"
|
||||
|
||||
create_spigot_server "1.20.4" "jdk21"
|
||||
|
||||
@@ -192,11 +203,11 @@ download_file "1.20.5-paper.jar" "https://fill-data.papermc.io/v1/objects/3cd7da
|
||||
create_server "1.20.5-paper" "jdk21"
|
||||
|
||||
# spigot doesn't have 1.20.5
|
||||
create_spigot_server "1.20.6" "jdk21"
|
||||
create_spigot_server "1.20.6" "jdk21" "true"
|
||||
|
||||
# --- 1.21.3 ---
|
||||
download_file "1.21.3-paper.jar" "https://fill-data.papermc.io/v1/objects/87e973e1d338e869e7fdbc4b8fadc1579d7bb0246a0e0cf6e5700ace6c8bc17e/paper-1.21.3-83.jar" "87e973e1d338e869e7fdbc4b8fadc1579d7bb0246a0e0cf6e5700ace6c8bc17e"
|
||||
create_server "1.21.3-paper" "jdk21"
|
||||
create_server "1.21.3-paper" "jdk21" "true"
|
||||
|
||||
create_spigot_server "1.21.3" "jdk21"
|
||||
|
||||
@@ -204,11 +215,11 @@ create_spigot_server "1.21.3" "jdk21"
|
||||
download_file "1.21.5-paper.jar" "https://fill-data.papermc.io/v1/objects/2ae6ae22adf417699746e0f89fc2ef6cb6ee050a5f6608cee58f0535d60b509e/paper-1.21.5-114.jar" "2ae6ae22adf417699746e0f89fc2ef6cb6ee050a5f6608cee58f0535d60b509e"
|
||||
create_server "1.21.5-paper" "jdk21"
|
||||
|
||||
create_spigot_server "1.21.5" "jdk21"
|
||||
create_spigot_server "1.21.5" "jdk21" "true"
|
||||
|
||||
# --- 1.21.6 ---
|
||||
download_file "1.21.6-paper.jar" "https://fill-data.papermc.io/v1/objects/35e2dfa66b3491b9d2f0bb033679fa5aca1e1fdf097e7a06a80ce8afeda5c214/paper-1.21.6-48.jar" "35e2dfa66b3491b9d2f0bb033679fa5aca1e1fdf097e7a06a80ce8afeda5c214"
|
||||
create_server "1.21.6-paper" "jdk21"
|
||||
create_server "1.21.6-paper" "jdk21" "true"
|
||||
|
||||
create_spigot_server "1.21.6" "jdk21"
|
||||
|
||||
@@ -217,11 +228,15 @@ download_file "1.21.9-paper.jar" "https://fill-data.papermc.io/v1/objects/aec002
|
||||
create_server "1.21.9-paper" "jdk25"
|
||||
|
||||
# spigot doesnt have 1.21.9
|
||||
create_spigot_server "1.21.10" "jdk25"
|
||||
create_spigot_server "1.21.10" "jdk25" "true"
|
||||
|
||||
# --- 1.21.11 ---
|
||||
download_file "1.21.11-paper.jar" "https://fill-data.papermc.io/v1/objects/4a558a00005d33dafa4c4d5f9e47b3bd47d92311fceccd9c9754ee6b913f8649/paper-1.21.11-100.jar" "4a558a00005d33dafa4c4d5f9e47b3bd47d92311fceccd9c9754ee6b913f8649"
|
||||
create_server "1.21.11-paper" "jdk25"
|
||||
create_server "1.21.11-paper" "jdk25" "true"
|
||||
|
||||
create_spigot_server "1.21.11" "jdk25"
|
||||
|
||||
# --- 26.1 ---
|
||||
|
||||
create_spigot_server "26.1" "jdk25"
|
||||
|
||||
@@ -15,6 +15,13 @@ dependencies {
|
||||
|
||||
// bundled adventure:
|
||||
implementation(libs.adventureApi)
|
||||
implementation(libs.adventureTextSerializerGson)
|
||||
implementation(libs.adventureTextSerializerGson) {
|
||||
//exclude("com.google.code.gson")
|
||||
}
|
||||
implementation(libs.adventureTextSerializerLegacy)
|
||||
}
|
||||
|
||||
tasks.shadowJar {
|
||||
// relocate("com.google.gson", "net.megavex.scoreboardlibrary.testplugin.lib.gson")
|
||||
// relocate("net.kyori", "net.megavex.scoreboardlibrary.testplugin.lib.kyori")
|
||||
}
|
||||
+1
@@ -78,6 +78,7 @@ public final class ScoreboardPlugin extends JavaPlugin implements Listener {
|
||||
player.setGameMode(GameMode.CREATIVE);
|
||||
player.sendMessage("Server software: " + this.getServer().getName());
|
||||
player.sendMessage("Server version: " + this.getServer().getVersion());
|
||||
player.sendMessage("ViaVersion enabled: " + this.getServer().getPluginManager().isPluginEnabled("ViaVersion"));
|
||||
|
||||
boolean isNativeAdventure = false;
|
||||
try {
|
||||
|
||||
+3
-1
@@ -53,7 +53,9 @@ public final class ObjectivesModule implements Module, Listener {
|
||||
@EventHandler
|
||||
public void onQuit(final PlayerQuitEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
this.manager.removePlayer(player);
|
||||
this.manager.removePlayerFuture(player).whenComplete((v, t) -> {
|
||||
this.plugin.getLogger().info("Removed player from objective " + this.plugin.getServer().isPrimaryThread());
|
||||
});
|
||||
this.objective.removeScore(player.getName());
|
||||
}
|
||||
}
|
||||
+14
@@ -7,13 +7,18 @@ import net.megavex.scoreboardlibrary.api.sidebar.Sidebar;
|
||||
import net.megavex.scoreboardlibrary.api.sidebar.component.ComponentSidebarLayout;
|
||||
import net.megavex.scoreboardlibrary.api.sidebar.component.LineDrawable;
|
||||
import net.megavex.scoreboardlibrary.api.sidebar.component.SidebarComponent;
|
||||
import net.megavex.scoreboardlibrary.implementation.sidebar.PlayerDependantLocaleSidebar;
|
||||
import net.megavex.scoreboardlibrary.implementation.sidebar.SidebarTask;
|
||||
import net.megavex.scoreboardlibrary.testplugin.ScoreboardPlugin;
|
||||
import net.megavex.scoreboardlibrary.testplugin.TestTranslator;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.player.PlayerToggleSneakEvent;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -73,6 +78,15 @@ public final class SidebarModule implements Module, Listener, SidebarComponent {
|
||||
sidebar.removePlayer(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onSneak(PlayerToggleSneakEvent event) {
|
||||
if (!event.isSneaking()) return;
|
||||
for (final Player player : Bukkit.getOnlinePlayers()) {
|
||||
player.sendMessage("Reloading you");
|
||||
((PlayerDependantLocaleSidebar) this.sidebar).taskQueue().add(new SidebarTask.ReloadPlayer(player));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void draw(final @NotNull LineDrawable drawable) {
|
||||
drawable.drawLine(empty(), ScoreFormat.styled(style(this.hueColor())));
|
||||
|
||||
+6
-6
@@ -16,9 +16,7 @@ import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
import java.util.*;
|
||||
|
||||
import static net.kyori.adventure.text.Component.*;
|
||||
import static net.kyori.adventure.text.format.NamedTextColor.AQUA;
|
||||
@@ -74,14 +72,16 @@ public final class TeamsModule implements Module, Listener {
|
||||
this.team.defaultDisplay().addEntry(player.getName());
|
||||
this.manager.addPlayer(player);
|
||||
this.team.defaultDisplay().removeEntry(player.getName());
|
||||
this.team.defaultDisplay().addEntry(player.getName());
|
||||
this.team.defaultDisplay().addEntries(Collections.singletonList(player.getName()));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onQuit(final PlayerQuitEvent event) {
|
||||
final Player player = event.getPlayer();
|
||||
this.manager.removePlayer(player);
|
||||
this.team.defaultDisplay().removeEntry(player.getName());
|
||||
this.manager.removePlayerFuture(player).whenComplete((v, t) -> {
|
||||
this.plugin.getLogger().info("Removed player from team " + this.plugin.getServer().isPrimaryThread());
|
||||
});
|
||||
this.team.defaultDisplay().removeEntries(Collections.singletonList(player.getName()));
|
||||
}
|
||||
|
||||
private NamedTextColor randomNamedColor() {
|
||||
|
||||
@@ -2,3 +2,4 @@ name: scoreboard-library-test
|
||||
version: 0.1.0
|
||||
main: net.megavex.scoreboardlibrary.testplugin.ScoreboardPlugin
|
||||
api-version: 1.13
|
||||
softdepend: ["ViaVersion"]
|
||||
@@ -1,8 +0,0 @@
|
||||
plugins {
|
||||
id("net.megavex.scoreboardlibrary.base-conventions")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(project(":scoreboard-library-packet-adapter-base"))
|
||||
compileOnly(libs.spigotApi)
|
||||
}
|
||||
@@ -1,39 +0,0 @@
|
||||
plugins {
|
||||
id("net.megavex.scoreboardlibrary.base-conventions")
|
||||
//id("io.papermc.paperweight.userdev") version "2.0.0-beta.19"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compileOnly(project(":scoreboard-library-packet-adapter-base")) {
|
||||
//exclude(group = "org.spigotmc", module = "spigot-api")
|
||||
}
|
||||
compileOnly(libs.spigotApi)
|
||||
//paperweight.paperDevBundle("1.21.11-R0.1-SNAPSHOT")
|
||||
}
|
||||
|
||||
tasks {
|
||||
javadoc {
|
||||
exclude("**")
|
||||
}
|
||||
}
|
||||
|
||||
java {
|
||||
disableAutoTargetJvm()
|
||||
}
|
||||
|
||||
indra {
|
||||
includeJavaSoftwareComponentInPublications(false)
|
||||
}
|
||||
|
||||
publishing {
|
||||
publications.getByName<MavenPublication>("maven") {
|
||||
// Kept for backwards compatibility
|
||||
artifact(tasks.jar) {
|
||||
classifier = "mojmap"
|
||||
}
|
||||
|
||||
artifact(tasks.jar)
|
||||
artifact(tasks.javadocJar)
|
||||
artifact(tasks.sourcesJar)
|
||||
}
|
||||
}
|
||||
-38
@@ -1,38 +0,0 @@
|
||||
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern;
|
||||
|
||||
import net.megavex.scoreboardlibrary.implementation.commons.LineRenderingStrategy;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PacketAdapterProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.objective.PaperObjectivePacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.objective.SpigotObjectivePacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.team.PaperTeamsPacketAdapterImpl;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.team.SpigotTeamsPacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.util.ModernComponentProvider;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.objective.ObjectivePacketAdapter;
|
||||
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamsPacketAdapter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class PacketAdapterProviderImpl implements PacketAdapterProvider {
|
||||
public PacketAdapterProviderImpl() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull ObjectivePacketAdapter createObjectiveAdapter(@NotNull String objectiveName) {
|
||||
return ModernComponentProvider.IS_NATIVE_ADVENTURE
|
||||
? new PaperObjectivePacketAdapter(objectiveName)
|
||||
: new SpigotObjectivePacketAdapter(objectiveName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull TeamsPacketAdapter createTeamPacketAdapter(@NotNull String teamName) {
|
||||
return ModernComponentProvider.IS_NATIVE_ADVENTURE
|
||||
? new PaperTeamsPacketAdapterImpl(teamName)
|
||||
: new SpigotTeamsPacketAdapter(teamName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull LineRenderingStrategy lineRenderingStrategy(@NotNull Player player) {
|
||||
return LineRenderingStrategy.MODERN;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
plugins {
|
||||
id("net.megavex.scoreboardlibrary.base-conventions")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api(project(":scoreboard-library-api"))
|
||||
api(project(":scoreboard-library-commons"))
|
||||
compileOnly(libs.spigotApi)
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
plugins {
|
||||
id("net.megavex.scoreboardlibrary.base-conventions")
|
||||
}
|
||||
|
||||
// packetevents adapter is gone, this module is kept for compatibility
|
||||
@@ -1,8 +0,0 @@
|
||||
plugins {
|
||||
id("net.megavex.scoreboardlibrary.base-conventions")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Alias to legacy for backwards compatibility
|
||||
implementation(project(":scoreboard-library-legacy"))
|
||||
}
|
||||
Reference in new issue
Block a user