From 19f129feda9ce4ea0ce290039e859f03a634adfa Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 13 Dec 2018 22:37:33 +0300 Subject: [PATCH 001/508] Add jsr305 dependency to scheduler-utils module --- scheduler/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scheduler/pom.xml b/scheduler/pom.xml index d3394f13c..18760225c 100644 --- a/scheduler/pom.xml +++ b/scheduler/pom.xml @@ -15,6 +15,10 @@ org.projectlombok lombok + + com.google.code.findbugs + jsr305 + org.spigotmc From 8f0113dce8f4d2d75c05dc81701a25f63a9eca08 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 13 Dec 2018 22:38:27 +0300 Subject: [PATCH 002/508] Add BukkitTimers --- .../task/counter/BukkitCallbackTimer.java | 30 +++++++++++++++++ .../task/counter/BukkitTimer.java | 25 ++++++++++++++ .../ConcurrentBukkitCallbackTimer.java | 33 +++++++++++++++++++ .../task/counter/ConcurrentBukkitTimer.java | 29 ++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitCallbackTimer.java create mode 100644 scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitTimer.java create mode 100644 scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitCallbackTimer.java create mode 100644 scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitTimer.java diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitCallbackTimer.java b/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitCallbackTimer.java new file mode 100644 index 000000000..d18af8a25 --- /dev/null +++ b/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitCallbackTimer.java @@ -0,0 +1,30 @@ +package ru.progrm_jarvis.minecraft.schedulerutils.task.counter; + +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; +import lombok.experimental.NonFinal; +import lombok.val; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.function.LongConsumer; + +/** + * A {@link BukkitRunnable} which is run for a specified amount of times after which it is cancelled. + */ +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class BukkitCallbackTimer extends BukkitRunnable { + + @NonNull LongConsumer callback; + @NonFinal long counter; + + @Override + public void run() { + val value = --counter; + + if (value == 0) cancel(); + callback.accept(value); + } +} diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitTimer.java b/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitTimer.java new file mode 100644 index 000000000..618942e98 --- /dev/null +++ b/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitTimer.java @@ -0,0 +1,25 @@ +package ru.progrm_jarvis.minecraft.schedulerutils.task.counter; + +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.experimental.FieldDefaults; +import lombok.experimental.NonFinal; +import org.bukkit.scheduler.BukkitRunnable; + +/** + * A {@link BukkitRunnable} which is run for a specified amount of times after which it is cancelled. + */ +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class BukkitTimer extends BukkitRunnable { + + @NonNull Runnable task; + @NonFinal long counter; + + @Override + public void run() { + if (--counter == 0) cancel(); + task.run(); + } +} diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitCallbackTimer.java b/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitCallbackTimer.java new file mode 100644 index 000000000..7e8cdd698 --- /dev/null +++ b/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitCallbackTimer.java @@ -0,0 +1,33 @@ +package ru.progrm_jarvis.minecraft.schedulerutils.task.counter; + +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.experimental.FieldDefaults; +import lombok.val; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.concurrent.atomic.AtomicLong; +import java.util.function.LongConsumer; + +/** + * A {@link BukkitRunnable} which is run for a specified amount of times after which it is cancelled. + */ +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class ConcurrentBukkitCallbackTimer extends BukkitRunnable { + + @NonNull LongConsumer callback; + @NonNull AtomicLong counter; + + public ConcurrentBukkitCallbackTimer(@NonNull final LongConsumer callback, final long counter) { + this.callback = callback; + this.counter = new AtomicLong(counter); + } + + @Override + public void run() { + val value = counter.decrementAndGet(); + + if (counter.decrementAndGet() == 0) cancel(); + callback.accept(value); + } +} diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitTimer.java b/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitTimer.java new file mode 100644 index 000000000..d1bc30448 --- /dev/null +++ b/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitTimer.java @@ -0,0 +1,29 @@ +package ru.progrm_jarvis.minecraft.schedulerutils.task.counter; + +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.experimental.FieldDefaults; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.concurrent.atomic.AtomicLong; + +/** + * A {@link BukkitRunnable} which is run for a specified amount of times after which it is cancelled. + */ +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class ConcurrentBukkitTimer extends BukkitRunnable { + + @NonNull Runnable task; + @NonNull AtomicLong counter; + + public ConcurrentBukkitTimer(@NonNull final Runnable task, final long counter) { + this.task = task; + this.counter = new AtomicLong(counter); + } + + @Override + public void run() { + if (counter.decrementAndGet() == 0) cancel(); + task.run(); + } +} From da157768c202d34826a48e3a389a24d4922cce55 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 16 Dec 2018 22:42:22 +0300 Subject: [PATCH 003/508] Add Callback functional interface --- .../minecraft/commons/util/function/Callback.java | 15 +++++++++++++++ pom.xml | 5 +++++ 2 files changed, 20 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/Callback.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/Callback.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/Callback.java new file mode 100644 index 000000000..617c0c0f4 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/Callback.java @@ -0,0 +1,15 @@ +package ru.progrm_jarvis.minecraft.commons.util.function; + +import lombok.SneakyThrows; + +@FunctionalInterface +public interface Callback extends Runnable { + + void call() throws Throwable; + + @Override + @SneakyThrows + default void run() { + call(); + } +} diff --git a/pom.xml b/pom.xml index 39b95b602..237d067b8 100644 --- a/pom.xml +++ b/pom.xml @@ -269,6 +269,11 @@ trove4j 3.0.3 + + org.apache.httpcomponents + httpclient + 4.5.6 + From 56ebbdead3f3e7bdb42bf40992571fa91cd7b925 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 16 Dec 2018 22:42:48 +0300 Subject: [PATCH 004/508] Add ReflectionUtil --- .../commons/util/ReflectionUtil.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java new file mode 100644 index 000000000..4e2ad2ba8 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java @@ -0,0 +1,21 @@ +package ru.progrm_jarvis.minecraft.commons.util; + +import lombok.NonNull; +import lombok.experimental.UtilityClass; + +/** + * Utility containing stuff not available in Reflector yet. + */ +@UtilityClass +public class ReflectionUtil { + + public boolean isClassAvailable(@NonNull final String className) { + try { + Class.forName(className); + + return true; + } catch (final ClassNotFoundException e) { + return false; + } + } +} From 64c7c98594851ae4668246e01c1f4fda12beeb41 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 16 Dec 2018 22:43:05 +0300 Subject: [PATCH 005/508] Add MinecraftEnvironment enum --- .../commons/MinecraftEnvironment.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java new file mode 100644 index 000000000..03e7dd728 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java @@ -0,0 +1,60 @@ +package ru.progrm_jarvis.minecraft.commons; + +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.Synchronized; +import lombok.experimental.FieldDefaults; +import lombok.experimental.NonFinal; +import lombok.val; +import ru.progrm_jarvis.minecraft.commons.util.ReflectionUtil; + +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +public enum MinecraftEnvironment { + + BUKKIT_API("org.bukkit.Bukkit"), + SPIGOT_API("org.spigotmc.CustomTimingsHandler"), + NMS(new String[0], "net.minecraft.server"), + BUNGEE_API("net.md_5.bungee.api.ProxyServer"), + BUNGEECORD("net.md_5.bungee.BungeeCord"); + + @NonFinal boolean available; + @NonNull String[] checkedClasses, checkedPackages; + + MinecraftEnvironment(@NonNull final String[] checkedClasses, @NonNull final String... checkedPackages) { + this.checkedClasses = checkedClasses; + this.checkedPackages = checkedPackages; + } + + MinecraftEnvironment(final String... checkedClasses) { + this(checkedClasses, new String[0]); + } + + /** + * Forcefully sets this environment as an available. + * + * @deprecated Should only be called in case the specified environment is available although cannot be recognized. + */ + @Deprecated + @Synchronized + public void setAvailable() { + this.available = true; + } + + @Synchronized + public boolean isAvailable() { + if (available) return true; + else return available = classesAvailable() && packagesAvailable(); + } + + private boolean packagesAvailable() { + if (checkedPackages.length == 0) return true; + for (val checkedPackage : checkedPackages) if (Package.getPackage(checkedPackage) == null) return false; + return true; + } + + private boolean classesAvailable() { + if (checkedClasses.length == 0) return true; + for (val checkedClass : checkedClasses) if (!ReflectionUtil.isClassAvailable(checkedClass)) return false; + return true; + } +} From f5b5df759fc8c90ad8d900816c3028c012eb90fc Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 16 Dec 2018 22:43:19 +0300 Subject: [PATCH 006/508] Add BukkitPluginShutdownUtil --- .../plugin/BukkitPluginShutdownUtil.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java new file mode 100644 index 000000000..933433b51 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -0,0 +1,73 @@ +package ru.progrm_jarvis.minecraft.commons.plugin; + +import lombok.NonNull; +import lombok.Value; +import lombok.experimental.UtilityClass; +import lombok.val; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.server.PluginDisableEvent; +import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; +import ru.progrm_jarvis.minecraft.commons.util.function.Callback; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +@UtilityClass +public class BukkitPluginShutdownUtil { + + private final Map PLUGIN_SHUTDOWN_HANDLERS = new ConcurrentHashMap<>(); + + private PluginShutdownHandler getOrCreateShutdownHandler(final Plugin plugin) { + return PLUGIN_SHUTDOWN_HANDLERS.computeIfAbsent(plugin, PluginShutdownHandler::new); + } + + private Optional getOptionalShutdownHandler(final Plugin plugin) { + return Optional.ofNullable(PLUGIN_SHUTDOWN_HANDLERS.get(plugin)); + } + + public void addShutdownHook(final Plugin plugin, final Callback callback) { + getOrCreateShutdownHandler(plugin).callbacks.add(callback); + } + + public void addShutdownHooks(final Plugin plugin, final Callback... callbacks) { + getOrCreateShutdownHandler(plugin).callbacks.addAll(Arrays.asList(callbacks)); + } + + public void addShutdownHooks(final Plugin plugin, final Collection callbacks) { + getOrCreateShutdownHandler(plugin).callbacks.addAll(callbacks); + } + + public void removeShutdownHook(final Plugin plugin, final Callback callback) { + getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.remove(callback)); + } + + public void removeShutdownHooks(final Plugin plugin, final Callback... callbacks) { + getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.removeAll(Arrays.asList(callbacks))); + } + + public void removeShutdownHooks(final Plugin plugin, final Collection callback) { + getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.removeAll(callback)); + } + + @Value + private class PluginShutdownHandler implements Listener { + + private Collection callbacks = ConcurrentCollections.concurrentList(new ArrayList<>()); + + private PluginShutdownHandler(@NonNull final Plugin plugin) { + Bukkit.getPluginManager().registerEvents(this, plugin); + } + + @EventHandler(ignoreCancelled = true) + public void onPluginDisable(final PluginDisableEvent event) { + val handler = PLUGIN_SHUTDOWN_HANDLERS.get(event.getPlugin()); + if (handler != null) { + for (val callback : handler.callbacks) callback.run(); + handler.callbacks.clear(); + } + } + } +} From 18cd0c54d61caff3b74e521db4e720ea8241e17c Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 17 Dec 2018 23:02:12 +0300 Subject: [PATCH 007/508] Add httpclient dependency to minecraft-commons --- commons/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/commons/pom.xml b/commons/pom.xml index 7244454be..35d79875e 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -27,6 +27,10 @@ com.google.code.findbugs jsr305 + + org.apache.httpcomponents + httpclient + org.junit.jupiter From 95868c2335993d2aa40a3162b73e6d14def60d60 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 17 Dec 2018 23:02:37 +0300 Subject: [PATCH 008/508] Add Time value-class --- .../minecraft/commons/util/time/Time.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java new file mode 100644 index 000000000..6c195be5d --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java @@ -0,0 +1,37 @@ +package ru.progrm_jarvis.minecraft.commons.util.time; + +import com.google.common.base.Preconditions; +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.Value; +import lombok.experimental.Accessors; +import lombok.experimental.FieldDefaults; + +import javax.annotation.Nonnegative; +import java.util.concurrent.TimeUnit; + +/** + * A simple value consisting of {@link long} duration and its {@link TimeUnit} type. + */ +@Value +@Accessors(fluent = true) +@FieldDefaults(level = AccessLevel.PRIVATE) +public class Time { + + public Time(final long duration, @NonNull final TimeUnit unit) { + Preconditions.checkArgument(duration >= 0, "duration should be non-negative"); + + this.duration = duration; + this.unit = unit; + } + + /** + * Duration value + */ + @Nonnegative long duration; + + /** + * Unit type + */ + @NonNull TimeUnit unit; +} From 50ddd6fb1c47a1e9da97518574a6a4161dadb077 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 17 Dec 2018 23:05:37 +0300 Subject: [PATCH 009/508] Add CraftBukkit MinecraftEnvironment --- .../ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java | 1 + 1 file changed, 1 insertion(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java index 03e7dd728..965c6c823 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java @@ -14,6 +14,7 @@ public enum MinecraftEnvironment { BUKKIT_API("org.bukkit.Bukkit"), SPIGOT_API("org.spigotmc.CustomTimingsHandler"), NMS(new String[0], "net.minecraft.server"), + CRAFTBUKKIT(new String[0], "org.bukkit.craftbukkit"), BUNGEE_API("net.md_5.bungee.api.ProxyServer"), BUNGEECORD("net.md_5.bungee.BungeeCord"); From 8970388820a8262c8781a839185bccb4393e9606 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 17 Dec 2018 23:08:32 +0300 Subject: [PATCH 010/508] Style: move httpclient in POM to the right position --- commons/pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/commons/pom.xml b/commons/pom.xml index 35d79875e..768f21a29 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -18,6 +18,10 @@ net.md-5 bungeecord-api + + org.apache.httpcomponents + httpclient + org.projectlombok @@ -27,10 +31,6 @@ com.google.code.findbugs jsr305 - - org.apache.httpcomponents - httpclient - org.junit.jupiter From 681573112bb0dc46b5738c28083d989edc757556 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 17 Dec 2018 23:28:09 +0300 Subject: [PATCH 011/508] Add Lazy --- .../commons/util/function/lazy/Lazy.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java new file mode 100644 index 000000000..fbfaccce0 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java @@ -0,0 +1,18 @@ +package ru.progrm_jarvis.minecraft.commons.util.function.lazy; + +import java.util.function.Supplier; + +/** + * A value calculated only once needed and then cached. + * + * @param type of value + */ +public interface Lazy extends Supplier { + + /** + * Retrieves whether or not this Lazy was initialized ({@link #get()} was called). + * + * @return {@code true} if this lazy was initialized and {@link false} otherwise + */ + boolean isInitialized(); +} From 7c7be121b170baea204af8ca195a76f381bc58ec Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 18 Dec 2018 19:39:50 +0300 Subject: [PATCH 012/508] Add Lazy and Lazies --- commons/pom.xml | 4 + .../commons/util/function/lazy/Lazies.java | 87 +++++++++++++++ .../commons/util/function/lazy/Lazy.java | 16 +++ .../util/function/lazy/LaziesTest.java | 103 ++++++++++++++++++ 4 files changed, 210 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java create mode 100644 commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java diff --git a/commons/pom.xml b/commons/pom.xml index 768f21a29..0f8e0ef18 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -22,6 +22,10 @@ org.apache.httpcomponents httpclient + + com.comphenix.protocol + ProtocolLib-API + org.projectlombok diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java new file mode 100644 index 000000000..ed610f896 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java @@ -0,0 +1,87 @@ +package ru.progrm_jarvis.minecraft.commons.util.function.lazy; + +import lombok.*; +import lombok.experimental.FieldDefaults; +import lombok.experimental.UtilityClass; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedSupplier; + +import javax.annotation.Nullable; +import java.util.function.Supplier; + +@UtilityClass +public class Lazies { + + public Lazy lazy(@NonNull final UncheckedSupplier valueSupplier) { + return new SimpleLazy<>(valueSupplier); + } + + public Lazy concurrentLazy(@NonNull final UncheckedSupplier valueSupplier) { + return new ConcurrentLazy<>(valueSupplier); + } + + @ToString + @EqualsAndHashCode + @FieldDefaults(level = AccessLevel.PRIVATE) + private static final class SimpleLazy implements Lazy { + + @Nullable transient Supplier valueSupplier; + @Nullable transient T value; + + private SimpleLazy(@NonNull final Supplier supplier) { + this.valueSupplier = supplier; + } + + @Override + public boolean isInitialized() { + return valueSupplier == null; + } + + @Override + public T get() { + if (valueSupplier != null) { // not initialized + value = valueSupplier.get(); + valueSupplier = null; + } + + return value; + } + } + + @ToString + @EqualsAndHashCode + @FieldDefaults(level = AccessLevel.PRIVATE) + private static final class ConcurrentLazy implements Lazy { + + @Nullable transient Supplier valueSupplier; + @Nullable transient T value; + + private ConcurrentLazy(@NonNull final Supplier supplier) { + this.valueSupplier = supplier; + } + + @Override + public boolean isInitialized() { + if (valueSupplier != null) { // might be not initialized + synchronized (this) { // synchronize and return sure value + return valueSupplier == null; + } + } + + return true; + } + + @Override + public T get() { + if (valueSupplier != null) { // might be not initialized + synchronized (this) { // synchronize to make sure + if (valueSupplier != null) { + value = valueSupplier.get(); + valueSupplier = null; // no longer needed + } + } + } + + return value; + } + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java index fbfaccce0..c5214b1f8 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java @@ -1,5 +1,7 @@ package ru.progrm_jarvis.minecraft.commons.util.function.lazy; +import javax.annotation.Nullable; +import java.util.Optional; import java.util.function.Supplier; /** @@ -9,10 +11,24 @@ */ public interface Lazy extends Supplier { + @Override + @Nullable T get(); + /** * Retrieves whether or not this Lazy was initialized ({@link #get()} was called). * * @return {@code true} if this lazy was initialized and {@link false} otherwise */ boolean isInitialized(); + + /** + * Gets a value wrapped in {@link Optional} only if it was initialized, otherwise returning an empty one. + * + * @return Optional containing the value if it was initialized or an empty one otherwise. + * + * @apiNote An empty optional may also mean that the value was initialized to {@code null}. + */ + default Optional getIfInitialized() { + return isInitialized() ? Optional.ofNullable(get()) : Optional.empty(); + } } diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java new file mode 100644 index 000000000..e0232c4dd --- /dev/null +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java @@ -0,0 +1,103 @@ +package ru.progrm_jarvis.minecraft.commons.util.function.lazy; + +import lombok.val; +import lombok.var; +import org.apache.commons.lang.math.RandomUtils; +import org.junit.jupiter.api.Test; + +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +class LaziesTest { + + @Test + void testLazy() { + val foo = mock(Foo.class); + val number = new AtomicInteger(); + + when(foo.createBar()).thenAnswer(invocation -> "<3" + number.getAndIncrement()); + + val lazy = Lazies.lazy(foo::createBar); + + assertFalse(lazy.isInitialized()); + verify(foo, times(0)).createBar(); + assertFalse(lazy.isInitialized()); + verify(foo, times(0)).createBar(); + + assertEquals("<3" + 0, lazy.get()); + verify(foo, times(1)).createBar(); + assertTrue(lazy.isInitialized()); + verify(foo, times(1)).createBar(); + + assertEquals("<3" + 0, lazy.get()); + verify(foo, times(1)).createBar(); + assertTrue(lazy.isInitialized()); + verify(foo, times(1)).createBar(); + + for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertEquals("<3" + 0, lazy.get()); + for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertTrue(lazy.isInitialized()); + for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) { + if (RandomUtils.nextBoolean()) assertEquals("<3" + 0, lazy.get()); + else assertTrue(lazy.isInitialized()); + } + for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertEquals("<3" + 0, lazy.get()); + for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertTrue(lazy.isInitialized()); + verify(foo, times(1)).createBar(); + } + + @Test + void testConcurrentLazy() { + val foo = mock(Foo.class); + val number = new AtomicInteger(); + + when(foo.createBar()).thenAnswer(invocation -> "<3" + number.getAndIncrement()); + + val lazy = Lazies.concurrentLazy(foo::createBar); + + assertFalse(lazy.isInitialized()); + verify(foo, times(0)).createBar(); + assertFalse(lazy.isInitialized()); + verify(foo, times(0)).createBar(); + + val workers = 7 + RandomUtils.nextInt(8); + val executors = Executors.newFixedThreadPool(workers); + for (int executorId = 0; executorId < workers; executorId++) executors.submit(() -> { + for (int j = 0; j < 15 + RandomUtils.nextInt(16); j++) { + + assertFalse(lazy.isInitialized()); + verify(foo, times(1)).createBar(); + assertFalse(lazy.isInitialized()); + verify(foo, times(1)).createBar(); + + assertEquals("<3" + 0, lazy.get()); + verify(foo, times(1)).createBar(); + assertTrue(lazy.isInitialized()); + verify(foo, times(1)).createBar(); + + assertEquals("<3" + 0, lazy.get()); + verify(foo, times(1)).createBar(); + assertTrue(lazy.isInitialized()); + verify(foo, times(1)).createBar(); + + for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertEquals("<3" + 0, lazy.get()); + for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertTrue(lazy.isInitialized()); + for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) { + if (RandomUtils.nextBoolean()) assertEquals("<3" + 0, lazy.get()); + else assertTrue(lazy.isInitialized()); + } + for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertEquals("<3" + 0, lazy.get()); + for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertTrue(lazy.isInitialized()); + verify(foo, times(1)).createBar(); + } + }); + } + + @FunctionalInterface + private interface Foo { + + Object createBar(); + } +} \ No newline at end of file From 36e3283974ef0a200b148b2b9cc40b86db3416c4 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 18 Dec 2018 19:48:52 +0300 Subject: [PATCH 013/508] Add MojangUtil --- .../minecraft/commons/mojang/MojangUtil.java | 45 +++++++++++++++++++ .../commons/mojang/MojangUtilTest.java | 26 +++++++++++ 2 files changed, 71 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java create mode 100644 commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtilTest.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java new file mode 100644 index 000000000..5cb6a05b2 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java @@ -0,0 +1,45 @@ +package ru.progrm_jarvis.minecraft.commons.mojang; + +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import lombok.val; + +import java.util.UUID; + +/** + * A pack of Utilities related to Mojang API specific stuff. + */ +@UtilityClass +public class MojangUtil { + + /** + * Converts a UUID in a form returned by Mojang API calls (no dashes) to a {@link UUID} object. + * + * @param mojangUuid UUID in a non-standard form returned by Mojang API call (no dashes) to convert + * @return standard UUID object, result of conversion + */ + public UUID fromMojangUuid(@NonNull final String mojangUuid) { + return UUID.fromString( + mojangUuid.substring(0, 8) + + '-' + mojangUuid.substring(8, 12) + + '-' + mojangUuid.substring(12, 16) + + '-' + mojangUuid.substring(16, 20) + + '-' + mojangUuid.substring(20, 32) + ); + } + + /** + * Converts a {@link UUID} object to a form used by Mojang API (no dashes). + * + * @param uuid standard UUID object to convert + * @return UUID in a non-standard form used by Mojang API (no dashes), result of conversion + */ + public String toMojangUuid(@NonNull final UUID uuid) { + val stringUuid = uuid.toString(); + return stringUuid.substring(0, 8) + + stringUuid.substring(9, 13) + + stringUuid.substring(14, 18) + + stringUuid.substring(19, 23) + + stringUuid.substring(24, 36); + } +} diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtilTest.java new file mode 100644 index 000000000..34b437a5b --- /dev/null +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtilTest.java @@ -0,0 +1,26 @@ +package ru.progrm_jarvis.minecraft.commons.mojang; + +import org.junit.jupiter.api.Test; + +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class MojangUtilTest { + + @Test + void testFromMojangUuid() { + assertEquals( + UUID.fromString("29be10b1-b2d1-4130-b8f2-4fd14d3ccb62"), + MojangUtil.fromMojangUuid("29be10b1b2d14130b8f24fd14d3ccb62") + ); + } + + @Test + void testToMojangUuid() { + assertEquals( + "29be10b1b2d14130b8f24fd14d3ccb62", + MojangUtil.toMojangUuid(UUID.fromString("29be10b1-b2d1-4130-b8f2-4fd14d3ccb62")) + ); + } +} \ No newline at end of file From 8f6fd91b3622156d554ecbf5c90f1b7cd0743f47 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 18 Dec 2018 20:11:37 +0300 Subject: [PATCH 014/508] Remove @Nullable from Lazy#get() --- .../minecraft/commons/util/function/lazy/Lazy.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java index c5214b1f8..c8e3033cb 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java @@ -1,6 +1,5 @@ package ru.progrm_jarvis.minecraft.commons.util.function.lazy; -import javax.annotation.Nullable; import java.util.Optional; import java.util.function.Supplier; @@ -12,7 +11,7 @@ public interface Lazy extends Supplier { @Override - @Nullable T get(); + T get(); /** * Retrieves whether or not this Lazy was initialized ({@link #get()} was called). From 6a708f2283721d1c8ec661ce49459beb6cb5958d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 19 Dec 2018 22:29:33 +0300 Subject: [PATCH 015/508] Add commons-io dependency --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 237d067b8..fda9ac904 100644 --- a/pom.xml +++ b/pom.xml @@ -264,6 +264,11 @@ reflector 1.2.2 + + commons-io + commons-io + 2.6 + net.sf.trove4j trove4j From cd8aa1ce3569f056b76ca9b317a415e8084431a5 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 19 Dec 2018 22:30:40 +0300 Subject: [PATCH 016/508] Cleanup mc-unit dependencies --- mc-unit/pom.xml | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/mc-unit/pom.xml b/mc-unit/pom.xml index 29a745d5e..4199c937a 100644 --- a/mc-unit/pom.xml +++ b/mc-unit/pom.xml @@ -13,33 +13,11 @@ Utilities useful for JUnit testing minecraft-related functionality - - - - org.codehaus.mojo - aspectj-maven-plugin - - - - - - org.spigotmc - spigot-api - - - net.sf.trove4j - trove4j - - org.projectlombok lombok - - org.aspectj - aspectjrt - com.google.code.findbugs jsr305 From 7cf1f2598439793c40228ad2807233d76a361e3a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 19 Dec 2018 22:31:08 +0300 Subject: [PATCH 017/508] Add commons-io and httpclient dependencies to mc-unit --- mc-unit/pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mc-unit/pom.xml b/mc-unit/pom.xml index 4199c937a..0d836120d 100644 --- a/mc-unit/pom.xml +++ b/mc-unit/pom.xml @@ -14,6 +14,15 @@ + + commons-io + commons-io + + + org.apache.httpcomponents + httpclient + + org.projectlombok lombok From dd3aa377a2fd57c03f433352d5a2a63f83345e0e Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 19 Dec 2018 22:55:05 +0300 Subject: [PATCH 018/508] Add HttpClient unit-testing utilities --- .../io/http/HttpClientArgumentMatchers.java | 64 +++++++++ .../mcunit/io/http/HttpClientMocks.java | 131 ++++++++++++++++++ .../http/HttpClientArgumentMatchersTest.java | 33 +++++ .../mcunit/io/http/HttpClientMocksTest.java | 39 ++++++ 4 files changed, 267 insertions(+) create mode 100644 mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchers.java create mode 100644 mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocks.java create mode 100644 mc-unit/src/test/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchersTest.java create mode 100644 mc-unit/src/test/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocksTest.java diff --git a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchers.java b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchers.java new file mode 100644 index 000000000..fb2200920 --- /dev/null +++ b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchers.java @@ -0,0 +1,64 @@ +package ru.progrm_jarvis.mcunit.io.http; + +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.Value; +import lombok.experimental.FieldDefaults; +import lombok.experimental.UtilityClass; +import org.apache.http.client.methods.HttpUriRequest; +import org.mockito.ArgumentMatcher; +import org.mockito.ArgumentMatchers; + +import javax.annotation.Nullable; + +import static org.mockito.ArgumentMatchers.argThat; + +/** + * Matchers for HTTP-client-related stuff. + * This is made mostly because commonly used classes of HTTP-client library + * don't override {@link Object#equals(Object)} and {@link Object#hashCode()} + */ +@UtilityClass +public class HttpClientArgumentMatchers { + + /** + * Creates a matcher for request specified. + * + * @param request request for which to create the matcher + * @return matcher for the request + * + * @implNote for {@code null} request {@link ArgumentMatchers#isNull()} is used. + */ + @NonNull public ArgumentMatcher httpUriRequestMatcher(@Nullable final HttpUriRequest request) { + return new HttpUriRequestMatcher(request); + } + + /** + * {@link HttpUriRequest} that is equal to the given value. + * + * @param value the given value + * @return {@code null} + */ + // naming and JavaDocs conventions taken from ArgumentMatchers + public HttpUriRequest eqHttpUriRequest(@Nullable final HttpUriRequest value) { + return argThat(httpUriRequestMatcher(value)); + } + + @Value + @FieldDefaults(level = AccessLevel.PRIVATE) + private static class HttpUriRequestMatcher implements ArgumentMatcher { + + @Nullable HttpUriRequest request; + + @Override + public boolean matches(@Nullable final HttpUriRequest argument) { + if (request == argument) return true; // if one non-null (as both not same) => match + if (request == null || argument == null) return false; + + // equality comparison + return request.isAborted() == argument.isAborted() // similar abort-status + && request.getMethod().equals(argument.getMethod()) // similar method type + && request.getURI().equals(argument.getURI()); // similar URI + } + } +} diff --git a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocks.java b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocks.java new file mode 100644 index 000000000..369b07f26 --- /dev/null +++ b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocks.java @@ -0,0 +1,131 @@ +package ru.progrm_jarvis.mcunit.io.http; + +import lombok.NonNull; +import lombok.SneakyThrows; +import lombok.experimental.UtilityClass; +import lombok.val; +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpUriRequest; +import org.mockito.Answers; + +import java.io.InputStream; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Useful mocks for Apache HttpClient. + */ +@UtilityClass +public class HttpClientMocks { + + /** + * Creates a mock of {@link HttpClient} allowing easy behaviour mocking for request responses. + * + * @return mocked HTTP-client with support of response-mocking + */ + public MockedHttpClient mockHttpClient() { + return mock(MockedHttpClient.class, Answers.CALLS_REAL_METHODS); + } + + /** + * An HTTP-client mock base which allows easy addition of request-response behaviour mocks. + */ + public interface MockedHttpClient extends HttpClient { + + /** + * Makes this HTTP-client return specified response on specified request. + * + * @param request request on which to return the response specified + * @param response response to return on request specified + * @return this HTTP-client mock + */ + @SneakyThrows + default MockedHttpClient responding(final HttpUriRequest request, final HttpResponse response) { + when(execute(HttpClientArgumentMatchers.eqHttpUriRequest(request))).thenReturn(response); + + return this; + } + + /** + * Makes this HTTP-client return a mocked response + * whose {@link HttpResponse#getEntity()} method will return the one specified. + * + * @param request request on which to return the response mock with the specified entity + * @param responseEntity response entity to be used by response-mock returned on request specified + * @return this HTTP-client mock + */ + @SneakyThrows + default MockedHttpClient responding(final HttpUriRequest request, final HttpEntity responseEntity) { + val response = mock(HttpResponse.class); + when(response.getEntity()).thenReturn(responseEntity); + + return responding(request, response); + } + + /** + * Makes this HTTP-client return a mocked response + * whose {@link HttpResponse#getEntity()} method will return the mock + * whose {@link HttpEntity#getContent()} returns the one specified. + * + * @param request request on which to return the response mock with the specified entity + * @param responseContent response content of the entity-mock + * used by response-mock returned on request specified + * @return this HTTP-client mock + * + * @implNote does not influence any methods of {@link HttpEntity} except for {@link HttpEntity#getContent()} + */ + @SneakyThrows + default MockedHttpClient responding(final HttpUriRequest request, final InputStream responseContent) { + val responseEntity = mock(HttpEntity.class); + when(responseEntity.getContent()).thenReturn(responseContent); + + return responding(request, responseEntity); + } + + /** + * Makes this HTTP-client return a mocked response + * whose {@link HttpResponse#getEntity()} method will return the mock + * whose {@link HttpEntity#getContent()} returns the one based on the one specified. + * + * @param request request on which to return the response mock with the specified entity + * @param responseContent response content to be converted to {@link InputStream} of the entity-mock + * used by response-mock returned on request specified + * @param charset charset of the response content + * @return this HTTP-client mock + * + * @implNote does not influence any methods of {@link HttpEntity} except for {@link HttpEntity#getContent()} + * @implNote uses {@link IOUtils#toInputStream(CharSequence, Charset)} + * to convert the {@link String} to {@link InputStream} + */ + default MockedHttpClient responding(final HttpUriRequest request, @NonNull final String responseContent, + final Charset charset) { + return responding(request, IOUtils.toInputStream(responseContent, charset)); + } + + + /** + * Makes this HTTP-client return a mocked response + * whose {@link HttpResponse#getEntity()} method will return the mock + * whose {@link HttpEntity#getContent()} returns the one based on the one specified (treated as UTF-8 encoded). + * + * @param request request on which to return the response mock with the specified entity + * @param responseContent response content to be converted to {@link InputStream} + * of the entity-mock treated as UTF-8 encoded + * used by response-mock returned on request specified + * @return this HTTP-client mock + * + * @implNote does not influence any methods of {@link HttpEntity} except for {@link HttpEntity#getContent()} + * @implNote uses {@link IOUtils#toInputStream(CharSequence, Charset)} + * to convert the {@link String} to {@link InputStream} + */ + default MockedHttpClient responding(final HttpUriRequest request, @NonNull final String responseContent) { + return responding(request, responseContent, StandardCharsets.UTF_8); + } + } +} diff --git a/mc-unit/src/test/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchersTest.java b/mc-unit/src/test/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchersTest.java new file mode 100644 index 000000000..443896a2a --- /dev/null +++ b/mc-unit/src/test/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchersTest.java @@ -0,0 +1,33 @@ +package ru.progrm_jarvis.mcunit.io.http; + +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class HttpClientArgumentMatchersTest { + + @Test + void testHttpUriRequestMatcher() { + assertTrue(HttpClientArgumentMatchers.httpUriRequestMatcher(new HttpGet("https://github.com/")) + .matches(new HttpGet("https://github.com/"))); + + assertTrue(HttpClientArgumentMatchers.httpUriRequestMatcher(new HttpPost("https://github.com/")) + .matches(new HttpPost("https://github.com/"))); + + assertFalse(HttpClientArgumentMatchers.httpUriRequestMatcher(new HttpGet("https://github.com/")) + .matches(new HttpPost("https://github.com/"))); + + assertFalse(HttpClientArgumentMatchers.httpUriRequestMatcher(new HttpGet("https://example.com/")) + .matches(new HttpGet("https://github.com/"))); + + assertFalse(HttpClientArgumentMatchers.httpUriRequestMatcher(new HttpPost("https://example.com/")) + .matches(new HttpPost("https://github.com/"))); + + assertTrue(HttpClientArgumentMatchers.httpUriRequestMatcher(null).matches(null)); + + assertFalse(HttpClientArgumentMatchers.httpUriRequestMatcher(new HttpPost("https://example.com/")) + .matches(null)); + } +} \ No newline at end of file diff --git a/mc-unit/src/test/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocksTest.java b/mc-unit/src/test/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocksTest.java new file mode 100644 index 000000000..b006e6dbd --- /dev/null +++ b/mc-unit/src/test/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocksTest.java @@ -0,0 +1,39 @@ +package ru.progrm_jarvis.mcunit.io.http; + +import lombok.val; +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.mock; + +class HttpClientMocksTest { + + @Test + void testMockedHttpClient() throws IOException { + val someResponse = mock(HttpResponse.class); + + val client = HttpClientMocks.mockHttpClient() + .responding(new HttpGet("http://example.com/"), "Hello world") + .responding(new HttpPost("http://example.com/"), "Pochta Rossii != Post") + .responding(new HttpGet("http://example2.com/"), someResponse); + + assertEquals("Hello world", IOUtils.toString( + client.execute(new HttpGet("http://example.com/")).getEntity().getContent(), StandardCharsets.UTF_8 + )); + + assertEquals("Pochta Rossii != Post", IOUtils.toString( + client.execute(new HttpPost("http://example.com/")).getEntity().getContent(), StandardCharsets.UTF_8 + )); + + assertSame(someResponse, client.execute(new HttpGet("http://example2.com/"))); + + assertNull(client.execute(new HttpGet("http://not-example.com/"))); + } +} \ No newline at end of file From eb4f3b9eff073d20dd65a07e7a2ccb35af6f3844 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 19 Dec 2018 22:58:42 +0300 Subject: [PATCH 019/508] Add mc-unit dependency to minecraft-commons --- commons/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/commons/pom.xml b/commons/pom.xml index 0f8e0ef18..7df957025 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -10,6 +10,10 @@ minecraft-commons + + ${project.parent.groupId} + mc-unit + org.spigotmc spigot-api From 605979935f9266dc3cade5235250cba0d8f2dc75 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 21 Dec 2018 17:16:54 +0300 Subject: [PATCH 020/508] Rename Callback to UncheckedRunnable --- .../util/function/{Callback.java => UncheckedRunnable.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/{Callback.java => UncheckedRunnable.java} (80%) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/Callback.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java similarity index 80% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/Callback.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java index 617c0c0f4..1c502bd29 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/Callback.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java @@ -3,7 +3,7 @@ import lombok.SneakyThrows; @FunctionalInterface -public interface Callback extends Runnable { +public interface UncheckedRunnable extends Runnable { void call() throws Throwable; From 62c7d74f96d07d30e8bbf6f169ce5dc78faa0f1f Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 21 Dec 2018 17:17:37 +0300 Subject: [PATCH 021/508] Add UncheckedConsumer --- .../util/function/UncheckedConsumer.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java new file mode 100644 index 000000000..fd6f4d33b --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java @@ -0,0 +1,27 @@ +package ru.progrm_jarvis.minecraft.commons.util.function; + +import lombok.SneakyThrows; + +import java.util.function.Consumer; + +/** + * Consumer which allows having checked exceptions in its method body. + * + * @param {@inheritDoc} + */ +@FunctionalInterface +public interface UncheckedConsumer extends Consumer { + + /** + * Performs this operation on the given argument allowing any checked exceptions in method body. + * + * @param t the input argument + */ + void consume(T t) throws Throwable; + + @Override + @SneakyThrows + default void accept(final T t) { + consume(t); + } +} From b23ec07fa9e67e915fb5db59870da792dd28bad3 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 21 Dec 2018 17:48:12 +0300 Subject: [PATCH 022/508] Fix BukkitPluginShutdownUtil to use UncheckedRunnable --- .../commons/plugin/BukkitPluginShutdownUtil.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java index 933433b51..2e884ae55 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -10,7 +10,7 @@ import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.plugin.Plugin; import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; -import ru.progrm_jarvis.minecraft.commons.util.function.Callback; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedRunnable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -28,34 +28,34 @@ private Optional getOptionalShutdownHandler(final Plugin return Optional.ofNullable(PLUGIN_SHUTDOWN_HANDLERS.get(plugin)); } - public void addShutdownHook(final Plugin plugin, final Callback callback) { + public void addShutdownHook(final Plugin plugin, final UncheckedRunnable callback) { getOrCreateShutdownHandler(plugin).callbacks.add(callback); } - public void addShutdownHooks(final Plugin plugin, final Callback... callbacks) { + public void addShutdownHooks(final Plugin plugin, final UncheckedRunnable... callbacks) { getOrCreateShutdownHandler(plugin).callbacks.addAll(Arrays.asList(callbacks)); } - public void addShutdownHooks(final Plugin plugin, final Collection callbacks) { + public void addShutdownHooks(final Plugin plugin, final Collection callbacks) { getOrCreateShutdownHandler(plugin).callbacks.addAll(callbacks); } - public void removeShutdownHook(final Plugin plugin, final Callback callback) { + public void removeShutdownHook(final Plugin plugin, final UncheckedRunnable callback) { getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.remove(callback)); } - public void removeShutdownHooks(final Plugin plugin, final Callback... callbacks) { + public void removeShutdownHooks(final Plugin plugin, final UncheckedRunnable... callbacks) { getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.removeAll(Arrays.asList(callbacks))); } - public void removeShutdownHooks(final Plugin plugin, final Collection callback) { + public void removeShutdownHooks(final Plugin plugin, final Collection callback) { getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.removeAll(callback)); } @Value private class PluginShutdownHandler implements Listener { - private Collection callbacks = ConcurrentCollections.concurrentList(new ArrayList<>()); + private Collection callbacks = ConcurrentCollections.concurrentList(new ArrayList<>()); private PluginShutdownHandler(@NonNull final Plugin plugin) { Bukkit.getPluginManager().registerEvents(this, plugin); From 243128a5e49d819b6f3818c31a253544eafbe864 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 21 Dec 2018 17:48:35 +0300 Subject: [PATCH 023/508] Add AsyncRunner`s --- .../minecraft/commons/async/AsyncRunner.java | 30 +++++++++++++ .../minecraft/commons/async/AsyncRunners.java | 43 +++++++++++++++++++ .../async/BukkitSchedulerAsyncRunner.java | 27 ++++++++++++ .../async/BungeeSchedulerAsyncRunner.java | 27 ++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java new file mode 100644 index 000000000..43ff4f2f4 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java @@ -0,0 +1,30 @@ +package ru.progrm_jarvis.minecraft.commons.async; + +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedRunnable; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedSupplier; + +/** + * An object capable of performing asynchronous operations. + */ +@FunctionalInterface +public interface AsyncRunner { + + /** + * Performs the specified operations asynchronously. + * + * @param operation operation to perform asynchronously + */ + void runAsynchronously(final UncheckedRunnable operation); + + /** + * Performs the specified operations asynchronously. + * + * @param operation operation to perform asynchronously + * @param callback callback to handle the resulting value of the operation + * @param type of value returned by the operation + */ + default void runAsynchronously(final UncheckedSupplier operation, final UncheckedConsumer callback) { + runAsynchronously(() -> callback.accept(operation.get())); + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java new file mode 100644 index 000000000..b33ce5103 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java @@ -0,0 +1,43 @@ +package ru.progrm_jarvis.minecraft.commons.async; + +import lombok.experimental.UtilityClass; +import ru.progrm_jarvis.minecraft.commons.MinecraftEnvironment; + +import javax.annotation.Nullable; + +/** + * Utilities for easier use of {@link AsyncRunner}s. + */ +@UtilityClass +public class AsyncRunners { + + /** + * Gets an {@link AsyncRunner} aware of current {@link MinecraftEnvironment}. + * + * @param bukkitPlugin Bukkit plugin if there is one to be used for Bukkit async caller + * @param bungeePlugin BungeeCord plugin if there is one to be used for BungeeCord async caller + * @return an async caller capable of performing its operations in current environment + * @throws IllegalStateException if there is no async caller available for current context + * + * @implNote This will give a caller of Bukkit or Bungee depending on availability of their classes + */ + public AsyncRunner getMinecraftEnvironmentAware(@Nullable final Object bukkitPlugin, + @Nullable final Object bungeePlugin) { + // try use Bukkit's + if (MinecraftEnvironment.BUKKIT_API.isAvailable()) attempt: { + if (bukkitPlugin == null) break attempt; + + return new BukkitSchedulerAsyncRunner((org.bukkit.plugin.Plugin) bukkitPlugin); + } + + // try use BungeeCord's + if (MinecraftEnvironment.BUNGEE_API.isAvailable()) attempt: { + if (bungeePlugin == null) break attempt; + + return new BungeeSchedulerAsyncRunner((net.md_5.bungee.api.plugin.Plugin) bungeePlugin); + } + + throw new IllegalStateException("No AsyncRunner found for current Minecraft environment " + + "and specified plugins:" + bukkitPlugin + " [Bukkit], " + bungeePlugin + " [BungeeCord]"); + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java new file mode 100644 index 000000000..1a619d0cb --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java @@ -0,0 +1,27 @@ +package ru.progrm_jarvis.minecraft.commons.async; + +import lombok.*; +import lombok.experimental.FieldDefaults; +import org.bukkit.Bukkit; +import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedRunnable; + +/** + * Async runner based on {@link org.bukkit.scheduler.BukkitScheduler}. + */ +@ToString +@EqualsAndHashCode +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +public class BukkitSchedulerAsyncRunner implements AsyncRunner { + + /** + * Plugin to be used for scheduling asynchronous operations. + */ + @NonNull Plugin plugin; + + @Override + public void runAsynchronously(final UncheckedRunnable operation) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, operation); + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java new file mode 100644 index 000000000..42c0baf6b --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java @@ -0,0 +1,27 @@ +package ru.progrm_jarvis.minecraft.commons.async; + +import lombok.*; +import lombok.experimental.FieldDefaults; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.plugin.Plugin; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedRunnable; + +/** + * Async runner based on {@link net.md_5.bungee.api.scheduler.TaskScheduler}. + */ +@ToString +@EqualsAndHashCode +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) +public class BungeeSchedulerAsyncRunner implements AsyncRunner { + + /** + * Plugin to be used for scheduling asynchronous operations. + */ + @NonNull Plugin plugin; + + @Override + public void runAsynchronously(final UncheckedRunnable operation) { + ProxyServer.getInstance().getScheduler().runAsync(plugin, operation); + } +} From 4e8322eced30b0cbbaed79c85023327d72460e2c Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 21 Dec 2018 19:04:26 +0300 Subject: [PATCH 024/508] Add authlib dependency --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index fda9ac904..a2cd77c22 100644 --- a/pom.xml +++ b/pom.xml @@ -254,6 +254,12 @@ 4.4.0 provided + + com.mojang + authlib + 1.5.21 + provided + com.comphenix.packetwrapper PacketWrapper From cb4ba59a1fe57f91450faea1377d53e6e4ba971f Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 21 Dec 2018 19:05:09 +0300 Subject: [PATCH 025/508] Add authlib dependency to minecraft-commons --- commons/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/commons/pom.xml b/commons/pom.xml index 7df957025..6590f9ff9 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -30,6 +30,10 @@ com.comphenix.protocol ProtocolLib-API + + com.mojang + authlib + org.projectlombok From 8a00d9201867dbbe7500c0cba7fa7755fceb7699 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 21 Dec 2018 19:22:11 +0300 Subject: [PATCH 026/508] Add MojangUtil#isSigned(GameProfile) --- .../minecraft/commons/mojang/MojangUtil.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java index 5cb6a05b2..e6d65c6d9 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java @@ -1,5 +1,6 @@ package ru.progrm_jarvis.minecraft.commons.mojang; +import com.mojang.authlib.GameProfile; import lombok.NonNull; import lombok.experimental.UtilityClass; import lombok.val; @@ -42,4 +43,16 @@ public String toMojangUuid(@NonNull final UUID uuid) { + stringUuid.substring(19, 23) + stringUuid.substring(24, 36); } + + /** + * Checks whether the specified profile has all properties signed. + * + * @param profile profile to check + * @return {@code true} if the specified profile has all its properties signed + * or {@code false} if any of those is unsigned + */ + public boolean isSigned(@NonNull final GameProfile profile) { + for (val entry : profile.getProperties().entries()) if (!entry.getValue().hasSignature()) return false; + return true; + } } From abfa6048081fd9bf52bc85505368e5615b387251 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 21 Dec 2018 22:56:23 +0300 Subject: [PATCH 027/508] Add minecraft-repo repository --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index a2cd77c22..702717adf 100644 --- a/pom.xml +++ b/pom.xml @@ -81,6 +81,10 @@ sonatype-snapshot-repo https://oss.sonatype.org/content/repositories/snapshots + + minecraft-repo + https://libraries.minecraft.net/ + spigotmc-repo From 7cc85a12405a944d069eef5500a923905fce0624 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 21 Dec 2018 22:57:00 +0300 Subject: [PATCH 028/508] Comments: add comment to mojang-repo declaration --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 702717adf..faa07a617 100644 --- a/pom.xml +++ b/pom.xml @@ -81,6 +81,7 @@ sonatype-snapshot-repo https://oss.sonatype.org/content/repositories/snapshots + minecraft-repo https://libraries.minecraft.net/ From bb214dd4eb99e9659df5bda4d742c6cc1b54aed8 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 20:38:21 +0300 Subject: [PATCH 029/508] Add @AsyncExpected marker --- .../commons/annotation/AsyncExpected.java | 20 +++++++++++++++++++ pom.xml | 1 - 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java new file mode 100644 index 000000000..bfb8b0a16 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java @@ -0,0 +1,20 @@ +package ru.progrm_jarvis.minecraft.commons.annotation; + +import java.lang.annotation.*; + +/** + * A marker indicating that the method annotated should be used asynchronously. + * This commonly means that this method may perform time-consuming operations. + */ +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.SOURCE) +public @interface AsyncExpected { + + /** + * Indicates which method to use instead as an alternative allowing synchronous calls. + * + * @return synchronous alternative + */ + String value() default ""; +} diff --git a/pom.xml b/pom.xml index faa07a617..3a0eaff1c 100644 --- a/pom.xml +++ b/pom.xml @@ -263,7 +263,6 @@ com.mojang authlib 1.5.21 - provided com.comphenix.packetwrapper From 7a8e324fd3d617c3101942d25d1d7dbbd2f0827a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 21:05:45 +0300 Subject: [PATCH 030/508] Add MojangApiManager --- .../commons/mojang/MojangApiManager.java | 230 ++++++++++++++++++ .../commons/mojang/MojangApiManagerTest.java | 84 +++++++ 2 files changed, 314 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java create mode 100644 commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManagerTest.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java new file mode 100644 index 000000000..a192f5762 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java @@ -0,0 +1,230 @@ +package ru.progrm_jarvis.minecraft.commons.mojang; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import lombok.*; +import lombok.Builder.Default; +import lombok.experimental.FieldDefaults; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.conn.HttpClientConnectionManager; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import ru.progrm_jarvis.minecraft.commons.annotation.AsyncExpected; +import ru.progrm_jarvis.minecraft.commons.async.AsyncRunner; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedSupplier; +import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazies; +import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazy; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@ToString +@EqualsAndHashCode +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class MojangApiManager implements AutoCloseable { + + /////////////////////////////////////////////////////////////////////////// + // URIs + /////////////////////////////////////////////////////////////////////////// + + public static final String USERNAME_TO_UUID_AT_TIME_URI_PREFIX + = "https://api.mojang.com/users/profiles/minecraft/"; + + public static final String UUID_TO_PROFILE_URI_PREFIX + = "https://sessionserver.mojang.com/session/minecraft/profile/"; + + protected static final JsonParser jsonParser = new JsonParser(); + + Lazy httpConnectionManager; + Lazy httpClient; + + Lazy asyncRunner; + + Lazy> uuidsCache; + Lazy> profilesCache; + + public MojangApiManager(final Configuration configuration) { + httpConnectionManager = Lazies.concurrentLazy(configuration.httpConnectionManager); + { + val httpClientFunction = configuration.httpClient; + this.httpClient = Lazies.concurrentLazy(() -> httpClientFunction.apply(httpConnectionManager.get())); + } + + asyncRunner = Lazies.concurrentLazy(configuration.asyncRunner); + + uuidsCache = Lazies.concurrentLazy(configuration.uuidsCache); + profilesCache = Lazies.concurrentLazy(configuration.profilesCache); + } + + @Override + public void close() { + httpConnectionManager.getIfInitialized().ifPresent(HttpClientConnectionManager::shutdown); + } + + /////////////////////////////////////////////////////////////////////////// + // Inner utilities + /////////////////////////////////////////////////////////////////////////// + + @AsyncExpected + protected static JsonElement readJson(@NonNull final InputStream inputStream) { + return jsonParser.parse(new BufferedReader(new InputStreamReader(inputStream))); + } + + @AsyncExpected + protected JsonElement httpGetJson(@NonNull final String uri) throws IOException { + return readJson(httpClient.get().execute(new HttpGet(uri)).getEntity().getContent()); + } + + @AsyncExpected + protected JsonElement httpGetJson(@NonNull final String uri, @Nullable final Map parameters) + throws IOException { + if (parameters == null || parameters.isEmpty()) return httpGetJson(uri); + + val uriBuilder = new StringBuilder(uri) + .append('?'); + + val params = parameters.entrySet(); + val size = parameters.size(); + var i = 1; + for (val param : params) { + // append parameter + uriBuilder + .append(param.getKey()) + .append('=') + .append(param.getValue()); + // if not last param then append '&' + if (i != size) { + uriBuilder.append('&'); + i++; // micro-optimization: increment only if needed + } + } + + return httpGetJson(uriBuilder.toString()); + } + + /////////////////////////////////////////////////////////////////////////// + // Username --> UUID + /////////////////////////////////////////////////////////////////////////// + + @AsyncExpected + @Nonnull public UUID readUuid(@NonNull final String userName) throws IOException { + return MojangUtil.fromMojangUuid(httpGetJson(USERNAME_TO_UUID_AT_TIME_URI_PREFIX + userName).getAsJsonObject() + .get("id").getAsString() + ); + } + + public void readUuid(@NonNull final String userName, + @NonNull final UncheckedConsumer callback) { + asyncRunner.get().runAsynchronously(() -> readUuid(userName), callback); + } + + @SneakyThrows + @AsyncExpected + @Nonnull public UUID getUuid(@NonNull final String userName) { + return uuidsCache.get() + .get(userName.toLowerCase(), () -> readUuid(userName)); + } + + public void getUuid(@NonNull final String userName, @NonNull final UncheckedConsumer callback) { + asyncRunner.get().runAsynchronously(() -> getUuid(userName), callback); + } + + /////////////////////////////////////////////////////////////////////////// + // UUID --> GameProfile + /////////////////////////////////////////////////////////////////////////// + + @AsyncExpected + @Nonnull public GameProfile readProfile(@NonNull final UUID uuid, final boolean signed) throws IOException { + val data = httpGetJson(UUID_TO_PROFILE_URI_PREFIX + MojangUtil.toMojangUuid(uuid) + "?unsigned=" + !signed) + .getAsJsonObject(); + + val profile = new GameProfile(uuid, data.get("name").getAsString()); + + val profileProperties = profile.getProperties(); + + val properties = data.getAsJsonArray("properties"); + for (val property : properties) { + val jsonProperty = property.getAsJsonObject(); + val propertyName = jsonProperty.get("name").getAsString(); + + profileProperties.put(propertyName, new Property( + propertyName, + jsonProperty.get("value").getAsString(), + signed ? jsonProperty.get("signature").getAsString() : null + )); + } + + return profile; + } + + public void readProfile(@NonNull final UUID uuid, final boolean signed, + @NonNull final UncheckedConsumer callback) { + asyncRunner.get().runAsynchronously(() -> readProfile(uuid, signed), callback); + } + + @SneakyThrows + @AsyncExpected + @Nonnull public GameProfile getProfile(@NonNull final UUID uuid, final boolean signed) { + val cache = profilesCache.get(); + var cachedProfile = cache.getIfPresent(uuid); + // get profile using Mojang API if there is no cached one or it is unsigned but has to be + if (cachedProfile == null || (signed && !MojangUtil.isSigned(cachedProfile))) cache + .put(uuid, cachedProfile = readProfile(uuid, signed)); + + return cachedProfile; + } + + public void getProfile(@NonNull final UUID uuid, final boolean signed, + @NonNull final UncheckedConsumer callback) { + asyncRunner.get().runAsynchronously(() -> getProfile(uuid, signed), callback); + } + + /////////////////////////////////////////////////////////////////////////// + // Configuration class + /////////////////////////////////////////////////////////////////////////// + + @Builder + @FieldDefaults(level = AccessLevel.PROTECTED) + public static class Configuration { + + @Default UncheckedSupplier httpConnectionManager + = PoolingHttpClientConnectionManager::new; + + @Default UncheckedFunction httpClient = manager -> HttpClients + .custom() + .setConnectionManager(manager) + .build(); + + @Default UncheckedSupplier> uuidsCache + = () -> CacheBuilder.newBuilder() + .expireAfterWrite(5, TimeUnit.MINUTES) + .build(); + + @Default UncheckedSupplier> profilesCache + = () -> CacheBuilder.newBuilder() + .expireAfterWrite(5, TimeUnit.SECONDS) + .build(); + + @Default UncheckedSupplier asyncRunner = () -> { + throw new IllegalStateException("Async tasks are not available in this MojangApiManager"); + }; + + public static Configuration getDefault() { + return builder().build(); + } + } +} diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManagerTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManagerTest.java new file mode 100644 index 000000000..7e0530e01 --- /dev/null +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManagerTest.java @@ -0,0 +1,84 @@ +package ru.progrm_jarvis.minecraft.commons.mojang; + +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; +import lombok.val; +import org.apache.http.client.methods.HttpGet; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import ru.progrm_jarvis.mcunit.io.http.HttpClientMocks; + +import java.util.Base64; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static ru.progrm_jarvis.minecraft.commons.mojang.MojangApiManager.USERNAME_TO_UUID_AT_TIME_URI_PREFIX; +import static ru.progrm_jarvis.minecraft.commons.mojang.MojangApiManager.UUID_TO_PROFILE_URI_PREFIX; + +class MojangApiManagerTest { + + private static final UUID + UUID_1 = UUID.fromString("29be10b1-b2d1-4130-b8f2-4fd14d3ccb62"); + private static final String + MOJANG_UUID_1 = "29be10b1b2d14130b8f24fd14d3ccb62", + USERNAME_1 = "PROgrm_JARvis", + TEXTURES_PROPERTY_NAME = "textures", + PROFILE_PROPERTY_1_VALUE_1 = "eyJ0aW1lc3RhbXAiOjE1NDU0MDcyMDUwNjksInByb2ZpbGVJZCI6IjI5YmUxMGIxYjJkMTQxMzBiO" + + "GYyNGZkMTRkM2NjYjYyIiwicHJvZmlsZU5hbWUiOiJQUk9ncm1fSkFSdmlzIiwic2lnbmF0dXJlUmVxdWlyZWQiOnRydWUsI" + + "nRleHR1cmVzIjp7IlNLSU4iOnsidXJsIjoiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9lYTU0MTdhM" + + "zBlZDU3OTQ3YjFlZDliMmUzMWNkZWJlZDJhYzE5YzlhODkyZGU2NDY4NjNhMTA4YTNkOTE0MzE5In19fQ==", + PROFILE_PROPERTY_1_SIGNATURE_1 = "P3QNNsvMIx9lNpz9Is1gc9eeUlz7zj0KWLBIgwhswschofE3X1NjQVoykKy1SAA8Ru6SmXmPs" + + "W1VtWdLzjCdtsCR0h/1mLTpruu5VFuBB6hwILHCeKabLIdSRzKKLXUHNNSd6kLe+Qis/QSOlGESQT8NYuxxSp2NlT0/YD6ot" + + "8pd/KxXyVRJrU/VPYfYJnxv9KeN4PFb67F82dZ33dlZsIvRN2LlFPluQeQ4xrdSojVyUVTefTQ5HGQBibIFv0dcbKScPHqYA" + + "4qKT61oMmsJEvzZ94HQKANTgEAO8D1KEwt+2Q3mzvr/lCqQq3MzmWQRympCbP3XVYe06hx2kk4awNkZ9OT+o9mOGOR7T7Rsz" + + "E4I0ghIg2wgo30cGK+YSjRGpvoX3BJafATzyuGssN22y1hmUMqTzK+0jkQpTYxK+9pxslQ/LIPp9zTKJyd5HwE25pyFFPOj+" + + "fzYWQmb0Vf92SVDWeE2c6oE0NFyDmyRLu40m1FRWn0AW+6v0G/38Zbc6QESgT6YOrUvUjTgqqbC95rSLjRCPMj6bE6QXPDqH" + + "yJQnGrDsws+QO9BafajpQatd8njHFASYIgs675NJy9dnEBjw1FLzpED5hIS0dLRUeEzAhWL9j+89tTPflysTrJxu5HR41Ydd" + + "dd7CQRmVHOFO59HjSpHXo/Xp47uJPKcIyA="; + private static final GameProfile PROFILE_1 = new GameProfile(UUID_1, USERNAME_1); + + static { + PROFILE_1.getProperties().put( + TEXTURES_PROPERTY_NAME, + new Property(TEXTURES_PROPERTY_NAME, PROFILE_PROPERTY_1_VALUE_1, PROFILE_PROPERTY_1_SIGNATURE_1) + ); + } + + @BeforeAll + static void validateBase64s() { + val decoder = Base64.getDecoder(); + + assertNotNull(decoder.decode(PROFILE_PROPERTY_1_VALUE_1)); + assertNotNull(decoder.decode(PROFILE_PROPERTY_1_SIGNATURE_1)); + } + + @Test + void testGetUuid() { + try (val mojangApiManager = new MojangApiManager(MojangApiManager.Configuration.builder() + .httpClient(manager -> HttpClientMocks.mockHttpClient() + .responding( + new HttpGet(USERNAME_TO_UUID_AT_TIME_URI_PREFIX + USERNAME_1), + "{\"id\":\"" + MOJANG_UUID_1 +"\",\"name\":\"" + USERNAME_1 + "\"}" + )) + .build())) { + assertEquals(UUID_1, mojangApiManager.getUuid(USERNAME_1)); + } + } + + @Test + void testGetProfile() { + try (val mojangApiManager = new MojangApiManager(MojangApiManager.Configuration.builder() + .httpClient(manager -> HttpClientMocks.mockHttpClient() + .responding( + new HttpGet(UUID_TO_PROFILE_URI_PREFIX + MOJANG_UUID_1 + "?unsigned=false"), + "{\"id\":\"" + MOJANG_UUID_1 + "\",\"name\":\"" + USERNAME_1 + "\",\"properties\":" + + "[{\"name\":\"textures\",\"value\":\"" + PROFILE_PROPERTY_1_VALUE_1 + "\"," + + "\"signature\":\"" + PROFILE_PROPERTY_1_VALUE_1 + "\"}]}" + )) + .build())) { + + assertEquals(PROFILE_1, mojangApiManager.getProfile(UUID_1, true)); + } + } +} \ No newline at end of file From 2ff5f3455fe1067e9ffd01ab6627dbe2622e3f04 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 21:33:04 +0300 Subject: [PATCH 031/508] Add MapUtil --- .../minecraft/commons/util/MapUtil.java | 43 +++++++++++++++++++ .../minecraft/commons/util/MapUtilTest.java | 28 ++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java create mode 100644 commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java new file mode 100644 index 000000000..2697ceeb3 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -0,0 +1,43 @@ +package ru.progrm_jarvis.minecraft.commons.util; + +import com.google.common.base.Preconditions; +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import lombok.val; +import lombok.var; + +import java.util.Map; + +/** + * Utilities related to {@link Map>}. + */ +@UtilityClass +public class MapUtil { + + /** + * Fills the map specified with the values specified. + * + * @param map map to fill with the values + * @param keyValuePairs pairs of keys and values in order key1, value1, key2, value2, key3, value3... + * @param type of keys + * @param type of values + * @param map type + * @return the map passed filled with key-value pairs specified + * @throws IllegalArgumentException if {@code keyValuePairs}'s length is odd + */ + @SuppressWarnings("unchecked") + public > M fillMap(@NonNull final M map, @NonNull final Object... keyValuePairs) { + val length = keyValuePairs.length; + Preconditions.checkArgument(length % 2 == 0, "Key-Value pairs array should have an even number of elements"); + + { // filling of the map + var value = true; // will get reverted for the first value + + K key = null; // requires to be initialized for some reason :) + for (final Object keyValuePair : keyValuePairs) if (value = !value) map.put(key, (V) keyValuePair); + else key = (K) keyValuePair; + } + + return map; + } +} diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java new file mode 100644 index 000000000..2ceb92eb1 --- /dev/null +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java @@ -0,0 +1,28 @@ +package ru.progrm_jarvis.minecraft.commons.util; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.*; + +class MapUtilTest { + + @Test + void testFillMap() { + assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); + + assertEquals(new HashMap() {{ + put(1, "Hello"); + put(2, "world"); + }}, MapUtil.fillMap(new HashMap<>(), 1, "Hello", 2, "world")); + + assertNotEquals(new HashMap() {{ + put(1, "Hello"); + }}, MapUtil.fillMap(new HashMap<>(), 1, "Hello", 2, "world")); + + assertThrows(IllegalArgumentException.class, () -> MapUtil.fillMap(new HashMap<>(), 1)); + + assertThrows(IllegalArgumentException.class, () -> MapUtil.fillMap(new HashMap<>(), 1, 3, "String")); + } +} \ No newline at end of file From f22371da58479ed762dbf14e5d08be85fcc1eb53 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 21:55:13 +0300 Subject: [PATCH 032/508] Add hamcrest-all dependency --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 3a0eaff1c..4f152162c 100644 --- a/pom.xml +++ b/pom.xml @@ -340,6 +340,12 @@ junit-platform-surefire-provider 1.2.0 + + org.hamcrest + hamcrest-all + 1.3 + test + org.mockito mockito-core From ba25d670a1e195f67072dcdeb0896d5755893751 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 21:55:57 +0300 Subject: [PATCH 033/508] Style: remove unneeded blank line --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4f152162c..ecd788ae6 100644 --- a/pom.xml +++ b/pom.xml @@ -334,7 +334,6 @@ ${version.junit.platform} test - org.junit.platform junit-platform-surefire-provider From d26b83503bbf65164c52eae600e66a4d160b88ef Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 21:56:55 +0300 Subject: [PATCH 034/508] Use variable for mockito version --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ecd788ae6..5abe5d849 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,7 @@ 5.3.2 1.3.2 + 2.23.0 @@ -348,13 +349,13 @@ org.mockito mockito-core - 2.23.0 + ${version.mockito} test org.mockito mockito-junit-jupiter - 2.23.0 + ${version.mockito} test From e98f1f53a5b6ee86877ac169322fc071dc857c4c Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 22:31:14 +0300 Subject: [PATCH 035/508] Add hamcrest-all dependency to minecraft-commons --- commons/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/commons/pom.xml b/commons/pom.xml index 6590f9ff9..149f14013 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -48,6 +48,10 @@ org.junit.jupiter junit-jupiter-api + + org.hamcrest + hamcrest-all + org.mockito mockito-core From 6a043f8e26eb6bbc61abb4691267867b66983bbb Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 22:32:10 +0300 Subject: [PATCH 036/508] Add first-value based variant of #fillMap() to MapUtil --- .../minecraft/commons/util/MapUtil.java | 47 +++++++++++++++---- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java index 2697ceeb3..da406c6a0 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -19,25 +19,54 @@ public class MapUtil { * * @param map map to fill with the values * @param keyValuePairs pairs of keys and values in order key1, value1, key2, value2, key3, value3... + * @param map type + * @return the map passed filled with key-value pairs specified + * @throws IllegalArgumentException if {@code keyValuePairs}'s length is odd + * + * @see #fillMap(Map, Object, Object, Object...) + */ + public > M fillMap(@NonNull final M map, @NonNull final Object... keyValuePairs) { + val length = keyValuePairs.length; + if (length == 0) return map; + Preconditions.checkArgument(length % 2 == 0, "Key-Value pairs array should have an even number of elements"); + + fillMapNoChecks(map, keyValuePairs); + + return map; + } + + /** + * Fills the map specified with the values specified. + * + * @param map map to fill with the values + * @param keyValuePairs pairs of keys and values in order key1, value1, key2, value2, key3, value3... + * @param firstValueKey the key of first value + * @param firstValue first value to be put to the map * @param type of keys * @param type of values * @param map type * @return the map passed filled with key-value pairs specified * @throws IllegalArgumentException if {@code keyValuePairs}'s length is odd + * + * @see #fillMap(Map, Object...) */ - @SuppressWarnings("unchecked") - public > M fillMap(@NonNull final M map, @NonNull final Object... keyValuePairs) { + public > M fillMap(@NonNull final M map, final K firstValueKey, final V firstValue, + @NonNull final Object... keyValuePairs) { val length = keyValuePairs.length; Preconditions.checkArgument(length % 2 == 0, "Key-Value pairs array should have an even number of elements"); - { // filling of the map - var value = true; // will get reverted for the first value - - K key = null; // requires to be initialized for some reason :) - for (final Object keyValuePair : keyValuePairs) if (value = !value) map.put(key, (V) keyValuePair); - else key = (K) keyValuePair; - } + map.put(firstValueKey, firstValue); + fillMapNoChecks(map, keyValuePairs); return map; } + + @SuppressWarnings("unchecked") + private void fillMapNoChecks(final Map map, final Object... keyValuePairs) { + var value = true; // will get reverted for the first value + + Object key = null; // requires to be initialized for some reason :) + for (final Object keyValuePair : keyValuePairs) if (value = !value) map.put(key, keyValuePair); + else key = keyValuePair; + } } From eaa2e0306c24c65206572ce0f0f3856223f17390 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 22:32:31 +0300 Subject: [PATCH 037/508] Add RandomUtil --- .../minecraft/commons/util/RandomUtil.java | 33 +++++++++++++++++ .../commons/util/RandomUtilTest.java | 35 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java create mode 100644 commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java new file mode 100644 index 000000000..9fe8ce3be --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java @@ -0,0 +1,33 @@ +package ru.progrm_jarvis.minecraft.commons.util; + +import com.google.common.base.Preconditions; +import lombok.experimental.UtilityClass; +import lombok.val; + +import java.util.Map; +import java.util.concurrent.ThreadLocalRandom; + +@UtilityClass +public class RandomUtil { + + public T peekRandom(final Map chancedValues) { + { + val size = chancedValues.size(); + + Preconditions.checkArgument(size > 0, "There should be at least one chanced value"); + if (size == 1) return chancedValues.keySet().iterator().next(); + } + + long chancesSum = 0; // sum of all chances + for (val chance : chancedValues.values()) { + Preconditions.checkArgument(chance > 0, "Chances should all be positive"); + chancesSum += chance; + } + // the chance should be up to chancesSum (exclusive) + val chance = ThreadLocalRandom.current().nextLong(chancesSum); + for (val entry : chancedValues.entrySet()) if ((chancesSum -= entry.getValue()) <= chance) return + entry.getKey(); + + throw new IllegalStateException("Could not peek any chanced value"); + } +} diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java new file mode 100644 index 000000000..d5abbd44f --- /dev/null +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java @@ -0,0 +1,35 @@ +package ru.progrm_jarvis.minecraft.commons.util; + +import lombok.var; +import org.apache.commons.lang.math.RandomUtils; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.internal.matchers.IsCollectionContaining.hasItem; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class RandomUtilTest { + + @Test + void testPeekRandom() { + var values = MapUtil.fillMap(new HashMap<>(), "One", 1, "Two", 2); + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( + values.keySet(), hasItem(RandomUtil.peekRandom(values)) + ); + + values = MapUtil.fillMap(new HashMap<>(), "One", 1, "Two", 2, "Three", 3, "Four", 4, "Five", 5); + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( + values.keySet(), hasItem(RandomUtil.peekRandom(values)) + ); + + values = MapUtil.fillMap(new HashMap<>(), "Hi", 1); + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( + "Hi", equalTo(RandomUtil.peekRandom(values)) + ); + + assertThrows(IllegalArgumentException.class, () -> RandomUtil.peekRandom(new HashMap<>())); + } +} \ No newline at end of file From 205f03382560440615e16cc6d2e7b882d7a1938b Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 23:08:01 +0300 Subject: [PATCH 038/508] Add MapUtil.MapFiller --- .../minecraft/commons/util/MapUtil.java | 111 +++++++++++++++++- 1 file changed, 108 insertions(+), 3 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java index da406c6a0..b2e602bf4 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -1,12 +1,14 @@ package ru.progrm_jarvis.minecraft.commons.util; import com.google.common.base.Preconditions; -import lombok.NonNull; +import lombok.*; +import lombok.experimental.Accessors; import lombok.experimental.UtilityClass; -import lombok.val; -import lombok.var; +import org.apache.commons.lang3.tuple.Pair; +import java.util.Iterator; import java.util.Map; +import java.util.stream.Stream; /** * Utilities related to {@link Map>}. @@ -69,4 +71,107 @@ private void fillMapNoChecks(final Map map, final Object... keyValuePairs) { for (final Object keyValuePair : keyValuePairs) if (value = !value) map.put(key, keyValuePair); else key = keyValuePair; } + + /** + * Creates new {@link MapFiller} from the map specified. + * + * @param map map for which to create the filler + * @param type of keys + * @param type of values + * @return map filler created for the specified map + * + * @see MapFiller + * @see #mapFiller(Map, Object, Object) + */ + public MapFiller mapFiller(@NonNull final Map map) { + return new MapFiller<>(map); + } + + /** + * Creates new {@link MapFiller} from the map specified initialized with the value specified. + * + * @param map map for which to create the filler + * @param firstValueKey the key of first value + * @param firstValue first value to be put to the map + * @param type of keys + * @param type of values + * @return map filler created for the specified map with initial value put + * + * @see MapFiller + * @see #mapFiller(Map) + */ + public MapFiller mapFiller(@NonNull final Map map, K firstValueKey, final V firstValue) { + return new MapFiller<>(map) + .put(firstValueKey, firstValue); + } + + /** + * An utility-object to fill the map following the chain pattern which may useful when initializing class fields. + * + * @param type of map's key + * @param type of map's value + */ + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @Accessors(fluent = true) + public static final class MapFiller { + + /** + * Map being filled + */ + @NonNull @Getter private final Map map; + + /** + * Puts the specified value by the specified key to the map. + * + * @param key key of the value to put + * @param value value to put by the key + * @return this map filler for chaining + */ + public MapFiller put(final K key, final V value) { + map.put(key, value); + + return this; + } + + /** + * Fills the map based on the specified {@link Iterator}. + * + * @param entries iterator of the entries whose elements will be put to the map + * @return this map filler for chaining + */ + public MapFiller fill(final Iterator> entries) { + while (entries.hasNext()) { + val entry = entries.next(); + map.put(entry.getKey(), entry.getValue()); + } + + return this; + } + + /** + * Fills the map with the values of specified {@link Iterable}. + * + * @param entries entries which will be put to the map + * @return this map filler for chaining + */ + public MapFiller fill(final Iterable> entries) { + for (val entry : entries) map.put(entry.getKey(), entry.getValue()); + + return this; + } + + /** + * Fills the map based on the specified {@link Stream}. + * + * @param entries stream of the entries whose elements will be put to the map + * @return this map filler for chaining + */ + public MapFiller fill(final Stream> entries) { + entries.forEach(entry -> map.put(entry.getKey(), entry.getValue())); + + return this; + } + } } From 66237945c88ecff5ab6b459193e04ea67c01359a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 23:18:14 +0300 Subject: [PATCH 039/508] Add MapUtil#fillMap(...) for Iterable, Iterator and Stream --- .../minecraft/commons/util/MapUtil.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java index b2e602bf4..040bab9a8 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -72,6 +72,55 @@ private void fillMapNoChecks(final Map map, final Object... keyValuePairs) { else key = keyValuePair; } + /** + * Fills the map specified with the values specified. + * + * @param map map to fill with the values + * @param entries entries to fill the map with + * @param type of keys + * @param type of values + * @param map type + * @return the map passed filled with key-value pairs specified + */ + public > M fillMap(@NonNull final M map, final Iterator> entries) { + while (entries.hasNext()) { + val entry = entries.next(); + map.put(entry.getKey(), entry.getValue()); + } + + return map; + } + + /** + * Fills the map specified with the values specified. + * + * @param map map to fill with the values + * @param entries entries to fill the map with + * @param type of keys + * @param type of values + * @param map type + * @return the map passed filled with key-value pairs specified + */ + public > M fillMap(@NonNull final M map, final Iterable> entries) { + return fillMap(map, entries.iterator()); + } + + /** + * Fills the map specified with the values specified. + * + * @param map map to fill with the values + * @param entries entries to fill the map with + * @param type of keys + * @param type of values + * @param map type + * @return the map passed filled with key-value pairs specified + */ + public > M fillMap(@NonNull final M map, final Stream> entries) { + entries.forEach(entry -> map.put(entry.getKey(), entry.getValue())); + + return map; + } + /** * Creates new {@link MapFiller} from the map specified. * From 43a54e2db42cf0971f8ccc6d6ac4742e20c8283b Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 23:20:01 +0300 Subject: [PATCH 040/508] Typo: change order of Javadocs parameters in MapUtil --- .../java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java index 040bab9a8..485b45a4f 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -41,9 +41,9 @@ public class MapUtil { * Fills the map specified with the values specified. * * @param map map to fill with the values - * @param keyValuePairs pairs of keys and values in order key1, value1, key2, value2, key3, value3... * @param firstValueKey the key of first value * @param firstValue first value to be put to the map + * @param keyValuePairs pairs of keys and values in order key1, value1, key2, value2, key3, value3... * @param type of keys * @param type of values * @param map type From e9b3272a34a339ec74b97a4cb9654ed88eb5b61a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 23:21:13 +0300 Subject: [PATCH 041/508] Add ordered equivalents of Stream-based filling to MapUtil --- .../minecraft/commons/util/MapUtil.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java index 485b45a4f..fe09b6c37 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -121,6 +121,22 @@ public > M fillMap(@NonNull final M map, final Stream< return map; } + /** + * Fills the map specified with the values specified keeping order. + * + * @param map map to fill with the values + * @param entries entries to fill the map with + * @param type of keys + * @param type of values + * @param map type + * @return the map passed filled with key-value pairs specified + */ + public > M fillMapOrdered(@NonNull final M map, final Stream> entries) { + entries.forEachOrdered(entry -> map.put(entry.getKey(), entry.getValue())); + + return map; + } + /** * Creates new {@link MapFiller} from the map specified. * @@ -222,5 +238,17 @@ public MapFiller fill(final Stream> entries) { return this; } + + /** + * Fills the map based on the specified {@link Stream} keeping order. + * + * @param entries stream of the entries whose elements will be put to the map + * @return this map filler for chaining + */ + public MapFiller fillOrdered(final Stream> entries) { + entries.forEachOrdered(entry -> map.put(entry.getKey(), entry.getValue())); + + return this; + } } } From 20444d0d550e9573485559c3c16c29343a02a76e Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 23:23:21 +0300 Subject: [PATCH 042/508] Add docs to MapUtil#fillMapNoChecks(...) --- .../ru/progrm_jarvis/minecraft/commons/util/MapUtil.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java index fe09b6c37..81d84a540 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -63,6 +63,12 @@ public > M fillMap(@NonNull final M map, final K first return map; } + /** + * Fills the map not performing any checks. + * + * @param map map to fill + * @param keyValuePairs key-value pairs to put to the map ordered as key1, value1, key2, value2... + */ @SuppressWarnings("unchecked") private void fillMapNoChecks(final Map map, final Object... keyValuePairs) { var value = true; // will get reverted for the first value From b95fc85e4cac259d1b01afe4a7bec54769baf90f Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 22 Dec 2018 23:48:27 +0300 Subject: [PATCH 043/508] Style: change style of assertEquals() in MapUtilTest --- .../minecraft/commons/util/MapUtilTest.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java index 2ceb92eb1..356b0d955 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java @@ -9,17 +9,23 @@ class MapUtilTest { @Test - void testFillMap() { + void testFillMapFromArray() { assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); - assertEquals(new HashMap() {{ - put(1, "Hello"); - put(2, "world"); - }}, MapUtil.fillMap(new HashMap<>(), 1, "Hello", 2, "world")); - - assertNotEquals(new HashMap() {{ - put(1, "Hello"); - }}, MapUtil.fillMap(new HashMap<>(), 1, "Hello", 2, "world")); + assertEquals( + new HashMap() {{ + put(1, "Hello"); + put(2, "world"); + }}, + MapUtil.fillMap(new HashMap<>(), 1, "Hello", 2, "world") + ); + + assertNotEquals( + new HashMap() {{ + put(1, "Hello"); + }}, + MapUtil.fillMap(new HashMap<>(), 1, "Hello", 2, "world") + ); assertThrows(IllegalArgumentException.class, () -> MapUtil.fillMap(new HashMap<>(), 1)); From eeacd6fd86346dac25339bdfc5936d8bd7080052 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 23 Dec 2018 00:04:52 +0300 Subject: [PATCH 044/508] Test MapUtil#fillmap(...) for Iterator, Iterable and Stream --- .../minecraft/commons/util/MapUtilTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java index 356b0d955..94e4d9491 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java @@ -1,8 +1,11 @@ package ru.progrm_jarvis.minecraft.commons.util; +import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.Test; +import java.util.Arrays; import java.util.HashMap; +import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; @@ -31,4 +34,64 @@ void testFillMapFromArray() { assertThrows(IllegalArgumentException.class, () -> MapUtil.fillMap(new HashMap<>(), 1, 3, "String")); } + + @Test + void testFillMapFromIterator() { + assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); + + assertEquals( + new HashMap() {{ + put(1, "Hello"); + put(2, "world"); + }}, + MapUtil.fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world")).iterator()) + ); + + assertNotEquals( + new HashMap() {{ + put(1, "Hello"); + }}, + MapUtil.fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world")).iterator()) + ); + } + + @Test + void testFillMapFromIterable() { + assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); + + assertEquals( + new HashMap() {{ + put(1, "Hello"); + put(2, "world"); + }}, + MapUtil.fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world"))) + ); + + assertNotEquals( + new HashMap() {{ + put(1, "Hello"); + }}, + MapUtil.fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world"))) + ); + } + + @Test + void testFillMapFromStream() { + assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); + + assertEquals( + new HashMap() {{ + put(1, "Hello"); + put(2, "world"); + }}, + MapUtil.fillMap(new HashMap<>(), Stream.of(Pair.of(1, "Hello"), Pair.of(2, "world"))) + ); + + assertNotEquals( + new HashMap() {{ + put(1, "Hello"); + }}, + MapUtil.fillMap(new HashMap<>(), Stream.of(Pair.of(1, "Hello"), Pair.of(2, "world"))) + ); + } } \ No newline at end of file From 0071ddfc35047ca1cdc1315a6e38d9d6e8c12117 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 23 Dec 2018 02:46:02 +0300 Subject: [PATCH 045/508] Make hamcrest be above junit dependencies *magic* --- commons/pom.xml | 11 +++++++---- pom.xml | 14 ++++++++------ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/commons/pom.xml b/commons/pom.xml index 149f14013..b33952636 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -14,6 +14,13 @@ ${project.parent.groupId} mc-unit + + + + org.hamcrest + hamcrest-all + + org.spigotmc spigot-api @@ -48,10 +55,6 @@ org.junit.jupiter junit-jupiter-api - - org.hamcrest - hamcrest-all - org.mockito mockito-core diff --git a/pom.xml b/pom.xml index 5abe5d849..c50ed7ad7 100644 --- a/pom.xml +++ b/pom.xml @@ -241,6 +241,14 @@ ${project.version} + + + org.hamcrest + hamcrest-all + 1.3 + test + + org.spigotmc @@ -340,12 +348,6 @@ junit-platform-surefire-provider 1.2.0 - - org.hamcrest - hamcrest-all - 1.3 - test - org.mockito mockito-core From 4863ec2d9fa268dd97f77ad12087fe545cda4043 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 23 Dec 2018 03:13:08 +0300 Subject: [PATCH 046/508] Test MapFiller --- .../minecraft/commons/util/MapUtilTest.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java index 94e4d9491..581bd6863 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java @@ -1,5 +1,6 @@ package ru.progrm_jarvis.minecraft.commons.util; +import lombok.val; import org.apache.commons.lang3.tuple.Pair; import org.junit.jupiter.api.Test; @@ -7,6 +8,9 @@ import java.util.HashMap; import java.util.stream.Stream; +import static com.google.common.collect.Maps.immutableEntry; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; import static org.junit.jupiter.api.Assertions.*; class MapUtilTest { @@ -94,4 +98,103 @@ void testFillMapFromStream() { MapUtil.fillMap(new HashMap<>(), Stream.of(Pair.of(1, "Hello"), Pair.of(2, "world"))) ); } + + @Test + void testMapFillerConstructWithFirst() { + assertThat( + MapUtil.mapFiller(new HashMap<>()).map().keySet(), + empty() + ); + + assertEquals( + new HashMap() {{ + put("Hello", 1); + }}, + MapUtil.mapFiller(new HashMap<>(), "Hello", 1).map() + ); + } + + @Test + @SuppressWarnings("unchecked") // Hamcrest, R U fine? + void testMapFillerPut() { + val entries = MapUtil.mapFiller(new HashMap()) + .put("one", 1) + .put("two", 2) + .map() + .entrySet(); + + assertThat(entries, hasSize(2)); + + assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); + } + + @Test + @SuppressWarnings("unchecked") // Hamcrest, R U fine? + void testMapFillerFillIterator() { + val entries = MapUtil.mapFiller(new HashMap()) + .fill(Arrays.asList(Pair.of("one", 1), Pair.of("two", 2)).iterator()) + .map() + .entrySet(); + + assertThat(entries, hasSize(2)); + + assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); + } + + @Test + @SuppressWarnings("unchecked") // Hamcrest, R U fine? + void testMapFillerFillIterable() { + val entries = MapUtil.mapFiller(new HashMap()) + .fill(Arrays.asList(Pair.of("one", 1), Pair.of("two", 2))) + .map() + .entrySet(); + + assertThat(entries, hasSize(2)); + + assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); + } + + @Test + @SuppressWarnings("unchecked") // Hamcrest, R U fine? + void testMapFillerFillStream() { + val entries = MapUtil.mapFiller(new HashMap()) + .fill(Stream.of(Pair.of("one", 1), Pair.of("two", 2))) + .map() + .entrySet(); + + assertThat(entries, + hasSize(2) + ); + + assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); + } + + @Test + @SuppressWarnings("unchecked") // Hamcrest, R U fine? + void testMapFillerFillEveryKind() { + val entries = MapUtil.mapFiller(new HashMap()) + .put("one", 1) + .put("two", 2) + .fill(Arrays.asList(Pair.of("five", 5), Pair.of("six", 6))) + .fill(Arrays.asList(Pair.of("three", 3), Pair.of("four", 4))) + .fill(Stream.of(Pair.of("seven", 7), Pair.of("eight", 8))) + .map() + .entrySet(); + + assertThat(entries, hasSize(8)); + + assertThat( + entries, + hasItems( + immutableEntry("one", 1), + immutableEntry("two", 2), + immutableEntry("three", 3), + immutableEntry("four", 4), + immutableEntry("five", 5), + immutableEntry("six", 6), + immutableEntry("seven", 7), + immutableEntry("eight", 8) + ) + ); + } } \ No newline at end of file From c608c2545383257e6d9a7b07eb5734870f646c34 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 23 Dec 2018 03:21:12 +0300 Subject: [PATCH 047/508] Add Pair equivalents for MapUtil's filling strategies --- .../minecraft/commons/util/MapUtil.java | 29 ++++++++++++++ .../minecraft/commons/util/MapUtilTest.java | 38 ++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java index 81d84a540..70251ab19 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -78,6 +78,23 @@ private void fillMapNoChecks(final Map map, final Object... keyValuePairs) { else key = keyValuePair; } + /** + * Fills the map specified with the values specified. + * + * @param map map to fill with the values + * @param entries entries to fill the map with + * @param type of keys + * @param type of values + * @param map type + * @return the map passed filled with key-value pairs specified + */ + @SafeVarargs + public > M fillMap(@NonNull final M map, final Pair... entries) { + for (val entry : entries) map.put(entry.getKey(), entry.getValue()); + + return map; + } + /** * Fills the map specified with the values specified. * @@ -206,6 +223,18 @@ public MapFiller put(final K key, final V value) { return this; } + /** + * Fills the map with the values of specified array. + * + * @param entries entries which will be put to the map + * @return this map filler for chaining + */ + public MapFiller fill(final Pair... entries) { + for (val entry : entries) map.put(entry.getKey(), entry.getValue()); + + return this; + } + /** * Fills the map based on the specified {@link Iterator}. * diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java index 581bd6863..68ae7d377 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java @@ -6,6 +6,7 @@ import java.util.Arrays; import java.util.HashMap; +import java.util.Map; import java.util.stream.Stream; import static com.google.common.collect.Maps.immutableEntry; @@ -16,7 +17,7 @@ class MapUtilTest { @Test - void testFillMapFromArray() { + void testFillMapFromArrayOfUncheckedPairs() { assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); assertEquals( @@ -39,6 +40,28 @@ void testFillMapFromArray() { assertThrows(IllegalArgumentException.class, () -> MapUtil.fillMap(new HashMap<>(), 1, 3, "String")); } + @Test + void testFillMapFromArray() { + assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); + + assertEquals( + new HashMap() {{ + put(1, "Hello"); + put(2, "world"); + }}, + MapUtil.>fillMap( + new HashMap<>(), Pair.of(1, "Hello"), Pair.of(2, "world") + ) + ); + + assertNotEquals( + new HashMap() {{ + put(1, "Hello"); + }}, + MapUtil.fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world"))) + ); + } + @Test void testFillMapFromIterator() { assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); @@ -128,6 +151,19 @@ void testMapFillerPut() { assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); } + @Test + @SuppressWarnings("unchecked") // Hamcrest, R U fine? + void testMapFillerFillArray() { + val entries = MapUtil.mapFiller(new HashMap()) + .fill(Pair.of("one", 1), Pair.of("two", 2)) + .map() + .entrySet(); + + assertThat(entries, hasSize(2)); + + assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); + } + @Test @SuppressWarnings("unchecked") // Hamcrest, R U fine? void testMapFillerFillIterator() { From 9b01443d7cb7a304bbb48e313bc7c7a4b6562cf0 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 23 Dec 2018 03:22:31 +0300 Subject: [PATCH 048/508] Make all methods of MapUtil final --- .../minecraft/commons/util/MapUtil.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java index 70251ab19..dfd18966a 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -217,7 +217,7 @@ public static final class MapFiller { * @param value value to put by the key * @return this map filler for chaining */ - public MapFiller put(final K key, final V value) { + public final MapFiller put(final K key, final V value) { map.put(key, value); return this; @@ -229,7 +229,8 @@ public MapFiller put(final K key, final V value) { * @param entries entries which will be put to the map * @return this map filler for chaining */ - public MapFiller fill(final Pair... entries) { + @SafeVarargs + public final MapFiller fill(final Pair... entries) { for (val entry : entries) map.put(entry.getKey(), entry.getValue()); return this; @@ -241,7 +242,7 @@ public MapFiller fill(final Pair... entries) { * @param entries iterator of the entries whose elements will be put to the map * @return this map filler for chaining */ - public MapFiller fill(final Iterator> entries) { + public final MapFiller fill(final Iterator> entries) { while (entries.hasNext()) { val entry = entries.next(); map.put(entry.getKey(), entry.getValue()); @@ -256,7 +257,7 @@ public MapFiller fill(final Iterator> entries) { * @param entries entries which will be put to the map * @return this map filler for chaining */ - public MapFiller fill(final Iterable> entries) { + public final MapFiller fill(final Iterable> entries) { for (val entry : entries) map.put(entry.getKey(), entry.getValue()); return this; @@ -268,7 +269,7 @@ public MapFiller fill(final Iterable> entries) { * @param entries stream of the entries whose elements will be put to the map * @return this map filler for chaining */ - public MapFiller fill(final Stream> entries) { + public final MapFiller fill(final Stream> entries) { entries.forEach(entry -> map.put(entry.getKey(), entry.getValue())); return this; @@ -280,7 +281,7 @@ public MapFiller fill(final Stream> entries) { * @param entries stream of the entries whose elements will be put to the map * @return this map filler for chaining */ - public MapFiller fillOrdered(final Stream> entries) { + public final MapFiller fillOrdered(final Stream> entries) { entries.forEachOrdered(entry -> map.put(entry.getKey(), entry.getValue())); return this; From e08161ff8e7c9ed71efcd6d20ef10927296d2943 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 23 Dec 2018 03:33:29 +0300 Subject: [PATCH 049/508] Cleanup MapUtil test --- .../minecraft/commons/util/MapUtilTest.java | 141 +++++++----------- 1 file changed, 53 insertions(+), 88 deletions(-) diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java index 68ae7d377..f42697b29 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java @@ -16,116 +16,78 @@ class MapUtilTest { + /////////////////////////////////////////////////////////////////////////// + // MapUtil + /////////////////////////////////////////////////////////////////////////// + @Test + @SuppressWarnings("unchecked") void testFillMapFromArrayOfUncheckedPairs() { assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); - assertEquals( - new HashMap() {{ - put(1, "Hello"); - put(2, "world"); - }}, - MapUtil.fillMap(new HashMap<>(), 1, "Hello", 2, "world") - ); - - assertNotEquals( - new HashMap() {{ - put(1, "Hello"); - }}, - MapUtil.fillMap(new HashMap<>(), 1, "Hello", 2, "world") - ); - assertThrows(IllegalArgumentException.class, () -> MapUtil.fillMap(new HashMap<>(), 1)); assertThrows(IllegalArgumentException.class, () -> MapUtil.fillMap(new HashMap<>(), 1, 3, "String")); + + val entries = new HashMap() {{ + put(1, "Hello"); + put(2, "world"); + }}.entrySet(); + + assertThat(entries, hasSize(2)); + assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); } @Test + @SuppressWarnings("unchecked") void testFillMapFromArray() { - assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); + val entries = MapUtil.>fillMap( + new HashMap<>(), Pair.of(1, "Hello"), Pair.of(2, "world") + ).entrySet(); - assertEquals( - new HashMap() {{ - put(1, "Hello"); - put(2, "world"); - }}, - MapUtil.>fillMap( - new HashMap<>(), Pair.of(1, "Hello"), Pair.of(2, "world") - ) - ); - - assertNotEquals( - new HashMap() {{ - put(1, "Hello"); - }}, - MapUtil.fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world"))) - ); + assertThat(entries, hasSize(2)); + assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); } @Test + @SuppressWarnings("unchecked") void testFillMapFromIterator() { - assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); - - assertEquals( - new HashMap() {{ - put(1, "Hello"); - put(2, "world"); - }}, - MapUtil.fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world")).iterator()) - ); + val entries = MapUtil + .fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world")).iterator()) + .entrySet(); - assertNotEquals( - new HashMap() {{ - put(1, "Hello"); - }}, - MapUtil.fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world")).iterator()) - ); + assertThat(entries, hasSize(2)); + assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); } @Test + @SuppressWarnings("unchecked") void testFillMapFromIterable() { - assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); - - assertEquals( - new HashMap() {{ - put(1, "Hello"); - put(2, "world"); - }}, - MapUtil.fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world"))) - ); + val entries = MapUtil + .fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world"))) + .entrySet(); - assertNotEquals( - new HashMap() {{ - put(1, "Hello"); - }}, - MapUtil.fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world"))) - ); + assertThat(entries, hasSize(2)); + assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); } @Test + @SuppressWarnings("unchecked") void testFillMapFromStream() { - assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); + val entries = MapUtil.fillMap(new HashMap<>(), Stream.of(Pair.of(1, "Hello"), Pair.of(2, "world"))).entrySet(); - assertEquals( - new HashMap() {{ - put(1, "Hello"); - put(2, "world"); - }}, - MapUtil.fillMap(new HashMap<>(), Stream.of(Pair.of(1, "Hello"), Pair.of(2, "world"))) - ); - - assertNotEquals( - new HashMap() {{ - put(1, "Hello"); - }}, - MapUtil.fillMap(new HashMap<>(), Stream.of(Pair.of(1, "Hello"), Pair.of(2, "world"))) - ); + assertThat(entries, hasSize(2)); + assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); } + /////////////////////////////////////////////////////////////////////////// + // MapFiller + /////////////////////////////////////////////////////////////////////////// + @Test void testMapFillerConstructWithFirst() { assertThat( - MapUtil.mapFiller(new HashMap<>()).map().keySet(), + MapUtil.mapFiller(new HashMap<>()).map().entrySet(), empty() ); @@ -153,7 +115,7 @@ void testMapFillerPut() { @Test @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerFillArray() { + void testMapFillerFillFromArray() { val entries = MapUtil.mapFiller(new HashMap()) .fill(Pair.of("one", 1), Pair.of("two", 2)) .map() @@ -166,7 +128,7 @@ void testMapFillerFillArray() { @Test @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerFillIterator() { + void testMapFillerFillFromIterator() { val entries = MapUtil.mapFiller(new HashMap()) .fill(Arrays.asList(Pair.of("one", 1), Pair.of("two", 2)).iterator()) .map() @@ -179,7 +141,7 @@ void testMapFillerFillIterator() { @Test @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerFillIterable() { + void testMapFillerFillFromIterable() { val entries = MapUtil.mapFiller(new HashMap()) .fill(Arrays.asList(Pair.of("one", 1), Pair.of("two", 2))) .map() @@ -192,7 +154,7 @@ void testMapFillerFillIterable() { @Test @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerFillStream() { + void testMapFillerFillFromStream() { val entries = MapUtil.mapFiller(new HashMap()) .fill(Stream.of(Pair.of("one", 1), Pair.of("two", 2))) .map() @@ -207,17 +169,18 @@ void testMapFillerFillStream() { @Test @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerFillEveryKind() { + void testMapFillerFillFromEveryKind() { val entries = MapUtil.mapFiller(new HashMap()) .put("one", 1) .put("two", 2) - .fill(Arrays.asList(Pair.of("five", 5), Pair.of("six", 6))) - .fill(Arrays.asList(Pair.of("three", 3), Pair.of("four", 4))) - .fill(Stream.of(Pair.of("seven", 7), Pair.of("eight", 8))) + .fill(Pair.of("three", 3), Pair.of("four", 4)) + .fill(Arrays.asList(Pair.of("five", 5), Pair.of("six", 6)).iterator()) + .fill(Arrays.asList(Pair.of("seven", 7), Pair.of("eight", 8))) + .fill(Stream.of(Pair.of("nine", 9), Pair.of("ten", 10))) .map() .entrySet(); - assertThat(entries, hasSize(8)); + assertThat(entries, hasSize(10)); assertThat( entries, @@ -229,7 +192,9 @@ void testMapFillerFillEveryKind() { immutableEntry("five", 5), immutableEntry("six", 6), immutableEntry("seven", 7), - immutableEntry("eight", 8) + immutableEntry("eight", 8), + immutableEntry("nine", 9), + immutableEntry("ten", 10) ) ); } From 20e36b6f9f7d483ea98ab22e61782d5858dd5f36 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 25 Dec 2018 21:06:33 +0300 Subject: [PATCH 050/508] Add minecraft-commons to nms-utils --- nms/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nms/pom.xml b/nms/pom.xml index 1dfc69603..162ef4c02 100644 --- a/nms/pom.xml +++ b/nms/pom.xml @@ -16,6 +16,10 @@ org.spigotmc spigot-api + + ${project.parent.groupId} + minecraft-commons + com.comphenix.protocol ProtocolLib-API From 5c6c9e79c51a005a4a16864231da375898fea358 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 25 Dec 2018 21:06:43 +0300 Subject: [PATCH 051/508] Add base for LegacySupport --- .../minecraft/nmsutils/LegacySupport.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java new file mode 100644 index 000000000..71397113d --- /dev/null +++ b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java @@ -0,0 +1,78 @@ +package ru.progrm_jarvis.minecraft.nmsutils; + +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.Value; +import lombok.experimental.FieldDefaults; +import lombok.experimental.UtilityClass; +import org.bukkit.Material; +import ru.progrm_jarvis.minecraft.commons.util.MapUtil; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * Various utilities used for supporting older versions of Minecraft-related environment, + * such as changed enum names and updated method signatures. + */ +@UtilityClass +public class LegacySupport { + + private static final boolean LEGACY_MATERIALS = NmsUtil.getVersion().getGeneration() < 13; + + private static final Map legacyItems = MapUtil.mapFiller(new HashMap()) + // TODO or find better solution .put("CAVE_AIR", new LegacyItem("CAVE_AIR", "AIR")) + // .put("VOID_AIR", new LegacyItem("VOID_AIR", "AIR")) + .map(); + + static { + System.out.println(Arrays.stream(Material.values()).filter(Material::isLegacy).collect(Collectors.toSet())); + } + + private static LegacyItem legacyItem(@NonNull final Material material, final int legacyData) { + return new LegacyItem(material, (byte) legacyData); + } + + private static LegacyItem legacyItem(@NonNull final Material material) { + return legacyItem(material, 0); + } + + private static LegacyItem legacyItem(@NonNull final String materialName, + @NonNull final String legacyMaterialName, + final int legacyData) { + return new LegacyItem(Material.valueOf(LEGACY_MATERIALS ? legacyMaterialName : materialName), legacyData); + } + + private static LegacyItem legacyItem(@NonNull final String materialName, + @NonNull final String legacyMaterialName) { + return legacyItem(materialName, legacyMaterialName, 0); + } + + @Value + @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE) + private static final class LegacyItem { + @NonNull Material material; + final byte legacyData; + + private LegacyItem(@NonNull final Material material, final int legacyData) { + this(material, (byte) legacyData); + } + + private LegacyItem(@NonNull final Material material) { + this(material, 0); + } + + private LegacyItem(@NonNull final String materialName, @NonNull final String legacyMaterialName, + final int legacyData) { + this(Material.valueOf(LEGACY_MATERIALS ? legacyMaterialName : materialName), (byte) legacyData); + } + + private LegacyItem(@NonNull final String materialName, @NonNull final String legacyMaterialName) { + this(materialName, legacyMaterialName, 0); + } + } +} From 47148ce0de40f35ba55988449a16ac21a55add13 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 25 Dec 2018 21:07:15 +0300 Subject: [PATCH 052/508] Cleanup LegacySupport --- .../ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java index 71397113d..2e82b2596 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java +++ b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java @@ -9,10 +9,8 @@ import org.bukkit.Material; import ru.progrm_jarvis.minecraft.commons.util.MapUtil; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import java.util.stream.Collectors; /** * Various utilities used for supporting older versions of Minecraft-related environment, @@ -28,10 +26,6 @@ public class LegacySupport { // .put("VOID_AIR", new LegacyItem("VOID_AIR", "AIR")) .map(); - static { - System.out.println(Arrays.stream(Material.values()).filter(Material::isLegacy).collect(Collectors.toSet())); - } - private static LegacyItem legacyItem(@NonNull final Material material, final int legacyData) { return new LegacyItem(material, (byte) legacyData); } From 41d686d15973d859bd904e1cb1bc46d5207b17ad Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 25 Dec 2018 21:09:32 +0300 Subject: [PATCH 053/508] Add deprecation warning suppression to LegacySupport --- .../java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java | 1 + 1 file changed, 1 insertion(+) diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java index 2e82b2596..2f1bf2f7b 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java +++ b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java @@ -17,6 +17,7 @@ * such as changed enum names and updated method signatures. */ @UtilityClass +@SuppressWarnings("deprecation") public class LegacySupport { private static final boolean LEGACY_MATERIALS = NmsUtil.getVersion().getGeneration() < 13; From 4a82dc9a98fff3d6a903c60fb614e16b1921cbfc Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 25 Dec 2018 21:12:03 +0300 Subject: [PATCH 054/508] Add NMS_VERSION_GENERATION to LegacySupport --- .../ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java index 2f1bf2f7b..839122d4f 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java +++ b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java @@ -20,7 +20,9 @@ @SuppressWarnings("deprecation") public class LegacySupport { - private static final boolean LEGACY_MATERIALS = NmsUtil.getVersion().getGeneration() < 13; + private static final int NMS_VERSION_GENERATION = NmsUtil.getVersion().getGeneration(); + + private static final boolean LEGACY_MATERIALS = NMS_VERSION_GENERATION < 13; private static final Map legacyItems = MapUtil.mapFiller(new HashMap()) // TODO or find better solution .put("CAVE_AIR", new LegacyItem("CAVE_AIR", "AIR")) From e37c34c9f808c3ec059bb2288014f64945e21b71 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 25 Dec 2018 21:20:16 +0300 Subject: [PATCH 055/508] Add LegacySupport#spawnFallingBlock(...) --- .../minecraft/nmsutils/LegacySupport.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java index 839122d4f..6d61f02e0 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java +++ b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java @@ -6,7 +6,11 @@ import lombok.Value; import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; +import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.FallingBlock; +import org.bukkit.material.MaterialData; import ru.progrm_jarvis.minecraft.commons.util.MapUtil; import java.util.HashMap; @@ -23,12 +27,41 @@ public class LegacySupport { private static final int NMS_VERSION_GENERATION = NmsUtil.getVersion().getGeneration(); private static final boolean LEGACY_MATERIALS = NMS_VERSION_GENERATION < 13; + private static final boolean LEGACY_BLOCK_FALLING = NMS_VERSION_GENERATION < 13; private static final Map legacyItems = MapUtil.mapFiller(new HashMap()) // TODO or find better solution .put("CAVE_AIR", new LegacyItem("CAVE_AIR", "AIR")) // .put("VOID_AIR", new LegacyItem("VOID_AIR", "AIR")) .map(); + /** + * Spawns a falling block at specified location. + * + * @param location location at which to spawn the block + * @param block block from which to create the falling one + * @return spawned falling block + */ + public FallingBlock spawnFallingBlock(@NonNull final Location location, @NonNull final Block block) { + if (LEGACY_BLOCK_FALLING) return location.getWorld() + .spawnFallingBlock(location, block.getType(), block.getData()); + return location.getWorld().spawnFallingBlock(location, block.getBlockData()); + } + + /** + * Spawns a falling block at specified location. + * + * @param location location at which to spawn the block + * @param material material of the block + * @param materialData legacy material data + * @return spawned falling block + */ + public FallingBlock spawnFallingBlock(@NonNull final Location location, + @NonNull final Material material, final byte materialData) { + if (LEGACY_BLOCK_FALLING) return location.getWorld() + .spawnFallingBlock(location, material, materialData); + return location.getWorld().spawnFallingBlock(location, new MaterialData(material, materialData)); + } + private static LegacyItem legacyItem(@NonNull final Material material, final int legacyData) { return new LegacyItem(material, (byte) legacyData); } From 14911f1dd48a96b149c164292ef228ebdb40df9d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 28 Dec 2018 15:17:01 +0300 Subject: [PATCH 056/508] Add functional getOrDefault to MapUtil --- .../minecraft/commons/util/MapUtil.java | 7 ++++++ .../minecraft/commons/util/MapUtilTest.java | 25 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java index dfd18966a..b070dc019 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -8,6 +8,7 @@ import java.util.Iterator; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Stream; /** @@ -193,6 +194,12 @@ public MapFiller mapFiller(@NonNull final Map map, K firstVal .put(firstValueKey, firstValue); } + public V getOrDefault(@NonNull final Map map, final K key, final Supplier defaultValueSupplier) { + // the value is got from map, non-null value is surely a present one, but null may have different meanings + val value = map.get(key); + return value == null ? map.containsKey(key) ? null : defaultValueSupplier.get() : value; + } + /** * An utility-object to fill the map following the chain pattern which may useful when initializing class fields. * diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java index f42697b29..2b78aa3d7 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java @@ -7,12 +7,16 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.function.Supplier; import java.util.stream.Stream; import static com.google.common.collect.Maps.immutableEntry; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.*; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; class MapUtilTest { @@ -80,6 +84,25 @@ void testFillMapFromStream() { assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); } + @Test + void testGetOrDefault() { + val map = new HashMap(); + map.put(1, "One"); + map.put(2, "Two"); + + @SuppressWarnings("unchecked") final Supplier defaultSupplier = mock(Supplier.class); + when(defaultSupplier.get()).thenReturn("Default"); + + assertEquals("One", MapUtil.getOrDefault(map, 1, defaultSupplier)); + verify(defaultSupplier, times(0)).get(); + + assertEquals("Two", MapUtil.getOrDefault(map, 2, defaultSupplier)); + verify(defaultSupplier, times(0)).get(); + + assertEquals("Default", MapUtil.getOrDefault(map, 3, defaultSupplier)); + verify(defaultSupplier, times(1)).get(); + } + /////////////////////////////////////////////////////////////////////////// // MapFiller /////////////////////////////////////////////////////////////////////////// From cbd499f84276495a9c5b9fe6c8a62c9e3db347e9 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 28 Dec 2018 15:18:01 +0300 Subject: [PATCH 057/508] Add byte> conversions to BitwiseUtil --- .../minecraft/commons/util/BitwiseUtil.java | 20 +++++++++++++++++++ .../commons/util/BitwiseUtilTest.java | 14 +++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtilTest.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java index 158e3a729..b934d754b 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java @@ -173,4 +173,24 @@ public char implicate(char num1, final char num2) { return num1; } + + /** + * Converts the unsigned {@link int} to a 8-bit ({@link byte}) representation. + * + * @param unsignedInt integer whose least significant 8 bits are to be stored in a byte + * @return unsigned integer's least significant 8 bits in a single byte + */ + public byte unsignedIntToByte(final int unsignedInt) { + return (byte) unsignedInt; + } + + /** + * Converts the 8-bit ({@link byte}) value to an unsigned int representation. + * + * @param byteValue byte value whose bits will be used as the trailing bits of the resulting integer + * @return an integer value consisting of 24 foremost 0s and 8 bits of the specified byte + */ + public int byteToUnsignedInt(final byte byteValue) { + return byteValue & 0xFF; + } } diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtilTest.java new file mode 100644 index 000000000..975de58da --- /dev/null +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtilTest.java @@ -0,0 +1,14 @@ +package ru.progrm_jarvis.minecraft.commons.util; + +import lombok.var; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BitwiseUtilTest { + + @Test + void testUnsignedIntByteConversions() { + for (var i = 0; i < 255; i++) assertEquals(i, BitwiseUtil.byteToUnsignedInt(BitwiseUtil.unsignedIntToByte(i))); + } +} \ No newline at end of file From 041a601cc163cf9457a6184ab128a57ad0cc89fe Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 28 Dec 2018 19:05:30 +0300 Subject: [PATCH 058/508] Add Jetbrains annotations dependency --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index c50ed7ad7..6723749f0 100644 --- a/pom.xml +++ b/pom.xml @@ -311,6 +311,11 @@ aspectjrt ${aspectj.version} + + org.jetbrains + annotations + 16.0.3 + com.google.code.findbugs jsr305 From 8d485b1a5b3b1b3f05169b30cbd29f98aec9c9e6 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 28 Dec 2018 19:06:20 +0300 Subject: [PATCH 059/508] Change default scope of analysis dependencies to provided --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 6723749f0..0a26c0fbc 100644 --- a/pom.xml +++ b/pom.xml @@ -315,11 +315,13 @@ org.jetbrains annotations 16.0.3 + provided com.google.code.findbugs jsr305 3.0.2 + provided From 1006336f0892ba7f4bc52245aa7b3b0f3de7fcff Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 29 Dec 2018 21:55:40 +0300 Subject: [PATCH 060/508] Typo: id -> ID --- .../java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtil.java b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtil.java index 26a355c4d..0024a7609 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtil.java +++ b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtil.java @@ -101,9 +101,9 @@ public DataWatcherFactory.DataWatcherModifier dataWatcherModifier(@NonNull final } /** - * Gets id for entity preventing from conflicts with real entities. + * Gets ID for entity preventing from conflicts with real entities. * - * @return new id for an entity + * @return new ID for an entity */ public int nextEntityId() { synchronized (ENTITY_COUNT_FIELD) { From 4a2c7501a24d29404eda990ff4d29fb9f2e4fb5b Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 29 Dec 2018 21:59:57 +0300 Subject: [PATCH 061/508] Typo: id -> ID --- .../minecraft/fakeentitylib/entity/ArmorStandBlockItem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 52261a135..b4f12b2ed 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -51,7 +51,7 @@ public class ArmorStandBlockItem extends SimpleLivingFakeEntity { /** * Initializes a newly created armor stand block-item from parameters given. * - * @param uuid unique entity id of this block-item entity + * @param uuid unique entity ID of this block-item entity * @param playersMap map to be used as backend for this block-item entity * @param global whether this block-item is global (the value returned by {@link #isGlobal()}) * @param visible whether this block-item is initially be visible From 5a17d062e52fd115fa9429a7863641f9faebd7fa Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 30 Dec 2018 15:59:23 +0300 Subject: [PATCH 062/508] Add jetbrains annotations dependency to minecraft-commons --- commons/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/commons/pom.xml b/commons/pom.xml index b33952636..1260692e8 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -50,6 +50,10 @@ com.google.code.findbugs jsr305 + + org.jetbrains + annotations + org.junit.jupiter From 2956fdefdc9a27cf39c78b178af6a08828f7ab67 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 30 Dec 2018 15:59:49 +0300 Subject: [PATCH 063/508] Introduce MapImage API --- .../commons/mapimage/DefaultMapImage.java | 212 +++++++++ .../minecraft/commons/mapimage/MapImage.java | 433 ++++++++++++++++++ .../commons/mapimage/MapImageColor.java | 252 ++++++++++ .../mapimage/MapImageMinecraftColors.java | 307 +++++++++++++ .../minecraft/commons/mapimage/MapImages.java | 80 ++++ 5 files changed, 1284 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java new file mode 100644 index 000000000..f36636420 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -0,0 +1,212 @@ +package ru.progrm_jarvis.minecraft.commons.mapimage; + +import lombok.*; +import lombok.experimental.FieldDefaults; +import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazies; +import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazy; + +import java.awt.image.BufferedImage; +import java.util.Arrays; + +import static com.google.common.base.Preconditions.checkArgument; +import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.blankPixels; + +/** + * The default {@link MapImage} implementation which stores its pixels as a 2-dimensional {@link byte}-array. + */ +@ToString +@EqualsAndHashCode +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class DefaultMapImage implements MapImage { + + /** + * Byte array of pixels of an image by X, Y indexes (columns of rows). + */ + byte[][] pixels; + + /** + * Lazily initialized non-buffered drawer + */ + Lazy drawer = Lazies.lazy(Drawer::new); + + /** + * Lazily initialized buffered drawer + */ + Lazy bufferedDrawer = Lazies.lazy(BufferedDrawer::new); + + /** + * Creates new map image from pixels. + * + * @param pixels array of Minecraft color IDs (columns of rows) + */ + public DefaultMapImage(final byte[][] pixels) { + checkArgument(pixels.length == WIDTH, "Pixels length should be " + WIDTH); + for (val column : pixels) checkArgument(column.length == HEIGHT, "Pixels height should be " + HEIGHT); + + this.pixels = pixels; + } + + @Override + public int getWidth() { + return WIDTH; + } + + @Override + public int getHeight() { + return HEIGHT; + } + + /** + * Creates new map image from image. + * + * @param image from which to create the map image + * @param resize whether the image should be resized or cut to fit map image dimensions + * @return created map image + */ + public static DefaultMapImage from(@NonNull final BufferedImage image, final boolean resize) { + return new DefaultMapImage(MapImages.getMapImagePixels(image, resize)); + } + + @Override + public MapImage.Drawer drawer() { + return drawer.get(); + } + + @Override + public MapImage.BufferedDrawer bufferedDrawer() { + return bufferedDrawer.get(); + } + + @ToString + @EqualsAndHashCode + protected final class Drawer implements MapImage.Drawer { + + @Override + public MapImage.Drawer px(final int x, final int y, final byte color) { + pixels[x][y] = color; + + return this; + } + + @Override + public MapImage.Drawer fill(final byte color) { + for (val column : pixels) Arrays.fill(column, color); + + return this; + } + } + + /** + * Buffered drawer based on 2-dimensional {@link byte}-array of changed pixels and {@link int}-bounds. + */ + @Getter + @ToString + @EqualsAndHashCode + @FieldDefaults(level = AccessLevel.PROTECTED) + protected final class BufferedDrawer implements MapImage.BufferedDrawer { + + /** + * Array of changed pixels + */ + final byte[][] buffer = blankPixels(new byte[DefaultMapImage.this.getWidth()][DefaultMapImage.this.getWidth()]); + + boolean unchanged = true; + + /** + * The least X-coordinate of changed image segment. + */ + int leastChangedX = Delta.NONE, + /** + * The least Y-coordinate of changed image segment. + */ + leastChangedY = Delta.NONE, + /** + * The most X-coordinate of changed image segment. + */ + mostChangedX = Delta.NONE, + /** + * The most Y-coordinate of changed image segment. + */ + mostChangedY = Delta.NONE; + + /** + * Resets this buffered drawer setting {@link #unchanged} to {@code true} and resetting its buffer. + */ + protected void reset() { + unchanged = true; + leastChangedX = leastChangedY = mostChangedX = mostChangedY = Delta.NONE; + + blankPixels(buffer); + } + + @Override + public MapImage.Drawer dispose() { + // disposal is not needed if there are no changes + if (!unchanged) { + for (var x = leastChangedX; x <= mostChangedX; x++) { + if (mostChangedY + 1 - leastChangedY >= 0) System.arraycopy( + buffer[x], leastChangedY, pixels[x], leastChangedY, mostChangedY + 1 - leastChangedY + ); + } + + reset(); + } + + return this; + } + + @Override + public Delta getDelta() { + if (unchanged) return Delta.EMPTY; + + // length of pixels changed at y (rows affected) + val yLength = mostChangedY - leastChangedY + 1; + // target array to store changed pixels + val changedPixels = new byte[mostChangedX - leastChangedX + 1][yLength]; + // for each column copy its rows from leastChangedX to mostChangedX to the next available + // row in changedPixels copying from leastChangedY to mostChangedY (of yLength) + // indexing happens from 0 by each axis, so i is target array index, and x is source array index (column) + for (var x = leastChangedX, i = 0; x < mostChangedX; x++, i++) System.arraycopy( + pixels[x] /* source column */, leastChangedY, changedPixels[i] /* target column*/, 0, yLength + ); + + return Delta.of(changedPixels, leastChangedX, leastChangedY); + } + + /////////////////////////////////////////////////////////////////////////// + // Drawing + /////////////////////////////////////////////////////////////////////////// + + @Override + public MapImage.Drawer px(final int x, final int y, final byte color) { + // put the changed pixel to the buffer + buffer[x][y] = color; + + // perform delta update if needed + // if it is the first update then the pixels is the zone of changes + if (unchanged) { + unchanged = false; + + leastChangedX = mostChangedX = x; + leastChangedY = mostChangedY = y; + } else { + if (x < leastChangedX) leastChangedX = x; + else if (x > mostChangedX) mostChangedX = x; + + if (y < leastChangedY) leastChangedY = y; + else if (y > mostChangedY) mostChangedY = y; + } + + return this; + } + + @Override + public MapImage.Drawer fill(final byte color) { + unchanged = false; + + for (val column : buffer) Arrays.fill(column, color); + + return this; + } + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java new file mode 100644 index 000000000..be234e472 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java @@ -0,0 +1,433 @@ +package ru.progrm_jarvis.minecraft.commons.mapimage; + +import lombok.AccessLevel; +import lombok.Value; +import lombok.experimental.Accessors; +import lombok.experimental.FieldDefaults; +import lombok.val; +import lombok.var; +import org.jetbrains.annotations.Contract; + +import java.util.Arrays; + +/** + * Image on a map. + */ +public interface MapImage { + + /** + * Maximal width of a map allowed by Minecraft. + */ + int WIDTH = 128, + /** + * Maximal height of a map allowed by Minecraft. + */ + HEIGHT = 128, + /** + * Maximal (and only possible) amount of pixels on a map allowed by Minecraft. + */ + PIXELS = WIDTH * HEIGHT; + + /** + * Gets the width of this map image. + * + * @return this map image's width + */ + int getWidth(); + + /** + * Gets the height of this map image. + * + * @return this map image's height + */ + int getHeight(); + + /** + * Gets the non-buffered drawer for this image. + * + * @return non-buffered drawer for this image + */ + Drawer drawer(); + + /** + * Gets the buffered drawer for this image. + * + * @return buffered drawer for this image + */ + BufferedDrawer bufferedDrawer(); + + /** + * Makes all pixels of the specified array blank ({@link MapImageColor#NO_COLOR_CODE}). + * + * @param pixels 2-dimensional array of pixels to make blank + * @return passed array of pixels made blank + */ + static byte[][] blankPixels(final byte[][] pixels) { + for (val bytes : pixels) Arrays.fill(bytes, MapImageColor.NO_COLOR_CODE); + + return pixels; + } + + /** + * An object responsible for changing map's content. + * + * @apiNote most non-primitive methods have default implementations based on primitive ones + */ + interface Drawer { + + /** + * Assures that the X-coordinate is inside the allowed bounds [{@code 0}; {@link MapImage#WIDTH}). + * + * @param x X-coordinate to check + * @throws IllegalArgumentException if the X-coordinate is not between the bounds + */ + static void checkX(final int x) { + if (x < 0) throw new IllegalArgumentException("X-coordinate should be non-negative"); + if (x >= WIDTH) throw new IllegalArgumentException("X-coordinate should be less than " + WIDTH); + } + + /** + * Assures that the Y-coordinate is inside the allowed bounds [{@code 0}; {@link MapImage#HEIGHT}). + * + * @param y Y-coordinate to check + * @throws IllegalArgumentException if the Y-coordinate is not between the bounds + */ + static void checkY(final int y) { + if (y < 0) throw new IllegalArgumentException("Y-coordinate should be non-negative"); + if (y >= HEIGHT) throw new IllegalArgumentException("Y-coordinate should be less than " + HEIGHT); + } + + /** + * Makes the specified X-coordinate surely be inside the allowed bounds [{@code 0}; {@link MapImage#WIDTH}). + * + * @param x X-coordinate to bound + * @return bounded X-coordinate + */ + static int boundX(final int x) { + if (x < 0) return 0; + if (x >= WIDTH) return WIDTH - 1; + return x; + } + + /** + * Makes the specified Y-coordinate surely be inside the allowed bounds [{@code 0}; {@link MapImage#HEIGHT}). + * + * @param y Y-coordinate to bound + * @return bounded Y-coordinate + */ + static int boundY(final int y) { + if (y < 0) return 0; + if (y >= HEIGHT) return HEIGHT - 1; + return y; + } + + /** + * Draws a pixel of the specified color at given coordinates. + * + * @param x X-coordinate to draw the pixel at + * @param y Y-coordinate to draw the pixel at + * @param color color of the pixel + * @return this drawer for chaining + */ + @Contract("_, _, _ -> this") + Drawer px(int x, int y, final byte color); + + /** + * Draws a line between two points. + * + * @param x1 the first point's X-coordinate + * @param y1 the first point's Y-coordinate + * @param x2 the second point's X-coordinate + * @param y2 the second point's Y-coordinate + * @param color color of the line + * @return this drawer for chaining + */ + @Contract("_, _, _, _, _ -> this") + @SuppressWarnings("Duplicates") // swapping + default Drawer line(int x1, int y1, int x2, int y2, final byte color) { + if (x1 > x2) { // swap x's + val oldX2 = x2; + x2 = x1; + x1 = oldX2; + } + + if (y1 > y2) { // swap y's + val oldY2 = y2; + y2 = y1; + y1 = oldY2; + } + + val dX = x2 - x1; + val dY = y2 - y1; + + // stepping should happen by the biggest delta to affect all rows / columns on it + if (dX > dY) { + // dX is bigger, step by it + val stepY = dY / (float) dX; + float y = y1; + for (/* use x1 for x */; x1 <= x2; x1++, y += stepY) px(x1, (int) y, color); + } else { + // dY is bigger or same, step by it + val stepX = dX / (float) dY; + float x = x1; + for (/* use y1 for y */; y1 <= y2; y1++, x += stepX) px((int) x, y1, color); + } + + return this; + } + + /** + * Draws a rectangle by given coordinates and color. + * + * @param x1 X-coordinate of the first rectangle point + * @param y1 Y-coordinate of the first rectangle point + * @param x2 X-coordinate of the second rectangle point + * @param y2 T-coordinate of the second rectangle point + * @param color color of the round + * @return this drawer for chaining + */ + @Contract("_, _, _, _, _ -> this") + @SuppressWarnings("Duplicates") // swapping + default Drawer rect(int x1, int y1, int x2, int y2, final byte color) { + checkX(x1); + checkY(y1); + checkX(x2); + checkY(y2); + + if (x1 > x2) { // swap x's + val oldX2 = x2; + x2 = x1; + x1 = oldX2; + } + + if (y1 > y2) { // swap y's + val oldY2 = y2; + y2 = y1; + y1 = oldY2; + } + + for (var x = x1; x <= x2; x++) for (var y = y1; y <= y2; y++) px(x, y, color); + + return this; + } + + /** + * Draws a round with the center specified of given radius and color. + * + * @param centerX X-coordinate of the round's center + * @param centerY Y-coordinate of the round's center + * @param radius radius of the round + * @param color color of the round + * @return this drawer for chaining + */ + @Contract("_, _, _, _ -> this") + default Drawer round(final int centerX, final int centerY, final int radius, final byte color) { + final int + minX = boundX(centerX - radius), maxX = boundX(centerX + radius), + minY = boundY(centerY - radius), maxY = boundY(centerY + radius); + + val squaredRadius = radius * radius; + + for (var x = minX; x <= maxX; x++) { + var squaredDX = x - centerX; // find delta + squaredDX *= squaredDX; // dy now stores a squared value + + for (var y = minY; y <= maxY; y++) { + var squaredDY = y - centerY; // find delta + squaredDY *= squaredDY; // dy now stores a squared value + + // Pythagoras theorem с² = a² + b² ~~> radius² = Δx² + Δy² + if (squaredRadius <= squaredDX + squaredDY) px(x, y, color); + } + } + + return this; + } + + /** + * Fills the image with the specified color. + * + * @param color color to fill the image with + * @return this drawer for chaining + * + * @apiNote this method doesn't provide default implementation because it is suboptmal in most cases + * to set similar pixels one by one. + * There is also no guarantees (although it is in most cases ) + */ + @Contract("_ -> this") + Drawer fill(byte color); + } + + /** + * A drawer which stores all changes releasing them only when required. + */ + interface BufferedDrawer extends Drawer { + + /** + * Gets the least X-coordinate of changed image segment. + * + * @return the least X-coordinate of changed image segment or {@link Delta#NONE} if no pixels were changed + */ + int getLeastChangedX(); + + /** + * Gets the least Y-coordinate of changed image segment. + * + * @return the least Y-coordinate of changed image segment or {@link Delta#NONE} if no pixels were changed + */ + int getLeastChangedY(); + + /** + * Gets the most X-coordinate of changed image segment. + * + * @return the most X-coordinate of changed image segment or {@link Delta#NONE} if no pixels were changed + */ + int getMostChangedX(); + + /** + * Gets the most Y-coordinate of changed image segment. + * + * @return the most Y-coordinate of changed image segment or {@link Delta#NONE} if no pixels were changed + */ + int getMostChangedY(); + + /** + * Gets the delta of the image which this drawer is having. + * + * @return delta of the image + */ + Delta getDelta(); + + /** + * Disposes the image. Disposal means applying all changes to the source Map image. + * + * @return this drawer for chaining + */ + @Contract(" -> this") + Drawer dispose(); + + /** + * Gets the delta of the image which this drawer is having disposing the image. + * + * @return delta of the image + */ + default Delta pickDelta() { + val delta = getDelta(); + dispose(); + + return delta; + } + } + + /** + * Object containing data about changed image part. + * + * @see BufferedDrawer most common use-case of delta + */ + @FieldDefaults(level = AccessLevel.PRIVATE) + interface Delta { + + /** + * The value returned by {@link #leastX()} and {@link #leastY()} whenever there are no changes. + */ + int NONE = -1; + + /** + * The value returned by {@link #pixels()} whenever there are no changes. + */ + byte[][] NO_PIXELS = new byte[0][0]; + + /** + * An empty delta. This should be used whenever there were no changes to the image. + */ + Empty EMPTY = new Empty(); + + /** + * Retrieves whether the delta is empty (there were no changes to the image) or not. + * + * @return {@code false} if at least one pixel differs from the image and {@code true} otherwise + */ + boolean isEmpty(); + + /** + * Gets the pixels changed (columns, rows). + * + * @return pixels changed or {@link #NO_PIXELS} if none were changed + */ + byte[][] pixels(); + + /** + * Gets the least X-coordinate of the changed segment + * + * @return the least X-coordinate of the changed segment or {@link #NONE} if none were changed + */ + int leastX(); + + /** + * Gets the least Y-coordinate of the changed segment + * + * @return the least Y-coordinate of the changed segment or {@link #NONE} if none were changed + */ + int leastY(); + + /** + * Creates new delta. + * + * @param pixels pixels changed + * @param leastX least X-coordinate of the affected segment + * @param leastY least Y-coordinate of the affected segment + * @return empty delta if {@code pixels} is empty or {@code leastX} or {@code leastY} is {@link Delta#NONE} + * and non-empty delta otherwise + */ + static Delta of(final byte[][] pixels, final int leastX, final int leastY) { + if (pixels.length == 0 || leastX == NONE || leastY == NONE) return EMPTY; + return new NonEmpty(pixels, leastX, leastY); + } + + /** + * Empty delta. There is no need to instantiate it for each empty delta, use {@link Delta#EMPTY} instead. + */ + @Value + class Empty implements Delta { + + @Override + public boolean isEmpty() { + return true; + } + + @Override + public byte[][] pixels() { + return NO_PIXELS; + } + + @Override + public int leastX() { + return -1; + } + + @Override + public int leastY() { + return -1; + } + } + + /** + * Non-empty delta. Usage of this class guarantees that it is not empty + * (its constructor does not perform checks of {@code pixels} emptiness + * and {@code leastX}, {@code leastY} ranges). + */ + @Value + @Accessors(fluent = true) + class NonEmpty implements Delta { + + byte[][] pixels; + + int leastX, leastY; + + @Override + public boolean isEmpty() { + return false; + } + } + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java new file mode 100644 index 000000000..337b9ef4d --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java @@ -0,0 +1,252 @@ +package ru.progrm_jarvis.minecraft.commons.mapimage; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import gnu.trove.map.TObjectByteMap; +import gnu.trove.map.hash.TObjectByteHashMap; +import lombok.*; +import lombok.experimental.Accessors; +import lombok.experimental.FieldDefaults; +import ru.progrm_jarvis.minecraft.commons.util.BitwiseUtil; +import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; + +/** + * A cached color which provides easy conversions between full 24-bit RGB and Minecraft Map colors. + * + * @apiNote Minecraft maps don't allow alpha channel + */ +@Value +@FieldDefaults(level = AccessLevel.PRIVATE) +@Accessors(fluent = true) +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +public class MapImageColor { + + /** + * A primitive constant value to use when there is no color code. + */ + public static final byte NO_COLOR_CODE = 0; + + private static final Object COLOR_IDS_CACHE_MUTEX = new Object[0]; + + private static final Cache COLOR_CACHE = CacheBuilder.newBuilder() + .weakValues() + .concurrencyLevel(SystemPropertyUtil.getSystemPropertyInt( + MapImageColor.class.getCanonicalName() + ".color-cache-concurrency-level", 2 + )) + .build(); + + /** + * All associations of color's with their available IDs. + */ + private static final TObjectByteMap COLOR_CODE_CACHE = new TObjectByteHashMap<>(); + + /** + * 8 bits describing red part of the color + */ + byte red, + /** + * 8 bits describing green part of the color + */ + green, + /** + * 8 bits describing blue part of the color + */ + blue; + + @EqualsAndHashCode.Include int rgb; + + /////////////////////////////////////////////////////////////////////////// + // Conversions + /////////////////////////////////////////////////////////////////////////// + + /** + * Transforms 3 color channels + * + * @param red red color channel (between {@code 0} and {@code 255}) + * @param green green color channel (between {@code 0} and {@code 255}) + * @param blue blue color channel (between {@code 0} and {@code 255}) + * @return color as a single RGB {@link int} + */ + public static int asRgb(final int red, final int green, final int blue) { + return (red << 16) | (green << 8) | blue; + } + + /** + * Gets the red color channel value for the specified RGB {@link int}. + * + * @param rgb RGB encoded as a single integer + * @return red color channel value + */ + public static byte red(final int rgb) { + return (byte) ((rgb >> 16) & 0xFF); + } + + /** + * Gets the green color channel value for the specified RGB {@link int}. + * + * @param rgb RGB encoded as a single integer + * @return green color channel value + */ + public static byte green(final int rgb) { + return (byte) ((rgb >> 8) & 0xFF); + } + + /** + * Gets the blue color channel value for the specified RGB {@link int}. + * + * @param rgb RGB encoded as a single integer + * @return blue color channel value + */ + public static byte blue(final int rgb) { + return (byte) (rgb & 0xFF); + } + + /** + * Gets the id of the color closest to the one given by calculating + * dissimilarity rate of each available with the one given. + * This value is cached for further usage. + * + * @param color color for which to find the closest available color code + * @return closest available color code + */ + @SneakyThrows + public static byte getClosestColorCode(final MapImageColor color) { + if (COLOR_CODE_CACHE.containsKey(color)) return COLOR_CODE_CACHE.get(color); + + synchronized (COLOR_IDS_CACHE_MUTEX) { + val rgb = color.rgb; + + // the value which will store the color code + final byte colorCode; + + val minecraftColorCode = MapImageMinecraftColors.getMinecraftColorCode(rgb); + if (minecraftColorCode == MapImageMinecraftColors.NO_COLOR_CODE) { + var minDistanceSquared = Integer.MAX_VALUE; + var closestColor = 0; + + // find the color with the minimal RGB-distance + for (val minecraftRgb : MapImageMinecraftColors.MINECRAFT_RGB_COLOR_CODES.keys()) { + val distanceSquared = getDistanceSquared(rgb, minecraftRgb); + if (distanceSquared < minDistanceSquared) { + minDistanceSquared = distanceSquared; + closestColor = minecraftRgb; + } + } + + colorCode = MapImageMinecraftColors.getMinecraftColorCode(closestColor); + } else colorCode = minecraftColorCode; + + // now store the best fitting color code in cache + COLOR_CODE_CACHE.put(color, colorCode); + + return colorCode; + } + } + + /** + * Gets the id of the color closest to the one given by calculating + * dissimilarity rate of each available with the one given. + * This value is cached for further usage. + * + * @param rgb RGB-color {@link int} for which to find the closest available color code + * @return closest available color id + */ + @SneakyThrows + public static byte getClosestColorCode(final int rgb) { + return getClosestColorCode(of(rgb)); + } + + /////////////////////////////////////////////////////////////////////////// + // Construction + /////////////////////////////////////////////////////////////////////////// + + /** + * Constructs a new map image color instance based on 3 base colors. + * This is an internal constructor as, normally, there should only exist one cached instance of any used color. + * + * @param red red color channel + * @param green green color channel + * @param blue blue color channel + */ + private MapImageColor(final byte red, final byte green, final byte blue) { + this.red = red; + this.green = green; + this.blue = blue; + + this.rgb = asRgb(red, green, blue); + } + + @SneakyThrows + public static MapImageColor of(final int rgb) { + return COLOR_CACHE.get(rgb, () -> new MapImageColor(red(rgb), green(rgb), blue(rgb))); + } + + @SneakyThrows + public static MapImageColor of(final byte red, final byte green, final byte blue) { + return COLOR_CACHE.get(asRgb(red, green, blue), () -> new MapImageColor(red, green, blue)); + } + + public static MapImageColor of(final int red, final int green, final int blue) { + return of((byte) red, (byte) green, (byte) blue); + } + + /////////////////////////////////////////////////////////////////////////// + // Difference counting + /////////////////////////////////////////////////////////////////////////// + + public static int getDistanceSquared(final byte red1, final byte green1, final byte blue1, + final byte red2, final byte green2, final byte blue2) { + val dRed = BitwiseUtil.byteToUnsignedInt(red2) - BitwiseUtil.byteToUnsignedInt(red1); + val dGreen = BitwiseUtil.byteToUnsignedInt(green2) - BitwiseUtil.byteToUnsignedInt(green1); + val dBlue = BitwiseUtil.byteToUnsignedInt(blue2) - BitwiseUtil.byteToUnsignedInt(blue1); + + return dRed * dRed + dBlue * dBlue + dGreen * dGreen; + } + + public static int getDistanceSquared(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { + return getDistanceSquared(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); + } + + public static int getDistanceSquared(final int rgb1, final int rgb2) { + return getDistanceSquared(red(rgb1), green(rgb1), blue(rgb1), red(rgb2), green(rgb2), blue(rgb2)); + } + + public int getDistanceSquared(final byte red, final byte green, final byte blue) { + return getDistanceSquared(this.red, this.green, this.blue, red, green, blue); + } + + public int getDistanceSquared(@NonNull final MapImageColor other) { + return getDistanceSquared(red, green, blue, other.red, other.green, other.blue); + } + + public int getDistanceSquared(final int rgb) { + return getDistanceSquared((byte) ((rgb >> 16) & 0xFF), (byte) ((rgb >> 8) & 0xFF), (byte) (rgb & 0xFF)); + } + + public static int getDissimilarityRate(final byte red1, final byte green1, final byte blue1, + final byte red2, final byte green2, final byte blue2) { + return (BitwiseUtil.byteToUnsignedInt(red2) - BitwiseUtil.byteToUnsignedInt(red1)) + * (BitwiseUtil.byteToUnsignedInt(green2) - BitwiseUtil.byteToUnsignedInt(green1)) + * (BitwiseUtil.byteToUnsignedInt(blue2) - BitwiseUtil.byteToUnsignedInt(blue1)); + } + + public static int getDissimilarityRate(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { + return getDissimilarityRate(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); + } + + public static int getDissimilarityRate(final int rgb1, final int rgb2) { + return getDissimilarityRate(red(rgb1), green(rgb1), blue(rgb1), red(rgb2), green(rgb2), blue(rgb2)); + } + + public int getDissimilarityRate(final byte red, final byte green, final byte blue) { + return getDissimilarityRate(this.red, this.green, this.blue, red, green, blue); + } + + public int getDissimilarityRate(@NonNull final MapImageColor other) { + return getDissimilarityRate(red, green, blue, other.red, other.green, other.blue); + } + + public int getDissimilarityRate(final int rgb) { + return getDissimilarityRate((byte) ((rgb >> 16) & 0xFF), (byte) ((rgb >> 8) & 0xFF), (byte) (rgb & 0xFF)); + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java new file mode 100644 index 000000000..a07e850b8 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java @@ -0,0 +1,307 @@ +package ru.progrm_jarvis.minecraft.commons.mapimage; + +import gnu.trove.impl.unmodifiable.TUnmodifiableIntByteMap; +import gnu.trove.map.TIntByteMap; +import gnu.trove.map.hash.TIntByteHashMap; +import lombok.experimental.UtilityClass; +import lombok.val; + +import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImageColor.NO_COLOR_CODE; +import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImageColor.asRgb; + +/** + * Utilities related to Minecraft color codes for a map. + */ +@UtilityClass +public class MapImageMinecraftColors { + + /** + * all available colors available in Minecraft associated with their {@link byte}-codes + *

+ * {@link + * Taken from Minecraft Wiki} + */ + public final TIntByteMap MINECRAFT_RGB_COLOR_CODES; + + /** + * all available colors available in Minecraft + *

+ * {@link + * Taken from Minecraft Wiki} + */ + private final int[] MINECRAFT_RGB_COLORS; + + static { + // + val minecraftColors = new TIntByteHashMap(NO_COLOR_CODE); + minecraftColors.put(asRgb((byte) 89, (byte) 125, (byte) 39), (byte) 4); + minecraftColors.put(asRgb((byte) 109, (byte) 153, (byte) 48), (byte) 5); + minecraftColors.put(asRgb((byte) 127, (byte) 178, (byte) 56), (byte) 6); + minecraftColors.put(asRgb((byte) 67, (byte) 94, (byte) 29), (byte) 7); + minecraftColors.put(asRgb((byte) 174, (byte) 164, (byte) 115), (byte) 8); + minecraftColors.put(asRgb((byte) 213, (byte) 201, (byte) 140), (byte) 9); + minecraftColors.put(asRgb((byte) 247, (byte) 233, (byte) 163), (byte) 10); + minecraftColors.put(asRgb((byte) 130, (byte) 123, (byte) 86), (byte) 11); + minecraftColors.put(asRgb((byte) 140, (byte) 140, (byte) 140), (byte) 12); + minecraftColors.put(asRgb((byte) 171, (byte) 171, (byte) 171), (byte) 13); + minecraftColors.put(asRgb((byte) 199, (byte) 199, (byte) 199), (byte) 14); + minecraftColors.put(asRgb((byte) 105, (byte) 105, (byte) 105), (byte) 15); + minecraftColors.put(asRgb((byte) 180, (byte) 0, (byte) 0), (byte) 16); + minecraftColors.put(asRgb((byte) 220, (byte) 0, (byte) 0), (byte) 17); + minecraftColors.put(asRgb((byte) 255, (byte) 0, (byte) 0), (byte) 18); + minecraftColors.put(asRgb((byte) 135, (byte) 0, (byte) 0), (byte) 19); + minecraftColors.put(asRgb((byte) 112, (byte) 112, (byte) 180), (byte) 20); + minecraftColors.put(asRgb((byte) 138, (byte) 138, (byte) 220), (byte) 21); + minecraftColors.put(asRgb((byte) 160, (byte) 160, (byte) 255), (byte) 22); + minecraftColors.put(asRgb((byte) 84, (byte) 84, (byte) 135), (byte) 23); + minecraftColors.put(asRgb((byte) 117, (byte) 117, (byte) 117), (byte) 24); + minecraftColors.put(asRgb((byte) 144, (byte) 144, (byte) 144), (byte) 25); + minecraftColors.put(asRgb((byte) 167, (byte) 167, (byte) 167), (byte) 26); + minecraftColors.put(asRgb((byte) 88, (byte) 88, (byte) 88), (byte) 27); + minecraftColors.put(asRgb((byte) 0, (byte) 87, (byte) 0), (byte) 28); + minecraftColors.put(asRgb((byte) 0, (byte) 106, (byte) 0), (byte) 29); + minecraftColors.put(asRgb((byte) 0, (byte) 124, (byte) 0), (byte) 30); + minecraftColors.put(asRgb((byte) 0, (byte) 65, (byte) 0), (byte) 31); + minecraftColors.put(asRgb((byte) 180, (byte) 180, (byte) 180), (byte) 32); + minecraftColors.put(asRgb((byte) 220, (byte) 220, (byte) 220), (byte) 33); + minecraftColors.put(asRgb((byte) 255, (byte) 255, (byte) 255), (byte) 34); + minecraftColors.put(asRgb((byte) 135, (byte) 135, (byte) 135), (byte) 35); + minecraftColors.put(asRgb((byte) 115, (byte) 118, (byte) 129), (byte) 36); + minecraftColors.put(asRgb((byte) 141, (byte) 144, (byte) 158), (byte) 37); + minecraftColors.put(asRgb((byte) 164, (byte) 168, (byte) 184), (byte) 38); + minecraftColors.put(asRgb((byte) 86, (byte) 88, (byte) 97), (byte) 39); + minecraftColors.put(asRgb((byte) 106, (byte) 76, (byte) 54), (byte) 40); + minecraftColors.put(asRgb((byte) 130, (byte) 94, (byte) 66), (byte) 41); + minecraftColors.put(asRgb((byte) 151, (byte) 109, (byte) 77), (byte) 42); + minecraftColors.put(asRgb((byte) 79, (byte) 57, (byte) 40), (byte) 43); + minecraftColors.put(asRgb((byte) 79, (byte) 79, (byte) 79), (byte) 44); + minecraftColors.put(asRgb((byte) 96, (byte) 96, (byte) 96), (byte) 45); + minecraftColors.put(asRgb((byte) 112, (byte) 112, (byte) 112), (byte) 46); + minecraftColors.put(asRgb((byte) 59, (byte) 59, (byte) 59), (byte) 47); + minecraftColors.put(asRgb((byte) 45, (byte) 45, (byte) 180), (byte) 48); + minecraftColors.put(asRgb((byte) 55, (byte) 55, (byte) 220), (byte) 49); + minecraftColors.put(asRgb((byte) 64, (byte) 64, (byte) 255), (byte) 50); + minecraftColors.put(asRgb((byte) 33, (byte) 33, (byte) 135), (byte) 51); + minecraftColors.put(asRgb((byte) 100, (byte) 84, (byte) 50), (byte) 52); + minecraftColors.put(asRgb((byte) 123, (byte) 102, (byte) 62), (byte) 53); + minecraftColors.put(asRgb((byte) 143, (byte) 119, (byte) 72), (byte) 54); + minecraftColors.put(asRgb((byte) 75, (byte) 63, (byte) 38), (byte) 55); + minecraftColors.put(asRgb((byte) 180, (byte) 177, (byte) 172), (byte) 56); + minecraftColors.put(asRgb((byte) 220, (byte) 217, (byte) 211), (byte) 57); + minecraftColors.put(asRgb((byte) 255, (byte) 252, (byte) 245), (byte) 58); + minecraftColors.put(asRgb((byte) 135, (byte) 133, (byte) 129), (byte) 59); + minecraftColors.put(asRgb((byte) 152, (byte) 89, (byte) 36), (byte) 60); + minecraftColors.put(asRgb((byte) 186, (byte) 109, (byte) 44), (byte) 61); + minecraftColors.put(asRgb((byte) 216, (byte) 127, (byte) 51), (byte) 62); + minecraftColors.put(asRgb((byte) 114, (byte) 67, (byte) 27), (byte) 63); + minecraftColors.put(asRgb((byte) 125, (byte) 53, (byte) 152), (byte) 64); + minecraftColors.put(asRgb((byte) 153, (byte) 65, (byte) 186), (byte) 65); + minecraftColors.put(asRgb((byte) 178, (byte) 76, (byte) 216), (byte) 66); + minecraftColors.put(asRgb((byte) 94, (byte) 40, (byte) 114), (byte) 67); + minecraftColors.put(asRgb((byte) 72, (byte) 108, (byte) 152), (byte) 68); + minecraftColors.put(asRgb((byte) 88, (byte) 132, (byte) 186), (byte) 69); + minecraftColors.put(asRgb((byte) 102, (byte) 153, (byte) 216), (byte) 70); + minecraftColors.put(asRgb((byte) 54, (byte) 81, (byte) 114), (byte) 71); + minecraftColors.put(asRgb((byte) 161, (byte) 161, (byte) 36), (byte) 72); + minecraftColors.put(asRgb((byte) 197, (byte) 197, (byte) 44), (byte) 73); + minecraftColors.put(asRgb((byte) 229, (byte) 229, (byte) 51), (byte) 74); + minecraftColors.put(asRgb((byte) 121, (byte) 121, (byte) 27), (byte) 75); + minecraftColors.put(asRgb((byte) 89, (byte) 144, (byte) 17), (byte) 76); + minecraftColors.put(asRgb((byte) 109, (byte) 176, (byte) 21), (byte) 77); + minecraftColors.put(asRgb((byte) 127, (byte) 204, (byte) 25), (byte) 78); + minecraftColors.put(asRgb((byte) 67, (byte) 108, (byte) 13), (byte) 79); + minecraftColors.put(asRgb((byte) 170, (byte) 89, (byte) 116), (byte) 80); + minecraftColors.put(asRgb((byte) 208, (byte) 109, (byte) 142), (byte) 81); + minecraftColors.put(asRgb((byte) 242, (byte) 127, (byte) 165), (byte) 82); + minecraftColors.put(asRgb((byte) 128, (byte) 67, (byte) 87), (byte) 83); + minecraftColors.put(asRgb((byte) 53, (byte) 53, (byte) 53), (byte) 84); + minecraftColors.put(asRgb((byte) 65, (byte) 65, (byte) 65), (byte) 85); + minecraftColors.put(asRgb((byte) 76, (byte) 76, (byte) 76), (byte) 86); + minecraftColors.put(asRgb((byte) 40, (byte) 40, (byte) 40), (byte) 87); + minecraftColors.put(asRgb((byte) 108, (byte) 108, (byte) 108), (byte) 88); + minecraftColors.put(asRgb((byte) 132, (byte) 132, (byte) 132), (byte) 89); + minecraftColors.put(asRgb((byte) 153, (byte) 153, (byte) 153), (byte) 90); + minecraftColors.put(asRgb((byte) 81, (byte) 81, (byte) 81), (byte) 91); + minecraftColors.put(asRgb((byte) 53, (byte) 89, (byte) 108), (byte) 92); + minecraftColors.put(asRgb((byte) 65, (byte) 109, (byte) 132), (byte) 93); + minecraftColors.put(asRgb((byte) 76, (byte) 127, (byte) 153), (byte) 94); + minecraftColors.put(asRgb((byte) 40, (byte) 67, (byte) 81), (byte) 95); + minecraftColors.put(asRgb((byte) 89, (byte) 44, (byte) 125), (byte) 96); + minecraftColors.put(asRgb((byte) 109, (byte) 54, (byte) 153), (byte) 97); + minecraftColors.put(asRgb((byte) 127, (byte) 63, (byte) 178), (byte) 98); + minecraftColors.put(asRgb((byte) 67, (byte) 33, (byte) 94), (byte) 99); + minecraftColors.put(asRgb((byte) 36, (byte) 53, (byte) 125), (byte) 100); + minecraftColors.put(asRgb((byte) 44, (byte) 65, (byte) 153), (byte) 101); + minecraftColors.put(asRgb((byte) 51, (byte) 76, (byte) 178), (byte) 102); + minecraftColors.put(asRgb((byte) 27, (byte) 40, (byte) 94), (byte) 103); + minecraftColors.put(asRgb((byte) 72, (byte) 53, (byte) 36), (byte) 104); + minecraftColors.put(asRgb((byte) 88, (byte) 65, (byte) 44), (byte) 105); + minecraftColors.put(asRgb((byte) 102, (byte) 76, (byte) 51), (byte) 106); + minecraftColors.put(asRgb((byte) 54, (byte) 40, (byte) 27), (byte) 107); + minecraftColors.put(asRgb((byte) 72, (byte) 89, (byte) 36), (byte) 108); + minecraftColors.put(asRgb((byte) 88, (byte) 109, (byte) 44), (byte) 109); + minecraftColors.put(asRgb((byte) 102, (byte) 127, (byte) 51), (byte) 110); + minecraftColors.put(asRgb((byte) 54, (byte) 67, (byte) 27), (byte) 111); + minecraftColors.put(asRgb((byte) 108, (byte) 36, (byte) 36), (byte) 112); + minecraftColors.put(asRgb((byte) 132, (byte) 44, (byte) 44), (byte) 113); + minecraftColors.put(asRgb((byte) 153, (byte) 51, (byte) 51), (byte) 114); + minecraftColors.put(asRgb((byte) 81, (byte) 27, (byte) 27), (byte) 115); + minecraftColors.put(asRgb((byte) 17, (byte) 17, (byte) 17), (byte) 116); + minecraftColors.put(asRgb((byte) 21, (byte) 21, (byte) 21), (byte) 117); + minecraftColors.put(asRgb((byte) 25, (byte) 25, (byte) 25), (byte) 118); + minecraftColors.put(asRgb((byte) 13, (byte) 13, (byte) 13), (byte) 119); + minecraftColors.put(asRgb((byte) 176, (byte) 168, (byte) 54), (byte) 120); + minecraftColors.put(asRgb((byte) 215, (byte) 205, (byte) 66), (byte) 121); + minecraftColors.put(asRgb((byte) 250, (byte) 238, (byte) 77), (byte) 122); + minecraftColors.put(asRgb((byte) 132, (byte) 126, (byte) 40), (byte) 123); + minecraftColors.put(asRgb((byte) 64, (byte) 154, (byte) 150), (byte) 124); + minecraftColors.put(asRgb((byte) 79, (byte) 188, (byte) 183), (byte) 125); + minecraftColors.put(asRgb((byte) 92, (byte) 219, (byte) 213), (byte) 126); + minecraftColors.put(asRgb((byte) 48, (byte) 115, (byte) 112), (byte) 127); + minecraftColors.put(asRgb((byte) 52, (byte) 90, (byte) 180), (byte) 128); + minecraftColors.put(asRgb((byte) 63, (byte) 110, (byte) 220), (byte) 129); + minecraftColors.put(asRgb((byte) 74, (byte) 128, (byte) 255), (byte) 130); + minecraftColors.put(asRgb((byte) 39, (byte) 67, (byte) 135), (byte) 131); + minecraftColors.put(asRgb((byte) 0, (byte) 153, (byte) 40), (byte) 132); + minecraftColors.put(asRgb((byte) 0, (byte) 187, (byte) 50), (byte) 133); + minecraftColors.put(asRgb((byte) 0, (byte) 217, (byte) 58), (byte) 134); + minecraftColors.put(asRgb((byte) 0, (byte) 114, (byte) 30), (byte) 135); + minecraftColors.put(asRgb((byte) 91, (byte) 60, (byte) 34), (byte) 136); + minecraftColors.put(asRgb((byte) 111, (byte) 74, (byte) 42), (byte) 137); + minecraftColors.put(asRgb((byte) 129, (byte) 86, (byte) 49), (byte) 138); + minecraftColors.put(asRgb((byte) 68, (byte) 45, (byte) 25), (byte) 139); + minecraftColors.put(asRgb((byte) 79, (byte) 1, (byte) 0), (byte) 140); + minecraftColors.put(asRgb((byte) 96, (byte) 1, (byte) 0), (byte) 141); + minecraftColors.put(asRgb((byte) 112, (byte) 2, (byte) 0), (byte) 142); + minecraftColors.put(asRgb((byte) 59, (byte) 1, (byte) 0), (byte) 143); + minecraftColors.put(asRgb((byte) 147, (byte) 124, (byte) 113), (byte) 144); + minecraftColors.put(asRgb((byte) 180, (byte) 152, (byte) 138), (byte) 145); + minecraftColors.put(asRgb((byte) 209, (byte) 177, (byte) 161), (byte) 146); + minecraftColors.put(asRgb((byte) 110, (byte) 93, (byte) 85), (byte) 147); + minecraftColors.put(asRgb((byte) 112, (byte) 57, (byte) 25), (byte) 148); + minecraftColors.put(asRgb((byte) 137, (byte) 70, (byte) 31), (byte) 149); + minecraftColors.put(asRgb((byte) 159, (byte) 82, (byte) 36), (byte) 150); + minecraftColors.put(asRgb((byte) 84, (byte) 43, (byte) 19), (byte) 151); + minecraftColors.put(asRgb((byte) 105, (byte) 61, (byte) 76), (byte) 152); + minecraftColors.put(asRgb((byte) 128, (byte) 75, (byte) 93), (byte) 153); + minecraftColors.put(asRgb((byte) 149, (byte) 87, (byte) 108), (byte) 154); + minecraftColors.put(asRgb((byte) 78, (byte) 46, (byte) 57), (byte) 155); + minecraftColors.put(asRgb((byte) 79, (byte) 76, (byte) 97), (byte) 156); + minecraftColors.put(asRgb((byte) 96, (byte) 93, (byte) 119), (byte) 157); + minecraftColors.put(asRgb((byte) 112, (byte) 108, (byte) 138), (byte) 158); + minecraftColors.put(asRgb((byte) 59, (byte) 57, (byte) 73), (byte) 159); + minecraftColors.put(asRgb((byte) 131, (byte) 93, (byte) 25), (byte) 160); + minecraftColors.put(asRgb((byte) 160, (byte) 114, (byte) 31), (byte) 161); + minecraftColors.put(asRgb((byte) 186, (byte) 133, (byte) 36), (byte) 162); + minecraftColors.put(asRgb((byte) 98, (byte) 70, (byte) 19), (byte) 163); + minecraftColors.put(asRgb((byte) 72, (byte) 82, (byte) 37), (byte) 164); + minecraftColors.put(asRgb((byte) 88, (byte) 100, (byte) 45), (byte) 165); + minecraftColors.put(asRgb((byte) 103, (byte) 117, (byte) 53), (byte) 166); + minecraftColors.put(asRgb((byte) 54, (byte) 61, (byte) 28), (byte) 167); + minecraftColors.put(asRgb((byte) 112, (byte) 54, (byte) 55), (byte) 168); + minecraftColors.put(asRgb((byte) 138, (byte) 66, (byte) 67), (byte) 169); + minecraftColors.put(asRgb((byte) 160, (byte) 77, (byte) 78), (byte) 170); + minecraftColors.put(asRgb((byte) 84, (byte) 40, (byte) 41), (byte) 171); + minecraftColors.put(asRgb((byte) 40, (byte) 28, (byte) 24), (byte) 172); + minecraftColors.put(asRgb((byte) 49, (byte) 35, (byte) 30), (byte) 173); + minecraftColors.put(asRgb((byte) 57, (byte) 41, (byte) 35), (byte) 174); + minecraftColors.put(asRgb((byte) 30, (byte) 21, (byte) 18), (byte) 175); + minecraftColors.put(asRgb((byte) 95, (byte) 75, (byte) 69), (byte) 176); + minecraftColors.put(asRgb((byte) 116, (byte) 92, (byte) 84), (byte) 177); + minecraftColors.put(asRgb((byte) 135, (byte) 107, (byte) 98), (byte) 178); + minecraftColors.put(asRgb((byte) 71, (byte) 56, (byte) 51), (byte) 179); + minecraftColors.put(asRgb((byte) 61, (byte) 64, (byte) 64), (byte) 180); + minecraftColors.put(asRgb((byte) 75, (byte) 79, (byte) 79), (byte) 181); + minecraftColors.put(asRgb((byte) 87, (byte) 92, (byte) 92), (byte) 182); + minecraftColors.put(asRgb((byte) 46, (byte) 48, (byte) 48), (byte) 183); + minecraftColors.put(asRgb((byte) 86, (byte) 51, (byte) 62), (byte) 184); + minecraftColors.put(asRgb((byte) 105, (byte) 62, (byte) 75), (byte) 185); + minecraftColors.put(asRgb((byte) 122, (byte) 73, (byte) 88), (byte) 186); + minecraftColors.put(asRgb((byte) 64, (byte) 38, (byte) 46), (byte) 187); + minecraftColors.put(asRgb((byte) 53, (byte) 43, (byte) 64), (byte) 188); + minecraftColors.put(asRgb((byte) 65, (byte) 53, (byte) 79), (byte) 189); + minecraftColors.put(asRgb((byte) 76, (byte) 62, (byte) 92), (byte) 190); + minecraftColors.put(asRgb((byte) 40, (byte) 32, (byte) 48), (byte) 191); + minecraftColors.put(asRgb((byte) 53, (byte) 35, (byte) 24), (byte) 192); + minecraftColors.put(asRgb((byte) 65, (byte) 43, (byte) 30), (byte) 193); + minecraftColors.put(asRgb((byte) 76, (byte) 50, (byte) 35), (byte) 194); + minecraftColors.put(asRgb((byte) 40, (byte) 26, (byte) 18), (byte) 195); + minecraftColors.put(asRgb((byte) 53, (byte) 57, (byte) 29), (byte) 196); + minecraftColors.put(asRgb((byte) 65, (byte) 70, (byte) 36), (byte) 197); + minecraftColors.put(asRgb((byte) 76, (byte) 82, (byte) 42), (byte) 198); + minecraftColors.put(asRgb((byte) 40, (byte) 43, (byte) 22), (byte) 199); + minecraftColors.put(asRgb((byte) 100, (byte) 42, (byte) 32), (byte) 200); + minecraftColors.put(asRgb((byte) 122, (byte) 51, (byte) 39), (byte) 201); + minecraftColors.put(asRgb((byte) 142, (byte) 60, (byte) 46), (byte) 202); + minecraftColors.put(asRgb((byte) 75, (byte) 31, (byte) 24), (byte) 203); + minecraftColors.put(asRgb((byte) 26, (byte) 15, (byte) 11), (byte) 204); + minecraftColors.put(asRgb((byte) 31, (byte) 18, (byte) 13), (byte) 205); + minecraftColors.put(asRgb((byte) 37, (byte) 22, (byte) 16), (byte) 206); + minecraftColors.put(asRgb((byte) 19, (byte) 11, (byte) 8), (byte) 207); + + MINECRAFT_RGB_COLOR_CODES = new TUnmodifiableIntByteMap(minecraftColors); + MINECRAFT_RGB_COLORS = MINECRAFT_RGB_COLOR_CODES.keys(); + // + } + + /** + * Creates a new primitive map + * with keys being an {@link int} representation of an RGB color in Minecraft map + * and value being its code in Minecraft. + * + * @return primitive map of available map color codes in minecraft by their RGB colors + */ + public TIntByteMap asNewPrimitiveMap() { + return new TIntByteHashMap(MINECRAFT_RGB_COLOR_CODES); + } + + /////////////////////////////////////////////////////////////////////////// + // Minecraft color conversions + /////////////////////////////////////////////////////////////////////////// + + /** + * Checks whether the specified color can be shown on a map without any distortion. + * + * @param rgb RGB color as {@link int} + * @return {@code true} if this color can be shown on an in-game map without distortion anf {@code false} otherwise + */ + public boolean isMinecraftColor(final int rgb) { + for (val minecraftRgbColor : MINECRAFT_RGB_COLORS) if (rgb == minecraftRgbColor) return true; + return false; + } + + /** + * Checks whether the specified color can be shown on a map without any distortion. + * + * @param red red channel of the RGB color + * @param green green channel of the RGB color + * @param blue blue channel of the RGB color + * @return {@code true} if this color can be shown on an in-game map without distortion anf {@code false} otherwise + */ + public boolean isMinecraftColor(final byte red, final byte green, final byte blue) { + return isMinecraftColor(asRgb(red, green, blue)); + } + + /** + * Gets Minecraft map color code for the specified color. + * + * @param rgb RGB color as {@link int} + * @return non-zero value being the found minecraft code for the color or {@code 0} if none was found + */ + public byte getMinecraftColorCode(final int rgb) { + return MINECRAFT_RGB_COLOR_CODES.get(rgb); + } + + /** + * Gets Minecraft map color code for the specified color. + * + * @param red red channel of the RGB color + * @param green green channel of the RGB color + * @param blue blue channel of the RGB color + * @return value being the found minecraft code for the color + * or {@link MapImageColor#NO_COLOR_CODE} if none was found + */ + public byte getMinecraftColorCode(final byte red, final byte green, final byte blue) { + return MINECRAFT_RGB_COLOR_CODES.get(asRgb(red, green, blue)); + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java new file mode 100644 index 000000000..ca162239a --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java @@ -0,0 +1,80 @@ +package ru.progrm_jarvis.minecraft.commons.mapimage; + +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import lombok.val; +import lombok.var; + +import java.awt.*; +import java.awt.image.BufferedImage; + +import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.HEIGHT; +import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.WIDTH; + +/** + * Utilities related to {@link MapImage}. + */ +@UtilityClass +public class MapImages { + + /** + * Normalizes the RGB-pixels 2-dimensional array making them valid Minecraft {@link MapImageColor}s. + * + * @param pixels pixels to normalizes + * @return 2-dimensional array of valid Minecraft map color IDs. + */ + protected static byte[][] normalizePixels(final int[][] pixels) { + val normalizedPixels = new byte[WIDTH][HEIGHT]; + for (var x = 0; x < WIDTH; x++) { + val column = pixels[x]; + for (var y = 0; y < HEIGHT; y++) normalizedPixels[x][y] = MapImageColor.getClosestColorCode(column[y]); + } + + return normalizedPixels; + } + + /** + * Gets the 2-dimensional {@link byte}-array (the 1-st index is columns, the 2-nd index is rows) + * of size {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} of RGB-{@link int} colors. + * + * @param image image whose pixels to get + * @param resize whether the image should be resized or cut to fit map image dimensions + * @return 2-dimensional array of RGB-{@link int} colors. + */ + public int[][] getNonNormalizedMapImagePixels(@NonNull BufferedImage image, final boolean resize) { + final int width = image.getWidth(), height = image.getHeight(); + + // if an image is of wrong size and should be resized (but not cut) then perform resizing + if (width != WIDTH || height != HEIGHT || !resize) { + // resizing + // create new image of valid size + val newImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); + // draw the resized image on + val graphics = image.getGraphics(); + graphics.drawImage( + image.getScaledInstance(WIDTH, HEIGHT, Image.SCALE_SMOOTH), 0, 0, null + ); + graphics.dispose(); + image = newImage; + } + + val pixels = new int[WIDTH][HEIGHT]; + + for (var x = 0; x < WIDTH; x++) for (var y = 0; y < HEIGHT; y++) pixels[x][y] + = image.getRGB(x, y); + + return pixels; + } + + /** + * Gets the 2-dimensional {@link byte}-array (the 1-st index is columns, the 2-nd index is rows) + * of size {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} of valid map color ids. + * + * @param image image whose pixels to get + * @param resize whether the image should be resized or cut to fit map image dimensions + * @return 2-dimensional array of {@link MapImageColor} IDs valid for minecraft. + */ + public byte[][] getMapImagePixels(@NonNull final BufferedImage image, final boolean resize) { + return normalizePixels(getNonNormalizedMapImagePixels(image, resize)); + } +} From bd50a04f618b547fd3cd55ccf96c0f90bc39c73c Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 30 Dec 2018 16:05:47 +0300 Subject: [PATCH 064/508] Fix MapImage API compilation --- .../minecraft/commons/mapimage/DefaultMapImage.java | 2 +- .../ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java | 2 +- .../progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index f36636420..ef21b01c1 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -166,7 +166,7 @@ public Delta getDelta() { // for each column copy its rows from leastChangedX to mostChangedX to the next available // row in changedPixels copying from leastChangedY to mostChangedY (of yLength) // indexing happens from 0 by each axis, so i is target array index, and x is source array index (column) - for (var x = leastChangedX, i = 0; x < mostChangedX; x++, i++) System.arraycopy( + for (int x = leastChangedX, i = 0; x < mostChangedX; x++, i++) System.arraycopy( pixels[x] /* source column */, leastChangedY, changedPixels[i] /* target column*/, 0, yLength ); diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java index be234e472..03588ff10 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java @@ -324,7 +324,6 @@ default Delta pickDelta() { * * @see BufferedDrawer most common use-case of delta */ - @FieldDefaults(level = AccessLevel.PRIVATE) interface Delta { /** @@ -418,6 +417,7 @@ public int leastY() { */ @Value @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE) class NonEmpty implements Delta { byte[][] pixels; diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java index 337b9ef4d..7a7640f0a 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java @@ -120,7 +120,7 @@ public static byte getClosestColorCode(final MapImageColor color) { final byte colorCode; val minecraftColorCode = MapImageMinecraftColors.getMinecraftColorCode(rgb); - if (minecraftColorCode == MapImageMinecraftColors.NO_COLOR_CODE) { + if (minecraftColorCode == NO_COLOR_CODE) { var minDistanceSquared = Integer.MAX_VALUE; var closestColor = 0; From ec5a2d6b25d4026acc174aed528b1981e87c445d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 30 Dec 2018 16:06:38 +0300 Subject: [PATCH 065/508] Make player-utils part of minecraft-commons --- .../minecraft/commons/player}/PlayerUtil.java | 2 +- .../player}/collection/PlayerContainer.java | 2 +- .../player}/collection/PlayerContainers.java | 2 +- .../commons/player}/package-info.java | 2 +- .../registry/DefaultPlayerRegistry.java | 4 ++-- .../player}/registry/PlayerRegistries.java | 6 ++--- .../player}/registry/PlayerRegistry.java | 6 ++--- fake-entity/pom.xml | 4 ---- .../fakeentitylib/entity/FakeEntity.java | 2 +- player/pom.xml | 23 ------------------- pom.xml | 6 ----- 11 files changed, 13 insertions(+), 46 deletions(-) rename {player/src/main/java/ru/progrm_jarvis/minecraft/playerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player}/PlayerUtil.java (94%) rename {player/src/main/java/ru/progrm_jarvis/minecraft/playerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player}/collection/PlayerContainer.java (97%) rename {player/src/main/java/ru/progrm_jarvis/minecraft/playerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player}/collection/PlayerContainers.java (97%) rename {player/src/main/java/ru/progrm_jarvis/minecraft/playerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player}/package-info.java (63%) rename {player/src/main/java/ru/progrm_jarvis/minecraft/playerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player}/registry/DefaultPlayerRegistry.java (96%) rename {player/src/main/java/ru/progrm_jarvis/minecraft/playerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player}/registry/PlayerRegistries.java (90%) rename {player/src/main/java/ru/progrm_jarvis/minecraft/playerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player}/registry/PlayerRegistry.java (81%) delete mode 100644 player/pom.xml diff --git a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/PlayerUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java similarity index 94% rename from player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/PlayerUtil.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java index ce840cdf9..8476273f6 100644 --- a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/PlayerUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.playerutils; +package ru.progrm_jarvis.minecraft.commons.player; import lombok.NonNull; import lombok.experimental.UtilityClass; diff --git a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/collection/PlayerContainer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java similarity index 97% rename from player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/collection/PlayerContainer.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java index a4895e1b5..b13cdad78 100644 --- a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/collection/PlayerContainer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.playerutils.collection; +package ru.progrm_jarvis.minecraft.commons.player.collection; import lombok.val; import org.bukkit.Bukkit; diff --git a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/collection/PlayerContainers.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java similarity index 97% rename from player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/collection/PlayerContainers.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java index be7745caa..4a9cadf98 100644 --- a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/collection/PlayerContainers.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.playerutils.collection; +package ru.progrm_jarvis.minecraft.commons.player.collection; import lombok.NonNull; import lombok.Value; diff --git a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/package-info.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/package-info.java similarity index 63% rename from player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/package-info.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/package-info.java index 4a9f15ba7..11b3ea7ed 100644 --- a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/package-info.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/package-info.java @@ -1,4 +1,4 @@ /** * A set of utilities useful for {@link org.bukkit.entity.Player} interactions. */ -package ru.progrm_jarvis.minecraft.playerutils; \ No newline at end of file +package ru.progrm_jarvis.minecraft.commons.player; \ No newline at end of file diff --git a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/registry/DefaultPlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java similarity index 96% rename from player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/registry/DefaultPlayerRegistry.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java index 9ac730347..3ca29a7ac 100644 --- a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/registry/DefaultPlayerRegistry.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.playerutils.registry; +package ru.progrm_jarvis.minecraft.commons.player.registry; import com.google.common.base.Preconditions; import lombok.AccessLevel; @@ -14,7 +14,7 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.Plugin; -import ru.progrm_jarvis.minecraft.playerutils.collection.PlayerContainer; +import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainer; import java.util.Collections; import java.util.HashSet; diff --git a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/registry/PlayerRegistries.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java similarity index 90% rename from player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/registry/PlayerRegistries.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java index 8c29d5731..03f020195 100644 --- a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/registry/PlayerRegistries.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java @@ -1,12 +1,12 @@ -package ru.progrm_jarvis.minecraft.playerutils.registry; +package ru.progrm_jarvis.minecraft.commons.player.registry; import com.google.common.base.MoreObjects; import lombok.NonNull; import lombok.experimental.UtilityClass; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -import ru.progrm_jarvis.minecraft.playerutils.collection.PlayerContainer; -import ru.progrm_jarvis.minecraft.playerutils.collection.PlayerContainers; +import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainer; +import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainers; import java.util.Collection; import java.util.Map; diff --git a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/registry/PlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java similarity index 81% rename from player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/registry/PlayerRegistry.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java index 20b537440..a95f634b7 100644 --- a/player/src/main/java/ru/progrm_jarvis/minecraft/playerutils/registry/PlayerRegistry.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java @@ -1,10 +1,10 @@ -package ru.progrm_jarvis.minecraft.playerutils.registry; +package ru.progrm_jarvis.minecraft.commons.player.registry; import lombok.NonNull; import lombok.val; import org.bukkit.entity.Player; -import ru.progrm_jarvis.minecraft.playerutils.collection.PlayerContainer; -import ru.progrm_jarvis.minecraft.playerutils.collection.PlayerContainers; +import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainer; +import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainers; import java.util.Collection; import java.util.Map; diff --git a/fake-entity/pom.xml b/fake-entity/pom.xml index 9d54b0f6a..63b9f8822 100644 --- a/fake-entity/pom.xml +++ b/fake-entity/pom.xml @@ -29,10 +29,6 @@ ${project.parent.groupId} nms-utils - - ${project.parent.groupId} - player-utils - org.spigotmc diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java index 84aa0fbdb..3f18e20bf 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java @@ -3,7 +3,7 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; -import ru.progrm_jarvis.minecraft.playerutils.collection.PlayerContainer; +import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainer; import java.util.Collection; diff --git a/player/pom.xml b/player/pom.xml deleted file mode 100644 index adc265000..000000000 --- a/player/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - 4.0.0 - - minecraft-utils - ru.progrm-jarvis.minecraft - 0.1.0-SNAPSHOT - - player-utils - - - - org.spigotmc - spigot-api - - - - org.projectlombok - lombok - - - \ No newline at end of file diff --git a/pom.xml b/pom.xml index 0a26c0fbc..b1f9b1306 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,6 @@ commons nms scheduler - player config fake-entity @@ -225,11 +224,6 @@ scheduler-utils ${project.version} - - ${project.groupId} - player-utils - ${project.version} - ${project.groupId} ez-cfg From 6ca80264e1e363225ad3265517e8d643d0eb391f Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 30 Dec 2018 16:22:20 +0300 Subject: [PATCH 066/508] Make DefaultImage#BufferedDrawer#fill() update least/mostChangedX/Y --- .../minecraft/commons/mapimage/DefaultMapImage.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index ef21b01c1..6ab926a3f 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -205,6 +205,9 @@ public MapImage.Drawer fill(final byte color) { unchanged = false; for (val column : buffer) Arrays.fill(column, color); + leastChangedX = leastChangedY = 0; + mostChangedX = WIDTH; + mostChangedY = HEIGHT; return this; } From b8226edce94470b4a12c51a8d17e3e9224cc4d5b Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 30 Dec 2018 23:26:50 +0300 Subject: [PATCH 067/508] Rework MapImage update and disposal logic --- .../commons/mapimage/DefaultMapImage.java | 49 +++++++- .../minecraft/commons/mapimage/MapImage.java | 114 ++++++++++++++---- .../commons/mapimage/MapImageTest.java | 83 +++++++++++++ 3 files changed, 221 insertions(+), 25 deletions(-) create mode 100644 commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index 6ab926a3f..6b1958aa2 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -2,11 +2,14 @@ import lombok.*; import lombok.experimental.FieldDefaults; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazies; import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazy; import java.awt.image.BufferedImage; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import static com.google.common.base.Preconditions.checkArgument; import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.blankPixels; @@ -34,6 +37,11 @@ public class DefaultMapImage implements MapImage { */ Lazy bufferedDrawer = Lazies.lazy(BufferedDrawer::new); + /** + * All subscribers active. + */ + Collection> updateSubscribers = new ArrayList<>(); + /** * Creates new map image from pixels. * @@ -67,6 +75,34 @@ public static DefaultMapImage from(@NonNull final BufferedImage image, final boo return new DefaultMapImage(MapImages.getMapImagePixels(image, resize)); } + /////////////////////////////////////////////////////////////////////////// + // Updates and Subscriptions logic + /////////////////////////////////////////////////////////////////////////// + + @Override + public boolean isSubscribable() { + return true; + } + + @Override + public void subscribeOnUpdates(final UncheckedConsumer subscriber) { + updateSubscribers.add(subscriber); + } + + @Override + public void unsubscribeFromUpdates(final UncheckedConsumer subscriber) { + updateSubscribers.remove(subscriber); + } + + @Override + public void onUpdate(@NonNull final Delta delta) { + for (val updateSubscriber : updateSubscribers) updateSubscriber.accept(delta); + } + + /////////////////////////////////////////////////////////////////////////// + // Drawers + /////////////////////////////////////////////////////////////////////////// + @Override public MapImage.Drawer drawer() { return drawer.get(); @@ -140,9 +176,12 @@ protected void reset() { } @Override - public MapImage.Drawer dispose() { - // disposal is not needed if there are no changes - if (!unchanged) { + public Delta dispose() { + // real disposal should happen only if there are changes + val delta = getDelta(); + + // perform image update only if delta is not empty (there are changes) + if (!delta.isEmpty()) { for (var x = leastChangedX; x <= mostChangedX; x++) { if (mostChangedY + 1 - leastChangedY >= 0) System.arraycopy( buffer[x], leastChangedY, pixels[x], leastChangedY, mostChangedY + 1 - leastChangedY @@ -150,9 +189,11 @@ public MapImage.Drawer dispose() { } reset(); + + onUpdate(delta); } - return this; + return delta; } @Override diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java index 03588ff10..74b1691fb 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java @@ -1,13 +1,12 @@ package ru.progrm_jarvis.minecraft.commons.mapimage; -import lombok.AccessLevel; -import lombok.Value; +import lombok.*; import lombok.experimental.Accessors; import lombok.experimental.FieldDefaults; -import lombok.val; -import lombok.var; import org.jetbrains.annotations.Contract; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; +import javax.annotation.Nonnull; import java.util.Arrays; /** @@ -56,6 +55,49 @@ public interface MapImage { */ BufferedDrawer bufferedDrawer(); + /** + * Handler for performed update (called whenever an update happens). + * + * @param delta delta of the image update + * @apiNote may not be called whenever there are no changes, but yet should normally handle empty deltas + */ + default void onUpdate(@NonNull final Delta delta) {} + + /** + * Checks whether this map image allows subscriptions on updates. + * + * @return {@code true} if this map image allows update subscriptions and {@code false} otherwise + */ + default boolean isSubscribable() { + return false; + } + + /** + * Subscribes on this image's updates. + * + * @param subscriber subscriber to be notified whenever an image is updated + * @throws UnsupportedOperationException if this map image doesn't allow update subscriptions + * + * @apiNote may not be called whenever there are no changes, but yet should normally handle empty deltas + * @implSpec may be unavailable, check {@link #isSubscribable()} before usage + */ + default void subscribeOnUpdates(final UncheckedConsumer subscriber) { + throw new UnsupportedOperationException(getClass() + " doesn't support update subscriptions"); + } + + /** + * Unsubscribes from this image's updates. + * + * @param subscriber subscriber to stop being notified on image updates + * @throws UnsupportedOperationException if this map image doesn't allow update subscriptions + * + * @implSpec should do nothing if the callback is not subscribed + * @implSpec may be unavailable, check {@link #isSubscribable()} before usage + */ + default void unsubscribeFromUpdates(final UncheckedConsumer subscriber) { + throw new UnsupportedOperationException(getClass() + " doesn't support update subscriptions"); + } + /** * Makes all pixels of the specified array blank ({@link MapImageColor#NO_COLOR_CODE}). * @@ -300,23 +342,13 @@ interface BufferedDrawer extends Drawer { /** * Disposes the image. Disposal means applying all changes to the source Map image. + * This method should call source image's {@link #onUpdate(Delta)} with the actual delta + * whenever it is not empty. * - * @return this drawer for chaining + * @return delta disposed + * @apiNote may not call {@link #onUpdate(Delta)} if the delta is empty */ - @Contract(" -> this") - Drawer dispose(); - - /** - * Gets the delta of the image which this drawer is having disposing the image. - * - * @return delta of the image - */ - default Delta pickDelta() { - val delta = getDelta(); - dispose(); - - return delta; - } + Delta dispose(); } /** @@ -378,8 +410,10 @@ interface Delta { * @return empty delta if {@code pixels} is empty or {@code leastX} or {@code leastY} is {@link Delta#NONE} * and non-empty delta otherwise */ - static Delta of(final byte[][] pixels, final int leastX, final int leastY) { - if (pixels.length == 0 || leastX == NONE || leastY == NONE) return EMPTY; + @Nonnull static Delta of(final byte[][] pixels, final int leastX, final int leastY) { + val pixelsLength = pixels.length; + if (pixelsLength == 0 || leastX == NONE || leastY == NONE) return EMPTY; + if (pixelsLength == 1 && pixels[0].length == 1) return new SinglePixel(pixels, leastX, leastY); return new NonEmpty(pixels, leastX, leastY); } @@ -429,5 +463,43 @@ public boolean isEmpty() { return false; } } + + /** + * Delta affecting only one single pixel of an image. + */ + @Value + @Getter(AccessLevel.NONE) // not generate getter due to other names of fields + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + class SinglePixel implements Delta { + + public SinglePixel(final byte color, final int x, final int y) { + this(new byte[][]{{color}}, x, y); + } + + byte[][] pixel; + + int x, y; + + @Override + public byte[][] pixels() { + return pixel; + } + + @Override + public int leastX() { + return x; + } + + @Override + public int leastY() { + return y; + } + + @Override + public boolean isEmpty() { + return false; + } + } } } diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java new file mode 100644 index 000000000..b7f3d306f --- /dev/null +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java @@ -0,0 +1,83 @@ +package ru.progrm_jarvis.minecraft.commons.mapimage; + +import lombok.val; +import lombok.var; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.Test; +import ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.Delta; + +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.*; + +class MapImageTest { + + /////////////////////////////////////////////////////////////////////////// + // Delta + /////////////////////////////////////////////////////////////////////////// + + @Test + void testDeltaOf() { + assertTrue(Delta.EMPTY.isEmpty()); + + assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 0, 0)); + assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 0, 135)); + assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 1213, 0)); + assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 125, 65)); + assertSame(Delta.EMPTY, Delta.of(new byte[0][0], -12, 24)); + assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 19, -32)); + assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 12, -24)); + + assertSame(Delta.EMPTY, Delta.of(new byte[1][0], Delta.NONE, 100)); + assertSame(Delta.EMPTY, Delta.of(new byte[0][3], Delta.NONE, 100)); + assertSame(Delta.EMPTY, Delta.of(new byte[1][3], 80, Delta.NONE)); + assertSame(Delta.EMPTY, Delta.of(new byte[12][23], Delta.NONE, Delta.NONE)); + assertSame(Delta.EMPTY, Delta.of(new byte[10][2], Delta.NONE, Delta.NONE)); + + assertSame(Delta.EMPTY, Delta.of(new byte[1][1], Delta.NONE, 100)); + assertSame(Delta.EMPTY, Delta.of(new byte[1][1], 102, Delta.NONE)); + assertSame(Delta.EMPTY, Delta.of(new byte[1][1], Delta.NONE, Delta.NONE)); + + assertEquals(new Delta.SinglePixel((byte) 1, 10, 10), Delta.of(new byte[][]{{1}}, 10, 10)); + assertEquals(new Delta.SinglePixel((byte) 32, 100, 10), Delta.of(new byte[][]{{32}}, 100, 10)); + assertEquals(new Delta.SinglePixel((byte) 12, 100, 92), Delta.of(new byte[][]{{12}}, 100, 92)); + assertEquals(new Delta.SinglePixel((byte) -127, 13, 12), Delta.of(new byte[][]{{-127}}, 13, 12)); + assertEquals(new Delta.SinglePixel((byte) 127, 28, 10), Delta.of(new byte[][]{{127}}, 28, 10)); + assertEquals(new Delta.SinglePixel((byte) -128, 23, 23), Delta.of(new byte[][]{{-128}}, 23, 23)); + assertEquals(new Delta.SinglePixel((byte) -23, 25, 122), Delta.of(new byte[][]{{-23}}, 25, 122)); + + assertEquals(new Delta.SinglePixel((byte) 1, 10, 10), Delta.of(new byte[][]{{1}}, 10, 10)); + assertEquals(new Delta.SinglePixel((byte) 32, 100, 10), Delta.of(new byte[][]{{32}}, 100, 10)); + assertEquals(new Delta.SinglePixel((byte) 12, 100, 92), Delta.of(new byte[][]{{12}}, 100, 92)); + assertEquals(new Delta.SinglePixel((byte) -127, 13, 12), Delta.of(new byte[][]{{-127}}, 13, 12)); + assertEquals(new Delta.SinglePixel((byte) 127, 28, 10), Delta.of(new byte[][]{{127}}, 28, 10)); + assertEquals(new Delta.SinglePixel((byte) -128, 23, 23), Delta.of(new byte[][]{{-128}}, 23, 23)); + assertEquals(new Delta.SinglePixel((byte) -23, 25, 12), Delta.of(new byte[][]{{-23}}, 25, 12)); + + val random = new Random(); + + for (var i = 0; i < 128 + random.nextInt(128); i++) { + final int + xLength = 2 + random.nextInt(MapImage.WIDTH - 1), // [2 ; WIDTH] + yLength = 2 + random.nextInt(MapImage.HEIGHT - 1), // [2 ; HEIGHT] + leastX = random.nextInt(MapImage.WIDTH - xLength + 1), // [0 ; WIDTH - xLength] + leastY = random.nextInt(MapImage.HEIGHT - yLength + 1); // [0 ; HEIGHT - yLength] + + val pixels = new byte[xLength][yLength]; + // populate pixels with random values + for (val column : pixels) random.nextBytes(column); + + val pixelsCopy = new byte[xLength][yLength]; + for (int k = 0; k < pixelsCopy.length; k++) pixelsCopy[k] = pixels[k].clone(); + + // verify that pixels were normally copied + assertArrayEquals(pixels, pixelsCopy); + + MatcherAssert.assertThat( + new Delta.NonEmpty(pixelsCopy, leastX, leastY), + Matchers.is(Delta.of(pixels, leastX, leastY)) + ); + } + } +} \ No newline at end of file From 6fee2eb9fbb6b615326f314c5cb8c4fe558ad11e Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 30 Dec 2018 23:30:26 +0300 Subject: [PATCH 068/508] Get rid of checkInterval in PlayerRegistries --- .../player/registry/DefaultPlayerRegistry.java | 11 +++++------ .../player/registry/PlayerRegistries.java | 16 ++++------------ 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java index 3ca29a7ac..91aa84aeb 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java @@ -35,8 +35,7 @@ public class DefaultPlayerRegistry implements PlayerRegistry { Lock playerContainersReadLock = playerContainersLock.readLock(); Lock playerContainersWriteLock = playerContainersLock.writeLock(); - public DefaultPlayerRegistry(@NonNull final Plugin plugin, @NonNull final Set playerSet, - final long checkInterval) { + public DefaultPlayerRegistry(@NonNull final Plugin plugin, @NonNull final Set playerSet) { Preconditions.checkArgument(playerSet.isEmpty(), "playerSet should be empty"); this.plugin = plugin; @@ -56,12 +55,12 @@ public final void onPlayerQuit(final PlayerQuitEvent event) { }, plugin); } - public DefaultPlayerRegistry(@NonNull final Plugin plugin, final boolean concurrent, final long checkInterval) { - this(plugin, concurrent ? new HashSet<>() : ConcurrentHashMap.newKeySet(), checkInterval); + public DefaultPlayerRegistry(@NonNull final Plugin plugin, final boolean concurrent) { + this(plugin, concurrent ? new HashSet<>() : ConcurrentHashMap.newKeySet()); } - public DefaultPlayerRegistry(@NonNull final Plugin plugin, final long checkInterval) { - this(plugin, true, checkInterval); + public DefaultPlayerRegistry(@NonNull final Plugin plugin) { + this(plugin, true); } @Override diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java index 03f020195..3d5743f3b 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java @@ -1,6 +1,5 @@ package ru.progrm_jarvis.minecraft.commons.player.registry; -import com.google.common.base.MoreObjects; import lombok.NonNull; import lombok.experimental.UtilityClass; import org.bukkit.entity.Player; @@ -18,15 +17,8 @@ public class PlayerRegistries { private final Map DEFAULT_REGISTRIES = new ConcurrentHashMap<>(); - private static final String DEFAULT_CHECK_INTERVAL_PROPERTY_NAME - = PlayerContainers.class.getTypeName().concat(".DEFAULT_CHECK_INTERVAL"); - - private static final long DEFAULT_CHECK_INTERVAL = Long.parseLong(MoreObjects.firstNonNull( - System.getProperty(DEFAULT_CHECK_INTERVAL_PROPERTY_NAME), "5") - ); - public PlayerRegistry defaultRegistry(@NonNull final Plugin plugin) { - return DEFAULT_REGISTRIES.computeIfAbsent(plugin, pl -> new DefaultPlayerRegistry(pl, DEFAULT_CHECK_INTERVAL)); + return DEFAULT_REGISTRIES.computeIfAbsent(plugin, DefaultPlayerRegistry::new); } public C registerInDefaultRegistry(@NonNull final Plugin plugin, @@ -35,13 +27,13 @@ public C registerInDefaultRegistry(@NonNull final Pl } public PlayerContainer registerInDefaultRegistry(@NonNull final Plugin plugin, - @NonNull final Collection collectionOfPlayers) { + @NonNull final Collection collectionOfPlayers) { return registerInDefaultRegistry(plugin, PlayerContainers.wrap(collectionOfPlayers)); } public PlayerContainer registerInDefaultRegistry(@NonNull final Plugin plugin, - @NonNull final Map mapOfPlayers, - @NonNull final Function defaultValueSupplier) { + @NonNull final Map mapOfPlayers, + @NonNull final Function defaultValueSupplier) { return registerInDefaultRegistry(plugin, PlayerContainers.wrap(mapOfPlayers, defaultValueSupplier)); } } From eaf78566b4675f3034c5132cfbbe63fc712ede99 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 30 Dec 2018 23:36:38 +0300 Subject: [PATCH 069/508] Add @ShouldBeRegisteredInPlayerRegistry --- .../ShouldBeRegisteredInPlayerRegistry.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java new file mode 100644 index 000000000..2705a0f1c --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java @@ -0,0 +1,13 @@ +package ru.progrm_jarvis.minecraft.commons.player.registry; + +import java.lang.annotation.*; + +/** + * Marker to indicate that the annotated type should be registered in {@link PlayerRegistries} whenever instantiated. + */ +@Inherited +@Documented +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface ShouldBeRegisteredInPlayerRegistry { +} From e8891e9aece2f000d4bc96577f8b295036cf0ab6 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 31 Dec 2018 14:23:10 +0300 Subject: [PATCH 070/508] Divide RegistersSelfInPlayerRegistry and ShouldBeRegisteredInPlayerRegistry --- .../registry/RegistersSelfInPlayerRegistry.java | 13 +++++++++++++ .../ShouldBeRegisteredInPlayerRegistry.java | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/RegistersSelfInPlayerRegistry.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/RegistersSelfInPlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/RegistersSelfInPlayerRegistry.java new file mode 100644 index 000000000..359eda8c1 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/RegistersSelfInPlayerRegistry.java @@ -0,0 +1,13 @@ +package ru.progrm_jarvis.minecraft.commons.player.registry; + +import java.lang.annotation.*; + +/** + * Marker to indicate that the annotated type self-registered in {@link PlayerRegistries} whenever instantiated. + */ +@Inherited +@Documented +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface RegistersSelfInPlayerRegistry { +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java index 2705a0f1c..614348b82 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java @@ -3,7 +3,7 @@ import java.lang.annotation.*; /** - * Marker to indicate that the annotated type should be registered in {@link PlayerRegistries} whenever instantiated. + * Marker to indicate that the annotated type should be registered in {@link PlayerRegistry} whenever instantiated. */ @Inherited @Documented From 3e5b30a581aebbf7b9203fff080697afc9f9562a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 31 Dec 2018 19:19:52 +0300 Subject: [PATCH 071/508] Style: add missing `final` to `catch` --- .../minecraft/nmsutils/protocol/misc/PacketListeners.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/protocol/misc/PacketListeners.java b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/protocol/misc/PacketListeners.java index f9a3b8c40..ecd6f1454 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/protocol/misc/PacketListeners.java +++ b/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/protocol/misc/PacketListeners.java @@ -79,7 +79,7 @@ private static PacketType[] packetTypesFromContainingClass(@NonNull final Class< .map(field -> { try { return field.get(null); - } catch (IllegalAccessException e) { + } catch (final IllegalAccessException e) { throw new RuntimeException(e); } }) From e6fe6148d9a9c72de491f2f632a18e4880a44e78 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 31 Dec 2018 19:20:10 +0300 Subject: [PATCH 072/508] Add @UnsafeNMS --- .../minecraft/commons/annotation/UnsafeNMS.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java new file mode 100644 index 000000000..8983683d4 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java @@ -0,0 +1,13 @@ +package ru.progrm_jarvis.minecraft.commons.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Marker to indicate that the annotated element may use unsafe {@code net.minecraft.server} functionality. + */ +@Documented +@Retention(RetentionPolicy.SOURCE) +public @interface UnsafeNMS { +} From 086d0deedfb553ac1a8507e63882c37e086c5f3e Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 31 Dec 2018 19:20:45 +0300 Subject: [PATCH 073/508] Make minecraft-commons depend on PacketWrapper and reflector --- commons/pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/commons/pom.xml b/commons/pom.xml index 1260692e8..a9031678c 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -21,6 +21,14 @@ hamcrest-all + + ru.progrm-jarvis.reflector + reflector + + + com.comphenix.packetwrapper + PacketWrapper + org.spigotmc spigot-api From 0e9861e2f031ad7841b7e2c038e8f0050ccb65dd Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 31 Dec 2018 19:20:58 +0300 Subject: [PATCH 074/508] Add MinecraftCommons --- .../minecraft/commons/MinecraftCommons.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftCommons.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftCommons.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftCommons.java new file mode 100644 index 000000000..5d46c750d --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftCommons.java @@ -0,0 +1,60 @@ +package ru.progrm_jarvis.minecraft.commons; + +import lombok.experimental.UtilityClass; +import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.List; +import java.util.function.Function; + +/** + * Utility for accessing general configurations of Minecraft Commons. + */ +@UtilityClass +public class MinecraftCommons { + + /** + * Root folder of minecraft-commons shared files + */ + public final File ROOT_DIRECTORY = new File(SystemPropertyUtil.getSystemProperty( + MinecraftCommons.class.getCanonicalName() + ".root-directory", Function.identity(), + "plugins/minecraft_commons/" + )); + + private final boolean CREATE_README_FILE = SystemPropertyUtil.getSystemPropertyBoolean( + MinecraftCommons.class.getCanonicalName() + ".create-readme-file", true + ); + + /** + * Content of {@code README.txt} file created in {@link #ROOT_DIRECTORY} if this option is not disabled. + */ + public final List README_CONTENT = Arrays.asList( + "This is an internal folder of minecraft-commons library.", + "It is most likely used by one or more of your plugins and should not be removed " + + "as it may store some sensitive data", + "", + "minecraft-commons is part of minecraft-utils open-source project " + + "and is distributed under Apache 2.0 license", + "Source code is available at: https://github.com/JarvisCraft/minecraft-utils", + "", + "minecraft-commons and minecraft-utils development is not related to Mojang AB, Microsoft or Minecraft", + "", + " ~ PROgrm_JARvis#"); + + static { + if (!ROOT_DIRECTORY.isFile()) try { + Files.createDirectories(ROOT_DIRECTORY.toPath()); + } catch (final IOException e) { + throw new RuntimeException("Unable to create minecraft-commons root directory", e); + } + // create readme file if its generation is not disabled + if (CREATE_README_FILE) try { + Files.write(new File(ROOT_DIRECTORY, "README.txt").toPath(), README_CONTENT); + } catch (final IOException e) { + throw new RuntimeException("Unable to create README.txt for minecraft-commons", e); + } + } +} From 78e2a6c6c128d9e4124bc2c5136fa43c09bc912c Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 31 Dec 2018 19:21:35 +0300 Subject: [PATCH 075/508] Add display-related functionality to MapImage --- .../commons/mapimage/DefaultMapImage.java | 43 ++++++++- .../minecraft/commons/mapimage/MapImage.java | 93 +++++++++++++++++++ 2 files changed, 133 insertions(+), 3 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index 6b1958aa2..e54e2c145 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -25,7 +25,16 @@ public class DefaultMapImage implements MapImage { /** * Byte array of pixels of an image by X, Y indexes (columns of rows). */ + /* + x1|x2|x3|x4|c5|c6| + y1__|__|__|__|__|__| + y2__|__|__|__|__|__| + y3__|__|__|__|__|__| + y4__|__|__|__|__|__| + y5__|__|__|__|__|__| + */ byte[][] pixels; + byte displayMode; /** * Lazily initialized non-buffered drawer @@ -47,11 +56,12 @@ public class DefaultMapImage implements MapImage { * * @param pixels array of Minecraft color IDs (columns of rows) */ - public DefaultMapImage(final byte[][] pixels) { + public DefaultMapImage(final byte[][] pixels, final byte displayMode) { checkArgument(pixels.length == WIDTH, "Pixels length should be " + WIDTH); for (val column : pixels) checkArgument(column.length == HEIGHT, "Pixels height should be " + HEIGHT); this.pixels = pixels; + this.displayMode = displayMode; } @Override @@ -64,6 +74,32 @@ public int getHeight() { return HEIGHT; } + @Override + public byte getDisplay() { + return displayMode; + } + + @Override + public byte[] getMapData() { + val width = getWidth(); + val height = getHeight(); + val data = new byte[width * height]; + + for (var x = 0; x < height; x++) for (var y = 0; y < width; y++) data[x + width * y] = pixels[x][y]; + + return data; + } + + @Override + public byte[] getMapData(int leastX, int leastY, final int width, final int height) { + val data = new byte[width * height]; + + for (var x = 0; x < width; x++) for (var y = 0; y < height; y++) data[x + width * y] + = pixels[x + leastX][y + leastY]; + + return data; + } + /** * Creates new map image from image. * @@ -71,8 +107,9 @@ public int getHeight() { * @param resize whether the image should be resized or cut to fit map image dimensions * @return created map image */ - public static DefaultMapImage from(@NonNull final BufferedImage image, final boolean resize) { - return new DefaultMapImage(MapImages.getMapImagePixels(image, resize)); + public static DefaultMapImage from(@NonNull final BufferedImage image, final boolean resize, + final byte displayMode) { + return new DefaultMapImage(MapImages.getMapImagePixels(image, resize), displayMode); } /////////////////////////////////////////////////////////////////////////// diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java index 74b1691fb..4dff72455 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java @@ -27,6 +27,13 @@ public interface MapImage { */ PIXELS = WIDTH * HEIGHT; + /** + * Gets display mode of the map image. + * + * @return value from {@code 0} (fully zoomed-in, 1 block/px) to {@code 4} (fully zoomed-out 16 blocks/px) + */ + byte getDisplay(); + /** * Gets the width of this map image. * @@ -41,6 +48,48 @@ public interface MapImage { */ int getHeight(); + /** + * Gets 1-dimensional {@link byte}-array of this image map's pixels. + * + * @return this image's pixel data + * + * @apiNote order as {@link #getWidth()} {@link byte}s (columns) + * coming in a row {@link #getHeight()} times (once for each row) + */ + /* + From Minecraft Wiki: + colorID = Colors[widthOffset + heightOffset * width] ~~> color(x, y) = data[x + width * y] ~~> + ~~> / * x;y * / + 0;0 1;0 2;0, 0;1 1;1 2;1, 0;2 1;2 1;3 + */ + byte[] getMapData(); + + /** + * Gets 1-dimensional {@link byte}-array of this image map's pixels segment. + * + * @param leastX least X-coordinate of image segment + * @param leastY least Y-coordinate of image segment + * @param width width of the image segment + * @param height of image segment + * @return this image's pixel data segment + * + * @apiNote order as {@code width} {@link byte}s (columns) coming in a row {@code height} times (once for each row) + */ + byte[] getMapData(final int leastX, final int leastY, final int width, final int height); + + /** + * Gets 1-dimensional {@link byte}-array of this image map's pixels segment. + * + * @param delta delta for whose coordinates to get the image segment + * @return this image's pixel data segment + * + * @apiNote order as {@link Delta#width()} {@link byte}s (columns) + * coming in a row {@link Delta#height()} times (once for each row) + */ + default byte[] getMapData(@Nonnull final Delta delta) { + return getMapData(delta.leastX(), delta.leastY(), delta.width(), delta.height()); + } + /** * Gets the non-buffered drawer for this image. * @@ -401,6 +450,20 @@ interface Delta { */ int leastY(); + /** + * Gets width of changed image segment + * + * @return width of changed image segment + */ + int width(); + + /** + * Gets height of changed image segment + * + * @return height of changed image segment + */ + int height(); + /** * Creates new delta. * @@ -442,6 +505,16 @@ public int leastX() { public int leastY() { return -1; } + + @Override + public int width() { + return 0; + } + + @Override + public int height() { + return 0; + } } /** @@ -462,6 +535,16 @@ class NonEmpty implements Delta { public boolean isEmpty() { return false; } + + @Override + public int width() { + return pixels.length; + } + + @Override + public int height() { + return pixels[0].length; + } } /** @@ -500,6 +583,16 @@ public int leastY() { public boolean isEmpty() { return false; } + + @Override + public int width() { + return 1; + } + + @Override + public int height() { + return 1; + } } } } From f965d5e2fcbae6a6bd58a22eb792913e2d93aa63 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 31 Dec 2018 19:21:57 +0300 Subject: [PATCH 076/508] Present MapImage.Display API --- .../mapimage/display/BlankMapRenderer.java | 24 ++ .../mapimage/display/MapImageDisplay.java | 13 + .../mapimage/display/PlayerMapManager.java | 234 ++++++++++++++++++ .../display/ProtocolBasedMapImageDisplay.java | 123 +++++++++ 4 files changed, 394 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/BlankMapRenderer.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/BlankMapRenderer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/BlankMapRenderer.java new file mode 100644 index 000000000..8e4c504b2 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/BlankMapRenderer.java @@ -0,0 +1,24 @@ +package ru.progrm_jarvis.minecraft.commons.mapimage.display; + +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.bukkit.entity.Player; +import org.bukkit.map.MapCanvas; +import org.bukkit.map.MapRenderer; +import org.bukkit.map.MapView; + +@ToString +@EqualsAndHashCode(callSuper = true) +public class BlankMapRenderer extends MapRenderer { + + public static final BlankMapRenderer + CONTEXTUAL = new BlankMapRenderer(true), + NON_CONTEXTUAL = new BlankMapRenderer(false); + + public BlankMapRenderer(final boolean contextual) { + super(contextual); + } + + @Override + public void render(final MapView map, final MapCanvas canvas, final Player player) {} +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java new file mode 100644 index 000000000..b9af2975c --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java @@ -0,0 +1,13 @@ +package ru.progrm_jarvis.minecraft.commons.mapimage.display; + +import ru.progrm_jarvis.minecraft.commons.mapimage.MapImage; +import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainer; + +/** + * Display of {@link MapImage}. + * It is responsible for displaying actual images to the players and resolving map-ID conflicts. + */ +public interface MapImageDisplay extends PlayerContainer { + + MapImage image(); +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java new file mode 100644 index 000000000..5eff801ab --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java @@ -0,0 +1,234 @@ +package ru.progrm_jarvis.minecraft.commons.mapimage.display; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.SetMultimap; +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import lombok.val; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.map.MapView; +import ru.progrm_jarvis.minecraft.commons.MinecraftCommons; +import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; +import ru.progrm_jarvis.reflector.Reflector; +import ru.progrm_jarvis.reflector.wrapper.MethodWrapper; +import ru.progrm_jarvis.reflector.wrapper.fast.FastMethodWrapper; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.util.*; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * Utility responsible to allocate minimal amount of {@link MapView} for internal usage. + *

+ * This allocates IDs once needed and reuses them as much as possible, so that: + *

    + *
  • Two players can see different images by one same ID at the same time
  • + *
  • Any player can see different images by single ID at different time
  • + *
  • IDs are stored and reused at server restarts so that no useless IDs allocations occur
  • + *
+ *

+ * This requires the developer to free maps using {@link #freeMap(Player, MapView)} + * (obtained from {@link #allocateMap(Player)}) once those are no longer required in order to use those optimally. + */ +@UtilityClass +public class PlayerMapManager { + + /** + * Single lock for all operations. + */ + private final Lock lock = new ReentrantLock(); + + /** + * Method wrapper for {@link MapView#getId()} because it returns + * {@link short} and {@link int} on different Bukkit API versions. + */ + private final MethodWrapper MAP_VIEW__GET_ID__METHOD = FastMethodWrapper.from( + Reflector.getDeclaredMethod(MapView.class, "getId") + ); + + /** + * Root directory of {@link PlayerMapManager} in which internal data is stored between sessions. + */ + private final File ROOT_DIRECTORY = new File(MinecraftCommons.ROOT_DIRECTORY, + SystemPropertyUtil.getSystemProperty( + PlayerMapManager.class.getCanonicalName() + ".internal-ids-list-file-name", Function.identity(), + "player_map_id_manager/" + ) + ); + + /** + * File containing IDs of allocated maps. + */ + private final File IDS_LIST_FILE = new File(ROOT_DIRECTORY, "map_ids.list"); + + /** + * Maps allocated in Bukkit for internal usage. + */ + private final Set allocatedMaps; + + /** + * Maps of {@link #allocatedMaps} available for the player. + * Similar maps may be related to different players as the image logic doesn't intersect. + */ + private final SetMultimap playerMaps; + + // static initialization of file-related stuff + static { + if (!ROOT_DIRECTORY.isFile()) try { + Files.createDirectories(ROOT_DIRECTORY.toPath()); + } catch (final IOException e) { + throw new RuntimeException("Couldn't create source directory of PlayerMapManager", e); + } + + // Loads the maps stored in a file between sessions + if (IDS_LIST_FILE.isFile()) { + final List fileLines; + try { + fileLines = Files.readAllLines(IDS_LIST_FILE.toPath()); + } catch (final IOException e) { + throw new RuntimeException( + "Couldn't read file " + IDS_LIST_FILE.getName() + " of PlayerMapManager ", e + ); + } + + allocatedMaps = fileLines.stream() + .filter(line -> !line.isEmpty() && line.indexOf('#') != 0) + .map(line -> Bukkit.getMap(Short.parseShort(line))) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); // HashSet is used by default + + Bukkit.getLogger().info( + "Loaded " + allocatedMaps.size() + " internally allocated world map IDs: "+ allocatedMaps.toString() + ); + } else { + try { + Files.createFile(IDS_LIST_FILE.toPath()); + } catch (final IOException e) { + throw new RuntimeException( + "Couldn't create file " + IDS_LIST_FILE.getName() + " of PlayerMapManager ", e + ); + } + allocatedMaps = new HashSet<>(); + } + + // use optimal key size for allocatedMap + playerMaps = HashMultimap.create( + Math.max(8, allocatedMaps.size()), Math.max(16, Bukkit.getOnlinePlayers().size()) + ); + } + + /** + * Gets {@link MapView}'s ID independently on version. + * + * @param mapView {@link MapView} whose {@link MapView#getId()} to invoke + * @return map view's ID + */ + public Number getMapId(@NonNull final MapView mapView) { + return MAP_VIEW__GET_ID__METHOD.invoke(mapView); + } + + /** + * Allocates new map instance. + * + * @return newly allocated map with only blank renderer applied + * + * @apiNote should be called only in case of need + */ + private MapView allocateNewMap() { + lock.lock(); + try { + final MapView map; + { + val worlds = Bukkit.getWorlds(); + if (worlds.isEmpty()) throw new IllegalStateException("There are no Bukkit worlds available"); + map = Bukkit.createMap(worlds.get(0)); + } + + try { + Files.write( + IDS_LIST_FILE.toPath(), + (getMapId(map).toString() + System.lineSeparator()).getBytes(), + StandardOpenOption.APPEND + ); + } catch (final IOException e) { + throw new RuntimeException( + "Couldn't write newly allocated ID to " + IDS_LIST_FILE.getName() + " of PlayerMapManager", e + ); + } + + // clear renderers for map + for (val renderer : map.getRenderers()) map.removeRenderer(renderer); + allocatedMaps.add(map); + + return map; + } finally { + lock.unlock(); + } + } + + /** + * Allocates new map view for player. + * This returns a map view which is stored in this manager and is free for the player at the moment. + * The map should be freed for the player once he can't see it / he leaves the server. + * + * @param player player for whom to allocate the map + * @return map allocated for the player + * + * @see #freeMap(Player, MapView) should be called whenever the player stops seeing this map or leaves the server + */ + public MapView allocateMap(@NonNull final Player player) { + lock.lock(); + try { + val mapsOfPlayer = playerMaps.get(player); + + // if the player has all maps allocated of available than allocate another one (specially for him <3) + // this is a fast equivalent of iterating through each allocated map + // because only maps from allocatedMaps may be contained in mapsOfPlayers which is a Set + if (mapsOfPlayer.size() == allocatedMaps.size()) { + val map = allocateNewMap(); + mapsOfPlayer.add(map); + + return map; + } + //otherwise take one of the available maps for him + for (val map : allocatedMaps) if (!mapsOfPlayer.contains(map)) { + mapsOfPlayer.add(map); + + return map; + } + + // this should never be reached + throw new IllegalStateException( + "Something went wrong, could not find any allocated map for the player although there should be one" + ); + } finally { + lock.unlock(); + } + } + + /** + * Frees the map for the player so that it can be reused. + * This should be called whenever the player stops seeing this map or leaves the server. + * + * @param player player for whom to free the map + * @apiNote this must be called for any map allocation once it can be free + * + * @see #allocateMap(Player) only obtained by calling this method should be freed + */ + public void freeMap(@NonNull final Player player, @NonNull final MapView map) { + lock.lock(); + try { + playerMaps.remove(player, map); + for (val renderer : map.getRenderers()) map.removeRenderer(renderer); + } finally { + lock.unlock(); + } + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java new file mode 100644 index 000000000..8fd4d0089 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -0,0 +1,123 @@ +package ru.progrm_jarvis.minecraft.commons.mapimage.display; + +import com.comphenix.packetwrapper.WrapperPlayServerMap; +import lombok.*; +import lombok.experimental.FieldDefaults; +import org.bukkit.entity.Player; +import org.bukkit.map.MapView; +import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.minecraft.commons.mapimage.MapImage; +import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistries; +import ru.progrm_jarvis.minecraft.commons.player.registry.RegistersSelfInPlayerRegistry; + +import javax.annotation.Nonnull; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +@RegistersSelfInPlayerRegistry +@ToString +@EqualsAndHashCode +@RequiredArgsConstructor +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class ProtocolBasedMapImageDisplay implements MapImageDisplay { + + @NonNull MapImage image; + @NonNull Map playerMaps; + + public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull final Map playerMaps, + @NonNull final Plugin plugin) { + this.image = image; + this.playerMaps = playerMaps; + + PlayerRegistries.registerInDefaultRegistry(plugin, this); + image.subscribeOnUpdates(this::sendDeltaToAllPlayers); + } + + public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull final Plugin plugin) { + this(image, new HashMap<>(), plugin); + } + + @Override + public MapImage image() { + return image; + } + + /** + * Sends the whole image to the players. + */ + protected void sendFullImage(@NonNull final Player player) { + new WrapperPlayServerMap() {{ + setItemDamage(PlayerMapManager.getMapId(playerMaps.get(player)).intValue()); + setScale(image.getDisplay()); + setColumns(image.getWidth()); + setRows(image.getHeight()); + setX(0); + setZ(0); + setData(image.getMapData()); + + System.out.println(Arrays.toString(this.getData())); + }}.sendPacket(player); + } + + protected WrapperPlayServerMap newDeltaPacket(@Nonnull final MapImage.Delta delta) { + return new WrapperPlayServerMap() {{ + setScale(image.getDisplay()); + setColumns(delta.width()); + setRows(delta.height()); + setX(delta.leastX()); + setZ(delta.leastY()); + setData(image.getMapData(delta)); + }}; + } + + protected void sendDelta(@NonNull final Player player, @NonNull final MapImage.Delta delta) { + if (delta.isEmpty()) return; + + val packet = newDeltaPacket(delta); + packet.setItemDamage(PlayerMapManager.getMapId(playerMaps.get(player)).intValue()); + + packet.sendPacket(player); + } + + protected void sendDeltaToAllPlayers(@NonNull final MapImage.Delta delta) { + if (delta.isEmpty()) return; + + val packet = newDeltaPacket(delta); + + for (val entry : playerMaps.entrySet()) { + packet.setItemDamage(PlayerMapManager.getMapId(entry.getValue()).intValue()); + packet.sendPacket(entry.getKey()); + } + } + + @Override + public void addPlayer(final Player player) { + // computeIfAbsent not to allocate the ID if the player is already contained (and so has ID allocated) + playerMaps.computeIfAbsent(player, p -> { + val map = PlayerMapManager.allocateMap(player); + // although the rendering is contextual there is no need to use Bukkit's contextual renderer + map.addRenderer(BlankMapRenderer.NON_CONTEXTUAL); + + return map; + }); + sendFullImage(player); + } + + @Override + public void removePlayer(final Player player) { + val map = playerMaps.remove(player); + if (map != null) /* null-check just in case */ PlayerMapManager.freeMap(player, map); + } + + @Override + public boolean containsPlayer(final Player player) { + return playerMaps.containsKey(player); + } + + @Override + public Collection getPlayers() { + return playerMaps.keySet(); + } +} From 35ea77090d1ef74854bd55786469ca01fe862c7f Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 1 Jan 2019 23:43:58 +0300 Subject: [PATCH 077/508] Add MapUtil#getOrDefault(..) with transformations --- .../minecraft/commons/util/MapUtil.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java index b070dc019..af90f5d82 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java @@ -8,6 +8,7 @@ import java.util.Iterator; import java.util.Map; +import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Stream; @@ -200,6 +201,24 @@ public V getOrDefault(@NonNull final Map map, final K key, final Su return value == null ? map.containsKey(key) ? null : defaultValueSupplier.get() : value; } + public R getOrDefault(@NonNull final Map map, final K key, final Function valueTransformer, + final R defaultValue) { + // the value is got from map, non-null value is surely a present one, but null may have different meanings + val value = map.get(key); + return value == null + ? map.containsKey(key) ? valueTransformer.apply(null) : defaultValue + : valueTransformer.apply(value); + } + + public R getOrDefault(@NonNull final Map map, final K key, final Function valueTransformer, + final Supplier defaultValueSupplier) { + // the value is got from map, non-null value is surely a present one, but null may have different meanings + val value = map.get(key); + return value == null + ? map.containsKey(key) ? valueTransformer.apply(null) : defaultValueSupplier.get() + : valueTransformer.apply(value); + } + /** * An utility-object to fill the map following the chain pattern which may useful when initializing class fields. * From e1c3462967676a618b3b1ec668b33dd49f6e03d3 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 2 Jan 2019 00:42:34 +0300 Subject: [PATCH 078/508] Rework MapImage API, use 1-dim array for base and default implementations --- .../commons/mapimage/DefaultMapImage.java | 111 ++++++------ .../minecraft/commons/mapimage/MapImage.java | 79 ++++++--- .../minecraft/commons/mapimage/MapImages.java | 158 +++++++++++++++--- .../mapimage/display/MapImageDisplay.java | 15 ++ .../display/ProtocolBasedMapImageDisplay.java | 8 + .../commons/mapimage/MapImageTest.java | 78 ++++----- 6 files changed, 296 insertions(+), 153 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index e54e2c145..d6088c351 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -5,6 +5,7 @@ import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazies; import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazy; +import ru.progrm_jarvis.minecraft.commons.util.hack.PreSuperCheck; import java.awt.image.BufferedImage; import java.util.ArrayList; @@ -13,27 +14,23 @@ import static com.google.common.base.Preconditions.checkArgument; import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.blankPixels; +import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImageColor.NO_COLOR_CODE; /** - * The default {@link MapImage} implementation which stores its pixels as a 2-dimensional {@link byte}-array. + * The default {@link MapImage} implementation which stores its pixels as a 1-dimensional. */ @ToString @EqualsAndHashCode -@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class DefaultMapImage implements MapImage { /** - * Byte array of pixels of an image by X, Y indexes (columns of rows). + * {@link byte}-array of pixels of an image by X, Y indexes. + * A pixel can be accessed as {@code pixels[x + y * getWidth()]} */ - /* - x1|x2|x3|x4|c5|c6| - y1__|__|__|__|__|__| - y2__|__|__|__|__|__| - y3__|__|__|__|__|__| - y4__|__|__|__|__|__| - y5__|__|__|__|__|__| - */ - byte[][] pixels; + byte[] pixels; + @Getter int width, height; byte displayMode; /** @@ -55,23 +52,20 @@ public class DefaultMapImage implements MapImage { * Creates new map image from pixels. * * @param pixels array of Minecraft color IDs (columns of rows) + * @param displayMode possible map image display mode (from {@code 0} to {@code 4}) */ - public DefaultMapImage(final byte[][] pixels, final byte displayMode) { - checkArgument(pixels.length == WIDTH, "Pixels length should be " + WIDTH); - for (val column : pixels) checkArgument(column.length == HEIGHT, "Pixels height should be " + HEIGHT); - - this.pixels = pixels; - this.displayMode = displayMode; - } - - @Override - public int getWidth() { - return WIDTH; - } - - @Override - public int getHeight() { - return HEIGHT; + public DefaultMapImage(final byte[] pixels, final byte displayMode) { + this( + PreSuperCheck.beforeSuper(pixels, + () -> checkArgument(pixels.length == PIXELS_COUNT, "pixels length should be " + PIXELS_COUNT) + ), + WIDTH, HEIGHT, + PreSuperCheck.beforeSuper(displayMode, + () -> checkArgument( + displayMode >= 0 && displayMode <= 4, "displayMode should be between 0 and 4" + ) + ) + ); } @Override @@ -81,21 +75,15 @@ public byte getDisplay() { @Override public byte[] getMapData() { - val width = getWidth(); - val height = getHeight(); - val data = new byte[width * height]; - - for (var x = 0; x < height; x++) for (var y = 0; y < width; y++) data[x + width * y] = pixels[x][y]; - - return data; + return pixels; } @Override - public byte[] getMapData(int leastX, int leastY, final int width, final int height) { + public byte[] getMapData(final int leastX, final int leastY, final int width, final int height) { val data = new byte[width * height]; - - for (var x = 0; x < width; x++) for (var y = 0; y < height; y++) data[x + width * y] - = pixels[x + leastX][y + leastY]; + var i = 0; + final int xBound = leastX + width, yBound = leastY + height; + for (var x = leastX; x < xBound; x++) for (var y = 0; y < yBound; y++) data[i] = pixels[x + y * width]; return data; } @@ -156,14 +144,15 @@ protected final class Drawer implements MapImage.Drawer { @Override public MapImage.Drawer px(final int x, final int y, final byte color) { - pixels[x][y] = color; + pixels[x + y * getWidth()] = color; return this; } @Override public MapImage.Drawer fill(final byte color) { - for (val column : pixels) Arrays.fill(column, color); + Arrays.fill(pixels, color); + onUpdate(Delta.of(pixels, width, 0, 0)); return this; } @@ -181,7 +170,7 @@ protected final class BufferedDrawer implements MapImage.BufferedDrawer { /** * Array of changed pixels */ - final byte[][] buffer = blankPixels(new byte[DefaultMapImage.this.getWidth()][DefaultMapImage.this.getWidth()]); + final byte[] buffer = blankPixels(new byte[DefaultMapImage.this.getWidth() * DefaultMapImage.this.getHeight()]); boolean unchanged = true; @@ -219,10 +208,15 @@ public Delta dispose() { // perform image update only if delta is not empty (there are changes) if (!delta.isEmpty()) { - for (var x = leastChangedX; x <= mostChangedX; x++) { - if (mostChangedY + 1 - leastChangedY >= 0) System.arraycopy( - buffer[x], leastChangedY, pixels[x], leastChangedY, mostChangedY + 1 - leastChangedY - ); + final int width = delta.width(), height = delta.height(), + leastX = delta.leastX(), leastY = delta.leastY(); + + val pixels = delta.pixels(); + var i = -1; + for (var y = leastY; y < height; y++) { + val offset = y * width; + for (var x = leastX; x < width; x++) if (pixels[++i] != NO_COLOR_CODE) DefaultMapImage.this + .pixels[x + offset] = pixels[i]; } reset(); @@ -237,18 +231,15 @@ public Delta dispose() { public Delta getDelta() { if (unchanged) return Delta.EMPTY; - // length of pixels changed at y (rows affected) - val yLength = mostChangedY - leastChangedY + 1; - // target array to store changed pixels - val changedPixels = new byte[mostChangedX - leastChangedX + 1][yLength]; - // for each column copy its rows from leastChangedX to mostChangedX to the next available - // row in changedPixels copying from leastChangedY to mostChangedY (of yLength) - // indexing happens from 0 by each axis, so i is target array index, and x is source array index (column) - for (int x = leastChangedX, i = 0; x < mostChangedX; x++, i++) System.arraycopy( - pixels[x] /* source column */, leastChangedY, changedPixels[i] /* target column*/, 0, yLength - ); - - return Delta.of(changedPixels, leastChangedX, leastChangedY); + val width = mostChangedX - leastChangedX + 1; + val pixels = new byte[width * (mostChangedY - leastChangedY + 1)]; + var i = 0; + for (var y = leastChangedY; y < mostChangedY; y++) { + val offset = y * width; + for (var x = leastChangedX; x < mostChangedX; x++) pixels[i++] = buffer[x + offset]; + } + + return Delta.of(pixels, width, leastChangedX, leastChangedY); } /////////////////////////////////////////////////////////////////////////// @@ -258,7 +249,7 @@ public Delta getDelta() { @Override public MapImage.Drawer px(final int x, final int y, final byte color) { // put the changed pixel to the buffer - buffer[x][y] = color; + buffer[x + y * width] = color; // perform delta update if needed // if it is the first update then the pixels is the zone of changes @@ -282,7 +273,7 @@ public MapImage.Drawer px(final int x, final int y, final byte color) { public MapImage.Drawer fill(final byte color) { unchanged = false; - for (val column : buffer) Arrays.fill(column, color); + Arrays.fill(buffer, color); leastChangedX = leastChangedY = 0; mostChangedX = WIDTH; mostChangedY = HEIGHT; diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java index 4dff72455..153e14451 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java @@ -9,6 +9,8 @@ import javax.annotation.Nonnull; import java.util.Arrays; +import static com.google.common.base.Preconditions.checkArgument; + /** * Image on a map. */ @@ -25,7 +27,16 @@ public interface MapImage { /** * Maximal (and only possible) amount of pixels on a map allowed by Minecraft. */ - PIXELS = WIDTH * HEIGHT; + PIXELS_COUNT = WIDTH * HEIGHT; + + /** + * {@link #WIDTH} as {@link float} for coefficient calculations. + */ + float WIDTH_F = (float) WIDTH, + /** + * {@link #HEIGHT} as {@link float} for coefficient calculations + */ + HEIGHT_F = (float) HEIGHT; /** * Gets display mode of the map image. @@ -150,11 +161,11 @@ default void unsubscribeFromUpdates(final UncheckedConsumer subscriber) { /** * Makes all pixels of the specified array blank ({@link MapImageColor#NO_COLOR_CODE}). * - * @param pixels 2-dimensional array of pixels to make blank + * @param pixels array of pixels to make blank * @return passed array of pixels made blank */ - static byte[][] blankPixels(final byte[][] pixels) { - for (val bytes : pixels) Arrays.fill(bytes, MapImageColor.NO_COLOR_CODE); + static byte[] blankPixels(final byte[] pixels) { + Arrays.fill(pixels, MapImageColor.NO_COLOR_CODE); return pixels; } @@ -415,7 +426,7 @@ interface Delta { /** * The value returned by {@link #pixels()} whenever there are no changes. */ - byte[][] NO_PIXELS = new byte[0][0]; + byte[] NO_PIXELS = new byte[0]; /** * An empty delta. This should be used whenever there were no changes to the image. @@ -434,7 +445,7 @@ interface Delta { * * @return pixels changed or {@link #NO_PIXELS} if none were changed */ - byte[][] pixels(); + byte[] pixels(); /** * Gets the least X-coordinate of the changed segment @@ -468,16 +479,16 @@ interface Delta { * Creates new delta. * * @param pixels pixels changed + * @param width width of image segment * @param leastX least X-coordinate of the affected segment * @param leastY least Y-coordinate of the affected segment - * @return empty delta if {@code pixels} is empty or {@code leastX} or {@code leastY} is {@link Delta#NONE} - * and non-empty delta otherwise + * @return empty delta if {@code pixels} is empty and non-empty delta otherwise */ - @Nonnull static Delta of(final byte[][] pixels, final int leastX, final int leastY) { + @Nonnull static Delta of(final byte[] pixels, final int width, final int leastX, final int leastY) { val pixelsLength = pixels.length; - if (pixelsLength == 0 || leastX == NONE || leastY == NONE) return EMPTY; - if (pixelsLength == 1 && pixels[0].length == 1) return new SinglePixel(pixels, leastX, leastY); - return new NonEmpty(pixels, leastX, leastY); + if (pixelsLength == 0) return EMPTY; + if (pixelsLength == 1) return new SinglePixel(pixels, leastX, leastY); + return new NonEmpty(pixels, width, leastX, leastY); } /** @@ -492,7 +503,7 @@ public boolean isEmpty() { } @Override - public byte[][] pixels() { + public byte[] pixels() { return NO_PIXELS; } @@ -519,31 +530,49 @@ public int height() { /** * Non-empty delta. Usage of this class guarantees that it is not empty - * (its constructor does not perform checks of {@code pixels} emptiness - * and {@code leastX}, {@code leastY} ranges). + * (its constructor does not perform checks of {@code pixels} emptiness and so can actually be empty). */ @Value @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE) class NonEmpty implements Delta { - byte[][] pixels; + byte[] pixels; + int width, height; int leastX, leastY; + public NonEmpty(final byte[] pixels, final int width, final int leastX, final int leastY) { + checkArgument( + pixels.length % width == 0, "Length of pixels should be multiple of width (" + width + ")" + ); + checkArgument( + leastX >= 0 && leastX <= WIDTH, "leastX should be between 0 and " + WIDTH + ); + checkArgument( + leastY >= 0 && leastY <= HEIGHT, "leastX should be between 0 and " + HEIGHT + ); + + this.pixels = pixels; + this.width = width; + this.height = pixels.length / width; + this.leastX = leastX; + this.leastY = leastY; + } + @Override public boolean isEmpty() { - return false; + return pixels.length != 0; } @Override public int width() { - return pixels.length; + return width; } @Override public int height() { - return pixels[0].length; + return height; } } @@ -556,16 +585,16 @@ public int height() { @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) class SinglePixel implements Delta { - public SinglePixel(final byte color, final int x, final int y) { - this(new byte[][]{{color}}, x, y); - } - - byte[][] pixel; + byte[] pixel; int x, y; + public SinglePixel(final byte color, final int x, final int y) { + this(new byte[]{color}, x, y); + } + @Override - public byte[][] pixels() { + public byte[] pixels() { return pixel; } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java index ca162239a..de69cd93b 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java @@ -4,19 +4,41 @@ import lombok.experimental.UtilityClass; import lombok.val; import lombok.var; +import org.jetbrains.annotations.Contract; import java.awt.*; import java.awt.image.BufferedImage; +import java.util.Arrays; -import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.HEIGHT; -import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.WIDTH; +import static com.google.common.base.Preconditions.checkArgument; +import static java.lang.Math.min; +import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.*; +import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImageColor.NO_COLOR_CODE; /** * Utilities related to {@link MapImage}. + * + * @apiNote the standard for 1-dimensional arrays of image pixels is {@code pixel(x, y) = pixels[x + y * width} */ @UtilityClass public class MapImages { + /** + * Normalizes the RGB-pixels array making them valid Minecraft {@link MapImageColor}s. + * + * @param pixels pixels to normalizes + * @return array of valid Minecraft map color IDs. + */ + protected static byte[] normalizePixels(final int[] pixels) { + // check before allocations + checkArgument(pixels.length == PIXELS_COUNT, "Length of pixels should be " + PIXELS_COUNT); + + val normalizedPixels = new byte[PIXELS_COUNT]; + for (var i = 0; i < pixels.length; i++) normalizedPixels[i] = MapImageColor.getClosestColorCode(pixels[i]); + + return normalizedPixels; + } + /** * Normalizes the RGB-pixels 2-dimensional array making them valid Minecraft {@link MapImageColor}s. * @@ -24,15 +46,72 @@ public class MapImages { * @return 2-dimensional array of valid Minecraft map color IDs. */ protected static byte[][] normalizePixels(final int[][] pixels) { - val normalizedPixels = new byte[WIDTH][HEIGHT]; + val normalizedPixels = new byte[pixels.length][]; for (var x = 0; x < WIDTH; x++) { val column = pixels[x]; - for (var y = 0; y < HEIGHT; y++) normalizedPixels[x][y] = MapImageColor.getClosestColorCode(column[y]); + val normalizedColumn = new byte[pixels[x].length]; + for (var y = 0; y < HEIGHT; y++) normalizedColumn[y] = MapImageColor.getClosestColorCode(column[y]); + normalizedPixels[x] = normalizedColumn; } return normalizedPixels; } + /** + * Makes the image fit the bounds of map image. + *

+ * The logic is the following: + * + *

The image is {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} or is smaller
+ *
Do nothing and return this image
+ * + *
The image's width is bigger than {@link MapImage#WIDTH} + * or its height is bigger than{@link MapImage#HEIGHT}
+ *
The image is resized proportionally to be of maximal possible size + * yet fitting the bounds of {@link MapImage#WIDTH}×{@link MapImage#HEIGHT}
+ * + * @param image image to fit (will be redrawn) + * @return the given image redrawn so that its non-empty pixels + * are in bound of {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} + * + * @apiNote returned object may be ignored as all changes happen to the provided image + */ + @Contract("null -> fail; _ -> param1") + public BufferedImage fitImage(@NonNull final BufferedImage image) { + final int width = image.getWidth(), height = image.getHeight(); + + // if an image is bigger at any bound + if (width > WIDTH || height > HEIGHT) { + // resizing should be proportional, so: + // k(bound) = bound / maxAllowed(bound) + // then divide both by bigger k (treat same optimally!) + + final float kWidth = width / WIDTH_F, kHeight = height / HEIGHT_F; + if (kHeight == kHeight) { + // if both overflow coefficients are the same than the image's proportions are same to image map's + val graphics = image.getGraphics(); + graphics.drawImage(image.getScaledInstance(WIDTH, HEIGHT, Image.SCALE_SMOOTH), 0, 0, null); + graphics.dispose(); + } else if (kWidth > kHeight) { + // width overflow coefficient is bigger + val graphics = image.getGraphics(); + graphics.drawImage( + image.getScaledInstance(WIDTH, (int) (height / kWidth), Image.SCALE_SMOOTH), 0, 0, null + ); + graphics.dispose(); + } else { + // height overflow coefficient is bigger + val graphics = image.getGraphics(); + graphics.drawImage( + image.getScaledInstance((int) (width / kHeight), HEIGHT, Image.SCALE_SMOOTH), 0, 0, null + ); + graphics.dispose(); + } + } + + return image; + } + /** * Gets the 2-dimensional {@link byte}-array (the 1-st index is columns, the 2-nd index is rows) * of size {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} of RGB-{@link int} colors. @@ -41,27 +120,51 @@ protected static byte[][] normalizePixels(final int[][] pixels) { * @param resize whether the image should be resized or cut to fit map image dimensions * @return 2-dimensional array of RGB-{@link int} colors. */ - public int[][] getNonNormalizedMapImagePixels(@NonNull BufferedImage image, final boolean resize) { - final int width = image.getWidth(), height = image.getHeight(); + public int[][] getNonNormalizedMapImagePixels2D(@NonNull final BufferedImage image, final boolean resize) { + if (resize) fitImage(image); + final int width = min(image.getWidth(), WIDTH), height = min(image.getHeight(), HEIGHT); - // if an image is of wrong size and should be resized (but not cut) then perform resizing - if (width != WIDTH || height != HEIGHT || !resize) { - // resizing - // create new image of valid size - val newImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); - // draw the resized image on - val graphics = image.getGraphics(); - graphics.drawImage( - image.getScaledInstance(WIDTH, HEIGHT, Image.SCALE_SMOOTH), 0, 0, null - ); - graphics.dispose(); - image = newImage; + val pixels = new int[WIDTH][HEIGHT]; + val rgb = image.getRGB(0, 0, width, height, new int[width * height], 0, width); + + // whether or not empty pixels should be added as height is not ideal + val requiresEmptyYFilling = width < WIDTH; + + for (var x = 0; x < width; x++) { + val column = pixels[x]; + for (var y = 0; y < height; y++) column[y] = rgb[x + y * width]; + if (requiresEmptyYFilling) Arrays.fill(column, height, HEIGHT, NO_COLOR_CODE); } + if (width < WIDTH) for (var x = width; x < WIDTH; x++) Arrays.fill(pixels[x], NO_COLOR_CODE); - val pixels = new int[WIDTH][HEIGHT]; + return pixels; + } - for (var x = 0; x < WIDTH; x++) for (var y = 0; y < HEIGHT; y++) pixels[x][y] - = image.getRGB(x, y); + /** + * Gets the {@link byte}-array of RGB-{@link int} colors. + * + * @param image image whose pixels to get + * @param resize whether the image should be resized or cut to fit map image dimensions + * @return array of RGB-{@link int} colors. + */ + public int[] getNonNormalizedMapImagePixels(@NonNull BufferedImage image, final boolean resize) { + if (resize) fitImage(image); + final int width = min(image.getWidth(), WIDTH), height = min(image.getHeight(), HEIGHT); + + val pixels = new int[PIXELS_COUNT]; + val rgb = image.getRGB(0, 0, width, height, new int[width * height], 0, width); + + // whether or not empty pixels should be added as width is not ideal + val requiresEmptyXFilling = width < WIDTH; + + // index in rgb + var i = 0; + for (var y = 0; y < height; y++) { + val rowOffset = y * width; + for (var x = 0; x < width; x++) pixels[x + rowOffset] = rgb[i++]; + if (requiresEmptyXFilling) Arrays.fill(pixels, width + rowOffset, WIDTH + rowOffset, NO_COLOR_CODE); + } + if (height < HEIGHT) Arrays.fill(pixels, height * WIDTH, pixels.length, NO_COLOR_CODE); return pixels; } @@ -74,7 +177,18 @@ public int[][] getNonNormalizedMapImagePixels(@NonNull BufferedImage image, fina * @param resize whether the image should be resized or cut to fit map image dimensions * @return 2-dimensional array of {@link MapImageColor} IDs valid for minecraft. */ - public byte[][] getMapImagePixels(@NonNull final BufferedImage image, final boolean resize) { + public byte[][] getMapImagePixels2D(@NonNull final BufferedImage image, final boolean resize) { + return normalizePixels(getNonNormalizedMapImagePixels2D(image, resize)); + } + + /** + * Gets the {@link byte}-array of size {@link MapImage#PIXELS_COUNT} of valid map color ids. + * + * @param image image whose pixels to get + * @param resize whether the image should be resized or cut to fit map image dimensions + * @return array of {@link MapImageColor} IDs valid for minecraft. + */ + public byte[] getMapImagePixels(@NonNull final BufferedImage image, final boolean resize) { return normalizePixels(getNonNormalizedMapImagePixels(image, resize)); } } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java index b9af2975c..d79a2d411 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java @@ -1,5 +1,6 @@ package ru.progrm_jarvis.minecraft.commons.mapimage.display; +import org.bukkit.entity.Player; import ru.progrm_jarvis.minecraft.commons.mapimage.MapImage; import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainer; @@ -9,5 +10,19 @@ */ public interface MapImageDisplay extends PlayerContainer { + /** + * Gets the image displayed. + * + * @return image displayed + */ MapImage image(); + + /** + * Gets the map ID used by this map image display for the player specified. + * + * @param player player whose map ID for this image display to get + * @return map ID used by this map image display for the player + * or {@code null} if there is none (this display is not used for the player) + */ + Integer getMapId(Player player); } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index 8fd4d0089..c44f4a1e1 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -9,6 +9,7 @@ import ru.progrm_jarvis.minecraft.commons.mapimage.MapImage; import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistries; import ru.progrm_jarvis.minecraft.commons.player.registry.RegistersSelfInPlayerRegistry; +import ru.progrm_jarvis.minecraft.commons.util.MapUtil; import javax.annotation.Nonnull; import java.util.Arrays; @@ -120,4 +121,11 @@ public boolean containsPlayer(final Player player) { public Collection getPlayers() { return playerMaps.keySet(); } + + @Override + public Integer getMapId(final Player player) { + return MapUtil.getOrDefault( + playerMaps, player, map -> PlayerMapManager.getMapId(map).intValue(), (Integer) null + ); + } } diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java index b7f3d306f..d2ebc197a 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java @@ -21,62 +21,48 @@ class MapImageTest { void testDeltaOf() { assertTrue(Delta.EMPTY.isEmpty()); - assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 0, 0)); - assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 0, 135)); - assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 1213, 0)); - assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 125, 65)); - assertSame(Delta.EMPTY, Delta.of(new byte[0][0], -12, 24)); - assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 19, -32)); - assertSame(Delta.EMPTY, Delta.of(new byte[0][0], 12, -24)); - - assertSame(Delta.EMPTY, Delta.of(new byte[1][0], Delta.NONE, 100)); - assertSame(Delta.EMPTY, Delta.of(new byte[0][3], Delta.NONE, 100)); - assertSame(Delta.EMPTY, Delta.of(new byte[1][3], 80, Delta.NONE)); - assertSame(Delta.EMPTY, Delta.of(new byte[12][23], Delta.NONE, Delta.NONE)); - assertSame(Delta.EMPTY, Delta.of(new byte[10][2], Delta.NONE, Delta.NONE)); - - assertSame(Delta.EMPTY, Delta.of(new byte[1][1], Delta.NONE, 100)); - assertSame(Delta.EMPTY, Delta.of(new byte[1][1], 102, Delta.NONE)); - assertSame(Delta.EMPTY, Delta.of(new byte[1][1], Delta.NONE, Delta.NONE)); - - assertEquals(new Delta.SinglePixel((byte) 1, 10, 10), Delta.of(new byte[][]{{1}}, 10, 10)); - assertEquals(new Delta.SinglePixel((byte) 32, 100, 10), Delta.of(new byte[][]{{32}}, 100, 10)); - assertEquals(new Delta.SinglePixel((byte) 12, 100, 92), Delta.of(new byte[][]{{12}}, 100, 92)); - assertEquals(new Delta.SinglePixel((byte) -127, 13, 12), Delta.of(new byte[][]{{-127}}, 13, 12)); - assertEquals(new Delta.SinglePixel((byte) 127, 28, 10), Delta.of(new byte[][]{{127}}, 28, 10)); - assertEquals(new Delta.SinglePixel((byte) -128, 23, 23), Delta.of(new byte[][]{{-128}}, 23, 23)); - assertEquals(new Delta.SinglePixel((byte) -23, 25, 122), Delta.of(new byte[][]{{-23}}, 25, 122)); - - assertEquals(new Delta.SinglePixel((byte) 1, 10, 10), Delta.of(new byte[][]{{1}}, 10, 10)); - assertEquals(new Delta.SinglePixel((byte) 32, 100, 10), Delta.of(new byte[][]{{32}}, 100, 10)); - assertEquals(new Delta.SinglePixel((byte) 12, 100, 92), Delta.of(new byte[][]{{12}}, 100, 92)); - assertEquals(new Delta.SinglePixel((byte) -127, 13, 12), Delta.of(new byte[][]{{-127}}, 13, 12)); - assertEquals(new Delta.SinglePixel((byte) 127, 28, 10), Delta.of(new byte[][]{{127}}, 28, 10)); - assertEquals(new Delta.SinglePixel((byte) -128, 23, 23), Delta.of(new byte[][]{{-128}}, 23, 23)); - assertEquals(new Delta.SinglePixel((byte) -23, 25, 12), Delta.of(new byte[][]{{-23}}, 25, 12)); + assertSame(Delta.EMPTY, Delta.of(new byte[0], 0, 0, 0)); + assertSame(Delta.EMPTY, Delta.of(new byte[0], 0, 0, 135)); + assertSame(Delta.EMPTY, Delta.of(new byte[0], 0, 1213, 0)); + assertSame(Delta.EMPTY, Delta.of(new byte[0], 0, 125, 65)); + assertSame(Delta.EMPTY, Delta.of(new byte[0], 0, -12, 24)); + assertSame(Delta.EMPTY, Delta.of(new byte[0], 0, 19, -32)); + assertSame(Delta.EMPTY, Delta.of(new byte[0], 0, 12, -24)); + + assertEquals(new Delta.SinglePixel((byte) 1, 10, 10), Delta.of(new byte[]{1}, 1, 10, 10)); + assertEquals(new Delta.SinglePixel((byte) 32, 100, 10), Delta.of(new byte[]{32}, 1, 100, 10)); + assertEquals(new Delta.SinglePixel((byte) 12, 100, 92), Delta.of(new byte[]{12}, 1, 100, 92)); + assertEquals(new Delta.SinglePixel((byte) -127, 13, 12), Delta.of(new byte[]{-127}, 1, 13, 12)); + assertEquals(new Delta.SinglePixel((byte) 127, 28, 10), Delta.of(new byte[]{127}, 1, 28, 10)); + assertEquals(new Delta.SinglePixel((byte) -128, 23, 23), Delta.of(new byte[]{-128}, 1, 23, 23)); + assertEquals(new Delta.SinglePixel((byte) -23, 25, 122), Delta.of(new byte[]{-23}, 1, 25, 122)); + + assertEquals(new Delta.SinglePixel((byte) 1, 10, 10), Delta.of(new byte[]{1}, 1, 10, 10)); + assertEquals(new Delta.SinglePixel((byte) 32, 100, 10), Delta.of(new byte[]{32}, 1, 100, 10)); + assertEquals(new Delta.SinglePixel((byte) 12, 100, 92), Delta.of(new byte[]{12}, 1, 100, 92)); + assertEquals(new Delta.SinglePixel((byte) -127, 13, 12), Delta.of(new byte[]{-127}, 1, 13, 12)); + assertEquals(new Delta.SinglePixel((byte) 127, 28, 10), Delta.of(new byte[]{127}, 1, 28, 10)); + assertEquals(new Delta.SinglePixel((byte) -128, 23, 23), Delta.of(new byte[]{-128}, 1, 23, 23)); + assertEquals(new Delta.SinglePixel((byte) -23, 25, 12), Delta.of(new byte[]{-23}, 1, 25, 12)); val random = new Random(); for (var i = 0; i < 128 + random.nextInt(128); i++) { final int - xLength = 2 + random.nextInt(MapImage.WIDTH - 1), // [2 ; WIDTH] - yLength = 2 + random.nextInt(MapImage.HEIGHT - 1), // [2 ; HEIGHT] - leastX = random.nextInt(MapImage.WIDTH - xLength + 1), // [0 ; WIDTH - xLength] - leastY = random.nextInt(MapImage.HEIGHT - yLength + 1); // [0 ; HEIGHT - yLength] + width = 2 + random.nextInt(MapImage.WIDTH - 1), // [2 ; WIDTH] + height = 2 + random.nextInt(MapImage.HEIGHT - 1), // [2 ; HEIGHT] + leastX = random.nextInt(MapImage.WIDTH - width + 1), // [0 ; WIDTH - xLength] + leastY = random.nextInt(MapImage.HEIGHT - height + 1); // [0 ; HEIGHT - yLength] - val pixels = new byte[xLength][yLength]; + val pixels = new byte[width * height]; // populate pixels with random values - for (val column : pixels) random.nextBytes(column); - - val pixelsCopy = new byte[xLength][yLength]; - for (int k = 0; k < pixelsCopy.length; k++) pixelsCopy[k] = pixels[k].clone(); + random.nextBytes(pixels); - // verify that pixels were normally copied - assertArrayEquals(pixels, pixelsCopy); + val pixelsCopy = pixels.clone(); MatcherAssert.assertThat( - new Delta.NonEmpty(pixelsCopy, leastX, leastY), - Matchers.is(Delta.of(pixels, leastX, leastY)) + new Delta.NonEmpty(pixelsCopy, width, leastX, leastY), + Matchers.is(Delta.of(pixels, width, leastX, leastY)) ); } } From effb9a70b72c5d378da758087b359b55991f741d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 2 Jan 2019 01:37:33 +0300 Subject: [PATCH 079/508] Typo: remove double space from SystemPropertyUtil --- .../minecraft/commons/util/SystemPropertyUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java index 7b505b01c..700713c79 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java @@ -27,7 +27,7 @@ public T getSystemProperty(@NonNull final String propertyName, @NonNull final Supplier defaultValueSupplier) { val property = System.getProperty(propertyName); - return property == null ? defaultValueSupplier.get() : transformer.apply(property); + return property == null ? defaultValueSupplier.get() : transformer.apply(property); } /** From f86fa7911edb6ecc8b499acdeb9cc4803929cfa0 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 2 Jan 2019 02:52:18 +0300 Subject: [PATCH 080/508] Rework MapImageColor similarity algorithms --- .../commons/mapimage/MapImageColor.java | 184 +++++++++++++++--- 1 file changed, 162 insertions(+), 22 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java index 7a7640f0a..42a6b9515 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java @@ -2,7 +2,9 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; +import gnu.trove.map.TIntIntMap; import gnu.trove.map.TObjectByteMap; +import gnu.trove.map.hash.TIntIntHashMap; import gnu.trove.map.hash.TObjectByteHashMap; import lombok.*; import lombok.experimental.Accessors; @@ -10,6 +12,10 @@ import ru.progrm_jarvis.minecraft.commons.util.BitwiseUtil; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; +import javax.annotation.Nonnegative; + +import static java.lang.Math.abs; + /** * A cached color which provides easy conversions between full 24-bit RGB and Minecraft Map colors. * @@ -40,6 +46,15 @@ public class MapImageColor { */ private static final TObjectByteMap COLOR_CODE_CACHE = new TObjectByteHashMap<>(); + private static final int COLOR_LENGTHS_EMPTY_VALUE = -1; + + private static final TIntIntMap COLOR_LENGTHS = new TIntIntHashMap(32, 0.5f, 0, COLOR_LENGTHS_EMPTY_VALUE); + + private static final ColorLengthAlgorithm COLOR_LENGTH_ALGORITHM = SystemPropertyUtil.getSystemProperty( + MapImageColor.class.getTypeName() + ".color-length-algorithm", + ColorLengthAlgorithm::valueOf, ColorLengthAlgorithm.SUM + ); + /** * 8 bits describing red part of the color */ @@ -101,6 +116,24 @@ public static byte blue(final int rgb) { return (byte) (rgb & 0xFF); } + /** + * Gets cached color length for the specified RGB-{@link int} using default algorithm. + * + * @param rgb RGB-{@link int} color for which to get the length + * @return color length of the color + * + * @implNote not synchronized as concurrent access will not break logic + */ + public static int getColorLength(final int rgb) { + var length = COLOR_LENGTHS.get(rgb); + if (length == COLOR_LENGTHS_EMPTY_VALUE) { + length = COLOR_LENGTH_ALGORITHM.length(rgb); + COLOR_LENGTHS.put(rgb, length); + } + + return length; + } + /** * Gets the id of the color closest to the one given by calculating * dissimilarity rate of each available with the one given. @@ -113,22 +146,24 @@ public static byte blue(final int rgb) { public static byte getClosestColorCode(final MapImageColor color) { if (COLOR_CODE_CACHE.containsKey(color)) return COLOR_CODE_CACHE.get(color); + // the value which will store the color code + final byte colorCode; synchronized (COLOR_IDS_CACHE_MUTEX) { val rgb = color.rgb; - // the value which will store the color code - final byte colorCode; - val minecraftColorCode = MapImageMinecraftColors.getMinecraftColorCode(rgb); if (minecraftColorCode == NO_COLOR_CODE) { - var minDistanceSquared = Integer.MAX_VALUE; + // length of the current color + val length = getColorLength(rgb); + + var minDistance = Integer.MAX_VALUE; var closestColor = 0; // find the color with the minimal RGB-distance for (val minecraftRgb : MapImageMinecraftColors.MINECRAFT_RGB_COLOR_CODES.keys()) { - val distanceSquared = getDistanceSquared(rgb, minecraftRgb); - if (distanceSquared < minDistanceSquared) { - minDistanceSquared = distanceSquared; + val distance = abs(length - getColorLength(minecraftRgb)); + if (distance < minDistance) { + minDistance = distance; closestColor = minecraftRgb; } } @@ -138,9 +173,9 @@ public static byte getClosestColorCode(final MapImageColor color) { // now store the best fitting color code in cache COLOR_CODE_CACHE.put(color, colorCode); - - return colorCode; } + + return colorCode; } /** @@ -194,6 +229,10 @@ public static MapImageColor of(final int red, final int green, final int blue) { // Difference counting /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + // Distance squared (as if colors were 3 axises) + /////////////////////////////////////////////////////////////////////////// + public static int getDistanceSquared(final byte red1, final byte green1, final byte blue1, final byte red2, final byte green2, final byte blue2) { val dRed = BitwiseUtil.byteToUnsignedInt(red2) - BitwiseUtil.byteToUnsignedInt(red1); @@ -220,33 +259,134 @@ public int getDistanceSquared(@NonNull final MapImageColor other) { } public int getDistanceSquared(final int rgb) { - return getDistanceSquared((byte) ((rgb >> 16) & 0xFF), (byte) ((rgb >> 8) & 0xFF), (byte) (rgb & 0xFF)); + return getDistanceSquared(red(rgb), green(rgb), blue(rgb)); + } + + /////////////////////////////////////////////////////////////////////////// + // Sum of channels + /////////////////////////////////////////////////////////////////////////// + + public static int getSum(final byte red1, final byte green1, final byte blue1, + final byte red2, final byte green2, final byte blue2) { + return abs(BitwiseUtil.byteToUnsignedInt(red2) - BitwiseUtil.byteToUnsignedInt(red1)) + + abs(BitwiseUtil.byteToUnsignedInt(green2) - BitwiseUtil.byteToUnsignedInt(green1)) + + abs(BitwiseUtil.byteToUnsignedInt(blue2) - BitwiseUtil.byteToUnsignedInt(blue1)); + } + + public static int getSum(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { + return getSum(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); + } + + public static int getSum(final int rgb1, final int rgb2) { + return getSum(red(rgb1), green(rgb1), blue(rgb1), red(rgb2), green(rgb2), blue(rgb2)); + } + + public int getSum(final byte red, final byte green, final byte blue) { + return getSum(this.red, this.green, this.blue, red, green, blue); + } + + public int getSum(@NonNull final MapImageColor other) { + return getSum(red, green, blue, other.red, other.green, other.blue); + } + + public int getSum(final int rgb) { + return getSum(red(rgb), green(rgb), blue(rgb)); } - public static int getDissimilarityRate(final byte red1, final byte green1, final byte blue1, - final byte red2, final byte green2, final byte blue2) { + /////////////////////////////////////////////////////////////////////////// + // Multiplication product of channels + /////////////////////////////////////////////////////////////////////////// + + public static int getMultiplicationProduct(final byte red1, final byte green1, final byte blue1, + final byte red2, final byte green2, final byte blue2) { return (BitwiseUtil.byteToUnsignedInt(red2) - BitwiseUtil.byteToUnsignedInt(red1)) * (BitwiseUtil.byteToUnsignedInt(green2) - BitwiseUtil.byteToUnsignedInt(green1)) * (BitwiseUtil.byteToUnsignedInt(blue2) - BitwiseUtil.byteToUnsignedInt(blue1)); } - public static int getDissimilarityRate(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { - return getDissimilarityRate(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); + public static int getMultiplicationProduct(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { + return getMultiplicationProduct(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); + } + + public static int getMultiplicationProduct(final int rgb1, final int rgb2) { + return getMultiplicationProduct(red(rgb1), green(rgb1), blue(rgb1), red(rgb2), green(rgb2), blue(rgb2)); + } + + public int getMultiplicationProduct(final byte red, final byte green, final byte blue) { + return getMultiplicationProduct(this.red, this.green, this.blue, red, green, blue); + } + + public int getMultiplicationProduct(@NonNull final MapImageColor other) { + return getMultiplicationProduct(red, green, blue, other.red, other.green, other.blue); + } + + public int getMultiplicationProduct(final int rgb) { + return getMultiplicationProduct(red(rgb), green(rgb), blue(rgb)); + } + + /////////////////////////////////////////////////////////////////////////// + // Natural distance + // Due to nature of human's eyes it is more accurate to use + // unequal coefficients for color-channels to be more accurate + // (red) = 0.3 + // (green) = 0.59 + // (blue) = 0.11 + /////////////////////////////////////////////////////////////////////////// + + public static int getNaturalDistanceSquared(final byte red1, final byte green1, final byte blue1, + final byte red2, final byte green2, final byte blue2) { + val dRed = (BitwiseUtil.byteToUnsignedInt(red2) - BitwiseUtil.byteToUnsignedInt(red1)) * 0.3; + val dGreen = (BitwiseUtil.byteToUnsignedInt(green2) - BitwiseUtil.byteToUnsignedInt(green1)) * 0.59; + val dBlue = (BitwiseUtil.byteToUnsignedInt(blue2) - BitwiseUtil.byteToUnsignedInt(blue1)) * 0.11; + + return (int) (dRed * dRed + dBlue * dBlue + dGreen * dGreen); + } + + public static int getNaturalDistanceSquared(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { + return getNaturalDistanceSquared(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); + } + + public static int getNaturalDistanceSquared(final int rgb1, final int rgb2) { + return getNaturalDistanceSquared(red(rgb1), green(rgb1), blue(rgb1), red(rgb2), green(rgb2), blue(rgb2)); } - public static int getDissimilarityRate(final int rgb1, final int rgb2) { - return getDissimilarityRate(red(rgb1), green(rgb1), blue(rgb1), red(rgb2), green(rgb2), blue(rgb2)); + public int getNaturalDistanceSquared(final byte red, final byte green, final byte blue) { + return getNaturalDistanceSquared(this.red, this.green, this.blue, red, green, blue); } - public int getDissimilarityRate(final byte red, final byte green, final byte blue) { - return getDissimilarityRate(this.red, this.green, this.blue, red, green, blue); + public int getNaturalDistanceSquared(@NonNull final MapImageColor other) { + return getNaturalDistanceSquared(red, green, blue, other.red, other.green, other.blue); } - public int getDissimilarityRate(@NonNull final MapImageColor other) { - return getDissimilarityRate(red, green, blue, other.red, other.green, other.blue); + public int getNaturalDistanceSquared(final int rgb) { + return getNaturalDistanceSquared(red(rgb), green(rgb), blue(rgb)); } - public int getDissimilarityRate(final int rgb) { - return getDissimilarityRate((byte) ((rgb >> 16) & 0xFF), (byte) ((rgb >> 8) & 0xFF), (byte) (rgb & 0xFF)); + private enum ColorLengthAlgorithm { + SUM { + @Override + int length(final int rgb) { + return getSum(rgb, 0); + } + }, + MULTIPLICATION_PRODUCT { + @Override + int length(final int rgb) { + return getMultiplicationProduct(rgb, 0); + } + }, + DISTANCE { + @Override + int length(final int rgb) { + return getDistanceSquared(rgb, 0); + } + }, + NATURAL_DISTANCE { + @Override + int length(final int rgb) { + return getNaturalDistanceSquared(rgb, 0); + } + }; + @Nonnegative abstract int length(int rgb); } } From f1d794b70134d3adc580b817d8bc840dec9f0e8c Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 8 Jan 2019 18:06:42 +0300 Subject: [PATCH 081/508] Update spigot-api to 1.13.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b1f9b1306..c24ce933f 100644 --- a/pom.xml +++ b/pom.xml @@ -247,7 +247,7 @@ org.spigotmc spigot-api - 1.13.1-R0.1-SNAPSHOT + 1.13.2-R0.1-SNAPSHOT provided From b0330367403632b3da53d6d28adf793eb6cfa27d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 8 Jan 2019 18:07:24 +0300 Subject: [PATCH 082/508] Rework MapImageColor to use Bukkit's MapPalette for matching colors --- .../commons/mapimage/MapImageColor.java | 92 +++---------------- 1 file changed, 12 insertions(+), 80 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java index 42a6b9515..c8af70e66 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java @@ -2,17 +2,16 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import gnu.trove.map.TIntIntMap; import gnu.trove.map.TObjectByteMap; -import gnu.trove.map.hash.TIntIntHashMap; import gnu.trove.map.hash.TObjectByteHashMap; import lombok.*; import lombok.experimental.Accessors; import lombok.experimental.FieldDefaults; +import org.bukkit.map.MapPalette; import ru.progrm_jarvis.minecraft.commons.util.BitwiseUtil; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; -import javax.annotation.Nonnegative; +import java.awt.*; import static java.lang.Math.abs; @@ -46,15 +45,6 @@ public class MapImageColor { */ private static final TObjectByteMap COLOR_CODE_CACHE = new TObjectByteHashMap<>(); - private static final int COLOR_LENGTHS_EMPTY_VALUE = -1; - - private static final TIntIntMap COLOR_LENGTHS = new TIntIntHashMap(32, 0.5f, 0, COLOR_LENGTHS_EMPTY_VALUE); - - private static final ColorLengthAlgorithm COLOR_LENGTH_ALGORITHM = SystemPropertyUtil.getSystemProperty( - MapImageColor.class.getTypeName() + ".color-length-algorithm", - ColorLengthAlgorithm::valueOf, ColorLengthAlgorithm.SUM - ); - /** * 8 bits describing red part of the color */ @@ -117,30 +107,22 @@ public static byte blue(final int rgb) { } /** - * Gets cached color length for the specified RGB-{@link int} using default algorithm. + * Creates new map image color from specified {@link java.awt} {@link Color}. * - * @param rgb RGB-{@link int} color for which to get the length - * @return color length of the color - * - * @implNote not synchronized as concurrent access will not break logic + * @param color color to convert to map image color object + * @return map image color equivalent of specified color object */ - public static int getColorLength(final int rgb) { - var length = COLOR_LENGTHS.get(rgb); - if (length == COLOR_LENGTHS_EMPTY_VALUE) { - length = COLOR_LENGTH_ALGORITHM.length(rgb); - COLOR_LENGTHS.put(rgb, length); - } - - return length; + public static MapImageColor from(@NonNull final Color color) { + return of(color.getRed(), color.getGreen(), color.getBlue()); } /** - * Gets the id of the color closest to the one given by calculating - * dissimilarity rate of each available with the one given. - * This value is cached for further usage. + * Gets the id of the color closest to the one given. This value is cached for further usage. * * @param color color for which to find the closest available color code * @return closest available color code + * + * @implNote uses {@link MapPalette#matchColor(Color)} because (although it is deprecated) it is the simplest way */ @SneakyThrows public static byte getClosestColorCode(final MapImageColor color) { @@ -149,30 +131,8 @@ public static byte getClosestColorCode(final MapImageColor color) { // the value which will store the color code final byte colorCode; synchronized (COLOR_IDS_CACHE_MUTEX) { - val rgb = color.rgb; - - val minecraftColorCode = MapImageMinecraftColors.getMinecraftColorCode(rgb); - if (minecraftColorCode == NO_COLOR_CODE) { - // length of the current color - val length = getColorLength(rgb); - - var minDistance = Integer.MAX_VALUE; - var closestColor = 0; - - // find the color with the minimal RGB-distance - for (val minecraftRgb : MapImageMinecraftColors.MINECRAFT_RGB_COLOR_CODES.keys()) { - val distance = abs(length - getColorLength(minecraftRgb)); - if (distance < minDistance) { - minDistance = distance; - closestColor = minecraftRgb; - } - } - - colorCode = MapImageMinecraftColors.getMinecraftColorCode(closestColor); - } else colorCode = minecraftColorCode; - - // now store the best fitting color code in cache - COLOR_CODE_CACHE.put(color, colorCode); + //noinspection deprecation ( use of MapPalette#matchColor(..) + COLOR_CODE_CACHE.put(color, colorCode = MapPalette.matchColor(new Color(color.rgb))); } return colorCode; @@ -361,32 +321,4 @@ public int getNaturalDistanceSquared(@NonNull final MapImageColor other) { public int getNaturalDistanceSquared(final int rgb) { return getNaturalDistanceSquared(red(rgb), green(rgb), blue(rgb)); } - - private enum ColorLengthAlgorithm { - SUM { - @Override - int length(final int rgb) { - return getSum(rgb, 0); - } - }, - MULTIPLICATION_PRODUCT { - @Override - int length(final int rgb) { - return getMultiplicationProduct(rgb, 0); - } - }, - DISTANCE { - @Override - int length(final int rgb) { - return getDistanceSquared(rgb, 0); - } - }, - NATURAL_DISTANCE { - @Override - int length(final int rgb) { - return getNaturalDistanceSquared(rgb, 0); - } - }; - @Nonnegative abstract int length(int rgb); - } } From c72c143925c71ccce53dfc319da211aeeaf44647 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 8 Jan 2019 18:19:58 +0300 Subject: [PATCH 083/508] Make MapImageColor more documented --- .../commons/mapimage/MapImageColor.java | 98 ++++++++++++------- 1 file changed, 63 insertions(+), 35 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java index c8af70e66..df48b6c6b 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java @@ -11,6 +11,7 @@ import ru.progrm_jarvis.minecraft.commons.util.BitwiseUtil; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; +import javax.annotation.Nonnull; import java.awt.*; import static java.lang.Math.abs; @@ -58,8 +59,31 @@ public class MapImageColor { */ blue; + /** + * An {@link int} representation of the color. Also used as the only field for hash-code generation. + */ @EqualsAndHashCode.Include int rgb; + /////////////////////////////////////////////////////////////////////////// + // Construction + /////////////////////////////////////////////////////////////////////////// + + /** + * Constructs a new map image color instance based on 3 base colors. + * This is an internal constructor as, normally, there should only exist one cached instance of any used color. + * + * @param red red color channel + * @param green green color channel + * @param blue blue color channel + */ + private MapImageColor(final byte red, final byte green, final byte blue) { + this.red = red; + this.green = green; + this.blue = blue; + + this.rgb = asRgb(red, green, blue); + } + /////////////////////////////////////////////////////////////////////////// // Conversions /////////////////////////////////////////////////////////////////////////// @@ -112,10 +136,48 @@ public static byte blue(final int rgb) { * @param color color to convert to map image color object * @return map image color equivalent of specified color object */ - public static MapImageColor from(@NonNull final Color color) { + @Nonnull public static MapImageColor from(@NonNull final Color color) { return of(color.getRed(), color.getGreen(), color.getBlue()); } + /** + * Gets or creates cached map image color from specified {@link int}-RGB. + * + * @param rgb RGB encoded as {@link int} + * @return cached or created and cached map image color + */ + @SneakyThrows + @Nonnull public static MapImageColor of(final int rgb) { + return COLOR_CACHE.get(rgb, () -> new MapImageColor(red(rgb), green(rgb), blue(rgb))); + } + + /** + * Gets or creates cached map image color from specified color divided on color channels. + * + * @param red red color channel + * @param green green color channel + * @param blue blue color channel + * @return cached or created and cached map image color + */ + @SneakyThrows + @Nonnull public static MapImageColor of(final byte red, final byte green, final byte blue) { + return COLOR_CACHE.get(asRgb(red, green, blue), () -> new MapImageColor(red, green, blue)); + } + + /** + * Gets or creates cached map image color from specified color divided on color channels. + * + * @param red red color channel + * @param green green color channel + * @param blue blue color channel + * @return cached or created and cached map image color + * + * @apiNote alias {@link #of(byte, byte, byte)} using {@link int}s not to perform casts in method call + */ + @Nonnull public static MapImageColor of(final int red, final int green, final int blue) { + return of((byte) red, (byte) green, (byte) blue); + } + /** * Gets the id of the color closest to the one given. This value is cached for further usage. * @@ -151,40 +213,6 @@ public static byte getClosestColorCode(final int rgb) { return getClosestColorCode(of(rgb)); } - /////////////////////////////////////////////////////////////////////////// - // Construction - /////////////////////////////////////////////////////////////////////////// - - /** - * Constructs a new map image color instance based on 3 base colors. - * This is an internal constructor as, normally, there should only exist one cached instance of any used color. - * - * @param red red color channel - * @param green green color channel - * @param blue blue color channel - */ - private MapImageColor(final byte red, final byte green, final byte blue) { - this.red = red; - this.green = green; - this.blue = blue; - - this.rgb = asRgb(red, green, blue); - } - - @SneakyThrows - public static MapImageColor of(final int rgb) { - return COLOR_CACHE.get(rgb, () -> new MapImageColor(red(rgb), green(rgb), blue(rgb))); - } - - @SneakyThrows - public static MapImageColor of(final byte red, final byte green, final byte blue) { - return COLOR_CACHE.get(asRgb(red, green, blue), () -> new MapImageColor(red, green, blue)); - } - - public static MapImageColor of(final int red, final int green, final int blue) { - return of((byte) red, (byte) green, (byte) blue); - } - /////////////////////////////////////////////////////////////////////////// // Difference counting /////////////////////////////////////////////////////////////////////////// From f06804288131d92d82ba29a6ad3394def56b9bc6 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 8 Jan 2019 19:58:27 +0300 Subject: [PATCH 084/508] Fix image resizing in MapImages --- .../minecraft/commons/mapimage/MapImages.java | 49 ++++++++++--------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java index de69cd93b..570f542e3 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java @@ -6,12 +6,13 @@ import lombok.var; import org.jetbrains.annotations.Contract; +import javax.annotation.Nonnull; import java.awt.*; import java.awt.image.BufferedImage; import java.util.Arrays; import static com.google.common.base.Preconditions.checkArgument; -import static java.lang.Math.min; +import static java.awt.image.BufferedImage.TYPE_INT_ARGB; import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.*; import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImageColor.NO_COLOR_CODE; @@ -76,9 +77,9 @@ protected static byte[][] normalizePixels(final int[][] pixels) { * * @apiNote returned object may be ignored as all changes happen to the provided image */ - @Contract("null -> fail; _ -> param1") - public BufferedImage fitImage(@NonNull final BufferedImage image) { - final int width = image.getWidth(), height = image.getHeight(); + @Contract(pure = true) + @Nonnull public BufferedImage fitImage(@NonNull final BufferedImage image) { + int width = image.getWidth(), height = image.getHeight(); // if an image is bigger at any bound if (width > WIDTH || height > HEIGHT) { @@ -87,26 +88,28 @@ public BufferedImage fitImage(@NonNull final BufferedImage image) { // then divide both by bigger k (treat same optimally!) final float kWidth = width / WIDTH_F, kHeight = height / HEIGHT_F; - if (kHeight == kHeight) { + if (kWidth == kHeight) { // if both overflow coefficients are the same than the image's proportions are same to image map's - val graphics = image.getGraphics(); - graphics.drawImage(image.getScaledInstance(WIDTH, HEIGHT, Image.SCALE_SMOOTH), 0, 0, null); - graphics.dispose(); + width = WIDTH; + height = HEIGHT; } else if (kWidth > kHeight) { // width overflow coefficient is bigger - val graphics = image.getGraphics(); - graphics.drawImage( - image.getScaledInstance(WIDTH, (int) (height / kWidth), Image.SCALE_SMOOTH), 0, 0, null - ); - graphics.dispose(); + //noinspection SuspiciousNameCombination the relatively least dimension is diveided by bigger's coef. + height /= kWidth; + width = WIDTH; } else { // height overflow coefficient is bigger - val graphics = image.getGraphics(); - graphics.drawImage( - image.getScaledInstance((int) (width / kHeight), HEIGHT, Image.SCALE_SMOOTH), 0, 0, null - ); - graphics.dispose(); + //noinspection SuspiciousNameCombination the relatively least dimension is diveided by bigger's coef. + width /= kHeight; + height = HEIGHT; } + + val newImage = new BufferedImage(width, height, TYPE_INT_ARGB); + val graphics = newImage.getGraphics(); + graphics.drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null); + graphics.dispose(); + + return newImage; } return image; @@ -120,9 +123,9 @@ public BufferedImage fitImage(@NonNull final BufferedImage image) { * @param resize whether the image should be resized or cut to fit map image dimensions * @return 2-dimensional array of RGB-{@link int} colors. */ - public int[][] getNonNormalizedMapImagePixels2D(@NonNull final BufferedImage image, final boolean resize) { - if (resize) fitImage(image); - final int width = min(image.getWidth(), WIDTH), height = min(image.getHeight(), HEIGHT); + public int[][] getNonNormalizedMapImagePixels2D(@NonNull BufferedImage image, final boolean resize) { + if (resize) image = fitImage(image); + final int width = image.getWidth(), height = image.getHeight(); val pixels = new int[WIDTH][HEIGHT]; val rgb = image.getRGB(0, 0, width, height, new int[width * height], 0, width); @@ -148,8 +151,8 @@ public int[][] getNonNormalizedMapImagePixels2D(@NonNull final BufferedImage ima * @return array of RGB-{@link int} colors. */ public int[] getNonNormalizedMapImagePixels(@NonNull BufferedImage image, final boolean resize) { - if (resize) fitImage(image); - final int width = min(image.getWidth(), WIDTH), height = min(image.getHeight(), HEIGHT); + if (resize) image = fitImage(image); + final int width = image.getWidth(), height = image.getHeight(); val pixels = new int[PIXELS_COUNT]; val rgb = image.getRGB(0, 0, width, height, new int[width * height], 0, width); From 4085521cb616e536c531e4c54a5552663e25ef73 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 8 Jan 2019 20:43:42 +0300 Subject: [PATCH 085/508] Add @BukkitService --- .../commons/annotation/BukkitService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java new file mode 100644 index 000000000..055daabdf --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java @@ -0,0 +1,14 @@ +package ru.progrm_jarvis.minecraft.commons.annotation; + +import java.lang.annotation.*; + +/** + * Marker to indicate that the annotated element is normally registered as a Bukkit service. + * + * @see org.bukkit.plugin.ServicesManager#getRegistration(Class) + */ +@Documented +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.SOURCE) +public @interface BukkitService { +} From d716497fdc804970c5e4553310a467684b8ad9e9 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 8 Jan 2019 21:59:19 +0300 Subject: [PATCH 086/508] Add getRandom(..) to RandomUtil upgrading chanced variant --- .../minecraft/commons/util/RandomUtil.java | 61 ++++++++++++++++++- .../commons/util/RandomUtilTest.java | 45 ++++++++++++-- 2 files changed, 98 insertions(+), 8 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java index 9fe8ce3be..7cfdad7e0 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java @@ -1,16 +1,32 @@ package ru.progrm_jarvis.minecraft.commons.util; import com.google.common.base.Preconditions; +import lombok.NonNull; import lombok.experimental.UtilityClass; import lombok.val; +import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.concurrent.ThreadLocalRandom; +/** + * Utility for getting random values. + */ @UtilityClass public class RandomUtil { - public T peekRandom(final Map chancedValues) { + /** + * Gets a random value from the map specified considering chances. + * + * @param chancedValues values from which to get a random one + * the keys of the map are the actual values, the values of the map are the chances + * @param type of value randomly got + * @return got random value + * + * @throws IllegalArgumentException if {@code values is empty} + */ + public T getRandom(@NonNull final Map chancedValues) { { val size = chancedValues.size(); @@ -28,6 +44,47 @@ public T peekRandom(final Map chancedValues) { for (val entry : chancedValues.entrySet()) if ((chancesSum -= entry.getValue()) <= chance) return entry.getKey(); - throw new IllegalStateException("Could not peek any chanced value"); + throw new IllegalStateException("Could not get any chanced value"); + } + + /** + * Gets a random value from the list specified. + * + * @param values values from which to get a random one + * @param type of value randomly got + * @return got random value + * + * @throws IllegalArgumentException if {@code values is empty} + */ + public T getRandom(@NonNull final List values) { + val size = values.size(); + Preconditions.checkArgument(size > 0, "There should be at least one chanced value"); + if (size == 1) return values.get(0); + + return values.get(ThreadLocalRandom.current().nextInt(size)); + } + + /** + * Gets a random value from the collection specified. + * + * @param values values from which to get a random one + * @param type of value randomly got + * @return got random value + * + * @throws IllegalArgumentException if {@code values is empty} + */ + public T getRandom(@NonNull final Collection values) { + int index; + { + val size = values.size(); + Preconditions.checkArgument(size > 0, "There should be at least one chanced value"); + if (size == 1) return values.iterator().next(); + + index = ThreadLocalRandom.current().nextInt(size); + } + + for (val value : values) if (index-- == 0) return value; + + throw new IllegalStateException("Could not get any value"); } } diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java index d5abbd44f..b4ac32ef2 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java @@ -4,32 +4,65 @@ import org.apache.commons.lang.math.RandomUtils; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.junit.internal.matchers.IsCollectionContaining.hasItem; +import static org.hamcrest.Matchers.isIn; import static org.junit.jupiter.api.Assertions.assertThrows; class RandomUtilTest { @Test - void testPeekRandom() { + void testGetRandomFromMapOfChances() { var values = MapUtil.fillMap(new HashMap<>(), "One", 1, "Two", 2); + var keySet = values.keySet(); for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( - values.keySet(), hasItem(RandomUtil.peekRandom(values)) + RandomUtil.getRandom(values), isIn(keySet) ); values = MapUtil.fillMap(new HashMap<>(), "One", 1, "Two", 2, "Three", 3, "Four", 4, "Five", 5); + keySet = values.keySet(); for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( - values.keySet(), hasItem(RandomUtil.peekRandom(values)) + RandomUtil.getRandom(values), isIn(keySet) ); values = MapUtil.fillMap(new HashMap<>(), "Hi", 1); for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( - "Hi", equalTo(RandomUtil.peekRandom(values)) + "Hi", equalTo(RandomUtil.getRandom(values)) ); - assertThrows(IllegalArgumentException.class, () -> RandomUtil.peekRandom(new HashMap<>())); + assertThrows(IllegalArgumentException.class, () -> RandomUtil.getRandom(new HashMap<>())); + } + + @Test + void testGetRandomFromList() { + var values = new ArrayList(); + for (var i = 0; i < 64 + RandomUtils.nextInt(65); i++) values.add(Integer.toString(RandomUtils.nextInt())); + + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( + RandomUtil.getRandom(values), isIn(values) + ); + + assertThrows(IllegalArgumentException.class, () -> RandomUtil.getRandom(new ArrayList<>())); + } + + @Test + void testGetRandomFromCollection() { + final Collection values; + { // hide List type + var valuesList = new ArrayList(); + for (var i = 0; i < 64 + RandomUtils.nextInt(65); i++) valuesList.add(Integer.toString(RandomUtils.nextInt())); + values = valuesList; + } + + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( + RandomUtil.getRandom(values), isIn(values) + ); + + assertThrows(IllegalArgumentException.class, () -> RandomUtil.getRandom(new HashSet<>())); } } \ No newline at end of file From 7f1ad9542bdeeb19405ff17bb6cebdbe3c309e80 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 8 Jan 2019 22:20:31 +0300 Subject: [PATCH 087/508] Fix MapImages resizing size check --- .../progrm_jarvis/minecraft/commons/mapimage/MapImages.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java index 570f542e3..779aae6f3 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java @@ -13,6 +13,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static java.awt.image.BufferedImage.TYPE_INT_ARGB; +import static java.lang.Math.min; import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.*; import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImageColor.NO_COLOR_CODE; @@ -125,7 +126,7 @@ protected static byte[][] normalizePixels(final int[][] pixels) { */ public int[][] getNonNormalizedMapImagePixels2D(@NonNull BufferedImage image, final boolean resize) { if (resize) image = fitImage(image); - final int width = image.getWidth(), height = image.getHeight(); + final int width = min(WIDTH, image.getWidth()), height = min(HEIGHT, image.getHeight()); val pixels = new int[WIDTH][HEIGHT]; val rgb = image.getRGB(0, 0, width, height, new int[width * height], 0, width); @@ -152,7 +153,7 @@ public int[][] getNonNormalizedMapImagePixels2D(@NonNull BufferedImage image, fi */ public int[] getNonNormalizedMapImagePixels(@NonNull BufferedImage image, final boolean resize) { if (resize) image = fitImage(image); - final int width = image.getWidth(), height = image.getHeight(); + final int width = min(WIDTH, image.getWidth()), height = min(HEIGHT, image.getHeight()); val pixels = new int[PIXELS_COUNT]; val rgb = image.getRGB(0, 0, width, height, new int[width * height], 0, width); From f5b93fa5d578cf804423b5acef1ea03d4a2ac9b0 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 8 Jan 2019 22:28:16 +0300 Subject: [PATCH 088/508] Make #fitImage(..) return cut if needed --- .../minecraft/commons/mapimage/MapImages.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java index 779aae6f3..800b179dc 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java @@ -73,17 +73,19 @@ protected static byte[][] normalizePixels(final int[][] pixels) { * yet fitting the bounds of {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} * * @param image image to fit (will be redrawn) + * @param resize whether the image should be resized ({@code true}) or cut ({@code false}) * @return the given image redrawn so that its non-empty pixels * are in bound of {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} * * @apiNote returned object may be ignored as all changes happen to the provided image */ @Contract(pure = true) - @Nonnull public BufferedImage fitImage(@NonNull final BufferedImage image) { + @Nonnull public BufferedImage fitImage(@NonNull final BufferedImage image, final boolean resize) { int width = image.getWidth(), height = image.getHeight(); // if an image is bigger at any bound - if (width > WIDTH || height > HEIGHT) { + if (width > WIDTH || height > HEIGHT) if (resize) { + // resizing should be proportional, so: // k(bound) = bound / maxAllowed(bound) // then divide both by bigger k (treat same optimally!) @@ -111,6 +113,9 @@ protected static byte[][] normalizePixels(final int[][] pixels) { graphics.dispose(); return newImage; + } else { + // cut image + return image.getSubimage(0, 0, min(width, WIDTH), min(height, HEIGHT)); } return image; @@ -125,8 +130,8 @@ protected static byte[][] normalizePixels(final int[][] pixels) { * @return 2-dimensional array of RGB-{@link int} colors. */ public int[][] getNonNormalizedMapImagePixels2D(@NonNull BufferedImage image, final boolean resize) { - if (resize) image = fitImage(image); - final int width = min(WIDTH, image.getWidth()), height = min(HEIGHT, image.getHeight()); + image = fitImage(image, resize); + final int width = image.getWidth(), height = image.getHeight(); val pixels = new int[WIDTH][HEIGHT]; val rgb = image.getRGB(0, 0, width, height, new int[width * height], 0, width); @@ -152,8 +157,8 @@ public int[][] getNonNormalizedMapImagePixels2D(@NonNull BufferedImage image, fi * @return array of RGB-{@link int} colors. */ public int[] getNonNormalizedMapImagePixels(@NonNull BufferedImage image, final boolean resize) { - if (resize) image = fitImage(image); - final int width = min(WIDTH, image.getWidth()), height = min(HEIGHT, image.getHeight()); + image = fitImage(image, resize); + final int width = image.getWidth(), height = image.getHeight(); val pixels = new int[PIXELS_COUNT]; val rgb = image.getRGB(0, 0, width, height, new int[width * height], 0, width); From 8dc96834122a445ec9d79553c876afe74a4878e7 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 8 Jan 2019 22:36:48 +0300 Subject: [PATCH 089/508] Add lib-loader module --- lib-loader/pom.xml | 13 +++++++++++++ pom.xml | 6 ++++++ 2 files changed, 19 insertions(+) create mode 100644 lib-loader/pom.xml diff --git a/lib-loader/pom.xml b/lib-loader/pom.xml new file mode 100644 index 000000000..4e6f4a605 --- /dev/null +++ b/lib-loader/pom.xml @@ -0,0 +1,13 @@ + + + 4.0.0 + + minecraft-utils + ru.progrm-jarvis.minecraft + 0.1.0-SNAPSHOT + + + lib-loader + A lightweight module for automatic loading of libraries. + \ No newline at end of file diff --git a/pom.xml b/pom.xml index c24ce933f..0abd6d8d0 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,7 @@ scheduler config fake-entity + lib-loader pom @@ -234,6 +235,11 @@ fake-entity-lib ${project.version} + + ${project.groupId} + lib-loader + ${project.version} + From 1257c4296d19fe76675756169cee7f6ed41d56e4 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 9 Jan 2019 23:19:50 +0300 Subject: [PATCH 090/508] Add ``-with-dep` artifacts building --- pom.xml | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 0abd6d8d0..5b48e10d0 100644 --- a/pom.xml +++ b/pom.xml @@ -167,6 +167,19 @@
+ + org.apache.maven.plugins + maven-shade-plugin + 3.2.1 + + + package + + shade + + + + @@ -304,7 +317,7 @@ org.projectlombok lombok 1.18.4 - provided + true
org.aspectj @@ -315,13 +328,13 @@ org.jetbrains annotations 16.0.3 - provided + true com.google.code.findbugs jsr305 3.0.2 - provided + true @@ -402,6 +415,54 @@ + + build-jars-with-dependencies + + + + org.apache.maven.plugins + maven-shade-plugin + + + shade + + + + ${project.build.finalName}-with-dep + + + + org.projectlombok:lombok + org.jetbrains:annotations + com.google.code.findbugs:jsr305 + + org.openjdk.jmh:* + + + + + *:* + + plugin.yml + Log4j-* + yggdrasil_session_pubkey.der + + META-INF/DEPENDENCIES + META-INF/LICENSE + META-INF/LICENSE.txt + META-INF/log4j-provider.properties + META-INF/MANIFEST.MF + META-INF/NOTICE + META-INF/NOTICE.txt + META-INF/web-fragment.xml + + + + + + + + build-extras From c081d31331b34e25309f2015e8539f56cb4f81df Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 9 Jan 2019 23:20:52 +0300 Subject: [PATCH 091/508] Add -with-dep JAR's building to Travis's deploy.sh --- .travis/deploy.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis/deploy.sh b/.travis/deploy.sh index 9ec0b6160..6765606e1 100644 --- a/.travis/deploy.sh +++ b/.travis/deploy.sh @@ -11,5 +11,6 @@ echo 'Imported encryption key' echo 'Deploying artifacts' # Generate source and javadocs, sign binaries, deploy to Sonatype using credentials from env. -mvn deploy -P build-extras,sign,ossrh-env-credentials,ossrh-deploy --settings .travis/.mvn/settings.xml +mvn deploy -P build-jars-with-dependencies,build-extras,sign,ossrh-env-credentials,ossrh-deploy \ +--settings .travis/.mvn/settings.xml echo 'Deployed artifacts' \ No newline at end of file From 92ad521f13cdd3a83a67d40218de16b02e0fda44 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 9 Jan 2019 23:21:52 +0300 Subject: [PATCH 092/508] Add optional dependencies to lib-loader --- lib-loader/pom.xml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib-loader/pom.xml b/lib-loader/pom.xml index 4e6f4a605..eeb804c33 100644 --- a/lib-loader/pom.xml +++ b/lib-loader/pom.xml @@ -9,5 +9,19 @@ lib-loader - A lightweight module for automatic loading of libraries. + + A lightweight module for automatic loading of libraries. + This is made to have no compile dependencies. + + + + + org.projectlombok + lombok + + + com.google.code.findbugs + jsr305 + + \ No newline at end of file From f80243475025a50220cc39caad15c27109701fe6 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 9 Jan 2019 23:22:19 +0300 Subject: [PATCH 093/508] Implement tiny experimental functionality for lib-loader --- .../minecraft/libloader/LibCoords.java | 102 ++++++ .../minecraft/libloader/LibLoader.java | 295 ++++++++++++++++++ 2 files changed, 397 insertions(+) create mode 100644 lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java create mode 100644 lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java new file mode 100644 index 000000000..ed103887e --- /dev/null +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java @@ -0,0 +1,102 @@ +package ru.progrm_jarvis.minecraft.libloader; + +import lombok.*; +import lombok.experimental.FieldDefaults; + +import javax.annotation.Nullable; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Optional; + +/** + * Coords of a library with dependencies. + */ +@FunctionalInterface +public interface LibCoords { + + String MAVEN_CENTRAL_REPO_URL = "https://repo1.maven.org/maven2/"; + + String SONATYPE_OSS_SNAPSHOTS_REPO_URL = "https://oss.sonatype.org/content/repositories/snapshots/"; + + /** + * Gets the URL of the artifact containing dependency classes. + * + * @return URL of the artifact containing dependency classes + */ + URL getArtifactUrl(); + + @SneakyThrows(MalformedURLException.class) + static LibCoords fromMavenRepo(@NonNull final String repositoryUrl, + @NonNull final String groupId, @NonNull final String artifactId, + @NonNull final String version) { + val jarUrl + = (repositoryUrl.lastIndexOf('/') == repositoryUrl.length() - 1 ? repositoryUrl : repositoryUrl + '/') + + groupId.replace('.', '/') + '/' + artifactId + '/' + version + '/' + + artifactId + '-' + version + ".jar"; + + return new MavenLibCoords(new URL(jarUrl), new URL(jarUrl + ".sha1"), new URL(jarUrl + ".sha1")); + } + + /** + * Computes the hashcode of the library not to repeat loading of the same library (if possible). + * + * @return optional containing hash of the artifact or empty optional if not available + * + * @apiNote this may be a time-consuming operation + */ + default Optional computeHash() { + return Optional.empty(); + } + + static LibCoords fromMavenCentralRepo(@NonNull final String groupId, @NonNull final String artifactId, + @NonNull final String version) { + return fromMavenRepo(MAVEN_CENTRAL_REPO_URL, groupId, artifactId, version); + } + + static LibCoords fromSonatypeOssSnapshotsRepo(@NonNull final String groupId, @NonNull final String artifactId, + @NonNull final String version) { + return fromMavenRepo(SONATYPE_OSS_SNAPSHOTS_REPO_URL, groupId, artifactId, version); + } + + @Value + @FieldDefaults(level = AccessLevel.PROTECTED) + final class MavenLibCoords implements LibCoords { + @NonNull URL artifactUrl; + @Nullable URL hash1Url, hash2Url; + + public MavenLibCoords(@NonNull final URL artifactUrl, + @Nullable final URL hash1Url, @Nullable final URL hash2Url) { + this.artifactUrl = artifactUrl; + this.hash1Url = hash1Url; + this.hash2Url = hash2Url; + } + + public MavenLibCoords(@NonNull final URL jarUrl, final URL hash1Url) { + this(jarUrl, hash1Url, null); + } + + public MavenLibCoords(@NonNull final URL jarUrl) { + this(jarUrl, null, null); + } + + @Override + public Optional computeHash() { + if (hash1Url == null) return Optional.empty(); + try { + if (hash2Url == null) return Optional.ofNullable(LibLoader.readLineFromUrl(hash1Url)); + else { + val hash1 = LibLoader.readLinesFromUrl(hash1Url); + if (hash1 == null) return Optional.empty(); + + val hash2 = LibLoader.readLineFromUrl(hash2Url); + if (hash2 == null) return Optional.empty(); + + return Optional.of(hash1 + "_" + hash2); + } + } catch (final IOException e) { + return Optional.empty(); + } + } + } +} diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java new file mode 100644 index 000000000..95429c11c --- /dev/null +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java @@ -0,0 +1,295 @@ +package ru.progrm_jarvis.minecraft.libloader; + +import lombok.*; +import lombok.experimental.Accessors; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.logging.Logger; + +/** + * A tiny loader of JAR dependencies to runtime. + */ +@ToString +@EqualsAndHashCode +@RequiredArgsConstructor +@Accessors(chain = true) +public class LibLoader { + + private static final Logger DEFAULT_LOGGER = Logger.getLogger("LibLoader"); + + @NonNull private static final MethodHandle URL_CLASS_LOADER__ADD_URL_METHOD; + + @NonNull @Getter private URLClassLoader classLoader; + + /** + * Directory to store library artifacts and hashes in + */ + @NonNull private final File rootDirectory; + + @NonNull @Getter @Setter private Logger log = DEFAULT_LOGGER; + + // creates a MethodHandle object for URLClassLoader#addUrl(URL) method + static { + final Method addUrlMethod; + try { + addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + } catch (final NoSuchMethodException e) { + throw new ExceptionInInitializerError( + "Unable to initialize LibLoader as " + URLClassLoader.class.getCanonicalName() + + " is missing addURL(URL) method" + ); + } + + addUrlMethod.setAccessible(true); + try { + URL_CLASS_LOADER__ADD_URL_METHOD = MethodHandles.lookup().unreflect(addUrlMethod); + } catch (final IllegalAccessException e) { + throw new ExceptionInInitializerError( + "Unable to initialize LibLoader as " + URLClassLoader.class.getCanonicalName() + + " cannot be unreflected to MethodHandle" + ); + } finally { + addUrlMethod.setAccessible(false); + } + } + + /** + * Tries to find an available {@link URLClassLoader} un current context. + * + * @return optional containing found {@link URLClassLoader} or empty if none was found in current context + * + * @implNote this checks current thread's class loader and system class loader + */ + public static Optional getAvailableUrlClassLoader() { + var classLoader = Thread.currentThread().getContextClassLoader(); + if (classLoader instanceof URLClassLoader) return Optional.of((URLClassLoader) classLoader); + + classLoader = ClassLoader.getSystemClassLoader(); + if (classLoader instanceof URLClassLoader) return Optional.of((URLClassLoader) classLoader); + + return Optional.empty(); + } + + /** + * Constructs new lib loader. This performs type-check of {@code classLoader} + * in order to guarantee that it is instance of {@link URLClassLoader}. + * + * @param classLoader class loader to use for loading of libraries, + * should normally be {@link URLClassLoader} + * @param rootDirectory directory to store library artifacts and hashes in + * + * @throws IllegalArgumentException if the {@code classLoader} is not {@link URLClassLoader} + */ + public LibLoader(@NonNull final ClassLoader classLoader, @NonNull final File rootDirectory) { + if (!(classLoader instanceof URLClassLoader)) throw new IllegalArgumentException( + classLoader + " is not instance of URLClassLoader" + ); + + this.classLoader = (URLClassLoader) classLoader; + this.rootDirectory = rootDirectory; + } + + /** + * Constructs new lib loader using default root directory. + * + * @param urlClassLoader class loader to use for loading of libraries + */ + public LibLoader(@NonNull final URLClassLoader urlClassLoader) { + this(urlClassLoader, new File("libs/artifacts/")); + } + + /** + * Constructs new lib loader using default root directory. This performs type-check of {@code classLoader} + * * in order to guarantee that it is instance of {@link URLClassLoader}. + * + * @param classLoader class loader to use for loading of libraries, + * should normally be {@link URLClassLoader} + * + * @throws IllegalArgumentException if the {@code classLoader} is not {@link URLClassLoader} + */ + public LibLoader(@NonNull final ClassLoader classLoader) { + this(classLoader, new File("libs/artifacts/")); + } + + /** + * Constructs new lib loader. This uses class loader got from {@link #getAvailableUrlClassLoader()}. + * + * should normally be {@link URLClassLoader} + * @param rootDirectory directory to store library artifacts and hashes in + */ + public LibLoader(@NonNull final File rootDirectory) { + this(getAvailableUrlClassLoader().orElseThrow( + () -> new IllegalStateException("Cannot find any available URLClassLoader in current context") + ), rootDirectory + ); + } + + /** + * Sets this lib loader's class loader. + * + * @param classLoader class loader to be used by this lib loader + * @return self for chaining + * + * @see #setClassLoader(ClassLoader) variant performing checks of any classloader + */ + public LibLoader setClassLoader(@NonNull final URLClassLoader classLoader) { + this.classLoader = classLoader; + + return this; + } + + /** + * Sets this lib loader's class loader throwing an exception if it is not {@link URLClassLoader}. + * + * @param classLoader class loader to be used by this lib loader + * @throws IllegalArgumentException if the {@code classLoader} is not {@link URLClassLoader} + * @return self for chaining + * + * @see #setClassLoader(URLClassLoader) compile-time type-safe variant + */ + public LibLoader setClassLoader(final ClassLoader classLoader) { + if (!(classLoader instanceof URLClassLoader)) throw new IllegalArgumentException( + classLoader + " is not instance of URLClassLoader" + ); + + setClassLoader((URLClassLoader) classLoader); + + return this; + } + + /** + * Call to this method guarantees that after it {@link #rootDirectory} will be a valid directory. + */ + @SneakyThrows + private void assureRootDirectoryExists() { + if (!rootDirectory.isFile()) Files.createDirectories(rootDirectory.toPath()); + } + + /** + * Reads content of a URL as a list of lines. + * + * @param url url to read data from + * @return lines read from URL + * @throws IOException if an exception occurs while reading + */ + public static List readLinesFromUrl(final URL url) throws IOException { + try (val reader = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8))) { + val lines = new ArrayList(); + + String line; + while ((line = reader.readLine()) != null) lines.add(line); + + return lines; + } + } + + /** + * Reads content of a URL as a single line. + * + * @param url url to read data from + * @return first line read from URL + * @throws IOException if an exception occurs while reading + */ + public static String readLineFromUrl(final URL url) throws IOException { + try (val reader = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8))) { + return reader.readLine(); + } + } + + /** + * Loads a file from URL to file specified + * + * @param url url from which to get the file + * @throws IOException if an exception occurs in an I/O operation + */ + public static void loadFromUrl(final URL url, final File file) throws IOException { + try (val stream = url.openStream()) { + Files.copy(stream, file.toPath(), StandardCopyOption.REPLACE_EXISTING); + } + } + + /** + * Loads a library by its coords. + * Loading should happen if: + *
    + *
  • The library is missing
  • + *
  • The hash is not the same
  • + *
  • Hash is empty anywhere
  • + *
+ * + * @param name name to store this library by + * @param libCoords coords of a library artifact + * @param addToClasspath whether or not the library loaded should be added to classpath + * + * @return file of created artifact + */ + @SneakyThrows + public File loadLib(@NonNull final String name, @NonNull final LibCoords libCoords, final boolean addToClasspath) { + assureRootDirectoryExists(); + + log.info("Loading library " + name); + + val artifactFile = new File(rootDirectory, name + ".jar"); + val hashFile = new File(rootDirectory, name + ".hash"); + val hash = libCoords.computeHash(); + + if (!artifactFile.isFile() || !hashFile.isFile() || !Files.lines(hashFile.toPath()).findFirst().equals(hash)) { + { + val url = libCoords.getArtifactUrl(); + log.info("Downloading library " + name + " from source: " + url); + loadFromUrl(url, artifactFile); + } + Files.write(hashFile.toPath(), hash.orElse("").getBytes(StandardCharsets.UTF_8)); + } + + if (addToClasspath) addUrlToClasspath(classLoader, artifactFile.toURI().toURL()); + + return artifactFile; + } + + /** + * Loads a library by its coords adding it to classpath. + * Loading should happen if: + *
    + *
  • The library is missing
  • + *
  • The hash is not the same
  • + *
  • Hash is empty anywhere
  • + *
+ * + * @param name name to store this library by + * @param libCoords coords of a library artifact + * + * @return file of created artifact + * + * @see #loadLib(String, LibCoords, boolean) called with {@code addToClasspath} set to {@code true} + */ + @SneakyThrows + public File loadLib(@NonNull final String name, @NonNull final LibCoords libCoords) { + return loadLib(name, libCoords, true); + } + + /** + * Adds the specified URL to classpath of class loader. + * + * @param classLoader class loader to add the url to + * @param url url to add to classpath of class loader + */ + @SneakyThrows + public static void addUrlToClasspath(@NonNull final URLClassLoader classLoader, @NonNull final URL url) { + URL_CLASS_LOADER__ADD_URL_METHOD.invokeExact(classLoader, url); + } +} From aadcf85d56298a0ab8a7504d6964cd3478163e57 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 9 Jan 2019 23:55:30 +0300 Subject: [PATCH 094/508] Move nms-utils and scheduler-utils modules to minecraft-commons, removing fat jar's building --- .travis/deploy.sh | 3 +- .../minecraft/commons/nms}/Conversions.java | 2 +- .../minecraft/commons/nms}/LegacySupport.java | 2 +- .../minecraft/commons/nms}/NmsUtil.java | 8 +- .../minecraft/commons/nms}/ToStringUtil.java | 2 +- .../nms}/metadata/DataWatcherFactory.java | 4 +- .../metadata/LatestDataWatcherFactory.java | 2 +- .../metadata/LegacyDataWatcherFactory.java | 2 +- .../nms}/metadata/MetadataGenerator.java | 6 +- .../nms}/protocol/misc/PacketListeners.java | 6 +- .../schedule}/misc/KeyedSchedulerGroup.java | 2 +- .../schedule}/misc/SchedulerGroup.java | 2 +- .../schedule}/misc/SchedulerGroups.java | 6 +- .../commons/schedule}/pool/KeyedLoopPool.java | 2 +- .../commons/schedule}/pool/LoopPool.java | 2 +- .../schedule}/pool/SingleWorkerLoopPool.java | 6 +- .../task/counter/BukkitCallbackTimer.java | 2 +- .../schedule}/task/counter/BukkitTimer.java | 2 +- .../ConcurrentBukkitCallbackTimer.java | 2 +- .../task/counter/ConcurrentBukkitTimer.java | 2 +- .../initializer/BukkitTaskInitializer.java | 2 +- .../initializer/BukkitTaskInitializers.java | 2 +- .../commons/nms}/ToStringUtilTest.java | 4 +- .../pool/SingleWorkerLoopPoolTest.java | 4 +- nms/pom.xml | 51 ------------ .../craftbukkit/v1_12_R1/CraftEntity.java | 6 -- .../bukkit/craftbukkit/v1_12_R1/Entity.java | 6 -- .../craftbukkit/v1_12_R1/ServerTestImpl.java | 6 -- .../minecraft/nmsutils/NmsUtilTest.java | 55 ------------- pom.xml | 81 +++++++------------ scheduler/pom.xml | 46 ----------- 31 files changed, 70 insertions(+), 258 deletions(-) rename {nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms}/Conversions.java (97%) rename {nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms}/LegacySupport.java (98%) rename {nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms}/NmsUtil.java (94%) rename {nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms}/ToStringUtil.java (98%) rename {nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms}/metadata/DataWatcherFactory.java (99%) rename {nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms}/metadata/LatestDataWatcherFactory.java (99%) rename {nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms}/metadata/LegacyDataWatcherFactory.java (99%) rename {nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms}/metadata/MetadataGenerator.java (99%) rename {nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms}/protocol/misc/PacketListeners.java (97%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/misc/KeyedSchedulerGroup.java (86%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/misc/SchedulerGroup.java (96%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/misc/SchedulerGroups.java (96%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/pool/KeyedLoopPool.java (92%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/pool/LoopPool.java (96%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/pool/SingleWorkerLoopPool.java (96%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/task/counter/BukkitCallbackTimer.java (91%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/task/counter/BukkitTimer.java (90%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/task/counter/ConcurrentBukkitCallbackTimer.java (93%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/task/counter/ConcurrentBukkitTimer.java (92%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/task/initializer/BukkitTaskInitializer.java (70%) rename {scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule}/task/initializer/BukkitTaskInitializers.java (98%) rename {nms/src/test/java/ru/progrm_jarvis/minecraft/nmsutils => commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms}/ToStringUtilTest.java (78%) rename {scheduler/src/test/java/ru/progrm_jarvis/minecraft/schedulerutils => commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule}/pool/SingleWorkerLoopPoolTest.java (92%) delete mode 100644 nms/pom.xml delete mode 100644 nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/CraftEntity.java delete mode 100644 nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/Entity.java delete mode 100644 nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/ServerTestImpl.java delete mode 100644 nms/src/test/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtilTest.java delete mode 100644 scheduler/pom.xml diff --git a/.travis/deploy.sh b/.travis/deploy.sh index 6765606e1..9ec0b6160 100644 --- a/.travis/deploy.sh +++ b/.travis/deploy.sh @@ -11,6 +11,5 @@ echo 'Imported encryption key' echo 'Deploying artifacts' # Generate source and javadocs, sign binaries, deploy to Sonatype using credentials from env. -mvn deploy -P build-jars-with-dependencies,build-extras,sign,ossrh-env-credentials,ossrh-deploy \ ---settings .travis/.mvn/settings.xml +mvn deploy -P build-extras,sign,ossrh-env-credentials,ossrh-deploy --settings .travis/.mvn/settings.xml echo 'Deployed artifacts' \ No newline at end of file diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/Conversions.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java similarity index 97% rename from nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/Conversions.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java index 1d34d5f6b..7b2aaa76c 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/Conversions.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.nmsutils; +package ru.progrm_jarvis.minecraft.commons.nms; import com.comphenix.protocol.reflect.EquivalentConverter; import com.comphenix.protocol.wrappers.EnumWrappers; diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java similarity index 98% rename from nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java index 6d61f02e0..928161ba2 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/LegacySupport.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.nmsutils; +package ru.progrm_jarvis.minecraft.commons.nms; import lombok.AccessLevel; import lombok.NonNull; diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java similarity index 94% rename from nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtil.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java index 0024a7609..ccbf39f09 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.nmsutils; +package ru.progrm_jarvis.minecraft.commons.nms; import com.comphenix.protocol.wrappers.WrappedDataWatcher; import lombok.NonNull; @@ -7,9 +7,9 @@ import lombok.experimental.UtilityClass; import lombok.val; import org.bukkit.Bukkit; -import ru.progrm_jarvis.minecraft.nmsutils.metadata.DataWatcherFactory; -import ru.progrm_jarvis.minecraft.nmsutils.metadata.LatestDataWatcherFactory; -import ru.progrm_jarvis.minecraft.nmsutils.metadata.LegacyDataWatcherFactory; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.DataWatcherFactory; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.LatestDataWatcherFactory; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.LegacyDataWatcherFactory; import ru.progrm_jarvis.reflector.wrapper.FieldWrapper; import ru.progrm_jarvis.reflector.wrapper.fast.FastFieldWrapper; diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/ToStringUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java similarity index 98% rename from nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/ToStringUtil.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java index 8442fbec5..5efb4216b 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/ToStringUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.nmsutils; +package ru.progrm_jarvis.minecraft.commons.nms; import com.comphenix.packetwrapper.PacketWrapper; import com.google.common.base.Function; diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/DataWatcherFactory.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java similarity index 99% rename from nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/DataWatcherFactory.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java index c500a6ea3..f8a927a59 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/DataWatcherFactory.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java @@ -1,10 +1,10 @@ -package ru.progrm_jarvis.minecraft.nmsutils.metadata; +package ru.progrm_jarvis.minecraft.commons.nms.metadata; import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.wrappers.*; import com.comphenix.protocol.wrappers.EnumWrappers.Direction; import org.bukkit.inventory.ItemStack; -import ru.progrm_jarvis.minecraft.nmsutils.Conversions; +import ru.progrm_jarvis.minecraft.commons.nms.Conversions; import java.util.Optional; import java.util.UUID; diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/LatestDataWatcherFactory.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LatestDataWatcherFactory.java similarity index 99% rename from nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/LatestDataWatcherFactory.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LatestDataWatcherFactory.java index 87b698662..41746afe6 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/LatestDataWatcherFactory.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LatestDataWatcherFactory.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.nmsutils.metadata; +package ru.progrm_jarvis.minecraft.commons.nms.metadata; import com.comphenix.protocol.wrappers.BlockPosition; import com.comphenix.protocol.wrappers.WrappedDataWatcher; diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/LegacyDataWatcherFactory.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java similarity index 99% rename from nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/LegacyDataWatcherFactory.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java index a4d158bdb..9d0e32af7 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/LegacyDataWatcherFactory.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.nmsutils.metadata; +package ru.progrm_jarvis.minecraft.commons.nms.metadata; import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.wrappers.BlockPosition; diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/MetadataGenerator.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java similarity index 99% rename from nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/MetadataGenerator.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java index e7017bff7..56b5a4cbb 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/metadata/MetadataGenerator.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.nmsutils.metadata; +package ru.progrm_jarvis.minecraft.commons.nms.metadata; import com.comphenix.protocol.wrappers.*; import com.comphenix.protocol.wrappers.EnumWrappers.Particle; @@ -8,8 +8,8 @@ import lombok.val; import lombok.var; import org.bukkit.inventory.ItemStack; -import ru.progrm_jarvis.minecraft.nmsutils.Conversions; -import ru.progrm_jarvis.minecraft.nmsutils.NmsUtil; +import ru.progrm_jarvis.minecraft.commons.nms.Conversions; +import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; import java.util.Optional; import java.util.UUID; diff --git a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/protocol/misc/PacketListeners.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java similarity index 97% rename from nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/protocol/misc/PacketListeners.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java index ecd6f1454..baf925d7b 100644 --- a/nms/src/main/java/ru/progrm_jarvis/minecraft/nmsutils/protocol/misc/PacketListeners.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java @@ -1,10 +1,12 @@ -package ru.progrm_jarvis.minecraft.nmsutils.protocol.misc; +package ru.progrm_jarvis.minecraft.commons.nms.protocol.misc; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketListener; -import lombok.*; +import lombok.Getter; +import lombok.NonNull; +import lombok.ToString; import lombok.experimental.UtilityClass; import org.bukkit.plugin.Plugin; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/misc/KeyedSchedulerGroup.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java similarity index 86% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/misc/KeyedSchedulerGroup.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java index 2178c913e..de02506b9 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/misc/KeyedSchedulerGroup.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.misc; +package ru.progrm_jarvis.minecraft.commons.schedule.misc; import lombok.NonNull; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/misc/SchedulerGroup.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java similarity index 96% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/misc/SchedulerGroup.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java index 2bf9590f1..8598de23f 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/misc/SchedulerGroup.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.misc; +package ru.progrm_jarvis.minecraft.commons.schedule.misc; import lombok.NonNull; import lombok.val; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/misc/SchedulerGroups.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java similarity index 96% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/misc/SchedulerGroups.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java index f78300d16..9cd5abd5f 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/misc/SchedulerGroups.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.misc; +package ru.progrm_jarvis.minecraft.commons.schedule.misc; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @@ -11,8 +11,8 @@ import org.bukkit.event.Listener; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.plugin.Plugin; -import ru.progrm_jarvis.minecraft.schedulerutils.task.initializer.BukkitTaskInitializer; -import ru.progrm_jarvis.minecraft.schedulerutils.task.initializer.BukkitTaskInitializers; +import ru.progrm_jarvis.minecraft.commons.schedule.task.initializer.BukkitTaskInitializer; +import ru.progrm_jarvis.minecraft.commons.schedule.task.initializer.BukkitTaskInitializers; import java.util.ArrayList; import java.util.Collection; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/KeyedLoopPool.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java similarity index 92% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/KeyedLoopPool.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java index 8afcb94ad..e6e7d3e67 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/KeyedLoopPool.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.pool; +package ru.progrm_jarvis.minecraft.commons.schedule.pool; import lombok.NonNull; import org.bukkit.plugin.Plugin; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/LoopPool.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java similarity index 96% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/LoopPool.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java index 8d5233cb4..b174412e9 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/LoopPool.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.pool; +package ru.progrm_jarvis.minecraft.commons.schedule.pool; import com.google.common.base.Preconditions; import gnu.trove.map.TLongObjectMap; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/SingleWorkerLoopPool.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java similarity index 96% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/SingleWorkerLoopPool.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java index 2a6477c58..069d50a4d 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/SingleWorkerLoopPool.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java @@ -1,11 +1,11 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.pool; +package ru.progrm_jarvis.minecraft.commons.schedule.pool; import lombok.*; import lombok.experimental.FieldDefaults; import lombok.experimental.NonFinal; import org.bukkit.plugin.Plugin; -import ru.progrm_jarvis.minecraft.schedulerutils.misc.KeyedSchedulerGroup; -import ru.progrm_jarvis.minecraft.schedulerutils.misc.SchedulerGroups; +import ru.progrm_jarvis.minecraft.commons.schedule.misc.KeyedSchedulerGroup; +import ru.progrm_jarvis.minecraft.commons.schedule.misc.SchedulerGroups; import java.util.ArrayList; import java.util.Collection; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitCallbackTimer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java similarity index 91% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitCallbackTimer.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java index d18af8a25..2b3fa401b 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitCallbackTimer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.task.counter; +package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; import lombok.AccessLevel; import lombok.NonNull; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitTimer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java similarity index 90% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitTimer.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java index 618942e98..d4e073c13 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/BukkitTimer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.task.counter; +package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; import lombok.AccessLevel; import lombok.NonNull; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitCallbackTimer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java similarity index 93% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitCallbackTimer.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java index 7e8cdd698..4ca571401 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitCallbackTimer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.task.counter; +package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; import lombok.AccessLevel; import lombok.NonNull; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitTimer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java similarity index 92% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitTimer.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java index d1bc30448..eac593424 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/counter/ConcurrentBukkitTimer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.task.counter; +package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; import lombok.AccessLevel; import lombok.NonNull; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/initializer/BukkitTaskInitializer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java similarity index 70% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/initializer/BukkitTaskInitializer.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java index 926227403..90d9125d0 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/initializer/BukkitTaskInitializer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.task.initializer; +package ru.progrm_jarvis.minecraft.commons.schedule.task.initializer; import org.bukkit.scheduler.BukkitTask; diff --git a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/initializer/BukkitTaskInitializers.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java similarity index 98% rename from scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/initializer/BukkitTaskInitializers.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java index 1dd54e6ac..2a32decae 100644 --- a/scheduler/src/main/java/ru/progrm_jarvis/minecraft/schedulerutils/task/initializer/BukkitTaskInitializers.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.task.initializer; +package ru.progrm_jarvis.minecraft.commons.schedule.task.initializer; import lombok.AccessLevel; import lombok.NonNull; diff --git a/nms/src/test/java/ru/progrm_jarvis/minecraft/nmsutils/ToStringUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java similarity index 78% rename from nms/src/test/java/ru/progrm_jarvis/minecraft/nmsutils/ToStringUtilTest.java rename to commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java index ab969c2a8..934712783 100644 --- a/nms/src/test/java/ru/progrm_jarvis/minecraft/nmsutils/ToStringUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java @@ -1,8 +1,8 @@ -package ru.progrm_jarvis.minecraft.nmsutils; +package ru.progrm_jarvis.minecraft.commons.nms; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; class ToStringUtilTest { diff --git a/scheduler/src/test/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/SingleWorkerLoopPoolTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java similarity index 92% rename from scheduler/src/test/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/SingleWorkerLoopPoolTest.java rename to commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java index 3287a4f24..583490fdf 100644 --- a/scheduler/src/test/java/ru/progrm_jarvis/minecraft/schedulerutils/pool/SingleWorkerLoopPoolTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.schedulerutils.pool; +package ru.progrm_jarvis.minecraft.commons.schedule.pool; import org.bukkit.Bukkit; import org.bukkit.Server; @@ -10,7 +10,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import ru.progrm_jarvis.minecraft.schedulerutils.pool.LoopPool.TaskOptions; +import ru.progrm_jarvis.minecraft.commons.schedule.pool.LoopPool.TaskOptions; import java.util.Random; diff --git a/nms/pom.xml b/nms/pom.xml deleted file mode 100644 index 162ef4c02..000000000 --- a/nms/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - minecraft-utils - ru.progrm-jarvis.minecraft - 0.1.0-SNAPSHOT - - nms-utils - - jar - - - - org.spigotmc - spigot-api - - - ${project.parent.groupId} - minecraft-commons - - - com.comphenix.protocol - ProtocolLib-API - - - com.comphenix.packetwrapper - PacketWrapper - - - ru.progrm-jarvis.reflector - reflector - - - - org.projectlombok - lombok - - - - - org.junit.jupiter - junit-jupiter-api - - - org.mockito - mockito-core - - - \ No newline at end of file diff --git a/nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/CraftEntity.java b/nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/CraftEntity.java deleted file mode 100644 index aff3e70e7..000000000 --- a/nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/CraftEntity.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.bukkit.craftbukkit.v1_12_R1; - -public class CraftEntity { - - private int entityCount = 0; -} diff --git a/nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/Entity.java b/nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/Entity.java deleted file mode 100644 index 417b22891..000000000 --- a/nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/Entity.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.bukkit.craftbukkit.v1_12_R1; - -public class Entity { - - private int entityCount = 0; -} diff --git a/nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/ServerTestImpl.java b/nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/ServerTestImpl.java deleted file mode 100644 index 9e05b84dd..000000000 --- a/nms/src/test/java/org/bukkit/craftbukkit/v1_12_R1/ServerTestImpl.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.bukkit.craftbukkit.v1_12_R1; - -import org.bukkit.Server; - -public interface ServerTestImpl extends Server { -} diff --git a/nms/src/test/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtilTest.java b/nms/src/test/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtilTest.java deleted file mode 100644 index c5d0304dc..000000000 --- a/nms/src/test/java/ru/progrm_jarvis/minecraft/nmsutils/NmsUtilTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package ru.progrm_jarvis.minecraft.nmsutils; - -class NmsUtilTest { - - /* - TODO find solution for effective mocking - - static final short GENERATION = 12; - static final String VERSION_NAME = "v1_" + GENERATION + "_R1"; - - @BeforeEach - void setUp() { - val server = mock(ServerTestImpl.class); - - val logger = mock(Logger.class); - when(server.getLogger()).thenReturn(logger); - - Bukkit.setServer(server); - } - - @Test - void getVersion() { - val version = NmsUtil.getVersion(); - - assertEquals(version.getName(), VERSION_NAME); - assertEquals(version.getGeneration(), 12); - assertEquals(new NmsUtil.NmsVersion(VERSION_NAME, GENERATION), version); - } - - @Test - void getNmsPackage() { - } - - @Test - void getCraftBukkitPackage() { - } - - @Test - void getDataWatcherFactory() { - } - - @Test - void dataWatcherModifier() { - } - - @Test - void dataWatcherModifier1() { - } - - @Test - void nextEntityId() { - } - - */ -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 5b48e10d0..10ec8cde8 100644 --- a/pom.xml +++ b/pom.xml @@ -13,8 +13,6 @@ mc-unit commons - nms - scheduler config fake-entity lib-loader @@ -179,6 +177,37 @@ + + + + + org.projectlombok:lombok + org.jetbrains:annotations + com.google.code.findbugs:jsr305 + + org.openjdk.jmh:* + + + + + *:* + + plugin.yml + Log4j-* + yggdrasil_session_pubkey.der + + META-INF/DEPENDENCIES + META-INF/LICENSE + META-INF/LICENSE.txt + META-INF/log4j-provider.properties + META-INF/MANIFEST.MF + META-INF/NOTICE + META-INF/NOTICE.txt + META-INF/web-fragment.xml + + + + @@ -415,54 +444,6 @@
- - build-jars-with-dependencies - - - - org.apache.maven.plugins - maven-shade-plugin - - - shade - - - - ${project.build.finalName}-with-dep - - - - org.projectlombok:lombok - org.jetbrains:annotations - com.google.code.findbugs:jsr305 - - org.openjdk.jmh:* - - - - - *:* - - plugin.yml - Log4j-* - yggdrasil_session_pubkey.der - - META-INF/DEPENDENCIES - META-INF/LICENSE - META-INF/LICENSE.txt - META-INF/log4j-provider.properties - META-INF/MANIFEST.MF - META-INF/NOTICE - META-INF/NOTICE.txt - META-INF/web-fragment.xml - - - - - - - - build-extras diff --git a/scheduler/pom.xml b/scheduler/pom.xml deleted file mode 100644 index 18760225c..000000000 --- a/scheduler/pom.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - 4.0.0 - - minecraft-utils - ru.progrm-jarvis.minecraft - 0.1.0-SNAPSHOT - - - scheduler-utils - - - - org.projectlombok - lombok - - - com.google.code.findbugs - jsr305 - - - - org.spigotmc - spigot-api - - - net.sf.trove4j - trove4j - - - - - org.junit.jupiter - junit-jupiter-api - - - org.mockito - mockito-core - - - org.mockito - mockito-junit-jupiter - - - \ No newline at end of file From 7a0cbc411a9b87ab1eb66ce094d9fa259e6251af Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 9 Jan 2019 23:58:38 +0300 Subject: [PATCH 095/508] Create separate -dep modules for classes requiring it ending deprecated module removal --- commons-dep/pom.xml | 29 +++++++++++++++++++ config-dep/pom.xml | 29 +++++++++++++++++++ fake-entity-dep/pom.xml | 29 +++++++++++++++++++ fake-entity/pom.xml | 4 --- .../entity/ArmorStandBlockItem.java | 14 ++++----- pom.xml | 17 +++++------ 6 files changed, 101 insertions(+), 21 deletions(-) create mode 100644 commons-dep/pom.xml create mode 100644 config-dep/pom.xml create mode 100644 fake-entity-dep/pom.xml diff --git a/commons-dep/pom.xml b/commons-dep/pom.xml new file mode 100644 index 000000000..929bcf807 --- /dev/null +++ b/commons-dep/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + minecraft-utils + ru.progrm-jarvis.minecraft + 0.1.0-SNAPSHOT + + minecraft-commons-dep + + minecraft-commons module with all dependencies shaded + + + + + org.apache.maven.plugins + maven-shade-plugin + + + + + + + ${project.parent.groupId} + minecraft-commons + + + \ No newline at end of file diff --git a/config-dep/pom.xml b/config-dep/pom.xml new file mode 100644 index 000000000..d263f0a68 --- /dev/null +++ b/config-dep/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + minecraft-utils + ru.progrm-jarvis.minecraft + 0.1.0-SNAPSHOT + + ez-cfg-dep + + ez-cfg module with all dependencies shaded + + + + + org.apache.maven.plugins + maven-shade-plugin + + + + + + + ${project.parent.groupId} + ez-cfg + + + \ No newline at end of file diff --git a/fake-entity-dep/pom.xml b/fake-entity-dep/pom.xml new file mode 100644 index 000000000..73451135b --- /dev/null +++ b/fake-entity-dep/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + minecraft-utils + ru.progrm-jarvis.minecraft + 0.1.0-SNAPSHOT + + fake-entity-lib-dep + + fake-entity-lib module with all dependencies shaded + + + + + org.apache.maven.plugins + maven-shade-plugin + + + + + + + ${project.parent.groupId} + fake-entity-lib + + + \ No newline at end of file diff --git a/fake-entity/pom.xml b/fake-entity/pom.xml index 63b9f8822..52db215f5 100644 --- a/fake-entity/pom.xml +++ b/fake-entity/pom.xml @@ -25,10 +25,6 @@ ru.progrm-jarvis.minecraft minecraft-commons - - ${project.parent.groupId} - nms-utils - org.spigotmc diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index b4f12b2ed..6e8824e58 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -13,18 +13,18 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import ru.progrm_jarvis.minecraft.nmsutils.NmsUtil; -import ru.progrm_jarvis.minecraft.nmsutils.metadata.MetadataGenerator; -import ru.progrm_jarvis.minecraft.nmsutils.metadata.MetadataGenerator.ArmorStand; -import ru.progrm_jarvis.minecraft.nmsutils.metadata.MetadataGenerator.Entity; +import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.Entity; import javax.annotation.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import static ru.progrm_jarvis.minecraft.nmsutils.metadata.MetadataGenerator.ArmorStand.armorStandFlags; -import static ru.progrm_jarvis.minecraft.nmsutils.metadata.MetadataGenerator.ArmorStand.headRotation; -import static ru.progrm_jarvis.minecraft.nmsutils.metadata.MetadataGenerator.Entity.entityFlags; +import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.armorStandFlags; +import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.headRotation; +import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.Entity.entityFlags; /** * A fake small (or very small) movable block-item which can be normally rotated over all axises diff --git a/pom.xml b/pom.xml index 10ec8cde8..f4955201d 100644 --- a/pom.xml +++ b/pom.xml @@ -12,9 +12,16 @@ 0.1.0-SNAPSHOT mc-unit + commons + commons-dep + config + config-dep + fake-entity + fake-entity-dep + lib-loader pom @@ -257,16 +264,6 @@ minecraft-commons ${project.version} - - ${project.groupId} - nms-utils - ${project.version} - - - ${project.groupId} - scheduler-utils - ${project.version} - ${project.groupId} ez-cfg From 9bef2ee1c5e2c0bea053534e3c73426b9b7bdf77 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 10 Jan 2019 00:22:17 +0300 Subject: [PATCH 096/508] Fix build due to missing test dependencies --- commons/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/commons/pom.xml b/commons/pom.xml index a9031678c..3dd57955e 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -71,5 +71,9 @@ org.mockito mockito-core + + org.mockito + mockito-junit-jupiter + \ No newline at end of file From 28bb93f90b1c912956044e7edad491f5e02812e1 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 10 Jan 2019 20:56:45 +0300 Subject: [PATCH 097/508] Add junit dependency to lib-loader --- lib-loader/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib-loader/pom.xml b/lib-loader/pom.xml index eeb804c33..261d2881e 100644 --- a/lib-loader/pom.xml +++ b/lib-loader/pom.xml @@ -23,5 +23,10 @@ com.google.code.findbugs jsr305 + + + org.junit.jupiter + junit-jupiter-api + \ No newline at end of file From 0ac5acc1cea6153afe8e48e5dffaa4268f96d754 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 10 Jan 2019 20:57:49 +0300 Subject: [PATCH 098/508] Add Sonatype Nexus based LibCoords to lib-loader --- .../minecraft/libloader/LibCoords.java | 233 ++++++++++++++++-- .../minecraft/libloader/LibLoader.java | 30 ++- .../minecraft/libloader/LibCoordsTest.java | 46 ++++ .../src/test/resources/maven-metadata.xml | 59 +++++ 4 files changed, 336 insertions(+), 32 deletions(-) create mode 100644 lib-loader/src/test/java/ru/progrm_jarvis/minecraft/libloader/LibCoordsTest.java create mode 100644 lib-loader/src/test/resources/maven-metadata.xml diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java index ed103887e..429368602 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java @@ -2,9 +2,17 @@ import lombok.*; import lombok.experimental.FieldDefaults; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; import javax.annotation.Nullable; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; import java.net.MalformedURLException; import java.net.URL; import java.util.Optional; @@ -20,23 +28,14 @@ public interface LibCoords { String SONATYPE_OSS_SNAPSHOTS_REPO_URL = "https://oss.sonatype.org/content/repositories/snapshots/"; /** - * Gets the URL of the artifact containing dependency classes. + * Opens stream for accessing library artifact. * * @return URL of the artifact containing dependency classes + * + * @apiNote returned stream must be manually closed + * @apiNote should call{@link #assureIsRefreshed()} before all logic */ - URL getArtifactUrl(); - - @SneakyThrows(MalformedURLException.class) - static LibCoords fromMavenRepo(@NonNull final String repositoryUrl, - @NonNull final String groupId, @NonNull final String artifactId, - @NonNull final String version) { - val jarUrl - = (repositoryUrl.lastIndexOf('/') == repositoryUrl.length() - 1 ? repositoryUrl : repositoryUrl + '/') - + groupId.replace('.', '/') + '/' + artifactId + '/' + version + '/' - + artifactId + '-' + version + ".jar"; - - return new MavenLibCoords(new URL(jarUrl), new URL(jarUrl + ".sha1"), new URL(jarUrl + ".sha1")); - } + InputStream openArtifactStream() throws IOException; /** * Computes the hashcode of the library not to repeat loading of the same library (if possible). @@ -44,59 +43,245 @@ static LibCoords fromMavenRepo(@NonNull final String repositoryUrl, * @return optional containing hash of the artifact or empty optional if not available * * @apiNote this may be a time-consuming operation + * @apiNote should call{@link #assureIsRefreshed()} before all logic */ default Optional computeHash() { return Optional.empty(); } + /** + * Refreshes the coordinate so that it is actualized. + */ + default void refresh() {} + + /** + * Checks whether this lib coords have been refreshed at least once. + * + * @return {@code true} if {@link #refresh()} have been called at least once or doesn't requre refreshing + * and {@code false} otherwise. + */ + default boolean isRefreshed() { + return true; + } + + /** + * Refreshes the lib coords if they haven't been yet. + */ + default void assureIsRefreshed() { + if (!isRefreshed()) refresh(); + } + + /** + * Gets the root URL for the repository of specified parameters. + * + * @param repositoryUrl URL of the repository of the artifact + * @param groupId artifact's {@code groupId} + * @param artifactId artifact's {@code artifactId} + * @param version artifact's version + * @return URl to the artifacts root ended with '/' + */ + static String getMavenArtifactsRootUrl(@NonNull final String repositoryUrl, + @NonNull final String groupId, @NonNull final String artifactId, + @NonNull final String version) { + return (repositoryUrl.lastIndexOf('/') == repositoryUrl.length() - 1 ? repositoryUrl : repositoryUrl + '/') + + groupId.replace('.', '/') + '/' + artifactId + '/' + version + '/'; + } + + @SneakyThrows(MalformedURLException.class) + static LibCoords fromMavenRepo(@NonNull final String repositoryUrl, + @NonNull final String groupId, @NonNull final String artifactId, + @NonNull final String version) { + val jarUrl = getMavenArtifactsRootUrl(repositoryUrl, groupId, artifactId, version) + + artifactId + '-' + version + ".jar"; + + return new MavenRepoLibCoords(new URL(jarUrl), new URL(jarUrl + ".sha1"), new URL(jarUrl + ".md5")); + } + static LibCoords fromMavenCentralRepo(@NonNull final String groupId, @NonNull final String artifactId, @NonNull final String version) { return fromMavenRepo(MAVEN_CENTRAL_REPO_URL, groupId, artifactId, version); } + @SneakyThrows(MalformedURLException.class) + static LibCoords fromSonatypeNexusRepo(@NonNull final String repositoryUrl, + @NonNull final String groupId, @NonNull final String artifactId, + @NonNull final String version, @NonNull final String metadataFileName) { + val rootUrl = getMavenArtifactsRootUrl(repositoryUrl, groupId, artifactId, version); + + return new SonatypeNexusRepoLibCoords(new URL(rootUrl + metadataFileName), rootUrl); + } + + static LibCoords fromSonatypeNexusRepo(@NonNull final String repositoryUrl, + @NonNull final String groupId, @NonNull final String artifactId, + @NonNull final String version) { + return fromSonatypeNexusRepo( + repositoryUrl, groupId, artifactId, version, SonatypeNexusRepoLibCoords.METADATA_FILE_NAME + ); + } + static LibCoords fromSonatypeOssSnapshotsRepo(@NonNull final String groupId, @NonNull final String artifactId, @NonNull final String version) { - return fromMavenRepo(SONATYPE_OSS_SNAPSHOTS_REPO_URL, groupId, artifactId, version); + return fromSonatypeNexusRepo( + SONATYPE_OSS_SNAPSHOTS_REPO_URL, groupId, artifactId, + version, SonatypeNexusRepoLibCoords.METADATA_FILE_NAME + ); } + /** + * Gets the name of the artifact described in the specified {@code maven-metadata.xml} of Sonatype Nexus. + * + * @param documentElement {@code maven-metadata.xml} standard for Sonatype Nexus snapshots repository. + * @return name of the artifact specified in given {@code maven-metadata.xml} document element + * + * @see Document#getDocumentElement() to create {@link Element} from {@link Document} + */ + static String getLatestNexusArtifactName(@NonNull final Element documentElement) { + val version = documentElement.getElementsByTagName("version").item(0).getFirstChild().getTextContent(); + val snapshot = (Element) ((Element) documentElement.getElementsByTagName("versioning").item(0)) + .getElementsByTagName("snapshot").item(0); + + return documentElement.getElementsByTagName("artifactId").item(0).getFirstChild().getTextContent() + + '-' + (version.endsWith("-SNAPSHOT") ? version.substring(0, version.length() - 9) : version) + + '-' + snapshot.getElementsByTagName("timestamp").item(0).getFirstChild().getTextContent() + + '-' + snapshot.getElementsByTagName("buildNumber").item(0).getFirstChild().getTextContent(); + } + + /** + * Lib coords of an artifact normally contained in non-SNAPSHOT maven repository. + * Its artifact is accessed by direct URL. + * The hash is computed from their URL requests' contents concatenated using {@code '_'}. + */ @Value - @FieldDefaults(level = AccessLevel.PROTECTED) - final class MavenLibCoords implements LibCoords { + @FieldDefaults(level = AccessLevel.PRIVATE) + final class MavenRepoLibCoords implements LibCoords { + + /** + * URL of artifact + */ @NonNull URL artifactUrl; - @Nullable URL hash1Url, hash2Url; + /** + * URL to be used (when self is non-null) to get the first hash of an artifact. + */ + @Nullable URL hash1Url, + /** + * URL to be used (when self and {@link #hash1Url} are non-null) to get the second hash of an artifact. + */ + hash2Url; - public MavenLibCoords(@NonNull final URL artifactUrl, - @Nullable final URL hash1Url, @Nullable final URL hash2Url) { + public MavenRepoLibCoords(@NonNull final URL artifactUrl, + @Nullable final URL hash1Url, @Nullable final URL hash2Url) { this.artifactUrl = artifactUrl; this.hash1Url = hash1Url; this.hash2Url = hash2Url; } - public MavenLibCoords(@NonNull final URL jarUrl, final URL hash1Url) { + public MavenRepoLibCoords(@NonNull final URL jarUrl, final URL hash1Url) { this(jarUrl, hash1Url, null); } - public MavenLibCoords(@NonNull final URL jarUrl) { + public MavenRepoLibCoords(@NonNull final URL jarUrl) { this(jarUrl, null, null); } + @Override + public InputStream openArtifactStream() throws IOException { + assureIsRefreshed(); + + return artifactUrl.openStream(); + } + @Override public Optional computeHash() { + assureIsRefreshed(); + if (hash1Url == null) return Optional.empty(); try { if (hash2Url == null) return Optional.ofNullable(LibLoader.readLineFromUrl(hash1Url)); else { - val hash1 = LibLoader.readLinesFromUrl(hash1Url); + val hash1 = LibLoader.readLineFromUrl(hash1Url); if (hash1 == null) return Optional.empty(); val hash2 = LibLoader.readLineFromUrl(hash2Url); if (hash2 == null) return Optional.empty(); - return Optional.of(hash1 + "_" + hash2); + return Optional.of(hash1 + '_' + hash2); } } catch (final IOException e) { return Optional.empty(); } } } + + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE) + final class SonatypeNexusRepoLibCoords implements LibCoords { + + public static final String METADATA_FILE_NAME = "maven-metadata.xml"; + + /** + * Document builder factory singleton for internal usage. + */ + private static final DocumentBuilderFactory DOCUMENT_BUILDER_FACTORY = DocumentBuilderFactory.newInstance(); + + /** + * URL of a metadata file to get the latest version of artifact. + */ + @NonNull final URL mavenMetadataUrl; + @NonNull final String artifactsRootUrl; + + /** + * Whether or not this lib coords were refreshed. + */ + @Getter boolean refreshed; + String latestVersion; + MavenRepoLibCoords mavenRepoLibCoords; + + @Override + @SneakyThrows({ParserConfigurationException.class, MalformedURLException.class}) + public void refresh() { + refreshed = true; + + final Document metadataDocument; + try { + val mavenMetadata = String.join(System.lineSeparator(), LibLoader.readLinesFromUrl(mavenMetadataUrl)); + if (mavenMetadata.isEmpty()) throw new RuntimeException( + "Could not read Maven metadata from " + mavenMetadataUrl + " as it's content is empty" + ); + System.out.println(mavenMetadata); + metadataDocument = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder() + .parse(new InputSource(new StringReader(mavenMetadata))); + } catch (final IOException | SAXException e) { + throw new RuntimeException( + "Could not read Maven metadata from " + mavenMetadataUrl, e + ); + } + + val latestVersion = getLatestNexusArtifactName(metadataDocument.getDocumentElement()); + val jarUrl = artifactsRootUrl + latestVersion + ".jar"; + + if (!latestVersion.equals(this.latestVersion)) { + mavenRepoLibCoords = new MavenRepoLibCoords( + new URL(jarUrl), new URL(jarUrl + ".sha1"), new URL(jarUrl + ".md5") + ); + this.latestVersion = latestVersion; + } + } + + @Override + public InputStream openArtifactStream() throws IOException { + assureIsRefreshed(); + + return mavenRepoLibCoords.openArtifactStream(); + } + + @Override + public Optional computeHash() { + assureIsRefreshed(); + + return mavenRepoLibCoords.computeHash(); + } + } + } diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java index 95429c11c..76eb9f116 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java @@ -3,10 +3,7 @@ import lombok.*; import lombok.experimental.Accessors; -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; +import java.io.*; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; @@ -211,7 +208,7 @@ public static String readLineFromUrl(final URL url) throws IOException { } /** - * Loads a file from URL to file specified + * Loads a file from URL to file specified. * * @param url url from which to get the file * @throws IOException if an exception occurs in an I/O operation @@ -222,6 +219,21 @@ public static void loadFromUrl(final URL url, final File file) throws IOExceptio } } + /** + * Loads a file from input stream to file specified. + * The input stream will be closed after the operation (even if it exits with an exception). + * + * @param inputStream input stream from which to get the file + * @throws IOException if an exception occurs in an I/O operation + */ + public static void loadFromInputStreamClosing(final InputStream inputStream, final File file) throws IOException { + try { + Files.copy(inputStream, file.toPath(), StandardCopyOption.REPLACE_EXISTING); + } finally { + inputStream.close(); + } + } + /** * Loads a library by its coords. * Loading should happen if: @@ -245,13 +257,15 @@ public File loadLib(@NonNull final String name, @NonNull final LibCoords libCoor val artifactFile = new File(rootDirectory, name + ".jar"); val hashFile = new File(rootDirectory, name + ".hash"); + + libCoords.refresh(); + val hash = libCoords.computeHash(); if (!artifactFile.isFile() || !hashFile.isFile() || !Files.lines(hashFile.toPath()).findFirst().equals(hash)) { { - val url = libCoords.getArtifactUrl(); - log.info("Downloading library " + name + " from source: " + url); - loadFromUrl(url, artifactFile); + log.info("Downloading library " + name); + loadFromInputStreamClosing(libCoords.openArtifactStream(), artifactFile); } Files.write(hashFile.toPath(), hash.orElse("").getBytes(StandardCharsets.UTF_8)); } diff --git a/lib-loader/src/test/java/ru/progrm_jarvis/minecraft/libloader/LibCoordsTest.java b/lib-loader/src/test/java/ru/progrm_jarvis/minecraft/libloader/LibCoordsTest.java new file mode 100644 index 000000000..93b2b8ac7 --- /dev/null +++ b/lib-loader/src/test/java/ru/progrm_jarvis/minecraft/libloader/LibCoordsTest.java @@ -0,0 +1,46 @@ +package ru.progrm_jarvis.minecraft.libloader; + +import org.junit.jupiter.api.Test; +import org.xml.sax.SAXException; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import java.io.File; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.*; + +class LibCoordsTest { + + @Test + void testGetLatestNexusArtifactName() + throws ParserConfigurationException, IOException, SAXException { + assertEquals( + "minecraft-commons-0.1.0-20190109.213531-6", + LibCoords.getLatestNexusArtifactName(DocumentBuilderFactory.newInstance() + .newDocumentBuilder().parse(new File(getClass().getResource("/maven-metadata.xml").getFile())) + .getDocumentElement() + ) + ); + } + + @Test + void testGetMavenArtifactsRootUrl() { + assertEquals( + "https://oss.sonatype.org/content/repositories/snapshots/" + + "ru/progrm-jarvis/minecraft/minecraft-commons/0.1.0-SNAPSHOT/", + LibCoords.getMavenArtifactsRootUrl( + "https://oss.sonatype.org/content/repositories/snapshots/", + "ru.progrm-jarvis.minecraft", "minecraft-commons", "0.1.0-SNAPSHOT") + ); + + assertEquals( + "https://oss.sonatype.org/content/repositories/snapshots/" + + "ru/progrm-jarvis/minecraft/minecraft-commons/0.1.0-SNAPSHOT/", + LibCoords.getMavenArtifactsRootUrl( + "https://oss.sonatype.org/content/repositories/snapshots", + "ru.progrm-jarvis.minecraft", "minecraft-commons", "0.1.0-SNAPSHOT") + ); + } +} \ No newline at end of file diff --git a/lib-loader/src/test/resources/maven-metadata.xml b/lib-loader/src/test/resources/maven-metadata.xml new file mode 100644 index 000000000..5fe2a0ad4 --- /dev/null +++ b/lib-loader/src/test/resources/maven-metadata.xml @@ -0,0 +1,59 @@ + + + ru.progrm-jarvis.minecraft + minecraft-commons + 0.1.0-SNAPSHOT + + + 20190109.213531 + 6 + + 20190109213531 + + + jar + 0.1.0-20190109.213531-6 + 20190109213531 + + + pom + 0.1.0-20190109.213531-6 + 20190109213531 + + + javadoc + jar + 0.1.0-20190109.213531-6 + 20190109213531 + + + sources + jar + 0.1.0-20190109.213531-6 + 20190109213531 + + + jar.asc + 0.1.0-20190109.213531-6 + 20190109213531 + + + pom.asc + 0.1.0-20190109.213531-6 + 20190109213531 + + + sources + jar.asc + 0.1.0-20190109.213531-6 + 20190109213531 + + + javadoc + jar.asc + 0.1.0-20190109.213531-6 + 20190109213531 + + + + From 78aac65bb91b79c4565e6f1ef42e26575095c01d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 11 Jan 2019 16:45:13 +0300 Subject: [PATCH 099/508] Remove @WhenVisible due to overhead --- .../entity/SimpleLivingFakeEntity.java | 103 +++++++++--------- .../entity/aspect/annotation/WhenVisible.java | 31 ------ 2 files changed, 54 insertions(+), 80 deletions(-) delete mode 100644 fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/aspect/annotation/WhenVisible.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 93c3f4ffa..8b956ac98 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -9,7 +9,6 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -import ru.progrm_jarvis.minecraft.fakeentitylib.entity.aspect.annotation.WhenVisible; import javax.annotation.Nullable; import java.util.Map; @@ -231,17 +230,19 @@ protected void actualizeSpawnPacket() { /////////////////////////////////////////////////////////////////////////// @Override - @WhenVisible public void spawn() { - actualizeSpawnPacket(); + if (visible) { + actualizeSpawnPacket(); - for (val entry : players.entrySet()) if (entry.getValue()) performSpawnNoChecks(entry.getKey()); + for (val entry : players.entrySet()) if (entry.getValue()) performSpawnNoChecks(entry.getKey()); + } } @Override - @WhenVisible public void despawn() { - for (val entry : players.entrySet()) if (entry.getValue()) performDespawnNoChecks(entry.getKey()); + if (visible) { + for (val entry : players.entrySet()) if (entry.getValue()) performDespawnNoChecks(entry.getKey()); + } } /////////////////////////////////////////////////////////////////////////// @@ -259,31 +260,33 @@ public void despawn() { * @param pitch new pitch */ @Override - @WhenVisible protected void performMove(final double dx, final double dy, final double dz, final float yaw, final float pitch) { - if (pitch == 0 && yaw == 0) { - if (movePacket == null) { - movePacket = new WrapperPlayServerRelEntityMove(); - movePacket.setEntityID(id); - } - - movePacket.setDx((int) (dx * 32 * 128)); - movePacket.setDy((int) (dy * 32 * 128)); - movePacket.setDz((int) (dz * 32 * 128)); - - for (val entry : players.entrySet()) if (entry.getValue()) movePacket.sendPacket(entry.getKey()); - } else { - if (moveLookPacket == null) { - moveLookPacket = new WrapperPlayServerRelEntityMoveLook(); - moveLookPacket.setEntityID(id); - - moveLookPacket.setDx((int) (dx * 32 * 128)); - moveLookPacket.setDy((int) (dy * 32 * 128)); - moveLookPacket.setDz((int) (dz * 32 * 128)); - moveLookPacket.setYaw(yaw); - moveLookPacket.setPitch(pitch); - - for (val entry : players.entrySet()) if (entry.getValue()) moveLookPacket.sendPacket(entry.getKey()); + if (visible) { + if (pitch == 0 && yaw == 0) { + if (movePacket == null) { + movePacket = new WrapperPlayServerRelEntityMove(); + movePacket.setEntityID(id); + } + + movePacket.setDx((int) (dx * 32 * 128)); + movePacket.setDy((int) (dy * 32 * 128)); + movePacket.setDz((int) (dz * 32 * 128)); + + for (val entry : players.entrySet()) if (entry.getValue()) movePacket.sendPacket(entry.getKey()); + } else { + if (moveLookPacket == null) { + moveLookPacket = new WrapperPlayServerRelEntityMoveLook(); + moveLookPacket.setEntityID(id); + + moveLookPacket.setDx((int) (dx * 32 * 128)); + moveLookPacket.setDy((int) (dy * 32 * 128)); + moveLookPacket.setDz((int) (dz * 32 * 128)); + moveLookPacket.setYaw(yaw); + moveLookPacket.setPitch(pitch); + + for (val entry : players.entrySet()) if (entry.getValue()) moveLookPacket + .sendPacket(entry.getKey()); + } } } } @@ -299,21 +302,22 @@ protected void performMove(final double dx, final double dy, final double dz, fi * @param pitch new pitch */ @Override - @WhenVisible protected void performTeleportation(final double x, final double y, final double z, final float yaw, final float pitch) { - if (teleportPacket == null) { - teleportPacket = new WrapperPlayServerEntityTeleport(); - teleportPacket.setEntityID(id); - } + if (visible) { + if (teleportPacket == null) { + teleportPacket = new WrapperPlayServerEntityTeleport(); + teleportPacket.setEntityID(id); + } - teleportPacket.setX(x + xDelta); - teleportPacket.setY(y + yDelta); - teleportPacket.setZ(z + zDelta); - teleportPacket.setYaw(yaw + yawDelta); - teleportPacket.setPitch(pitch + pitchDelta); + teleportPacket.setX(x + xDelta); + teleportPacket.setY(y + yDelta); + teleportPacket.setZ(z + zDelta); + teleportPacket.setYaw(yaw + yawDelta); + teleportPacket.setPitch(pitch + pitchDelta); - for (val entry : players.entrySet()) if (entry.getValue()) teleportPacket.sendPacket(entry.getKey()); + for (val entry : players.entrySet()) if (entry.getValue()) teleportPacket.sendPacket(entry.getKey()); + } } /////////////////////////////////////////////////////////////////////////// @@ -324,16 +328,17 @@ protected void performTeleportation(final double x, final double y, final double * Sends metadata to all players seeing this entity creating packet if it has not yet been initialized. */ @Override - @WhenVisible protected void sendMetadata() { - if (metadata == null) return; - if (metadataPacket == null) { - metadataPacket = new WrapperPlayServerEntityMetadata(); - metadataPacket.setEntityID(id); - } - metadataPacket.setMetadata(metadata.getWatchableObjects()); + if (visible) { + if (metadata == null) return; + if (metadataPacket == null) { + metadataPacket = new WrapperPlayServerEntityMetadata(); + metadataPacket.setEntityID(id); + } + metadataPacket.setMetadata(metadata.getWatchableObjects()); - for (val entry : players.entrySet()) if (entry.getValue()) metadataPacket.sendPacket(entry.getKey()); + for (val entry : players.entrySet()) if (entry.getValue()) metadataPacket.sendPacket(entry.getKey()); + } } /////////////////////////////////////////////////////////////////////////// diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/aspect/annotation/WhenVisible.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/aspect/annotation/WhenVisible.java deleted file mode 100644 index 14ed92867..000000000 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/aspect/annotation/WhenVisible.java +++ /dev/null @@ -1,31 +0,0 @@ -package ru.progrm_jarvis.minecraft.fakeentitylib.entity.aspect.annotation; - -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import ru.progrm_jarvis.minecraft.fakeentitylib.entity.FakeEntity; - -import javax.annotation.Nullable; -import java.lang.annotation.*; - -/** - * Aspect annotation to perform method call only when the fake entity is visible. - * If the method returns an object then if an entity is invisible then {@code null} will be returned - * - * @apiNote can be used only on {@link FakeEntity} implementations - */ -// @Inherited NOT used because JVM will not inherit it for methods ¯\_(ツ)_/¯ -@Documented -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface WhenVisible { - - @Aspect - class AspectJ { - - @Around("execution(* *(..)) && @annotation(WhenVisible)") - @Nullable public Object around(final ProceedingJoinPoint joinPoint) throws Throwable { - return ((FakeEntity) joinPoint.getTarget()).isVisible() ? joinPoint.proceed() : null; - } - } -} \ No newline at end of file From 32d3aae3c3d4fae0a47c662eb0ac99e100495cf4 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 11 Jan 2019 16:47:15 +0300 Subject: [PATCH 100/508] Remove AspectJ dependency from fake-entity-lib --- fake-entity/pom.xml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/fake-entity/pom.xml b/fake-entity/pom.xml index 52db215f5..a82d36409 100644 --- a/fake-entity/pom.xml +++ b/fake-entity/pom.xml @@ -11,15 +11,6 @@ jar - - - - org.codehaus.mojo - aspectj-maven-plugin - - - - ru.progrm-jarvis.minecraft @@ -51,10 +42,6 @@ org.projectlombok lombok - - org.aspectj - aspectjrt - com.google.code.findbugs jsr305 From b11a932cfadc82a612f77e404727eea8647ab2ba Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 11 Jan 2019 16:49:31 +0300 Subject: [PATCH 101/508] Comment: remove ASPECTS comment --- .../fakeentitylib/entity/AbstractBasicFakeEntity.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index c66c453e7..e7bb70eaa 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -156,8 +156,4 @@ else performTeleportation( location.getYaw() + dYaw, location.getPitch() + dPitch ); } - - /////////////////////////////////////////////////////////////////////////// - // ASPECTS - /////////////////////////////////////////////////////////////////////////// } From 26f8502c1bfd6cac2265e02d6d363362f561492b Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 11 Jan 2019 16:59:00 +0300 Subject: [PATCH 102/508] Remove unneeded sout from LibCoords --- .../java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java | 1 - 1 file changed, 1 deletion(-) diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java index 429368602..fefb5534e 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java @@ -249,7 +249,6 @@ public void refresh() { if (mavenMetadata.isEmpty()) throw new RuntimeException( "Could not read Maven metadata from " + mavenMetadataUrl + " as it's content is empty" ); - System.out.println(mavenMetadata); metadataDocument = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder() .parse(new InputSource(new StringReader(mavenMetadata))); } catch (final IOException | SAXException e) { From 9495c5fc7809b7f3032475d3645cb81383f5a9d8 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 11 Jan 2019 16:59:39 +0300 Subject: [PATCH 103/508] Remove AspectJ dependencies from project --- pom.xml | 64 --------------------------------------------------------- 1 file changed, 64 deletions(-) diff --git a/pom.xml b/pom.xml index f4955201d..dc9e27040 100644 --- a/pom.xml +++ b/pom.xml @@ -63,11 +63,6 @@ UTF-8 1.8 1.8 - - ${maven.compiler.target} - ${maven.compiler.source} - ${maven.compiler.target} - 1.9.2 5.3.2 1.3.2 @@ -118,60 +113,6 @@ true - - - org.codehaus.mojo - aspectj-maven-plugin - 1.11 - - - ${aspectj.compliance.version} - ${aspectj.source.version} - ${aspectj.target.version} - true - true - ignore - ${project.build.sourceEncoding} - - **/*.java - - true - - - - - default-compile - process-classes - - compile - - - - ${project.build.directory}/classes - - - - - default-testCompile - process-test-classes - - test-compile - - - - ${project.build.directory}/test-classes - - - - - - - org.aspectj - aspectjtools - ${aspectj.version} - - - org.apache.maven.plugins maven-shade-plugin @@ -345,11 +286,6 @@ 1.18.4 true - - org.aspectj - aspectjrt - ${aspectj.version} - org.jetbrains annotations From 3214c76a5d418704539e37505c6b845a8cc5f673 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 11 Jan 2019 17:11:59 +0300 Subject: [PATCH 104/508] Decorate LibLoader --- .../minecraft/libloader/LibLoader.java | 128 +++++++++--------- 1 file changed, 66 insertions(+), 62 deletions(-) diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java index 76eb9f116..806173728 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java @@ -2,6 +2,7 @@ import lombok.*; import lombok.experimental.Accessors; +import lombok.experimental.FieldDefaults; import java.io.*; import java.lang.invoke.MethodHandle; @@ -12,9 +13,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.logging.Logger; /** @@ -24,19 +23,32 @@ @EqualsAndHashCode @RequiredArgsConstructor @Accessors(chain = true) +@FieldDefaults(level = AccessLevel.PRIVATE) public class LibLoader { + /** + * Default logger to use if no other was specified for the lib loader instance + */ private static final Logger DEFAULT_LOGGER = Logger.getLogger("LibLoader"); + /** + * Method handle of {@code URLClassLoader.addURL(URL)} + */ @NonNull private static final MethodHandle URL_CLASS_LOADER__ADD_URL_METHOD; - @NonNull @Getter private URLClassLoader classLoader; + /** + * Current class loader used by this lib loader + */ + @NonNull @Getter URLClassLoader classLoader; /** * Directory to store library artifacts and hashes in */ @NonNull private final File rootDirectory; + /** + * Logger for external usage + */ @NonNull @Getter @Setter private Logger log = DEFAULT_LOGGER; // creates a MethodHandle object for URLClassLoader#addUrl(URL) method @@ -176,64 +188,6 @@ private void assureRootDirectoryExists() { if (!rootDirectory.isFile()) Files.createDirectories(rootDirectory.toPath()); } - /** - * Reads content of a URL as a list of lines. - * - * @param url url to read data from - * @return lines read from URL - * @throws IOException if an exception occurs while reading - */ - public static List readLinesFromUrl(final URL url) throws IOException { - try (val reader = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8))) { - val lines = new ArrayList(); - - String line; - while ((line = reader.readLine()) != null) lines.add(line); - - return lines; - } - } - - /** - * Reads content of a URL as a single line. - * - * @param url url to read data from - * @return first line read from URL - * @throws IOException if an exception occurs while reading - */ - public static String readLineFromUrl(final URL url) throws IOException { - try (val reader = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8))) { - return reader.readLine(); - } - } - - /** - * Loads a file from URL to file specified. - * - * @param url url from which to get the file - * @throws IOException if an exception occurs in an I/O operation - */ - public static void loadFromUrl(final URL url, final File file) throws IOException { - try (val stream = url.openStream()) { - Files.copy(stream, file.toPath(), StandardCopyOption.REPLACE_EXISTING); - } - } - - /** - * Loads a file from input stream to file specified. - * The input stream will be closed after the operation (even if it exits with an exception). - * - * @param inputStream input stream from which to get the file - * @throws IOException if an exception occurs in an I/O operation - */ - public static void loadFromInputStreamClosing(final InputStream inputStream, final File file) throws IOException { - try { - Files.copy(inputStream, file.toPath(), StandardCopyOption.REPLACE_EXISTING); - } finally { - inputStream.close(); - } - } - /** * Loads a library by its coords. * Loading should happen if: @@ -306,4 +260,54 @@ public File loadLib(@NonNull final String name, @NonNull final LibCoords libCoor public static void addUrlToClasspath(@NonNull final URLClassLoader classLoader, @NonNull final URL url) { URL_CLASS_LOADER__ADD_URL_METHOD.invokeExact(classLoader, url); } + + /////////////////////////////////////////////////////////////////////////// + // Network utility methods + /////////////////////////////////////////////////////////////////////////// + + /** + * Reads content of a URL as a list of lines. + * + * @param url url to read data from + * @return lines read from URL + * @throws IOException if an exception occurs while reading + */ + public static List readLinesFromUrl(final URL url) throws IOException { + try (val reader = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8))) { + val lines = new ArrayList(); + + String line; + while ((line = reader.readLine()) != null) lines.add(line); + + return lines; + } + } + + /** + * Reads content of a URL as a single line. + * + * @param url url to read data from + * @return first line read from URL + * @throws IOException if an exception occurs while reading + */ + public static String readLineFromUrl(final URL url) throws IOException { + try (val reader = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8))) { + return reader.readLine(); + } + } + + /** + * Loads a file from input stream to file specified. + * The input stream will be closed after the operation (even if it exits with an exception). + * + * @param inputStream input stream from which to get the file + * @throws IOException if an exception occurs in an I/O operation + */ + public static void loadFromInputStreamClosing(final InputStream inputStream, final File file) throws IOException { + try { + Files.copy(inputStream, file.toPath(), StandardCopyOption.REPLACE_EXISTING); + } finally { + inputStream.close(); + } + } } From eddd0de8a805240ad9318ae9163a782ec4bdf7c0 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 11 Jan 2019 17:37:35 +0300 Subject: [PATCH 105/508] Add lib-loaded checks to LibLoader --- .../minecraft/libloader/LibLoader.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java index 806173728..4bd79195e 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java @@ -14,6 +14,7 @@ import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; /** @@ -51,6 +52,8 @@ public class LibLoader { */ @NonNull @Getter @Setter private Logger log = DEFAULT_LOGGER; + @NonNull final Map loadedLibs; + // creates a MethodHandle object for URLClassLoader#addUrl(URL) method static { final Method addUrlMethod; @@ -108,6 +111,7 @@ public LibLoader(@NonNull final ClassLoader classLoader, @NonNull final File roo classLoader + " is not instance of URLClassLoader" ); + loadedLibs = new ConcurrentHashMap<>(); this.classLoader = (URLClassLoader) classLoader; this.rootDirectory = rootDirectory; } @@ -180,11 +184,32 @@ public LibLoader setClassLoader(final ClassLoader classLoader) { return this; } + /** + * Checks whether the lib by specified name was loaded or not. + * + * @param name name of the lib + * @return {@code true} if the lib was loaded by the specified name anf {@code false} otherwise + */ + public boolean isLibLoaded(@NonNull final String name) { + return loadedLibs.containsKey(name); + } + + /** + * Gets the loaded lib's artifact file if it was loaded. + * + * @param name name of the lib + * @return optional containing file og lib's artifact + * if it was loaded by the specified name or empty optional otherwise + */ + public Optional getLoadedLibArtifact(@NonNull final String name) { + return Optional.ofNullable(loadedLibs.get(name)); + } + /** * Call to this method guarantees that after it {@link #rootDirectory} will be a valid directory. */ @SneakyThrows - private void assureRootDirectoryExists() { + protected void assureRootDirectoryExists() { if (!rootDirectory.isFile()) Files.createDirectories(rootDirectory.toPath()); } @@ -205,6 +230,7 @@ private void assureRootDirectoryExists() { */ @SneakyThrows public File loadLib(@NonNull final String name, @NonNull final LibCoords libCoords, final boolean addToClasspath) { + if (isLibLoaded(name)) throw new IllegalStateException("Library " + name + " is a;ready loaded by LibLoader"); assureRootDirectoryExists(); log.info("Loading library " + name); From a943a1f391e14e2bb75571a9314839b3a406c158 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 12 Jan 2019 00:17:24 +0300 Subject: [PATCH 106/508] Add RandomUtil#randomSign() --- .../minecraft/commons/util/RandomUtil.java | 9 +++++++++ .../minecraft/commons/util/RandomUtilTest.java | 11 +++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java index 7cfdad7e0..9bef7ce0c 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java @@ -16,6 +16,15 @@ @UtilityClass public class RandomUtil { + /** + * Provides {@code 1} or {@code -1} randomly. + * + * @return {@code 1} or {@code -1} + */ + public static int randomSign() { + return ThreadLocalRandom.current().nextBoolean() ? 1 : -1; + } + /** * Gets a random value from the map specified considering chances. * diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java index b4ac32ef2..e9b91e637 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java @@ -1,5 +1,6 @@ package ru.progrm_jarvis.minecraft.commons.util; +import lombok.val; import lombok.var; import org.apache.commons.lang.math.RandomUtils; import org.junit.jupiter.api.Test; @@ -10,12 +11,18 @@ import java.util.HashSet; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.isIn; +import static org.hamcrest.Matchers.*; import static org.junit.jupiter.api.Assertions.assertThrows; class RandomUtilTest { + @Test + void testGetRandomSign() { + val isAllowedValue = anyOf(is(1), is(-1)); + + for (var i = 0; i < 64 + RandomUtils.nextInt(65); i++) assertThat(RandomUtil.randomSign(), isAllowedValue); + } + @Test void testGetRandomFromMapOfChances() { var values = MapUtil.fillMap(new HashMap<>(), "One", 1, "Two", 2); From 028c1eb9028fc41aedd5db4aececfeda91702318 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 13 Jan 2019 17:57:43 +0300 Subject: [PATCH 107/508] Rework ChunkUtil adding chunk-local locations format --- .../commons/chunk/ChunkLocalLocation.java | 24 ++ .../minecraft/commons/chunk/ChunkUtil.java | 159 +++++++++++- .../commons/chunk/ChunkUtilTest.java | 229 +++++++++++++----- 3 files changed, 341 insertions(+), 71 deletions(-) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java new file mode 100644 index 000000000..0adc73794 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java @@ -0,0 +1,24 @@ +package ru.progrm_jarvis.minecraft.commons.chunk; + +import lombok.AccessLevel; +import lombok.Value; +import lombok.experimental.FieldDefaults; +import org.bukkit.Chunk; + +/** + * Immutable value storing chunk and its location + */ +@Value +@FieldDefaults(level = AccessLevel.PRIVATE) +public final class ChunkLocalLocation { + + /** + * Chunk containing the location + */ + Chunk chunk; + + /** + * Chunk-local location in a {@link short} representation + */ + short location; +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java index 1d161ed0e..c6a22527f 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java @@ -3,12 +3,30 @@ import lombok.NonNull; import lombok.experimental.UtilityClass; import org.bukkit.Chunk; +import org.bukkit.Location; import org.bukkit.World; +import org.bukkit.block.Block; + +import static com.google.common.base.Preconditions.checkArgument; /** + * Utilities related to chunks. + *

+ * There are general conventions for type=methods: + * + *

{@code Foo [bar]foo(Bar...)}
+ *
return the specified bar value's foocomponent (other data is lost)
+ * + *
{@code Foo [bar]toFoo(Bar...)}
+ *
convert the specified bar value to its foo representation (no data is lost)
+ * + *
{@code Foo [Bar]Foo(Bar...)}
+ *
performs the action specified on bar using foo
* * @apiNote chunks are (by default) returned as a single {@link long} as the limit of chunk at non-Y-axis is 3750000 - * where the first 32-most significant stand for X coordinate and the last 32 bits stand for Z coordinate + * where 32 most significant bits stand for X-coordinate and 32 least significant bits stand for Z-coordinate + * @apiNote chunks-local locations are (by default) returned as a single {@link short} + * whose bits are ordered as 4 bits for X-coordinate, 8 bits for Y-coordinate, 4 bits for Z-coordinate * * @see General info about chinks */ @@ -22,7 +40,7 @@ public class ChunkUtil { * @param z Z coordinate of a chunk * @return chunk treated as {@link long} */ - public long chunk(final int x, final int z) { + public long toChunkLong(final int x, final int z) { return ((long) x << 32) | ((long) z & 0xFFFFFFFFL); } @@ -53,8 +71,8 @@ public int chunkZ(final long longChunk) { * @param z Y coordinate of the location * @return chunk location treated as {@link long} */ - public long chunkByLocation(final long x, final long z) { - return chunk((int) (x >> 4), (int) (z >> 4)); + public long chunkAt(final long x, final long z) { + return toChunkLong((int) (x >> 4), (int) (z >> 4)); } /** @@ -67,4 +85,137 @@ public long chunkByLocation(final long x, final long z) { public Chunk getChunk(@NonNull final World world, final long chunk) { return world.getChunkAt(chunkX(chunk), chunkZ(chunk)); } + + /////////////////////////////////////////////////////////////////////////// + // Chunk local location + /////////////////////////////////////////////////////////////////////////// + + /** + * Converts the specified x, y and z chunk-local coordinates to a {@link short}-representation + * + * @param chunkLocalX X-coordinate inside the chunk between 0 and 15 + * @param chunkLocalY Y-coordinate inside the chunk between 0 and 255 + * @param chunkLocalZ Z-coordinate inside the chunk between 0 and 15 + * @return {@link short}-representation of specified chunk-local coordinated + * + * @throws IllegalArgumentException if {@code x} is not in range [0; 15] + * @throws IllegalArgumentException if {@code z} is not in range [0; 15] + * @throws IllegalArgumentException if {@code y} is not in range [0; 255] + */ + public short toChunkLocalLocationShort(final int chunkLocalX, final int chunkLocalY, final int chunkLocalZ) { + checkArgument(chunkLocalX >= 0 && chunkLocalX < 16, "chunkLocalX should be in range [0; 15]"); + checkArgument(chunkLocalZ >= 0 && chunkLocalZ < 16, "chunkLocalZ should be in range [0; 15]"); + checkArgument(chunkLocalY >= 0 && chunkLocalY < 256, "chunkLocalY should be in range [0; 255]"); + + return (short) (((chunkLocalX & 0xF) << 12) | ((chunkLocalY & 0xFF) << 4) | (chunkLocalZ & 0xF)); + } + + /** + * Gets the X-coordinate from a {@link short}-representation of a chunk-local location. + * + * @param location {@link short}-representation of a chunk-local location + * @return X-coordinate of a chunk local location + */ + public int chunkLocalLocationX(final short location) { + return (location >> 12) & 0xF; + } + + /** + * Gets the Y-coordinate from a {@link short}-representation of a chunk-local location. + * + * @param location {@link short}-representation of a chunk-local location + * @return Y-coordinate of a chunk local location + */ + public int chunkLocalLocationY(final short location) { + return (location >> 4) & 0xFF; + } + + /** + * Gets the Z-coordinate from a {@link short}-representation of a chunk-local location. + * + * @param location {@link short}-representation of a chunk-local location + * @return Z-coordinate of a chunk local location + */ + public int chunkLocalLocationZ(final short location) { + return location & 0xF; + } + + /** + * Gets the chunk-local X-coordinate value of the location. + * + * @param x X-coordinate + * @return chunk-local X-coordinate + */ + public int chunkLocalX(final int x) { + return x & 0xF; + } + + /** + * Gets the chunk-local Y-coordinate value of the location. + * + * @param y Y-coordinate + * @return chunk-local Y-coordinate + */ + public int chunkLocalY(final int y) { + return y & 0xFF; + } + + /** + * Gets the chunk-local Z-coordinate value of the location. + * + * @param z Z-coordinate + * @return chunk-local Z-coordinate + */ + public int chunkLocalZ(final int z) { + return z & 0xF; + } + + /** + * Gets the specified location's chunk-local location. + * + * @param x X-coordinate of the location whose chunk-local location should be got + * @param y Y-coordinate of the location whose chunk-local location should be got + * @param z Z-coordinate of the location whose chunk-local location should be got + * @return {@link short}-representation of location's chunk-local location + * + * @see #chunkLocalLocation(Location) is an allias for {@link Location} argument + */ + public short chunkLocalLocation(final int x, final int y, final int z) { + return toChunkLocalLocationShort(chunkLocalX(x), chunkLocalY(y), chunkLocalZ(z)); + } + + /** + * Gets the specified location's chunk-local location. + * + * @param location location whose chunk-local location should be got + * @return {@link short}-representation of location's chunk-local location + * + * @see #toChunkLocalLocationShort(int, int, int) is called with location's coordinates + */ + public short chunkLocalLocation(@NonNull final Location location) { + return chunkLocalLocation(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + } + + /** + * Gets the block in a chunk from its chunk-local location in {@link short}-representation + * + * @param chunk chunk whose block to get + * @param location {@link short}-representation of a chunk-local location + * @return block from the chunk of specified chunk-local location + */ + public Block getChunkBlock(final Chunk chunk, final short location) { + return chunk.getBlock( + chunkLocalLocationX(location), chunkLocalLocationY(location), chunkLocalLocationZ(location) + ); + } + + /** + * Converts location to it's chunk-local location representation. + * + * @param location location whose chunk-local location should be got + * @return chunk local location of the location + */ + public ChunkLocalLocation toChunkLocalLocation(final Location location) { + return new ChunkLocalLocation(location.getChunk(), chunkLocalLocation(location)); + } } diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java index a8e244da4..1315ae828 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java @@ -1,11 +1,15 @@ package ru.progrm_jarvis.minecraft.commons.chunk; import lombok.val; +import lombok.var; +import org.apache.commons.lang.math.RandomUtils; +import org.bukkit.Chunk; +import org.bukkit.Location; import org.bukkit.World; import org.junit.jupiter.api.Test; import org.mockito.ArgumentMatchers; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static ru.progrm_jarvis.minecraft.commons.chunk.ChunkUtil.*; @@ -13,129 +17,129 @@ class ChunkUtilTest { @Test - void testChunkAsLong() { - assertEquals(1, chunkX(chunk(1, 0))); - assertEquals(0, chunkZ(chunk(1, 0))); - - assertEquals(0, chunkX(chunk(0, 1))); - assertEquals(1, chunkZ(chunk(0, 1))); - - assertEquals(-1, chunkX(chunk(-1, 0))); - assertEquals(0, chunkZ(chunk(-1, 0))); - - assertEquals(0, chunkX(chunk(0, -1))); - assertEquals(-1, chunkZ(chunk(0, -1))); - - assertEquals(1, chunkX(chunk(1, 255))); - assertEquals(255, chunkZ(chunk(1, 255))); - - assertEquals(255, chunkX(chunk(255, 1))); - assertEquals(1, chunkZ(chunk(255, 1))); - - assertEquals(-1, chunkX(chunk(-1, 255))); - assertEquals(255, chunkZ(chunk(-1, 255))); - - assertEquals(255, chunkX(chunk(255, -1))); - assertEquals(-1, chunkZ(chunk(255, -1))); - - assertEquals(1, chunkX(chunk(1, -255))); - assertEquals(-255, chunkZ(chunk(1, -255))); - - assertEquals(-255, chunkX(chunk(-255, 1))); - assertEquals(1, chunkZ(chunk(-255, 1))); - - assertEquals(-1, chunkX(chunk(-1, -255))); - assertEquals(-255, chunkZ(chunk(-1, -255))); - - assertEquals(-255, chunkX(chunk(-255, -1))); - assertEquals(-1, chunkZ(chunk(-255, -1))); + void testToChunkLong() { + byte signs = 0; + for (var i = 0; i < 128 + RandomUtils.nextInt(128) ; i++) { + final int x, z; + // make sure all sign combinations happen + switch (signs++ % 4) { + case 0: { + x = RandomUtils.nextInt(); + z = RandomUtils.nextInt(); + + break; + } + case 1: { + x = -RandomUtils.nextInt(); + z = RandomUtils.nextInt(); + + break; + } + case 2: { + x = RandomUtils.nextInt(); + z = -RandomUtils.nextInt(); + + break; + } + case 3: /* math doesn't work here :) */ default: { + x = -RandomUtils.nextInt(); + z = -RandomUtils.nextInt(); + + break; + } + } + + val chunk = toChunkLong(x, z); + assertEquals(x, chunkX(chunk)); + assertEquals(z, chunkZ(chunk)); + } } @Test void testChunkByLocation() { long chunk; - chunk = chunkByLocation(0, 0); + chunk = chunkAt(0, 0); assertEquals(0, chunkX(chunk)); assertEquals(0, chunkZ(chunk)); - chunk = chunkByLocation(15, 15); + chunk = chunkAt(15, 15); assertEquals(0, chunkX(chunk)); assertEquals(0, chunkZ(chunk)); - chunk = chunkByLocation(16, 16); + chunk = chunkAt(16, 16); assertEquals(1, chunkX(chunk)); assertEquals(1, chunkZ(chunk)); - chunk = chunkByLocation(31, 31); + chunk = chunkAt(31, 31); assertEquals(1, chunkX(chunk)); assertEquals(1, chunkZ(chunk)); - chunk = chunkByLocation(32, 32); + chunk = chunkAt(32, 32); assertEquals(2, chunkX(chunk)); assertEquals(2, chunkZ(chunk)); - chunk = chunkByLocation(47, 47); + chunk = chunkAt(47, 47); assertEquals(2, chunkX(chunk)); assertEquals(2, chunkZ(chunk)); - chunk = chunkByLocation(-1, -1); + chunk = chunkAt(-1, -1); assertEquals(-1, chunkX(chunk)); assertEquals(-1, chunkZ(chunk)); - chunk = chunkByLocation(-16, -16); + chunk = chunkAt(-16, -16); assertEquals(-1, chunkX(chunk)); assertEquals(-1, chunkZ(chunk)); - chunk = chunkByLocation(-17, -17); + chunk = chunkAt(-17, -17); assertEquals(-2, chunkX(chunk)); assertEquals(-2, chunkZ(chunk)); - chunk = chunkByLocation(-32, -32); + chunk = chunkAt(-32, -32); assertEquals(-2, chunkX(chunk)); assertEquals(-2, chunkZ(chunk)); - chunk = chunkByLocation(-33, -33); + chunk = chunkAt(-33, -33); assertEquals(-3, chunkX(chunk)); assertEquals(-3, chunkZ(chunk)); - chunk = chunkByLocation(-48, -48); + chunk = chunkAt(-48, -48); assertEquals(-3, chunkX(chunk)); assertEquals(-3, chunkZ(chunk)); - chunk = chunkByLocation(0, 15); + chunk = chunkAt(0, 15); assertEquals(0, chunkX(chunk)); assertEquals(0, chunkZ(chunk)); - chunk = chunkByLocation(-1, 15); + chunk = chunkAt(-1, 15); assertEquals(-1, chunkX(chunk)); assertEquals(0, chunkZ(chunk)); - chunk = chunkByLocation(0, 15); + chunk = chunkAt(0, 15); assertEquals(0, chunkX(chunk)); assertEquals(0, chunkZ(chunk)); - chunk = chunkByLocation(-31, 31); + chunk = chunkAt(-31, 31); assertEquals(-2, chunkX(chunk)); assertEquals(1, chunkZ(chunk)); - chunk = chunkByLocation(64, -32); + chunk = chunkAt(64, -32); assertEquals(4, chunkX(chunk)); assertEquals(-2, chunkZ(chunk)); - chunk = chunkByLocation(10, 20); + chunk = chunkAt(10, 20); assertEquals(0, chunkX(chunk)); assertEquals(1, chunkZ(chunk)); - chunk = chunkByLocation(-10, 20); + chunk = chunkAt(-10, 20); assertEquals(-1, chunkX(chunk)); assertEquals(1, chunkZ(chunk)); - chunk = chunkByLocation(10, -20); + chunk = chunkAt(10, -20); assertEquals(0, chunkX(chunk)); assertEquals(-2, chunkZ(chunk)); - chunk = chunkByLocation(-10, -20); + chunk = chunkAt(-10, -20); assertEquals(-1, chunkX(chunk)); assertEquals(-2, chunkZ(chunk)); } @@ -144,31 +148,122 @@ void testChunkByLocation() { void testGetChunkFromWorld() { val world = mock(World.class); - getChunk(world, chunk(0, 0)); + getChunk(world, toChunkLong(0, 0)); verify(world).getChunkAt(ArgumentMatchers.eq(0), ArgumentMatchers.eq(0)); - getChunk(world, chunk(1, 0)); + getChunk(world, toChunkLong(1, 0)); verify(world).getChunkAt(ArgumentMatchers.eq(1), ArgumentMatchers.eq(0)); - getChunk(world, chunk(0, 1)); + getChunk(world, toChunkLong(0, 1)); verify(world).getChunkAt(ArgumentMatchers.eq(0), ArgumentMatchers.eq(1)); - getChunk(world, chunk(-1, 0)); + getChunk(world, toChunkLong(-1, 0)); verify(world).getChunkAt(ArgumentMatchers.eq(-1), ArgumentMatchers.eq(0)); - getChunk(world, chunk(0, -1)); + getChunk(world, toChunkLong(0, -1)); verify(world).getChunkAt(ArgumentMatchers.eq(0), ArgumentMatchers.eq(-1)); - getChunk(world, chunk(25, 10)); + getChunk(world, toChunkLong(25, 10)); verify(world).getChunkAt(ArgumentMatchers.eq(25), ArgumentMatchers.eq(10)); - getChunk(world, chunk(-14, 8)); + getChunk(world, toChunkLong(-14, 8)); verify(world).getChunkAt(ArgumentMatchers.eq(-14), ArgumentMatchers.eq(8)); - getChunk(world, chunk(23, -9)); + getChunk(world, toChunkLong(23, -9)); verify(world).getChunkAt(ArgumentMatchers.eq(23), ArgumentMatchers.eq(-9)); - getChunk(world, chunk(-6, -22)); + getChunk(world, toChunkLong(-6, -22)); verify(world).getChunkAt(ArgumentMatchers.eq(-6), ArgumentMatchers.eq(-22)); } + + @Test + void testToChunkLocalLocation() { + assertDoesNotThrow(() -> toChunkLocalLocationShort(0, 10, 10)); + assertDoesNotThrow(() -> toChunkLocalLocationShort(15, 10, 10)); + assertThrows(IllegalArgumentException.class, () -> toChunkLocalLocationShort(-1, 10, 10)); + assertThrows(IllegalArgumentException.class, () -> toChunkLocalLocationShort(16, 10, 10)); + + assertDoesNotThrow(() -> toChunkLocalLocationShort(10, 0, 10)); + assertDoesNotThrow(() -> toChunkLocalLocationShort(10, 255, 10)); + assertThrows(IllegalArgumentException.class, () -> toChunkLocalLocationShort(10, -1, 10)); + assertThrows(IllegalArgumentException.class, () -> toChunkLocalLocationShort(10, 256, 10)); + + assertDoesNotThrow(() -> toChunkLocalLocationShort(10, 10, 0)); + assertDoesNotThrow(() -> toChunkLocalLocationShort(10, 10, 15)); + assertThrows(IllegalArgumentException.class, () -> toChunkLocalLocationShort(10, 10, -1)); + assertThrows(IllegalArgumentException.class, () -> toChunkLocalLocationShort(10, 10, 16)); + + for (var y = 0; y < 255; y++) for (var x = 0; x < 15; x++) for (var z = 0; z < 15; z++) { + val chunkLocalLocation = toChunkLocalLocationShort(x, y, z); + + assertEquals(x, chunkLocalLocationX(chunkLocalLocation)); + assertEquals(y, chunkLocalLocationY(chunkLocalLocation)); + assertEquals(z, chunkLocalLocationZ(chunkLocalLocation)); + } + } + + @Test + void testChunkLocalLocationFromLocation() { + val world = mock(World.class); + + byte signs = 0; + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + final int x, z, + y = RandomUtils.nextInt(256), // y is the same for location and chunk-local location + chunkLocalX = RandomUtils.nextInt(16), + chunkLocalZ = RandomUtils.nextInt(16); + // coordinates are generating by adding random amount of chunks to chunk-local coordinates; + // make sure all sign combinations happen + switch (signs++ % 4) { + case 0: { + x = chunkLocalX + 16 * RandomUtils.nextInt(); + z = chunkLocalZ + 16 * RandomUtils.nextInt(); + + break; + } + case 1: { + x = chunkLocalX + 16 * -RandomUtils.nextInt(); + z = chunkLocalZ + 16 * RandomUtils.nextInt(); + + break; + } + case 2: { + x = chunkLocalX + 16 * RandomUtils.nextInt(); + z = chunkLocalZ + 16 * -RandomUtils.nextInt(); + + break; + } + case 3: /* math doesn't work here :) */ default: { + x = chunkLocalX + 16 * -RandomUtils.nextInt(); + z = chunkLocalZ + 16 * -RandomUtils.nextInt(); + + break; + } + } + + val location = new Location(world, x, y, z); + val chunkLocalLocation = ChunkUtil.chunkLocalLocation(location); + + assertEquals(chunkLocalX, chunkLocalLocationX(chunkLocalLocation)); + assertEquals(y, chunkLocalLocationY(chunkLocalLocation)); + assertEquals(chunkLocalZ, chunkLocalLocationZ(chunkLocalLocation)); + } + } + + @Test + void testGetChunkBlock() { + ////////////////////////////////////////////////////////////////////////////////////////////// + // Note: verify(..).foo() requires some time so full coverage of XYZ requires too much time // + // because of this axises are stepped by random value // + ////////////////////////////////////////////////////////////////////////////////////////////// + + int x = 0, y = 0, z = 0; + while ((x += RandomUtils.nextInt(1)) < 16 + && (z += RandomUtils.nextInt(1)) < 16 + && (y += RandomUtils.nextInt(16)) < 255) { + val chunk = mock(Chunk.class); // mocked here in case all 3 random increments are 0 + getChunkBlock(chunk, ChunkUtil.toChunkLocalLocationShort(x, y, z)); + verify(chunk).getBlock(x, y, z); + } + } } \ No newline at end of file From 2012db51e3ba141e6c5af5424021efcb58dc99f1 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 13 Jan 2019 18:13:35 +0300 Subject: [PATCH 108/508] Remove unneeded sout from ProtocolBasedMapImageDisplay --- .../commons/mapimage/display/ProtocolBasedMapImageDisplay.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index c44f4a1e1..e4ef31893 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -12,7 +12,6 @@ import ru.progrm_jarvis.minecraft.commons.util.MapUtil; import javax.annotation.Nonnull; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -57,8 +56,6 @@ protected void sendFullImage(@NonNull final Player player) { setX(0); setZ(0); setData(image.getMapData()); - - System.out.println(Arrays.toString(this.getData())); }}.sendPacket(player); } From 99bbacae6761bfac4f8d64ff00588c9a00bc2a5a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 13 Jan 2019 20:08:20 +0300 Subject: [PATCH 109/508] Add range-checks to ChunkUtil --- .../minecraft/commons/chunk/ChunkUtil.java | 57 ++++++++++++++- .../commons/chunk/ChunkUtilTest.java | 70 ++++++++++++++++++- 2 files changed, 122 insertions(+), 5 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java index c6a22527f..b3baafd08 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java @@ -33,6 +33,59 @@ @UtilityClass public class ChunkUtil { + /////////////////////////////////////////////////////////////////////////// + // Range checks + /////////////////////////////////////////////////////////////////////////// + + /** + * Performs a range-check of chunk-local coordinates. + * + * @param x chunk-local X-coordinate which should normally be between 0 and 15 + * @param y chunk-local Y-coordinate which should normally be between 0 and 255 + * @param z chunk-local Z-coordinate which should normally be between 0 and 15 + * + * @throws IllegalArgumentException if any of coordinates is out of allowed range + */ + public static void rangeCheckChunkLocal(final int x, final int y, final int z) { + rangeCheckChunkLocalX(x); + rangeCheckChunkLocalY(y); + rangeCheckChunkLocalX(z); + } + + /** + * Performs a range-check of chunk-local X-coordinate. + * + * @param x chunk-local X-coordinate which should normally be between 0 and 15 + * @throws IllegalArgumentException if {@code x} is not in range between 0 and 15 + */ + public static void rangeCheckChunkLocalX(final int x) { + checkArgument(x >= 0 && x <= 15, "x should be between 0 and 15"); + } + + /** + * Performs a range-check of chunk-local Y-coordinate. + * + * @param y chunk-local Y-coordinate which should normally be between 0 and 255 + * @throws IllegalArgumentException if {@code y} is not in range between 0 and 255 + */ + public static void rangeCheckChunkLocalY(final int y) { + checkArgument(y >= 0 && y <= 255, "z should be between 0 and 255"); + } + + /** + * Performs a range-check of chunk-local Z-coordinate. + * + * @param z chunk-local Z-coordinate which should normally be between 0 and 15 + * @throws IllegalArgumentException if {@code z} is not in range between 0 and 15 + */ + public static void rangeCheckChunkLocalZ(final int z) { + checkArgument(z >= 0 && z <= 15, "z should be between 0 and 15"); + } + + /////////////////////////////////////////////////////////////////////////// + // Chunk + /////////////////////////////////////////////////////////////////////////// + /** * Returns a single {@link long} value storing chunk data for X- and Z-axises. * @@ -103,9 +156,7 @@ public Chunk getChunk(@NonNull final World world, final long chunk) { * @throws IllegalArgumentException if {@code y} is not in range [0; 255] */ public short toChunkLocalLocationShort(final int chunkLocalX, final int chunkLocalY, final int chunkLocalZ) { - checkArgument(chunkLocalX >= 0 && chunkLocalX < 16, "chunkLocalX should be in range [0; 15]"); - checkArgument(chunkLocalZ >= 0 && chunkLocalZ < 16, "chunkLocalZ should be in range [0; 15]"); - checkArgument(chunkLocalY >= 0 && chunkLocalY < 256, "chunkLocalY should be in range [0; 255]"); + rangeCheckChunkLocal(chunkLocalX, chunkLocalY, chunkLocalZ); return (short) (((chunkLocalX & 0xF) << 12) | ((chunkLocalY & 0xFF) << 4) | (chunkLocalZ & 0xF)); } diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java index 1315ae828..03f077106 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java @@ -7,15 +7,81 @@ import org.bukkit.Location; import org.bukkit.World; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.function.Executable; import org.mockito.ArgumentMatchers; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.*; import static ru.progrm_jarvis.minecraft.commons.chunk.ChunkUtil.*; class ChunkUtilTest { + @Test + void testRangeCheckChunkLocalX() { + for (var chunkLocalX = -32; chunkLocalX <= 32; chunkLocalX++) { + final Executable executable; + { + val x = chunkLocalX; + executable = () -> ChunkUtil.rangeCheckChunkLocalX(x); + } + + if (chunkLocalX < 0 || chunkLocalX > 15) assertThrows(IllegalArgumentException.class, executable); + else assertDoesNotThrow(executable); + } + } + + @Test + void testRangeCheckChunkLocalY() { + for (var chunkLocalZ = -32; chunkLocalZ <= 32; chunkLocalZ++) { + final Executable executable; + { + val z = chunkLocalZ; + executable = () -> ChunkUtil.rangeCheckChunkLocalZ(z); + } + + if (chunkLocalZ < 0 || chunkLocalZ > 15) assertThrows(IllegalArgumentException.class, executable); + else assertDoesNotThrow(executable); + } + } + + @Test + void testRangeCheckChunkLocalZ() { + for (var chunkLocalY = -512; chunkLocalY <= 512; chunkLocalY++) { + final Executable executable; + { + val y = chunkLocalY; + executable = () -> ChunkUtil.rangeCheckChunkLocalY(y); + } + + if (chunkLocalY < 0 || chunkLocalY > 255) assertThrows(IllegalArgumentException.class, executable); + else assertDoesNotThrow(executable); + } + } + + @Test + void testRangeCheckChunkLocal() { + for (var chunkLocalY = -256; chunkLocalY <= 256; chunkLocalY++) { + val y = chunkLocalY; + for (var chunkLocalX = -32; chunkLocalX <= 32; chunkLocalX++) { + val x = chunkLocalX; + for (var chunkLocalZ = -32; chunkLocalZ <= 32; chunkLocalZ++) { + final Executable executable; + { + final int z = chunkLocalZ; + executable = () -> ChunkUtil.rangeCheckChunkLocal(x, y, z); + } + + if (chunkLocalX < 0 || chunkLocalX > 15 + || chunkLocalZ < 0 || chunkLocalZ > 15 + || chunkLocalY < 0 || chunkLocalY > 255) assertThrows( + IllegalArgumentException.class, executable + ); + else assertDoesNotThrow(executable); + } + } + } + } + @Test void testToChunkLong() { byte signs = 0; From 9fd4c2c9ac30ba1b8a7d6e3d62bf35fa06978301 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 13 Jan 2019 20:45:25 +0300 Subject: [PATCH 110/508] Add junit-jupiter-params dependency --- pom.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pom.xml b/pom.xml index dc9e27040..60e8ee0a0 100644 --- a/pom.xml +++ b/pom.xml @@ -312,6 +312,12 @@ ${version.junit} test
+ + org.junit.jupiter + junit-jupiter-params + ${version.junit} + test + org.junit.platform junit-platform-launcher @@ -423,6 +429,10 @@ org.junit.platform junit-platform-launcher + + org.junit.jupiter + junit-jupiter-params + org.mockito From 0460ecae36360a3a084824b47981eda67dbd5b5b Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 13 Jan 2019 20:46:45 +0300 Subject: [PATCH 111/508] Remove unit-test profile --- pom.xml | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/pom.xml b/pom.xml index 60e8ee0a0..0ddf432c4 100644 --- a/pom.xml +++ b/pom.xml @@ -414,35 +414,5 @@
- - unit-test - - true - - - - - org.junit.jupiter - junit-jupiter-engine - - - org.junit.platform - junit-platform-launcher - - - org.junit.jupiter - junit-jupiter-params - - - - org.mockito - mockito-core - - - org.mockito - mockito-junit-jupiter - - - From 30d8ce1502640c19895733eaccfb62129e89e4bd Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 13 Jan 2019 20:47:42 +0300 Subject: [PATCH 112/508] Add junit-params dependency to minecraft-commons --- commons/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/commons/pom.xml b/commons/pom.xml index 3dd57955e..aaa119a0e 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -67,6 +67,10 @@ org.junit.jupiter junit-jupiter-api + + org.junit.jupiter + junit-jupiter-params + org.mockito mockito-core From b112ba1a6feca594522cd01911324e81e6809c78 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 14 Jan 2019 01:44:44 +0300 Subject: [PATCH 113/508] Make LibLoader's reflection operation revert method accessibility --- .../java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java index 4bd79195e..abcebf38d 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java @@ -66,6 +66,7 @@ public class LibLoader { ); } + val accessible = addUrlMethod.isAccessible(); addUrlMethod.setAccessible(true); try { URL_CLASS_LOADER__ADD_URL_METHOD = MethodHandles.lookup().unreflect(addUrlMethod); @@ -75,7 +76,7 @@ public class LibLoader { + " cannot be unreflected to MethodHandle" ); } finally { - addUrlMethod.setAccessible(false); + addUrlMethod.setAccessible(accessible); } } From 4d0c34a9d7a4cc9b83dbc029fce077c61103ad22 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 14 Jan 2019 19:15:05 +0300 Subject: [PATCH 114/508] Add IntWrapper unit-test int :) --- .../commons/util/number/IntWrapper.java | 353 ++++++++++++++++++ .../commons/util/number/IntWrapperTest.java | 216 +++++++++++ 2 files changed, 569 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java create mode 100644 commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java new file mode 100644 index 000000000..37d406624 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java @@ -0,0 +1,353 @@ +package ru.progrm_jarvis.minecraft.commons.util.number; + +import lombok.*; +import lombok.experimental.FieldDefaults; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.IntBinaryOperator; +import java.util.function.IntUnaryOperator; + +/** + * Wrapper for an {@link int} focused at providing polymorphism to its operations concurrency. + */ +public abstract class IntWrapper extends Number { + + /** + * Gets the value. + * + * @return value + */ + abstract int get(); + + /** + * Sets the value. + * + * @param value value to be set + */ + abstract void set(int value); + + /** + * Gets the value after what it gets incremented. + * + * @return value before increment + */ + abstract int getAndIncrement(); + + /** + * Increments the value after what it is returned. + * + * @return value after increment + */ + abstract int incrementAndGet(); + + /** + * Gets the value after what it gets decremented. + * + * @return value before decrement + */ + abstract int getAndDecrement(); + + /** + * Decrements the value after what it is returned. + * + * @return value after decrement + */ + abstract int decrementAndGet(); + + /** + * Gets the value after what delta is added to it. + * + * @param delta the value which should be added to the current value + * @return value before addition + */ + abstract int getAndAdd(int delta); + + /** + * Adds the delta to the value after what it is returned. + * + * @param delta the value which should be added to the current value + * @return value after addition + */ + abstract int addAndGet(int delta); + + /** + * Updates the current value using the specified function after what the new value is returned. + * + * @param updateFunction function to be used for updating the value + * @return value after update + */ + abstract int getAndUpdate(@NonNull IntUnaryOperator updateFunction); + + /** + * Gets the value after what it gets updated using the specified function. + * + * @param updateFunction function to be used for updating the value + * @return value after update + */ + abstract int updateAndGet(@NonNull IntUnaryOperator updateFunction); + + /** + * Updates the current value using specified function and update value after what the new value is returned. + * + * @param updateValue update value (will be passed as the second function parameter) + * @param accumulatorFunction function to be used for updating the value + * @return value after update + */ + abstract int getAndAccumulate(int updateValue, @NonNull IntBinaryOperator accumulatorFunction); + + /** + * Gets the value after what it gets updated using the specified function and update value. + * + * @param updateValue update value (will be passed as the second function parameter) + * @param accumulatorFunction function to be used for updating the value + * @return value after update + */ + abstract int accumulateAndGet(int updateValue, @NonNull IntBinaryOperator accumulatorFunction); + + /** + * Creates new simple int wrapper. + * + * @param value initial value of int wrapper + * @return created int wrapper + */ + public static IntWrapper create(final int value) { + return new IntIntWrapper(value); + } + + /** + * Creates new simple int wrapper with initial value set to {@code 0}. + * + * @return created int wrapper + */ + public static IntWrapper create() { + return new IntIntWrapper(); + } + + /** + * Creates new atomic int wrapper. + * + * @param value initial value of int wrapper + * @return created int wrapper + */ + public static IntWrapper createAtomic(final int value) { + return new AtomicIntegerIntWrapper(value); + } + + /** + * Creates new atomic int wrapper with initial value set to {@code 0}. + * + * @return created int wrapper + */ + public static IntWrapper createAtomic() { + return new AtomicIntegerIntWrapper(); + } + + /** + * {@link IntWrapper} implementation based on {@link int}. + */ + @Data + @NoArgsConstructor + @AllArgsConstructor + @EqualsAndHashCode(callSuper = true) + @FieldDefaults(level = AccessLevel.PRIVATE) + private static final class IntIntWrapper extends IntWrapper { + + int value; + + @Override + int get() { + return value; + } + + @Override + void set(final int value) { + this.value = value; + } + + @Override + int getAndIncrement() { + return value++; + } + + @Override + int incrementAndGet() { + return ++value; + } + + @Override + int getAndDecrement() { + return value--; + } + + @Override + int decrementAndGet() { + return --value; + } + + @Override + int getAndAdd(final int delta) { + val oldValue = value; + value += delta; + + return oldValue; + } + + @Override + int addAndGet(final int delta) { + return value += delta; + } + + @Override + int getAndUpdate(@NonNull final IntUnaryOperator updateFunction) { + val oldValue = value; + value = updateFunction.applyAsInt(oldValue); + + return oldValue; + } + + @Override + int updateAndGet(@NonNull final IntUnaryOperator updateFunction) { + return value = updateFunction.applyAsInt(value); + } + + @Override + int getAndAccumulate(final int updateValue, @NonNull final IntBinaryOperator accumulatorFunction) { + val oldValue = value; + value = accumulatorFunction.applyAsInt(value, updateValue); + + return oldValue; + } + + @Override + int accumulateAndGet(final int updateValue, @NonNull final IntBinaryOperator accumulatorFunction) { + return value = accumulatorFunction.applyAsInt(value, updateValue); + } + + @Override + public int intValue() { + return value; + } + + @Override + public long longValue() { + return value; + } + + @Override + public float floatValue() { + return value; + } + + @Override + public double doubleValue() { + return value; + } + } + + /** + * {@link IntWrapper} implementation based on {@link AtomicInteger}. + */ + @Value + @EqualsAndHashCode(callSuper = true) + @FieldDefaults(level = AccessLevel.PRIVATE) + private static final class AtomicIntegerIntWrapper extends IntWrapper{ + + @NonNull AtomicInteger value; + + /** + * Creates new atomic integer int wrapper. + * + * @param value initial value + */ + public AtomicIntegerIntWrapper(final int value) { + this.value = new AtomicInteger(value); + } + + /** + * Creates new atomic integer int wrapper with initial value set to {@code 0}. + */ + public AtomicIntegerIntWrapper() { + this.value = new AtomicInteger(); + } + + @Override + int get() { + return value.get(); + } + + @Override + void set(final int value) { + this.value.set(value); + } + + @Override + int getAndIncrement() { + return value.getAndIncrement(); + } + + @Override + int incrementAndGet() { + return value.incrementAndGet(); + } + + @Override + int getAndDecrement() { + return value.getAndDecrement(); + } + + @Override + int decrementAndGet() { + return value.decrementAndGet(); + } + + @Override + int getAndAdd(final int delta) { + return value.getAndAdd(delta); + } + + @Override + int addAndGet(final int delta) { + return value.addAndGet(delta); + } + + @Override + int getAndUpdate(@NonNull final IntUnaryOperator updateFunction) { + return value.getAndUpdate(updateFunction); + } + + @Override + int updateAndGet(@NonNull final IntUnaryOperator updateFunction) { + return value.updateAndGet(updateFunction); + } + + @Override + int getAndAccumulate(final int updateValue, @NonNull final IntBinaryOperator accumulatorFunction) { + return value.getAndAccumulate(updateValue, accumulatorFunction); + } + + @Override + int accumulateAndGet(final int updateValue, @NonNull final IntBinaryOperator accumulatorFunction) { + return value.accumulateAndGet(updateValue, accumulatorFunction); + } + + @Override + public int intValue() { + return value.intValue(); + } + + @Override + public long longValue() { + return value.longValue(); + } + + @Override + public float floatValue() { + return value.floatValue(); + } + + @Override + public double doubleValue() { + return value.doubleValue(); + } + } +} diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java new file mode 100644 index 000000000..5c2b8d4c6 --- /dev/null +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java @@ -0,0 +1,216 @@ +package ru.progrm_jarvis.minecraft.commons.util.number; + +import lombok.NonNull; +import lombok.val; +import lombok.var; +import org.apache.commons.lang.math.RandomUtils; +import org.junit.Test; +import org.junit.jupiter.api.function.ThrowingSupplier; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import ru.progrm_jarvis.minecraft.commons.util.RandomUtil; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.IntBinaryOperator; +import java.util.function.IntUnaryOperator; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.params.provider.Arguments.of; + +@RunWith(Parameterized.class) +class IntWrapperTest { + + static List provideIntWrappers() { + val arguments = new ArrayList(); + + arguments.add(of(IntWrapper.create())); + arguments.add(of(IntWrapper.createAtomic())); + + for (var i = 0; i < 8 + RandomUtils.nextInt(8); i++) arguments + .add(of(IntWrapper.create(RandomUtils.nextInt()))); + for (var i = 0; i < 8 + RandomUtils.nextInt(8); i++) arguments + .add(of(IntWrapper.create(-RandomUtils.nextInt()))); + for (var i = 0; i < 8 + RandomUtils.nextInt(8); i++) arguments + .add(of(IntWrapper.createAtomic(RandomUtils.nextInt()))); + for (var i = 0; i < 8 + RandomUtils.nextInt(8); i++) arguments + .add(of(IntWrapper.createAtomic(-RandomUtils.nextInt()))); + + return arguments; + } + + @Test + void testCreate() { + assertDoesNotThrow((ThrowingSupplier) IntWrapper::create); + for (var i = 0; i < 128; i++) assertDoesNotThrow(() -> IntWrapper.create(RandomUtils.nextInt())); + } + + @Test + void testCreateAtomic() { + assertDoesNotThrow((ThrowingSupplier) IntWrapper::createAtomic); + for (var i = 0; i < 128; i++) assertDoesNotThrow(() -> IntWrapper.createAtomic(RandomUtils.nextInt())); + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testGetValueOfSpecificNumericType(@NonNull final IntWrapper wrapper) { + val value = wrapper.get(); + + assertEquals((byte) value, wrapper.byteValue()); + assertEquals((short) value, wrapper.shortValue()); + assertEquals(value, wrapper.intValue()); + assertEquals((long) value, wrapper.longValue()); + assertEquals((float) value, wrapper.floatValue()); + assertEquals((double) value, wrapper.doubleValue()); + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testGetSet(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val value = RandomUtils.nextInt(); + wrapper.set(value); + assertEquals(value, wrapper.get()); + } + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testGetAndIncrement(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val value = wrapper.get(); + assertEquals(value, wrapper.getAndIncrement()); + assertEquals(value + 1, wrapper.get()); + } + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testIncrementAndGet(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val newValue = wrapper.get() + 1; + assertEquals(newValue, wrapper.incrementAndGet()); + assertEquals(newValue, wrapper.get()); + } + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testGetAndDecrement(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val value = wrapper.get(); + assertEquals(value, wrapper.getAndDecrement()); + assertEquals(value - 1, wrapper.get()); + } + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testDecrementAndGet(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val newValue = wrapper.get() - 1; + assertEquals(newValue, wrapper.decrementAndGet()); + assertEquals(newValue, wrapper.get()); + } + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testGetAndAdd(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val delta = RandomUtils.nextInt() * RandomUtil.randomSign(); + + val value = wrapper.get(); + assertEquals(value, wrapper.getAndAdd(delta)); + assertEquals(value + delta, wrapper.get()); + } + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testAddAndGet(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val delta = RandomUtils.nextInt() * RandomUtil.randomSign(); + + val newValue = wrapper.get() + delta; + assertEquals(newValue, wrapper.addAndGet(delta)); + assertEquals(newValue, wrapper.get()); + } + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testGetAndUpdate(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val function = randomIntUnaryFunction(); + + val value = wrapper.get(); + assertEquals(value, wrapper.getAndUpdate(function)); + assertEquals(function.applyAsInt(value), wrapper.get()); + } + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testUpdateAndGet(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val function = randomIntUnaryFunction(); + + val newValue = function.applyAsInt(wrapper.get()); + assertEquals(newValue, wrapper.updateAndGet(function)); + assertEquals(newValue, wrapper.get()); + } + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testGetAndAccumulate(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val function = randomIntBinaryFunction(); + val updateValue = RandomUtils.nextInt(); + + val value = wrapper.get(); + assertEquals(value, wrapper.getAndAccumulate(updateValue, function)); + assertEquals(function.applyAsInt(value, updateValue), wrapper.get()); + } + } + + @ParameterizedTest + @MethodSource("provideIntWrappers") + void testAccumulateAndGet(@NonNull final IntWrapper wrapper) { + for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { + val function = randomIntBinaryFunction(); + val updateValue = RandomUtils.nextInt(); + + val newValue = function.applyAsInt(wrapper.get(), updateValue); + assertEquals(newValue, wrapper.accumulateAndGet(updateValue, function)); + assertEquals(newValue, wrapper.get()); + } + } + + private static IntUnaryOperator randomIntUnaryFunction() { + val randomValue = RandomUtils.nextBoolean() ? RandomUtils.nextInt() : -RandomUtils.nextInt(); + + switch (RandomUtils.nextInt(4)) { + case 0: return i -> i += randomValue; + case 1: return i -> i -= randomValue; + case 2: return i -> i *= randomValue; + case 3: return i -> i /= randomValue; + default: throw new IllegalStateException("RandomUtils.nextInt(4) returned an illegal value"); + } + } + + private static IntBinaryOperator randomIntBinaryFunction() { + switch (RandomUtils.nextInt(4)) { + case 0: return (i, k) -> i += k; + case 1: return (i, k) -> i -= k; + case 2: return (i, k) -> i *= k; + case 3: return (i, k) -> i /= k; + default: throw new IllegalStateException("RandomUtils.nextInt(4) returned an illegal value"); + } + } +} \ No newline at end of file From 24c716d7a174730a18cc1a6dba362e79a88ca2ca Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 14 Jan 2019 19:38:53 +0300 Subject: [PATCH 115/508] Fix IntWrapperTest --- .../commons/util/number/IntWrapperTest.java | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java index 5c2b8d4c6..1de538c2b 100644 --- a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java +++ b/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java @@ -4,17 +4,15 @@ import lombok.val; import lombok.var; import org.apache.commons.lang.math.RandomUtils; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.ThrowingSupplier; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import ru.progrm_jarvis.minecraft.commons.util.RandomUtil; import java.util.ArrayList; -import java.util.List; +import java.util.Collection; import java.util.function.IntBinaryOperator; import java.util.function.IntUnaryOperator; @@ -22,10 +20,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.params.provider.Arguments.of; -@RunWith(Parameterized.class) class IntWrapperTest { - static List provideIntWrappers() { + static Collection intWrapperParameters() { val arguments = new ArrayList(); arguments.add(of(IntWrapper.create())); @@ -56,7 +53,7 @@ void testCreateAtomic() { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testGetValueOfSpecificNumericType(@NonNull final IntWrapper wrapper) { val value = wrapper.get(); @@ -69,7 +66,7 @@ void testGetValueOfSpecificNumericType(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testGetSet(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val value = RandomUtils.nextInt(); @@ -79,7 +76,7 @@ void testGetSet(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testGetAndIncrement(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val value = wrapper.get(); @@ -89,7 +86,7 @@ void testGetAndIncrement(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testIncrementAndGet(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val newValue = wrapper.get() + 1; @@ -99,7 +96,7 @@ void testIncrementAndGet(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testGetAndDecrement(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val value = wrapper.get(); @@ -109,7 +106,7 @@ void testGetAndDecrement(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testDecrementAndGet(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val newValue = wrapper.get() - 1; @@ -119,7 +116,7 @@ void testDecrementAndGet(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testGetAndAdd(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val delta = RandomUtils.nextInt() * RandomUtil.randomSign(); @@ -131,7 +128,7 @@ void testGetAndAdd(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testAddAndGet(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val delta = RandomUtils.nextInt() * RandomUtil.randomSign(); @@ -143,7 +140,7 @@ void testAddAndGet(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testGetAndUpdate(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val function = randomIntUnaryFunction(); @@ -155,7 +152,7 @@ void testGetAndUpdate(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testUpdateAndGet(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val function = randomIntUnaryFunction(); @@ -167,7 +164,7 @@ void testUpdateAndGet(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testGetAndAccumulate(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val function = randomIntBinaryFunction(); @@ -180,7 +177,7 @@ void testGetAndAccumulate(@NonNull final IntWrapper wrapper) { } @ParameterizedTest - @MethodSource("provideIntWrappers") + @MethodSource("intWrapperParameters") void testAccumulateAndGet(@NonNull final IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val function = randomIntBinaryFunction(); From fcb93d033c71efb0c8796ff9d1bde98eb93bfbbe Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 18 Jan 2019 17:23:05 +0300 Subject: [PATCH 116/508] Optimize imports of ArmorStandBlockItem --- .../minecraft/fakeentitylib/entity/ArmorStandBlockItem.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 6e8824e58..a83cbadcb 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -19,7 +19,10 @@ import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.Entity; import javax.annotation.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.armorStandFlags; From 0a160e11a3ca6fb585c53c83789a4981f30d707c Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 18 Jan 2019 17:23:29 +0300 Subject: [PATCH 117/508] Mark SimpleLivingFakeEntity with @ShouldBeRegisteredInPlayerRegistry --- .../minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 8b956ac98..71ab078f0 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -9,6 +9,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import ru.progrm_jarvis.minecraft.commons.player.registry.ShouldBeRegisteredInPlayerRegistry; import javax.annotation.Nullable; import java.util.Map; @@ -17,6 +18,7 @@ /** * A simple living entity self-sustained for direct usage. */ +@ShouldBeRegisteredInPlayerRegistry @ToString @EqualsAndHashCode(callSuper = true) @FieldDefaults(level = AccessLevel.PROTECTED) From 04f5bee595ada949731bf4eceb6e011304187de8 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 18 Jan 2019 18:05:48 +0300 Subject: [PATCH 118/508] Make PeriodicFakeEntityObserver shutdown using specific util --- .../observer/PeriodicFakeEntityObserver.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java index bdb8c73dc..96d251bdf 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java @@ -2,17 +2,16 @@ import lombok.*; import lombok.experimental.FieldDefaults; -import org.bukkit.Bukkit; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; +import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginShutdownUtil; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.ObservableFakeEntity; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.management.AbstractSetBasedEntityManager; import javax.annotation.Nonnull; -import java.util.*; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantLock; @@ -56,12 +55,7 @@ public PeriodicFakeEntityObserver(@Nonnull final P plugin, final boolean concurr this.entitiesSetSupplier = entitiesSetSupplier; - Bukkit.getPluginManager().registerEvents(new Listener() { - @EventHandler - public void onPluginDisable(final PluginDisableEvent event) { - if (event.getPlugin() == plugin) shutdown(); - } - }, plugin); + BukkitPluginShutdownUtil.addShutdownHook(plugin, this::shutdown); } protected RedrawEntitiesRunnable getRedrawEntitiesRunnable() { From a092dcc400972f68d5bbba9b5cb3036a86e98e04 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 18 Jan 2019 18:07:40 +0300 Subject: [PATCH 119/508] Docs: add a bit of docs to FakeEntityObserver --- .../fakeentitylib/entity/observer/FakeEntityObserver.java | 1 + 1 file changed, 1 insertion(+) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java index 34256726b..0afcbbdcb 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java @@ -6,6 +6,7 @@ /** * An object responsible for entity observation. + * Observation is the process of controlling the entity visibility for players. * * @param

type of parent plugin * @param type of entity managed From 21c2202aa06c39b46cd97cd820673a7f6cdfe387 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 18 Jan 2019 20:39:52 +0300 Subject: [PATCH 120/508] Fix ToStringUtil to use AbstractPacket --- .../minecraft/commons/nms/ToStringUtil.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java index 5efb4216b..1402da8c2 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java @@ -1,6 +1,6 @@ package ru.progrm_jarvis.minecraft.commons.nms; -import com.comphenix.packetwrapper.PacketWrapper; +import com.comphenix.packetwrapper.AbstractPacket; import com.google.common.base.Function; import com.google.common.base.MoreObjects; import com.google.common.cache.Cache; @@ -47,13 +47,13 @@ public class ToStringUtil { .build(); @SneakyThrows - public String toString(final PacketWrapper packetWrapper) { - if (packetWrapper == null) return "null"; + public String toString(final AbstractPacket packet) { + if (packet == null) return "null"; final Map> methods; final String className; { - val clazz = packetWrapper.getClass(); + val clazz = packet.getClass(); methods = METHODS_CACHE.get(clazz, () -> Arrays.stream(clazz.getDeclaredMethods()) .filter(method -> method.getName().startsWith("get")) .collect(Collectors.toMap( @@ -75,7 +75,7 @@ public String toString(final PacketWrapper packetWrapper) { while (hasNext) { val entry = entries.next(); // invoked before append() to exit if an exception occurs without any unneeded operations - val value = entry.getValue().invoke(packetWrapper); + val value = entry.getValue().invoke(packet); stringBuilder .append(entry.getKey()) From 80d95f049487c1d356f86d9190d918a00f519b79 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 19 Jan 2019 22:57:10 +0300 Subject: [PATCH 121/508] Remove #sendEvents() from InteractableFakeEntity --- .../fakeentitylib/entity/behaviour/InteractableFakeEntity.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java index 588219ff0..dae51f2f2 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java @@ -7,7 +7,5 @@ public interface InteractableFakeEntity extends FakeEntity { int getEntityId(); - boolean sendsEvents(); - void handleInteraction(Player player, FakeEntityInteraction interaction); } From 6a03e60ba4a206095d99069bf997052ce2307075 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 19 Jan 2019 22:57:58 +0300 Subject: [PATCH 122/508] Remove unnecessary String.valueOf(Object) from ToStringUtil --- .../ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java index 1402da8c2..3336650dd 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java @@ -79,7 +79,7 @@ public String toString(final AbstractPacket packet) { stringBuilder .append(entry.getKey()) - .append(String.valueOf(value)); + .append(value); hasNext = entries.hasNext(); if (hasNext) stringBuilder From 308148c6fc44398f2c811ded00bf59ce8dc9fc76 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 19 Jan 2019 23:03:06 +0300 Subject: [PATCH 123/508] Code-style: remove extra blank line from AbstractObservableFakeEntity --- .../fakeentitylib/entity/AbstractObservableFakeEntity.java | 1 - 1 file changed, 1 deletion(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java index 42a4635f8..9f56565c7 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java @@ -13,7 +13,6 @@ @FieldDefaults(level = AccessLevel.PROTECTED) public abstract class AbstractObservableFakeEntity extends AbstractFakeEntity implements ObservableFakeEntity { - @Getter final boolean global; @Getter final int viewDistance; @Getter final int viewDistanceSquared; From 309c4f87d2075a849eb8c6b11651f8eea8905be8 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 19 Jan 2019 23:04:06 +0300 Subject: [PATCH 124/508] Optimize AbstractObservableFakeEntity's code a bit <3 --- .../entity/AbstractObservableFakeEntity.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java index 9f56565c7..79d815bb9 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java @@ -10,12 +10,12 @@ */ @ToString @EqualsAndHashCode(callSuper = false) -@FieldDefaults(level = AccessLevel.PROTECTED) +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public abstract class AbstractObservableFakeEntity extends AbstractFakeEntity implements ObservableFakeEntity { - @Getter final boolean global; - @Getter final int viewDistance; - @Getter final int viewDistanceSquared; + @Getter boolean global; + @Getter int viewDistance; + @Getter int viewDistanceSquared; public AbstractObservableFakeEntity(final boolean global, final int viewDistance, @NonNull final Location location) { @@ -23,7 +23,7 @@ public AbstractObservableFakeEntity(final boolean global, final int viewDistance this.global = global; this.viewDistance = viewDistance; - this.viewDistanceSquared = viewDistance * viewDistance; + viewDistanceSquared = viewDistance * viewDistance; } @Override From 728ff22a612e67d4ac5bbc89373a54e8a4372d90 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 19 Jan 2019 23:23:38 +0300 Subject: [PATCH 125/508] Add #getSeeing/NotSeeingPlayers, rename #canSee in ObservableFakeEntity --- .../entity/AbstractObservableFakeEntity.java | 2 +- .../AbstractPlayerContainingFakeEntity.java | 27 +++++++++++++++---- .../entity/ObservableFakeEntity.java | 20 +++++++++++++- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java index 79d815bb9..bd1d0d4c3 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java @@ -27,7 +27,7 @@ public AbstractObservableFakeEntity(final boolean global, final int viewDistance } @Override - public boolean canSee(final Player player) { + public boolean shouldSee(final Player player) { return player.getWorld() == location.getWorld() && player.getEyeLocation().distanceSquared(location) <= viewDistanceSquared; } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java index b17a6a383..0c92bb0db 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java @@ -6,6 +6,7 @@ import org.bukkit.entity.Player; import java.util.Collection; +import java.util.HashSet; import java.util.Map; /** @@ -45,7 +46,7 @@ public boolean containsPlayer(final Player player) { @Override public void addPlayer(final Player player) { if (!players.containsKey(player)) { - if (canSee(player)) render(player); + if (shouldSee(player)) render(player); else players.put(player, false); } } @@ -59,6 +60,22 @@ public void removePlayer(final Player player) { } } + @Override + public Collection getSeeingPlayers() { + val seeingPlayers = new HashSet(); + for (val entry : players.entrySet()) if (entry.getValue()) seeingPlayers.add(entry.getKey()); + + return seeingPlayers; + } + + @Override + public Collection getNotSeeingPlayers() { + val notSeeingPlayers = new HashSet(); + for (val entry : players.entrySet()) if (!entry.getValue()) notSeeingPlayers.add(entry.getKey()); + + return notSeeingPlayers; + } + /////////////////////////////////////////////////////////////////////////// // Rendering /////////////////////////////////////////////////////////////////////////// @@ -83,8 +100,8 @@ public void attemptRerender(final Player player) { if (sees == null) return; if (sees) { - if (!canSee(player)) render(player); - } else if (canSee(player)) unrender(player); + if (!shouldSee(player)) render(player); + } else if (shouldSee(player)) unrender(player); } @@ -94,8 +111,8 @@ public void attemptRerenderForAll() { val player = entry.getKey(); if (entry.getValue()) { // sees - if (!canSee(player)) unrender(player); - } else if (canSee(player)) render(player); + if (!shouldSee(player)) unrender(player); + } else if (shouldSee(player)) render(player); } } } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java index d569c125f..487053821 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java @@ -3,6 +3,8 @@ import lombok.val; import org.bukkit.entity.Player; +import java.util.Collection; + public interface ObservableFakeEntity extends FakeEntity { /** @@ -38,7 +40,23 @@ public interface ObservableFakeEntity extends FakeEntity { * @param player player to check for ability to see this fake entity * @return whether or not the player can see this fake entity */ - boolean canSee(Player player); + boolean shouldSee(Player player); + + /** + * Gets all players who are related to this fake entity + * and are seeing it at the moment (have it rendered). + * + * @return all players who have this fake entity rendered at the moment + */ + Collection getSeeingPlayers(); + + /** + * Gets all players who are related to this fake entity + * and are not seeing it at the moment (don't have it rendered). + * + * @return all players who don't have this fake entity rendered at the moment + */ + Collection getNotSeeingPlayers(); /** * Attempt to rerender this fake entity for player specified. From 118df1251152c540b2459646b37155bef62accaa Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 19 Jan 2019 23:42:11 +0300 Subject: [PATCH 126/508] Add protected #getEntityId() to SimpleLivingFakeEntity renaming field --- .../entity/ArmorStandBlockItem.java | 2 +- .../entity/SimpleLivingFakeEntity.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index a83cbadcb..00463798d 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -77,7 +77,7 @@ public ArmorStandBlockItem(@Nullable final UUID uuid, this.rotation = rotation; equipmentPacket = new WrapperPlayServerEntityEquipment(); - equipmentPacket.setEntityID(id); + equipmentPacket.setEntityID(entityId); equipmentPacket.setSlot(EnumWrappers.ItemSlot.HEAD); equipmentPacket.setItem(this.item = item); diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 71ab078f0..e5544161a 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -31,7 +31,7 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * Unique entity ID by which it should be identified in all packets. */ - final int id; // id should not be generated before all checks are performed + @Getter(AccessLevel.PROTECTED) final int entityId; // id should not be generated before all checks are performed /** * This fake entity's UUID @@ -159,7 +159,7 @@ public SimpleLivingFakeEntity(final int entityId, @Nullable final UUID uuid, @No // setup fields - this.id = entityId; + this.entityId = entityId; this.uuid = uuid; this.type = type; @@ -177,12 +177,12 @@ public SimpleLivingFakeEntity(final int entityId, @Nullable final UUID uuid, @No // setup packets spawnPacket = new WrapperPlayServerSpawnEntityLiving(); - spawnPacket.setEntityID(id); + spawnPacket.setEntityID(this.entityId); spawnPacket.setType(type); if (uuid != null) spawnPacket.setUniqueId(uuid); despawnPacket = new WrapperPlayServerEntityDestroy(); - despawnPacket.setEntityIds(new int[]{id}); + despawnPacket.setEntityIds(new int[]{this.entityId}); } /** @@ -267,7 +267,7 @@ protected void performMove(final double dx, final double dy, final double dz, fi if (pitch == 0 && yaw == 0) { if (movePacket == null) { movePacket = new WrapperPlayServerRelEntityMove(); - movePacket.setEntityID(id); + movePacket.setEntityID(entityId); } movePacket.setDx((int) (dx * 32 * 128)); @@ -278,7 +278,7 @@ protected void performMove(final double dx, final double dy, final double dz, fi } else { if (moveLookPacket == null) { moveLookPacket = new WrapperPlayServerRelEntityMoveLook(); - moveLookPacket.setEntityID(id); + moveLookPacket.setEntityID(entityId); moveLookPacket.setDx((int) (dx * 32 * 128)); moveLookPacket.setDy((int) (dy * 32 * 128)); @@ -309,7 +309,7 @@ protected void performTeleportation(final double x, final double y, final double if (visible) { if (teleportPacket == null) { teleportPacket = new WrapperPlayServerEntityTeleport(); - teleportPacket.setEntityID(id); + teleportPacket.setEntityID(entityId); } teleportPacket.setX(x + xDelta); @@ -335,7 +335,7 @@ protected void sendMetadata() { if (metadata == null) return; if (metadataPacket == null) { metadataPacket = new WrapperPlayServerEntityMetadata(); - metadataPacket.setEntityID(id); + metadataPacket.setEntityID(entityId); } metadataPacket.setMetadata(metadata.getWatchableObjects()); From 0915725c90ff91b87b6ee1f9de256c302c027e1d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 20 Jan 2019 00:17:31 +0300 Subject: [PATCH 127/508] Fix AbstractBasicFakeEntity move logic --- .../entity/AbstractBasicFakeEntity.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index e7bb70eaa..f4ded6338 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -144,16 +144,30 @@ protected abstract void performTeleportation(final double x, final double y, fin public void teleport(final double x, final double y, final double z, final float yaw, final float pitch) { final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); - if (dx > 8 || dy > 8 || dz > 8) performMove(dx, dy, dz, yaw, pitch); - else performTeleportation(x, y, z, yaw, pitch); + location.setX(x); + location.setZ(y); + location.setZ(z); + location.setYaw(yaw); + location.setPitch(pitch); + + if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch); + else performMove(dx, dy, dz, yaw, pitch); } @Override public void move(final double dx, final double dy, final double dz, final float dYaw, final float dPitch) { - if (dx > 8 || dy > 8 || dz > 8) performMove(dx, dy, dz, location.getYaw() + dYaw, location.getPitch() + dPitch); - else performTeleportation( + location.setX(location.getX() + dx); + location.setY(location.getY() + dy); + location.setZ(location.getZ() + dz); + location.setYaw(location.getYaw() + dYaw); + location.setPitch(location.getPitch() + dPitch); + + // use teleportation if any of axises is above 8 blocks limit + if (dx > 8 || dy > 8 || dz > 8) performTeleportation( location.getX() + dx, location.getY() + dy, location.getZ() + dz, location.getYaw() + dYaw, location.getPitch() + dPitch ); + // otherwise use move + else performMove(dx, dy, dz, location.getYaw() + dYaw, location.getPitch() + dPitch); } } From a7c34b5f5002befc1e648ce9e7bf5ac57f5b434a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 20 Jan 2019 01:54:41 +0300 Subject: [PATCH 128/508] Make SimpleLivingFakeEntity#getEntityId() public --- .../minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index e5544161a..37f513d34 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -31,7 +31,7 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * Unique entity ID by which it should be identified in all packets. */ - @Getter(AccessLevel.PROTECTED) final int entityId; // id should not be generated before all checks are performed + @Getter final int entityId; // id should not be generated before all checks are performed /** * This fake entity's UUID From 1ea092b8bc649babfa61ae827b6fc6f36696c3d8 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 20 Jan 2019 02:03:55 +0300 Subject: [PATCH 129/508] Delegate #getEntityId() in FakeEntity --- .../minecraft/fakeentitylib/entity/FakeEntity.java | 7 +++++++ .../entity/behaviour/InteractableFakeEntity.java | 2 -- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java index 3f18e20bf..6b5ca9939 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java @@ -9,6 +9,13 @@ public interface FakeEntity extends PlayerContainer { + /** + * Gets the unique ID of this entity for use in player packets. + * + * @return Minecraft entity unique ID of this fake entity + */ + int getEntityId(); + /** * Gets the world of this fake entity. * diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java index dae51f2f2..887a9f5cc 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java @@ -5,7 +5,5 @@ public interface InteractableFakeEntity extends FakeEntity { - int getEntityId(); - void handleInteraction(Player player, FakeEntityInteraction interaction); } From f39fa21462f3ba54743beb1d3e88daca6df0af3d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 20 Jan 2019 18:57:25 +0300 Subject: [PATCH 130/508] Add FluentBukkitEvents --- .../commons/event/FluentBukkitEvents.java | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java new file mode 100644 index 000000000..6163a074d --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java @@ -0,0 +1,178 @@ +package ru.progrm_jarvis.minecraft.commons.event; + +import lombok.*; +import lombok.experimental.Accessors; +import lombok.experimental.UtilityClass; +import org.bukkit.Bukkit; +import org.bukkit.event.Event; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.plugin.EventExecutor; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.PluginManager; +import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; + +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Utility for fluent and comfortable registration of events. + */ +@UtilityClass +public class FluentBukkitEvents { + + /** + * Plugin manager of Bukkit + */ + private final PluginManager PLUGIN_MANAGER = Bukkit.getPluginManager(); + + /** + * Event listeners groups stored by Plugin -> Event-Type -> EventPriority. + */ + private final Map, EventListenersGroup> LISTENERS_GROUPS = new ConcurrentHashMap<>(); + + /** + * Creates an event listener registration for fluent registration of the event listener(s). + * + * @param eventType type of the event handled to use for registration + * @param type of the event handled + * @return event listener registration for fluent registration of the event listener(s) + */ + public EventListenerRegistration on(@NonNull final Class eventType) { + return new EventListenerRegistration<>(eventType); + } + + @Data + @Accessors(chain = true, fluent = true) + public static final class EventListenerRegistration { + + /** + * Type of event registered + */ + @NonNull Class type; + + /** + * Plugin to use for event registration + */ + @NonNull Plugin plugin; + + /** + * Priority of the event's handler + */ + @NonNull EventPriority priority = EventPriority.NORMAL; + + /** + * Instantiates new event listener registration for the specified event type. + * + * @param type type of event handled + */ + public EventListenerRegistration(@NonNull final Class type) { + this.type = type; + } + + /** + * Gets the event listeners group for this event listeners registration's configuration. + * + * @return event listeners group for this event listener registration's configuration + */ + @SuppressWarnings("unchecked") + private EventListenersGroup getListenersGroup() { + return (EventListenersGroup) LISTENERS_GROUPS.get(new ListenerConfiguration<>(plugin, type, priority)); + } + + /** + * Registers the event. + * + * @param listener listener to use for event handling + * @return unregister to use for event unregistration + */ + public Unregister register(@NonNull final UncheckedConsumer listener) { + checkNotNull(plugin, "plugin has not been set"); + + val listenersGroup = getListenersGroup(); + listenersGroup.addListener(listener); + + return () -> listenersGroup.removeListener(listener); + } + + /** + * Object used for unregistering the registered event + */ + @FunctionalInterface + public interface Unregister { + + /** + * Unregisters the registered event + */ + void unregister(); + } + } + + /** + * Group of event listeners having the same parameters. + * + * @param type of handled event + */ + @Value + private static final class EventListenersGroup implements Listener, EventExecutor { + + /** + * Plugin managing these event listeners + */ + @NonNull final ListenerConfiguration configuration; + + /** + * Event listeners in this event listener group's dequeue + */ + @Getter(AccessLevel.NONE) @NonNull Deque> eventListeners + = ConcurrentCollections.concurrentDeque(new ArrayDeque<>()); + + /** + * Adds the listener to the deque of handled listeners for the event. + * + * @param listener listener to add to handling dequeue + */ + private void addListener(@NonNull final UncheckedConsumer listener) { + if (eventListeners.isEmpty()) { + PLUGIN_MANAGER + .registerEvent(configuration.type, this, configuration.priority, this, configuration.plugin); + LISTENERS_GROUPS.putIfAbsent(configuration, this); + } + + eventListeners.add(listener); + } + + /** + * Removes the listener from the deque of handled listeners for the event. + * + * @param listener listener to remove from handling dequeue + */ + private void removeListener(@NonNull final UncheckedConsumer listener) { + eventListeners.remove(listener); + + if (eventListeners.isEmpty()) { + HandlerList.unregisterAll(this); + LISTENERS_GROUPS.remove(configuration); + } + } + + @Override + public void execute(final Listener listener, final Event event) { + @SuppressWarnings("unchecked") val castEvent = (E) event; + for (val eventListener : eventListeners) eventListener.accept(castEvent); + } + } + + @Value + private static final class ListenerConfiguration { + @NonNull final Plugin plugin; + @NonNull final Class type; + @NonNull final EventPriority priority; + } +} From effd2f0ff68be8df0b7111cc66561014e4707e99 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 21 Jan 2019 16:17:03 +0300 Subject: [PATCH 131/508] Fix FluentBukkitEvents --- .../minecraft/commons/event/FluentBukkitEvents.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java index 6163a074d..fb14a93a9 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java @@ -83,7 +83,10 @@ public EventListenerRegistration(@NonNull final Class type) { */ @SuppressWarnings("unchecked") private EventListenersGroup getListenersGroup() { - return (EventListenersGroup) LISTENERS_GROUPS.get(new ListenerConfiguration<>(plugin, type, priority)); + return (EventListenersGroup) LISTENERS_GROUPS.computeIfAbsent( + new ListenerConfiguration<>(plugin, type, priority), + configuration -> new EventListenersGroup<>((ListenerConfiguration) configuration) + ); } /** From 432aacc6b7bbff4fd6c57f86b80f43ad1cd3fdcf Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 21 Jan 2019 16:30:22 +0300 Subject: [PATCH 132/508] Add type-check to FluentBukkitEvents --- .../minecraft/commons/event/FluentBukkitEvents.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java index fb14a93a9..ab860bf1a 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java @@ -167,8 +167,10 @@ private void removeListener(@NonNull final UncheckedConsumer listener) { @Override public void execute(final Listener listener, final Event event) { - @SuppressWarnings("unchecked") val castEvent = (E) event; - for (val eventListener : eventListeners) eventListener.accept(castEvent); + if (configuration.type.isAssignableFrom(event.getClass())) { + @SuppressWarnings("unchecked") val castEvent = (E) event; + for (val eventListener : eventListeners) eventListener.accept(castEvent); + } } } From cddfcd06c7cd2dedbd7400a5b2b11425326d46eb Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 26 Jan 2019 22:41:58 +0300 Subject: [PATCH 133/508] Add FileUtil --- .../minecraft/commons/util/io/FileUtil.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java new file mode 100644 index 000000000..aae1ecb9f --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java @@ -0,0 +1,36 @@ +package ru.progrm_jarvis.minecraft.commons.util.io; + +import lombok.NonNull; +import lombok.SneakyThrows; +import lombok.experimental.UtilityClass; +import lombok.val; + +import java.io.File; +import java.nio.file.Files; + +/** + * Utilities for common + */ +@UtilityClass +public class FileUtil { + + /** + * Creates the file if it doesn't exists. + * + * @param file file to make exist if possible + * @return the file specified + * + * @apiNote this attempts to create a file and its parent directory only when needed + */ + @SneakyThrows + public File makeSureExists(@NonNull final File file) { + if (!file.isFile()) { + val parent = file.getParentFile(); + if (!parent.isDirectory()) Files.createDirectories(parent.toPath()); + + Files.createFile(file.toPath()); + } + + return file; + } +} From a01304546f634c9960cfb65e4688092eecb2fbfb Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 26 Jan 2019 22:42:43 +0300 Subject: [PATCH 134/508] Implement PacketWrapperPacketAssociations --- .../misc/PacketWrapperPacketAssociations.java | 159 ++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java new file mode 100644 index 000000000..5a1ca40a1 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java @@ -0,0 +1,159 @@ +package ru.progrm_jarvis.minecraft.commons.nms.protocol.misc; + +import com.comphenix.packetwrapper.AbstractPacket; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketContainer; +import com.google.common.collect.BiMap; +import com.google.common.collect.ImmutableBiMap; +import lombok.*; +import lombok.experimental.FieldDefaults; +import lombok.experimental.UtilityClass; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import ru.progrm_jarvis.minecraft.commons.util.MapUtil; +import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.stream.Stream; + +import static java.lang.invoke.LambdaMetafactory.metafactory; + +/** + * Utility for linking ProtocolLib's packer-related objects. + */ +@UtilityClass +public class PacketWrapperPacketAssociations { + + private final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + + private final MethodType FUNCTION__METHOD_TYPE = MethodType.methodType(Function.class); + + private final String FUNCTION__APPLY__METHOD_NAME = "apply"; + + /** + * Immutable bi-directional map of packet types and their IDs + */ + @NonNull private final BiMap PACKET_TYPES = ImmutableBiMap.copyOf( + MapUtil.mapFiller(new HashMap()) + .fill(fieldPacketTypes(PacketType.Handshake.Client.class, "Handshake", PacketDirection.CLIENT)) + .fill(fieldPacketTypes(PacketType.Handshake.Server.class, "Handshake", PacketDirection.SERVER)) + .fill(fieldPacketTypes(PacketType.Login.Client.class, "Login", PacketDirection.CLIENT)) + .fill(fieldPacketTypes(PacketType.Login.Server.class, "Login", PacketDirection.SERVER)) + .fill(fieldPacketTypes(PacketType.Play.Client.class, "Play", PacketDirection.CLIENT)) + .fill(fieldPacketTypes(PacketType.Play.Server.class, "Play", PacketDirection.SERVER)) + .fill(fieldPacketTypes(PacketType.Status.Client.class, "Status", PacketDirection.CLIENT)) + .fill(fieldPacketTypes(PacketType.Status.Server.class, "Status", PacketDirection.SERVER)) + .map() + ); + + private final Map> PACKET_CREATORS + = new ConcurrentHashMap<>(); + + private Stream> fieldPacketTypes(@NonNull final Class packetType, + @NonNull final String group, + @NonNull final PacketDirection direction) { + return Arrays.stream(packetType.getDeclaredFields()) + .filter(field -> PacketType.class.isAssignableFrom(field.getType())) + //.filter(field -> field.isAnnotationPresent(Deprecated.class)) + .map((UncheckedFunction>) field -> ImmutablePair.of( + (PacketType) field.get(null), + PacketTypeId.of(group, direction, upperCaseNameToUpperCamelCase(field.getName())) + )); + } + + private String upperCaseNameToUpperCamelCase(@NonNull final String name) { + val split = StringUtils.split(name, '_'); + + val camelCase = new StringBuilder(); + for (val word : split) if (word.length() != 0) camelCase + .append(StringUtils.capitalize(StringUtils.lowerCase(word))); + else camelCase.append("_"); + + return camelCase.toString(); + } + + /** + * Creates new packet wrapper of a valid type from the specified packet container object. + * + * @param packet packet to wrap using packet wrapper + * @return created packet wrapper object for the packet + */ + public AbstractPacket createPacketWrapper(@NonNull final PacketContainer packet) { + return PACKET_CREATORS + .computeIfAbsent(packet.getType(), + (UncheckedFunction>) packetType -> { + val packetWrapperClass = Class + .forName(PACKET_TYPES.get(packetType).toPacketWrapperClassName()); + + val methodHandle = LOOKUP.unreflectConstructor( + packetWrapperClass.getDeclaredConstructor(PacketContainer.class) + ); + + val type = methodHandle.type(); + + //noinspection unchecked + return (Function) metafactory( + LOOKUP, FUNCTION__APPLY__METHOD_NAME, FUNCTION__METHOD_TYPE, + type.generic(), methodHandle, type + ).getTarget().invokeExact(); + }) + .apply(packet); + } + + /** + * Direction of the packet. + */ + @RequiredArgsConstructor + private enum PacketDirection { + + /** + * Packet going to client + */ + CLIENT("Client"), + + /** + * Packet going to the server + */ + SERVER("Server"); + + private final String name; + } + + @Value(staticConstructor = "of") + @FieldDefaults(level = AccessLevel.PROTECTED) + private static class PacketTypeId { + + private static final String PACKET_WRAPPER_PACKAGE = SystemPropertyUtil.getSystemProperty( + PacketTypeId.class.getCanonicalName().concat("-packet-wrapper-package"), + Function.identity(), "com.comphenix.packetwrapper" + ); + + /** + * Group of packets to which the one belongs + */ + @NonNull final String group; + + /** + * Direction of the packet + */ + @NonNull final PacketDirection direction; + + /** + * Name of the packet in the system + */ + @NonNull final String name; + + @NonNull private String toPacketWrapperClassName() { + return PACKET_WRAPPER_PACKAGE + ".Wrapper" + group + direction.name + name; + } + } +} From 16c94e0dbb479c1ca9e79dc910d2354b929f6f90 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 26 Jan 2019 22:43:34 +0300 Subject: [PATCH 135/508] Make PlayerContainer use wildcard for #getPlayers() --- .../mapimage/display/ProtocolBasedMapImageDisplay.java | 2 +- .../minecraft/commons/player/collection/PlayerContainer.java | 2 +- .../minecraft/commons/player/collection/PlayerContainers.java | 4 ++-- .../entity/AbstractPlayerContainingFakeEntity.java | 2 +- .../minecraft/fakeentitylib/entity/FakeEntity.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index e4ef31893..a7ce3dc91 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -115,7 +115,7 @@ public boolean containsPlayer(final Player player) { } @Override - public Collection getPlayers() { + public Collection getPlayers() { return playerMaps.keySet(); } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java index b13cdad78..d09d24572 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java @@ -79,5 +79,5 @@ default void removePlayers(final Collection players) { * * @return all players contained */ - Collection getPlayers(); + Collection getPlayers(); } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java index 4a9cadf98..42983151d 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java @@ -42,7 +42,7 @@ public boolean containsPlayer(final Player player) { } @Override - public Collection getPlayers() { + public Collection getPlayers() { return collection; } } @@ -69,7 +69,7 @@ public boolean containsPlayer(final Player player) { } @Override - public Collection getPlayers() { + public Collection getPlayers() { return map.keySet(); } } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java index 0c92bb0db..9a1975ba6 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java @@ -29,7 +29,7 @@ public AbstractPlayerContainingFakeEntity(final int viewDistance, final boolean } @Override - public Collection getPlayers() { + public Collection getPlayers() { return players.keySet(); } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java index 6b5ca9939..1477eafd6 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java @@ -36,7 +36,7 @@ public interface FakeEntity extends PlayerContainer { * * @return all players associated with this entity */ - Collection getPlayers(); + Collection getPlayers(); /** * Gets whether this fake entity is visible or not. From 8c70a61206deffeb57a4771ed2331a5e664c2883 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 26 Jan 2019 22:53:12 +0300 Subject: [PATCH 136/508] Add null-check to FileUtil --- .../ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java index aae1ecb9f..7db8ae94d 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java @@ -26,7 +26,7 @@ public class FileUtil { public File makeSureExists(@NonNull final File file) { if (!file.isFile()) { val parent = file.getParentFile(); - if (!parent.isDirectory()) Files.createDirectories(parent.toPath()); + if (parent != null && !parent.isDirectory()) Files.createDirectories(parent.toPath()); Files.createFile(file.toPath()); } From 63ee37c6180267a05aeb4060547239bbcd451014 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 27 Jan 2019 17:34:43 +0300 Subject: [PATCH 137/508] Global flag for PlayerContainer --- .../display/ProtocolBasedMapImageDisplay.java | 10 ++-- .../player/collection/PlayerContainer.java | 10 ++++ .../player/collection/PlayerContainers.java | 16 ++++--- .../registry/DefaultPlayerRegistry.java | 46 ++++++++++++++----- .../player/registry/PlayerRegistries.java | 10 ++-- .../player/registry/PlayerRegistry.java | 11 +++-- .../entity/ObservableFakeEntity.java | 8 ---- 7 files changed, 73 insertions(+), 38 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index a7ce3dc91..f8188f845 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -19,24 +19,26 @@ @RegistersSelfInPlayerRegistry @ToString @EqualsAndHashCode -@RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public class ProtocolBasedMapImageDisplay implements MapImageDisplay { @NonNull MapImage image; @NonNull Map playerMaps; + @Getter boolean global; public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull final Map playerMaps, - @NonNull final Plugin plugin) { + @NonNull final Plugin plugin, final boolean global) { this.image = image; this.playerMaps = playerMaps; + this.global = global; PlayerRegistries.registerInDefaultRegistry(plugin, this); image.subscribeOnUpdates(this::sendDeltaToAllPlayers); } - public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull final Plugin plugin) { - this(image, new HashMap<>(), plugin); + public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull final Plugin plugin, + final boolean global) { + this(image, new HashMap<>(), plugin, global); } @Override diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java index d09d24572..cefbc07ff 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java @@ -12,6 +12,16 @@ */ public interface PlayerContainer { + /** + * Gets whether or not this player container should be global. + * Global player container means that it considers all online players + * + * @return whether or not this fake entity is global + * + * @apiNote When global, all online players should be added on initialization of the object. + */ + boolean isGlobal(); + /** * Adds a player to this container. * diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java index 42983151d..3e5d0ecfa 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java @@ -12,19 +12,22 @@ @UtilityClass public class PlayerContainers { - public PlayerContainer wrap(@NonNull final Collection collectionOfPlayers) { - return new PlayerContainerCollectionWrapper(collectionOfPlayers); + public PlayerContainer wrap(@NonNull final Collection collectionOfPlayers, + final boolean global) { + return new PlayerContainerCollectionWrapper(collectionOfPlayers, global); } public PlayerContainer wrap(@NonNull final Map mapOfPlayers, - @NonNull final Function defaultValueSupplier) { - return new PlayerContainerMapWrapper<>(mapOfPlayers, defaultValueSupplier); + @NonNull final Function defaultValueSupplier, + final boolean global) { + return new PlayerContainerMapWrapper<>(mapOfPlayers, defaultValueSupplier, global); } @Value protected class PlayerContainerCollectionWrapper implements PlayerContainer { - @NonNull private final Collection collection; + @NonNull private Collection collection; + boolean global; @Override public void addPlayer(final Player player) { @@ -50,8 +53,9 @@ public Collection getPlayers() { @Value protected class PlayerContainerMapWrapper implements PlayerContainer { - @NonNull private final Map map; + @NonNull private Map map; @NonNull private Function defaultValueSupplier; + boolean global; @Override public void addPlayer(final Player player) { diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java index 91aa84aeb..8d6b50bff 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java @@ -1,15 +1,13 @@ package ru.progrm_jarvis.minecraft.commons.player.registry; import com.google.common.base.Preconditions; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NonNull; +import lombok.*; import lombok.experimental.FieldDefaults; -import lombok.val; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; @@ -25,29 +23,48 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +@ToString +@EqualsAndHashCode @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public class DefaultPlayerRegistry implements PlayerRegistry { @NonNull Plugin plugin; @NonNull @Getter Set players; + @Getter boolean global; @NonNull Set playerContainers = Collections.newSetFromMap(new WeakHashMap<>()); - private ReadWriteLock playerContainersLock = new ReentrantReadWriteLock(); - Lock playerContainersReadLock = playerContainersLock.readLock(); - Lock playerContainersWriteLock = playerContainersLock.writeLock(); + Lock playerContainersReadLock; + Lock playerContainersWriteLock; - public DefaultPlayerRegistry(@NonNull final Plugin plugin, @NonNull final Set playerSet) { + Listener listener; + + public DefaultPlayerRegistry(@NonNull final Plugin plugin, @NonNull final Set playerSet, + final boolean global) { Preconditions.checkArgument(playerSet.isEmpty(), "playerSet should be empty"); this.plugin = plugin; players = playerSet; + this.global = global; - Bukkit.getPluginManager().registerEvents(new Listener() { + { + ReadWriteLock playerContainersLock = new ReentrantReadWriteLock(); + playerContainersReadLock = playerContainersLock.readLock(); + playerContainersWriteLock = playerContainersLock.writeLock(); + } + Bukkit.getPluginManager().registerEvents(listener = global + ? new Listener() { @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public final void onPlayerJoin(final PlayerJoinEvent event) { addPlayer(event.getPlayer()); } + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public final void onPlayerQuit(final PlayerQuitEvent event) { + removePlayer(event.getPlayer()); + } + } + : new Listener() { + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public final void onPlayerQuit(final PlayerQuitEvent event) { removePlayer(event.getPlayer()); @@ -55,12 +72,12 @@ public final void onPlayerQuit(final PlayerQuitEvent event) { }, plugin); } - public DefaultPlayerRegistry(@NonNull final Plugin plugin, final boolean concurrent) { - this(plugin, concurrent ? new HashSet<>() : ConcurrentHashMap.newKeySet()); + public DefaultPlayerRegistry(@NonNull final Plugin plugin, final boolean concurrent, final boolean global) { + this(plugin, concurrent ? new HashSet<>() : ConcurrentHashMap.newKeySet(), global); } public DefaultPlayerRegistry(@NonNull final Plugin plugin) { - this(plugin, true); + this(plugin, true, true); } @Override @@ -119,4 +136,9 @@ public C unregister(final C playerContainer) { return playerContainer; } + + @Override + public void shutdown() { + HandlerList.unregisterAll(listener); + } } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java index 3d5743f3b..8eca5b3ad 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java @@ -27,13 +27,15 @@ public C registerInDefaultRegistry(@NonNull final Pl } public PlayerContainer registerInDefaultRegistry(@NonNull final Plugin plugin, - @NonNull final Collection collectionOfPlayers) { - return registerInDefaultRegistry(plugin, PlayerContainers.wrap(collectionOfPlayers)); + @NonNull final Collection collectionOfPlayers, + final boolean global) { + return registerInDefaultRegistry(plugin, PlayerContainers.wrap(collectionOfPlayers, global)); } public PlayerContainer registerInDefaultRegistry(@NonNull final Plugin plugin, @NonNull final Map mapOfPlayers, - @NonNull final Function defaultValueSupplier) { - return registerInDefaultRegistry(plugin, PlayerContainers.wrap(mapOfPlayers, defaultValueSupplier)); + @NonNull final Function defaultValueSupplier, + final boolean global) { + return registerInDefaultRegistry(plugin, PlayerContainers.wrap(mapOfPlayers, defaultValueSupplier, global)); } } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java index a95f634b7..a69864ef9 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java @@ -16,18 +16,21 @@ public interface PlayerRegistry extends PlayerContainer { C unregister(C playerContainer); - default PlayerContainer register(@NonNull final Collection playerCollection) { - val playerContainer = PlayerContainers.wrap(playerCollection); + default PlayerContainer register(@NonNull final Collection playerCollection, final boolean global) { + val playerContainer = PlayerContainers.wrap(playerCollection, global); register(playerContainer); return playerContainer; } default PlayerContainer register(@NonNull final Map playerCollection, - @NonNull final Function defaultValueSupplier) { - val playerContainer = PlayerContainers.wrap(playerCollection, defaultValueSupplier); + @NonNull final Function defaultValueSupplier, + final boolean global) { + val playerContainer = PlayerContainers.wrap(playerCollection, defaultValueSupplier, global); register(playerContainer); return playerContainer; } + + void shutdown(); } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java index 487053821..c5cdee392 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java @@ -7,14 +7,6 @@ public interface ObservableFakeEntity extends FakeEntity { - /** - * Gets whether or not this fake entity should be visible for all players online - * which means that observer will attempt to add players to it whenever they join game and remove them on leave. - * - * @return whether or not this fake entity is global - */ - boolean isGlobal(); - /** * Gets view distance for this fake entity. This may be not present in which case this returns {@code -1}. * From 3404606580ad2ee2023ca6bbe64066de200f9497 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 27 Jan 2019 17:42:12 +0300 Subject: [PATCH 138/508] Extend DefaultPlayerRegistry's global support --- .../player/registry/DefaultPlayerRegistry.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java index 8d6b50bff..96c0b6b85 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java @@ -55,7 +55,7 @@ public DefaultPlayerRegistry(@NonNull final Plugin plugin, @NonNull final Set { playerContainersReadLock.lock(); try { - for (val playerContainer : playerContainers) playerContainer.addPlayer(player); + for (val playerContainer : playerContainers) if (force || playerContainer.isGlobal()) playerContainer + .addPlayer(player); } finally { playerContainersReadLock.unlock(); } }); } + @Override + public void addPlayer(final Player player) { + addPlayer(player, true); + } + @Override public void removePlayer(final Player player) { players.remove(player); From 1d5c1ed247cf924e2611677d2aa36ee20507206a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 27 Jan 2019 17:54:44 +0300 Subject: [PATCH 139/508] Make PlayerContainer[T]Wrappers add players if being global --- .../player/collection/PlayerContainers.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java index 3e5d0ecfa..933ddc3c9 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java @@ -3,8 +3,10 @@ import lombok.NonNull; import lombok.Value; import lombok.experimental.UtilityClass; +import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.function.Function; @@ -29,6 +31,13 @@ protected class PlayerContainerCollectionWrapper implements PlayerContainer { @NonNull private Collection collection; boolean global; + public PlayerContainerCollectionWrapper(@NonNull final Collection collection, final boolean global) { + this.collection = collection; + this.global = global; + + if (global) addPlayers(new ArrayList<>(Bukkit.getOnlinePlayers())); + } + @Override public void addPlayer(final Player player) { collection.add(player); @@ -57,6 +66,16 @@ protected class PlayerContainerMapWrapper implements PlayerContainer { @NonNull private Function defaultValueSupplier; boolean global; + public PlayerContainerMapWrapper(@NonNull final Map map, + @NonNull final Function defaultValueSupplier, + final boolean global) { + this.map = map; + this.defaultValueSupplier = defaultValueSupplier; + this.global = global; + + if (global) addPlayers(new ArrayList<>(Bukkit.getOnlinePlayers())); + } + @Override public void addPlayer(final Player player) { map.put(player, defaultValueSupplier.apply(player)); From ed870f7b2986b1b165aa6dca40086e778a275ec7 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 1 Feb 2019 16:58:02 +0300 Subject: [PATCH 140/508] Add Weak Lazy types --- .../commons/util/function/lazy/Lazies.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java index ed610f896..b7f9de2bf 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java @@ -6,6 +6,9 @@ import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedSupplier; import javax.annotation.Nullable; +import java.lang.ref.WeakReference; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Supplier; @UtilityClass @@ -19,6 +22,14 @@ public Lazy concurrentLazy(@NonNull final UncheckedSupplier valueSuppl return new ConcurrentLazy<>(valueSupplier); } + public Lazy weakLazy(@NonNull final UncheckedSupplier valueSupplier) { + return new WeakLazy<>(valueSupplier); + } + + public Lazy concurrentWeakLazy(@NonNull final UncheckedSupplier valueSupplier) { + return new ConcurrentWeakLazy<>(valueSupplier); + } + @ToString @EqualsAndHashCode @FieldDefaults(level = AccessLevel.PRIVATE) @@ -84,4 +95,76 @@ public T get() { return value; } } + + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + @FieldDefaults(level = AccessLevel.PRIVATE) + private static final class WeakLazy<@NonNull T> implements Lazy { + + @NonNull final transient Supplier valueSupplier; + @Nullable transient WeakReference value; + + @Override + public boolean isInitialized() { + return value != null && value.get() != null; + } + + @Override + public T get() { + T value; + if (this.value == null || (value = this.value.get()) == null) this.value + = new WeakReference<>(value = valueSupplier.get()); + + return value; + } + } + + @ToString + @EqualsAndHashCode + @FieldDefaults(level = AccessLevel.PRIVATE) + private static final class ConcurrentWeakLazy<@NonNull T> implements Lazy { + + @NonNull final transient Supplier valueSupplier; + @Nullable transient WeakReference value; + @NonNull transient final Lock readLock, writeLock; + + private ConcurrentWeakLazy(@NonNull final Supplier valueSupplier) { + this.valueSupplier = valueSupplier; + + val lock = new ReentrantReadWriteLock(); + readLock = lock.readLock(); + writeLock = lock.writeLock(); + } + + @Override + public boolean isInitialized() { + readLock.lock(); + try { + return value != null && value.get() != null; + } finally { + readLock.unlock(); + } + } + + @Override + public T get() { + readLock.lock(); + try { + T value; + if (this.value == null || (value = this.value.get()) == null) { + writeLock.lock(); + try { + this.value = new WeakReference<>(value = valueSupplier.get()); + } finally { + writeLock.unlock(); + } + } + + return value; + } finally { + readLock.unlock(); + } + } + } } From 9b8cd7642a0b42db1359c896f47693cac43fabdb Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 5 Feb 2019 16:18:11 +0300 Subject: [PATCH 141/508] Add ImageUtil and ColorUtil --- .../commons/mapimage/MapImageColor.java | 163 ++++--- .../mapimage/MapImageMinecraftColors.java | 414 +++++++++--------- .../commons/util/image/ColorUtil.java | 134 ++++++ .../commons/util/image/ImageUtil.java | 82 ++++ 4 files changed, 531 insertions(+), 262 deletions(-) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java index df48b6c6b..81d864b12 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java @@ -10,6 +10,7 @@ import org.bukkit.map.MapPalette; import ru.progrm_jarvis.minecraft.commons.util.BitwiseUtil; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; +import ru.progrm_jarvis.minecraft.commons.util.image.ColorUtil; import javax.annotation.Nonnull; import java.awt.*; @@ -81,54 +82,24 @@ private MapImageColor(final byte red, final byte green, final byte blue) { this.green = green; this.blue = blue; - this.rgb = asRgb(red, green, blue); - } - - /////////////////////////////////////////////////////////////////////////// - // Conversions - /////////////////////////////////////////////////////////////////////////// - - /** - * Transforms 3 color channels - * - * @param red red color channel (between {@code 0} and {@code 255}) - * @param green green color channel (between {@code 0} and {@code 255}) - * @param blue blue color channel (between {@code 0} and {@code 255}) - * @return color as a single RGB {@link int} - */ - public static int asRgb(final int red, final int green, final int blue) { - return (red << 16) | (green << 8) | blue; - } - - /** - * Gets the red color channel value for the specified RGB {@link int}. - * - * @param rgb RGB encoded as a single integer - * @return red color channel value - */ - public static byte red(final int rgb) { - return (byte) ((rgb >> 16) & 0xFF); + this.rgb = ColorUtil.toArgb(red, green, blue); } /** - * Gets the green color channel value for the specified RGB {@link int}. + * Constructs a new map image color instance based on 3 base colors. + * This is an internal constructor as, normally, there should only exist one cached instance of any used color. * - * @param rgb RGB encoded as a single integer - * @return green color channel value + * @param red red color channel + * @param green green color channel + * @param blue blue color channel */ - public static byte green(final int rgb) { - return (byte) ((rgb >> 8) & 0xFF); + private MapImageColor(final int red, final int green, final int blue) { + this((byte) red, (byte) green, (byte) blue); } - /** - * Gets the blue color channel value for the specified RGB {@link int}. - * - * @param rgb RGB encoded as a single integer - * @return blue color channel value - */ - public static byte blue(final int rgb) { - return (byte) (rgb & 0xFF); - } + /////////////////////////////////////////////////////////////////////////// + // Conversions + /////////////////////////////////////////////////////////////////////////// /** * Creates new map image color from specified {@link java.awt} {@link Color}. @@ -148,7 +119,7 @@ public static byte blue(final int rgb) { */ @SneakyThrows @Nonnull public static MapImageColor of(final int rgb) { - return COLOR_CACHE.get(rgb, () -> new MapImageColor(red(rgb), green(rgb), blue(rgb))); + return COLOR_CACHE.get(rgb, () -> new MapImageColor(ColorUtil.red(rgb), ColorUtil.green(rgb), ColorUtil.blue(rgb))); } /** @@ -161,7 +132,7 @@ public static byte blue(final int rgb) { */ @SneakyThrows @Nonnull public static MapImageColor of(final byte red, final byte green, final byte blue) { - return COLOR_CACHE.get(asRgb(red, green, blue), () -> new MapImageColor(red, green, blue)); + return COLOR_CACHE.get(ColorUtil.toArgb(red, green, blue), () -> new MapImageColor(red, green, blue)); } /** @@ -221,13 +192,27 @@ public static byte getClosestColorCode(final int rgb) { // Distance squared (as if colors were 3 axises) /////////////////////////////////////////////////////////////////////////// + public static int getDistanceSquared(final int red1, final int green1, final int blue1, + final int red2, final int green2, final int blue2) { + final int dRed = red2 - red1, dGreen = green2 - green1, dBlue = blue2 - blue1; + + return dRed * dRed + dBlue * dBlue + dGreen * dGreen; + } + public static int getDistanceSquared(final byte red1, final byte green1, final byte blue1, final byte red2, final byte green2, final byte blue2) { val dRed = BitwiseUtil.byteToUnsignedInt(red2) - BitwiseUtil.byteToUnsignedInt(red1); val dGreen = BitwiseUtil.byteToUnsignedInt(green2) - BitwiseUtil.byteToUnsignedInt(green1); val dBlue = BitwiseUtil.byteToUnsignedInt(blue2) - BitwiseUtil.byteToUnsignedInt(blue1); - return dRed * dRed + dBlue * dBlue + dGreen * dGreen; + return getDistanceSquared( + BitwiseUtil.byteToUnsignedInt(red1), + BitwiseUtil.byteToUnsignedInt(green1), + BitwiseUtil.byteToUnsignedInt(blue1), + BitwiseUtil.byteToUnsignedInt(red2), + BitwiseUtil.byteToUnsignedInt(green2), + BitwiseUtil.byteToUnsignedInt(blue2) + ); } public static int getDistanceSquared(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { @@ -235,30 +220,51 @@ public static int getDistanceSquared(@NonNull final MapImageColor color1, @NonNu } public static int getDistanceSquared(final int rgb1, final int rgb2) { - return getDistanceSquared(red(rgb1), green(rgb1), blue(rgb1), red(rgb2), green(rgb2), blue(rgb2)); + return getDistanceSquared( + ColorUtil.red(rgb1), ColorUtil.green(rgb1), ColorUtil.blue(rgb1), + ColorUtil.red(rgb2), ColorUtil.green(rgb2), ColorUtil.blue(rgb2) + ); } public int getDistanceSquared(final byte red, final byte green, final byte blue) { return getDistanceSquared(this.red, this.green, this.blue, red, green, blue); } + public int getDistanceSquared(final int red, final int green, final int blue) { + return getDistanceSquared( + BitwiseUtil.byteToUnsignedInt(this.red), + BitwiseUtil.byteToUnsignedInt(this.green), + BitwiseUtil.byteToUnsignedInt(this.blue), + red, green, blue); + } + public int getDistanceSquared(@NonNull final MapImageColor other) { return getDistanceSquared(red, green, blue, other.red, other.green, other.blue); } public int getDistanceSquared(final int rgb) { - return getDistanceSquared(red(rgb), green(rgb), blue(rgb)); + return getDistanceSquared(ColorUtil.red(rgb), ColorUtil.green(rgb), ColorUtil.blue(rgb)); } /////////////////////////////////////////////////////////////////////////// // Sum of channels /////////////////////////////////////////////////////////////////////////// + public static int getSum(final int red1, final int green1, final int blue1, + final int red2, final int green2, final int blue2) { + return abs(red2 - red1) + abs(green2 - green1) + abs(blue2 - blue1); + } + public static int getSum(final byte red1, final byte green1, final byte blue1, final byte red2, final byte green2, final byte blue2) { - return abs(BitwiseUtil.byteToUnsignedInt(red2) - BitwiseUtil.byteToUnsignedInt(red1)) - + abs(BitwiseUtil.byteToUnsignedInt(green2) - BitwiseUtil.byteToUnsignedInt(green1)) - + abs(BitwiseUtil.byteToUnsignedInt(blue2) - BitwiseUtil.byteToUnsignedInt(blue1)); + return getSum( + BitwiseUtil.byteToUnsignedInt(red1), + BitwiseUtil.byteToUnsignedInt(green1), + BitwiseUtil.byteToUnsignedInt(blue1), + BitwiseUtil.byteToUnsignedInt(red2), + BitwiseUtil.byteToUnsignedInt(green2), + BitwiseUtil.byteToUnsignedInt(blue2) + ); } public static int getSum(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { @@ -266,25 +272,42 @@ public static int getSum(@NonNull final MapImageColor color1, @NonNull final Map } public static int getSum(final int rgb1, final int rgb2) { - return getSum(red(rgb1), green(rgb1), blue(rgb1), red(rgb2), green(rgb2), blue(rgb2)); + return getSum( + ColorUtil.red(rgb1), ColorUtil.green(rgb1), ColorUtil.blue(rgb1), + ColorUtil.red(rgb2), ColorUtil.green(rgb2), ColorUtil.blue(rgb2) + ); } public int getSum(final byte red, final byte green, final byte blue) { return getSum(this.red, this.green, this.blue, red, green, blue); } + public int getSum(final int red, final int green, final int blue) { + return getSum( + BitwiseUtil.byteToUnsignedInt(this.red), + BitwiseUtil.byteToUnsignedInt(this.green), + BitwiseUtil.byteToUnsignedInt(this.blue), + red, green, blue + ); + } + public int getSum(@NonNull final MapImageColor other) { return getSum(red, green, blue, other.red, other.green, other.blue); } public int getSum(final int rgb) { - return getSum(red(rgb), green(rgb), blue(rgb)); + return getSum(ColorUtil.red(rgb), ColorUtil.green(rgb), ColorUtil.blue(rgb)); } /////////////////////////////////////////////////////////////////////////// // Multiplication product of channels /////////////////////////////////////////////////////////////////////////// + public static int getMultiplicationProduct(final int red1, final int green1, final int blue1, + final int red2, final int green2, final int blue2) { + return (red2 - red1) * (green2 - green1) * (blue2 - blue1); + } + public static int getMultiplicationProduct(final byte red1, final byte green1, final byte blue1, final byte red2, final byte green2, final byte blue2) { return (BitwiseUtil.byteToUnsignedInt(red2) - BitwiseUtil.byteToUnsignedInt(red1)) @@ -297,7 +320,19 @@ public static int getMultiplicationProduct(@NonNull final MapImageColor color1, } public static int getMultiplicationProduct(final int rgb1, final int rgb2) { - return getMultiplicationProduct(red(rgb1), green(rgb1), blue(rgb1), red(rgb2), green(rgb2), blue(rgb2)); + return getMultiplicationProduct( + ColorUtil.red(rgb1), ColorUtil.green(rgb1), ColorUtil.blue(rgb1), + ColorUtil.red(rgb2), ColorUtil.green(rgb2), ColorUtil.blue(rgb2) + ); + } + + public int getMultiplicationProduct(final int red, final int green, final int blue) { + return getMultiplicationProduct( + BitwiseUtil.byteToUnsignedInt(this.red), + BitwiseUtil.byteToUnsignedInt(this.green), + BitwiseUtil.byteToUnsignedInt(this.blue), + red, green, blue + ); } public int getMultiplicationProduct(final byte red, final byte green, final byte blue) { @@ -309,7 +344,7 @@ public int getMultiplicationProduct(@NonNull final MapImageColor other) { } public int getMultiplicationProduct(final int rgb) { - return getMultiplicationProduct(red(rgb), green(rgb), blue(rgb)); + return getMultiplicationProduct(ColorUtil.red(rgb), ColorUtil.green(rgb), ColorUtil.blue(rgb)); } /////////////////////////////////////////////////////////////////////////// @@ -330,12 +365,30 @@ public static int getNaturalDistanceSquared(final byte red1, final byte green1, return (int) (dRed * dRed + dBlue * dBlue + dGreen * dGreen); } + public static int getNaturalDistanceSquared(final int red1, final int green1, final int blue1, + final int red2, final int green2, final int blue2) { + final double dRed = (red2 - red1) * 0.3, dGreen = (green2 - green1) * 0.59, dBlue = (blue2 - blue1) * 0.11; + + return (int) (dRed * dRed + dBlue * dBlue + dGreen * dGreen); + } + public static int getNaturalDistanceSquared(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { return getNaturalDistanceSquared(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); } public static int getNaturalDistanceSquared(final int rgb1, final int rgb2) { - return getNaturalDistanceSquared(red(rgb1), green(rgb1), blue(rgb1), red(rgb2), green(rgb2), blue(rgb2)); + return getNaturalDistanceSquared( + ColorUtil.red(rgb1), ColorUtil.green(rgb1), ColorUtil.blue(rgb1), + ColorUtil.red(rgb2), ColorUtil.green(rgb2), ColorUtil.blue(rgb2) + ); + } + + public int getNaturalDistanceSquared(final int red, final int green, final int blue) { + return getNaturalDistanceSquared( + BitwiseUtil.byteToUnsignedInt(this.red), + BitwiseUtil.byteToUnsignedInt(this.green), + BitwiseUtil.byteToUnsignedInt(this.blue), + red, green, blue); } public int getNaturalDistanceSquared(final byte red, final byte green, final byte blue) { @@ -347,6 +400,6 @@ public int getNaturalDistanceSquared(@NonNull final MapImageColor other) { } public int getNaturalDistanceSquared(final int rgb) { - return getNaturalDistanceSquared(red(rgb), green(rgb), blue(rgb)); + return getNaturalDistanceSquared(ColorUtil.red(rgb), ColorUtil.green(rgb), ColorUtil.blue(rgb)); } } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java index a07e850b8..052506e92 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java @@ -5,9 +5,9 @@ import gnu.trove.map.hash.TIntByteHashMap; import lombok.experimental.UtilityClass; import lombok.val; +import ru.progrm_jarvis.minecraft.commons.util.image.ColorUtil; import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImageColor.NO_COLOR_CODE; -import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImageColor.asRgb; /** * Utilities related to Minecraft color codes for a map. @@ -34,210 +34,210 @@ public class MapImageMinecraftColors { static { // val minecraftColors = new TIntByteHashMap(NO_COLOR_CODE); - minecraftColors.put(asRgb((byte) 89, (byte) 125, (byte) 39), (byte) 4); - minecraftColors.put(asRgb((byte) 109, (byte) 153, (byte) 48), (byte) 5); - minecraftColors.put(asRgb((byte) 127, (byte) 178, (byte) 56), (byte) 6); - minecraftColors.put(asRgb((byte) 67, (byte) 94, (byte) 29), (byte) 7); - minecraftColors.put(asRgb((byte) 174, (byte) 164, (byte) 115), (byte) 8); - minecraftColors.put(asRgb((byte) 213, (byte) 201, (byte) 140), (byte) 9); - minecraftColors.put(asRgb((byte) 247, (byte) 233, (byte) 163), (byte) 10); - minecraftColors.put(asRgb((byte) 130, (byte) 123, (byte) 86), (byte) 11); - minecraftColors.put(asRgb((byte) 140, (byte) 140, (byte) 140), (byte) 12); - minecraftColors.put(asRgb((byte) 171, (byte) 171, (byte) 171), (byte) 13); - minecraftColors.put(asRgb((byte) 199, (byte) 199, (byte) 199), (byte) 14); - minecraftColors.put(asRgb((byte) 105, (byte) 105, (byte) 105), (byte) 15); - minecraftColors.put(asRgb((byte) 180, (byte) 0, (byte) 0), (byte) 16); - minecraftColors.put(asRgb((byte) 220, (byte) 0, (byte) 0), (byte) 17); - minecraftColors.put(asRgb((byte) 255, (byte) 0, (byte) 0), (byte) 18); - minecraftColors.put(asRgb((byte) 135, (byte) 0, (byte) 0), (byte) 19); - minecraftColors.put(asRgb((byte) 112, (byte) 112, (byte) 180), (byte) 20); - minecraftColors.put(asRgb((byte) 138, (byte) 138, (byte) 220), (byte) 21); - minecraftColors.put(asRgb((byte) 160, (byte) 160, (byte) 255), (byte) 22); - minecraftColors.put(asRgb((byte) 84, (byte) 84, (byte) 135), (byte) 23); - minecraftColors.put(asRgb((byte) 117, (byte) 117, (byte) 117), (byte) 24); - minecraftColors.put(asRgb((byte) 144, (byte) 144, (byte) 144), (byte) 25); - minecraftColors.put(asRgb((byte) 167, (byte) 167, (byte) 167), (byte) 26); - minecraftColors.put(asRgb((byte) 88, (byte) 88, (byte) 88), (byte) 27); - minecraftColors.put(asRgb((byte) 0, (byte) 87, (byte) 0), (byte) 28); - minecraftColors.put(asRgb((byte) 0, (byte) 106, (byte) 0), (byte) 29); - minecraftColors.put(asRgb((byte) 0, (byte) 124, (byte) 0), (byte) 30); - minecraftColors.put(asRgb((byte) 0, (byte) 65, (byte) 0), (byte) 31); - minecraftColors.put(asRgb((byte) 180, (byte) 180, (byte) 180), (byte) 32); - minecraftColors.put(asRgb((byte) 220, (byte) 220, (byte) 220), (byte) 33); - minecraftColors.put(asRgb((byte) 255, (byte) 255, (byte) 255), (byte) 34); - minecraftColors.put(asRgb((byte) 135, (byte) 135, (byte) 135), (byte) 35); - minecraftColors.put(asRgb((byte) 115, (byte) 118, (byte) 129), (byte) 36); - minecraftColors.put(asRgb((byte) 141, (byte) 144, (byte) 158), (byte) 37); - minecraftColors.put(asRgb((byte) 164, (byte) 168, (byte) 184), (byte) 38); - minecraftColors.put(asRgb((byte) 86, (byte) 88, (byte) 97), (byte) 39); - minecraftColors.put(asRgb((byte) 106, (byte) 76, (byte) 54), (byte) 40); - minecraftColors.put(asRgb((byte) 130, (byte) 94, (byte) 66), (byte) 41); - minecraftColors.put(asRgb((byte) 151, (byte) 109, (byte) 77), (byte) 42); - minecraftColors.put(asRgb((byte) 79, (byte) 57, (byte) 40), (byte) 43); - minecraftColors.put(asRgb((byte) 79, (byte) 79, (byte) 79), (byte) 44); - minecraftColors.put(asRgb((byte) 96, (byte) 96, (byte) 96), (byte) 45); - minecraftColors.put(asRgb((byte) 112, (byte) 112, (byte) 112), (byte) 46); - minecraftColors.put(asRgb((byte) 59, (byte) 59, (byte) 59), (byte) 47); - minecraftColors.put(asRgb((byte) 45, (byte) 45, (byte) 180), (byte) 48); - minecraftColors.put(asRgb((byte) 55, (byte) 55, (byte) 220), (byte) 49); - minecraftColors.put(asRgb((byte) 64, (byte) 64, (byte) 255), (byte) 50); - minecraftColors.put(asRgb((byte) 33, (byte) 33, (byte) 135), (byte) 51); - minecraftColors.put(asRgb((byte) 100, (byte) 84, (byte) 50), (byte) 52); - minecraftColors.put(asRgb((byte) 123, (byte) 102, (byte) 62), (byte) 53); - minecraftColors.put(asRgb((byte) 143, (byte) 119, (byte) 72), (byte) 54); - minecraftColors.put(asRgb((byte) 75, (byte) 63, (byte) 38), (byte) 55); - minecraftColors.put(asRgb((byte) 180, (byte) 177, (byte) 172), (byte) 56); - minecraftColors.put(asRgb((byte) 220, (byte) 217, (byte) 211), (byte) 57); - minecraftColors.put(asRgb((byte) 255, (byte) 252, (byte) 245), (byte) 58); - minecraftColors.put(asRgb((byte) 135, (byte) 133, (byte) 129), (byte) 59); - minecraftColors.put(asRgb((byte) 152, (byte) 89, (byte) 36), (byte) 60); - minecraftColors.put(asRgb((byte) 186, (byte) 109, (byte) 44), (byte) 61); - minecraftColors.put(asRgb((byte) 216, (byte) 127, (byte) 51), (byte) 62); - minecraftColors.put(asRgb((byte) 114, (byte) 67, (byte) 27), (byte) 63); - minecraftColors.put(asRgb((byte) 125, (byte) 53, (byte) 152), (byte) 64); - minecraftColors.put(asRgb((byte) 153, (byte) 65, (byte) 186), (byte) 65); - minecraftColors.put(asRgb((byte) 178, (byte) 76, (byte) 216), (byte) 66); - minecraftColors.put(asRgb((byte) 94, (byte) 40, (byte) 114), (byte) 67); - minecraftColors.put(asRgb((byte) 72, (byte) 108, (byte) 152), (byte) 68); - minecraftColors.put(asRgb((byte) 88, (byte) 132, (byte) 186), (byte) 69); - minecraftColors.put(asRgb((byte) 102, (byte) 153, (byte) 216), (byte) 70); - minecraftColors.put(asRgb((byte) 54, (byte) 81, (byte) 114), (byte) 71); - minecraftColors.put(asRgb((byte) 161, (byte) 161, (byte) 36), (byte) 72); - minecraftColors.put(asRgb((byte) 197, (byte) 197, (byte) 44), (byte) 73); - minecraftColors.put(asRgb((byte) 229, (byte) 229, (byte) 51), (byte) 74); - minecraftColors.put(asRgb((byte) 121, (byte) 121, (byte) 27), (byte) 75); - minecraftColors.put(asRgb((byte) 89, (byte) 144, (byte) 17), (byte) 76); - minecraftColors.put(asRgb((byte) 109, (byte) 176, (byte) 21), (byte) 77); - minecraftColors.put(asRgb((byte) 127, (byte) 204, (byte) 25), (byte) 78); - minecraftColors.put(asRgb((byte) 67, (byte) 108, (byte) 13), (byte) 79); - minecraftColors.put(asRgb((byte) 170, (byte) 89, (byte) 116), (byte) 80); - minecraftColors.put(asRgb((byte) 208, (byte) 109, (byte) 142), (byte) 81); - minecraftColors.put(asRgb((byte) 242, (byte) 127, (byte) 165), (byte) 82); - minecraftColors.put(asRgb((byte) 128, (byte) 67, (byte) 87), (byte) 83); - minecraftColors.put(asRgb((byte) 53, (byte) 53, (byte) 53), (byte) 84); - minecraftColors.put(asRgb((byte) 65, (byte) 65, (byte) 65), (byte) 85); - minecraftColors.put(asRgb((byte) 76, (byte) 76, (byte) 76), (byte) 86); - minecraftColors.put(asRgb((byte) 40, (byte) 40, (byte) 40), (byte) 87); - minecraftColors.put(asRgb((byte) 108, (byte) 108, (byte) 108), (byte) 88); - minecraftColors.put(asRgb((byte) 132, (byte) 132, (byte) 132), (byte) 89); - minecraftColors.put(asRgb((byte) 153, (byte) 153, (byte) 153), (byte) 90); - minecraftColors.put(asRgb((byte) 81, (byte) 81, (byte) 81), (byte) 91); - minecraftColors.put(asRgb((byte) 53, (byte) 89, (byte) 108), (byte) 92); - minecraftColors.put(asRgb((byte) 65, (byte) 109, (byte) 132), (byte) 93); - minecraftColors.put(asRgb((byte) 76, (byte) 127, (byte) 153), (byte) 94); - minecraftColors.put(asRgb((byte) 40, (byte) 67, (byte) 81), (byte) 95); - minecraftColors.put(asRgb((byte) 89, (byte) 44, (byte) 125), (byte) 96); - minecraftColors.put(asRgb((byte) 109, (byte) 54, (byte) 153), (byte) 97); - minecraftColors.put(asRgb((byte) 127, (byte) 63, (byte) 178), (byte) 98); - minecraftColors.put(asRgb((byte) 67, (byte) 33, (byte) 94), (byte) 99); - minecraftColors.put(asRgb((byte) 36, (byte) 53, (byte) 125), (byte) 100); - minecraftColors.put(asRgb((byte) 44, (byte) 65, (byte) 153), (byte) 101); - minecraftColors.put(asRgb((byte) 51, (byte) 76, (byte) 178), (byte) 102); - minecraftColors.put(asRgb((byte) 27, (byte) 40, (byte) 94), (byte) 103); - minecraftColors.put(asRgb((byte) 72, (byte) 53, (byte) 36), (byte) 104); - minecraftColors.put(asRgb((byte) 88, (byte) 65, (byte) 44), (byte) 105); - minecraftColors.put(asRgb((byte) 102, (byte) 76, (byte) 51), (byte) 106); - minecraftColors.put(asRgb((byte) 54, (byte) 40, (byte) 27), (byte) 107); - minecraftColors.put(asRgb((byte) 72, (byte) 89, (byte) 36), (byte) 108); - minecraftColors.put(asRgb((byte) 88, (byte) 109, (byte) 44), (byte) 109); - minecraftColors.put(asRgb((byte) 102, (byte) 127, (byte) 51), (byte) 110); - minecraftColors.put(asRgb((byte) 54, (byte) 67, (byte) 27), (byte) 111); - minecraftColors.put(asRgb((byte) 108, (byte) 36, (byte) 36), (byte) 112); - minecraftColors.put(asRgb((byte) 132, (byte) 44, (byte) 44), (byte) 113); - minecraftColors.put(asRgb((byte) 153, (byte) 51, (byte) 51), (byte) 114); - minecraftColors.put(asRgb((byte) 81, (byte) 27, (byte) 27), (byte) 115); - minecraftColors.put(asRgb((byte) 17, (byte) 17, (byte) 17), (byte) 116); - minecraftColors.put(asRgb((byte) 21, (byte) 21, (byte) 21), (byte) 117); - minecraftColors.put(asRgb((byte) 25, (byte) 25, (byte) 25), (byte) 118); - minecraftColors.put(asRgb((byte) 13, (byte) 13, (byte) 13), (byte) 119); - minecraftColors.put(asRgb((byte) 176, (byte) 168, (byte) 54), (byte) 120); - minecraftColors.put(asRgb((byte) 215, (byte) 205, (byte) 66), (byte) 121); - minecraftColors.put(asRgb((byte) 250, (byte) 238, (byte) 77), (byte) 122); - minecraftColors.put(asRgb((byte) 132, (byte) 126, (byte) 40), (byte) 123); - minecraftColors.put(asRgb((byte) 64, (byte) 154, (byte) 150), (byte) 124); - minecraftColors.put(asRgb((byte) 79, (byte) 188, (byte) 183), (byte) 125); - minecraftColors.put(asRgb((byte) 92, (byte) 219, (byte) 213), (byte) 126); - minecraftColors.put(asRgb((byte) 48, (byte) 115, (byte) 112), (byte) 127); - minecraftColors.put(asRgb((byte) 52, (byte) 90, (byte) 180), (byte) 128); - minecraftColors.put(asRgb((byte) 63, (byte) 110, (byte) 220), (byte) 129); - minecraftColors.put(asRgb((byte) 74, (byte) 128, (byte) 255), (byte) 130); - minecraftColors.put(asRgb((byte) 39, (byte) 67, (byte) 135), (byte) 131); - minecraftColors.put(asRgb((byte) 0, (byte) 153, (byte) 40), (byte) 132); - minecraftColors.put(asRgb((byte) 0, (byte) 187, (byte) 50), (byte) 133); - minecraftColors.put(asRgb((byte) 0, (byte) 217, (byte) 58), (byte) 134); - minecraftColors.put(asRgb((byte) 0, (byte) 114, (byte) 30), (byte) 135); - minecraftColors.put(asRgb((byte) 91, (byte) 60, (byte) 34), (byte) 136); - minecraftColors.put(asRgb((byte) 111, (byte) 74, (byte) 42), (byte) 137); - minecraftColors.put(asRgb((byte) 129, (byte) 86, (byte) 49), (byte) 138); - minecraftColors.put(asRgb((byte) 68, (byte) 45, (byte) 25), (byte) 139); - minecraftColors.put(asRgb((byte) 79, (byte) 1, (byte) 0), (byte) 140); - minecraftColors.put(asRgb((byte) 96, (byte) 1, (byte) 0), (byte) 141); - minecraftColors.put(asRgb((byte) 112, (byte) 2, (byte) 0), (byte) 142); - minecraftColors.put(asRgb((byte) 59, (byte) 1, (byte) 0), (byte) 143); - minecraftColors.put(asRgb((byte) 147, (byte) 124, (byte) 113), (byte) 144); - minecraftColors.put(asRgb((byte) 180, (byte) 152, (byte) 138), (byte) 145); - minecraftColors.put(asRgb((byte) 209, (byte) 177, (byte) 161), (byte) 146); - minecraftColors.put(asRgb((byte) 110, (byte) 93, (byte) 85), (byte) 147); - minecraftColors.put(asRgb((byte) 112, (byte) 57, (byte) 25), (byte) 148); - minecraftColors.put(asRgb((byte) 137, (byte) 70, (byte) 31), (byte) 149); - minecraftColors.put(asRgb((byte) 159, (byte) 82, (byte) 36), (byte) 150); - minecraftColors.put(asRgb((byte) 84, (byte) 43, (byte) 19), (byte) 151); - minecraftColors.put(asRgb((byte) 105, (byte) 61, (byte) 76), (byte) 152); - minecraftColors.put(asRgb((byte) 128, (byte) 75, (byte) 93), (byte) 153); - minecraftColors.put(asRgb((byte) 149, (byte) 87, (byte) 108), (byte) 154); - minecraftColors.put(asRgb((byte) 78, (byte) 46, (byte) 57), (byte) 155); - minecraftColors.put(asRgb((byte) 79, (byte) 76, (byte) 97), (byte) 156); - minecraftColors.put(asRgb((byte) 96, (byte) 93, (byte) 119), (byte) 157); - minecraftColors.put(asRgb((byte) 112, (byte) 108, (byte) 138), (byte) 158); - minecraftColors.put(asRgb((byte) 59, (byte) 57, (byte) 73), (byte) 159); - minecraftColors.put(asRgb((byte) 131, (byte) 93, (byte) 25), (byte) 160); - minecraftColors.put(asRgb((byte) 160, (byte) 114, (byte) 31), (byte) 161); - minecraftColors.put(asRgb((byte) 186, (byte) 133, (byte) 36), (byte) 162); - minecraftColors.put(asRgb((byte) 98, (byte) 70, (byte) 19), (byte) 163); - minecraftColors.put(asRgb((byte) 72, (byte) 82, (byte) 37), (byte) 164); - minecraftColors.put(asRgb((byte) 88, (byte) 100, (byte) 45), (byte) 165); - minecraftColors.put(asRgb((byte) 103, (byte) 117, (byte) 53), (byte) 166); - minecraftColors.put(asRgb((byte) 54, (byte) 61, (byte) 28), (byte) 167); - minecraftColors.put(asRgb((byte) 112, (byte) 54, (byte) 55), (byte) 168); - minecraftColors.put(asRgb((byte) 138, (byte) 66, (byte) 67), (byte) 169); - minecraftColors.put(asRgb((byte) 160, (byte) 77, (byte) 78), (byte) 170); - minecraftColors.put(asRgb((byte) 84, (byte) 40, (byte) 41), (byte) 171); - minecraftColors.put(asRgb((byte) 40, (byte) 28, (byte) 24), (byte) 172); - minecraftColors.put(asRgb((byte) 49, (byte) 35, (byte) 30), (byte) 173); - minecraftColors.put(asRgb((byte) 57, (byte) 41, (byte) 35), (byte) 174); - minecraftColors.put(asRgb((byte) 30, (byte) 21, (byte) 18), (byte) 175); - minecraftColors.put(asRgb((byte) 95, (byte) 75, (byte) 69), (byte) 176); - minecraftColors.put(asRgb((byte) 116, (byte) 92, (byte) 84), (byte) 177); - minecraftColors.put(asRgb((byte) 135, (byte) 107, (byte) 98), (byte) 178); - minecraftColors.put(asRgb((byte) 71, (byte) 56, (byte) 51), (byte) 179); - minecraftColors.put(asRgb((byte) 61, (byte) 64, (byte) 64), (byte) 180); - minecraftColors.put(asRgb((byte) 75, (byte) 79, (byte) 79), (byte) 181); - minecraftColors.put(asRgb((byte) 87, (byte) 92, (byte) 92), (byte) 182); - minecraftColors.put(asRgb((byte) 46, (byte) 48, (byte) 48), (byte) 183); - minecraftColors.put(asRgb((byte) 86, (byte) 51, (byte) 62), (byte) 184); - minecraftColors.put(asRgb((byte) 105, (byte) 62, (byte) 75), (byte) 185); - minecraftColors.put(asRgb((byte) 122, (byte) 73, (byte) 88), (byte) 186); - minecraftColors.put(asRgb((byte) 64, (byte) 38, (byte) 46), (byte) 187); - minecraftColors.put(asRgb((byte) 53, (byte) 43, (byte) 64), (byte) 188); - minecraftColors.put(asRgb((byte) 65, (byte) 53, (byte) 79), (byte) 189); - minecraftColors.put(asRgb((byte) 76, (byte) 62, (byte) 92), (byte) 190); - minecraftColors.put(asRgb((byte) 40, (byte) 32, (byte) 48), (byte) 191); - minecraftColors.put(asRgb((byte) 53, (byte) 35, (byte) 24), (byte) 192); - minecraftColors.put(asRgb((byte) 65, (byte) 43, (byte) 30), (byte) 193); - minecraftColors.put(asRgb((byte) 76, (byte) 50, (byte) 35), (byte) 194); - minecraftColors.put(asRgb((byte) 40, (byte) 26, (byte) 18), (byte) 195); - minecraftColors.put(asRgb((byte) 53, (byte) 57, (byte) 29), (byte) 196); - minecraftColors.put(asRgb((byte) 65, (byte) 70, (byte) 36), (byte) 197); - minecraftColors.put(asRgb((byte) 76, (byte) 82, (byte) 42), (byte) 198); - minecraftColors.put(asRgb((byte) 40, (byte) 43, (byte) 22), (byte) 199); - minecraftColors.put(asRgb((byte) 100, (byte) 42, (byte) 32), (byte) 200); - minecraftColors.put(asRgb((byte) 122, (byte) 51, (byte) 39), (byte) 201); - minecraftColors.put(asRgb((byte) 142, (byte) 60, (byte) 46), (byte) 202); - minecraftColors.put(asRgb((byte) 75, (byte) 31, (byte) 24), (byte) 203); - minecraftColors.put(asRgb((byte) 26, (byte) 15, (byte) 11), (byte) 204); - minecraftColors.put(asRgb((byte) 31, (byte) 18, (byte) 13), (byte) 205); - minecraftColors.put(asRgb((byte) 37, (byte) 22, (byte) 16), (byte) 206); - minecraftColors.put(asRgb((byte) 19, (byte) 11, (byte) 8), (byte) 207); + minecraftColors.put(ColorUtil.toArgb((byte) 89, (byte) 125, (byte) 39), (byte) 4); + minecraftColors.put(ColorUtil.toArgb((byte) 109, (byte) 153, (byte) 48), (byte) 5); + minecraftColors.put(ColorUtil.toArgb((byte) 127, (byte) 178, (byte) 56), (byte) 6); + minecraftColors.put(ColorUtil.toArgb((byte) 67, (byte) 94, (byte) 29), (byte) 7); + minecraftColors.put(ColorUtil.toArgb((byte) 174, (byte) 164, (byte) 115), (byte) 8); + minecraftColors.put(ColorUtil.toArgb((byte) 213, (byte) 201, (byte) 140), (byte) 9); + minecraftColors.put(ColorUtil.toArgb((byte) 247, (byte) 233, (byte) 163), (byte) 10); + minecraftColors.put(ColorUtil.toArgb((byte) 130, (byte) 123, (byte) 86), (byte) 11); + minecraftColors.put(ColorUtil.toArgb((byte) 140, (byte) 140, (byte) 140), (byte) 12); + minecraftColors.put(ColorUtil.toArgb((byte) 171, (byte) 171, (byte) 171), (byte) 13); + minecraftColors.put(ColorUtil.toArgb((byte) 199, (byte) 199, (byte) 199), (byte) 14); + minecraftColors.put(ColorUtil.toArgb((byte) 105, (byte) 105, (byte) 105), (byte) 15); + minecraftColors.put(ColorUtil.toArgb((byte) 180, (byte) 0, (byte) 0), (byte) 16); + minecraftColors.put(ColorUtil.toArgb((byte) 220, (byte) 0, (byte) 0), (byte) 17); + minecraftColors.put(ColorUtil.toArgb((byte) 255, (byte) 0, (byte) 0), (byte) 18); + minecraftColors.put(ColorUtil.toArgb((byte) 135, (byte) 0, (byte) 0), (byte) 19); + minecraftColors.put(ColorUtil.toArgb((byte) 112, (byte) 112, (byte) 180), (byte) 20); + minecraftColors.put(ColorUtil.toArgb((byte) 138, (byte) 138, (byte) 220), (byte) 21); + minecraftColors.put(ColorUtil.toArgb((byte) 160, (byte) 160, (byte) 255), (byte) 22); + minecraftColors.put(ColorUtil.toArgb((byte) 84, (byte) 84, (byte) 135), (byte) 23); + minecraftColors.put(ColorUtil.toArgb((byte) 117, (byte) 117, (byte) 117), (byte) 24); + minecraftColors.put(ColorUtil.toArgb((byte) 144, (byte) 144, (byte) 144), (byte) 25); + minecraftColors.put(ColorUtil.toArgb((byte) 167, (byte) 167, (byte) 167), (byte) 26); + minecraftColors.put(ColorUtil.toArgb((byte) 88, (byte) 88, (byte) 88), (byte) 27); + minecraftColors.put(ColorUtil.toArgb((byte) 0, (byte) 87, (byte) 0), (byte) 28); + minecraftColors.put(ColorUtil.toArgb((byte) 0, (byte) 106, (byte) 0), (byte) 29); + minecraftColors.put(ColorUtil.toArgb((byte) 0, (byte) 124, (byte) 0), (byte) 30); + minecraftColors.put(ColorUtil.toArgb((byte) 0, (byte) 65, (byte) 0), (byte) 31); + minecraftColors.put(ColorUtil.toArgb((byte) 180, (byte) 180, (byte) 180), (byte) 32); + minecraftColors.put(ColorUtil.toArgb((byte) 220, (byte) 220, (byte) 220), (byte) 33); + minecraftColors.put(ColorUtil.toArgb((byte) 255, (byte) 255, (byte) 255), (byte) 34); + minecraftColors.put(ColorUtil.toArgb((byte) 135, (byte) 135, (byte) 135), (byte) 35); + minecraftColors.put(ColorUtil.toArgb((byte) 115, (byte) 118, (byte) 129), (byte) 36); + minecraftColors.put(ColorUtil.toArgb((byte) 141, (byte) 144, (byte) 158), (byte) 37); + minecraftColors.put(ColorUtil.toArgb((byte) 164, (byte) 168, (byte) 184), (byte) 38); + minecraftColors.put(ColorUtil.toArgb((byte) 86, (byte) 88, (byte) 97), (byte) 39); + minecraftColors.put(ColorUtil.toArgb((byte) 106, (byte) 76, (byte) 54), (byte) 40); + minecraftColors.put(ColorUtil.toArgb((byte) 130, (byte) 94, (byte) 66), (byte) 41); + minecraftColors.put(ColorUtil.toArgb((byte) 151, (byte) 109, (byte) 77), (byte) 42); + minecraftColors.put(ColorUtil.toArgb((byte) 79, (byte) 57, (byte) 40), (byte) 43); + minecraftColors.put(ColorUtil.toArgb((byte) 79, (byte) 79, (byte) 79), (byte) 44); + minecraftColors.put(ColorUtil.toArgb((byte) 96, (byte) 96, (byte) 96), (byte) 45); + minecraftColors.put(ColorUtil.toArgb((byte) 112, (byte) 112, (byte) 112), (byte) 46); + minecraftColors.put(ColorUtil.toArgb((byte) 59, (byte) 59, (byte) 59), (byte) 47); + minecraftColors.put(ColorUtil.toArgb((byte) 45, (byte) 45, (byte) 180), (byte) 48); + minecraftColors.put(ColorUtil.toArgb((byte) 55, (byte) 55, (byte) 220), (byte) 49); + minecraftColors.put(ColorUtil.toArgb((byte) 64, (byte) 64, (byte) 255), (byte) 50); + minecraftColors.put(ColorUtil.toArgb((byte) 33, (byte) 33, (byte) 135), (byte) 51); + minecraftColors.put(ColorUtil.toArgb((byte) 100, (byte) 84, (byte) 50), (byte) 52); + minecraftColors.put(ColorUtil.toArgb((byte) 123, (byte) 102, (byte) 62), (byte) 53); + minecraftColors.put(ColorUtil.toArgb((byte) 143, (byte) 119, (byte) 72), (byte) 54); + minecraftColors.put(ColorUtil.toArgb((byte) 75, (byte) 63, (byte) 38), (byte) 55); + minecraftColors.put(ColorUtil.toArgb((byte) 180, (byte) 177, (byte) 172), (byte) 56); + minecraftColors.put(ColorUtil.toArgb((byte) 220, (byte) 217, (byte) 211), (byte) 57); + minecraftColors.put(ColorUtil.toArgb((byte) 255, (byte) 252, (byte) 245), (byte) 58); + minecraftColors.put(ColorUtil.toArgb((byte) 135, (byte) 133, (byte) 129), (byte) 59); + minecraftColors.put(ColorUtil.toArgb((byte) 152, (byte) 89, (byte) 36), (byte) 60); + minecraftColors.put(ColorUtil.toArgb((byte) 186, (byte) 109, (byte) 44), (byte) 61); + minecraftColors.put(ColorUtil.toArgb((byte) 216, (byte) 127, (byte) 51), (byte) 62); + minecraftColors.put(ColorUtil.toArgb((byte) 114, (byte) 67, (byte) 27), (byte) 63); + minecraftColors.put(ColorUtil.toArgb((byte) 125, (byte) 53, (byte) 152), (byte) 64); + minecraftColors.put(ColorUtil.toArgb((byte) 153, (byte) 65, (byte) 186), (byte) 65); + minecraftColors.put(ColorUtil.toArgb((byte) 178, (byte) 76, (byte) 216), (byte) 66); + minecraftColors.put(ColorUtil.toArgb((byte) 94, (byte) 40, (byte) 114), (byte) 67); + minecraftColors.put(ColorUtil.toArgb((byte) 72, (byte) 108, (byte) 152), (byte) 68); + minecraftColors.put(ColorUtil.toArgb((byte) 88, (byte) 132, (byte) 186), (byte) 69); + minecraftColors.put(ColorUtil.toArgb((byte) 102, (byte) 153, (byte) 216), (byte) 70); + minecraftColors.put(ColorUtil.toArgb((byte) 54, (byte) 81, (byte) 114), (byte) 71); + minecraftColors.put(ColorUtil.toArgb((byte) 161, (byte) 161, (byte) 36), (byte) 72); + minecraftColors.put(ColorUtil.toArgb((byte) 197, (byte) 197, (byte) 44), (byte) 73); + minecraftColors.put(ColorUtil.toArgb((byte) 229, (byte) 229, (byte) 51), (byte) 74); + minecraftColors.put(ColorUtil.toArgb((byte) 121, (byte) 121, (byte) 27), (byte) 75); + minecraftColors.put(ColorUtil.toArgb((byte) 89, (byte) 144, (byte) 17), (byte) 76); + minecraftColors.put(ColorUtil.toArgb((byte) 109, (byte) 176, (byte) 21), (byte) 77); + minecraftColors.put(ColorUtil.toArgb((byte) 127, (byte) 204, (byte) 25), (byte) 78); + minecraftColors.put(ColorUtil.toArgb((byte) 67, (byte) 108, (byte) 13), (byte) 79); + minecraftColors.put(ColorUtil.toArgb((byte) 170, (byte) 89, (byte) 116), (byte) 80); + minecraftColors.put(ColorUtil.toArgb((byte) 208, (byte) 109, (byte) 142), (byte) 81); + minecraftColors.put(ColorUtil.toArgb((byte) 242, (byte) 127, (byte) 165), (byte) 82); + minecraftColors.put(ColorUtil.toArgb((byte) 128, (byte) 67, (byte) 87), (byte) 83); + minecraftColors.put(ColorUtil.toArgb((byte) 53, (byte) 53, (byte) 53), (byte) 84); + minecraftColors.put(ColorUtil.toArgb((byte) 65, (byte) 65, (byte) 65), (byte) 85); + minecraftColors.put(ColorUtil.toArgb((byte) 76, (byte) 76, (byte) 76), (byte) 86); + minecraftColors.put(ColorUtil.toArgb((byte) 40, (byte) 40, (byte) 40), (byte) 87); + minecraftColors.put(ColorUtil.toArgb((byte) 108, (byte) 108, (byte) 108), (byte) 88); + minecraftColors.put(ColorUtil.toArgb((byte) 132, (byte) 132, (byte) 132), (byte) 89); + minecraftColors.put(ColorUtil.toArgb((byte) 153, (byte) 153, (byte) 153), (byte) 90); + minecraftColors.put(ColorUtil.toArgb((byte) 81, (byte) 81, (byte) 81), (byte) 91); + minecraftColors.put(ColorUtil.toArgb((byte) 53, (byte) 89, (byte) 108), (byte) 92); + minecraftColors.put(ColorUtil.toArgb((byte) 65, (byte) 109, (byte) 132), (byte) 93); + minecraftColors.put(ColorUtil.toArgb((byte) 76, (byte) 127, (byte) 153), (byte) 94); + minecraftColors.put(ColorUtil.toArgb((byte) 40, (byte) 67, (byte) 81), (byte) 95); + minecraftColors.put(ColorUtil.toArgb((byte) 89, (byte) 44, (byte) 125), (byte) 96); + minecraftColors.put(ColorUtil.toArgb((byte) 109, (byte) 54, (byte) 153), (byte) 97); + minecraftColors.put(ColorUtil.toArgb((byte) 127, (byte) 63, (byte) 178), (byte) 98); + minecraftColors.put(ColorUtil.toArgb((byte) 67, (byte) 33, (byte) 94), (byte) 99); + minecraftColors.put(ColorUtil.toArgb((byte) 36, (byte) 53, (byte) 125), (byte) 100); + minecraftColors.put(ColorUtil.toArgb((byte) 44, (byte) 65, (byte) 153), (byte) 101); + minecraftColors.put(ColorUtil.toArgb((byte) 51, (byte) 76, (byte) 178), (byte) 102); + minecraftColors.put(ColorUtil.toArgb((byte) 27, (byte) 40, (byte) 94), (byte) 103); + minecraftColors.put(ColorUtil.toArgb((byte) 72, (byte) 53, (byte) 36), (byte) 104); + minecraftColors.put(ColorUtil.toArgb((byte) 88, (byte) 65, (byte) 44), (byte) 105); + minecraftColors.put(ColorUtil.toArgb((byte) 102, (byte) 76, (byte) 51), (byte) 106); + minecraftColors.put(ColorUtil.toArgb((byte) 54, (byte) 40, (byte) 27), (byte) 107); + minecraftColors.put(ColorUtil.toArgb((byte) 72, (byte) 89, (byte) 36), (byte) 108); + minecraftColors.put(ColorUtil.toArgb((byte) 88, (byte) 109, (byte) 44), (byte) 109); + minecraftColors.put(ColorUtil.toArgb((byte) 102, (byte) 127, (byte) 51), (byte) 110); + minecraftColors.put(ColorUtil.toArgb((byte) 54, (byte) 67, (byte) 27), (byte) 111); + minecraftColors.put(ColorUtil.toArgb((byte) 108, (byte) 36, (byte) 36), (byte) 112); + minecraftColors.put(ColorUtil.toArgb((byte) 132, (byte) 44, (byte) 44), (byte) 113); + minecraftColors.put(ColorUtil.toArgb((byte) 153, (byte) 51, (byte) 51), (byte) 114); + minecraftColors.put(ColorUtil.toArgb((byte) 81, (byte) 27, (byte) 27), (byte) 115); + minecraftColors.put(ColorUtil.toArgb((byte) 17, (byte) 17, (byte) 17), (byte) 116); + minecraftColors.put(ColorUtil.toArgb((byte) 21, (byte) 21, (byte) 21), (byte) 117); + minecraftColors.put(ColorUtil.toArgb((byte) 25, (byte) 25, (byte) 25), (byte) 118); + minecraftColors.put(ColorUtil.toArgb((byte) 13, (byte) 13, (byte) 13), (byte) 119); + minecraftColors.put(ColorUtil.toArgb((byte) 176, (byte) 168, (byte) 54), (byte) 120); + minecraftColors.put(ColorUtil.toArgb((byte) 215, (byte) 205, (byte) 66), (byte) 121); + minecraftColors.put(ColorUtil.toArgb((byte) 250, (byte) 238, (byte) 77), (byte) 122); + minecraftColors.put(ColorUtil.toArgb((byte) 132, (byte) 126, (byte) 40), (byte) 123); + minecraftColors.put(ColorUtil.toArgb((byte) 64, (byte) 154, (byte) 150), (byte) 124); + minecraftColors.put(ColorUtil.toArgb((byte) 79, (byte) 188, (byte) 183), (byte) 125); + minecraftColors.put(ColorUtil.toArgb((byte) 92, (byte) 219, (byte) 213), (byte) 126); + minecraftColors.put(ColorUtil.toArgb((byte) 48, (byte) 115, (byte) 112), (byte) 127); + minecraftColors.put(ColorUtil.toArgb((byte) 52, (byte) 90, (byte) 180), (byte) 128); + minecraftColors.put(ColorUtil.toArgb((byte) 63, (byte) 110, (byte) 220), (byte) 129); + minecraftColors.put(ColorUtil.toArgb((byte) 74, (byte) 128, (byte) 255), (byte) 130); + minecraftColors.put(ColorUtil.toArgb((byte) 39, (byte) 67, (byte) 135), (byte) 131); + minecraftColors.put(ColorUtil.toArgb((byte) 0, (byte) 153, (byte) 40), (byte) 132); + minecraftColors.put(ColorUtil.toArgb((byte) 0, (byte) 187, (byte) 50), (byte) 133); + minecraftColors.put(ColorUtil.toArgb((byte) 0, (byte) 217, (byte) 58), (byte) 134); + minecraftColors.put(ColorUtil.toArgb((byte) 0, (byte) 114, (byte) 30), (byte) 135); + minecraftColors.put(ColorUtil.toArgb((byte) 91, (byte) 60, (byte) 34), (byte) 136); + minecraftColors.put(ColorUtil.toArgb((byte) 111, (byte) 74, (byte) 42), (byte) 137); + minecraftColors.put(ColorUtil.toArgb((byte) 129, (byte) 86, (byte) 49), (byte) 138); + minecraftColors.put(ColorUtil.toArgb((byte) 68, (byte) 45, (byte) 25), (byte) 139); + minecraftColors.put(ColorUtil.toArgb((byte) 79, (byte) 1, (byte) 0), (byte) 140); + minecraftColors.put(ColorUtil.toArgb((byte) 96, (byte) 1, (byte) 0), (byte) 141); + minecraftColors.put(ColorUtil.toArgb((byte) 112, (byte) 2, (byte) 0), (byte) 142); + minecraftColors.put(ColorUtil.toArgb((byte) 59, (byte) 1, (byte) 0), (byte) 143); + minecraftColors.put(ColorUtil.toArgb((byte) 147, (byte) 124, (byte) 113), (byte) 144); + minecraftColors.put(ColorUtil.toArgb((byte) 180, (byte) 152, (byte) 138), (byte) 145); + minecraftColors.put(ColorUtil.toArgb((byte) 209, (byte) 177, (byte) 161), (byte) 146); + minecraftColors.put(ColorUtil.toArgb((byte) 110, (byte) 93, (byte) 85), (byte) 147); + minecraftColors.put(ColorUtil.toArgb((byte) 112, (byte) 57, (byte) 25), (byte) 148); + minecraftColors.put(ColorUtil.toArgb((byte) 137, (byte) 70, (byte) 31), (byte) 149); + minecraftColors.put(ColorUtil.toArgb((byte) 159, (byte) 82, (byte) 36), (byte) 150); + minecraftColors.put(ColorUtil.toArgb((byte) 84, (byte) 43, (byte) 19), (byte) 151); + minecraftColors.put(ColorUtil.toArgb((byte) 105, (byte) 61, (byte) 76), (byte) 152); + minecraftColors.put(ColorUtil.toArgb((byte) 128, (byte) 75, (byte) 93), (byte) 153); + minecraftColors.put(ColorUtil.toArgb((byte) 149, (byte) 87, (byte) 108), (byte) 154); + minecraftColors.put(ColorUtil.toArgb((byte) 78, (byte) 46, (byte) 57), (byte) 155); + minecraftColors.put(ColorUtil.toArgb((byte) 79, (byte) 76, (byte) 97), (byte) 156); + minecraftColors.put(ColorUtil.toArgb((byte) 96, (byte) 93, (byte) 119), (byte) 157); + minecraftColors.put(ColorUtil.toArgb((byte) 112, (byte) 108, (byte) 138), (byte) 158); + minecraftColors.put(ColorUtil.toArgb((byte) 59, (byte) 57, (byte) 73), (byte) 159); + minecraftColors.put(ColorUtil.toArgb((byte) 131, (byte) 93, (byte) 25), (byte) 160); + minecraftColors.put(ColorUtil.toArgb((byte) 160, (byte) 114, (byte) 31), (byte) 161); + minecraftColors.put(ColorUtil.toArgb((byte) 186, (byte) 133, (byte) 36), (byte) 162); + minecraftColors.put(ColorUtil.toArgb((byte) 98, (byte) 70, (byte) 19), (byte) 163); + minecraftColors.put(ColorUtil.toArgb((byte) 72, (byte) 82, (byte) 37), (byte) 164); + minecraftColors.put(ColorUtil.toArgb((byte) 88, (byte) 100, (byte) 45), (byte) 165); + minecraftColors.put(ColorUtil.toArgb((byte) 103, (byte) 117, (byte) 53), (byte) 166); + minecraftColors.put(ColorUtil.toArgb((byte) 54, (byte) 61, (byte) 28), (byte) 167); + minecraftColors.put(ColorUtil.toArgb((byte) 112, (byte) 54, (byte) 55), (byte) 168); + minecraftColors.put(ColorUtil.toArgb((byte) 138, (byte) 66, (byte) 67), (byte) 169); + minecraftColors.put(ColorUtil.toArgb((byte) 160, (byte) 77, (byte) 78), (byte) 170); + minecraftColors.put(ColorUtil.toArgb((byte) 84, (byte) 40, (byte) 41), (byte) 171); + minecraftColors.put(ColorUtil.toArgb((byte) 40, (byte) 28, (byte) 24), (byte) 172); + minecraftColors.put(ColorUtil.toArgb((byte) 49, (byte) 35, (byte) 30), (byte) 173); + minecraftColors.put(ColorUtil.toArgb((byte) 57, (byte) 41, (byte) 35), (byte) 174); + minecraftColors.put(ColorUtil.toArgb((byte) 30, (byte) 21, (byte) 18), (byte) 175); + minecraftColors.put(ColorUtil.toArgb((byte) 95, (byte) 75, (byte) 69), (byte) 176); + minecraftColors.put(ColorUtil.toArgb((byte) 116, (byte) 92, (byte) 84), (byte) 177); + minecraftColors.put(ColorUtil.toArgb((byte) 135, (byte) 107, (byte) 98), (byte) 178); + minecraftColors.put(ColorUtil.toArgb((byte) 71, (byte) 56, (byte) 51), (byte) 179); + minecraftColors.put(ColorUtil.toArgb((byte) 61, (byte) 64, (byte) 64), (byte) 180); + minecraftColors.put(ColorUtil.toArgb((byte) 75, (byte) 79, (byte) 79), (byte) 181); + minecraftColors.put(ColorUtil.toArgb((byte) 87, (byte) 92, (byte) 92), (byte) 182); + minecraftColors.put(ColorUtil.toArgb((byte) 46, (byte) 48, (byte) 48), (byte) 183); + minecraftColors.put(ColorUtil.toArgb((byte) 86, (byte) 51, (byte) 62), (byte) 184); + minecraftColors.put(ColorUtil.toArgb((byte) 105, (byte) 62, (byte) 75), (byte) 185); + minecraftColors.put(ColorUtil.toArgb((byte) 122, (byte) 73, (byte) 88), (byte) 186); + minecraftColors.put(ColorUtil.toArgb((byte) 64, (byte) 38, (byte) 46), (byte) 187); + minecraftColors.put(ColorUtil.toArgb((byte) 53, (byte) 43, (byte) 64), (byte) 188); + minecraftColors.put(ColorUtil.toArgb((byte) 65, (byte) 53, (byte) 79), (byte) 189); + minecraftColors.put(ColorUtil.toArgb((byte) 76, (byte) 62, (byte) 92), (byte) 190); + minecraftColors.put(ColorUtil.toArgb((byte) 40, (byte) 32, (byte) 48), (byte) 191); + minecraftColors.put(ColorUtil.toArgb((byte) 53, (byte) 35, (byte) 24), (byte) 192); + minecraftColors.put(ColorUtil.toArgb((byte) 65, (byte) 43, (byte) 30), (byte) 193); + minecraftColors.put(ColorUtil.toArgb((byte) 76, (byte) 50, (byte) 35), (byte) 194); + minecraftColors.put(ColorUtil.toArgb((byte) 40, (byte) 26, (byte) 18), (byte) 195); + minecraftColors.put(ColorUtil.toArgb((byte) 53, (byte) 57, (byte) 29), (byte) 196); + minecraftColors.put(ColorUtil.toArgb((byte) 65, (byte) 70, (byte) 36), (byte) 197); + minecraftColors.put(ColorUtil.toArgb((byte) 76, (byte) 82, (byte) 42), (byte) 198); + minecraftColors.put(ColorUtil.toArgb((byte) 40, (byte) 43, (byte) 22), (byte) 199); + minecraftColors.put(ColorUtil.toArgb((byte) 100, (byte) 42, (byte) 32), (byte) 200); + minecraftColors.put(ColorUtil.toArgb((byte) 122, (byte) 51, (byte) 39), (byte) 201); + minecraftColors.put(ColorUtil.toArgb((byte) 142, (byte) 60, (byte) 46), (byte) 202); + minecraftColors.put(ColorUtil.toArgb((byte) 75, (byte) 31, (byte) 24), (byte) 203); + minecraftColors.put(ColorUtil.toArgb((byte) 26, (byte) 15, (byte) 11), (byte) 204); + minecraftColors.put(ColorUtil.toArgb((byte) 31, (byte) 18, (byte) 13), (byte) 205); + minecraftColors.put(ColorUtil.toArgb((byte) 37, (byte) 22, (byte) 16), (byte) 206); + minecraftColors.put(ColorUtil.toArgb((byte) 19, (byte) 11, (byte) 8), (byte) 207); MINECRAFT_RGB_COLOR_CODES = new TUnmodifiableIntByteMap(minecraftColors); MINECRAFT_RGB_COLORS = MINECRAFT_RGB_COLOR_CODES.keys(); @@ -279,7 +279,7 @@ public boolean isMinecraftColor(final int rgb) { * @return {@code true} if this color can be shown on an in-game map without distortion anf {@code false} otherwise */ public boolean isMinecraftColor(final byte red, final byte green, final byte blue) { - return isMinecraftColor(asRgb(red, green, blue)); + return isMinecraftColor(ColorUtil.toArgb(red, green, blue)); } /** @@ -302,6 +302,6 @@ public byte getMinecraftColorCode(final int rgb) { * or {@link MapImageColor#NO_COLOR_CODE} if none was found */ public byte getMinecraftColorCode(final byte red, final byte green, final byte blue) { - return MINECRAFT_RGB_COLOR_CODES.get(asRgb(red, green, blue)); + return MINECRAFT_RGB_COLOR_CODES.get(ColorUtil.toArgb(red, green, blue)); } } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java new file mode 100644 index 000000000..787423e52 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java @@ -0,0 +1,134 @@ +package ru.progrm_jarvis.minecraft.commons.util.image; + +import lombok.experimental.UtilityClass; +import lombok.val; +import org.jetbrains.annotations.Contract; + +import static java.lang.Math.min; + +/** + * Utilities related to standard {@link int}-ARGB representation of colors. + */ +@UtilityClass +public class ColorUtil { + + /** + * Length of bitwise {@link int} shift for accessing alpha channel value of standard {@link int}-ARGB. + */ + public static final byte ALPHA_CHANNEL = 24, + /** + * Length of bitwise {@link int} shift for accessing red color channel value of standard {@link int}-ARGB. + */ + RED_CHANNEL = 16, + /** + * Length of bitwise {@link int} shift for accessing green color channel value of standard {@link int}-ARGB. + */ + GREEN_CHANNEL = 8, + /** + * Length of bitwise {@link int} shift for accessing blue color channel value of standard {@link int}-ARGB. + */ + BLUE_CHANNEL = 0; + + /** + * Gets the alpha channel value for the specified ARGB {@link int}. + * + * @param rgb RGB encoded as a single integer + * @return alpha channel value + */ + @Contract(pure = true) + public static int alpha(final int rgb) { + return rgb >> ALPHA_CHANNEL & 0xFF; + } + + /** + * Gets the red color channel value for the specified ARGB {@link int}. + * + * @param rgb RGB encoded as a single integer + * @return red color channel value + */ + @Contract(pure = true) + public static int red(final int rgb) { + return rgb >> RED_CHANNEL & 0xFF; + } + + /** + * Gets the green color channel value for the specified ARGB {@link int}. + * + * @param rgb RGB encoded as a single integer + * @return green color channel value + */ + @Contract(pure = true) + public static int green(final int rgb) { + return rgb >> GREEN_CHANNEL & 0xFF; + } + + /** + * Gets the blue color channel value for the specified ARGB {@link int}. + * + * @param rgb RGB encoded as a single integer + * @return blue color channel value + */ + @Contract(pure = true) + public static int blue(final int rgb) { + return rgb >> BLUE_CHANNEL & 0xFF; + } + + /** + * Transforms 4 ARGB channels to a single {@link int}. + * + * @param alpha alpha color channel (between {@code 0} and {@code 255}) + * @param red red color channel (between {@code 0} and {@code 255}) + * @param green green color channel (between {@code 0} and {@code 255}) + * @param blue blue color channel (between {@code 0} and {@code 255}) + * @return color as a single RGB {@link int} + */ + @Contract(pure = true) + public static int toArgb(final int alpha, final int red, final int green, final int blue) { + return (alpha << ALPHA_CHANNEL) | (red << RED_CHANNEL) | (green << GREEN_CHANNEL) | (blue << BLUE_CHANNEL); + } + + /** + * Transforms 3 color channels channels to a single ARGB {@link int} with no transparency. + * + * @param red red color channel (between {@code 0} and {@code 255}) + * @param green green color channel (between {@code 0} and {@code 255}) + * @param blue blue color channel (between {@code 0} and {@code 255}) + * @return color as a single RGB {@link int} + */ + @Contract(pure = true) + public static int toArgb(final int red, final int green, final int blue) { + return toArgb(0xFF, red, green, blue); + } + + public int blendColorsNoAlpha(final int backgroundColor, final int foregroundColor) { + return toArgb( + (red(foregroundColor) + red(backgroundColor)) / 2, + (green(foregroundColor) + green(backgroundColor)) / 2, + (blue(foregroundColor) + blue(backgroundColor)) / 2 + ); + } + + /** + * Blends two ARGB colors into one respecting alphas. + * @param backgroundColor background color as a standard {@link int}-ARGB + * @param foregroundColor foreground color as a standard {@link int}-ARGB + * @return standard {@link int}-ARGB color being the result of color-bleeding + */ + @Contract(pure = true) + public int blendColors(final int backgroundColor, final int foregroundColor) { + val foregroundAlpha = alpha(foregroundColor); + if (foregroundAlpha == 0x0) return backgroundColor; + if (foregroundAlpha == 0xFF) return foregroundColor; + + val backgroundAlpha = alpha(backgroundColor); + if (backgroundAlpha == foregroundAlpha) return foregroundAlpha + | blendColorsNoAlpha(backgroundColor, foregroundColor) & 0xFFFFFF; + + return toArgb( + min(backgroundAlpha + foregroundAlpha, 255), + min((red(backgroundColor) * backgroundAlpha + red(foregroundColor) * foregroundAlpha) / 255, 255), + min((green(backgroundColor) * backgroundAlpha + green(foregroundColor) * foregroundAlpha) / 255, 255), + min((blue(backgroundColor) * backgroundAlpha + blue(foregroundColor) * foregroundAlpha) / 255, 255) + ); + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java new file mode 100644 index 000000000..a752a3bbf --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java @@ -0,0 +1,82 @@ +package ru.progrm_jarvis.minecraft.commons.util.image; + +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import lombok.val; +import lombok.var; +import org.jetbrains.annotations.Contract; + +import java.awt.image.BufferedImage; + +import static java.lang.Math.min; + +/** + * Utility for {@link java.awt} related image stuff. + */ +@UtilityClass +public class ImageUtil { + + /** + * Clones the BufferedImage into a new one. + * + * @param image image to clone + * @return cloned image + */ + public BufferedImage clone(@NonNull final BufferedImage image) { + val clonedImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + val graphics = clonedImage.getGraphics(); + graphics.drawImage(image, 0, 0, null); + + return clonedImage; + } + + /** + * Merge multiple images into the first one respecting alpha channel. + * + * @param background image to which to merge the foregrounds + * @param foregrounds images to merge to the foreground + * @return the given background with foregrounds merged + * + * @see #clone(BufferedImage) should be used to keep your source image unmodified + */ + @Contract("null, _ -> fail; _, null -> fail; !null, _ -> param1") + public BufferedImage merge(@NonNull final BufferedImage background, @NonNull final BufferedImage... foregrounds) { + final int width = background.getWidth(), height = background.getHeight(); + val graphics = background.getGraphics(); + + for (val foreground : foregrounds) graphics.drawImage( + foreground.getSubimage(0, 0, min(width, foreground.getWidth()), min(height, foreground.getHeight())), + 0, 0, null + ); + + return background; + } + + /** + * Merge multiple images using into the first one using {@link ColorUtil#blendColors(int, int)} . + * + * @param background image to which to merge the foregrounds + * @param foregrounds images to merge to the foreground + * @return the given background with foregrounds merged + * + * @implNote current implementation is based on pixel-by-pixel operation + * + * @see #clone(BufferedImage) should be used to keep your source image unmodified + * @see ColorUtil#blendColors(int, int) used color blending algorithm + */ + @Contract("null, _ -> fail; _, null -> fail; !null, _ -> param1") + public BufferedImage mergeSharp(@NonNull final BufferedImage background, + @NonNull final BufferedImage... foregrounds) { + final int width = background.getWidth(), height = background.getHeight(); + + for (val foreground : foregrounds) { + final int foregroundWidth = min(width, foreground.getWidth()), + foregroundHeight = min(height, foreground.getHeight()); + + for (var x = 0; x < foregroundWidth; x++) for (var y = 0; y < foregroundHeight; y++) background + .setRGB(x, y, ColorUtil.blendColors(background.getRGB(x, y), foreground.getRGB(x, y))); + } + + return background; + } +} From 29c747f5a6f56e895e2b3fc77afa67df8b069727 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 6 Feb 2019 22:57:24 +0300 Subject: [PATCH 142/508] Rework LoopPool fixing critical bugs in SingleWorkerLoopPool --- .../commons/schedule/pool/KeyedLoopPool.java | 12 +- .../commons/schedule/pool/LoopPool.java | 13 +- .../schedule/pool/SingleWorkerLoopPool.java | 126 ++++-------------- 3 files changed, 37 insertions(+), 114 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java index e6e7d3e67..a23a1ae24 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java @@ -3,8 +3,6 @@ import lombok.NonNull; import org.bukkit.plugin.Plugin; -import java.util.Collection; - /** * A loop pool which allows storing its elements by keys. * @@ -15,14 +13,10 @@ public interface KeyedLoopPool extends LoopPool { Plugin getPlugin(); - void addTask(@NonNull final TaskOptions taskOptions, final K key, @NonNull final T task); + TaskRemover addTask(@NonNull final TaskOptions taskOptions, final K key, @NonNull final T task); @Override - default void addTask(final TaskOptions taskOptions, final T task) { - addTask(taskOptions, null, task); + default TaskRemover addTask(@NonNull final TaskOptions taskOptions, @NonNull final T task) { + return addTask(taskOptions, null, task); } - - T removeTask(@NonNull final TaskOptions taskOptions, @NonNull final K key); - - Collection removeTasks(@NonNull final K key); } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java index b174412e9..43e0025ca 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java @@ -21,13 +21,7 @@ public interface LoopPool { int tasksSize(); - void addTask(@NonNull final TaskOptions taskOptions, @NonNull final T task); - - T removeTask(@NonNull final T task); - - Collection removeTasks(@NonNull final T task); - - Collection removeTasks(@NonNull final TaskOptions taskOptions); + TaskRemover addTask(@NonNull final TaskOptions taskOptions, @NonNull final T task); Collection clearTasks(); @@ -52,4 +46,9 @@ public static TaskOptions of(final boolean async, long interval) { return options; } } + + @FunctionalInterface + interface TaskRemover { + void removeTask(); + } } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java index 069d50a4d..20725a776 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java @@ -7,9 +7,7 @@ import ru.progrm_jarvis.minecraft.commons.schedule.misc.KeyedSchedulerGroup; import ru.progrm_jarvis.minecraft.commons.schedule.misc.SchedulerGroups; -import java.util.ArrayList; import java.util.Collection; -import java.util.function.Predicate; import java.util.stream.Collectors; /** @@ -18,14 +16,14 @@ @ToString @EqualsAndHashCode @RequiredArgsConstructor -@FieldDefaults(level = AccessLevel.PROTECTED) +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public class SingleWorkerLoopPool implements KeyedLoopPool { boolean concurrent; @NonNull @Getter Plugin plugin; - KeyedSchedulerGroup, K> asyncWorker; - KeyedSchedulerGroup, K> syncWorker; + @NonFinal KeyedSchedulerGroup, K> asyncWorker; + @NonFinal KeyedSchedulerGroup, K> syncWorker; protected static Collection mapToTasks(final Collection> tasks) { return tasks.stream() @@ -51,132 +49,64 @@ protected void initSyncWorker() { } @Override - public void addTask(final TaskOptions taskOptions, final T task) { + public TaskRemover addTask(@NonNull final TaskOptions taskOptions, @NonNull final T task) { if (taskOptions.isAsync()) { initAsyncWorker(); - asyncWorker.addTask(new CountingTask<>(task, taskOptions.getInterval())); - } else { - initSyncWorker(); - - syncWorker.addTask(new CountingTask<>(task, taskOptions.getInterval())); - } - } - - @Override - public void addTask(final TaskOptions taskOptions, final K key, final T task) { - if (taskOptions.isAsync()) { - initAsyncWorker(); + val countingTask = new CountingTask<>(task, taskOptions.getInterval()); + asyncWorker.addTask(countingTask); - asyncWorker.addTask(key, new CountingTask<>(task, taskOptions.getInterval())); + return () -> removeTask(countingTask, true); } else { initSyncWorker(); - syncWorker.addTask(key, new CountingTask<>(task, taskOptions.getInterval())); - } - } - - @Override - public T removeTask(final T task) { - final Predicate> predicate = testedTask -> testedTask.task.equals(task); + val countingTask = new CountingTask<>(task, taskOptions.getInterval()); + syncWorker.addTask(countingTask); - var removedTask = asyncWorker.removeTask(predicate); - if (removedTask == null) { - removedTask = syncWorker.removeTask(predicate); - if (removedTask == null) return null; - - checkAsync(); - - return removedTask.task; + return () -> removeTask(countingTask, false); } - - checkAsync(); - return removedTask.task; } - @Override - public Collection removeTasks(final T task) { - final Predicate> predicate = testedTask -> testedTask.task.equals(task); - var removedTasks = new ArrayList>(asyncWorker.removeTasks(predicate)); - checkAsync(); - removedTasks.addAll(syncWorker.removeTasks(predicate)); - checkSync(); - - return mapToTasks(removedTasks); + protected void removeTask(@NonNull final CountingTask countingTask, final boolean async) { + if (async) if (syncWorker != null) syncWorker.removeTask(countingTask); + else if (asyncWorker != null) asyncWorker.removeTask(countingTask); } @Override - public Collection removeTasks(final K key) { - val tasks = new ArrayList>(); - - var removedTasks = asyncWorker.removeTasks(key); - if (removedTasks != null) tasks.addAll(removedTasks); - checkAsync(); - - removedTasks = syncWorker.removeTasks(key); - if (removedTasks != null) tasks.addAll(removedTasks); - checkSync(); + public TaskRemover addTask(@NonNull final TaskOptions taskOptions, final K key, @NonNull final T task) { + if (taskOptions.isAsync()) { + initAsyncWorker(); - return mapToTasks(tasks); - } + val countingTask = new CountingTask<>(task, taskOptions.getInterval()); + asyncWorker.addTask(key, countingTask); - @Override - public T removeTask(final TaskOptions taskOptions, final K key) { - val async = taskOptions.isAsync(); - val tasks = (async ? asyncWorker.tasks() : syncWorker.tasks()).iterator(); - val interval = taskOptions.getInterval(); - - while (tasks.hasNext()) { - val task = tasks.next(); - if (task.interval == interval) { - if (async) checkAsync(); - else checkSync(); - - return task.task; - } - } + return () -> removeTask(countingTask, true); + } else { + initSyncWorker(); - return null; - } + val countingTask = new CountingTask<>(task, taskOptions.getInterval()); + syncWorker.addTask(key, countingTask); - @Override - public Collection removeTasks(final TaskOptions taskOptions) { - val async = taskOptions.isAsync(); - val interval = taskOptions.getInterval(); - - // remove all tasks - val removedTasks = new ArrayList>(); - val tasks = (async ? asyncWorker : syncWorker).tasks().iterator(); - while (tasks.hasNext()) { - val task = tasks.next(); - if (task.getInterval() == interval) { - tasks.remove(); - removedTasks.add(task); - } + return () -> removeTask(countingTask, false); } - - if (async) checkAsync(); - else checkSync(); - - return mapToTasks(removedTasks); } @Override public Collection clearTasks() { val tasks = asyncWorker.clearTasks(); - checkAsync(); + attemptCancelAsync(); tasks.addAll(syncWorker.clearTasks()); - checkSync(); + attemptCancelSync(); return mapToTasks(tasks); } - protected void checkAsync() { + protected void attemptCancelAsync() { if (asyncWorker.isCancelled()) asyncWorker = null; } - protected void checkSync() { + protected void attemptCancelSync() { if (syncWorker.size() == 0) syncWorker = null; } From 5a50a4800e5c6a493d5882e870c5780296180b61 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 6 Feb 2019 22:57:47 +0300 Subject: [PATCH 143/508] Optimize imports of LibLoader --- .../java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java index abcebf38d..cd0d91073 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java @@ -13,7 +13,10 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.StandardCopyOption; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; From d937d57887030892cb1c7cf1f2ca1637d6931d40 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 8 Feb 2019 18:16:05 +0300 Subject: [PATCH 144/508] Remove redundant `static` modifier from RandomUtil --- .../ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java index 9bef7ce0c..83b8cf304 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java @@ -21,7 +21,7 @@ public class RandomUtil { * * @return {@code 1} or {@code -1} */ - public static int randomSign() { + public int randomSign() { return ThreadLocalRandom.current().nextBoolean() ? 1 : -1; } From f738091dcbbe2296b35b94adafc7ed33cf28d477 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 9 Feb 2019 21:35:29 +0300 Subject: [PATCH 145/508] Use ConcurrentIterator for ConcurrentCollectionWrapper --- .../ConcurrentCollectionWrapper.java | 54 ++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java index 5b10ec159..183135088 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java @@ -51,12 +51,7 @@ public boolean contains(final Object o) { @Override @Nonnull public Iterator iterator() { - readLock.lock(); - try { - return wrapped.iterator(); - } finally { - readLock.unlock(); - } + return new ConcurrentIterator(wrapped.iterator()); } @Override @@ -199,4 +194,51 @@ public Stream parallelStream() { readLock.unlock(); } } + + protected class ConcurrentIterator extends ConcurrentWrapper> implements Iterator { + + public ConcurrentIterator(@NonNull final Iterator wrapped) { + super(wrapped); + } + + @Override + public boolean hasNext() { + readLock.lock(); + try { + return wrapped.hasNext(); + } finally { + readLock.unlock(); + } + } + + @Override + public E next() { + readLock.lock(); + try { + return wrapped.next(); + } finally { + readLock.unlock(); + } + } + + @Override + public void remove() { + writeLock.lock(); + try { + wrapped.remove(); + } finally { + writeLock.unlock(); + } + } + + @Override + public void forEachRemaining(@NonNull final Consumer action) { + writeLock.lock(); + try { + wrapped.forEachRemaining(action); + } finally { + writeLock.unlock(); + } + } + } } From d64bba2afef569d07ae8e9dea063c08867f09787 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 12 Feb 2019 21:17:43 +0300 Subject: [PATCH 146/508] Use ConcurrentIterator for ConcurrentCollectionWrapper --- .../ConcurrentCollectionWrapper.java | 54 +++---------------- 1 file changed, 6 insertions(+), 48 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java index 183135088..5b10ec159 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java @@ -51,7 +51,12 @@ public boolean contains(final Object o) { @Override @Nonnull public Iterator iterator() { - return new ConcurrentIterator(wrapped.iterator()); + readLock.lock(); + try { + return wrapped.iterator(); + } finally { + readLock.unlock(); + } } @Override @@ -194,51 +199,4 @@ public Stream parallelStream() { readLock.unlock(); } } - - protected class ConcurrentIterator extends ConcurrentWrapper> implements Iterator { - - public ConcurrentIterator(@NonNull final Iterator wrapped) { - super(wrapped); - } - - @Override - public boolean hasNext() { - readLock.lock(); - try { - return wrapped.hasNext(); - } finally { - readLock.unlock(); - } - } - - @Override - public E next() { - readLock.lock(); - try { - return wrapped.next(); - } finally { - readLock.unlock(); - } - } - - @Override - public void remove() { - writeLock.lock(); - try { - wrapped.remove(); - } finally { - writeLock.unlock(); - } - } - - @Override - public void forEachRemaining(@NonNull final Consumer action) { - writeLock.lock(); - try { - wrapped.forEachRemaining(action); - } finally { - writeLock.unlock(); - } - } - } } From 50496070deac3b74ec7f4f7b10fa622e7d92cf2e Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 12 Feb 2019 21:19:17 +0300 Subject: [PATCH 147/508] Replace #getManagedEntitiesCollection() with new contract of #getManagedEntities() in FakeEntityManager --- ...ocolBasedFakeEntityInteractionHandler.java | 9 +++----- .../AbstractSetBasedEntityManager.java | 21 +++++++++++-------- .../entity/management/FakeEntityManager.java | 14 +------------ 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java index f589ee84a..5e1adc41e 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java @@ -13,8 +13,8 @@ import ru.progrm_jarvis.minecraft.fakeentitylib.entity.behaviour.FakeEntityInteraction.Hand; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.management.FakeEntityManager; -import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Set; import static ru.progrm_jarvis.minecraft.commons.util.hack.PreSuperCheck.beforeSuper; @@ -27,6 +27,7 @@ public class ProtocolBasedFakeEntityInteractionHandler

entities; + Set entitiesView; public ProtocolBasedFakeEntityInteractionHandler(@NonNull final P plugin, final boolean concurrent) { super( @@ -36,6 +37,7 @@ public ProtocolBasedFakeEntityInteractionHandler(@NonNull final P plugin, final this.plugin = plugin; entities = concurrent ? FakeEntityManager.concurrentWeakEntitySet() : FakeEntityManager.weakEntitySet(); + entitiesView = Collections.unmodifiableSet(entities); ProtocolLibrary.getProtocolManager().addPacketListener(this); } @@ -89,11 +91,6 @@ public Collection getManagedEntities() { return entities; } - @Override - public Collection getManagedEntitiesCollection() { - return new ArrayList<>(entities); - } - @Override public void manageEntity(@NonNull E entity) { entities.add(entity); diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index 1c7744ba0..4adb62fbd 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -8,8 +8,8 @@ import javax.annotation.Nonnull; import javax.annotation.OverridingMethodsMustInvokeSuper; -import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Set; import static ru.progrm_jarvis.minecraft.commons.util.hack.PreSuperCheck.beforeSuper; @@ -27,8 +27,16 @@ public abstract class AbstractSetBasedEntityManager

implements FakeEntityManager { - P plugin; - Set entities; + @NonNull P plugin; + @NonNull Set entities; + @NonNull Set entitiesView; + + public AbstractSetBasedEntityManager(@NonNull final P plugin, + @NonNull final Set entities) { + this.plugin = plugin; + this.entities = entities; + this.entitiesView = Collections.unmodifiableSet(entities); + } /** * Constructs a new AbstractSetBasedEntityManager based on weak set with optional concurrency @@ -55,12 +63,7 @@ public int managedEntitiesSize() { @Override public Collection getManagedEntities() { - return entities; - } - - @Override - public Collection getManagedEntitiesCollection() { - return new ArrayList<>(entities); + return entitiesView; } @Override diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index 3ad4a514a..1f9086fa0 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -72,22 +72,10 @@ static Map concurrentWeakEntityMap() { * * @return all entities managed by this manager * - * @apiNote implementations may return their real backend collection - * modifications to which may have side-effect on this manager so it's a good practice - * to copy method call result into a new collection or use + * @apiNote the returned collection is immutable and will prohibit any attempts to modify its contents */ Collection getManagedEntities(); - /** - * Gets a side-effect-less collection of all entities managed by this manager. - * - * @return collection of all entities managed by this manager - * - * @apiNote side-effect-less collection means that modifications to it - * will not have any effect on containment of this entities in the manager - */ - Collection getManagedEntitiesCollection(); - /** * Enables management of specified entity by this manager. * From b094b28da329d9b91f72bd2a5564a032f079ad7e Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 17 Feb 2019 16:56:10 +0300 Subject: [PATCH 148/508] Use ConcurrentLinkedDeque in FluentBukkitEvents --- .../minecraft/commons/event/FluentBukkitEvents.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java index ab860bf1a..911e6a51b 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java @@ -2,6 +2,7 @@ import lombok.*; import lombok.experimental.Accessors; +import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import org.bukkit.event.Event; @@ -11,13 +12,12 @@ import org.bukkit.plugin.EventExecutor; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; -import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; -import java.util.ArrayDeque; import java.util.Deque; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedDeque; import static com.google.common.base.Preconditions.checkNotNull; @@ -123,18 +123,18 @@ public interface Unregister { * @param type of handled event */ @Value + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) private static final class EventListenersGroup implements Listener, EventExecutor { /** * Plugin managing these event listeners */ - @NonNull final ListenerConfiguration configuration; + @NonNull ListenerConfiguration configuration; /** * Event listeners in this event listener group's dequeue */ - @Getter(AccessLevel.NONE) @NonNull Deque> eventListeners - = ConcurrentCollections.concurrentDeque(new ArrayDeque<>()); + @Getter(AccessLevel.NONE) @NonNull Deque> eventListeners = new ConcurrentLinkedDeque<>(); /** * Adds the listener to the deque of handled listeners for the event. From 113433af8d0feccb61163936872900465be78f7a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 20 Feb 2019 23:20:35 +0300 Subject: [PATCH 149/508] Add velocity support to FakeEntity --- .../entity/AbstractBasicFakeEntity.java | 25 +++++- .../entity/SimpleLivingFakeEntity.java | 80 ++++++++++++++----- 2 files changed, 86 insertions(+), 19 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index f4ded6338..52c11f748 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -6,6 +6,7 @@ import lombok.experimental.FieldDefaults; import org.bukkit.Location; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; import javax.annotation.Nullable; import java.util.*; @@ -23,12 +24,18 @@ public abstract class AbstractBasicFakeEntity extends AbstractPlayerContainingFa */ @Nullable @Getter WrappedDataWatcher metadata; + /** + * Velocity of this fake entity + */ + @NonNull Vector velocity; + public AbstractBasicFakeEntity(final boolean global, final int viewDistance, @NonNull final Location location, @NonNull final Map players, - @Nullable final WrappedDataWatcher metadata) { + @Nullable final Vector velocity, @Nullable final WrappedDataWatcher metadata) { super(viewDistance, global, location, players); + this.velocity = velocity == null ? new Vector() : velocity; this.metadata = metadata; } @@ -150,8 +157,16 @@ public void teleport(final double x, final double y, final double z, final float location.setYaw(yaw); location.setPitch(pitch); + velocity.setX(dx * 8000); + velocity.setX(dy * 8000); + velocity.setX(dz * 8000); + if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch); else performMove(dx, dy, dz, yaw, pitch); + + velocity.setX(0); + velocity.setY(0); + velocity.setZ(0); } @Override @@ -162,6 +177,10 @@ public void move(final double dx, final double dy, final double dz, final float location.setYaw(location.getYaw() + dYaw); location.setPitch(location.getPitch() + dPitch); + velocity.setX(dx * 8000); + velocity.setX(dy * 8000); + velocity.setX(dz * 8000); + // use teleportation if any of axises is above 8 blocks limit if (dx > 8 || dy > 8 || dz > 8) performTeleportation( location.getX() + dx, location.getY() + dy, location.getZ() + dz, @@ -169,5 +188,9 @@ public void move(final double dx, final double dy, final double dz, final float ); // otherwise use move else performMove(dx, dy, dz, location.getYaw() + dYaw, location.getPitch() + dPitch); + + velocity.setX(0); + velocity.setY(0); + velocity.setZ(0); } } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 37f513d34..728c3fd6c 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -76,11 +76,6 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { */ float headPitch; - /** - * Velocity of this fake entity - */ - @Nullable Vector velocity; - /** * Metadata of this fake entity */ @@ -120,6 +115,11 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { */ WrapperPlayServerEntityTeleport teleportPacket; + /** + * Packet used for fake entity velocity + */ + WrapperPlayServerEntityVelocity velocityPacket; + /** * Difference between the actual entity x and its visible value */ @@ -153,9 +153,9 @@ public SimpleLivingFakeEntity(final int entityId, @Nullable final UUID uuid, @No @NonNull final Map players, final boolean global, final int viewDistance, boolean visible, - @NonNull final Location location, float headPitch, @Nullable final Vector velocity, - @Nullable final WrappedDataWatcher metadata) { - super(global, viewDistance, location, players, metadata); + @NonNull final Location location, float headPitch, + @Nullable final Vector velocity, @Nullable final WrappedDataWatcher metadata) { + super(global, viewDistance, location, players, velocity, metadata); // setup fields @@ -170,7 +170,6 @@ public SimpleLivingFakeEntity(final int entityId, @Nullable final UUID uuid, @No this.location = location; this.headPitch = headPitch; - this.velocity = velocity; this.metadata = metadata; @@ -251,6 +250,26 @@ public void despawn() { // Movement /////////////////////////////////////////////////////////////////////////// + protected boolean hasVelocity() { + return velocity.length() != 0; + } + + /** + * Updates the velocity packet initializing it if it haven;t been initialized. + * + * @apiNote call to this method guarantees that {@link #velocityPacket} won't be {@link null} after it + */ + protected void actualizeVelocityPacket() { + if (velocityPacket == null) { + velocityPacket = new WrapperPlayServerEntityVelocity(); + velocityPacket.setEntityID(entityId); + } + + velocityPacket.setVelocityX(velocity.getX()); + velocityPacket.setVelocityY(velocity.getY()); + velocityPacket.setVelocityZ(velocity.getZ()); + } + /** * Performs the movement of this living fake entity by given deltas and yaw and pitch specified * not performing any checks such as 8-block limit of deltas or angle minimization. @@ -262,6 +281,7 @@ public void despawn() { * @param pitch new pitch */ @Override + @SuppressWarnings("Duplicates") protected void performMove(final double dx, final double dy, final double dz, final float yaw, final float pitch) { if (visible) { if (pitch == 0 && yaw == 0) { @@ -274,20 +294,35 @@ protected void performMove(final double dx, final double dy, final double dz, fi movePacket.setDy((int) (dy * 32 * 128)); movePacket.setDz((int) (dz * 32 * 128)); - for (val entry : players.entrySet()) if (entry.getValue()) movePacket.sendPacket(entry.getKey()); + boolean hasVelocity = hasVelocity(); + if (hasVelocity) actualizeVelocityPacket(); + + for (val entry : players.entrySet()) if (entry.getValue()) { + val player = entry.getKey(); + + if (hasVelocity) velocityPacket.sendPacket(player); + movePacket.sendPacket(player); + } } else { if (moveLookPacket == null) { moveLookPacket = new WrapperPlayServerRelEntityMoveLook(); moveLookPacket.setEntityID(entityId); + } + + moveLookPacket.setDx((int) (dx * 32 * 128)); + moveLookPacket.setDy((int) (dy * 32 * 128)); + moveLookPacket.setDz((int) (dz * 32 * 128)); + moveLookPacket.setYaw(yaw); + moveLookPacket.setPitch(pitch); + + boolean hasVelocity = hasVelocity(); + if (hasVelocity) actualizeVelocityPacket(); - moveLookPacket.setDx((int) (dx * 32 * 128)); - moveLookPacket.setDy((int) (dy * 32 * 128)); - moveLookPacket.setDz((int) (dz * 32 * 128)); - moveLookPacket.setYaw(yaw); - moveLookPacket.setPitch(pitch); + for (val entry : players.entrySet()) if (entry.getValue()) { + val player = entry.getKey(); - for (val entry : players.entrySet()) if (entry.getValue()) moveLookPacket - .sendPacket(entry.getKey()); + if (hasVelocity) velocityPacket.sendPacket(player); + moveLookPacket.sendPacket(player); } } } @@ -304,6 +339,7 @@ protected void performMove(final double dx, final double dy, final double dz, fi * @param pitch new pitch */ @Override + @SuppressWarnings("Duplicates") protected void performTeleportation(final double x, final double y, final double z, final float yaw, final float pitch) { if (visible) { @@ -318,7 +354,15 @@ protected void performTeleportation(final double x, final double y, final double teleportPacket.setYaw(yaw + yawDelta); teleportPacket.setPitch(pitch + pitchDelta); - for (val entry : players.entrySet()) if (entry.getValue()) teleportPacket.sendPacket(entry.getKey()); + boolean hasVelocity = hasVelocity(); + if (hasVelocity) actualizeVelocityPacket(); + + for (val entry : players.entrySet()) if (entry.getValue()) { + val player = entry.getKey(); + + if (hasVelocity) velocityPacket.sendPacket(player); + teleportPacket.sendPacket(player); + } } } From ac86ebb43a7fdb80b5602d7807850fceb6d6b4a6 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 20 Feb 2019 23:21:11 +0300 Subject: [PATCH 150/508] Implement FakeEntityManagerGroup --- .../management/FakeEntityManagerGroup.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java new file mode 100644 index 000000000..1f4130ebe --- /dev/null +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java @@ -0,0 +1,68 @@ +package ru.progrm_jarvis.minecraft.fakeentitylib.entity.management; + +import com.google.common.collect.ImmutableList; +import lombok.*; +import lombok.experimental.FieldDefaults; +import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.minecraft.fakeentitylib.entity.FakeEntity; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Set; +import java.util.function.BiFunction; + + +/** + * Facade grouping multiple {@link FakeEntityManager}s into a single one. + * Its general methods delegate the calls to each of the managers. + * + * @param

type of parent plugin + * @param type of managed entity + */ +@ToString +@EqualsAndHashCode(callSuper = true) +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class FakeEntityManagerGroup

+ extends AbstractSetBasedEntityManager { + + @NonNull Collection> managers; + + @Override + public P getBukkitPlugin() { + return plugin; + } + + public FakeEntityManagerGroup(@NonNull final P plugin, + @NonNull final Set entities, + @NonNull final Collection, + ? extends FakeEntityManager>> managerCreators) { + super(plugin, entities); + + //noinspection UnstableApiUsage + managers = managerCreators.stream() + .map(managerCreator -> managerCreator.apply(plugin, entities)) + .collect(ImmutableList.toImmutableList()); + } + + @SafeVarargs + public FakeEntityManagerGroup(@NonNull final P plugin, + @NonNull final Set entities, + @NonNull final BiFunction, + ? extends FakeEntityManager>... managerCreators) { + this(plugin, entities, Arrays.asList(managerCreators)); + } + + @Override + public void manageEntity(@NonNull final E entity) { + super.manageEntity(entity); + + for (val manager : managers) manager.manageEntity(entity); + } + + @Override + public void unmanageEntity(@NonNull final E entity) { + super.unmanageEntity(entity); + + for (val manager : managers) manager.unmanageEntity(entity); + } +} From d61e49c664c439d8eed6c2fd8af5a60e49c30c36 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 20 Feb 2019 23:21:26 +0300 Subject: [PATCH 151/508] Small tweaks to FakeEntityManager classes --- .../entity/management/AbstractSetBasedEntityManager.java | 8 +------- .../entity/management/FakeEntityManager.java | 2 ++ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index 4adb62fbd..2961ad24f 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -1,6 +1,5 @@ package ru.progrm_jarvis.minecraft.fakeentitylib.entity.management; -import com.google.common.base.Preconditions; import lombok.*; import lombok.experimental.FieldDefaults; import org.bukkit.plugin.Plugin; @@ -12,8 +11,6 @@ import java.util.Collections; import java.util.Set; -import static ru.progrm_jarvis.minecraft.commons.util.hack.PreSuperCheck.beforeSuper; - /** * Simple abstract {@link FakeEntityManager} storing entities in a weak, optionally concurrent set. * @@ -45,10 +42,7 @@ public AbstractSetBasedEntityManager(@NonNull final P plugin, * @param concurrent whether or not this map should be thread-safe */ public AbstractSetBasedEntityManager(@Nonnull final P plugin, final boolean concurrent) { - this( - beforeSuper(plugin, () -> Preconditions.checkNotNull(plugin, "plugin should be nonnull")), - concurrent ? FakeEntityManager.concurrentWeakEntitySet() : FakeEntityManager.weakEntitySet() - ); + this(plugin, concurrent ? FakeEntityManager.concurrentWeakEntitySet() : FakeEntityManager.weakEntitySet()); } @Override diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index 1f9086fa0..cb2663310 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -2,6 +2,7 @@ import lombok.NonNull; import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.minecraft.commons.player.registry.ShouldBeRegisteredInPlayerRegistry; import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginContainer; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.FakeEntity; @@ -18,6 +19,7 @@ * to store managed entities weakly so that un-managing entity manually is not required * as if there are no strong references on it the GC should collect it. */ +@ShouldBeRegisteredInPlayerRegistry public interface FakeEntityManager

extends BukkitPluginContainer

{ /** From afba55e43e9faff0435794f8616be4911c58d6fc Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 21 Feb 2019 17:49:19 +0300 Subject: [PATCH 152/508] Rename LatestDataWatcherFactory to StandardDataWatcherFactory --- ...tDataWatcherFactory.java => StandardDataWatcherFactory.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/{LatestDataWatcherFactory.java => StandardDataWatcherFactory.java} (99%) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LatestDataWatcherFactory.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java similarity index 99% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LatestDataWatcherFactory.java rename to commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java index 41746afe6..6c2867597 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LatestDataWatcherFactory.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java @@ -12,7 +12,7 @@ /** * DataWatcher factory for post 1.9 versions. */ -public class LatestDataWatcherFactory implements DataWatcherFactory { +public class StandardDataWatcherFactory implements DataWatcherFactory { protected static final WrappedDataWatcher.Serializer BYTE_SERIALIZER = Registry.get(Byte.class), From 788be6202c82d317d00bb6268eaed3957266013f Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 21 Feb 2019 18:40:06 +0300 Subject: [PATCH 153/508] Import StandardDataWatcherFactory where needed --- .../java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java index ccbf39f09..0f210034f 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java @@ -8,7 +8,7 @@ import lombok.val; import org.bukkit.Bukkit; import ru.progrm_jarvis.minecraft.commons.nms.metadata.DataWatcherFactory; -import ru.progrm_jarvis.minecraft.commons.nms.metadata.LatestDataWatcherFactory; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.StandardDataWatcherFactory; import ru.progrm_jarvis.minecraft.commons.nms.metadata.LegacyDataWatcherFactory; import ru.progrm_jarvis.reflector.wrapper.FieldWrapper; import ru.progrm_jarvis.reflector.wrapper.fast.FastFieldWrapper; @@ -43,7 +43,7 @@ public class NmsUtil { * DataWatcher factory valid for current server version */ private final DataWatcherFactory DATA_WATCHER_FACTORY = NMS_VERSION.generation < 9 - ? new LegacyDataWatcherFactory() : new LatestDataWatcherFactory(); + ? new LegacyDataWatcherFactory() : new StandardDataWatcherFactory(); /** * Gets version of the current server. From 30ff6986d5f9b90d2642b95a538168ba078349e8 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 21 Feb 2019 18:46:39 +0300 Subject: [PATCH 154/508] Use classifiers for fat-JARs instead of separate modules --- commons-dep/pom.xml | 29 ----------------------------- commons/pom.xml | 9 +++++++++ config-dep/pom.xml | 29 ----------------------------- config/pom.xml | 9 +++++++++ fake-entity-dep/pom.xml | 29 ----------------------------- fake-entity/pom.xml | 9 +++++++++ pom.xml | 11 ++++------- 7 files changed, 31 insertions(+), 94 deletions(-) delete mode 100644 commons-dep/pom.xml delete mode 100644 config-dep/pom.xml delete mode 100644 fake-entity-dep/pom.xml diff --git a/commons-dep/pom.xml b/commons-dep/pom.xml deleted file mode 100644 index 929bcf807..000000000 --- a/commons-dep/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 4.0.0 - - minecraft-utils - ru.progrm-jarvis.minecraft - 0.1.0-SNAPSHOT - - minecraft-commons-dep - - minecraft-commons module with all dependencies shaded - - - - - org.apache.maven.plugins - maven-shade-plugin - - - - - - - ${project.parent.groupId} - minecraft-commons - - - \ No newline at end of file diff --git a/commons/pom.xml b/commons/pom.xml index aaa119a0e..77ed869ad 100644 --- a/commons/pom.xml +++ b/commons/pom.xml @@ -9,6 +9,15 @@ minecraft-commons + + + + org.apache.maven.plugins + maven-shade-plugin + + + + ${project.parent.groupId} diff --git a/config-dep/pom.xml b/config-dep/pom.xml deleted file mode 100644 index d263f0a68..000000000 --- a/config-dep/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 4.0.0 - - minecraft-utils - ru.progrm-jarvis.minecraft - 0.1.0-SNAPSHOT - - ez-cfg-dep - - ez-cfg module with all dependencies shaded - - - - - org.apache.maven.plugins - maven-shade-plugin - - - - - - - ${project.parent.groupId} - ez-cfg - - - \ No newline at end of file diff --git a/config/pom.xml b/config/pom.xml index 0a18e8d5f..32d904e7b 100644 --- a/config/pom.xml +++ b/config/pom.xml @@ -9,6 +9,15 @@ ez-cfg + + + + org.apache.maven.plugins + maven-shade-plugin + + + + org.spigotmc diff --git a/fake-entity-dep/pom.xml b/fake-entity-dep/pom.xml deleted file mode 100644 index 73451135b..000000000 --- a/fake-entity-dep/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 4.0.0 - - minecraft-utils - ru.progrm-jarvis.minecraft - 0.1.0-SNAPSHOT - - fake-entity-lib-dep - - fake-entity-lib module with all dependencies shaded - - - - - org.apache.maven.plugins - maven-shade-plugin - - - - - - - ${project.parent.groupId} - fake-entity-lib - - - \ No newline at end of file diff --git a/fake-entity/pom.xml b/fake-entity/pom.xml index a82d36409..fc9364f58 100644 --- a/fake-entity/pom.xml +++ b/fake-entity/pom.xml @@ -11,6 +11,15 @@ jar + + + + org.apache.maven.plugins + maven-shade-plugin + + + + ru.progrm-jarvis.minecraft diff --git a/pom.xml b/pom.xml index 0ddf432c4..563faa9a2 100644 --- a/pom.xml +++ b/pom.xml @@ -12,16 +12,9 @@ 0.1.0-SNAPSHOT mc-unit - commons - commons-dep - config - config-dep - fake-entity - fake-entity-dep - lib-loader pom @@ -123,6 +116,10 @@ shade + + true + with-dependencies + From e14859ee1129478e140617f4e194b94a76adf3a5 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 19:22:16 +0300 Subject: [PATCH 155/508] Use non-beta Guava API in StructureDescriptor --- .../fakeentitylib/misc/structure/StructureDescriptor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java index 6b0fcc39b..ba63b7924 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java @@ -149,9 +149,10 @@ public BiMap getElements() { } public List getOrderedKeyframes() { - return Arrays.stream(keyframes) + return ImmutableList.copyOf(Arrays.stream(keyframes) .sorted(Comparator.comparing(keyframe -> keyframe.tick)) - .collect(ImmutableList.toImmutableList()); + .toArray(Keyframe[]::new) + ); } @Data From bea3c8c74eb7ebc4782fbd9836da0ef3839ba5eb Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 19:23:22 +0300 Subject: [PATCH 156/508] Use non-betaUse non-beta Guava API in FakeEntityManagerGroup --- .../entity/management/FakeEntityManagerGroup.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java index 1f4130ebe..84d48696e 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java @@ -38,10 +38,11 @@ public FakeEntityManagerGroup(@NonNull final P plugin, ? extends FakeEntityManager>> managerCreators) { super(plugin, entities); - //noinspection UnstableApiUsage - managers = managerCreators.stream() + //noinspection unchecked + managers = ImmutableList.copyOf(managerCreators.stream() .map(managerCreator -> managerCreator.apply(plugin, entities)) - .collect(ImmutableList.toImmutableList()); + .toArray(FakeEntityManager[]::new) + ); } @SafeVarargs From ba10a508a6b227938789150c1a52130fc0804914 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 19:24:14 +0300 Subject: [PATCH 157/508] Omit #beforeSuper(..) in ProtocolBasedFakeEntityInteractionHandler --- .../ProtocolBasedFakeEntityInteractionHandler.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java index 5e1adc41e..8b5c606ec 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java @@ -6,7 +6,6 @@ import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.wrappers.EnumWrappers; -import com.google.common.base.Preconditions; import lombok.*; import lombok.experimental.FieldDefaults; import org.bukkit.plugin.Plugin; @@ -17,7 +16,7 @@ import java.util.Collections; import java.util.Set; -import static ru.progrm_jarvis.minecraft.commons.util.hack.PreSuperCheck.beforeSuper; +import static com.google.common.base.Preconditions.checkNotNull; @ToString @EqualsAndHashCode(callSuper = true) @@ -31,7 +30,7 @@ public class ProtocolBasedFakeEntityInteractionHandler

Preconditions.checkNotNull(plugin, "plugin should not be null")), + checkNotNull(plugin, "plugin should not be null"), PacketType.Play.Client.USE_ENTITY ); @@ -86,6 +85,11 @@ public int managedEntitiesSize() { return entities.size(); } + @Override + public boolean isManaged(@NonNull final E entity) { + return entities.contains(entity); + } + @Override public Collection getManagedEntities() { return entities; From 3b26fb92c6dbc5f2986f7ba85f152ade5a0c270a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 19:25:11 +0300 Subject: [PATCH 158/508] Use non-Lombok null-check in ProtocolBasedFakeEntityInteractionHandler --- .../behaviour/ProtocolBasedFakeEntityInteractionHandler.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java index 8b5c606ec..0fbfb2c55 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java @@ -12,6 +12,7 @@ import ru.progrm_jarvis.minecraft.fakeentitylib.entity.behaviour.FakeEntityInteraction.Hand; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.management.FakeEntityManager; +import javax.annotation.Nonnull; import java.util.Collection; import java.util.Collections; import java.util.Set; @@ -28,7 +29,7 @@ public class ProtocolBasedFakeEntityInteractionHandler

entities; Set entitiesView; - public ProtocolBasedFakeEntityInteractionHandler(@NonNull final P plugin, final boolean concurrent) { + public ProtocolBasedFakeEntityInteractionHandler(@Nonnull final P plugin, final boolean concurrent) { super( checkNotNull(plugin, "plugin should not be null"), PacketType.Play.Client.USE_ENTITY From 8d88c4df3f36bdd00f2bc6a642a201c555f1e462 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 19:25:49 +0300 Subject: [PATCH 159/508] Docs: use generic type reference in FakeEntityManager --- .../fakeentitylib/entity/management/FakeEntityManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index cb2663310..1c996c49c 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -83,7 +83,7 @@ static Map concurrentWeakEntityMap() { * * @param entity entity to manage * - * @apiNote Normally management should happen until {@link #unmanageEntity(FakeEntity)} is called with this entity + * @apiNote Normally management should happen until {@link #unmanageEntity(E)} is called with this entity * or (in most cases) if the entity is no longer non-weakly referenced. */ void manageEntity(@NonNull E entity); From 72d44a33847537f620a62aa72062a092c9538847 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 19:26:28 +0300 Subject: [PATCH 160/508] Add FakeEntityManager#isManages(..) --- .../AbstractSetBasedEntityManager.java | 5 ++++ .../entity/management/FakeEntityManager.java | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index 2961ad24f..5f0cef99a 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -55,6 +55,11 @@ public int managedEntitiesSize() { return entities.size(); } + @Override + public boolean isManaged(@NonNull final E entity) { + return entities.contains(entity); + } + @Override public Collection getManagedEntities() { return entitiesView; diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index 1c996c49c..256727c48 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -97,4 +97,27 @@ static Map concurrentWeakEntityMap() { * as this interface specification recommends storing entities weakly. */ void unmanageEntity(@NonNull E entity); + + /** + * Retrieves whether or not the specified entity is managed by this manager. + * + * @param entity entity to check + * @return {@code true} if this entity manager manages the specified entity and {@code false} otherwise + */ + boolean isManaged(@NonNull final E entity); + + /** + * Removes the entity managed by this manager. + * This is a logical equivalent of calling {@link #unmanageEntity(E)} and {@link E#remove()} + * + * @param entity entity to remove + * + * @apiNote if the entity is not managed by this manager then no exception should be thrown + * but the removal should happen + */ + default void remove(@NonNull E entity) { + unmanageEntity(entity); + + entity.remove(); + } } From 4fae98c6d5a88a454d602f55a622daeb5b2d8761 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 19:33:27 +0300 Subject: [PATCH 161/508] Add #remove() to FakeEntity --- .../minecraft/fakeentitylib/entity/FakeEntity.java | 5 +++++ .../fakeentitylib/entity/SimpleLivingFakeEntity.java | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java index 1477eafd6..52f738d8d 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java @@ -51,4 +51,9 @@ public interface FakeEntity extends PlayerContainer { * @param visible {@code true} if this fake entity should be visible or {@code false} if it should be invisible */ void setVisible(boolean visible); + + /** + * Removes the fake entity which guarantees that no other cleanups will be required. + */ + void remove(); } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 728c3fd6c..cb8fe999b 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -419,4 +419,11 @@ public void setVisible(final boolean visible) { if (visible) spawn(); else despawn(); } + + @Override + public void remove() { + despawn(); + + players.clear(); + } } From a58ef2c03dd4bd8176535dc685d690eacc0e7ee3 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 19:41:15 +0300 Subject: [PATCH 162/508] Override #remove() in FakeEntityManagerGroup --- .../entity/management/FakeEntityManagerGroup.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java index 84d48696e..c4a705fa4 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java @@ -66,4 +66,11 @@ public void unmanageEntity(@NonNull final E entity) { for (val manager : managers) manager.unmanageEntity(entity); } + + @Override + public void remove(@NonNull final E entity) { + for (val manager : managers) manager.unmanageEntity(entity); + + entity.remove(); + } } From 09897729eb06b8b2e8b3f6642e5a547c0ca7190e Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 21:15:06 +0300 Subject: [PATCH 163/508] Add PlayerUtil#getOnlinePlayers() --- .../minecraft/commons/player/PlayerUtil.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java index 8476273f6..02e6a6ccb 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java @@ -12,6 +12,16 @@ @UtilityClass public class PlayerUtil { + /** + * Gets online players as a collection of exact {@link Player} type. + * + * @return a view of currently online players cast to exact type + */ + @SuppressWarnings("unchecked") + public Collection getOnlinePlayers() { + return (Collection) Bukkit.getOnlinePlayers(); + } + public Collection playersAround(@NonNull final Location location, final double radius) { return Bukkit.getOnlinePlayers().stream() .filter(player -> player.getLocation().distance(location) <= radius) From 4991aaf7a2d44b224dd7c65fa9a0e5903b5d4d3b Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 21:18:04 +0300 Subject: [PATCH 164/508] Use PlayerUtil.getOnlinePlayers() where needed --- .../commons/player/collection/PlayerContainer.java | 5 ++--- .../commons/player/collection/PlayerContainers.java | 7 +++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java index cefbc07ff..291f34675 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java @@ -1,11 +1,10 @@ package ru.progrm_jarvis.minecraft.commons.player.collection; import lombok.val; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import ru.progrm_jarvis.minecraft.commons.player.PlayerUtil; import java.util.Collection; -import java.util.Collections; /** * An object which may store players. @@ -49,7 +48,7 @@ default void addPlayers(final Collection players) { } default void addOnlinePlayers() { - addPlayers(Collections.unmodifiableCollection(Bukkit.getOnlinePlayers())); + addPlayers(PlayerUtil.getOnlinePlayers()); } /** diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java index 933ddc3c9..f33033932 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java @@ -3,10 +3,9 @@ import lombok.NonNull; import lombok.Value; import lombok.experimental.UtilityClass; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import ru.progrm_jarvis.minecraft.commons.player.PlayerUtil; -import java.util.ArrayList; import java.util.Collection; import java.util.Map; import java.util.function.Function; @@ -35,7 +34,7 @@ public PlayerContainerCollectionWrapper(@NonNull final Collection collec this.collection = collection; this.global = global; - if (global) addPlayers(new ArrayList<>(Bukkit.getOnlinePlayers())); + if (global) addPlayers(PlayerUtil.getOnlinePlayers()); } @Override @@ -73,7 +72,7 @@ public PlayerContainerMapWrapper(@NonNull final Map map, this.defaultValueSupplier = defaultValueSupplier; this.global = global; - if (global) addPlayers(new ArrayList<>(Bukkit.getOnlinePlayers())); + if (global) addPlayers(PlayerUtil.getOnlinePlayers()); } @Override From 2e962e4f0f4ae38c25e5f179d31c867fc9d4366b Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 21:23:39 +0300 Subject: [PATCH 165/508] Use addOnlinePlayers() in PlayerContainers --- .../commons/player/collection/PlayerContainers.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java index f33033932..ab105782b 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java @@ -4,7 +4,6 @@ import lombok.Value; import lombok.experimental.UtilityClass; import org.bukkit.entity.Player; -import ru.progrm_jarvis.minecraft.commons.player.PlayerUtil; import java.util.Collection; import java.util.Map; @@ -34,7 +33,7 @@ public PlayerContainerCollectionWrapper(@NonNull final Collection collec this.collection = collection; this.global = global; - if (global) addPlayers(PlayerUtil.getOnlinePlayers()); + if (global) addOnlinePlayers(); } @Override @@ -72,7 +71,7 @@ public PlayerContainerMapWrapper(@NonNull final Map map, this.defaultValueSupplier = defaultValueSupplier; this.global = global; - if (global) addPlayers(PlayerUtil.getOnlinePlayers()); + if (global) addOnlinePlayers(); } @Override From b92cf4c734e1a76bfb6f01fca0c1a497474945f7 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 28 Feb 2019 21:24:23 +0300 Subject: [PATCH 166/508] Fix typo: PlayerContainer: removePlayers -> removePlayers --- .../minecraft/commons/player/collection/PlayerContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java index 291f34675..48e34847b 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java @@ -63,7 +63,7 @@ default void addOnlinePlayers() { * * @param players players to remove */ - default void removePlayesr(final Player... players) { + default void removePlayers(final Player... players) { for (val player : players) removePlayer(player); } From 9cd9eba6346de00369d7e375953835839fb78563 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 2 Mar 2019 22:38:14 +0300 Subject: [PATCH 167/508] Update SimpleLivingFakeEntity to legacy-support PacketWrapper fork --- .../fakeentitylib/entity/SimpleLivingFakeEntity.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index cb8fe999b..fa36b88d9 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -290,9 +290,9 @@ protected void performMove(final double dx, final double dy, final double dz, fi movePacket.setEntityID(entityId); } - movePacket.setDx((int) (dx * 32 * 128)); - movePacket.setDy((int) (dy * 32 * 128)); - movePacket.setDz((int) (dz * 32 * 128)); + movePacket.setDx(dx); + movePacket.setDy(dy); + movePacket.setDz(dz); boolean hasVelocity = hasVelocity(); if (hasVelocity) actualizeVelocityPacket(); @@ -309,9 +309,9 @@ protected void performMove(final double dx, final double dy, final double dz, fi moveLookPacket.setEntityID(entityId); } - moveLookPacket.setDx((int) (dx * 32 * 128)); - moveLookPacket.setDy((int) (dy * 32 * 128)); - moveLookPacket.setDz((int) (dz * 32 * 128)); + moveLookPacket.setDx(dx); + moveLookPacket.setDy(dy); + moveLookPacket.setDz(dz); moveLookPacket.setYaw(yaw); moveLookPacket.setPitch(pitch); From 2c080d6417af858d2211f57c83d813c4fa7fba5f Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 2 Mar 2019 23:20:06 +0300 Subject: [PATCH 168/508] Update FakeEntityInteraction.Hand adding legacy support --- .../entity/behaviour/FakeEntityInteraction.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java index 9455bb494..bdffaa1f0 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java @@ -4,6 +4,7 @@ import lombok.experimental.FieldDefaults; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.util.Vector; +import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; public interface FakeEntityInteraction { @@ -116,18 +117,19 @@ class ExactInteractInteraction implements FakeEntityInteraction { @Override public Type getType() { - return Type.EXACT_INTERACTION; + return Type.EXACT_INTERACT; } } @RequiredArgsConstructor enum Hand { - MAIN(EquipmentSlot.HAND), OFF(EquipmentSlot.OFF_HAND); + MAIN(EquipmentSlot.HAND), + OFF(NmsUtil.getVersion().getGeneration() > 8 ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND); @Getter final EquipmentSlot slot; } enum Type { - INTERACT, ATTACK, EXACT_INTERACTION + INTERACT, ATTACK, EXACT_INTERACT } } \ No newline at end of file From e1769114c1ba540e95e92a574631e972f140661e Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 3 Mar 2019 00:48:00 +0300 Subject: [PATCH 169/508] Use all generics in FakeEntityManager collection shorthands --- .../entity/management/FakeEntityManager.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index 256727c48..a7de691b4 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -25,40 +25,42 @@ public interface FakeEntityManager

exten /** * Creates a new weak {@link Set} valid (and recommended) for storing entities * - * @param type of entities stored + * @param type of value stored * @return new weak {@link Set} for storing entities */ - static Set weakEntitySet() { + static Set weakEntitySet() { return Collections.newSetFromMap(new WeakHashMap<>()); } /** * Creates a new weak concurrent {@link Set} valid (and recommended) for storing entities * - * @param type of entities stored + * @param type of value stored * @return new weak concurrent {@link Set} for storing entities */ - static Set concurrentWeakEntitySet() { + static Set concurrentWeakEntitySet() { return ConcurrentCollections.concurrentSetFromMap(new WeakHashMap<>()); } /** * Creates a new weak {@link Set} valid (and recommended) for storing entities * - * @param type of entities stored + * @param type of key + * @param type of value * @return new weak {@link Set} for storing entities */ - static Map weakEntityMap() { + static Map weakEntityMap() { return new WeakHashMap<>(); } /** * Creates a new weak concurrent {@link Map} valid (and recommended) for storing entities * - * @param type of entities stored + * @param type of key + * @param type of value * @return new weak concurrent {@link Map} for storing entities */ - static Map concurrentWeakEntityMap() { + static Map concurrentWeakEntityMap() { return ConcurrentCollections.concurrentMap(new WeakHashMap<>()); } From 731a16517ec0c4a6f406efd0ab28351e1b996b2b Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 3 Mar 2019 20:15:24 +0300 Subject: [PATCH 170/508] Rename x/y/zDelta's to x/y/zLocationOffset's in SimpleLivingFakeEntity --- .../entity/ArmorStandBlockItem.java | 2 +- .../entity/SimpleLivingFakeEntity.java | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 00463798d..815f1ef2e 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -82,7 +82,7 @@ public ArmorStandBlockItem(@Nullable final UUID uuid, equipmentPacket.setItem(this.item = item); // actual block-item position (head of armorstand) is one block higher than its coordinate so normalize it - yDelta = -1; + yLocationOffset = -1; } /** diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index fa36b88d9..4eae496c4 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -123,15 +123,15 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * Difference between the actual entity x and its visible value */ - double xDelta, + double xLocationOffset, /** * Difference between the actual entity y and its visible value */ - yDelta, + yLocationOffset, /** * Difference between the actual entity z and its visible value */ - zDelta; + zLocationOffset; /** * Difference between the actual entity yaw and its visible value @@ -205,9 +205,9 @@ protected void performDespawnNoChecks(final Player player) { } protected void actualizeSpawnPacket() { - spawnPacket.setX(location.getX() + xDelta); - spawnPacket.setY(location.getY() + yDelta); - spawnPacket.setZ(location.getZ() + zDelta); + spawnPacket.setX(location.getX() + xLocationOffset); + spawnPacket.setY(location.getY() + yLocationOffset); + spawnPacket.setZ(location.getZ() + zLocationOffset); spawnPacket.setPitch(location.getPitch() + pitchDelta); spawnPacket.setYaw(location.getYaw() + yawDelta); @@ -348,9 +348,9 @@ protected void performTeleportation(final double x, final double y, final double teleportPacket.setEntityID(entityId); } - teleportPacket.setX(x + xDelta); - teleportPacket.setY(y + yDelta); - teleportPacket.setZ(z + zDelta); + teleportPacket.setX(x + xLocationOffset); + teleportPacket.setY(y + yLocationOffset); + teleportPacket.setZ(z + zLocationOffset); teleportPacket.setYaw(yaw + yawDelta); teleportPacket.setPitch(pitch + pitchDelta); From e99bc7a83a956a0d9c9e9d53db9559ab4519d9cc Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 3 Mar 2019 20:17:37 +0300 Subject: [PATCH 171/508] Style: add missing blank line --- .../minecraft/commons/nms/metadata/DataWatcherFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java index f8a927a59..25a52853c 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java @@ -114,6 +114,7 @@ default WrappedWatchableObject createWatchable(final int id, final ItemStack val * @return created watchable object */ WrappedWatchableObject createWatchableVector3f(int id, Object value); + /** * Creates watchable object for {@link Vector3F} value at index specified. * From 41c4fd1d3fea9c265dada7b7a983c609e8c17560 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 3 Mar 2019 20:18:31 +0300 Subject: [PATCH 172/508] Fix boolean issue in LegacyDataWatcherFactory --- .../commons/nms/metadata/LegacyDataWatcherFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java index 9d0e32af7..6f03d89b3 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java @@ -62,7 +62,7 @@ public WrappedWatchableObject createWatchableOptionalIBlockData(final int id, fi @Override public WrappedWatchableObject createWatchable(final int id, final Boolean value) { - return new WrappedWatchableObject(id, value); + return createWatchable(id, value ? (byte) 0x1 : (byte) 0x0); } @Override @@ -179,7 +179,7 @@ public DataWatcherModifier setOptionalIBlockData(final int id, final Optional Date: Sun, 3 Mar 2019 20:41:55 +0300 Subject: [PATCH 173/508] Rename offsets in SimpleLivingFakeEntity (again <3) --- .../entity/ArmorStandBlockItem.java | 2 +- .../entity/SimpleLivingFakeEntity.java | 30 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 815f1ef2e..e7a23c642 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -82,7 +82,7 @@ public ArmorStandBlockItem(@Nullable final UUID uuid, equipmentPacket.setItem(this.item = item); // actual block-item position (head of armorstand) is one block higher than its coordinate so normalize it - yLocationOffset = -1; + yOffset = -1; } /** diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 4eae496c4..920c3e294 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -123,25 +123,25 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * Difference between the actual entity x and its visible value */ - double xLocationOffset, + double xOffset, /** * Difference between the actual entity y and its visible value */ - yLocationOffset, + yOffset, /** * Difference between the actual entity z and its visible value */ - zLocationOffset; + zOffset; /** * Difference between the actual entity yaw and its visible value */ - float yawDelta = 0, + float yawOffset = 0, /** * Difference between the actual entity pitch and its visible value */ - pitchDelta = 0, + pitchOffset = 0, /** * Difference between the actual entity head pitch and its visible value @@ -205,12 +205,12 @@ protected void performDespawnNoChecks(final Player player) { } protected void actualizeSpawnPacket() { - spawnPacket.setX(location.getX() + xLocationOffset); - spawnPacket.setY(location.getY() + yLocationOffset); - spawnPacket.setZ(location.getZ() + zLocationOffset); + spawnPacket.setX(location.getX() + xOffset); + spawnPacket.setY(location.getY() + yOffset); + spawnPacket.setZ(location.getZ() + zOffset); - spawnPacket.setPitch(location.getPitch() + pitchDelta); - spawnPacket.setYaw(location.getYaw() + yawDelta); + spawnPacket.setPitch(location.getPitch() + pitchOffset); + spawnPacket.setYaw(location.getYaw() + yawOffset); spawnPacket.setHeadPitch(headPitch + headPitchDelta); if (velocity != null) { @@ -348,11 +348,11 @@ protected void performTeleportation(final double x, final double y, final double teleportPacket.setEntityID(entityId); } - teleportPacket.setX(x + xLocationOffset); - teleportPacket.setY(y + yLocationOffset); - teleportPacket.setZ(z + zLocationOffset); - teleportPacket.setYaw(yaw + yawDelta); - teleportPacket.setPitch(pitch + pitchDelta); + teleportPacket.setX(x + xOffset); + teleportPacket.setY(y + yOffset); + teleportPacket.setZ(z + zOffset); + teleportPacket.setYaw(yaw + yawOffset); + teleportPacket.setPitch(pitch + pitchOffset); boolean hasVelocity = hasVelocity(); if (hasVelocity) actualizeVelocityPacket(); From 1e77e46458c95cbec761506c8a2590f6d5cbf2bd Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 19:44:30 +0300 Subject: [PATCH 174/508] Add Shutdownable --- .../commons/util/shutdown/Shutdownable.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java new file mode 100644 index 000000000..f5eefe0a6 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java @@ -0,0 +1,15 @@ +package ru.progrm_jarvis.minecraft.commons.util.shutdown; + +/** + * An object which may be shutdown and should be once its usage is over. + */ +@FunctionalInterface +public interface Shutdownable { + + /** + * Shuts this object down. + * + * @apiNote this means that the object may be unusable in future + */ + void shutdown(); +} From 1a8f91be24990e574e5b8f4855f2f9acd91aab9d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 19:46:05 +0300 Subject: [PATCH 175/508] Small tweaks to FluentBukkitEvents --- .../commons/event/FluentBukkitEvents.java | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java index 911e6a51b..3e36aa93e 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java @@ -13,6 +13,7 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; +import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import java.util.Deque; import java.util.Map; @@ -83,6 +84,8 @@ public EventListenerRegistration(@NonNull final Class type) { */ @SuppressWarnings("unchecked") private EventListenersGroup getListenersGroup() { + checkNotNull(plugin, "plugin has not been set"); + return (EventListenersGroup) LISTENERS_GROUPS.computeIfAbsent( new ListenerConfiguration<>(plugin, type, priority), configuration -> new EventListenersGroup<>((ListenerConfiguration) configuration) @@ -95,26 +98,12 @@ private EventListenersGroup getListenersGroup() { * @param listener listener to use for event handling * @return unregister to use for event unregistration */ - public Unregister register(@NonNull final UncheckedConsumer listener) { - checkNotNull(plugin, "plugin has not been set"); - + public Shutdownable register(@NonNull final UncheckedConsumer listener) { val listenersGroup = getListenersGroup(); listenersGroup.addListener(listener); return () -> listenersGroup.removeListener(listener); } - - /** - * Object used for unregistering the registered event - */ - @FunctionalInterface - public interface Unregister { - - /** - * Unregisters the registered event - */ - void unregister(); - } } /** From 5f9c28933a434a060d1c9a5af9e140a5458fad31 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 20:18:26 +0300 Subject: [PATCH 176/508] Rework PlayerRegistry-related annotations and dependant constructors --- .../display/ProtocolBasedMapImageDisplay.java | 19 ++++--- .../registry/PlayerRegistryRegistration.java | 56 +++++++++++++++++++ .../RegistersSelfInPlayerRegistry.java | 13 ----- .../ShouldBeRegisteredInPlayerRegistry.java | 13 ----- .../AbstractPlayerContainingFakeEntity.java | 2 + .../entity/SimpleLivingFakeEntity.java | 14 +---- .../entity/management/FakeEntityManager.java | 2 - .../management/FakeEntityManagerGroup.java | 2 + 8 files changed, 74 insertions(+), 47 deletions(-) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java delete mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/RegistersSelfInPlayerRegistry.java delete mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index f8188f845..505e7404b 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -8,15 +8,15 @@ import org.bukkit.plugin.Plugin; import ru.progrm_jarvis.minecraft.commons.mapimage.MapImage; import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistries; -import ru.progrm_jarvis.minecraft.commons.player.registry.RegistersSelfInPlayerRegistry; +import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistry; +import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistryRegistration; import ru.progrm_jarvis.minecraft.commons.util.MapUtil; import javax.annotation.Nonnull; import java.util.Collection; -import java.util.HashMap; import java.util.Map; +import java.util.Optional; -@RegistersSelfInPlayerRegistry @ToString @EqualsAndHashCode @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) @@ -26,19 +26,22 @@ public class ProtocolBasedMapImageDisplay implements MapImageDisplay { @NonNull Map playerMaps; @Getter boolean global; + @PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.AUTO) public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull final Map playerMaps, - @NonNull final Plugin plugin, final boolean global) { + @NonNull final Plugin plugin, final boolean global, + @NonNull final PlayerRegistry playerRegistry) { this.image = image; this.playerMaps = playerMaps; this.global = global; - PlayerRegistries.registerInDefaultRegistry(plugin, this); + playerRegistry.register(this); image.subscribeOnUpdates(this::sendDeltaToAllPlayers); } - public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull final Plugin plugin, - final boolean global) { - this(image, new HashMap<>(), plugin, global); + @PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.AUTO) + public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull final Map playerMaps, + @NonNull final Plugin plugin, final boolean global) { + this(image, playerMaps, plugin, global, PlayerRegistries.defaultRegistry(plugin)); } @Override diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java new file mode 100644 index 000000000..126f15cb0 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java @@ -0,0 +1,56 @@ +package ru.progrm_jarvis.minecraft.commons.player.registry; + +import java.lang.annotation.*; + +import static java.lang.annotation.ElementType.*; + +/** + * Marker to indicate how the object handles registration in {@link PlayerRegistry}. + * + * @apiNote When applied to constructor it indicates the policy for this exact constructor. When applied + * to the class itself it indicates the default policy for all constructors except for explicitly annotated. + */ +@Inherited +@Documented +@Target({TYPE, CONSTRUCTOR}) +@Retention(RetentionPolicy.SOURCE) +public @interface PlayerRegistryRegistration { + + /** + * Type of object registration policy used by it. + * + * @return registration policy for the object + * + * @apiNote default value is not provided to force explicit specification + */ + Policy value(); + + /** + * The way registration in {@link PlayerRegistry} happens for this object. + */ + enum Policy { + + /** + * Object registers itself automatically and so is not expected to be registered manually. + * + * @apiNote if the object accepts {@link PlayerRegistry} in constructor which will be used for registration + * then it is also considered as an automatic registration. + */ + AUTO, + + /** + * The user of the object should register the object manually. + */ + MANUAL, + + /** + * The object doesn't register itself and the user of the object is not forces to. + */ + OPTIONAL, + + /** + * The object should not be registered. + */ + NEVER + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/RegistersSelfInPlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/RegistersSelfInPlayerRegistry.java deleted file mode 100644 index 359eda8c1..000000000 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/RegistersSelfInPlayerRegistry.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.player.registry; - -import java.lang.annotation.*; - -/** - * Marker to indicate that the annotated type self-registered in {@link PlayerRegistries} whenever instantiated. - */ -@Inherited -@Documented -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.SOURCE) -public @interface RegistersSelfInPlayerRegistry { -} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java deleted file mode 100644 index 614348b82..000000000 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/ShouldBeRegisteredInPlayerRegistry.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.player.registry; - -import java.lang.annotation.*; - -/** - * Marker to indicate that the annotated type should be registered in {@link PlayerRegistry} whenever instantiated. - */ -@Inherited -@Documented -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.SOURCE) -public @interface ShouldBeRegisteredInPlayerRegistry { -} diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java index 9a1975ba6..d68ef5b88 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java @@ -4,6 +4,7 @@ import lombok.experimental.FieldDefaults; import org.bukkit.Location; import org.bukkit.entity.Player; +import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistryRegistration; import java.util.Collection; import java.util.HashSet; @@ -15,6 +16,7 @@ @ToString @EqualsAndHashCode(callSuper = false) @FieldDefaults(level = AccessLevel.PROTECTED) +@PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.MANUAL) public abstract class AbstractPlayerContainingFakeEntity extends AbstractObservableFakeEntity { @NonNull final Map players; diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 920c3e294..fcf4a633f 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -9,7 +9,6 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -import ru.progrm_jarvis.minecraft.commons.player.registry.ShouldBeRegisteredInPlayerRegistry; import javax.annotation.Nullable; import java.util.Map; @@ -18,7 +17,6 @@ /** * A simple living entity self-sustained for direct usage. */ -@ShouldBeRegisteredInPlayerRegistry @ToString @EqualsAndHashCode(callSuper = true) @FieldDefaults(level = AccessLevel.PROTECTED) @@ -213,15 +211,9 @@ protected void actualizeSpawnPacket() { spawnPacket.setYaw(location.getYaw() + yawOffset); spawnPacket.setHeadPitch(headPitch + headPitchDelta); - if (velocity != null) { - spawnPacket.setVelocityX(velocity.getX()); - spawnPacket.setVelocityY(velocity.getY()); - spawnPacket.setVelocityZ(velocity.getZ()); - } else { - spawnPacket.setVelocityX(0); - spawnPacket.setVelocityY(0); - spawnPacket.setVelocityZ(0); - } + spawnPacket.setVelocityX(velocity.getX()); + spawnPacket.setVelocityY(velocity.getY()); + spawnPacket.setVelocityZ(velocity.getZ()); if (metadata != null) spawnPacket.setMetadata(metadata); } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index a7de691b4..663ff307d 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -2,7 +2,6 @@ import lombok.NonNull; import org.bukkit.plugin.Plugin; -import ru.progrm_jarvis.minecraft.commons.player.registry.ShouldBeRegisteredInPlayerRegistry; import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginContainer; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.FakeEntity; @@ -19,7 +18,6 @@ * to store managed entities weakly so that un-managing entity manually is not required * as if there are no strong references on it the GC should collect it. */ -@ShouldBeRegisteredInPlayerRegistry public interface FakeEntityManager

extends BukkitPluginContainer

{ /** diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java index c4a705fa4..84c209aa7 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java @@ -4,6 +4,7 @@ import lombok.*; import lombok.experimental.FieldDefaults; import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistryRegistration; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.FakeEntity; import java.util.Arrays; @@ -22,6 +23,7 @@ @ToString @EqualsAndHashCode(callSuper = true) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +@PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.MANUAL) public class FakeEntityManagerGroup

extends AbstractSetBasedEntityManager { From 24e0e93f4095eadc2f6432f81ca44c0c90d413ae Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 20:19:00 +0300 Subject: [PATCH 177/508] Change type of MapImageDisplay#getMapId(Player) --- .../commons/mapimage/display/MapImageDisplay.java | 9 ++++++--- .../mapimage/display/ProtocolBasedMapImageDisplay.java | 6 +++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java index d79a2d411..674ca5e7e 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java @@ -1,9 +1,12 @@ package ru.progrm_jarvis.minecraft.commons.mapimage.display; +import lombok.NonNull; import org.bukkit.entity.Player; import ru.progrm_jarvis.minecraft.commons.mapimage.MapImage; import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainer; +import java.util.Optional; + /** * Display of {@link MapImage}. * It is responsible for displaying actual images to the players and resolving map-ID conflicts. @@ -21,8 +24,8 @@ public interface MapImageDisplay extends PlayerContainer { * Gets the map ID used by this map image display for the player specified. * * @param player player whose map ID for this image display to get - * @return map ID used by this map image display for the player - * or {@code null} if there is none (this display is not used for the player) + * @return optional containing map ID used by this map image display for the player + * or empty optional if none (this display is not used for the player) */ - Integer getMapId(Player player); + @NonNull Optional getMapId(@NonNull Player player); } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index 505e7404b..a2b998106 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -125,9 +125,9 @@ public Collection getPlayers() { } @Override - public Integer getMapId(final Player player) { - return MapUtil.getOrDefault( - playerMaps, player, map -> PlayerMapManager.getMapId(map).intValue(), (Integer) null + @NonNull public Optional getMapId(@NonNull final Player player) { + return MapUtil.>getOrDefault( + playerMaps, player, map -> Optional.of(PlayerMapManager.getMapId(map)), Optional::empty ); } } From 230f667e29df1098cb54772e7323c44b5aecc998 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 20:50:13 +0300 Subject: [PATCH 178/508] Advance Shutdownable API --- .../ObjectAlreadyShutDownException.java | 38 +++++ .../commons/util/shutdown/ShutdownHooks.java | 161 ++++++++++++++++++ .../commons/util/shutdown/Shutdownable.java | 7 +- 3 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java new file mode 100644 index 000000000..f4c6e0ba0 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java @@ -0,0 +1,38 @@ +package ru.progrm_jarvis.minecraft.commons.util.shutdown; + +import lombok.NonNull; + +import javax.annotation.Nullable; + +/** + * An exception which may be thrown whenever {@link Shutdownable#shutdown()} + * is called multiple times on an object which becomes unavailable after the first call. + */ +public class ObjectAlreadyShutDownException extends RuntimeException { + + /** + * Instantiates a new exception. + * + * @param message message describing the reason of the exception + */ + public ObjectAlreadyShutDownException(@NonNull final String message) { + super(message); + } + + /** + * Instantiates a new exception with default message. + */ + public ObjectAlreadyShutDownException() { + this("Object is already shut down"); + } + + /** + * Instantiates a new exception. + * + * @param object object whose {@link Shutdownable#shutdown()} was called multiple times + * although it was expected to be called only once + */ + public ObjectAlreadyShutDownException(@Nullable final Shutdownable object) { + this(object == null ? "Object is already shut down" : object + " is already shut down"); + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java new file mode 100644 index 000000000..7fa99fb71 --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -0,0 +1,161 @@ +package ru.progrm_jarvis.minecraft.commons.util.shutdown; + +import lombok.*; +import lombok.experimental.FieldDefaults; + +import javax.annotation.Nullable; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.atomic.AtomicBoolean; + +/** + * An object holding all shutdown hooks of an object which should be called once it should bw shut down. + * This object also guarantees that all hooks will be ran only once and repeated call + */ +public interface ShutdownHooks extends Shutdownable { + + /** + * Adds a shutdown hook. + * + * @param hook shutdown hook to add + * @return this {@link ShutdownHooks} for chaining + */ + ShutdownHooks add(@NonNull Runnable hook); + + /** + * Removes a shutdown hook. + * + * @param hook shutdown hook to remove + * @return this {@link ShutdownHooks} for chaining + */ + ShutdownHooks remove(@NonNull Runnable hook); + + /** + * Calls all the hooks. + */ + @Override + void shutdown(); + + /** + * Creates new {@link ShutdownHooks} instance. + * + * @return created {@link ShutdownHooks} instance + */ + static ShutdownHooks create() { + return new Simple(); + } + + /** + * Creates new {@link ShutdownHooks} instance. + * + * @param parent object whose shutdown hooks those are + * @return created {@link ShutdownHooks} instance + */ + static ShutdownHooks create(@NonNull final Shutdownable parent) { + return new Simple(parent); + } + + /** + * Creates new concurrent {@link ShutdownHooks} instance. + * + * @return created concurrent {@link ShutdownHooks} instance + */ + static ShutdownHooks createConcurrent() { + return new Concurrent(); + } + + /** + * Creates new concurrent {@link ShutdownHooks} instance. + * + * @param parent object whose shutdown hooks those are + * @return created concurrent {@link ShutdownHooks} instance + */ + static ShutdownHooks createConcurrent(@NonNull final Shutdownable parent) { + return new Concurrent(parent); + } + + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PROTECTED) + class Simple implements ShutdownHooks { + + @Nullable final Shutdownable parent; + @NonNull final Deque shutdownHooks = new ArrayDeque<>(); + boolean shutDown = false; + + public Simple() { + this(null); + } + + @Override + public ShutdownHooks add(@NonNull final Runnable hook) { + if (shutDown) throw new ObjectAlreadyShutDownException(parent); + + shutdownHooks.add(hook); + + return this; + } + + @Override + public ShutdownHooks remove(@NonNull final Runnable hook) { + if (shutDown) throw new ObjectAlreadyShutDownException(parent); + + shutdownHooks.remove(hook); + + return this; + } + + @Override + public void shutdown() { + shutDown = true; + + for (val shutdownHook : shutdownHooks) shutdownHook.run(); + + shutdownHooks.clear(); + } + } + + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PROTECTED) + class Concurrent implements ShutdownHooks { + + @Nullable final Shutdownable parent; + @NonNull final Deque shutdownHooks = new ConcurrentLinkedDeque<>(); + AtomicBoolean shutDown = new AtomicBoolean(); + + public Concurrent() { + this(null); + } + + @Override + public ShutdownHooks add(@NonNull final Runnable hook) { + if (shutDown.get()) throw new ObjectAlreadyShutDownException(parent); + + shutdownHooks.add(hook); + + return this; + } + + @Override + public ShutdownHooks remove(@NonNull final Runnable hook) { + if (shutDown.get()) throw new ObjectAlreadyShutDownException(parent); + + shutdownHooks.remove(hook); + + return this; + } + + @Override + public void shutdown() { + if (shutDown.compareAndSet(false, true)) { + for (val shutdownHook : shutdownHooks) shutdownHook.run(); + + shutdownHooks.clear(); + } else throw new ObjectAlreadyShutDownException(parent); + } + } +} diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java index f5eefe0a6..48573cbaf 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java @@ -4,7 +4,7 @@ * An object which may be shutdown and should be once its usage is over. */ @FunctionalInterface -public interface Shutdownable { +public interface Shutdownable extends AutoCloseable { /** * Shuts this object down. @@ -12,4 +12,9 @@ public interface Shutdownable { * @apiNote this means that the object may be unusable in future */ void shutdown(); + + @Override + default void close() { + shutdown(); + } } From df57df588e37a55cbab064b1add178ad557e0690 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 20:50:38 +0300 Subject: [PATCH 179/508] Remove redundant null-check in SimpleLivingFakeEntity --- .../fakeentitylib/entity/SimpleLivingFakeEntity.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index fcf4a633f..01fde057f 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -211,9 +211,15 @@ protected void actualizeSpawnPacket() { spawnPacket.setYaw(location.getYaw() + yawOffset); spawnPacket.setHeadPitch(headPitch + headPitchDelta); - spawnPacket.setVelocityX(velocity.getX()); - spawnPacket.setVelocityY(velocity.getY()); - spawnPacket.setVelocityZ(velocity.getZ()); + if (velocity != null) { + spawnPacket.setVelocityX(velocity.getX()); + spawnPacket.setVelocityY(velocity.getY()); + spawnPacket.setVelocityZ(velocity.getZ()); + } else { + spawnPacket.setVelocityX(0); + spawnPacket.setVelocityY(0); + spawnPacket.setVelocityZ(0); + } if (metadata != null) spawnPacket.setMetadata(metadata); } From 93ab5cbf52515982265ef71a7fda73622fd68c06 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 21:02:16 +0300 Subject: [PATCH 180/508] Use checked Runnables in BukkitPluginShutdownUtil --- .../commons/plugin/BukkitPluginShutdownUtil.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java index 2e884ae55..62500475d 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -10,7 +10,6 @@ import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.plugin.Plugin; import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedRunnable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -28,34 +27,34 @@ private Optional getOptionalShutdownHandler(final Plugin return Optional.ofNullable(PLUGIN_SHUTDOWN_HANDLERS.get(plugin)); } - public void addShutdownHook(final Plugin plugin, final UncheckedRunnable callback) { + public void addShutdownHook(final Plugin plugin, final Runnable callback) { getOrCreateShutdownHandler(plugin).callbacks.add(callback); } - public void addShutdownHooks(final Plugin plugin, final UncheckedRunnable... callbacks) { + public void addShutdownHooks(final Plugin plugin, final Runnable... callbacks) { getOrCreateShutdownHandler(plugin).callbacks.addAll(Arrays.asList(callbacks)); } - public void addShutdownHooks(final Plugin plugin, final Collection callbacks) { + public void addShutdownHooks(final Plugin plugin, final Collection callbacks) { getOrCreateShutdownHandler(plugin).callbacks.addAll(callbacks); } - public void removeShutdownHook(final Plugin plugin, final UncheckedRunnable callback) { + public void removeShutdownHook(final Plugin plugin, final Runnable callback) { getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.remove(callback)); } - public void removeShutdownHooks(final Plugin plugin, final UncheckedRunnable... callbacks) { + public void removeShutdownHooks(final Plugin plugin, final Runnable... callbacks) { getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.removeAll(Arrays.asList(callbacks))); } - public void removeShutdownHooks(final Plugin plugin, final Collection callback) { + public void removeShutdownHooks(final Plugin plugin, final Collection callback) { getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.removeAll(callback)); } @Value private class PluginShutdownHandler implements Listener { - private Collection callbacks = ConcurrentCollections.concurrentList(new ArrayList<>()); + private Collection callbacks = ConcurrentCollections.concurrentList(new ArrayList<>()); private PluginShutdownHandler(@NonNull final Plugin plugin) { Bukkit.getPluginManager().registerEvents(this, plugin); From 14621fa93d80afcaf2cf5cf1ede7789a0ae38c99 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 21:07:03 +0300 Subject: [PATCH 181/508] Add ShutdownHooks#registerAsBukkitShutdownHook --- .../commons/util/shutdown/ShutdownHooks.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index 7fa99fb71..6c4e9b8ea 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -2,6 +2,8 @@ import lombok.*; import lombok.experimental.FieldDefaults; +import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginShutdownUtil; import javax.annotation.Nullable; import java.util.ArrayDeque; @@ -31,6 +33,18 @@ public interface ShutdownHooks extends Shutdownable { */ ShutdownHooks remove(@NonNull Runnable hook); + /** + * Registers these {@link ShutdownHooks} as a Bukkit plugin shutdown hook. + * + * @param plugin plugin whose shutdown hook this is + * @return this {@link ShutdownHooks} for chaining + */ + default ShutdownHooks registerAsBukkitShutdownHook(@NonNull final Plugin plugin) { + BukkitPluginShutdownUtil.addShutdownHook(plugin, this::shutdown); + + return this; + } + /** * Calls all the hooks. */ From 7a71c96e41fcbc52f2ec2450a4bb0f6e3f3d9138 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 21:08:18 +0300 Subject: [PATCH 182/508] Use Shutdownable and ShutdownHooks where possible --- .../player/registry/PlayerRegistry.java | 5 ++--- .../initializer/BukkitTaskInitializer.java | 4 +++- .../AbstractSetBasedEntityManager.java | 11 +++++++++-- .../entity/management/FakeEntityManager.java | 4 +++- .../observer/PeriodicFakeEntityObserver.java | 19 ++++++++----------- 5 files changed, 25 insertions(+), 18 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java index a69864ef9..f3c86d012 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java @@ -5,12 +5,13 @@ import org.bukkit.entity.Player; import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainer; import ru.progrm_jarvis.minecraft.commons.player.collection.PlayerContainers; +import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import java.util.Collection; import java.util.Map; import java.util.function.Function; -public interface PlayerRegistry extends PlayerContainer { +public interface PlayerRegistry extends PlayerContainer, Shutdownable { C register(C playerContainer); @@ -31,6 +32,4 @@ default PlayerContainer register(@NonNull final Map playerCollect return playerContainer; } - - void shutdown(); } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java index 90d9125d0..e48ed1398 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java @@ -1,11 +1,13 @@ package ru.progrm_jarvis.minecraft.commons.schedule.task.initializer; import org.bukkit.scheduler.BukkitTask; +import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; @FunctionalInterface -public interface BukkitTaskInitializer { +public interface BukkitTaskInitializer extends Shutdownable { BukkitTask initialize(); + @Override default void shutdown() {} } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index 5f0cef99a..566debc6d 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -1,8 +1,11 @@ package ru.progrm_jarvis.minecraft.fakeentitylib.entity.management; import lombok.*; +import lombok.experimental.Delegate; import lombok.experimental.FieldDefaults; import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.minecraft.commons.util.shutdown.ShutdownHooks; +import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.FakeEntity; import javax.annotation.Nonnull; @@ -28,11 +31,15 @@ public abstract class AbstractSetBasedEntityManager

entities; @NonNull Set entitiesView; - public AbstractSetBasedEntityManager(@NonNull final P plugin, - @NonNull final Set entities) { + @Delegate(types = Shutdownable.class) @NonNull final ShutdownHooks shutdownHooks; + + public AbstractSetBasedEntityManager(@NonNull final P plugin, @NonNull final Set entities) { this.plugin = plugin; this.entities = entities; this.entitiesView = Collections.unmodifiableSet(entities); + + shutdownHooks = ShutdownHooks.createConcurrent() + .registerAsBukkitShutdownHook(plugin); } /** diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index 663ff307d..a935291aa 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -4,6 +4,7 @@ import org.bukkit.plugin.Plugin; import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginContainer; +import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.FakeEntity; import java.util.*; @@ -18,7 +19,8 @@ * to store managed entities weakly so that un-managing entity manually is not required * as if there are no strong references on it the GC should collect it. */ -public interface FakeEntityManager

extends BukkitPluginContainer

{ +public interface FakeEntityManager

+ extends BukkitPluginContainer

, Shutdownable { /** * Creates a new weak {@link Set} valid (and recommended) for storing entities diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java index 96d251bdf..5ad3ec484 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java @@ -4,7 +4,6 @@ import lombok.experimental.FieldDefaults; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; -import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginShutdownUtil; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.ObservableFakeEntity; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.management.AbstractSetBasedEntityManager; @@ -55,7 +54,14 @@ public PeriodicFakeEntityObserver(@Nonnull final P plugin, final boolean concurr this.entitiesSetSupplier = entitiesSetSupplier; - BukkitPluginShutdownUtil.addShutdownHook(plugin, this::shutdown); + shutdownHooks.add(() -> { + lock.lock(); + try { + for (val task : tasks) task.cancel(); + } finally { + lock.unlock(); + } + }); } protected RedrawEntitiesRunnable getRedrawEntitiesRunnable() { @@ -117,15 +123,6 @@ public void unmanageEntity(@NonNull final E entity) { } } - protected void shutdown() { - lock.lock(); - try { - for (val task : tasks) task.cancel(); - } finally { - lock.unlock(); - } - } - @ToString @EqualsAndHashCode(callSuper = true) protected class RedrawEntitiesRunnable extends BukkitRunnable { From 5fd8c7733d738b32f494732036cdda0704ba1114 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 21:38:46 +0300 Subject: [PATCH 183/508] Use safer operations in ShutdownHooks --- .../plugin/BukkitPluginShutdownUtil.java | 17 +-- .../commons/util/shutdown/ShutdownHooks.java | 105 ++++++++++++++++-- .../AbstractSetBasedEntityManager.java | 2 +- 3 files changed, 106 insertions(+), 18 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java index 62500475d..5578cef7b 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -10,6 +10,7 @@ import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.plugin.Plugin; import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; +import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -27,34 +28,34 @@ private Optional getOptionalShutdownHandler(final Plugin return Optional.ofNullable(PLUGIN_SHUTDOWN_HANDLERS.get(plugin)); } - public void addShutdownHook(final Plugin plugin, final Runnable callback) { + public void addShutdownHook(final Plugin plugin, final Shutdownable callback) { getOrCreateShutdownHandler(plugin).callbacks.add(callback); } - public void addShutdownHooks(final Plugin plugin, final Runnable... callbacks) { + public void addShutdownHooks(final Plugin plugin, final Shutdownable... callbacks) { getOrCreateShutdownHandler(plugin).callbacks.addAll(Arrays.asList(callbacks)); } - public void addShutdownHooks(final Plugin plugin, final Collection callbacks) { + public void addShutdownHooks(final Plugin plugin, final Collection callbacks) { getOrCreateShutdownHandler(plugin).callbacks.addAll(callbacks); } - public void removeShutdownHook(final Plugin plugin, final Runnable callback) { + public void removeShutdownHook(final Plugin plugin, final Shutdownable callback) { getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.remove(callback)); } - public void removeShutdownHooks(final Plugin plugin, final Runnable... callbacks) { + public void removeShutdownHooks(final Plugin plugin, final Shutdownable... callbacks) { getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.removeAll(Arrays.asList(callbacks))); } - public void removeShutdownHooks(final Plugin plugin, final Collection callback) { + public void removeShutdownHooks(final Plugin plugin, final Collection callback) { getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.removeAll(callback)); } @Value private class PluginShutdownHandler implements Listener { - private Collection callbacks = ConcurrentCollections.concurrentList(new ArrayList<>()); + private Collection callbacks = ConcurrentCollections.concurrentList(new ArrayList<>()); private PluginShutdownHandler(@NonNull final Plugin plugin) { Bukkit.getPluginManager().registerEvents(this, plugin); @@ -64,7 +65,7 @@ private PluginShutdownHandler(@NonNull final Plugin plugin) { public void onPluginDisable(final PluginDisableEvent event) { val handler = PLUGIN_SHUTDOWN_HANDLERS.get(event.getPlugin()); if (handler != null) { - for (val callback : handler.callbacks) callback.run(); + for (val shutdownable : handler.callbacks) shutdownable.shutdown(); handler.callbacks.clear(); } } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index 6c4e9b8ea..2136e1ac6 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -10,6 +10,7 @@ import java.util.Deque; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; /** * An object holding all shutdown hooks of an object which should be called once it should bw shut down. @@ -39,11 +40,14 @@ public interface ShutdownHooks extends Shutdownable { * @param plugin plugin whose shutdown hook this is * @return this {@link ShutdownHooks} for chaining */ - default ShutdownHooks registerAsBukkitShutdownHook(@NonNull final Plugin plugin) { - BukkitPluginShutdownUtil.addShutdownHook(plugin, this::shutdown); + ShutdownHooks registerBukkitShutdownHook(@NonNull Plugin plugin); - return this; - } + /** + * Unregisters these {@link ShutdownHooks} as a Bukkit plugin shutdown hook. + * + * @return this {@link ShutdownHooks} for chaining + */ + ShutdownHooks unregisterBukkitShutdownHook(); /** * Calls all the hooks. @@ -51,6 +55,13 @@ default ShutdownHooks registerAsBukkitShutdownHook(@NonNull final Plugin plugin) @Override void shutdown(); + /** + * Retrieves whether or not {@link #shutdown()} was called. + * + * @return {@link true} if this was shut down and {@link false} otherwise + */ + boolean isShutDown(); + /** * Creates new {@link ShutdownHooks} instance. * @@ -97,15 +108,21 @@ class Simple implements ShutdownHooks { @Nullable final Shutdownable parent; @NonNull final Deque shutdownHooks = new ArrayDeque<>(); - boolean shutDown = false; + @Getter boolean shutDown = false; + + @Nullable Plugin bukkitPlugin; public Simple() { this(null); } + protected void checkState() { + if (shutDown) throw new ObjectAlreadyShutDownException(parent); + } + @Override public ShutdownHooks add(@NonNull final Runnable hook) { - if (shutDown) throw new ObjectAlreadyShutDownException(parent); + checkState(); shutdownHooks.add(hook); @@ -114,16 +131,47 @@ public ShutdownHooks add(@NonNull final Runnable hook) { @Override public ShutdownHooks remove(@NonNull final Runnable hook) { - if (shutDown) throw new ObjectAlreadyShutDownException(parent); + checkState(); shutdownHooks.remove(hook); return this; } + @Override + public ShutdownHooks registerBukkitShutdownHook(@NonNull final Plugin plugin) { + checkState(); + + if (bukkitPlugin == null) { + BukkitPluginShutdownUtil.addShutdownHook(bukkitPlugin = plugin, this); + + return this; + } else { + BukkitPluginShutdownUtil.removeShutdownHooks(bukkitPlugin, this); + BukkitPluginShutdownUtil.addShutdownHook(plugin, this); + } + + return this; + } + + @Override + public ShutdownHooks unregisterBukkitShutdownHook() { + checkState(); + + if (bukkitPlugin != null) { + BukkitPluginShutdownUtil.removeShutdownHooks(bukkitPlugin, this); + bukkitPlugin = null; + } + + return this; + } + @Override public void shutdown() { + checkState(); + shutDown = true; + unregisterBukkitShutdownHook(); for (val shutdownHook : shutdownHooks) shutdownHook.run(); @@ -141,13 +189,19 @@ class Concurrent implements ShutdownHooks { @NonNull final Deque shutdownHooks = new ConcurrentLinkedDeque<>(); AtomicBoolean shutDown = new AtomicBoolean(); + @NonNull final AtomicReference bukkitPlugin = new AtomicReference<>(); + public Concurrent() { this(null); } + protected void checkState() { + if (shutDown.get()) throw new ObjectAlreadyShutDownException(parent); + } + @Override public ShutdownHooks add(@NonNull final Runnable hook) { - if (shutDown.get()) throw new ObjectAlreadyShutDownException(parent); + checkState(); shutdownHooks.add(hook); @@ -156,20 +210,53 @@ public ShutdownHooks add(@NonNull final Runnable hook) { @Override public ShutdownHooks remove(@NonNull final Runnable hook) { - if (shutDown.get()) throw new ObjectAlreadyShutDownException(parent); + checkState(); shutdownHooks.remove(hook); return this; } + @Override + public ShutdownHooks registerBukkitShutdownHook(@NonNull final Plugin plugin) { + checkState(); + + if (bukkitPlugin.compareAndSet(null, plugin)) BukkitPluginShutdownUtil.addShutdownHook(plugin, this); + else { + BukkitPluginShutdownUtil.removeShutdownHooks(bukkitPlugin.get(), this); + BukkitPluginShutdownUtil.addShutdownHook(plugin, this); + } + + return this; + } + + @Override + public ShutdownHooks unregisterBukkitShutdownHook() { + checkState(); + + val plugin = bukkitPlugin.get(); + if (plugin != null) { + BukkitPluginShutdownUtil.removeShutdownHooks(plugin, this); + bukkitPlugin.compareAndSet(plugin, null); + } + + return this; + } + @Override public void shutdown() { if (shutDown.compareAndSet(false, true)) { + unregisterBukkitShutdownHook(); + for (val shutdownHook : shutdownHooks) shutdownHook.run(); shutdownHooks.clear(); } else throw new ObjectAlreadyShutDownException(parent); } + + @Override + public boolean isShutDown() { + return shutDown.get(); + } } } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index 566debc6d..0418ea850 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -39,7 +39,7 @@ public AbstractSetBasedEntityManager(@NonNull final P plugin, @NonNull final Set this.entitiesView = Collections.unmodifiableSet(entities); shutdownHooks = ShutdownHooks.createConcurrent() - .registerAsBukkitShutdownHook(plugin); + .registerBukkitShutdownHook(plugin); } /** From f9a124a9fe799ff921aa23cfd27c7c4bf3f83417 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 21:39:50 +0300 Subject: [PATCH 184/508] Use ShutdownHooks in ProtocolBasedFakeEntityInteractionHandler --- ...ocolBasedFakeEntityInteractionHandler.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java index 0fbfb2c55..abc3aceb5 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java @@ -3,12 +3,16 @@ import com.comphenix.packetwrapper.WrapperPlayClientUseEntity; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.wrappers.EnumWrappers; import lombok.*; +import lombok.experimental.Delegate; import lombok.experimental.FieldDefaults; import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.minecraft.commons.util.shutdown.ShutdownHooks; +import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.behaviour.FakeEntityInteraction.Hand; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.management.FakeEntityManager; @@ -25,9 +29,13 @@ public class ProtocolBasedFakeEntityInteractionHandler

extends PacketAdapter implements FakeEntityInteractionHandler { - P plugin; - Set entities; - Set entitiesView; + @NonNull final ProtocolManager protocolManager; + + @NonNull P plugin; + @NonNull Set entities; + @NonNull Set entitiesView; + + @Delegate(types = Shutdownable.class) @NonNull ShutdownHooks shutdownHooks; public ProtocolBasedFakeEntityInteractionHandler(@Nonnull final P plugin, final boolean concurrent) { super( @@ -35,11 +43,17 @@ public ProtocolBasedFakeEntityInteractionHandler(@Nonnull final P plugin, final PacketType.Play.Client.USE_ENTITY ); + protocolManager = ProtocolLibrary.getProtocolManager(); + this.plugin = plugin; entities = concurrent ? FakeEntityManager.concurrentWeakEntitySet() : FakeEntityManager.weakEntitySet(); entitiesView = Collections.unmodifiableSet(entities); - ProtocolLibrary.getProtocolManager().addPacketListener(this); + protocolManager.addPacketListener(this); + + shutdownHooks = (concurrent ? ShutdownHooks.createConcurrent(this) : ShutdownHooks.create(this)) + .add(() -> protocolManager.removePacketListener(this)) + .registerBukkitShutdownHook(plugin); } @Override From 9b6c85227f6d75e1d439a5447971fd2048c25f41 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 21:58:06 +0300 Subject: [PATCH 185/508] Add ShutdownHook#sadd(Supplier) --- .../commons/util/shutdown/ShutdownHooks.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index 2136e1ac6..d258dd43c 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -11,6 +11,7 @@ import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; /** * An object holding all shutdown hooks of an object which should be called once it should bw shut down. @@ -26,6 +27,16 @@ public interface ShutdownHooks extends Shutdownable { */ ShutdownHooks add(@NonNull Runnable hook); + /** + * Adds a shutdown hook. + * + * @param hookSupplier supplier to be used instantly to create a hook + * @return this {@link ShutdownHooks} for chaining + * + * @apiNote supplier is called instantly, not lazily + */ + ShutdownHooks add(@NonNull Supplier hookSupplier); + /** * Removes a shutdown hook. * @@ -129,6 +140,15 @@ public ShutdownHooks add(@NonNull final Runnable hook) { return this; } + @Override + public ShutdownHooks add(@NonNull final Supplier hookSupplier) { + checkState(); + + shutdownHooks.add(hookSupplier.get()); + + return null; + } + @Override public ShutdownHooks remove(@NonNull final Runnable hook) { checkState(); @@ -208,6 +228,15 @@ public ShutdownHooks add(@NonNull final Runnable hook) { return this; } + @Override + public ShutdownHooks add(@NonNull final Supplier hookSupplier) { + checkState(); + + shutdownHooks.add(hookSupplier.get()); + + return this; + } + @Override public ShutdownHooks remove(@NonNull final Runnable hook) { checkState(); From 3ac15fd7dedca6fa5c9f1f4be24fcb1df33c6711 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 22:07:15 +0300 Subject: [PATCH 186/508] Add #shutdown() support to FakeEntityManagerGroup --- .../entity/management/FakeEntityManagerGroup.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java index 84c209aa7..4a4324a87 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java @@ -75,4 +75,11 @@ public void remove(@NonNull final E entity) { entity.remove(); } + + @Override + public void shutdown() { + for (val manager : managers) manager.shutdown(); + + super.shutdown(); + } } From 3383c4abb409e7e959d256236dd34270528dfd9c Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 22:11:12 +0300 Subject: [PATCH 187/508] Remove @EqualsAndHashcode from ShutdownHooks --- .../minecraft/commons/util/shutdown/ShutdownHooks.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index d258dd43c..148387031 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -111,8 +111,8 @@ static ShutdownHooks createConcurrent(@NonNull final Shutdownable parent) { return new Concurrent(parent); } + // equals and hashcode are specifically omitted due to object's mutability @ToString - @EqualsAndHashCode @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PROTECTED) class Simple implements ShutdownHooks { @@ -199,8 +199,8 @@ public void shutdown() { } } + // equals and hashcode are specifically omitted due to object's mutability @ToString - @EqualsAndHashCode @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PROTECTED) class Concurrent implements ShutdownHooks { From a57b8f0b48532c85a9bba2b8fdf51ca6a07897d7 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 4 Mar 2019 22:16:19 +0300 Subject: [PATCH 188/508] Add functional HookCreator#add(..) variant --- .../commons/util/shutdown/ShutdownHooks.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index 148387031..ee4ff72cf 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -11,6 +11,7 @@ import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Function; import java.util.function.Supplier; /** @@ -37,6 +38,17 @@ public interface ShutdownHooks extends Shutdownable { */ ShutdownHooks add(@NonNull Supplier hookSupplier); + /** + * Adds a shutdown hook. + * + * @param objectSupplier supplier to create an object which wil be shut down + * @param hookCreator function to create a hook + * @return this {@link ShutdownHooks} for chaining + * + * @apiNote supplier and function are called instantly, not lazily + */ + T add(@NonNull Supplier objectSupplier, @NonNull Function hookCreator); + /** * Removes a shutdown hook. * @@ -149,6 +161,16 @@ public ShutdownHooks add(@NonNull final Supplier hookSupplier) { return null; } + @Override + public T add(@NonNull final Supplier objectSupplier, @NonNull final Function hookCreator) { + checkState(); + + val object = objectSupplier.get(); + shutdownHooks.add(hookCreator.apply(object)); + + return object; + } + @Override public ShutdownHooks remove(@NonNull final Runnable hook) { checkState(); @@ -237,6 +259,16 @@ public ShutdownHooks add(@NonNull final Supplier hookSupplier) { return this; } + @Override + public T add(@NonNull final Supplier objectSupplier, @NonNull final Function hookCreator) { + checkState(); + + val object = objectSupplier.get(); + shutdownHooks.add(hookCreator.apply(object)); + + return object; + } + @Override public ShutdownHooks remove(@NonNull final Runnable hook) { checkState(); From 2b75bf7ca02bcd9586f8f3cf757d9d6468604fc8 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 5 Mar 2019 02:05:45 +0300 Subject: [PATCH 189/508] Fix ShutdownUtil --- .../commons/util/shutdown/ShutdownHooks.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index ee4ff72cf..f76341ccb 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -7,6 +7,7 @@ import javax.annotation.Nullable; import java.util.ArrayDeque; +import java.util.Arrays; import java.util.Deque; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.atomic.AtomicBoolean; @@ -213,7 +214,11 @@ public void shutdown() { checkState(); shutDown = true; - unregisterBukkitShutdownHook(); + + if (bukkitPlugin != null) { + BukkitPluginShutdownUtil.removeShutdownHooks(bukkitPlugin, this); + bukkitPlugin = null; + } for (val shutdownHook : shutdownHooks) shutdownHook.run(); @@ -306,8 +311,15 @@ public ShutdownHooks unregisterBukkitShutdownHook() { @Override public void shutdown() { + System.out.println(Arrays.toString(Thread.currentThread().getStackTrace())); if (shutDown.compareAndSet(false, true)) { - unregisterBukkitShutdownHook(); + { + val plugin = bukkitPlugin.get(); + if (plugin != null) { + BukkitPluginShutdownUtil.removeShutdownHooks(plugin, this); + bukkitPlugin.set(null); + } + } for (val shutdownHook : shutdownHooks) shutdownHook.run(); From 685931a5ec2961c38512d852950e20493542945d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 5 Mar 2019 02:06:26 +0300 Subject: [PATCH 190/508] Use ShutdownHooks.createConcurrent(this) in AbstractSetBasedEntityManager --- .../entity/management/AbstractSetBasedEntityManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index 0418ea850..c19b13e58 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -38,7 +38,7 @@ public AbstractSetBasedEntityManager(@NonNull final P plugin, @NonNull final Set this.entities = entities; this.entitiesView = Collections.unmodifiableSet(entities); - shutdownHooks = ShutdownHooks.createConcurrent() + shutdownHooks = ShutdownHooks.createConcurrent(this) .registerBukkitShutdownHook(plugin); } From 7bac78dc67478daa768d508fb52c777ba50fc249 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 5 Mar 2019 02:18:19 +0300 Subject: [PATCH 191/508] Remove stacktrace debug --- .../minecraft/commons/util/shutdown/ShutdownHooks.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index f76341ccb..344025c69 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -7,7 +7,6 @@ import javax.annotation.Nullable; import java.util.ArrayDeque; -import java.util.Arrays; import java.util.Deque; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.atomic.AtomicBoolean; @@ -311,7 +310,6 @@ public ShutdownHooks unregisterBukkitShutdownHook() { @Override public void shutdown() { - System.out.println(Arrays.toString(Thread.currentThread().getStackTrace())); if (shutDown.compareAndSet(false, true)) { { val plugin = bukkitPlugin.get(); From 9136ada711be4994dfd5a820e649f1b1e245520a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 5 Mar 2019 02:26:39 +0300 Subject: [PATCH 192/508] Use @Retention(RetentionPolicy.SOURCE) for markers --- .../minecraft/commons/annotation/AsyncExpected.java | 2 +- .../minecraft/commons/annotation/BukkitService.java | 2 +- .../progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java | 2 +- .../commons/player/registry/PlayerRegistryRegistration.java | 2 +- .../minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java index bfb8b0a16..9be34753e 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java @@ -8,7 +8,7 @@ */ @Documented @Target(ElementType.METHOD) -@Retention(RetentionPolicy.SOURCE) +@Retention(RetentionPolicy.CLASS) public @interface AsyncExpected { /** diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java index 055daabdf..e74324249 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java @@ -9,6 +9,6 @@ */ @Documented @Target(ElementType.TYPE) -@Retention(RetentionPolicy.SOURCE) +@Retention(RetentionPolicy.CLASS) public @interface BukkitService { } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java index 8983683d4..422d58780 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java @@ -8,6 +8,6 @@ * Marker to indicate that the annotated element may use unsafe {@code net.minecraft.server} functionality. */ @Documented -@Retention(RetentionPolicy.SOURCE) +@Retention(RetentionPolicy.CLASS) public @interface UnsafeNMS { } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java index 126f15cb0..9e5ccd195 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java @@ -13,7 +13,7 @@ @Inherited @Documented @Target({TYPE, CONSTRUCTOR}) -@Retention(RetentionPolicy.SOURCE) +@Retention(RetentionPolicy.CLASS) public @interface PlayerRegistryRegistration { /** diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 01fde057f..6ca41261c 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -18,7 +18,7 @@ * A simple living entity self-sustained for direct usage. */ @ToString -@EqualsAndHashCode(callSuper = true) +// Entities are seriously mutable and most things may overlap in different cases so JDK hashcode is used @FieldDefaults(level = AccessLevel.PROTECTED) public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { From f19fbc8e5e86662b76e31064f3a753b74a54eec5 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 5 Mar 2019 02:27:18 +0300 Subject: [PATCH 193/508] Add @DontOverrideEqualsAndHashCode --- .../DontOverrideEqualsAndHashCode.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java new file mode 100644 index 000000000..7631eeb3f --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java @@ -0,0 +1,22 @@ +package ru.progrm_jarvis.minecraft.commons.annotation; + +import java.lang.annotation.*; + +/** + * Marker indicating that {@link Object#hashCode()} and {@link Object#equals(Object)} methods + * are not overridden for some reason and so (in most cases) should not be overridden. + */ +@Inherited +@Documented +@Retention(RetentionPolicy.CLASS) +@Target(value = ElementType.TYPE) +public @interface DontOverrideEqualsAndHashCode { + + /** + * The reason why this object's {@link Object#hashCode()} and {@link Object#equals(Object)} + * methods are not overridden. + * + * @return reason for not overriding {@link Object#hashCode()} and {@link Object#equals(Object)} methods + */ + String value() default ""; +} From c8bd77f8b2253761df99b9bbb74ea0c1ecfd8703 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 5 Mar 2019 02:33:13 +0300 Subject: [PATCH 194/508] Disable @EqualsAndHashCode for most fake-entity-lib objects --- .../fakeentitylib/entity/AbstractBasicFakeEntity.java | 1 - .../minecraft/fakeentitylib/entity/AbstractFakeEntity.java | 3 ++- .../fakeentitylib/entity/AbstractObservableFakeEntity.java | 1 - .../entity/AbstractPlayerContainingFakeEntity.java | 1 - .../fakeentitylib/entity/SimpleLivingFakeEntity.java | 1 - .../ProtocolBasedFakeEntityInteractionHandler.java | 1 - .../entity/management/AbstractSetBasedEntityManager.java | 6 ++++-- .../fakeentitylib/entity/management/FakeEntityManager.java | 2 ++ .../entity/management/FakeEntityManagerGroup.java | 1 - .../entity/observer/PeriodicFakeEntityObserver.java | 1 - 10 files changed, 8 insertions(+), 10 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index 52c11f748..788fdd527 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -15,7 +15,6 @@ * Base for most common implementations of {@link BasicFakeEntity} containing player logic base. */ @ToString -@EqualsAndHashCode(callSuper = false) @FieldDefaults(level = AccessLevel.PROTECTED) public abstract class AbstractBasicFakeEntity extends AbstractPlayerContainingFakeEntity implements BasicFakeEntity { diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java index 1ddc8de95..de9ab8fc6 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java @@ -4,13 +4,14 @@ import lombok.experimental.FieldDefaults; import org.bukkit.Location; import org.bukkit.World; +import ru.progrm_jarvis.minecraft.commons.annotation.DontOverrideEqualsAndHashCode; /** * Base for most common implementations of {@link FakeEntity}. */ +@DontOverrideEqualsAndHashCode("Entities are mutable and have no real IDs in practise") @ToString @RequiredArgsConstructor -@EqualsAndHashCode(callSuper = false) @FieldDefaults(level = AccessLevel.PROTECTED) public abstract class AbstractFakeEntity implements FakeEntity { diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java index bd1d0d4c3..821f62c87 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java @@ -9,7 +9,6 @@ * Base for most common implementations of {@link ObservableFakeEntity}. */ @ToString -@EqualsAndHashCode(callSuper = false) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public abstract class AbstractObservableFakeEntity extends AbstractFakeEntity implements ObservableFakeEntity { diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java index d68ef5b88..1f544bb62 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java @@ -14,7 +14,6 @@ * Base for most common implementations of {@link ObservableFakeEntity} containing player logic base. */ @ToString -@EqualsAndHashCode(callSuper = false) @FieldDefaults(level = AccessLevel.PROTECTED) @PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.MANUAL) public abstract class AbstractPlayerContainingFakeEntity extends AbstractObservableFakeEntity { diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 6ca41261c..1219881eb 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -18,7 +18,6 @@ * A simple living entity self-sustained for direct usage. */ @ToString -// Entities are seriously mutable and most things may overlap in different cases so JDK hashcode is used @FieldDefaults(level = AccessLevel.PROTECTED) public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java index abc3aceb5..75f2e23c1 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java @@ -24,7 +24,6 @@ import static com.google.common.base.Preconditions.checkNotNull; @ToString -@EqualsAndHashCode(callSuper = true) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public class ProtocolBasedFakeEntityInteractionHandler

extends PacketAdapter implements FakeEntityInteractionHandler { diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index c19b13e58..5c6c43e36 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -1,6 +1,9 @@ package ru.progrm_jarvis.minecraft.fakeentitylib.entity.management; -import lombok.*; +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; +import lombok.ToString; import lombok.experimental.Delegate; import lombok.experimental.FieldDefaults; import org.bukkit.plugin.Plugin; @@ -21,7 +24,6 @@ * @param type of entities stored */ @ToString -@EqualsAndHashCode @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public abstract class AbstractSetBasedEntityManager

diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index a935291aa..bbfc693a9 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -2,6 +2,7 @@ import lombok.NonNull; import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.minecraft.commons.annotation.DontOverrideEqualsAndHashCode; import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginContainer; import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; @@ -19,6 +20,7 @@ * to store managed entities weakly so that un-managing entity manually is not required * as if there are no strong references on it the GC should collect it. */ +@DontOverrideEqualsAndHashCode("EntityManagers are not data objects") public interface FakeEntityManager

extends BukkitPluginContainer

, Shutdownable { diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java index 4a4324a87..e4cbb4070 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java @@ -21,7 +21,6 @@ * @param type of managed entity */ @ToString -@EqualsAndHashCode(callSuper = true) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) @PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.MANUAL) public class FakeEntityManagerGroup

diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java index 5ad3ec484..128fb267a 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java @@ -21,7 +21,6 @@ import static ru.progrm_jarvis.minecraft.commons.util.hack.PreSuperCheck.beforeSuper; @ToString -@EqualsAndHashCode(callSuper = true) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public class PeriodicFakeEntityObserver

extends AbstractSetBasedEntityManager implements FakeEntityObserver { From 13b4778d4e1bcdac21ba5d4f46305d0d75fccb14 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 5 Mar 2019 02:41:04 +0300 Subject: [PATCH 195/508] Fix iteration in PeriodicFakeEntityObserver --- .../entity/observer/PeriodicFakeEntityObserver.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java index 128fb267a..20c92f32e 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java @@ -112,10 +112,13 @@ public void unmanageEntity(@NonNull final E entity) { lock.lock(); try { val iterator = tasks.iterator(); - for (val task : tasks) if (task.removeEntity(entity)) { - if (task.entities.size() == 0) iterator.remove(); + while (iterator.hasNext()) { + val task = iterator.next(); + if (task.removeEntity(entity)) { + if (task.entities.size() == 0) iterator.remove(); - break; + break; + } } } finally { lock.unlock(); From ef3a9575f717ca8e547c273da3cdc4cb5e7da8f9 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 5 Mar 2019 02:41:24 +0300 Subject: [PATCH 196/508] Use better toString() in AbstractSetBasedEntityManager --- .../entity/management/AbstractSetBasedEntityManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index 5c6c43e36..fd31e08bc 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -30,8 +30,8 @@ public abstract class AbstractSetBasedEntityManager

{ @NonNull P plugin; - @NonNull Set entities; - @NonNull Set entitiesView; + @NonNull @ToString.Exclude Set entities; + @NonNull @ToString.Exclude Set entitiesView; @Delegate(types = Shutdownable.class) @NonNull final ShutdownHooks shutdownHooks; From 627a7f2232b97df24d7a853687d2f4d01730dcbe Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 5 Mar 2019 21:36:50 +0300 Subject: [PATCH 197/508] Fix ShutdownHooks adding annotations --- .../commons/util/shutdown/ShutdownHooks.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index 344025c69..670e860c2 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -26,7 +26,7 @@ public interface ShutdownHooks extends Shutdownable { * @param hook shutdown hook to add * @return this {@link ShutdownHooks} for chaining */ - ShutdownHooks add(@NonNull Runnable hook); + @NonNull ShutdownHooks add(@NonNull Runnable hook); /** * Adds a shutdown hook. @@ -36,7 +36,7 @@ public interface ShutdownHooks extends Shutdownable { * * @apiNote supplier is called instantly, not lazily */ - ShutdownHooks add(@NonNull Supplier hookSupplier); + @NonNull ShutdownHooks add(@NonNull Supplier hookSupplier); /** * Adds a shutdown hook. @@ -55,7 +55,7 @@ public interface ShutdownHooks extends Shutdownable { * @param hook shutdown hook to remove * @return this {@link ShutdownHooks} for chaining */ - ShutdownHooks remove(@NonNull Runnable hook); + @NonNull ShutdownHooks remove(@NonNull Runnable hook); /** * Registers these {@link ShutdownHooks} as a Bukkit plugin shutdown hook. @@ -63,14 +63,14 @@ public interface ShutdownHooks extends Shutdownable { * @param plugin plugin whose shutdown hook this is * @return this {@link ShutdownHooks} for chaining */ - ShutdownHooks registerBukkitShutdownHook(@NonNull Plugin plugin); + @NonNull ShutdownHooks registerBukkitShutdownHook(@NonNull Plugin plugin); /** * Unregisters these {@link ShutdownHooks} as a Bukkit plugin shutdown hook. * * @return this {@link ShutdownHooks} for chaining */ - ShutdownHooks unregisterBukkitShutdownHook(); + @NonNull ShutdownHooks unregisterBukkitShutdownHook(); /** * Calls all the hooks. @@ -125,8 +125,8 @@ static ShutdownHooks createConcurrent(@NonNull final Shutdownable parent) { // equals and hashcode are specifically omitted due to object's mutability @ToString - @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PROTECTED) + @RequiredArgsConstructor(access = AccessLevel.PROTECTED) class Simple implements ShutdownHooks { @Nullable final Shutdownable parent; @@ -135,7 +135,7 @@ class Simple implements ShutdownHooks { @Nullable Plugin bukkitPlugin; - public Simple() { + protected Simple() { this(null); } @@ -144,7 +144,7 @@ protected void checkState() { } @Override - public ShutdownHooks add(@NonNull final Runnable hook) { + @NonNull public ShutdownHooks add(@NonNull final Runnable hook) { checkState(); shutdownHooks.add(hook); @@ -153,12 +153,12 @@ public ShutdownHooks add(@NonNull final Runnable hook) { } @Override - public ShutdownHooks add(@NonNull final Supplier hookSupplier) { + @NonNull public ShutdownHooks add(@NonNull final Supplier hookSupplier) { checkState(); shutdownHooks.add(hookSupplier.get()); - return null; + return this; } @Override @@ -172,7 +172,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct } @Override - public ShutdownHooks remove(@NonNull final Runnable hook) { + @NonNull public ShutdownHooks remove(@NonNull final Runnable hook) { checkState(); shutdownHooks.remove(hook); @@ -181,7 +181,7 @@ public ShutdownHooks remove(@NonNull final Runnable hook) { } @Override - public ShutdownHooks registerBukkitShutdownHook(@NonNull final Plugin plugin) { + @NonNull public ShutdownHooks registerBukkitShutdownHook(@NonNull final Plugin plugin) { checkState(); if (bukkitPlugin == null) { @@ -197,7 +197,7 @@ public ShutdownHooks registerBukkitShutdownHook(@NonNull final Plugin plugin) { } @Override - public ShutdownHooks unregisterBukkitShutdownHook() { + @NonNull public ShutdownHooks unregisterBukkitShutdownHook() { checkState(); if (bukkitPlugin != null) { @@ -227,8 +227,8 @@ public void shutdown() { // equals and hashcode are specifically omitted due to object's mutability @ToString - @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PROTECTED) + @RequiredArgsConstructor(access = AccessLevel.PROTECTED) class Concurrent implements ShutdownHooks { @Nullable final Shutdownable parent; @@ -237,7 +237,7 @@ class Concurrent implements ShutdownHooks { @NonNull final AtomicReference bukkitPlugin = new AtomicReference<>(); - public Concurrent() { + protected Concurrent() { this(null); } @@ -246,7 +246,7 @@ protected void checkState() { } @Override - public ShutdownHooks add(@NonNull final Runnable hook) { + @NonNull public ShutdownHooks add(@NonNull final Runnable hook) { checkState(); shutdownHooks.add(hook); @@ -255,7 +255,7 @@ public ShutdownHooks add(@NonNull final Runnable hook) { } @Override - public ShutdownHooks add(@NonNull final Supplier hookSupplier) { + @NonNull public ShutdownHooks add(@NonNull final Supplier hookSupplier) { checkState(); shutdownHooks.add(hookSupplier.get()); @@ -274,7 +274,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct } @Override - public ShutdownHooks remove(@NonNull final Runnable hook) { + @NonNull public ShutdownHooks remove(@NonNull final Runnable hook) { checkState(); shutdownHooks.remove(hook); @@ -283,7 +283,7 @@ public ShutdownHooks remove(@NonNull final Runnable hook) { } @Override - public ShutdownHooks registerBukkitShutdownHook(@NonNull final Plugin plugin) { + @NonNull public ShutdownHooks registerBukkitShutdownHook(@NonNull final Plugin plugin) { checkState(); if (bukkitPlugin.compareAndSet(null, plugin)) BukkitPluginShutdownUtil.addShutdownHook(plugin, this); @@ -296,7 +296,7 @@ public ShutdownHooks registerBukkitShutdownHook(@NonNull final Plugin plugin) { } @Override - public ShutdownHooks unregisterBukkitShutdownHook() { + @NonNull public ShutdownHooks unregisterBukkitShutdownHook() { checkState(); val plugin = bukkitPlugin.get(); From ff8ab2fa5b34086e72d0c3c8317f04951283cb3f Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 10 Mar 2019 03:18:54 +0300 Subject: [PATCH 198/508] Rework FakeEntity moving --- .../entity/AbstractBasicFakeEntity.java | 177 +++++++++++++----- .../fakeentitylib/entity/BasicFakeEntity.java | 30 ++- .../entity/SimpleLivingFakeEntity.java | 141 +++++++------- 3 files changed, 219 insertions(+), 129 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index 788fdd527..f5a61c0c3 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -120,6 +120,7 @@ public void removeMetadata(final int... indexes) { /////////////////////////////////////////////////////////////////////////// // Movement /////////////////////////////////////////////////////////////////////////// + /** * Performs the movement of this living fake entity by given deltas and yaw and pitch specified * not performing any checks such as 8-block limit of deltas or angle minimization. @@ -130,8 +131,16 @@ public void removeMetadata(final int... indexes) { * @param yaw new yaw * @param pitch new pitch */ - protected abstract void performMove(final double dx, final double dy, final double dz, - final float yaw, final float pitch); + protected abstract void performMoveLook(double dx, double dy, double dz, final float yaw, final float pitch); + /** + * Performs the movement of this living fake entity by given deltas and yaw and pitch specified + * not performing any checks such as 8-block limit of deltas. + * + * @param dx delta on X-axis + * @param dy delta on Y-axis + * @param dz delta on Z-axis + */ + protected abstract void performMove(double dx, double dy, double dz); /** * Performs the teleportation of this living fake entity to given coordinates changing yaw and pitch @@ -142,54 +151,136 @@ protected abstract void performMove(final double dx, final double dy, final doub * @param z new location on Z-axis * @param yaw new yaw * @param pitch new pitch + * @param sendVelocity {@code true} if velocity should be considered and {@code false} otherwise */ - protected abstract void performTeleportation(final double x, final double y, final double z, - final float yaw, final float pitch); - - @Override - public void teleport(final double x, final double y, final double z, final float yaw, final float pitch) { - final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); + protected abstract void performTeleportation(double x, double y, double z, + float yaw, float pitch, boolean sendVelocity); - location.setX(x); - location.setZ(y); - location.setZ(z); - location.setYaw(yaw); - location.setPitch(pitch); + /** + * Performs the look by specified yaw and pitch. + * + * @param yaw new yaw + * @param pitch new pitch + */ + protected abstract void performLook(float yaw, float pitch); - velocity.setX(dx * 8000); - velocity.setX(dy * 8000); - velocity.setX(dz * 8000); + @Override + public void move(final double dx, final double dy, final double dz, final float dYaw, final float dPitch) { + if (dx == 0 && dy == 0 && dz == 0) { + if (dYaw == 0 && dPitch == 0) { + final float yaw = location.getYaw() + dYaw, pitch = location.getPitch() + dPitch; + + performLook(yaw, pitch); + + location.setYaw(yaw); + location.setPitch(pitch); + } + } else { + velocity.setX(dx); + velocity.setY(dy); + velocity.setZ(dz); + // use teleportation if any of axises is above 8 blocks limit + if (dx > 8 || dy > 8 || dz > 8) { + final double x = location.getX() + dx, y = location.getY() + dy, z = location.getZ() + dz; + final float yaw = location.getYaw() + dYaw, pitch = location.getPitch() + dPitch; + + performTeleportation(x, y, z, pitch, yaw, true); + + location.setX(x); + location.setY(y); + location.setZ(z); + location.setYaw(yaw); + location.setPitch(pitch); + } + // otherwise use move + else { + if (dYaw == 0 && dPitch == 0) performMove(dx, dy, dz); + else { + performMoveLook(dx, dy, dz, dYaw, dPitch); + + location.setYaw(location.getYaw() + dYaw); + location.setPitch(location.getPitch()); + } + + location.setX(location.getX() + dx); + location.setY(location.getY() + dy); + location.setZ(location.getZ() + dz); + } + + velocity.setX(0); + velocity.setY(0); + velocity.setZ(0); + } + } - if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch); - else performMove(dx, dy, dz, yaw, pitch); + @Override + @SuppressWarnings("Duplicates") + public void moveTo(final double x, final double y, final double z, final float yaw, final float pitch) { + final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); + if (dx == 0 && dy == 0 && dz == 0) { + if (yaw != location.getYaw() || pitch != location.getPitch()) { + performLook(yaw, pitch); + + location.setYaw(yaw); + location.setPitch(pitch); + } + } else { + velocity.setX(dx); + velocity.setY(dy); + velocity.setZ(dz); + + if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, false); + else if (yaw != location.getYaw() || pitch != location.getPitch()) { + performMoveLook(dx, dy, dz, yaw, pitch); + + location.setYaw(yaw); + location.setPitch(pitch); + } else performMove(dx, dy, dz); + + location.setX(x); + location.setY(y); + location.setZ(z); + + velocity.setX(0); + velocity.setY(0); + velocity.setZ(0); + } } @Override - public void move(final double dx, final double dy, final double dz, final float dYaw, final float dPitch) { - location.setX(location.getX() + dx); - location.setY(location.getY() + dy); - location.setZ(location.getZ() + dz); - location.setYaw(location.getYaw() + dYaw); - location.setPitch(location.getPitch() + dPitch); - - velocity.setX(dx * 8000); - velocity.setX(dy * 8000); - velocity.setX(dz * 8000); - - // use teleportation if any of axises is above 8 blocks limit - if (dx > 8 || dy > 8 || dz > 8) performTeleportation( - location.getX() + dx, location.getY() + dy, location.getZ() + dz, - location.getYaw() + dYaw, location.getPitch() + dPitch - ); - // otherwise use move - else performMove(dx, dy, dz, location.getYaw() + dYaw, location.getPitch() + dPitch); - - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); + @SuppressWarnings("Duplicates") + public void teleport(final double x, final double y, final double z, final float yaw, final float pitch) { + final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); + + if (dx == 0 && dy == 0 && dz == 0) { + if (yaw != location.getYaw() || pitch != location.getPitch()) { + performLook(yaw, pitch); + + location.setYaw(yaw); + location.setPitch(pitch); + } + } else { + velocity.setX(dx); + velocity.setY(dy); + velocity.setZ(dz); + + if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, false); + else if (yaw != location.getYaw() || pitch != location.getPitch()) { + performMoveLook(dx, dy, dz, yaw, pitch); + + location.setYaw(yaw); + location.setPitch(pitch); + } + else performMove(dx, dy, dz); + + location.setX(x); + location.setZ(y); + location.setZ(z); + + velocity.setX(0); + velocity.setY(0); + velocity.setZ(0); + } } } diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java index 3e387055f..6e623f2b1 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java @@ -30,16 +30,6 @@ public interface BasicFakeEntity extends ObservableFakeEntity { // Location /////////////////////////////////////////////////////////////////////////// - void teleport(double x, double y, double z, float yaw, float pitch); - - default void teleport(final double x, final double y, final double z) { - teleport(x, y, z, 0, 0); - } - - default void teleport(@NonNull final Location location) { - teleport(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); - } - void move(double dx, double dy, double dz, float dYaw, float dPitch); default void move(final double dx, final double dy, final double dz) { @@ -54,6 +44,26 @@ default void move(@NonNull final Vector direction) { move(direction, 0, 0); } + void moveTo(double x, double y, double z, float yaw, float pitch); + + default void moveTo(final double x, final double y, final double z) { + moveTo(x, y, z, 0, 0); + } + + default void moveTo(@NonNull final Location location) { + moveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + } + + void teleport(double x, double y, double z, float yaw, float pitch); + + default void teleport(final double x, final double y, final double z) { + teleport(x, y, z, 0, 0); + } + + default void teleport(@NonNull final Location location) { + teleport(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + } + /////////////////////////////////////////////////////////////////////////// // Metadata /////////////////////////////////////////////////////////////////////////// diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 1219881eb..9c647dff6 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -102,6 +102,11 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { */ WrapperPlayServerRelEntityMove movePacket; + /** + * Packet used for modifying entity's head rotation + */ + WrapperPlayServerEntityLook lookPacket; + /** * Packet used for moving this fake entity (not more than 8 blocks per axis) and modifying head rotation */ @@ -210,15 +215,9 @@ protected void actualizeSpawnPacket() { spawnPacket.setYaw(location.getYaw() + yawOffset); spawnPacket.setHeadPitch(headPitch + headPitchDelta); - if (velocity != null) { - spawnPacket.setVelocityX(velocity.getX()); - spawnPacket.setVelocityY(velocity.getY()); - spawnPacket.setVelocityZ(velocity.getZ()); - } else { - spawnPacket.setVelocityX(0); - spawnPacket.setVelocityY(0); - spawnPacket.setVelocityZ(0); - } + spawnPacket.setVelocityX(velocity.getX()); + spawnPacket.setVelocityY(velocity.getY()); + spawnPacket.setVelocityZ(velocity.getZ()); if (metadata != null) spawnPacket.setMetadata(metadata); } @@ -247,6 +246,11 @@ public void despawn() { // Movement /////////////////////////////////////////////////////////////////////////// + protected boolean isOnGround() { + // TODO: 09.03.2019 Consider specific blocks + return location.getY() % 1 == 0 && location.subtract(0, 1, 0).getBlock().getType().isSolid(); + } + protected boolean hasVelocity() { return velocity.length() != 0; } @@ -267,78 +271,46 @@ protected void actualizeVelocityPacket() { velocityPacket.setVelocityZ(velocity.getZ()); } - /** - * Performs the movement of this living fake entity by given deltas and yaw and pitch specified - * not performing any checks such as 8-block limit of deltas or angle minimization. - * - * @param dx delta on X-axis - * @param dy delta on Y-axis - * @param dz delta on Z-axis - * @param yaw new yaw - * @param pitch new pitch - */ @Override - @SuppressWarnings("Duplicates") - protected void performMove(final double dx, final double dy, final double dz, final float yaw, final float pitch) { + protected void performMoveLook(final double dx, final double dy, final double dz, + final float yaw, final float pitch) { if (visible) { - if (pitch == 0 && yaw == 0) { - if (movePacket == null) { - movePacket = new WrapperPlayServerRelEntityMove(); - movePacket.setEntityID(entityId); - } - - movePacket.setDx(dx); - movePacket.setDy(dy); - movePacket.setDz(dz); - - boolean hasVelocity = hasVelocity(); - if (hasVelocity) actualizeVelocityPacket(); - - for (val entry : players.entrySet()) if (entry.getValue()) { - val player = entry.getKey(); - - if (hasVelocity) velocityPacket.sendPacket(player); - movePacket.sendPacket(player); - } - } else { - if (moveLookPacket == null) { - moveLookPacket = new WrapperPlayServerRelEntityMoveLook(); - moveLookPacket.setEntityID(entityId); - } - - moveLookPacket.setDx(dx); - moveLookPacket.setDy(dy); - moveLookPacket.setDz(dz); - moveLookPacket.setYaw(yaw); - moveLookPacket.setPitch(pitch); - - boolean hasVelocity = hasVelocity(); - if (hasVelocity) actualizeVelocityPacket(); - - for (val entry : players.entrySet()) if (entry.getValue()) { - val player = entry.getKey(); - - if (hasVelocity) velocityPacket.sendPacket(player); - moveLookPacket.sendPacket(player); - } + if (moveLookPacket == null) { + moveLookPacket = new WrapperPlayServerRelEntityMoveLook(); + moveLookPacket.setEntityID(entityId); } + + moveLookPacket.setDx(dx); + moveLookPacket.setDy(dy); + moveLookPacket.setDz(dz); + moveLookPacket.setYaw(yaw); + moveLookPacket.setPitch(pitch); + moveLookPacket.setOnGround(isOnGround()); + + for (val entry : players.entrySet()) if (entry.getValue()) moveLookPacket.sendPacket(entry.getKey()); + } + } + + @Override + protected void performMove(final double dx, final double dy, final double dz) { + if (visible) { + if (movePacket == null) { + movePacket = new WrapperPlayServerRelEntityMove(); + movePacket.setEntityID(entityId); + } + + movePacket.setDx(dx); + movePacket.setDy(dy); + movePacket.setDz(dz); + movePacket.setOnGround(isOnGround()); + + for (val entry : players.entrySet()) if (entry.getValue()) movePacket.sendPacket(entry.getKey()); } } - /** - * Performs the teleportation of this living fake entity to given coordinates changing yaw and pitch - * not performing any checks such as using movement for less than 8-block deltas or angle minimization. - * - * @param x new location on X-axis - * @param y new location on Y-axis - * @param z new location on Z-axis - * @param yaw new yaw - * @param pitch new pitch - */ @Override - @SuppressWarnings("Duplicates") protected void performTeleportation(final double x, final double y, final double z, - final float yaw, final float pitch) { + final float yaw, final float pitch, boolean sendVelocity) { if (visible) { if (teleportPacket == null) { teleportPacket = new WrapperPlayServerEntityTeleport(); @@ -350,19 +322,36 @@ protected void performTeleportation(final double x, final double y, final double teleportPacket.setZ(z + zOffset); teleportPacket.setYaw(yaw + yawOffset); teleportPacket.setPitch(pitch + pitchOffset); + teleportPacket.setOnGround(isOnGround()); - boolean hasVelocity = hasVelocity(); - if (hasVelocity) actualizeVelocityPacket(); + sendVelocity = sendVelocity && hasVelocity(); + if (sendVelocity) actualizeVelocityPacket(); for (val entry : players.entrySet()) if (entry.getValue()) { val player = entry.getKey(); - if (hasVelocity) velocityPacket.sendPacket(player); + if (sendVelocity) velocityPacket.sendPacket(player); teleportPacket.sendPacket(player); } } } + @Override + protected void performLook(final float yaw, final float pitch) { + if (visible) { + if (lookPacket == null) { + lookPacket = new WrapperPlayServerEntityLook(); + lookPacket.setEntityID(entityId); + } + + lookPacket.setYaw(yaw); + lookPacket.setPitch(pitch); + lookPacket.setOnGround(isOnGround()); + + for (val entry : players.entrySet()) if (entry.getValue()) lookPacket.sendPacket(entry.getKey()); + } + } + /////////////////////////////////////////////////////////////////////////// // Metadata /////////////////////////////////////////////////////////////////////////// From dd22c44738e9d7895ff918a36ae42cdb3943b4e7 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 10 Mar 2019 03:20:17 +0300 Subject: [PATCH 199/508] Use PeriodicFakeEntityObserver for online player management --- .../observer/PeriodicFakeEntityObserver.java | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java index 20c92f32e..39db8d019 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java @@ -2,6 +2,9 @@ import lombok.*; import lombok.experimental.FieldDefaults; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.ObservableFakeEntity; @@ -18,6 +21,7 @@ import java.util.function.Supplier; import static com.google.common.base.Preconditions.checkArgument; +import static ru.progrm_jarvis.minecraft.commons.event.FluentBukkitEvents.on; import static ru.progrm_jarvis.minecraft.commons.util.hack.PreSuperCheck.beforeSuper; @ToString @@ -28,6 +32,7 @@ public class PeriodicFakeEntityObserver

tasks = new HashSet<>(); Lock lock = new ReentrantLock(); + boolean global; long interval; boolean async; int minEntitiesForNewThread; @@ -37,7 +42,7 @@ public class PeriodicFakeEntityObserver

> entitiesSetSupplier) { super(plugin, beforeSuper(concurrent, @@ -46,6 +51,7 @@ public PeriodicFakeEntityObserver(@Nonnull final P plugin, final boolean concurr () -> checkArgument(maxThreads > 0, "maxThreads should be positive") )); + this.global = global; this.interval = interval; this.async = async; this.minEntitiesForNewThread = minEntitiesForNewThread; @@ -61,6 +67,22 @@ public PeriodicFakeEntityObserver(@Nonnull final P plugin, final boolean concurr lock.unlock(); } }); + + if (global) shutdownHooks + .add(on(PlayerJoinEvent.class) + .plugin(plugin) + .register(event -> addPlayer(event.getPlayer()))::shutdown) + .add(on(PlayerQuitEvent.class) + .plugin(plugin) + .register(event -> removePlayer(event.getPlayer()))::shutdown); + } + + public void addPlayer(@NonNull final Player player) { + for (val entity : entities) entity.addPlayer(player); + } + + public void removePlayer(@NonNull final Player player) { + for (val entity : entities) entity.removePlayer(player); } protected RedrawEntitiesRunnable getRedrawEntitiesRunnable() { @@ -139,6 +161,7 @@ public int size() { public void addEntity(final E entity) { lock.writeLock().lock(); try { + if (global && entity.isGlobal()) entity.addOnlinePlayers(); entities.add(entity); } finally { lock.writeLock().unlock(); From 01effe51c8e84182208d58aa3af97288c2d37873 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 10 Mar 2019 03:21:06 +0300 Subject: [PATCH 200/508] Cancel event in ProtocolBasedFakeEntityInteractionHandler --- .../behaviour/ProtocolBasedFakeEntityInteractionHandler.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java index 75f2e23c1..2a3ba0775 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java @@ -92,6 +92,8 @@ public void onPacketReceiving(final PacketEvent event) { break; } } + + event.setCancelled(true); } @Override From a72849ba46b4494db747839845154996479f1f13 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 10 Mar 2019 03:24:22 +0300 Subject: [PATCH 201/508] Try fix ConcurrentModificationException in BukkitPluginShutdownUtil --- .../minecraft/commons/plugin/BukkitPluginShutdownUtil.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java index 5578cef7b..eb4c8cdbf 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -65,7 +65,8 @@ private PluginShutdownHandler(@NonNull final Plugin plugin) { public void onPluginDisable(final PluginDisableEvent event) { val handler = PLUGIN_SHUTDOWN_HANDLERS.get(event.getPlugin()); if (handler != null) { - for (val shutdownable : handler.callbacks) shutdownable.shutdown(); + val callbacks = new ArrayList<>(handler.callbacks); + for (val shutdownable : callbacks) shutdownable.shutdown(); handler.callbacks.clear(); } } From 42e6429b13b127142f877b6af54ae86e58749095 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 10 Mar 2019 03:42:54 +0300 Subject: [PATCH 202/508] Small fixes in AbstractBasicFakeEntity movements --- .../fakeentitylib/entity/AbstractBasicFakeEntity.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index f5a61c0c3..ef553312a 100644 --- a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -167,7 +167,7 @@ protected abstract void performTeleportation(double x, double y, double z, @Override public void move(final double dx, final double dy, final double dz, final float dYaw, final float dPitch) { if (dx == 0 && dy == 0 && dz == 0) { - if (dYaw == 0 && dPitch == 0) { + if (dYaw != 0 || dPitch != 0) { final float yaw = location.getYaw() + dYaw, pitch = location.getPitch() + dPitch; performLook(yaw, pitch); @@ -199,7 +199,7 @@ public void move(final double dx, final double dy, final double dz, final float performMoveLook(dx, dy, dz, dYaw, dPitch); location.setYaw(location.getYaw() + dYaw); - location.setPitch(location.getPitch()); + location.setPitch(location.getPitch() + dPitch); } location.setX(location.getX() + dx); @@ -271,11 +271,10 @@ else if (yaw != location.getYaw() || pitch != location.getPitch()) { location.setYaw(yaw); location.setPitch(pitch); - } - else performMove(dx, dy, dz); + } else performMove(dx, dy, dz); location.setX(x); - location.setZ(y); + location.setY(y); location.setZ(z); velocity.setX(0); From 7ac60c72e1c1b2d904528f0a9480d3fd5e95a116 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 13 Mar 2019 00:39:56 +0300 Subject: [PATCH 203/508] Add legacy support to nms.metadata package --- .../nms/metadata/DataWatcherFactory.java | 18 + .../metadata/LegacyDataWatcherFactory.java | 12 + .../nms/metadata/MetadataGenerator.java | 572 +++++++++++++----- .../metadata/StandardDataWatcherFactory.java | 17 + 4 files changed, 478 insertions(+), 141 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java index 25a52853c..671416b9c 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java @@ -21,6 +21,15 @@ public interface DataWatcherFactory { */ WrappedWatchableObject createWatchable(int id, Byte value); + /** + * Creates watchable object for {@link Short} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + WrappedWatchableObject createWatchable(int id, Short value); + /** * Creates watchable object for {@link Integer} value at index specified. * @@ -227,6 +236,15 @@ interface DataWatcherModifier { */ DataWatcherModifier set(int id, Byte value); + /** + * Sets DataWatcher's modifier to specified {@link Short} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + DataWatcherModifier set(int id, Short value); + /** * Sets DataWatcher's modifier to specified {@link Integer} value at specified index. * diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java index 6f03d89b3..ca29cc2fe 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java @@ -30,6 +30,11 @@ public WrappedWatchableObject createWatchable(final int id, final Byte value) { return new WrappedWatchableObject(id, value); } + @Override + public WrappedWatchableObject createWatchable(final int id, final Short value) { + return new WrappedWatchableObject(id, value); + } + @Override public WrappedWatchableObject createWatchable(final int id, final Integer value) { return new WrappedWatchableObject(id, value); @@ -127,6 +132,13 @@ public DataWatcherModifier set(final int id, final Byte value) { return this; } + @Override + public DataWatcherFactory.DataWatcherModifier set(final int id, final Short value) { + dataWatcher.setObject(id, value); + + return this; + } + @Override public DataWatcherModifier set(final int id, final Integer value) { dataWatcher.setObject(id, value); diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java index 56b5a4cbb..f0d0e4c6c 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java @@ -3,20 +3,23 @@ import com.comphenix.protocol.wrappers.*; import com.comphenix.protocol.wrappers.EnumWrappers.Particle; import com.comphenix.protocol.wrappers.nbt.NbtCompound; -import lombok.RequiredArgsConstructor; +import lombok.*; +import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; -import lombok.val; -import lombok.var; +import org.bukkit.Bukkit; import org.bukkit.inventory.ItemStack; import ru.progrm_jarvis.minecraft.commons.nms.Conversions; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; +import javax.annotation.Nullable; import java.util.Optional; import java.util.UUID; /** * Editor for Metadata of {@link WrappedWatchableObject} providing classes * containing static methods for developer-friendly object creation. + * + * @see 1.8 metadata format */ @UtilityClass public class MetadataGenerator { @@ -24,6 +27,7 @@ public class MetadataGenerator { private final int VERSION = NmsUtil.getVersion().getGeneration(); private final DataWatcherFactory FACTORY = NmsUtil.getDataWatcherFactory(); + @NoArgsConstructor(access = AccessLevel.NONE) public static class Entity { public static WrappedWatchableObject entityFlags(final Flag... flags) { @@ -33,8 +37,8 @@ public static WrappedWatchableObject entityFlags(final Flag... flags) { return FACTORY.createWatchable(0, flagBytes); } - public static WrappedWatchableObject air(final boolean air) { - return FACTORY.createWatchable(1, air); + public static WrappedWatchableObject air(final int air) { + return VERSION >= 9 ? FACTORY.createWatchable(1, air) : FACTORY.createWatchable(1, (short) air); } public static WrappedWatchableObject name(final WrappedChatComponent name) { @@ -42,7 +46,7 @@ public static WrappedWatchableObject name(final WrappedChatComponent name) { } public static WrappedWatchableObject name(final String name) { - if (VERSION > 13) return name(WrappedChatComponent.fromText(name)); + if (VERSION >= 13) return name(WrappedChatComponent.fromText(name)); return FACTORY.createWatchable(2, name); } @@ -55,47 +59,59 @@ public static WrappedWatchableObject silent(final boolean silent) { } public static WrappedWatchableObject noGravity(final boolean noGravity) { - return FACTORY.createWatchable(5, noGravity); + if (VERSION >= 9) return FACTORY.createWatchable(5, noGravity); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support No Gravity entity flag"); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { ON_FIRE((byte) 0x01), CROUCHED((byte) 0x02), RIDING((byte) 0x04), SPRINTING((byte) 0x08), + INTERACTING((byte) 0x10), // legacy SWIMMING((byte) 0x10), INVISIBLE((byte) 0x20), GLOWING((byte) 0x80); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Projectile extends Entity {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Snowball extends Projectile {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Egg extends Projectile {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Potion extends Projectile { - public static WrappedWatchableObject potion(final Object potion) { - return FACTORY.createWatchableItemStack(6, potion); + public static WrappedWatchableObject potion(final Object nmsItemStackPotion) { + if (VERSION >= 9) return FACTORY.createWatchableItemStack(6, nmsItemStackPotion); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Potion metadata"); } public static WrappedWatchableObject potion(final ItemStack potion) { - return FACTORY.createWatchable(6, potion); + if (VERSION >= 9) return FACTORY.createWatchable(6, potion); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Potion metadata"); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class FallingBlock extends Entity { public static WrappedWatchableObject position(final BlockPosition position) { - return FACTORY.createWatchable(6, position); + if (VERSION >= 9) return FACTORY.createWatchable(6, position); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Potion metadata"); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class AreaEffectCloud extends Entity { public static WrappedWatchableObject radius(final float radius) { @@ -116,38 +132,46 @@ public static WrappedWatchableObject singlePoint(final Particle particle) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class FishingHook extends Entity { public static WrappedWatchableObject hookedEntity(final int hookedEntityId) { - return FACTORY.createWatchable(6, hookedEntityId); + if (VERSION >= 9) return FACTORY.createWatchable(6, hookedEntityId); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Fishing Hook metadata"); } public static WrappedWatchableObject hookedEntity(final org.bukkit.entity.Entity entity) { - return hookedEntity(entity.getEntityId() + 1); + if (VERSION >= 9) return hookedEntity(entity.getEntityId() + 1); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Fishing Hook metadata"); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Arrow extends Entity { public static WrappedWatchableObject arrowFlags(final Flag... flags) { var flagBytes = (byte) 0; for (val flag : flags) flagBytes |= flag.value; - return FACTORY.createWatchable(6, flagBytes); + return FACTORY.createWatchable(VERSION >= 9 ? 6 : 16, flagBytes); } - public static WrappedWatchableObject shooter(final UUID shooterUuid) { - return FACTORY.createWatchableOptionalUUID(7, Optional.ofNullable(shooterUuid)); + public static WrappedWatchableObject shooter(@Nullable final UUID shooterUuid) { + if (VERSION >= 9) return FACTORY.createWatchableOptionalUUID(7, Optional.ofNullable(shooterUuid)); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Arrow metadata"); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flags { - CRITICAL((byte) 0x01); + CRITICAL((byte) 0x01), + NO_CLIP((byte) 0x02); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class TippedArrow extends Arrow { public static WrappedWatchableObject color(final int color) { @@ -155,6 +179,7 @@ public static WrappedWatchableObject color(final int color) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Trident extends Arrow { public static WrappedWatchableObject loyaltyLevel(final int loyaltyLevel) { @@ -162,37 +187,43 @@ public static WrappedWatchableObject loyaltyLevel(final int loyaltyLevel) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Boat extends Entity { public static WrappedWatchableObject timeSinceLastHit(final int timeSinceLastHit) { - return FACTORY.createWatchable(6, timeSinceLastHit); + return FACTORY.createWatchable(VERSION >= 9 ? 6 : 17, timeSinceLastHit); } public static WrappedWatchableObject forwardDirection(final int forwardDirection) { - return FACTORY.createWatchable(7, forwardDirection); + return FACTORY.createWatchable(VERSION >= 9 ? 7 : 18, forwardDirection); } public static WrappedWatchableObject damageTaken(final float damageTaken) { - return FACTORY.createWatchable(8, damageTaken); + return FACTORY.createWatchable(VERSION >= 9 ? 8 : 19, damageTaken); } public static WrappedWatchableObject type(final Type type) { - return FACTORY.createWatchable(9, type.value); + if (VERSION >= 9) return FACTORY.createWatchable(9, type.value); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Boat type metadata"); } public static WrappedWatchableObject rightPaddleTurning(final boolean rightPaddleTurning) { - return FACTORY.createWatchable(10, rightPaddleTurning); + if (VERSION >= 9) return FACTORY.createWatchable(10, rightPaddleTurning); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Boat right paddle turning metadata"); } public static WrappedWatchableObject leftPaddleTurning(final boolean leftPaddleTurning) { - return FACTORY.createWatchable(11, leftPaddleTurning); + if (VERSION >= 9) return FACTORY.createWatchable(11, leftPaddleTurning); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Boat left paddle turning metadata"); } public static WrappedWatchableObject splashTimer(final int splashTimer) { - return FACTORY.createWatchable(12, splashTimer); + if (VERSION >= 9) return FACTORY.createWatchable(12, splashTimer); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Boat splash timer metadata"); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Type { OAK((byte) 0), SPRUCE((byte) 1), @@ -201,10 +232,11 @@ public enum Type { ACACIA((byte) 4), DARK_OAK((byte) 5); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class EnderCrystal extends Entity { public static WrappedWatchableObject position(final BlockPosition position) { @@ -214,17 +246,28 @@ public static WrappedWatchableObject position(final BlockPosition position) { public static WrappedWatchableObject showBottom(final boolean showBottom) { return FACTORY.createWatchable(7, showBottom); } + + public static WrappedWatchableObject health(final int health) { + if (VERSION >= 9) throw new UnsupportedOperationException( + "1.9 and later don't support Ender Crystal health metadata" + ); + return FACTORY.createWatchable(8, health); + } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Fireball extends Entity {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class WitherSkull extends Entity { public static WrappedWatchableObject invulnerable(final boolean invulnerable) { - return FACTORY.createWatchable(6, invulnerable); + if (VERSION >= 9) return FACTORY.createWatchable(6, invulnerable); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Wither Skull invulnerable metadata"); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Fireworks extends Entity { public static WrappedWatchableObject item(final Object nmsItem) { @@ -236,112 +279,157 @@ public static WrappedWatchableObject item(final ItemStack item) { } public static WrappedWatchableObject shooter(final int shooter) { - return FACTORY.createWatchable(6, shooter); + if (VERSION >= 9) return FACTORY.createWatchable(6, shooter); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Wither Fireworks shooter metadata"); } public static WrappedWatchableObject shooter(final org.bukkit.entity.Entity entity) { - return shooter(entity.getEntityId()); + if (VERSION >= 9) return shooter(entity.getEntityId()); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Fireworks shooter metadata"); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Hanging extends Entity {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class ItemFrame extends Hanging { public static WrappedWatchableObject item(final Object nmsItem) { - return FACTORY.createWatchableItemStack(6, nmsItem); + return FACTORY.createWatchableItemStack(VERSION >= 9 ? 6 : 8, nmsItem); } public static WrappedWatchableObject item(final ItemStack item) { - return FACTORY.createWatchable(6, item); + return FACTORY.createWatchable(VERSION >= 9 ? 6 : 8, item); } public static WrappedWatchableObject rotation(final int rotation) { - return FACTORY.createWatchable(7, rotation); + if (VERSION >= 9) return FACTORY.createWatchable(7, rotation); + return FACTORY.createWatchable(9, (byte) rotation); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Item extends Entity { public static WrappedWatchableObject item(final Object nmsItem) { - return FACTORY.createWatchableItemStack(6, nmsItem); + return FACTORY.createWatchableItemStack(VERSION >= 9 ? 6 : 10, nmsItem); } public static WrappedWatchableObject item(final ItemStack item) { - return FACTORY.createWatchable(6, item); + return FACTORY.createWatchable(VERSION >= 9 ? 6 : 10, item); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Living extends Entity { public static WrappedWatchableObject handStates(final HandState... handStates) { - var handStateBytes = (byte) 0; - for (val handState : handStates) handStateBytes |= handState.value; + if (VERSION >= 9) { + var handStateBytes = (byte) 0; + for (val handState : handStates) handStateBytes |= handState.value; - return FACTORY.createWatchableObject(6, handStateBytes); + return FACTORY.createWatchableObject(6, handStateBytes); + } + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Living handStates metadata"); } public static WrappedWatchableObject health(final float health) { - return FACTORY.createWatchable(7, health); + return FACTORY.createWatchable(VERSION >= 9 ? 7 : 6, health); } public static WrappedWatchableObject potionEffectColor(final int potionEffectColor) { - return FACTORY.createWatchable(8, potionEffectColor); + return FACTORY.createWatchable(VERSION >= 9 ? 8 : 7, potionEffectColor); } public static WrappedWatchableObject potionEffectAmbient(final boolean potionEffectAmbient) { - return FACTORY.createWatchable(9, potionEffectAmbient); + return FACTORY.createWatchable(VERSION >= 9 ? 8 : 9, potionEffectAmbient); } public static WrappedWatchableObject numberOfArrows(final int numberOfArrows) { - return FACTORY.createWatchable(10, numberOfArrows); + return FACTORY.createWatchable(VERSION >= 9 ? 10 : 9, numberOfArrows); + } + + @Deprecated + public static WrappedWatchableObject noAi(final boolean noAi) { + if (VERSION >= 9) return noAi + ? Insentient.insentientFlags(Insentient.Flag.NO_AI) : Insentient.insentientFlags(); + return FACTORY.createWatchable(15, noAi); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum HandState { HAND_ACTIVE((byte) 0x01), OFFHAND((byte) 0x02), RIPTIDE_SPIN_ATTACK((byte) 0x04); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Player extends Living { public static WrappedWatchableObject additionalHearts(final float additionalHearts) { - return FACTORY.createWatchable(11, additionalHearts); + if (VERSION >= 9) return FACTORY.createWatchable(11, additionalHearts); + throw new UnsupportedOperationException( + "Versions prior to 1.9 don't support Player additional hearts metadata" + ); } public static WrappedWatchableObject score(final int score) { - return FACTORY.createWatchable(12, score); + if (VERSION >= 9) return FACTORY.createWatchable(12, score); + throw new UnsupportedOperationException( + "Versions prior to 1.9 don't support Player score metadata" + ); } public static WrappedWatchableObject skinParts(final SkinPart... skinParts) { - var skinPartBytes = (byte) 0; - for (val skinPart : skinParts) skinPartBytes |= skinPart.value; + if (VERSION >= 9) { + var skinPartBytes = (byte) 0; + for (val skinPart : skinParts) skinPartBytes |= skinPart.value; - return FACTORY.createWatchableObject(13, skinPartBytes); + return FACTORY.createWatchableObject(13, skinPartBytes); + } + throw new UnsupportedOperationException( + "Versions prior to 1.9 don't support Player skin parts metadata" + ); } public static WrappedWatchableObject mainHand(final MainHand mainHand) { - return FACTORY.createWatchable(14, mainHand.value); + if (VERSION >= 9) return FACTORY.createWatchable(14, mainHand.value); + throw new UnsupportedOperationException( + "Versions prior to 1.9 don't support Player main hand metadata" + ); } public static WrappedWatchableObject leftShoulderEntity(final Object leftShoulderEntityNbtTagCompound) { - return FACTORY.createWatchableObject(15, leftShoulderEntityNbtTagCompound); + if (VERSION >=13) return FACTORY.createWatchableObject(15, leftShoulderEntityNbtTagCompound); + throw new UnsupportedOperationException( + "Versions prior to 1.13 don't support Player left shoulder entity metadata" + ); } public static WrappedWatchableObject leftShoulderEntity(final NbtCompound leftShoulderEntityNbt) { - return leftShoulderEntity(leftShoulderEntityNbt.getHandle()); + if (VERSION >= 13) return leftShoulderEntity(leftShoulderEntityNbt.getHandle()); + throw new UnsupportedOperationException( + "Versions prior to 1.13 don't support Player left shoulder entity metadata" + ); } public static WrappedWatchableObject rightShoulderEntity(final Object rightShoulderEntityNbtTagCompound) { - return FACTORY.createWatchableNBTTagCompound(16, rightShoulderEntityNbtTagCompound); + if (VERSION >= 13) return FACTORY.createWatchableNBTTagCompound(16, rightShoulderEntityNbtTagCompound); + throw new UnsupportedOperationException( + "Versions prior to 1.13 don't support Player right shoulder entity metadata" + ); } public static WrappedWatchableObject rightShoulderEntity(final NbtCompound rightShoulderEntityNbt) { - return rightShoulderEntity(rightShoulderEntityNbt.getHandle()); + if (VERSION >= 13) return rightShoulderEntity(rightShoulderEntityNbt.getHandle()); + throw new UnsupportedOperationException( + "Versions prior to 1.13 don't support Player right shoulder entity metadata" + ); } @RequiredArgsConstructor @@ -367,93 +455,110 @@ public enum MainHand { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class ArmorStand extends Living { public static WrappedWatchableObject armorStandFlags(final Flag... flags) { var flagBytes = (byte) 0; for (val flag : flags) flagBytes |= flag.value; - return FACTORY.createWatchable(11, flagBytes); + return FACTORY.createWatchable(VERSION >= 9 ? 11 : 10, flagBytes); } public static WrappedWatchableObject headRotation(final Vector3F headRotation) { - return FACTORY.createWatchable(12, headRotation); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 11, headRotation); } public static WrappedWatchableObject bodyRotation(final Vector3F bodyRotation) { - return FACTORY.createWatchable(13, bodyRotation); + return FACTORY.createWatchable(VERSION >= 9 ? 13 : 12, bodyRotation); } public static WrappedWatchableObject leftArmRotation(final Vector3F leftArmRotation) { - return FACTORY.createWatchable(14, leftArmRotation); + return FACTORY.createWatchable(VERSION >= 9 ? 14 : 13, leftArmRotation); } public static WrappedWatchableObject rightArmRotation(final Vector3F rightArmRotation) { - return FACTORY.createWatchable(15, rightArmRotation); + return FACTORY.createWatchable(VERSION >= 9 ? 15 : 14, rightArmRotation); } public static WrappedWatchableObject leftLegRotation(final Vector3F leftLegRotation) { - return FACTORY.createWatchable(16, leftLegRotation); + return FACTORY.createWatchable(VERSION >= 9 ? 16 : 15, leftLegRotation); } public static WrappedWatchableObject rightLegRotation(final Vector3F rightLegRotation) { - return FACTORY.createWatchable(17, rightLegRotation); + return FACTORY.createWatchable(VERSION >= 9 ? 17 : 16, rightLegRotation); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { SMALL((byte) 0x01), HAS_ARMS((byte) 0x04), NO_BASE_PLATE((byte) 0x08), MARKER((byte) 0x10); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Insentient extends Living { public static WrappedWatchableObject insentientFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + if (VERSION >= 9) { + var flagBytes = (byte) 0; + for (val flag : flags) flagBytes |= flag.value; + + return FACTORY.createWatchable(11, flagBytes); + } - return FACTORY.createWatchable(11, flagBytes); + // for versions prior to 1.9 NO_AI is byte at index <15> + for (val flag : flags) if (flag == Flag.NO_AI) return FACTORY.createWatchable(15, (byte) 0x1); + return FACTORY.createWatchable(15, (byte) 0x0); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { NO_AI((byte) 0x01), LEFT_HANDED((byte) 0x02); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Ambient extends Insentient {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Bat extends Ambient { public static WrappedWatchableObject batFlags(final Flag... flags) { var flagBytes = (byte) 0; for (val flag : flags) flagBytes |= flag.value; - return FACTORY.createWatchable(12, flagBytes); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { HANGING((byte) 0x01); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Creature extends Insentient {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class WaterMob extends Creature {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Squid extends WaterMob {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Dolphin extends WaterMob { public static WrappedWatchableObject treasurePosition(final BlockPosition treasurePosition) { @@ -469,6 +574,7 @@ public static WrappedWatchableObject hasFish(final boolean hasFish) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Fish extends WaterMob { public static WrappedWatchableObject fromBucket(final boolean fromBucket) { @@ -476,8 +582,10 @@ public static WrappedWatchableObject fromBucket(final boolean fromBucket) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Cod extends Fish {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class PufferFish extends Fish { public static WrappedWatchableObject puffState(final int puffState) { @@ -485,8 +593,10 @@ public static WrappedWatchableObject puffState(final int puffState) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Salmon extends Fish {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class TropicalFish extends Fish { public static WrappedWatchableObject variant(final int variant) { @@ -494,6 +604,7 @@ public static WrappedWatchableObject variant(final int variant) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Ageable extends Creature { public static WrappedWatchableObject baby(final boolean baby) { @@ -501,8 +612,10 @@ public static WrappedWatchableObject baby(final boolean baby) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Animal extends Ageable {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class AbstractHorse extends Animal { public static WrappedWatchableObject horseFlags(final Flag... flags) { @@ -513,66 +626,128 @@ public static WrappedWatchableObject horseFlags(final Flag... flags) { } public static WrappedWatchableObject owner(final UUID ownerUuid) { - return FACTORY.createWatchableOptionalUUID(14, Optional.ofNullable(ownerUuid)); + if (VERSION >= 9) return FACTORY.createWatchableOptionalUUID(14, Optional.ofNullable(ownerUuid)); + return FACTORY.createWatchable(21, Bukkit.getOfflinePlayer(ownerUuid).getName()); + } + + @Deprecated + public static WrappedWatchableObject owner(final String ownerName) { + if (VERSION >= 9) return FACTORY.createWatchableOptionalUUID( + 14, Optional.ofNullable(Bukkit.getOfflinePlayer(ownerName).getUniqueId()) + ); + return FACTORY.createWatchable(21, ownerName); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { - UNUSED_1((byte) 0x01), TAME((byte) 0x02), + CHEST((byte) 0x0, (byte) 0x8), // legacy SADDLED((byte) 0x04), - BRED((byte) 0x08), - EATING((byte) 0x10), - REARING((byte) 0x20), - MOUTH_OPEN((byte) 0x40), - UNUSED_2((byte) 0x80); + BRED((byte) 0x08, (byte) 0x10), + EATING((byte) 0x10, (byte) 0x20), + REARING((byte) 0x20, (byte) 0x40), + MOUTH_OPEN((byte) 0x40, (byte) 0x80); - private final byte value; + byte value, legacyValue; + + Flag(final byte value) { + this(value, value); + } } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Horse extends AbstractHorse { + @Deprecated + public static WrappedWatchableObject horseType(final Type horseType) { + if (VERSION >= 9) throw new UnsupportedOperationException( + "Versions 1.9 and later don't support Horse type metadata" + ); + return FACTORY.createWatchable(19, horseType.value); + } + public static WrappedWatchableObject variant(final int variant) { - return FACTORY.createWatchable(15, variant); + return FACTORY.createWatchable(VERSION > 9 ? 15 : 20, variant); } public static WrappedWatchableObject armor(final Armor armor) { - return FACTORY.createWatchable(16, armor.value); + return FACTORY.createWatchable(VERSION > 9 ? 16 : 22, armor.value); } public static WrappedWatchableObject forgeArmor(final Object nmsItem) { + // not sure whether to disable for old versions as it is related to Forge return FACTORY.createWatchableItemStack(17, nmsItem); } public static WrappedWatchableObject forgeArmor(final ItemStack item) { + // not sure whether to disable for old versions as it is related to Forge return FACTORY.createWatchable(17, item); } + @Deprecated + @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum Type { + HORSE((byte) 0), + DONKEY((byte) 1), + MULE((byte) 2), + ZOMBIE((byte) 3), + SKELETON((byte) 4); + + byte value; + } + @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Armor { NONE(0), IRON(1), GOLD(2), DIAMOND(3); - private final int value; + int value; + } + + @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum Flag { + TAME((byte) 0x02), + CHEST((byte) 0x0, (byte) 0x8), // legacy + SADDLED((byte) 0x04), + BRED((byte) 0x08, (byte) 0x10), + EATING((byte) 0x10, (byte) 0x20), + REARING((byte) 0x20, (byte) 0x40), + MOUTH_OPEN((byte) 0x40, (byte) 0x80); + + byte value, legacyValue; + + Flag(final byte value) { + this(value, value); + } } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class ZombieHorse extends AbstractHorse {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class SkeletonHorse extends AbstractHorse {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class ChestedHorse extends AbstractHorse { public static WrappedWatchableObject chest(final boolean chest) { - return FACTORY.createWatchable(15, chest); + if (VERSION >= 9) return FACTORY.createWatchable(15, chest); + return FACTORY.createWatchable(16, (byte) 0x08); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Donkey extends ChestedHorse {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Llama extends ChestedHorse { public static WrappedWatchableObject strength(final int strength) { @@ -588,36 +763,42 @@ public static WrappedWatchableObject variant(final Variant variant) { } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Variant { CREAMY((byte) 0), WHITE((byte) 1), BROWN((byte) 2), GRAY((byte) 3); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Mule extends ChestedHorse {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Pig extends Animal { public static WrappedWatchableObject saddle(final boolean saddle) { - return FACTORY.createWatchable(13, saddle); + return FACTORY.createWatchable(VERSION >= 9 ? 13 : 16, saddle); } public static WrappedWatchableObject boostTime(final int boostTime) { - return FACTORY.createWatchable(14, boostTime); + if (VERSION >= 9) return FACTORY.createWatchable(14, boostTime); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Pig boost time metadata"); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Rabbit extends Animal { public static WrappedWatchableObject type(final int type) { - return FACTORY.createWatchable(13, type); + return FACTORY.createWatchable(VERSION >= 9 ? 13 : 18, type); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Turtle extends Animal { public static WrappedWatchableObject home(final BlockPosition home) { @@ -645,6 +826,7 @@ public static WrappedWatchableObject travelling(final boolean travelling) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class PolarBear extends Animal { public static WrappedWatchableObject standingUp(final boolean standingUp) { @@ -652,68 +834,75 @@ public static WrappedWatchableObject standingUp(final boolean standingUp) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Sheep extends Animal { - public static WrappedWatchableObject standingUp(final byte color, final boolean sheared) { - return FACTORY.createWatchable(13, color & 0x0F | (sheared ? 0 : 0x10)); + public static WrappedWatchableObject sheepData(final byte color, final boolean sheared) { + return FACTORY.createWatchable(13, color & 0x0F | (sheared ? 0x0 : 0x10)); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Tameable extends Animal { public static WrappedWatchableObject tameableFlags(final Flag... flags) { var flagBytes = (byte) 0; for (val flag : flags) flagBytes |= flag.value; - return FACTORY.createWatchable(13, flagBytes); + return FACTORY.createWatchable(VERSION >= 9 ? 13 : 16, flagBytes); } public static WrappedWatchableObject owner(final UUID ownerUuid) { - return FACTORY.createWatchableOptionalUUID(14, Optional.ofNullable(ownerUuid)); + return FACTORY.createWatchableOptionalUUID(VERSION >= 9 ? 14 : 17, Optional.ofNullable(ownerUuid)); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { SITTING((byte) 0x01), ANGRY((byte) 0x02), TAMED((byte) 0x04); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Ocelot extends Tameable { public static WrappedWatchableObject variant(final Variant variant) { - return FACTORY.createWatchable(15, variant.value); + return FACTORY.createWatchable(VERSION >= 9 ? 15 : 18, variant.value); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Variant { UNTAMED(0), TUXEDO(1), TABBY(2), SIAMESE(3); - private final int value; + int value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Wolf extends Tameable { public static WrappedWatchableObject damageTaken(final float damageTaken) { - return FACTORY.createWatchable(15, damageTaken); + return FACTORY.createWatchable(VERSION >= 9 ? 15 : 18, damageTaken); } public static WrappedWatchableObject begging(final boolean begging) { - return FACTORY.createWatchable(16, begging); + return FACTORY.createWatchable(VERSION >= 9 ? 16 : 19, begging); } public static WrappedWatchableObject collarColor(final byte collarColor) { - return FACTORY.createWatchable(17, collarColor); + return FACTORY.createWatchable(VERSION >= 9 ? 17 : 20, collarColor); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Parrot extends Tameable { public static WrappedWatchableObject variant(final Variant variant) { @@ -721,6 +910,7 @@ public static WrappedWatchableObject variant(final Variant variant) { } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Variant { RED_BLUE(0), BLUE(1), @@ -728,17 +918,22 @@ public enum Variant { YELLOW_BLUE(3), SILVER(4); - private final int value; + int value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Villager extends Ageable { public static WrappedWatchableObject profession(final Profession profession) { + if (VERSION >= 9) throw new UnsupportedOperationException( + "1.9 and later don't support Villager profession metadata" + ); return FACTORY.createWatchable(13, profession.value); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Profession { FARMER(0), LIBRARIAN(1), @@ -746,46 +941,55 @@ public enum Profession { BLACKSMITH(3), SILVER(4); - private final int value; + int value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Golem extends Creature {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class IronGolem extends Golem { public static WrappedWatchableObject ironGolemFlags(final Flag... flags) { var flagBytes = (byte) 0; for (val flag : flags) flagBytes |= flag.value; - return FACTORY.createWatchable(12, flagBytes); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { PLAYER_CREATED((byte) 0x01); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Snowman extends Golem { - public static WrappedWatchableObject ironGolemFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + public static WrappedWatchableObject snowmanFlags(final Flag... flags) { + if (VERSION >= 9) { + var flagBytes = (byte) 0; + for (val flag : flags) flagBytes |= flag.value; - return FACTORY.createWatchable(12, flagBytes); + return FACTORY.createWatchable(12, flagBytes); + } + throw new UnsupportedOperationException("Versions lower than 1.9 don't support Snowman flags metadata"); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { HAS_PUMPKIN((byte) 0x10); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Shulker extends Golem { public static WrappedWatchableObject facing(final Object enumDirection) { @@ -809,60 +1013,78 @@ public static WrappedWatchableObject color(final byte color) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Monster extends Creature {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Blaze extends Monster { public static WrappedWatchableObject blazeFlags(final Flag... flags) { var flagBytes = (byte) 0; for (val flag : flags) flagBytes |= flag.value; - return FACTORY.createWatchable(12, flagBytes); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { ON_FIRE((byte) 0x01); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Creeper extends Monster { public static WrappedWatchableObject creeperState(final State state) { - return FACTORY.createWatchable(12, state.value); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, state.value); } public static WrappedWatchableObject charged(final boolean charged) { - return FACTORY.createWatchable(13, charged); + return FACTORY.createWatchable(VERSION >= 9 ? 13 : 17, charged); } public static WrappedWatchableObject ignited(final boolean ignited) { - return FACTORY.createWatchable(14, ignited); + if (VERSION >= 9) return FACTORY.createWatchable(14, ignited); + throw new UnsupportedOperationException("Versions lower than 1.9 don't support Creeper ignited metadata"); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum State { IDLE(-1), FUSE(1); - private final int value; + int value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Endermite extends Monster {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class GiantZombie extends Monster {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Guardian extends Monster { public static WrappedWatchableObject retractingSpikes(final boolean retractingSpikes) { - return FACTORY.createWatchable(12, retractingSpikes); + if (VERSION >= 13) return FACTORY.createWatchable(12, retractingSpikes); + return FACTORY.createWatchable(16, (byte) 0x04); + } + + @Deprecated + public static WrappedWatchableObject guardianFlags(final boolean elder, final boolean retractingSpikes) { + if (VERSION >= 13) return FACTORY.createWatchable(12, retractingSpikes); + return FACTORY.createWatchable( + 16, ((elder ? (byte) 0x02 : (byte) 0x0) | (retractingSpikes ? (byte) 0x04 : (byte) 0x0)) + ); } public static WrappedWatchableObject targetEntity(final int targetEntityId) { - return FACTORY.createWatchable(13, targetEntityId); + return FACTORY.createWatchable(VERSION >= 9 ? 13 : 17, targetEntityId); } public static WrappedWatchableObject targetEntity(final org.bukkit.entity.Entity entity) { @@ -870,10 +1092,13 @@ public static WrappedWatchableObject targetEntity(final org.bukkit.entity.Entity } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class ElderGuardian extends Guardian {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Silverfish extends Monster {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Illager extends Monster { public static WrappedWatchableObject illagerState(final State state) { @@ -881,15 +1106,18 @@ public static WrappedWatchableObject illagerState(final State state) { } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum State { HAS_TARGET((byte) 0x01); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class VindicatorIllager extends Illager {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class SpellcasterIllager extends Illager { public static WrappedWatchableObject spell(final Spell spell) { @@ -897,20 +1125,24 @@ public static WrappedWatchableObject spell(final Spell spell) { } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Spell { NONE((byte) 0), SUMMON_VEX((byte) 1), ATTACK((byte) 2), WOLOLO((byte) 3); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class EvocationIllager extends SpellcasterIllager {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class IllusionIllager extends SpellcasterIllager {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Vex extends Monster { public static WrappedWatchableObject vexFlags(final Flag... flags) { @@ -921,15 +1153,18 @@ public static WrappedWatchableObject vexFlags(final Flag... flags) { } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { ATTACK_MODE((byte) 0x01); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class EvocationFangs extends Entity {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class AbstractSkeleton extends Monster { public static WrappedWatchableObject swingingArms(final boolean swingingArms) { @@ -937,40 +1172,47 @@ public static WrappedWatchableObject swingingArms(final boolean swingingArms) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Skeleton extends AbstractSkeleton {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class WitherSkeleton extends AbstractSkeleton {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Stray extends AbstractSkeleton {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Spider extends Monster { public static WrappedWatchableObject spiderFlags(final Flag... flags) { var flagBytes = (byte) 0; for (val flag : flags) flagBytes |= flag.value; - return FACTORY.createWatchable(12, flagBytes); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { CLIMBING((byte) 0x01); - private final byte value; + byte value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Witch extends Monster { public static WrappedWatchableObject drinkingPotion(final boolean drinkingPotion) { - return FACTORY.createWatchable(12, drinkingPotion); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 21, drinkingPotion); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Wither extends Monster { public static WrappedWatchableObject centerHeadTarget(final int centerHeadTargetId) { - return FACTORY.createWatchable(12, centerHeadTargetId); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 17, centerHeadTargetId); } public static WrappedWatchableObject centerHeadTarget(final org.bukkit.entity.Entity centerHeadTarget) { @@ -978,7 +1220,7 @@ public static WrappedWatchableObject centerHeadTarget(final org.bukkit.entity.En } public static WrappedWatchableObject leftHeadTarget(final int leftHeadTargetId) { - return FACTORY.createWatchable(13, leftHeadTargetId); + return FACTORY.createWatchable(VERSION >= 9 ? 13 : 18, leftHeadTargetId); } public static WrappedWatchableObject leftHeadTarget(final org.bukkit.entity.Entity leftHeadTarget) { @@ -986,7 +1228,7 @@ public static WrappedWatchableObject leftHeadTarget(final org.bukkit.entity.Enti } public static WrappedWatchableObject rightHeadTarget(final int rightHeadTargetId) { - return FACTORY.createWatchable(14, rightHeadTargetId); + return FACTORY.createWatchable(VERSION >= 9 ? 14 : 19, rightHeadTargetId); } public static WrappedWatchableObject rightHeadTarget(final org.bukkit.entity.Entity rightHeadTarget) { @@ -994,33 +1236,42 @@ public static WrappedWatchableObject rightHeadTarget(final org.bukkit.entity.Ent } public static WrappedWatchableObject invulnerableTime(final int invulnerableTime) { - return FACTORY.createWatchable(15, invulnerableTime); + return FACTORY.createWatchable(VERSION >= 9 ? 15 : 20, invulnerableTime); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Zombie extends Monster { public static WrappedWatchableObject baby(final boolean baby) { return FACTORY.createWatchable(12, baby); } - public static WrappedWatchableObject legacyType(final int legacyType) { - return FACTORY.createWatchable(13, legacyType); + @Deprecated + public static WrappedWatchableObject zombieVillager(final boolean zombieVillager) { + return FACTORY.createWatchable(13, zombieVillager); } public static WrappedWatchableObject handsUp(final boolean handsUp) { - return FACTORY.createWatchable(14, handsUp); + if (VERSION >= 9) return FACTORY.createWatchable(14, handsUp); + else throw new UnsupportedOperationException( + "Versions prior to 1.9 don't support Zombie hands up flag metadata" + ); } public static WrappedWatchableObject becomingDrowned(final boolean becomingDrowned) { - return FACTORY.createWatchable(15, becomingDrowned); + if (VERSION >= 13) return FACTORY.createWatchable(15, becomingDrowned); + else throw new UnsupportedOperationException( + "Versions prior to 1.13 don't support Zombie becoming drowned flag metadata" + ); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class ZombieVillager extends Zombie { public static WrappedWatchableObject converting(final boolean converting) { - return FACTORY.createWatchable(16, converting); + return FACTORY.createWatchable(VERSION >= 9 ? 16 : 14, converting); } public static WrappedWatchableObject profession(final Villager.Profession profession) { @@ -1028,28 +1279,49 @@ public static WrappedWatchableObject profession(final Villager.Profession profes } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Husk extends Zombie {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Drowned extends Zombie {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Enderman extends Monster { public static WrappedWatchableObject carriedBlock(final Object carriedBlock) { - return FACTORY.createWatchableOptionalIBlockData(12, Optional.of(carriedBlock)); + if (VERSION >= 9) return FACTORY.createWatchableOptionalIBlockData(12, Optional.of(carriedBlock)); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Enderman carriedBlock metadata"); + } + + public static WrappedWatchableObject carriedBlockId(final short carriedBlockId) { + if (VERSION >= 9) throw new UnsupportedOperationException( + "Versions 1.9 and later don't support Enderman carried block ID metadata" + ); + return FACTORY.createWatchable(16, carriedBlockId); + } + + public static WrappedWatchableObject carriedBlockData(final byte carriedBlockData) { + if (VERSION >= 9) throw new UnsupportedOperationException( + "Versions 1.9 and later don't support Enderman carried block data metadata" + ); + return FACTORY.createWatchable(17, carriedBlockData); } public static WrappedWatchableObject screaming(final boolean screaming) { - return FACTORY.createWatchable(13, screaming); + return FACTORY.createWatchable(VERSION >= 9 ? 13 : 18, screaming); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class EnderDragon extends Monster { public static WrappedWatchableObject phase(final Phase phase) { - return FACTORY.createWatchable(12, phase.value); + if (VERSION >= 9) return FACTORY.createWatchable(12, phase.value); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Ender Dragon phase metadata"); } @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Phase { CIRCLING(0), STRAFING(1), @@ -1063,19 +1335,22 @@ public enum Phase { FLYDYING(9), NO_AI(10); - private final int value; + int value; } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Flying extends Insentient {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Ghast extends Flying { public static WrappedWatchableObject attacking(final boolean attacking) { - return FACTORY.createWatchable(12, attacking); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, attacking); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Phantom extends Flying { public static WrappedWatchableObject size(final int size) { @@ -1083,76 +1358,91 @@ public static WrappedWatchableObject size(final int size) { } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class Slime extends Insentient { public static WrappedWatchableObject size(final int size) { - return FACTORY.createWatchable(12, size); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, size); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class LlamaSpit extends Entity {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class Minecart extends Entity { public static WrappedWatchableObject shakingPower(final int shakingPower) { - return FACTORY.createWatchable(6, shakingPower); + return FACTORY.createWatchable(VERSION >= 9 ? 6 : 17, shakingPower); } public static WrappedWatchableObject shakingDirection(final int shakingDirection) { - return FACTORY.createWatchable(7, shakingDirection); + return FACTORY.createWatchable(VERSION >= 9 ? 7 : 18, shakingDirection); } public static WrappedWatchableObject shakingMultiplier(final int shakingMultiplier) { - return FACTORY.createWatchable(8, shakingMultiplier); + return FACTORY.createWatchable(VERSION >= 9 ? 8 : 19, shakingMultiplier); } public static WrappedWatchableObject customBlockIdAndDamage(final int customBlockIdAndDamage) { - return FACTORY.createWatchable(9, customBlockIdAndDamage); + return FACTORY.createWatchable(VERSION >= 9 ? 9 : 20, customBlockIdAndDamage); } public static WrappedWatchableObject customBlockY(final int customBlockY) { - return FACTORY.createWatchable(10, customBlockY); + return FACTORY.createWatchable(VERSION >= 9 ? 10 : 21, customBlockY); } public static WrappedWatchableObject showCustomBlock(final boolean showCustomBlock) { - return FACTORY.createWatchable(11, showCustomBlock); + return FACTORY.createWatchable(VERSION >= 9 ? 11 : 22, showCustomBlock); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class MinecartRideable extends Minecart {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class MinecartContainer extends Minecart {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class MinecartHopper extends Minecart {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class MinecartChest extends Minecart {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class MinecartFurnace extends Minecart { public static WrappedWatchableObject powered(final boolean powered) { - return FACTORY.createWatchable(12, powered); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, powered); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class MinecartTnt extends Minecart {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class MinecartSpawner extends Minecart {} + @NoArgsConstructor(access = AccessLevel.NONE) public static class MinecartCommandBlock extends Minecart { public static WrappedWatchableObject command(final String command) { - return FACTORY.createWatchable(12, command); + if (VERSION >= 9) return FACTORY.createWatchable(12, command); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Minecart Command Block command metadata"); } public static WrappedWatchableObject lastOutput(final WrappedChatComponent lastOutput) { - return FACTORY.createWatchable(13, lastOutput); + if (VERSION >= 9) return FACTORY.createWatchable(13, lastOutput); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support Minecart Command Block last output metadata"); } } + @NoArgsConstructor(access = AccessLevel.NONE) public static class TNTPrimed extends Entity { public static WrappedWatchableObject fuseTime(final int fuseTime) { - return FACTORY.createWatchable(6, fuseTime); + if (VERSION >= 9) return FACTORY.createWatchable(6, fuseTime); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support TNT Primed fuse time metadata"); } } } diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java index 6c2867597..48b6cf42b 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java @@ -16,6 +16,7 @@ public class StandardDataWatcherFactory implements DataWatcherFactory { protected static final WrappedDataWatcher.Serializer BYTE_SERIALIZER = Registry.get(Byte.class), + SHORT_SERIALIZER = Registry.get(Short.class), INTEGER_SERIALIZER = Registry.get(Integer.class), FLOAT_SERIALIZER = Registry.get(Float.class), STRING_SERIALIZER = Registry.get(String.class), @@ -34,6 +35,10 @@ protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectByte(final in return new WrappedDataWatcher.WrappedDataWatcherObject(id, BYTE_SERIALIZER); } + protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectShort(final int id) { + return new WrappedDataWatcher.WrappedDataWatcherObject(id, SHORT_SERIALIZER); + } + protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectInteger(final int id) { return new WrappedDataWatcher.WrappedDataWatcherObject(id, INTEGER_SERIALIZER); } @@ -95,6 +100,11 @@ public WrappedWatchableObject createWatchable(final int id, final Byte value) { return new WrappedWatchableObject(watcherObjectByte(id), value); } + @Override + public WrappedWatchableObject createWatchable(final int id, final Short value) { + return new WrappedWatchableObject(watcherObjectShort(id), value); + } + @Override public WrappedWatchableObject createWatchable(final int id, final Integer value) { return new WrappedWatchableObject(watcherObjectInteger(id), value); @@ -197,6 +207,13 @@ public DataWatcherModifier set(final int id, final Byte value) { return this; } + @Override + public DataWatcherFactory.DataWatcherModifier set(final int id, final Short value) { + dataWatcher.setObject(watcherObjectShort(id), value); + + return this; + } + @Override public DataWatcherModifier set(final int id, final Integer value) { dataWatcher.setObject(watcherObjectInteger(id), value); From cb3492ce93598a472a8a56dafdbf8ded7c5dc76d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 20 Mar 2019 18:34:38 +0300 Subject: [PATCH 204/508] Add flight-recorder module --- .../LazyIteratorToCollectionWrapper.java | 251 ++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java new file mode 100644 index 000000000..5e95c8e9d --- /dev/null +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java @@ -0,0 +1,251 @@ +package ru.progrm_jarvis.minecraft.commons.util.collection; + +import lombok.*; +import lombok.experimental.FieldDefaults; +import lombok.experimental.NonFinal; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * A wrapper for {@link Iterator} to be treated as a {@link Collection}. + * It provides lazy access to its entries so that iteration happens only when needed. + * + * @param type of element stored + */ +@RequiredArgsConstructor +@ToString(includeFieldNames = false) +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class LazyIteratorToCollectionWrapper> implements Collection { + + /** + * Iterator wrapped + */ + @EqualsAndHashCode.Include @NonNull Iterator iterator; + @NonNull Collection targetCollection; + + /** + * Gets the next element in the wrapped iterator + * + * @return next element in iterator if any or {@link null} if its end was reached. + */ + @Nullable protected E readNextIteratorElement() { + if (iterator.hasNext()) return iterator.next(); + return null; + } + + /** + * Iterates the wrapped iterator until the specified element is reached. + * + * @param element element to try to reach + * @return found element reference if found and {@link null} false otherwise + */ + @Nullable protected E readIteratorUntilReached(final E element) { + if (iterator.hasNext()) { + while (iterator.hasNext()) { + val nextElement = iterator.next(); + if (Objects.equals(element, nextElement)) return nextElement; + } + } + return null; + } + + /** + * Checks whether or not the wrapped iterator contains the specified element. + * + * @param element element to check for containment + * @return {@link true} if the element is contained in the wrapped iterator and {@link false} otherwise + */ + protected boolean isIteratorContaining(final Object element) { + if (iterator.hasNext()) { + while (iterator.hasNext()) { + val nextElement = iterator.next(); + if (Objects.equals(element, nextElement)) return true; + } + } + return false; + } + + /** + * Reads all content of the wrapped iterator. + */ + protected void readIteratorFully() { + while (iterator.hasNext()) targetCollection.add(iterator.next()); + } + + @Override + public int size() { + readIteratorFully(); + + return targetCollection.size(); + } + + @Override + public boolean isEmpty() { + return targetCollection.isEmpty() && !iterator.hasNext(); + } + + @Override + public boolean contains(final Object object) { + return targetCollection.contains(object) || isIteratorContaining(object); + } + + @NotNull + @Override + public Iterator iterator() { + return new PublicIterator(); + } + + @NotNull + @Override + public Object[] toArray() { + readIteratorFully(); + + return targetCollection.toArray(); + } + + @NotNull + @Override + @SuppressWarnings({"unchecked", "SuspiciousToArrayCall"}) + public T[] toArray(@NotNull final T... a) { + readIteratorFully(); + + return targetCollection.toArray(a); + } + + @Override + public boolean add(final E e) { + return targetCollection.add(e); + } + + @Override + public boolean remove(final Object o) { + if (targetCollection.remove(o)) return true; + if (isIteratorContaining(o)) { + iterator.remove(); + + return true; + } + return false; + } + + @Override + public boolean containsAll(@NotNull Collection valuesToFind) { + if (valuesToFind.isEmpty()) return true; + + valuesToFind = new ArrayList<>(valuesToFind); + // remove elements which are definitely contained in the read part of the iterator + //noinspection SuspiciousMethodCalls + valuesToFind.removeAll(targetCollection); + + if (valuesToFind.isEmpty()) return true; + + while (iterator.hasNext()) { + val element = readNextIteratorElement(); + valuesToFind.remove(element); + + if (valuesToFind.isEmpty()) return true; + } + + return false; + } + + @Override + public boolean addAll(@NotNull final Collection elements) { + return targetCollection.addAll(elements); + } + + @Override + public boolean removeAll(@NotNull Collection valuesToRemove) { + if (valuesToRemove.isEmpty()) return false; + + var changed = targetCollection.removeAll(valuesToRemove); + while (iterator.hasNext()) { + val element = iterator.next(); + if (valuesToRemove.contains(element)) changed = true; + else targetCollection.add(element); + } + + return changed; + } + + @Override + public boolean retainAll(@NotNull final Collection valuesToRetain) { + if (valuesToRetain.isEmpty()) { + val changed = !targetCollection.isEmpty(); + targetCollection.clear(); + + return changed; + } + + boolean changed = false; + { + val targetIterator = targetCollection.iterator(); + while (targetIterator.hasNext()) { + val element = targetIterator.next(); + if (!valuesToRetain.contains(element)) { + targetIterator.remove(); + changed = true; + } + } + } + while (iterator.hasNext()) { + val element = iterator.next(); + if (valuesToRetain.contains(element)) targetCollection.add(element); + else changed = true; + } + + return changed; + } + + @Override + public void clear() { + targetCollection.clear(); + while (iterator.hasNext()) iterator.next(); + } + + /** + * Iterator used by this {@link LazyIteratorToCollectionWrapper}. + */ + @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) + protected class PublicIterator implements Iterator { + + /** + * Iterator of the {@link #targetCollection} + */ + @NonNull Iterator collectionIterator = targetCollection.iterator(); + /** + * Flag indicating whether the last {@link Iterator#next()} was called on {@link #collectionIterator} or not + */ + @NonFinal boolean lastReadFromCollection = false; + + @Override + public boolean hasNext() { + return collectionIterator.hasNext() || iterator.hasNext(); + } + + @Override + public E next() { + if (collectionIterator.hasNext()) { + lastReadFromCollection = true; + + return collectionIterator.next(); + } + if (iterator.hasNext()) { + lastReadFromCollection = false; + + return iterator.next(); + } + + throw new IllegalStateException(); + } + + @Override + public void remove() { + if (lastReadFromCollection) collectionIterator.remove(); + else iterator.remove(); + } + } +} From f5dd9de8781349415fc89588699dd8912c0c40b4 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 20 Mar 2019 18:35:28 +0300 Subject: [PATCH 205/508] Add PlayerUtil#getPlayerName(UUID) --- .../minecraft/commons/player/PlayerUtil.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java index 02e6a6ccb..c02cb7479 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java @@ -1,17 +1,36 @@ package ru.progrm_jarvis.minecraft.commons.player; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import lombok.NonNull; +import lombok.SneakyThrows; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; import java.util.Collection; +import java.util.Optional; +import java.util.UUID; import java.util.stream.Collectors; +import static ru.progrm_jarvis.minecraft.commons.util.ObjectUtil.mapOnlyNonNull; + @UtilityClass public class PlayerUtil { + private static final String NAMES_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME + = PlayerUtil.class.getCanonicalName().concat(".FIELDS_CACHE_CONCURRENCY_LEVEL"); + + @NonNull private final Cache<@NotNull UUID, @Nullable String> NAMES_CACHE = CacheBuilder.newBuilder() + .softValues() + .concurrencyLevel(SystemPropertyUtil.getSystemPropertyInt(NAMES_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME, 2)) + .build(); + /** * Gets online players as a collection of exact {@link Player} type. * @@ -33,4 +52,11 @@ public Collection playerEyesAround(@NonNull final Location location, fin .filter(player -> player.getEyeLocation().distance(location) <= radius) .collect(Collectors.toList()); } + + @SneakyThrows + public static Optional getPlayerName(@NonNull final UUID uuid) { + return Optional.ofNullable( + NAMES_CACHE.get(uuid, () -> mapOnlyNonNull(OfflinePlayer::getName, Bukkit.getOfflinePlayer(uuid))) + ); + } } From 95a0cc628d6526689a7be4626f4a57050a331f74 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 20 Mar 2019 18:35:58 +0300 Subject: [PATCH 206/508] Fix PropertyNaming in ToStringUtil --- .../ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java index 3336650dd..677a6396c 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java @@ -25,7 +25,7 @@ public class ToStringUtil { String FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME - = ToStringUtil.class.getTypeName().concat(".FIELDS_CACHE_CONCURRENCY_LEVEL"); + = ToStringUtil.class.getCanonicalName().concat(".FIELDS_CACHE_CONCURRENCY_LEVEL"); int FIELDS_CACHE_CONCURRENCY_LEVEL = Integer.parseInt(MoreObjects.firstNonNull( System.getProperty(FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME), "2") @@ -36,7 +36,7 @@ public class ToStringUtil { .build(); String METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME - = ToStringUtil.class.getTypeName().concat(".METHODS_CACHE_CONCURRENCY_LEVEL"); + = ToStringUtil.class.getCanonicalName().concat(".METHODS_CACHE_CONCURRENCY_LEVEL"); int METHODS_CACHE_CONCURRENCY_LEVEL = Integer.parseInt(MoreObjects.firstNonNull( System.getProperty(METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME), "2") From 807e3cbd9256018f681893495336ef3ef144bc17 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 22 Mar 2019 16:19:10 +0300 Subject: [PATCH 207/508] Fix build error due to use of static import in PlayerUtil --- .../minecraft/commons/player/PlayerUtil.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java index c02cb7479..2e98d2a14 100644 --- a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java +++ b/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java @@ -11,6 +11,7 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import ru.progrm_jarvis.minecraft.commons.util.ObjectUtil; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; import java.util.Collection; @@ -18,8 +19,6 @@ import java.util.UUID; import java.util.stream.Collectors; -import static ru.progrm_jarvis.minecraft.commons.util.ObjectUtil.mapOnlyNonNull; - @UtilityClass public class PlayerUtil { @@ -55,8 +54,8 @@ public Collection playerEyesAround(@NonNull final Location location, fin @SneakyThrows public static Optional getPlayerName(@NonNull final UUID uuid) { - return Optional.ofNullable( - NAMES_CACHE.get(uuid, () -> mapOnlyNonNull(OfflinePlayer::getName, Bukkit.getOfflinePlayer(uuid))) - ); + return Optional.ofNullable(NAMES_CACHE.get( + uuid, () -> ObjectUtil.mapOnlyNonNull(OfflinePlayer::getName, Bukkit.getOfflinePlayer(uuid)) + )); } } From 9c336df06cc3d4f2888faee2ac45d22b11de2a5b Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 22 Mar 2019 16:22:13 +0300 Subject: [PATCH 208/508] Rename directories to fit module-names --- {config => ez-config}/pom.xml | 0 {fake-entity => fake-entity-lib}/pom.xml | 0 .../fakeentitylib/entity/AbstractBasicFakeEntity.java | 0 .../minecraft/fakeentitylib/entity/AbstractFakeEntity.java | 0 .../fakeentitylib/entity/AbstractObservableFakeEntity.java | 0 .../entity/AbstractPlayerContainingFakeEntity.java | 0 .../minecraft/fakeentitylib/entity/ArmorStandBlockItem.java | 0 .../minecraft/fakeentitylib/entity/BasicFakeEntity.java | 0 .../minecraft/fakeentitylib/entity/FakeEntity.java | 0 .../fakeentitylib/entity/ObservableFakeEntity.java | 0 .../fakeentitylib/entity/SimpleLivingFakeEntity.java | 0 .../entity/behaviour/FakeEntityInteraction.java | 0 .../entity/behaviour/FakeEntityInteractionEvent.java | 0 .../entity/behaviour/FakeEntityInteractionHandler.java | 0 .../entity/behaviour/InteractableFakeEntity.java | 0 .../ProtocolBasedFakeEntityInteractionHandler.java | 0 .../entity/management/AbstractSetBasedEntityManager.java | 0 .../fakeentitylib/entity/management/FakeEntityManager.java | 0 .../entity/management/FakeEntityManagerGroup.java | 0 .../fakeentitylib/entity/observer/FakeEntityObserver.java | 0 .../entity/observer/PeriodicFakeEntityObserver.java | 0 .../minecraft/fakeentitylib/misc/structure/Structure.java | 0 .../fakeentitylib/misc/structure/StructureDescriptor.java | 0 .../misc/structure/StructureDescriptorTest.java | 0 .../src/test/resources/entity_descriptor_1.json | 0 {commons => minecraft-commons}/pom.xml | 0 .../progrm_jarvis/minecraft/commons/MinecraftCommons.java | 0 .../minecraft/commons/MinecraftEnvironment.java | 0 .../minecraft/commons/annotation/AsyncExpected.java | 0 .../minecraft/commons/annotation/BukkitService.java | 0 .../commons/annotation/DontOverrideEqualsAndHashCode.java | 0 .../minecraft/commons/annotation/UnsafeNMS.java | 0 .../progrm_jarvis/minecraft/commons/async/AsyncRunner.java | 0 .../progrm_jarvis/minecraft/commons/async/AsyncRunners.java | 0 .../minecraft/commons/async/BukkitSchedulerAsyncRunner.java | 0 .../minecraft/commons/async/BungeeSchedulerAsyncRunner.java | 0 .../progrm_jarvis/minecraft/commons/block/BlocksChain.java | 0 .../minecraft/commons/block/SnakyBlockChain.java | 0 .../minecraft/commons/chunk/ChunkLocalLocation.java | 0 .../ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java | 0 .../minecraft/commons/event/FluentBukkitEvents.java | 0 .../minecraft/commons/mapimage/DefaultMapImage.java | 0 .../progrm_jarvis/minecraft/commons/mapimage/MapImage.java | 0 .../minecraft/commons/mapimage/MapImageColor.java | 0 .../minecraft/commons/mapimage/MapImageMinecraftColors.java | 0 .../progrm_jarvis/minecraft/commons/mapimage/MapImages.java | 0 .../commons/mapimage/display/BlankMapRenderer.java | 0 .../minecraft/commons/mapimage/display/MapImageDisplay.java | 0 .../commons/mapimage/display/PlayerMapManager.java | 0 .../mapimage/display/ProtocolBasedMapImageDisplay.java | 0 .../minecraft/commons/mojang/MojangApiManager.java | 0 .../progrm_jarvis/minecraft/commons/mojang/MojangUtil.java | 0 .../ru/progrm_jarvis/minecraft/commons/nms/Conversions.java | 0 .../progrm_jarvis/minecraft/commons/nms/LegacySupport.java | 0 .../ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java | 0 .../progrm_jarvis/minecraft/commons/nms/ToStringUtil.java | 0 .../minecraft/commons/nms/metadata/DataWatcherFactory.java | 0 .../commons/nms/metadata/LegacyDataWatcherFactory.java | 0 .../minecraft/commons/nms/metadata/MetadataGenerator.java | 0 .../commons/nms/metadata/StandardDataWatcherFactory.java | 0 .../commons/nms/protocol/misc/PacketListeners.java | 0 .../nms/protocol/misc/PacketWrapperPacketAssociations.java | 0 .../progrm_jarvis/minecraft/commons/player/PlayerUtil.java | 0 .../commons/player/collection/PlayerContainer.java | 0 .../commons/player/collection/PlayerContainers.java | 0 .../minecraft/commons/player/package-info.java | 0 .../commons/player/registry/DefaultPlayerRegistry.java | 0 .../minecraft/commons/player/registry/PlayerRegistries.java | 0 .../minecraft/commons/player/registry/PlayerRegistry.java | 0 .../commons/player/registry/PlayerRegistryRegistration.java | 0 .../minecraft/commons/plugin/BukkitPluginContainer.java | 0 .../minecraft/commons/plugin/BukkitPluginShutdownUtil.java | 0 .../minecraft/commons/plugin/BungeePluginContainer.java | 0 .../commons/schedule/misc/KeyedSchedulerGroup.java | 0 .../minecraft/commons/schedule/misc/SchedulerGroup.java | 0 .../minecraft/commons/schedule/misc/SchedulerGroups.java | 0 .../minecraft/commons/schedule/pool/KeyedLoopPool.java | 0 .../minecraft/commons/schedule/pool/LoopPool.java | 0 .../commons/schedule/pool/SingleWorkerLoopPool.java | 0 .../commons/schedule/task/counter/BukkitCallbackTimer.java | 0 .../commons/schedule/task/counter/BukkitTimer.java | 0 .../task/counter/ConcurrentBukkitCallbackTimer.java | 0 .../schedule/task/counter/ConcurrentBukkitTimer.java | 0 .../schedule/task/initializer/BukkitTaskInitializer.java | 0 .../schedule/task/initializer/BukkitTaskInitializers.java | 0 .../progrm_jarvis/minecraft/commons/util/BitwiseUtil.java | 0 .../progrm_jarvis/minecraft/commons/util/LocationUtil.java | 0 .../ru/progrm_jarvis/minecraft/commons/util/MapUtil.java | 0 .../ru/progrm_jarvis/minecraft/commons/util/ObjectUtil.java | 0 .../ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java | 0 .../minecraft/commons/util/ReflectionUtil.java | 0 .../minecraft/commons/util/SystemPropertyUtil.java | 0 .../util/collection/LazyIteratorToCollectionWrapper.java | 0 .../util/concurrent/ConcurrentCollectionWrapper.java | 0 .../commons/util/concurrent/ConcurrentCollections.java | 0 .../commons/util/concurrent/ConcurrentDequeWrapper.java | 0 .../commons/util/concurrent/ConcurrentListWrapper.java | 0 .../commons/util/concurrent/ConcurrentMapWrapper.java | 0 .../commons/util/concurrent/ConcurrentQueueWrapper.java | 0 .../util/concurrent/ConcurrentSetFromMapWrapper.java | 0 .../commons/util/concurrent/ConcurrentSetWrapper.java | 0 .../commons/util/concurrent/ConcurrentWrapper.java | 0 .../minecraft/commons/util/function/UncheckedConsumer.java | 0 .../minecraft/commons/util/function/UncheckedFunction.java | 0 .../minecraft/commons/util/function/UncheckedRunnable.java | 0 .../minecraft/commons/util/function/UncheckedSupplier.java | 0 .../minecraft/commons/util/function/lazy/Lazies.java | 0 .../minecraft/commons/util/function/lazy/Lazy.java | 0 .../minecraft/commons/util/hack/PreSuperCheck.java | 0 .../minecraft/commons/util/image/ColorUtil.java | 0 .../minecraft/commons/util/image/ImageUtil.java | 0 .../progrm_jarvis/minecraft/commons/util/io/FileUtil.java | 0 .../minecraft/commons/util/number/IntWrapper.java | 0 .../util/shutdown/ObjectAlreadyShutDownException.java | 0 .../minecraft/commons/util/shutdown/ShutdownHooks.java | 0 .../minecraft/commons/util/shutdown/Shutdownable.java | 0 .../ru/progrm_jarvis/minecraft/commons/util/time/Time.java | 0 .../minecraft/commons/chunk/ChunkUtilTest.java | 0 .../minecraft/commons/mapimage/MapImageTest.java | 0 .../minecraft/commons/mojang/MojangApiManagerTest.java | 0 .../minecraft/commons/mojang/MojangUtilTest.java | 0 .../minecraft/commons/nms/ToStringUtilTest.java | 0 .../commons/schedule/pool/SingleWorkerLoopPoolTest.java | 0 .../minecraft/commons/util/BitwiseUtilTest.java | 0 .../minecraft/commons/util/LocationUtilTest.java | 0 .../progrm_jarvis/minecraft/commons/util/MapUtilTest.java | 0 .../minecraft/commons/util/ObjectUtilTest.java | 0 .../minecraft/commons/util/RandomUtilTest.java | 0 .../minecraft/commons/util/SystemPropertyUtilTest.java | 0 .../minecraft/commons/util/function/lazy/LaziesTest.java | 0 .../minecraft/commons/util/number/IntWrapperTest.java | 0 pom.xml | 6 +++--- 132 files changed, 3 insertions(+), 3 deletions(-) rename {config => ez-config}/pom.xml (100%) rename {fake-entity => fake-entity-lib}/pom.xml (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionEvent.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionHandler.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/Structure.java (100%) rename {fake-entity => fake-entity-lib}/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java (100%) rename {fake-entity => fake-entity-lib}/src/test/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptorTest.java (100%) rename {fake-entity => fake-entity-lib}/src/test/resources/entity_descriptor_1.json (100%) rename {commons => minecraft-commons}/pom.xml (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftCommons.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/block/BlocksChain.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/BlankMapRenderer.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/player/package-info.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginContainer.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BungeePluginContainer.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollections.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentDequeWrapper.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentListWrapper.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentMapWrapper.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentQueueWrapper.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetFromMapWrapper.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetWrapper.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentWrapper.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedSupplier.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/hack/PreSuperCheck.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java (100%) rename {commons => minecraft-commons}/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManagerTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtilTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtilTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtilTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtilTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtilTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java (100%) rename {commons => minecraft-commons}/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java (100%) diff --git a/config/pom.xml b/ez-config/pom.xml similarity index 100% rename from config/pom.xml rename to ez-config/pom.xml diff --git a/fake-entity/pom.xml b/fake-entity-lib/pom.xml similarity index 100% rename from fake-entity/pom.xml rename to fake-entity-lib/pom.xml diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ObservableFakeEntity.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionEvent.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionEvent.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionEvent.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionEvent.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionHandler.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionHandler.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionHandler.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionHandler.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/InteractableFakeEntity.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/Structure.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/Structure.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/Structure.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/Structure.java diff --git a/fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java similarity index 100% rename from fake-entity/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java rename to fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java diff --git a/fake-entity/src/test/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptorTest.java b/fake-entity-lib/src/test/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptorTest.java similarity index 100% rename from fake-entity/src/test/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptorTest.java rename to fake-entity-lib/src/test/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptorTest.java diff --git a/fake-entity/src/test/resources/entity_descriptor_1.json b/fake-entity-lib/src/test/resources/entity_descriptor_1.json similarity index 100% rename from fake-entity/src/test/resources/entity_descriptor_1.json rename to fake-entity-lib/src/test/resources/entity_descriptor_1.json diff --git a/commons/pom.xml b/minecraft-commons/pom.xml similarity index 100% rename from commons/pom.xml rename to minecraft-commons/pom.xml diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftCommons.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftCommons.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftCommons.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftCommons.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/AsyncExpected.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/BukkitService.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/UnsafeNMS.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/BlocksChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/BlocksChain.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/BlocksChain.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/BlocksChain.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/BlankMapRenderer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/BlankMapRenderer.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/BlankMapRenderer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/BlankMapRenderer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/MapImageDisplay.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/package-info.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/package-info.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/package-info.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/package-info.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistryRegistration.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginContainer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginContainer.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginContainer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginContainer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BungeePluginContainer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BungeePluginContainer.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BungeePluginContainer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BungeePluginContainer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollections.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollections.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollections.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollections.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentDequeWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentDequeWrapper.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentDequeWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentDequeWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentListWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentListWrapper.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentListWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentListWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentMapWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentMapWrapper.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentMapWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentMapWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentQueueWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentQueueWrapper.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentQueueWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentQueueWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetFromMapWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetFromMapWrapper.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetFromMapWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetFromMapWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetWrapper.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentWrapper.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedSupplier.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedSupplier.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedSupplier.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedSupplier.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/hack/PreSuperCheck.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/hack/PreSuperCheck.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/hack/PreSuperCheck.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/hack/PreSuperCheck.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/Shutdownable.java diff --git a/commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java similarity index 100% rename from commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtilTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManagerTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManagerTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManagerTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManagerTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtilTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtilTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtilTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtilTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtilTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtilTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtilTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtilTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtilTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtilTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtilTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtilTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtilTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtilTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtilTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java diff --git a/commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java similarity index 100% rename from commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java diff --git a/pom.xml b/pom.xml index 563faa9a2..6ed4f7d98 100644 --- a/pom.xml +++ b/pom.xml @@ -12,9 +12,9 @@ 0.1.0-SNAPSHOT mc-unit - commons - config - fake-entity + minecraft-commons + ez-config + fake-entity-lib lib-loader pom From 341d0f8a0beb721843b4f55611b9890b04e838d1 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 22 Mar 2019 16:30:45 +0300 Subject: [PATCH 209/508] Change fields related to system properties in ToStringUtil --- .../minecraft/commons/nms/ToStringUtil.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java index 677a6396c..2ba20e120 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java @@ -24,26 +24,21 @@ @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class ToStringUtil { - String FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME - = ToStringUtil.class.getCanonicalName().concat(".FIELDS_CACHE_CONCURRENCY_LEVEL"); - - int FIELDS_CACHE_CONCURRENCY_LEVEL = Integer.parseInt(MoreObjects.firstNonNull( - System.getProperty(FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME), "2") - ); + private String FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME + = ToStringUtil.class.getCanonicalName().concat(".FIELDS_CACHE_CONCURRENCY_LEVEL"), + METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME + = ToStringUtil.class.getCanonicalName().concat(".METHODS_CACHE_CONCURRENCY_LEVEL"); private Cache, Map>> FIELDS_CACHE = CacheBuilder.newBuilder() - .concurrencyLevel(FIELDS_CACHE_CONCURRENCY_LEVEL) + .concurrencyLevel(Integer.parseInt(MoreObjects.firstNonNull( + System.getProperty(FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME), "2") + )) .build(); - String METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME - = ToStringUtil.class.getCanonicalName().concat(".METHODS_CACHE_CONCURRENCY_LEVEL"); - - int METHODS_CACHE_CONCURRENCY_LEVEL = Integer.parseInt(MoreObjects.firstNonNull( - System.getProperty(METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME), "2") - ); - private Cache, Map>> METHODS_CACHE = CacheBuilder.newBuilder() - .concurrencyLevel(METHODS_CACHE_CONCURRENCY_LEVEL) + .concurrencyLevel(Integer.parseInt(MoreObjects.firstNonNull( + System.getProperty(METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME), "2") + )) .build(); @SneakyThrows From ddd0654b77c78c0e3f67151303a27c0803b34374 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 23 Mar 2019 01:55:08 +0300 Subject: [PATCH 210/508] Legacy support tweaks to PlayerMapManager --- .../mapimage/display/PlayerMapManager.java | 174 ++++++++++-------- .../display/ProtocolBasedMapImageDisplay.java | 6 +- 2 files changed, 101 insertions(+), 79 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java index 5eff801ab..4a5bc3109 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java @@ -3,6 +3,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; import lombok.NonNull; +import lombok.Synchronized; import lombok.experimental.UtilityClass; import lombok.val; import org.bukkit.Bukkit; @@ -10,7 +11,6 @@ import org.bukkit.map.MapView; import ru.progrm_jarvis.minecraft.commons.MinecraftCommons; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; -import ru.progrm_jarvis.reflector.Reflector; import ru.progrm_jarvis.reflector.wrapper.MethodWrapper; import ru.progrm_jarvis.reflector.wrapper.fast.FastMethodWrapper; @@ -18,12 +18,15 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.StandardOpenOption; -import java.util.*; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import static ru.progrm_jarvis.reflector.Reflector.getDeclaredMethod; + /** * Utility responsible to allocate minimal amount of {@link MapView} for internal usage. *

@@ -41,17 +44,38 @@ public class PlayerMapManager { /** - * Single lock for all operations. + * Flag describing whether {@link int} or {@link short} map IDs are used by current server. */ - private final Lock lock = new ReentrantLock(); + private final boolean USE_INT_IDS; /** * Method wrapper for {@link MapView#getId()} because it returns * {@link short} and {@link int} on different Bukkit API versions. */ - private final MethodWrapper MAP_VIEW__GET_ID__METHOD = FastMethodWrapper.from( - Reflector.getDeclaredMethod(MapView.class, "getId") - ); + private final MethodWrapper MAP_VIEW__GET_ID__METHOD; + + /** + * Method wrapper for {@link Bukkit#getMap(int)} because it consumes + * {@link short} and {@link int} on different Bukkit API versions. + */ + @SuppressWarnings("deprecation") + private final MethodWrapper BUKKIT__GET_MAP__METHOD; + + static { + { + val method = getDeclaredMethod(MapView.class, "getId"); + val parameterType = method.getParameterTypes()[0]; + if (parameterType == int.class) USE_INT_IDS = true; + else if (parameterType == short.class) USE_INT_IDS = false; + else throw new IllegalStateException( + "Unknown return type of MapView#getId() method (" + parameterType + ")" + ); + MAP_VIEW__GET_ID__METHOD = FastMethodWrapper.from(method); + } + BUKKIT__GET_MAP__METHOD = FastMethodWrapper.from( + getDeclaredMethod(Bukkit.class, "getMap", USE_INT_IDS ? int.class : short.class) + ); + } /** * Root directory of {@link PlayerMapManager} in which internal data is stored between sessions. @@ -71,13 +95,13 @@ public class PlayerMapManager { /** * Maps allocated in Bukkit for internal usage. */ - private final Set allocatedMaps; + private final Set ALLOCATED_MAPS; /** - * Maps of {@link #allocatedMaps} available for the player. + * Maps of {@link #ALLOCATED_MAPS} available for the player. * Similar maps may be related to different players as the image logic doesn't intersect. */ - private final SetMultimap playerMaps; + private final SetMultimap PLAYER_MAPS; // static initialization of file-related stuff static { @@ -98,14 +122,14 @@ public class PlayerMapManager { ); } - allocatedMaps = fileLines.stream() + ALLOCATED_MAPS = fileLines.stream() .filter(line -> !line.isEmpty() && line.indexOf('#') != 0) - .map(line -> Bukkit.getMap(Short.parseShort(line))) + .map(line -> getMap(Integer.parseInt(line))) .filter(Objects::nonNull) .collect(Collectors.toSet()); // HashSet is used by default Bukkit.getLogger().info( - "Loaded " + allocatedMaps.size() + " internally allocated world map IDs: "+ allocatedMaps.toString() + "Loaded " + ALLOCATED_MAPS.size() + " internally allocated world map IDs: "+ ALLOCATED_MAPS.toString() ); } else { try { @@ -115,12 +139,12 @@ public class PlayerMapManager { "Couldn't create file " + IDS_LIST_FILE.getName() + " of PlayerMapManager ", e ); } - allocatedMaps = new HashSet<>(); + ALLOCATED_MAPS = new HashSet<>(); } // use optimal key size for allocatedMap - playerMaps = HashMultimap.create( - Math.max(8, allocatedMaps.size()), Math.max(16, Bukkit.getOnlinePlayers().size()) + PLAYER_MAPS = HashMultimap.create( + Math.max(8, ALLOCATED_MAPS.size()), Math.max(16, Bukkit.getOnlinePlayers().size()) ); } @@ -130,8 +154,18 @@ public class PlayerMapManager { * @param mapView {@link MapView} whose {@link MapView#getId()} to invoke * @return map view's ID */ - public Number getMapId(@NonNull final MapView mapView) { - return MAP_VIEW__GET_ID__METHOD.invoke(mapView); + public int getMapId(@NonNull final MapView mapView) { + return MAP_VIEW__GET_ID__METHOD.invoke(mapView).intValue(); + } + + /** + * Gets the {@link MapView} from the given ID independently on version. + * + * @param mapId id of the map to get + * @return a map view if it exists, or null otherwise + */ + public MapView getMap(final int mapId) { + return BUKKIT__GET_MAP__METHOD.invokeStatic(USE_INT_IDS ? mapId : (short) mapId); } /** @@ -141,36 +175,32 @@ public Number getMapId(@NonNull final MapView mapView) { * * @apiNote should be called only in case of need */ + @Synchronized private MapView allocateNewMap() { - lock.lock(); - try { - final MapView map; - { - val worlds = Bukkit.getWorlds(); - if (worlds.isEmpty()) throw new IllegalStateException("There are no Bukkit worlds available"); - map = Bukkit.createMap(worlds.get(0)); - } + final MapView map; + { + val worlds = Bukkit.getWorlds(); + if (worlds.isEmpty()) throw new IllegalStateException("There are no Bukkit worlds available"); + map = Bukkit.createMap(worlds.get(0)); + } - try { - Files.write( - IDS_LIST_FILE.toPath(), - (getMapId(map).toString() + System.lineSeparator()).getBytes(), - StandardOpenOption.APPEND - ); - } catch (final IOException e) { - throw new RuntimeException( - "Couldn't write newly allocated ID to " + IDS_LIST_FILE.getName() + " of PlayerMapManager", e - ); - } + try { + Files.write( + IDS_LIST_FILE.toPath(), + (getMapId(map) + System.lineSeparator()).getBytes(), + StandardOpenOption.APPEND + ); + } catch (final IOException e) { + throw new RuntimeException( + "Couldn't write newly allocated ID to " + IDS_LIST_FILE.getName() + " of PlayerMapManager", e + ); + } - // clear renderers for map - for (val renderer : map.getRenderers()) map.removeRenderer(renderer); - allocatedMaps.add(map); + // clear renderers for map + for (val renderer : map.getRenderers()) map.removeRenderer(renderer); + ALLOCATED_MAPS.add(map); - return map; - } finally { - lock.unlock(); - } + return map; } /** @@ -183,34 +213,30 @@ private MapView allocateNewMap() { * * @see #freeMap(Player, MapView) should be called whenever the player stops seeing this map or leaves the server */ + @Synchronized public MapView allocateMap(@NonNull final Player player) { - lock.lock(); - try { - val mapsOfPlayer = playerMaps.get(player); + val mapsOfPlayer = PLAYER_MAPS.get(player); - // if the player has all maps allocated of available than allocate another one (specially for him <3) - // this is a fast equivalent of iterating through each allocated map - // because only maps from allocatedMaps may be contained in mapsOfPlayers which is a Set - if (mapsOfPlayer.size() == allocatedMaps.size()) { - val map = allocateNewMap(); - mapsOfPlayer.add(map); + // if the player has all maps allocated of available than allocate another one (specially for him <3) + // this is a fast equivalent of iterating through each allocated map + // because only maps from allocatedMaps may be contained in mapsOfPlayers which is a Set + if (mapsOfPlayer.size() == ALLOCATED_MAPS.size()) { + val map = allocateNewMap(); + mapsOfPlayer.add(map); - return map; - } - //otherwise take one of the available maps for him - for (val map : allocatedMaps) if (!mapsOfPlayer.contains(map)) { - mapsOfPlayer.add(map); - - return map; - } + return map; + } + //otherwise take one of the available maps for him + for (val map : ALLOCATED_MAPS) if (!mapsOfPlayer.contains(map)) { + mapsOfPlayer.add(map); - // this should never be reached - throw new IllegalStateException( - "Something went wrong, could not find any allocated map for the player although there should be one" - ); - } finally { - lock.unlock(); + return map; } + + // this should never be reached + throw new IllegalStateException( + "Something went wrong, could not find any allocated map for the player although there should be one" + ); } /** @@ -222,13 +248,9 @@ public MapView allocateMap(@NonNull final Player player) { * * @see #allocateMap(Player) only obtained by calling this method should be freed */ + @Synchronized public void freeMap(@NonNull final Player player, @NonNull final MapView map) { - lock.lock(); - try { - playerMaps.remove(player, map); - for (val renderer : map.getRenderers()) map.removeRenderer(renderer); - } finally { - lock.unlock(); - } + PLAYER_MAPS.remove(player, map); + for (val renderer : map.getRenderers()) map.removeRenderer(renderer); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index a2b998106..4b62acb28 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -54,7 +54,7 @@ public MapImage image() { */ protected void sendFullImage(@NonNull final Player player) { new WrapperPlayServerMap() {{ - setItemDamage(PlayerMapManager.getMapId(playerMaps.get(player)).intValue()); + setItemDamage(PlayerMapManager.getMapId(playerMaps.get(player))); setScale(image.getDisplay()); setColumns(image.getWidth()); setRows(image.getHeight()); @@ -79,7 +79,7 @@ protected void sendDelta(@NonNull final Player player, @NonNull final MapImage.D if (delta.isEmpty()) return; val packet = newDeltaPacket(delta); - packet.setItemDamage(PlayerMapManager.getMapId(playerMaps.get(player)).intValue()); + packet.setItemDamage(PlayerMapManager.getMapId(playerMaps.get(player))); packet.sendPacket(player); } @@ -90,7 +90,7 @@ protected void sendDeltaToAllPlayers(@NonNull final MapImage.Delta delta) { val packet = newDeltaPacket(delta); for (val entry : playerMaps.entrySet()) { - packet.setItemDamage(PlayerMapManager.getMapId(entry.getValue()).intValue()); + packet.setItemDamage(PlayerMapManager.getMapId(entry.getValue())); packet.sendPacket(entry.getKey()); } } From 2c5cbaadd26fd736ec601c7568689311e793c37d Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 23 Mar 2019 01:55:35 +0300 Subject: [PATCH 211/508] More movement enhancements for AbstractBasicFakeEntity --- .../entity/AbstractBasicFakeEntity.java | 30 +++++++++++++------ .../entity/SimpleLivingFakeEntity.java | 27 ++++++++++++++--- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index ef553312a..fe1108e7e 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -130,8 +130,10 @@ public void removeMetadata(final int... indexes) { * @param dz delta on Z-axis * @param yaw new yaw * @param pitch new pitch + * @param sendVelocity {@code true} if velocity should be considered and {@code false} otherwise */ - protected abstract void performMoveLook(double dx, double dy, double dz, final float yaw, final float pitch); + protected abstract void performMoveLook(double dx, double dy, double dz, + float yaw, float pitch, boolean sendVelocity); /** * Performs the movement of this living fake entity by given deltas and yaw and pitch specified * not performing any checks such as 8-block limit of deltas. @@ -139,8 +141,9 @@ public void removeMetadata(final int... indexes) { * @param dx delta on X-axis * @param dy delta on Y-axis * @param dz delta on Z-axis + * @param sendVelocity {@code true} if velocity should be considered and {@code false} otherwise */ - protected abstract void performMove(double dx, double dy, double dz); + protected abstract void performMove(double dx, double dy, double dz, boolean sendVelocity); /** * Performs the teleportation of this living fake entity to given coordinates changing yaw and pitch @@ -194,9 +197,9 @@ public void move(final double dx, final double dy, final double dz, final float } // otherwise use move else { - if (dYaw == 0 && dPitch == 0) performMove(dx, dy, dz); + if (dYaw == 0 && dPitch == 0) performMove(dx, dy, dz, true); else { - performMoveLook(dx, dy, dz, dYaw, dPitch); + performMoveLook(dx, dy, dz, dYaw, dPitch, true); location.setYaw(location.getYaw() + dYaw); location.setPitch(location.getPitch() + dPitch); @@ -230,13 +233,13 @@ public void moveTo(final double x, final double y, final double z, final float y velocity.setY(dy); velocity.setZ(dz); - if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, false); + if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, true); else if (yaw != location.getYaw() || pitch != location.getPitch()) { - performMoveLook(dx, dy, dz, yaw, pitch); + performMoveLook(dx, dy, dz, yaw, pitch, true); location.setYaw(yaw); location.setPitch(pitch); - } else performMove(dx, dy, dz); + } else performMove(dx, dy, dz, true); location.setX(x); location.setY(y); @@ -267,11 +270,11 @@ public void teleport(final double x, final double y, final double z, final float if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, false); else if (yaw != location.getYaw() || pitch != location.getPitch()) { - performMoveLook(dx, dy, dz, yaw, pitch); + performMoveLook(dx, dy, dz, yaw, pitch, false); location.setYaw(yaw); location.setPitch(pitch); - } else performMove(dx, dy, dz); + } else performMove(dx, dy, dz, false); location.setX(x); location.setY(y); @@ -282,4 +285,13 @@ else if (yaw != location.getYaw() || pitch != location.getPitch()) { velocity.setZ(0); } } + + /** + * Performs the location synchronization so that the clients surely have the exact location of the entity. + */ + public void syncLocation() { + performTeleportation( + location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch(), false + ); + } } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 9c647dff6..43387c462 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -272,8 +272,9 @@ protected void actualizeVelocityPacket() { } @Override + @SuppressWarnings("Duplicates") protected void performMoveLook(final double dx, final double dy, final double dz, - final float yaw, final float pitch) { + final float yaw, final float pitch, boolean sendVelocity) { if (visible) { if (moveLookPacket == null) { moveLookPacket = new WrapperPlayServerRelEntityMoveLook(); @@ -287,12 +288,21 @@ protected void performMoveLook(final double dx, final double dy, final double dz moveLookPacket.setPitch(pitch); moveLookPacket.setOnGround(isOnGround()); - for (val entry : players.entrySet()) if (entry.getValue()) moveLookPacket.sendPacket(entry.getKey()); + sendVelocity = sendVelocity && hasVelocity(); + if (sendVelocity) actualizeVelocityPacket(); + + for (val entry : players.entrySet()) if (entry.getValue()) { + val player = entry.getKey(); + + if (sendVelocity) velocityPacket.sendPacket(player); + moveLookPacket.sendPacket(player); + } } } @Override - protected void performMove(final double dx, final double dy, final double dz) { + @SuppressWarnings("Duplicates") + protected void performMove(final double dx, final double dy, final double dz, boolean sendVelocity) { if (visible) { if (movePacket == null) { movePacket = new WrapperPlayServerRelEntityMove(); @@ -304,11 +314,20 @@ protected void performMove(final double dx, final double dy, final double dz) { movePacket.setDz(dz); movePacket.setOnGround(isOnGround()); - for (val entry : players.entrySet()) if (entry.getValue()) movePacket.sendPacket(entry.getKey()); + sendVelocity = sendVelocity && hasVelocity(); + if (sendVelocity) actualizeVelocityPacket(); + + for (val entry : players.entrySet()) if (entry.getValue()) { + val player = entry.getKey(); + + if (sendVelocity) velocityPacket.sendPacket(player); + movePacket.sendPacket(player); + } } } @Override + @SuppressWarnings("Duplicates") protected void performTeleportation(final double x, final double y, final double z, final float yaw, final float pitch, boolean sendVelocity) { if (visible) { From 9c4142a32986d7b5286c296e4ee09a75c99f1e10 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sat, 23 Mar 2019 23:05:58 +0300 Subject: [PATCH 212/508] Fix stack-overflow exception due to PBFEInteractionHandler's toString --- .../behaviour/ProtocolBasedFakeEntityInteractionHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java index 2a3ba0775..bc77e2568 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java @@ -23,14 +23,14 @@ import static com.google.common.base.Preconditions.checkNotNull; -@ToString +@ToString(onlyExplicitlyIncluded = true) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) public class ProtocolBasedFakeEntityInteractionHandler

extends PacketAdapter implements FakeEntityInteractionHandler { @NonNull final ProtocolManager protocolManager; - @NonNull P plugin; + @NonNull @ToString.Include P plugin; @NonNull Set entities; @NonNull Set entitiesView; From 1ae72f306b64f44368ac9d27e253799235195370 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 24 Mar 2019 00:05:35 +0300 Subject: [PATCH 213/508] Fix SimpleLivingFakeEntity#isOnGround --- .../fakeentitylib/entity/SimpleLivingFakeEntity.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 43387c462..7b49602de 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -247,8 +247,9 @@ public void despawn() { /////////////////////////////////////////////////////////////////////////// protected boolean isOnGround() { - // TODO: 09.03.2019 Consider specific blocks - return location.getY() % 1 == 0 && location.subtract(0, 1, 0).getBlock().getType().isSolid(); + //noinspection ConstantConditions #getWorld() may but shouldn't retuen null + return location.getY() % 1 == 0 && location.getWorld() + .getBlockAt(location.getBlockX(), location.getBlockY() - 1, location.getBlockZ()).getType().isSolid(); } protected boolean hasVelocity() { From 5809e7e03874acfdfb7cc96374a51a29e630fa0c Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 24 Mar 2019 02:54:53 +0300 Subject: [PATCH 214/508] Remove unnecessary static modifier in ChunkUtil --- .../progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java index b3baafd08..7c073daa9 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java @@ -46,7 +46,7 @@ public class ChunkUtil { * * @throws IllegalArgumentException if any of coordinates is out of allowed range */ - public static void rangeCheckChunkLocal(final int x, final int y, final int z) { + public void rangeCheckChunkLocal(final int x, final int y, final int z) { rangeCheckChunkLocalX(x); rangeCheckChunkLocalY(y); rangeCheckChunkLocalX(z); @@ -58,7 +58,7 @@ public static void rangeCheckChunkLocal(final int x, final int y, final int z) { * @param x chunk-local X-coordinate which should normally be between 0 and 15 * @throws IllegalArgumentException if {@code x} is not in range between 0 and 15 */ - public static void rangeCheckChunkLocalX(final int x) { + public void rangeCheckChunkLocalX(final int x) { checkArgument(x >= 0 && x <= 15, "x should be between 0 and 15"); } @@ -68,7 +68,7 @@ public static void rangeCheckChunkLocalX(final int x) { * @param y chunk-local Y-coordinate which should normally be between 0 and 255 * @throws IllegalArgumentException if {@code y} is not in range between 0 and 255 */ - public static void rangeCheckChunkLocalY(final int y) { + public void rangeCheckChunkLocalY(final int y) { checkArgument(y >= 0 && y <= 255, "z should be between 0 and 255"); } @@ -78,7 +78,7 @@ public static void rangeCheckChunkLocalY(final int y) { * @param z chunk-local Z-coordinate which should normally be between 0 and 15 * @throws IllegalArgumentException if {@code z} is not in range between 0 and 15 */ - public static void rangeCheckChunkLocalZ(final int z) { + public void rangeCheckChunkLocalZ(final int z) { checkArgument(z >= 0 && z <= 15, "z should be between 0 and 15"); } From f8585cb6b3b249cf19ee4b331bba10509e91413e Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 24 Mar 2019 02:55:23 +0300 Subject: [PATCH 215/508] Use optimal metadata updates for ArmorStandBlockItem --- .../minecraft/fakeentitylib/entity/ArmorStandBlockItem.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index e7a23c642..6bb47e788 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -153,8 +153,9 @@ public void render(final Player player) { * @param rotation new rotation of this block */ public void setRotation(@NonNull final Vector3F rotation) { - addMetadata(headRotation(rotation)); + if (rotation.equals(this.rotation)) return; + addMetadata(headRotation(rotation)); this.rotation = rotation; } From a594ae8d38cccffca5c11ef766ae7d31019d056a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 24 Mar 2019 04:07:44 +0300 Subject: [PATCH 216/508] Use locally build PacketWrapper temporarily --- .travis.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8458c6719..49265a988 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,16 @@ language: java ### Maven basic build ### # Build project, installing to local repo (skip testing and javadoc generation (if those exist)) -install: mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V +install: +# Temporarily: +- mkdir ___locally_built_maven_artifacts___ +- cd ___locally_built_maven_artifacts___/ +- git clone --single-branch --branch legacy-support https://github.com/JarvisCraft/PacketWrapper.git +- cd PacketWrapper +- mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V +- cd ../../ +# Normal build part +- mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V # Test project script: mvn test -B -V From 3085ff37fa8dcf5d1d99c7226b58d25ccede4e89 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 24 Mar 2019 04:10:18 +0300 Subject: [PATCH 217/508] Fix local PacketWrapper build error due to wrong dir --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 49265a988..9e92b714d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,9 +8,9 @@ install: - mkdir ___locally_built_maven_artifacts___ - cd ___locally_built_maven_artifacts___/ - git clone --single-branch --branch legacy-support https://github.com/JarvisCraft/PacketWrapper.git -- cd PacketWrapper +- cd PacketWrapper/PacketWrapper/ - mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V -- cd ../../ +- cd ../../../ # Normal build part - mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V # Test project From 924cdefec2ae388f2da0e364e2c37a8778e76513 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Tue, 26 Mar 2019 23:47:08 +0300 Subject: [PATCH 218/508] Add Figure3D API --- .../math/dimensional/CuboidFigure.java | 67 +++++++++ .../commons/math/dimensional/Figure3D.java | 136 ++++++++++++++++++ .../commons/math/dimensional/PointFigure.java | 76 ++++++++++ 3 files changed, 279 insertions(+) create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/PointFigure.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java new file mode 100644 index 000000000..86de8a735 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java @@ -0,0 +1,67 @@ +package ru.progrm_jarvis.minecraft.commons.math.dimensional; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NonNull; +import lombok.Value; +import lombok.experimental.FieldDefaults; +import lombok.experimental.NonFinal; +import org.bukkit.Location; +import org.bukkit.util.Vector; + +/** + * A cuboid figure. + */ +@Value +@FieldDefaults(level = AccessLevel.PROTECTED) +@NonFinal public class CuboidFigure implements Figure3D { + + @Getter double minX, minY, minZ, maxX, maxY, maxZ; + + @Override + public boolean contains(final double x, final double y, final double z) { + return minX <= x && x <= maxX + && minY <= y && y <= maxY + && minZ <= z && z <= maxZ; + } + + /** + * Creates a cubic figure based on two points. + * + * @param x1 X-coordinate of the first point of the cubic figure + * @param y1 T-coordinate of the first point of the cubic figure + * @param z1 Z-coordinate of the first point of the cubic figure + * @param x2 X-coordinate of the second point of the cubic figure + * @param y2 T-coordinate of the second point of the cubic figure + * @param z2 Z-coordinate of the second point of the cubic figure + * @return created cubic figure including the area between the two points + */ + @NonNull + private static Figure3D between(final double x1, final double y1, final double z1, + final double x2, final double y2, final double z2) { + if (x1 == x2 && y1 == y2 && z1 == z2) return new PointFigure(x1, y1, z1); + return new CuboidFigure(x1, y1, z1, x2, y2, z2); + } + + /** + * Creates a cubic figure based on two points. + * + * @param point1 the first point of the cubic figure + * @param point2 the second point of the cubic figure + * @return created cubic figure including the area between the two points + */ + public static Figure3D between(@NonNull final Vector point1, @NonNull final Vector point2) { + return between(point1.getX(), point1.getY(), point1.getZ(), point2.getX(), point2.getY(), point2.getZ()); + } + + /** + * Creates a cubic figure based on two points. + * + * @param point1 the first point of the cubic figure + * @param point2 the second point of the cubic figure + * @return created cubic figure including the area between the two points + */ + public static Figure3D between(@NonNull final Location point1, @NonNull final Location point2) { + return between(point1.getX(), point1.getY(), point1.getZ(), point2.getX(), point2.getY(), point2.getZ()); + } +} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java new file mode 100644 index 000000000..b5c73b8e5 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java @@ -0,0 +1,136 @@ +package ru.progrm_jarvis.minecraft.commons.math.dimensional; + +import lombok.NonNull; +import org.bukkit.Location; +import org.bukkit.util.Vector; + +/** + * A figure existing in 3-dimensional system. + */ +public interface Figure3D { + + Figure3D EMPTY = new Figure3D() { + // + + @Override + public double getMinX() { + return Double.NaN; + } + + @Override + public double getMaxX() { + return Double.NaN; + } + + @Override + public double getMinY() { + return Double.NaN; + } + + @Override + public double getMaxY() { + return Double.NaN; + } + + @Override + public double getMinZ() { + return Double.NaN; + } + + @Override + public double getMaxZ() { + return Double.NaN; + } + + @Override + public boolean contains(final double x, final double y, final double z) { + return false; + } + + @Override + public boolean contains(final @NonNull Vector point) { + return false; + } + + @Override + public boolean contains(final @NonNull Location point) { + return false; + } + // + }; + + /** + * Gets the minimal figure's coordinate by X axis. + * + * @return the least X-coordinate of the figure + */ + double getMinX(); + + /** + * Gets the maximal figure's coordinate by X axis. + * + * @return the most X-coordinate of the figure + */ + double getMaxX(); + + /** + * Gets the minimal figure's coordinate by Y axis. + * + * @return the least Y-coordinate of the figure + */ + double getMinY(); + + /** + * Gets the maximal figure's coordinate by Y axis. + * + * @return the most Y-coordinate of the figure + */ + double getMaxY(); + + /** + * Gets the minimal figure's coordinate by Z axis. + * + * @return the least Z-coordinate of the figure + */ + double getMinZ(); + + /** + * Gets the maximal figure's coordinate by Z axis. + * + * @return the most Z-coordinate of the figure + */ + double getMaxZ(); + + /** + * Checks whether or not this figure contains the point. + * + * @param x X coordinate of a point to check + * @param y Y coordinate of a point to check + * @param z Z coordinate of a point to check + * + * @return {@code true} if the point belongs to this figure and {@link false} otherwise + */ + boolean contains(double x, double y, double z); + + /** + * Checks whether or not this figure contains the point. + * + * @param point point to check + * + * @return {@code true} if the point belongs to this figure and {@link false} otherwise + */ + default boolean contains(@NonNull final Vector point) { + return contains(point.getX(), point.getY(), point.getZ()); + } + + /** + * Checks whether or not this figure contains the point. + * + * @param point point to check + * + * @return {@code true} if the point belongs to this figure and {@link false} otherwise + */ + default boolean contains(@NonNull final Location point) { + return contains(point.getX(), point.getY(), point.getZ()); + } +} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/PointFigure.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/PointFigure.java new file mode 100644 index 000000000..d0b7f2d73 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/PointFigure.java @@ -0,0 +1,76 @@ +package ru.progrm_jarvis.minecraft.commons.math.dimensional; + +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.Value; +import lombok.experimental.FieldDefaults; +import lombok.experimental.NonFinal; +import org.bukkit.Location; +import org.bukkit.util.Vector; + +/** + * A point figure covering only one exact coordinate. + */ +@Value +@FieldDefaults(level = AccessLevel.PROTECTED) +@NonFinal public class PointFigure implements Figure3D { + + double x, y, z; + + // + @Override + public double getMinX() { + return x; + } + + @Override + public double getMaxX() { + return x; + } + + @Override + public double getMinY() { + return y; + } + + @Override + public double getMaxY() { + return y; + } + + @Override + public double getMinZ() { + return z; + } + + @Override + public double getMaxZ() { + return z; + } + // + + @Override + public boolean contains(final double x, final double y, final double z) { + return x == this.x && y == this.y && z == this.z; + } + + /** + * Converts the {@link Vector} representation to a {@link PointFigure} representation. + * + * @param point vector representation to convert + * @return point figure identical to the specified vector point + */ + public static PointFigure from(@NonNull final Vector point) { + return new PointFigure(point.getX(), point.getY(), point.getZ()); + } + + /** + * Converts the {@link Location} representation to a {@link PointFigure} representation. + * + * @param point location representation to convert + * @return point figure identical to the specified location point + */ + public static PointFigure from(@NonNull final Location point) { + return new PointFigure(point.getX(), point.getY(), point.getZ()); + } +} From 78cde81c0dbc8c45900fbd0dc58ad623c858a371 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 27 Mar 2019 00:09:11 +0300 Subject: [PATCH 219/508] Finally fix ShuBukkitPluginShutdwonUtil issue --- .../plugin/BukkitPluginShutdownUtil.java | 34 ++++++++++++------- .../commons/util/shutdown/ShutdownHooks.java | 12 +++---- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java index eb4c8cdbf..59fb4d2b7 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -1,7 +1,9 @@ package ru.progrm_jarvis.minecraft.commons.plugin; +import lombok.AccessLevel; import lombok.NonNull; import lombok.Value; +import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; import lombok.val; import org.bukkit.Bukkit; @@ -15,6 +17,9 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; +/** + * Utility responsible for handling plugin shutdown hooks. + */ @UtilityClass public class BukkitPluginShutdownUtil { @@ -29,45 +34,50 @@ private Optional getOptionalShutdownHandler(final Plugin } public void addShutdownHook(final Plugin plugin, final Shutdownable callback) { - getOrCreateShutdownHandler(plugin).callbacks.add(callback); + getOrCreateShutdownHandler(plugin).shutdownHooks.add(callback); } public void addShutdownHooks(final Plugin plugin, final Shutdownable... callbacks) { - getOrCreateShutdownHandler(plugin).callbacks.addAll(Arrays.asList(callbacks)); + getOrCreateShutdownHandler(plugin).shutdownHooks.addAll(Arrays.asList(callbacks)); } public void addShutdownHooks(final Plugin plugin, final Collection callbacks) { - getOrCreateShutdownHandler(plugin).callbacks.addAll(callbacks); + getOrCreateShutdownHandler(plugin).shutdownHooks.addAll(callbacks); } public void removeShutdownHook(final Plugin plugin, final Shutdownable callback) { - getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.remove(callback)); + getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.shutdownHooks.remove(callback)); } public void removeShutdownHooks(final Plugin plugin, final Shutdownable... callbacks) { - getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.removeAll(Arrays.asList(callbacks))); + getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.shutdownHooks.removeAll(Arrays.asList(callbacks))); } public void removeShutdownHooks(final Plugin plugin, final Collection callback) { - getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.callbacks.removeAll(callback)); + getOptionalShutdownHandler(plugin).ifPresent(handler -> handler.shutdownHooks.removeAll(callback)); } @Value + @FieldDefaults(level = AccessLevel.PRIVATE) private class PluginShutdownHandler implements Listener { - private Collection callbacks = ConcurrentCollections.concurrentList(new ArrayList<>()); + @NonNull Plugin plugin; + @NonNull List shutdownHooks = ConcurrentCollections.concurrentList(new ArrayList<>()); private PluginShutdownHandler(@NonNull final Plugin plugin) { + this.plugin = plugin; Bukkit.getPluginManager().registerEvents(this, plugin); } @EventHandler(ignoreCancelled = true) public void onPluginDisable(final PluginDisableEvent event) { - val handler = PLUGIN_SHUTDOWN_HANDLERS.get(event.getPlugin()); - if (handler != null) { - val callbacks = new ArrayList<>(handler.callbacks); - for (val shutdownable : callbacks) shutdownable.shutdown(); - handler.callbacks.clear(); + // check if the plugin disabled is the right one + if (event.getPlugin() == plugin) { + while (!shutdownHooks.isEmpty()) { + val hook = shutdownHooks.get(0); + hook.shutdown(); + shutdownHooks.remove(hook); + } } } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index 670e860c2..27caea1ae 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -189,7 +189,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct return this; } else { - BukkitPluginShutdownUtil.removeShutdownHooks(bukkitPlugin, this); + BukkitPluginShutdownUtil.removeShutdownHook(bukkitPlugin, this); BukkitPluginShutdownUtil.addShutdownHook(plugin, this); } @@ -201,7 +201,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct checkState(); if (bukkitPlugin != null) { - BukkitPluginShutdownUtil.removeShutdownHooks(bukkitPlugin, this); + BukkitPluginShutdownUtil.removeShutdownHook(bukkitPlugin, this); bukkitPlugin = null; } @@ -215,7 +215,7 @@ public void shutdown() { shutDown = true; if (bukkitPlugin != null) { - BukkitPluginShutdownUtil.removeShutdownHooks(bukkitPlugin, this); + BukkitPluginShutdownUtil.removeShutdownHook(bukkitPlugin, this); bukkitPlugin = null; } @@ -288,7 +288,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct if (bukkitPlugin.compareAndSet(null, plugin)) BukkitPluginShutdownUtil.addShutdownHook(plugin, this); else { - BukkitPluginShutdownUtil.removeShutdownHooks(bukkitPlugin.get(), this); + BukkitPluginShutdownUtil.removeShutdownHook(bukkitPlugin.get(), this); BukkitPluginShutdownUtil.addShutdownHook(plugin, this); } @@ -301,7 +301,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct val plugin = bukkitPlugin.get(); if (plugin != null) { - BukkitPluginShutdownUtil.removeShutdownHooks(plugin, this); + BukkitPluginShutdownUtil.removeShutdownHook(plugin, this); bukkitPlugin.compareAndSet(plugin, null); } @@ -314,7 +314,7 @@ public void shutdown() { { val plugin = bukkitPlugin.get(); if (plugin != null) { - BukkitPluginShutdownUtil.removeShutdownHooks(plugin, this); + BukkitPluginShutdownUtil.removeShutdownHook(plugin, this); bukkitPlugin.set(null); } } From e379d70a4c14848be9078102acc886a5d0286397 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Wed, 27 Mar 2019 17:50:34 +0300 Subject: [PATCH 220/508] Add `Whole` Figure3D --- .../commons/math/dimensional/Figure3D.java | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java index b5c73b8e5..b66de8be1 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java @@ -9,8 +9,11 @@ */ public interface Figure3D { + /** + * A singleton pseudo-figure not containing any possible points of a 3D-space. + */ Figure3D EMPTY = new Figure3D() { - // + // @Override public double getMinX() { @@ -59,6 +62,59 @@ public boolean contains(final @NonNull Location point) { // }; + /** + * A singleton pseudo-figure containing all possible points of a 3D-space. + */ + Figure3D WHOLE = new Figure3D() { + // + + @Override + public double getMinX() { + return Double.NEGATIVE_INFINITY; + } + + @Override + public double getMaxX() { + return Double.POSITIVE_INFINITY; + } + + @Override + public double getMinY() { + return Double.NEGATIVE_INFINITY; + } + + @Override + public double getMaxY() { + return Double.POSITIVE_INFINITY; + } + + @Override + public double getMinZ() { + return Double.NEGATIVE_INFINITY; + } + + @Override + public double getMaxZ() { + return Double.POSITIVE_INFINITY; + } + + @Override + public boolean contains(final double x, final double y, final double z) { + return true; + } + + @Override + public boolean contains(final @NonNull Vector point) { + return true; + } + + @Override + public boolean contains(final @NonNull Location point) { + return true; + } + // + }; + /** * Gets the minimal figure's coordinate by X axis. * From 1372651c2b37497ca3b66b293ec8ea91a32c1021 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Mar 2019 00:03:43 +0000 Subject: [PATCH 221/508] Bump version.junit from 5.3.2 to 5.4.1 Bumps `version.junit` from 5.3.2 to 5.4.1. Updates `junit-jupiter-api` from 5.3.2 to 5.4.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.3.2...r5.4.1) Updates `junit-jupiter-engine` from 5.3.2 to 5.4.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.3.2...r5.4.1) Updates `junit-jupiter-params` from 5.3.2 to 5.4.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.3.2...r5.4.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6ed4f7d98..ba4e6d7a1 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 1.8 1.8 - 5.3.2 + 5.4.1 1.3.2 2.23.0 From f641e7def23c777e87f48b1f84962218fca7c411 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Mar 2019 07:37:06 +0000 Subject: [PATCH 222/508] Bump maven-javadoc-plugin from 3.0.1 to 3.1.0 Bumps [maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.0.1 to 3.1.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.0.1...maven-javadoc-plugin-3.1.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ba4e6d7a1..7dc23deac 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.0.1 + 3.1.0 none From 71b63cf5ed4898f89377b9d5eb669fe97192f121 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Mar 2019 14:45:03 +0000 Subject: [PATCH 223/508] Bump maven-surefire-plugin from 3.0.0-M2 to 3.0.0-M3 Bumps [maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.0.0-M2 to 3.0.0-M3. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.0.0-M2...surefire-3.0.0-M3) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7dc23deac..a8adce0eb 100644 --- a/pom.xml +++ b/pom.xml @@ -100,7 +100,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M2 + 3.0.0-M3 0 true From bffc576ff2918e9364b078f5aad7f66cef7d6027 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Mar 2019 17:11:28 +0000 Subject: [PATCH 224/508] Bump annotations from 16.0.3 to 17.0.0 Bumps [annotations](https://github.com/JetBrains/java-annotations) from 16.0.3 to 17.0.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Commits](https://github.com/JetBrains/java-annotations/compare/16.0.3...17.0.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a8adce0eb..71da59feb 100644 --- a/pom.xml +++ b/pom.xml @@ -286,7 +286,7 @@ org.jetbrains annotations - 16.0.3 + 17.0.0 true From 587386dca0b69376e4f2167feee0798d79378871 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Mar 2019 18:14:23 +0000 Subject: [PATCH 225/508] Bump httpclient from 4.5.6 to 4.5.7 Bumps httpclient from 4.5.6 to 4.5.7. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 71da59feb..ea8411af6 100644 --- a/pom.xml +++ b/pom.xml @@ -273,7 +273,7 @@ org.apache.httpcomponents httpclient - 4.5.6 + 4.5.7 From 3613e07fb07dc991c94fc312aef5c93f36541885 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 28 Mar 2019 20:07:27 +0000 Subject: [PATCH 226/508] Bump lombok from 1.18.4 to 1.18.6 Bumps [lombok](https://github.com/rzwitserloot/lombok) from 1.18.4 to 1.18.6. - [Release notes](https://github.com/rzwitserloot/lombok/releases) - [Changelog](https://github.com/rzwitserloot/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/rzwitserloot/lombok/compare/v1.18.4...v1.18.6) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ea8411af6..2f2e69b7f 100644 --- a/pom.xml +++ b/pom.xml @@ -280,7 +280,7 @@ org.projectlombok lombok - 1.18.4 + 1.18.6 true From dce02ee5505e5072381d8f5f47d0ae681beec844 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 31 Mar 2019 17:08:27 +0300 Subject: [PATCH 227/508] Implement basic item-editing builders and Enchant --- .../minecraft/commons/enchant/Enchant.java | 26 +++ .../minecraft/commons/item/ItemBuilder.java | 176 ++++++++++++++++++ .../commons/item/ItemMetaBuilder.java | 160 ++++++++++++++++ 3 files changed, 362 insertions(+) create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/enchant/Enchant.java create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemBuilder.java create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemMetaBuilder.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/enchant/Enchant.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/enchant/Enchant.java new file mode 100644 index 000000000..a58bd3c58 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/enchant/Enchant.java @@ -0,0 +1,26 @@ +package ru.progrm_jarvis.minecraft.commons.enchant; + +import com.google.common.base.Preconditions; +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.Value; +import lombok.experimental.FieldDefaults; +import org.bukkit.enchantments.Enchantment; + +import javax.annotation.Nonnegative; + +@Value(staticConstructor = "of") +@FieldDefaults(level = AccessLevel.PRIVATE) +public class Enchant { + + @NonNull Enchantment enchantment; + @Nonnegative int level; + + + public Enchant(@NonNull final Enchantment enchantment, final int level) { + Preconditions.checkArgument(level >= 0, "Level should be non-negative"); + + this.enchantment = enchantment; + this.level = level; + } +} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemBuilder.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemBuilder.java new file mode 100644 index 000000000..04762ad22 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemBuilder.java @@ -0,0 +1,176 @@ +package ru.progrm_jarvis.minecraft.commons.item; + +import lombok.Data; +import lombok.NonNull; +import lombok.experimental.Accessors; +import lombok.val; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import ru.progrm_jarvis.minecraft.commons.enchant.Enchant; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; + +@Data(staticConstructor = "create") +@Accessors(fluent = true, chain = true) +public class ItemBuilder implements Cloneable { + + @NonNull Material material = Material.STONE; + int amount = 1; + + M metadata; + + // + + public Map enchantments() { + return metadata == null ? Collections.emptyMap() : new HashMap<>(metadata.getEnchants()); + } + + public ItemBuilder addEnchantment(@NonNull final Enchantment enchantment, final int level) { + initMetadata(); + + metadata.addEnchant(enchantment, level, true); + + return this; + } + + public ItemBuilder addEnchantment(@NonNull final Enchant enchant) { + initMetadata(); + + metadata.addEnchant(enchant.getEnchantment(), enchant.getLevel(), true); + + return this; + } + + public ItemBuilder addEnchantments(@NonNull final Enchant... enchants) { + initMetadata(); + + for (val enchant : enchants) metadata.addEnchant(enchant.getEnchantment(), enchant.getLevel(), true); + + return this; + } + + public ItemBuilder addEnchantments(@NonNull final Iterable enchants) { + initMetadata(); + + for (val enchant : enchants) metadata.addEnchant(enchant.getEnchantment(), enchant.getLevel(), true); + + return this; + } + + public ItemBuilder addEnchantments(@NonNull final Map enchantments) { + initMetadata(); + + for (val enchantment : enchantments.entrySet()) metadata.addEnchant( + enchantment.getKey(), enchantment.getValue(), true + ); + + return this; + } + + public ItemBuilder removeEnchantment(@NonNull final Enchantment enchantment) { + if (metadata != null) metadata.removeEnchant(enchantment); + + return this; + } + + public ItemBuilder removeEnchantments(@NonNull final Enchantment... enchantments) { + if (metadata != null) for (val enchantment : enchantments) metadata.removeEnchant(enchantment); + + return this; + } + + public ItemBuilder removeEnchantments(@NonNull final Iterable enchantments) { + if (metadata != null) for (val enchantment : enchantments) metadata.removeEnchant(enchantment); + + return this; + } + + // + + // + + @SuppressWarnings("unchecked") + protected void initMetadata() { + if (metadata == null) metadata = (M) Bukkit.getItemFactory().getItemMeta(material); + } + + @SuppressWarnings("unchecked") + public ItemBuilder metadata(@NonNull final M metadata) { + this.metadata = (M) metadata.clone(); + + return this; + } + + public ItemMeta metadata() { + initMetadata(); + + return metadata.clone(); + } + + public ItemBuilder metadata(@NonNull final Consumer metadataModifier) { + metadataModifier.accept(metadata); + + return this; + } + + // + + // + public ItemBuilder unbreakable(final boolean unbreakable) { + initMetadata(); + + metadata.setUnbreakable(unbreakable); + + return this; + } + + public boolean unbreakable() { + initMetadata(); + + return metadata.isUnbreakable(); + } + + public ItemBuilder displayName(@NonNull final String displayName) { + initMetadata(); + + metadata.setDisplayName(displayName); + + return this; + } + + public String displayName() { + initMetadata(); + + return metadata.getDisplayName(); + } + + public ItemBuilder localizedName(@NonNull final String localizedName) { + initMetadata(); + + metadata.setLocalizedName(localizedName); + + return this; + } + + public String localizedName() { + initMetadata(); + + return metadata.getLocalizedName(); + } + // + + public ItemStack build() { + initMetadata(); + + val item = new ItemStack(material, amount); + item.setItemMeta(metadata.clone()); + + return item; + } +} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemMetaBuilder.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemMetaBuilder.java new file mode 100644 index 000000000..f3c098704 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemMetaBuilder.java @@ -0,0 +1,160 @@ +package ru.progrm_jarvis.minecraft.commons.item; + +import lombok.*; +import lombok.experimental.Accessors; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFactory; +import org.bukkit.inventory.meta.ItemMeta; +import ru.progrm_jarvis.minecraft.commons.enchant.Enchant; + +import javax.annotation.Nullable; +import javax.annotation.OverridingMethodsMustInvokeSuper; +import java.util.HashMap; +import java.util.Map; + +@Data +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +@Accessors(fluent = true, chain = true) +public class ItemMetaBuilder> { + + protected static final ItemFactory ITEM_FACTORY = Bukkit.getItemFactory(); + + @Getter(AccessLevel.NONE) @SuppressWarnings("unchecked") protected final B self = (B) this; + + @Nullable protected Boolean unbreakable; + @Nullable protected String displayName; + @Nullable protected String localizedName; + Map enchantments; + + @Nullable + public Boolean unbreakable() {return this.unbreakable;} + + @Nullable + public String displayName() {return this.displayName;} + + @Nullable + public String localizedName() {return this.localizedName;} + + public Map enchantments() {return this.enchantments;} + + public B unbreakable(@Nullable Boolean unbreakable) { + this.unbreakable = unbreakable; + + return self; + } + + public B displayName(@Nullable String displayName) { + this.displayName = displayName; + + return self; + } + + public B localizedName(@Nullable String localizedName) { + this.localizedName = localizedName; + + return self; + } + + public B enchantments(Map enchantments) { + this.enchantments = enchantments; + + return self; + } + + // + + protected void initEnchantments() { + if (enchantments == null) enchantments = new HashMap<>(); + } + + public B addEnchantment(@NonNull final Enchantment enchantment, final int level) { + initEnchantments(); + + enchantments.put(enchantment, level); + + return self; + } + + public B addEnchantment(@NonNull final Enchant enchant) { + initEnchantments(); + + enchantments.put(enchant.getEnchantment(), enchant.getLevel()); + + return self; + } + + public B addEnchantments(@NonNull final Enchant... enchants) { + initEnchantments(); + + for (val enchant : enchants) enchantments.put(enchant.getEnchantment(), enchant.getLevel()); + + return self; + } + + public B addEnchantments(@NonNull final Iterable enchants) { + initEnchantments(); + + for (val enchant : enchants) enchantments.put(enchant.getEnchantment(), enchant.getLevel()); + + return self; + } + + public B addEnchantments(@NonNull final Map enchantments) { + initEnchantments(); + + for (val enchantment : enchantments.entrySet()) this.enchantments.put(enchantment.getKey(), enchantment.getValue()); + + return self; + } + + public B removeEnchantment(@NonNull final Enchantment enchantment) { + if (this.enchantments != null) enchantments.remove(enchantment); + + return self; + } + + public B removeEnchantments(@NonNull final Enchantment... enchantments) { + if (this.enchantments != null) for (val enchantment : enchantments) this.enchantments.remove(enchantment); + + return self; + } + + public B removeEnchantments(@NonNull final Iterable enchantments) { + if (this.enchantments != null) for (val enchantment : enchantments) this.enchantments.remove(enchantment); + + return self; + } + // + + public M build() { + @SuppressWarnings("unchecked") val meta = (M) ITEM_FACTORY.getItemMeta(Material.IRON_ORE); + if (meta == null) throw new UnsupportedOperationException("Cannot create ItemMeta"); + fillMeta(meta); + + return meta; + } + + public ItemMetaBuilder applyTo(@NonNull M itemMeta) { + fillMeta(itemMeta); + + return this; + } + + @OverridingMethodsMustInvokeSuper + protected void fillMeta(@NonNull final M meta) { + if (unbreakable != null) meta.setUnbreakable(unbreakable); + if (displayName != null) meta.setDisplayName(displayName); + if (localizedName != null) meta.setLocalizedName(localizedName); + if (enchantments != null) { + for (val enchantment : meta.getEnchants().keySet()) meta.removeEnchant(enchantment); + for (val enchantment : enchantments.entrySet()) meta + .addEnchant(enchantment.getKey(), enchantment.getValue(), true); + } + } + + public static > ItemMetaBuilder create() { + return new ItemMetaBuilder<>(); + } +} From d63a135383e1cd9d260156c1121101b4e538ff17 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 31 Mar 2019 17:36:48 +0300 Subject: [PATCH 228/508] Add better constructors to CuboidFigure --- .../math/dimensional/CuboidFigure.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java index 86de8a735..27c303e07 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java @@ -1,9 +1,6 @@ package ru.progrm_jarvis.minecraft.commons.math.dimensional; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NonNull; -import lombok.Value; +import lombok.*; import lombok.experimental.FieldDefaults; import lombok.experimental.NonFinal; import org.bukkit.Location; @@ -18,6 +15,37 @@ @Getter double minX, minY, minZ, maxX, maxY, maxZ; + public CuboidFigure(final double x1, final double y1, final double z1, + final double x2, final double y2, final double z2) { + if (x1 < x2) { + minX = x1; + maxX = x2; + } else { + minX = x2; + maxX = x1; + } + + if (y1 < y2) { + minY = y1; + maxY = y2; + } else { + minY = y2; + maxY = y1; + } + + if (z1 < z2) { + minZ = z1; + maxZ = z2; + } else { + minZ = z2; + maxZ = z1; + } + } + + public CuboidFigure(final double x, final double y, final double z) { + this(0, 0, 0, x, y, z); + } + @Override public boolean contains(final double x, final double y, final double z) { return minX <= x && x <= maxX From 7dddb7c383ba6e4d9f343874abb17d41ffad8f51 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 31 Mar 2019 17:37:15 +0300 Subject: [PATCH 229/508] Add #getHitbox() to BasicFakeEntityLib --- .../fakeentitylib/entity/AbstractBasicFakeEntity.java | 3 +++ .../minecraft/fakeentitylib/entity/ArmorStandBlockItem.java | 5 +++++ .../minecraft/fakeentitylib/entity/BasicFakeEntity.java | 5 ++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index fe1108e7e..d140d7651 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -7,6 +7,7 @@ import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import ru.progrm_jarvis.minecraft.commons.math.dimensional.Figure3D; import javax.annotation.Nullable; import java.util.*; @@ -28,6 +29,8 @@ public abstract class AbstractBasicFakeEntity extends AbstractPlayerContainingFa */ @NonNull Vector velocity; + @NonNull @Getter Figure3D hitbox; + public AbstractBasicFakeEntity(final boolean global, final int viewDistance, @NonNull final Location location, @NonNull final Map players, diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 6bb47e788..6ec135af8 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -13,6 +13,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import ru.progrm_jarvis.minecraft.commons.math.dimensional.CuboidFigure; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator; import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand; @@ -82,6 +83,10 @@ public ArmorStandBlockItem(@Nullable final UUID uuid, equipmentPacket.setItem(this.item = item); // actual block-item position (head of armorstand) is one block higher than its coordinate so normalize it + { + final double x = location.getX(), y = location.getY(), z = location.getZ(); + hitbox = new CuboidFigure(0.25, 0.25, 0.25); + } yOffset = -1; } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java index 6e623f2b1..baae83f8b 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java @@ -5,6 +5,7 @@ import lombok.NonNull; import org.bukkit.Location; import org.bukkit.util.Vector; +import ru.progrm_jarvis.minecraft.commons.math.dimensional.Figure3D; import javax.annotation.Nonnull; import java.util.Collection; @@ -27,9 +28,11 @@ public interface BasicFakeEntity extends ObservableFakeEntity { void despawn(); /////////////////////////////////////////////////////////////////////////// - // Location + // Dimensional /////////////////////////////////////////////////////////////////////////// + Figure3D getHitbox(); + void move(double dx, double dy, double dz, float dYaw, float dPitch); default void move(final double dx, final double dy, final double dz) { From 3a17cd9c9ffa425d313702cd6b960b51fbaecc85 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 31 Mar 2019 18:33:46 +0300 Subject: [PATCH 230/508] Move special dependencies build to separate shell script --- .travis.yml | 8 ++------ install-git-dependencies.sh | 41 +++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 install-git-dependencies.sh diff --git a/.travis.yml b/.travis.yml index 9e92b714d..9616e42ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,12 +5,8 @@ language: java # Build project, installing to local repo (skip testing and javadoc generation (if those exist)) install: # Temporarily: -- mkdir ___locally_built_maven_artifacts___ -- cd ___locally_built_maven_artifacts___/ -- git clone --single-branch --branch legacy-support https://github.com/JarvisCraft/PacketWrapper.git -- cd PacketWrapper/PacketWrapper/ -- mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V -- cd ../../../ +- chmod +x ./install-git-dependencies.sh +- ./install-git-dependencies.sh # Normal build part - mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V # Test project diff --git a/install-git-dependencies.sh b/install-git-dependencies.sh new file mode 100644 index 000000000..2ce6a259c --- /dev/null +++ b/install-git-dependencies.sh @@ -0,0 +1,41 @@ +#!/usr/bin/env bash + + +readonly ROOT_DIRECTORY=$(pwd) +readonly DIRECTORY='___locally_built_dependencies___' + +# Resets the selected directory to the ROOT_DIRECTORY +function reset_directory() { + cd $ROOT_DIRECTORY +} + +# Installs dependency using HTTPS-Git and Maven +# @param 1 Url of Git user +# @param 2 Name of the Git repository +# @param 3 Git branch to use +# <@param 4> Sub-directory to use as Maven root +function install_dependency() { + local url="https://$1/$2.git" + echo "Installing dependency from $url ($3)" + git clone --single-branch --branch $3 $url + cd $2 + if [ ! -z $4 ]; then + cd $4 + fi + + echo "Building..." + mvn clean install -Dmaven.javadoc.skip=true -B -V + + reset_directory +} + +echo 'Installing special dependencies' + +echo "Root directory set to $ROOT_DIRECTORY" + +echo "Creating directory $DIRECTORY" +mkdir $DIRECTORY +echo 'Directory created' +cd $DIRECTORY + +install_dependency "github.com/JarvisCraft" "PacketWrapper" "legacy-support" "PacketWrapper" \ No newline at end of file From 001e932eb7c4d6f1d7329bb35edc98efce3ce513 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 31 Mar 2019 21:51:14 +0300 Subject: [PATCH 231/508] Attempt to use new build script --- .travis.yml | 39 +++++++++++++++--------- .travis/{deploy.sh => perform-deploy.sh} | 0 deploy.sh | 4 +-- 3 files changed, 27 insertions(+), 16 deletions(-) rename .travis/{deploy.sh => perform-deploy.sh} (100%) diff --git a/.travis.yml b/.travis.yml index 9616e42ba..0c9e07ffa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,24 +4,35 @@ language: java ### Maven basic build ### # Build project, installing to local repo (skip testing and javadoc generation (if those exist)) install: -# Temporarily: -- chmod +x ./install-git-dependencies.sh +# Give required permissions to used shell scripts +- chmod +x ./.travis/perform-deploy.sh - ./install-git-dependencies.sh # Normal build part - mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V -# Test project -script: mvn test -B -V +jobs: + # Test project against multiple JDK versions and then deploy + include: + - stage: test + jdk: openjdk8 + script: mvn -q verify + - stage: test + jdk: oraclejdk8 + script: mvn -q verify + - stage: test + jdk: oraclejdk11 + script: mvn -q verify + + # 2. Deploy + - stage: deploy + jdk: openjdk8 + script: + - chmod +x ./install-git-dependencies.sh + - chmod +x ./deploy.sh + - chmod +x ./project-version.sh + - ./deploy.sh +# mvn test -B -V # Cached directories cache: directories: - - ~/.m2/repository - -# After success scripts -after_success: -# Give required permissions to used shell scripts -- chmod +x ./deploy.sh -- chmod +x ./project-version.sh -- chmod +x ./.travis/deploy.sh -# Deploy to OSSRH repository if possible -- ./deploy.sh \ No newline at end of file + - ~/.m2/repository \ No newline at end of file diff --git a/.travis/deploy.sh b/.travis/perform-deploy.sh similarity index 100% rename from .travis/deploy.sh rename to .travis/perform-deploy.sh diff --git a/deploy.sh b/deploy.sh index 9b247877b..0bc87c3da 100644 --- a/deploy.sh +++ b/deploy.sh @@ -35,7 +35,7 @@ if [[ ${project_version} == *-SNAPSHOT ]]; then # Try to deploy snapshot if vers # Snapshots deployment happens only for `development` branch excluding pull requests to it (but including merges) if [[ "$TRAVIS_BRANCH" = 'development' ]]; then echo "Deploying ${project_version} to Sonatype repository" - ./.travis/deploy.sh + .travis/perform-deploy.sh else echo 'Not deploying as branch is not `development`' fi @@ -44,7 +44,7 @@ else # Try to deploy release if version doesn't end with '-SNAPSHOT' # Release deployment happens only for `releases` branch excluding pull requests to it (but including merges) if [[ "$TRAVIS_BRANCH" = 'releases' ]]; then echo "Deploying ${project_version} to Maven Central" - ./.travis/deploy.sh + .travis/perform-deploy.sh else echo 'Not deploying as branch is not `releases`' fi From 8d8b9857dfdbd3dc402f1b63c5ecb6b95629413a Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 31 Mar 2019 22:23:32 +0300 Subject: [PATCH 232/508] Fix chmod mess in .travis.yml --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0c9e07ffa..ea1a803e2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ language: java # Build project, installing to local repo (skip testing and javadoc generation (if those exist)) install: # Give required permissions to used shell scripts -- chmod +x ./.travis/perform-deploy.sh +- chmod +x ./install-git-dependencies.sh - ./install-git-dependencies.sh # Normal build part - mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V @@ -26,9 +26,9 @@ jobs: - stage: deploy jdk: openjdk8 script: - - chmod +x ./install-git-dependencies.sh - chmod +x ./deploy.sh - chmod +x ./project-version.sh + - chmod +x ./.travis/perform-deploy.sh - ./deploy.sh # mvn test -B -V From e948924fc1dc0b05cf9bf2e18e7878c5a5cc1882 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 31 Mar 2019 22:28:58 +0300 Subject: [PATCH 233/508] Remove oraclejdk11 check and .travis.yml redundant comment --- .travis.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index ea1a803e2..32a79ddd7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,9 +18,6 @@ jobs: - stage: test jdk: oraclejdk8 script: mvn -q verify - - stage: test - jdk: oraclejdk11 - script: mvn -q verify # 2. Deploy - stage: deploy @@ -30,7 +27,6 @@ jobs: - chmod +x ./project-version.sh - chmod +x ./.travis/perform-deploy.sh - ./deploy.sh -# mvn test -B -V # Cached directories cache: From b4531569badea1483f70b3f36cacde0c262d9906 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 31 Mar 2019 22:36:12 +0300 Subject: [PATCH 234/508] Use Optional.of instead of ofNullable in MetadataGenerator --- .../minecraft/commons/nms/metadata/MetadataGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java index f0d0e4c6c..c77462c37 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java @@ -633,7 +633,7 @@ public static WrappedWatchableObject owner(final UUID ownerUuid) { @Deprecated public static WrappedWatchableObject owner(final String ownerName) { if (VERSION >= 9) return FACTORY.createWatchableOptionalUUID( - 14, Optional.ofNullable(Bukkit.getOfflinePlayer(ownerName).getUniqueId()) + 14, Optional.of(Bukkit.getOfflinePlayer(ownerName).getUniqueId()) ); return FACTORY.createWatchable(21, ownerName); } From 86e739c058217478f2be838fd22b7995b6c5cd74 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 31 Mar 2019 22:40:18 +0300 Subject: [PATCH 235/508] Add condition not to perform deploy phase at all when not needed --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 32a79ddd7..e67fb70bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,7 @@ jobs: # 2. Deploy - stage: deploy + if: repo = JarvisCraft/minecraft-utils AND type != pull_request jdk: openjdk8 script: - chmod +x ./deploy.sh From a1a7afa51bc7652a0b8455eed0fe72acbee7ca67 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 1 Apr 2019 00:07:40 +0300 Subject: [PATCH 236/508] Try use r per-java-version profiles --- pom.xml | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2f2e69b7f..52b52f7c5 100644 --- a/pom.xml +++ b/pom.xml @@ -54,8 +54,6 @@ UTF-8 - 1.8 - 1.8 5.4.1 1.3.2 @@ -349,6 +347,54 @@ + + + java-8 + + [1.8,9) + + + 1.8 + 1.8 + + + + java-9 + + 9 + + + 9 + + + + java-10 + + 10 + + + 10 + + + + java-11 + + 11 + + + 11 + + + + java-12 + + 12 + + + 12 + + + ossrh-deploy From 62d3a9840b4afab1695aede83896b460f36974c2 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 1 Apr 2019 00:09:15 +0300 Subject: [PATCH 237/508] Try test against JDK11 --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index e67fb70bc..0d2f3d66b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,9 @@ install: jobs: # Test project against multiple JDK versions and then deploy include: + - stage: test + jdk: oraclejdk11 + script: mvn -q verify - stage: test jdk: openjdk8 script: mvn -q verify From f30053681de612aef683e121c5bee93cab206eb1 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Mon, 1 Apr 2019 00:14:50 +0300 Subject: [PATCH 238/508] Disable JDK11 temporarily again <:) --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0d2f3d66b..e67fb70bc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,9 +12,6 @@ install: jobs: # Test project against multiple JDK versions and then deploy include: - - stage: test - jdk: oraclejdk11 - script: mvn -q verify - stage: test jdk: openjdk8 script: mvn -q verify From 530b4cd311c84e817398cfe429369e13bc5af426 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 1 Apr 2019 07:09:24 +0000 Subject: [PATCH 239/508] Bump httpclient from 4.5.7 to 4.5.8 Bumps httpclient from 4.5.7 to 4.5.8. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 52b52f7c5..373d54d7d 100644 --- a/pom.xml +++ b/pom.xml @@ -271,7 +271,7 @@ org.apache.httpcomponents httpclient - 4.5.7 + 4.5.8 From fbeb6ec3eb8c769dbf3e903458e50cde73f6d9f7 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 4 Apr 2019 23:08:22 +0300 Subject: [PATCH 240/508] Add default hitbox value for AbstractBasicFakeEntity --- .../fakeentitylib/entity/AbstractBasicFakeEntity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index d140d7651..77e2f1d98 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; import org.bukkit.util.Vector; import ru.progrm_jarvis.minecraft.commons.math.dimensional.Figure3D; +import ru.progrm_jarvis.minecraft.commons.math.dimensional.PointFigure; import javax.annotation.Nullable; import java.util.*; @@ -39,6 +40,8 @@ public AbstractBasicFakeEntity(final boolean global, final int viewDistance, this.velocity = velocity == null ? new Vector() : velocity; this.metadata = metadata; + + hitbox = PointFigure.from(location); } /////////////////////////////////////////////////////////////////////////// From 8a15713e7490df10f9ae1cecfd4f7554f3f18fd1 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 4 Apr 2019 23:23:11 +0300 Subject: [PATCH 241/508] Add ability to use only teleport packets for entities --- .../entity/AbstractBasicFakeEntity.java | 256 +++++++++++++----- 1 file changed, 183 insertions(+), 73 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index 77e2f1d98..1bc994950 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -32,6 +32,11 @@ public abstract class AbstractBasicFakeEntity extends AbstractPlayerContainingFa @NonNull @Getter Figure3D hitbox; + /** + * Whether optimized packets should use for moving the entity or not + */ + boolean compactMoving; + public AbstractBasicFakeEntity(final boolean global, final int viewDistance, @NonNull final Location location, @NonNull final Map players, @@ -175,120 +180,225 @@ protected abstract void performTeleportation(double x, double y, double z, @Override public void move(final double dx, final double dy, final double dz, final float dYaw, final float dPitch) { - if (dx == 0 && dy == 0 && dz == 0) { - if (dYaw != 0 || dPitch != 0) { - final float yaw = location.getYaw() + dYaw, pitch = location.getPitch() + dPitch; + if (compactMoving) { + if (dx == 0 && dy == 0 && dz == 0) { + if (dYaw != 0 || dPitch != 0) { + final float yaw = location.getYaw() + dYaw, pitch = location.getPitch() + dPitch; - performLook(yaw, pitch); + performLook(yaw, pitch); - location.setYaw(yaw); - location.setPitch(pitch); + location.setYaw(yaw); + location.setPitch(pitch); + } + } else { + velocity.setX(dx); + velocity.setY(dy); + velocity.setZ(dz); + // use teleportation if any of axises is above 8 blocks limit + if (dx > 8 || dy > 8 || dz > 8) { + final double x = location.getX() + dx, y = location.getY() + dy, z = location.getZ() + dz; + final float yaw = location.getYaw() + dYaw, pitch = location.getPitch() + dPitch; + + performTeleportation(x, y, z, pitch, yaw, true); + + location.setX(x); + location.setY(y); + location.setZ(z); + location.setYaw(yaw); + location.setPitch(pitch); + } + // otherwise use move + else { + if (dYaw == 0 && dPitch == 0) performMove(dx, dy, dz, true); + else { + performMoveLook(dx, dy, dz, dYaw, dPitch, true); + + location.setYaw(location.getYaw() + dYaw); + location.setPitch(location.getPitch() + dPitch); + } + + location.setX(location.getX() + dx); + location.setY(location.getY() + dy); + location.setZ(location.getZ() + dz); + } + + velocity.setX(0); + velocity.setY(0); + velocity.setZ(0); } } else { - velocity.setX(dx); - velocity.setY(dy); - velocity.setZ(dz); - // use teleportation if any of axises is above 8 blocks limit - if (dx > 8 || dy > 8 || dz > 8) { - final double x = location.getX() + dx, y = location.getY() + dy, z = location.getZ() + dz; - final float yaw = location.getYaw() + dYaw, pitch = location.getPitch() + dPitch; + var changeLocation = false; + double x = Double.NaN; + if (dx != 0) { + changeLocation = true; - performTeleportation(x, y, z, pitch, yaw, true); + location.setX(x = (location.getX() + dx)); + } + double y = Double.NaN; + if (dy != 0) { + changeLocation = true; - location.setX(x); - location.setY(y); - location.setZ(z); - location.setYaw(yaw); - location.setPitch(pitch); + location.setY(y = (location.getY() + dy)); } - // otherwise use move - else { - if (dYaw == 0 && dPitch == 0) performMove(dx, dy, dz, true); - else { - performMoveLook(dx, dy, dz, dYaw, dPitch, true); + double z = Double.NaN; + if (dz != 0) { + changeLocation = true; - location.setYaw(location.getYaw() + dYaw); - location.setPitch(location.getPitch() + dPitch); - } + location.setZ(z = (location.getZ() + dz)); + } + + var changeLook = false; + float yaw = Float.NaN; + if (dYaw != 0) { + changeLook = true; - location.setX(location.getX() + dx); - location.setY(location.getY() + dy); - location.setZ(location.getZ() + dz); + location.setYaw(yaw = (location.getYaw() + dYaw)); } + float pitch = Float.NaN; + if (dPitch != 0) { + changeLook = true; - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); + location.setPitch(pitch = (location.getPitch() + dPitch)); + } + + if (changeLocation) performTeleportation(x, y, z, yaw, pitch, false); + else if (changeLook) performLook(yaw, pitch); } } @Override @SuppressWarnings("Duplicates") public void moveTo(final double x, final double y, final double z, final float yaw, final float pitch) { - final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); + if (compactMoving) { + final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); - if (dx == 0 && dy == 0 && dz == 0) { - if (yaw != location.getYaw() || pitch != location.getPitch()) { - performLook(yaw, pitch); + if (dx == 0 && dy == 0 && dz == 0) { + if (yaw != location.getYaw() || pitch != location.getPitch()) { + performLook(yaw, pitch); - location.setYaw(yaw); - location.setPitch(pitch); + location.setYaw(yaw); + location.setPitch(pitch); + } + } else { + velocity.setX(dx); + velocity.setY(dy); + velocity.setZ(dz); + + if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, true); + else if (yaw != location.getYaw() || pitch != location.getPitch()) { + performMoveLook(dx, dy, dz, yaw, pitch, true); + + location.setYaw(yaw); + location.setPitch(pitch); + } else performMove(dx, dy, dz, true); + + location.setX(x); + location.setY(y); + location.setZ(z); + + velocity.setX(0); + velocity.setY(0); + velocity.setZ(0); } } else { - velocity.setX(dx); - velocity.setY(dy); - velocity.setZ(dz); + var changeLocation = false; + if (x != location.getX()) { + changeLocation = true; - if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, true); - else if (yaw != location.getYaw() || pitch != location.getPitch()) { - performMoveLook(dx, dy, dz, yaw, pitch, true); + location.setX(x); + } + if (y != location.getY()) { + changeLocation = true; + + location.setY(y); + } + if (z != location.getZ()) { + changeLocation = true; + + location.setZ(z); + } + var changeLook = false; + if (yaw != location.getYaw()) { + changeLook = true; location.setYaw(yaw); - location.setPitch(pitch); - } else performMove(dx, dy, dz, true); + } + if (pitch != location.getPitch()) { + changeLook = true; - location.setX(x); - location.setY(y); - location.setZ(z); + location.setPitch(pitch); + } - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); + if (changeLocation) performTeleportation(x, y, z, yaw, pitch, false); + else if (changeLook) performLook(yaw, pitch); } } @Override @SuppressWarnings("Duplicates") public void teleport(final double x, final double y, final double z, final float yaw, final float pitch) { - final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); + if (compactMoving) { + final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); - if (dx == 0 && dy == 0 && dz == 0) { - if (yaw != location.getYaw() || pitch != location.getPitch()) { - performLook(yaw, pitch); + if (dx == 0 && dy == 0 && dz == 0) { + if (yaw != location.getYaw() || pitch != location.getPitch()) { + performLook(yaw, pitch); - location.setYaw(yaw); - location.setPitch(pitch); + location.setYaw(yaw); + location.setPitch(pitch); + } + } else { + velocity.setX(dx); + velocity.setY(dy); + velocity.setZ(dz); + + if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, false); + else if (yaw != location.getYaw() || pitch != location.getPitch()) { + performMoveLook(dx, dy, dz, yaw, pitch, false); + + location.setYaw(yaw); + location.setPitch(pitch); + } else performMove(dx, dy, dz, false); + + location.setX(x); + location.setY(y); + location.setZ(z); + + velocity.setX(0); + velocity.setY(0); + velocity.setZ(0); } } else { - velocity.setX(dx); - velocity.setY(dy); - velocity.setZ(dz); + var changeLocation = false; + if (x != location.getX()) { + changeLocation = true; - if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, false); - else if (yaw != location.getYaw() || pitch != location.getPitch()) { - performMoveLook(dx, dy, dz, yaw, pitch, false); + location.setX(x); + } + if (y != location.getY()) { + changeLocation = true; + + location.setY(y); + } + if (z != location.getZ()) { + changeLocation = true; + + location.setZ(z); + } + var changeLook = false; + if (yaw != location.getYaw()) { + changeLook = true; location.setYaw(yaw); - location.setPitch(pitch); - } else performMove(dx, dy, dz, false); + } + if (pitch != location.getPitch()) { + changeLook = true; - location.setX(x); - location.setY(y); - location.setZ(z); + location.setPitch(pitch); + } - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); + if (changeLocation) performTeleportation(x, y, z, yaw, pitch, false); + else if (changeLook) performLook(yaw, pitch); } } From 029f032c115520658184f22ad436ecd5085c7097 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 7 Apr 2019 00:32:09 +0300 Subject: [PATCH 242/508] Never throw ObjectAlreadyShutDownException in ShutdownUtil#shutdown() --- .../minecraft/commons/util/shutdown/ShutdownHooks.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index 27caea1ae..cead23244 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -210,7 +210,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct @Override public void shutdown() { - checkState(); + if (shutDown) return; shutDown = true; @@ -322,7 +322,7 @@ public void shutdown() { for (val shutdownHook : shutdownHooks) shutdownHook.run(); shutdownHooks.clear(); - } else throw new ObjectAlreadyShutDownException(parent); + } } @Override From 7b61f93fef6c84f251782c134049ec9056de57fe Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 7 Apr 2019 00:32:38 +0300 Subject: [PATCH 243/508] Make ArmorStandBlockItem's inherited method more reusable --- .../entity/ArmorStandBlockItem.java | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 6ec135af8..43676995c 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -132,24 +132,9 @@ protected static WrappedDataWatcher createMetadata(@Nullable final Vector3F rota } @Override - public void spawn() { - actualizeSpawnPacket(); - - for (val entry : players.entrySet()) if (entry.getValue()) { - val player = entry.getKey(); - - spawnPacket.sendPacket(player); - equipmentPacket.sendPacket(player); - } - } - - @Override - public void render(final Player player) { - actualizeSpawnPacket(); - spawnPacket.sendPacket(player); + protected void performSpawnNoChecks(final Player player) { + super.performSpawnNoChecks(player); equipmentPacket.sendPacket(player); - - players.put(player, true); } /** From f870c8dfa64426640f6c488609e4843862e73191 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 7 Apr 2019 22:44:14 +0300 Subject: [PATCH 244/508] Add ability to change item of ArmorStandBlockItem --- .../minecraft/fakeentitylib/entity/ArmorStandBlockItem.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 43676995c..8ef11a311 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -180,4 +180,9 @@ public static float minimizeAngle(float degrees) { return degrees; } + + public void setItem(@NonNull final ItemStack item) { + equipmentPacket.setItem(this.item = item); + for (val entry : players.entrySet()) if (entry.getValue()) equipmentPacket.sendPacket(entry.getKey()); + } } From 3cbe8625b066a215e91db5d90634f1d123bda28c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 8 Apr 2019 06:54:44 +0000 Subject: [PATCH 245/508] Bump version.junit.platform from 1.3.2 to 1.4.2 Bumps `version.junit.platform` from 1.3.2 to 1.4.2. Updates `junit-platform-launcher` from 1.3.2 to 1.4.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.3.2 to 1.4.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 373d54d7d..6f14d9484 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ UTF-8 5.4.1 - 1.3.2 + 1.4.2 2.23.0 From 5a773001175f24e03766b40d790f7d3af871ed72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 8 Apr 2019 07:22:01 +0000 Subject: [PATCH 246/508] Bump version.mockito from 2.23.0 to 2.26.0 Bumps `version.mockito` from 2.23.0 to 2.26.0. Updates `mockito-core` from 2.23.0 to 2.26.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.23.0...v2.26.0) Updates `mockito-junit-jupiter` from 2.23.0 to 2.26.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.23.0...v2.26.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6f14d9484..37e7a9076 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 5.4.1 1.4.2 - 2.23.0 + 2.26.0 From 0339f12e9e8dfcd0ade00bd8446d62111f100035 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 8 Apr 2019 07:52:27 +0000 Subject: [PATCH 247/508] Bump version.junit from 5.4.1 to 5.4.2 Bumps `version.junit` from 5.4.1 to 5.4.2. Updates `junit-jupiter-api` from 5.4.1 to 5.4.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.4.1...r5.4.2) Updates `junit-jupiter-engine` from 5.4.1 to 5.4.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.4.1...r5.4.2) Updates `junit-jupiter-params` from 5.4.1 to 5.4.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.4.1...r5.4.2) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 37e7a9076..99b795bba 100644 --- a/pom.xml +++ b/pom.xml @@ -55,7 +55,7 @@ UTF-8 - 5.4.1 + 5.4.2 1.4.2 2.26.0 From f2beeeed93e0f03f854e6f8b7cd4fe4a49f57082 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Thu, 11 Apr 2019 06:56:36 +0000 Subject: [PATCH 248/508] Bump version.mockito from 2.26.0 to 2.27.0 Bumps `version.mockito` from 2.26.0 to 2.27.0. Updates `mockito-core` from 2.26.0 to 2.27.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.26.0...v2.27.0) Updates `mockito-junit-jupiter` from 2.26.0 to 2.27.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.26.0...v2.27.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 99b795bba..f040e2c6a 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 5.4.2 1.4.2 - 2.26.0 + 2.27.0 From 449d0deb1517088dfeb9be22404416d9058a9276 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 14 Apr 2019 23:22:14 +0300 Subject: [PATCH 249/508] Remove version specific profiles --- pom.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 373d54d7d..53527d487 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,8 @@ + 1.8 + 1.8 UTF-8 5.4.1 @@ -348,7 +350,7 @@ - + ossrh-deploy From 8be4e10dc9d20db0163efa7d8af3e2205cb86259 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 26 Apr 2019 19:15:34 +0300 Subject: [PATCH 250/508] Configure maven-surefire-plugin --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 53527d487..9ae66ae02 100644 --- a/pom.xml +++ b/pom.xml @@ -103,7 +103,6 @@ 3.0.0-M3 0 - true From 1a40d67f07090b7deba977b406812fbd7098c413 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Fri, 26 Apr 2019 22:21:05 +0300 Subject: [PATCH 251/508] Add SchedulerChain API --- .../chain/AbstractSchedulerChain.java | 125 ++++++++++++++++++ .../schedule/chain/BukkitSchedulerChain.java | 117 ++++++++++++++++ .../schedule/chain/SchedulerChain.java | 37 ++++++ 3 files changed, 279 insertions(+) create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/BukkitSchedulerChain.java create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/SchedulerChain.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java new file mode 100644 index 000000000..90dfb3114 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java @@ -0,0 +1,125 @@ +package ru.progrm_jarvis.minecraft.commons.schedule.chain; + +import lombok.*; +import lombok.experimental.Delegate; + +import javax.annotation.Nonnegative; +import java.util.Queue; + +public abstract class AbstractSchedulerChain implements SchedulerChain { + + @ToString + @RequiredArgsConstructor + protected static abstract class Builder implements SchedulerChain.Builder { + + @NonNull final Queue tasks; + + @Override + public SchedulerChain.Builder delay(final long delay) { + tasks.add(new PauseTask(delay)); + + return this; + } + + @Override + public SchedulerChain.Builder then(@NonNull final Runnable task) { + tasks.add(new UndelayedTask(task)); + + return this; + } + + @Override + public SchedulerChain.Builder then(@NonNull final Runnable task, final long delay) { + tasks.add(new DelayedTask(task, delay)); + + return this; + } + + @Override + public SchedulerChain.Builder thenRepeat(@NonNull final Runnable task, final long times) { + tasks.add(new UndelayedRecalledTask(task, times)); + + return this; + } + + @Override + public SchedulerChain.Builder thenRepeat(@NonNull final Runnable task, final long times, final long delay) { + tasks.add(new DelayedRecalledTask(task, delay, times)); + + return this; + } + } + + /** + * An entry of the chain. + */ + protected interface ChainedTask extends Runnable { + + /** + * Gets the delay after which this element entry should be called. + * + * @return delay of this chain entry + */ + long getDelay(); + + /** + * Gets the amount of times this task should be called. + * + * @apiNote the delay happens once after which the task is called multiple times without it + */ + @Nonnegative default long getRunTimes() { + return 1; + } + } + + @Value + protected static class PauseTask implements ChainedTask { + + long delay; + + @Override + public void run() {} // will even never be called + + @Override + public long getRunTimes() { + return 0; + } + } + + @Value + protected static class UndelayedTask implements ChainedTask { + + @Delegate @NonNull Runnable runnable; + + @Override + public long getDelay() { + return 0; + } + } + + @Value + protected static class UndelayedRecalledTask implements ChainedTask { + + @Delegate @NonNull Runnable runnable; + long runTimes; + + @Override + public long getDelay() { + return 0; + } + } + + @Value + protected static class DelayedTask implements ChainedTask { + + @Delegate @NonNull Runnable runnable; + long delay; + } + + @Value + protected static class DelayedRecalledTask implements ChainedTask { + + @Delegate @NonNull Runnable runnable; + long delay, runTimes; + } +} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/BukkitSchedulerChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/BukkitSchedulerChain.java new file mode 100644 index 000000000..bc39a6114 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/BukkitSchedulerChain.java @@ -0,0 +1,117 @@ +package ru.progrm_jarvis.minecraft.commons.schedule.chain; + +import lombok.*; +import lombok.experimental.FieldDefaults; +import lombok.experimental.NonFinal; +import org.bukkit.plugin.Plugin; +import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.scheduler.BukkitTask; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Queue; +import java.util.concurrent.atomic.AtomicBoolean; + +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public class BukkitSchedulerChain extends AbstractSchedulerChain { + + @NonNull AtomicBoolean running = new AtomicBoolean(); + + Plugin plugin; + @NonNull BukkitScheduler scheduler; + boolean async; + @NonNull Iterable tasks; + + @NonNull final Object currentTaskMutex; + + @SuppressWarnings("NullableProblems") @NonNull @NonFinal volatile Iterator iterator; + @NonFinal volatile BukkitTask currentTask; + + public static SchedulerChain.Builder builder(final Plugin plugin, final boolean async) { + return new Builder(plugin, async, new ArrayDeque<>()); + } + + protected BukkitSchedulerChain(@NonNull final Plugin plugin, final boolean async, + @NonNull final Iterable tasks) { + this.plugin = plugin; + this.scheduler = plugin.getServer().getScheduler(); + this.async = async; + this.tasks = tasks; + + currentTaskMutex = new Object[0]; + } + + @Override + public void run() { + if (running.compareAndSet(false, true)) { + iterator = tasks.iterator(); + + tryRunNextTask(); + } else throw new IllegalStateException("This BukkitSchedulerChain has already been started"); + } + + @Override + public void interrupt() { + if (running.get()) reset(); + } + + protected void reset() { + if (currentTask != null) { + synchronized (currentTaskMutex) { + if (currentTask != null) { + currentTask.cancel(); + currentTask = null; + } + } + } + running.set(false); + } + + protected void tryRunNextTask() { + if (iterator.hasNext()) { + val task = iterator.next(); + + val nextRunnable = createNextRunnable(task, task.getRunTimes()); + val delay = task.getDelay(); + + synchronized (currentTaskMutex) { + currentTask = async + ? scheduler.runTaskLaterAsynchronously(plugin, nextRunnable, delay) + : scheduler.runTaskLater(plugin, nextRunnable, delay); + } + } else reset(); + } + + protected Runnable createNextRunnable(@NonNull final Runnable runnable, final long times) { + return () -> { + var mutableTimes = times; + // call the required tasks needed amount of time + System.out.println("Run times: " + times); + while (mutableTimes-- > 0) runnable.run(); + + // pick next task (if there is one) and execute it + tryRunNextTask(); + }; + } + + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + protected static class Builder extends AbstractSchedulerChain.Builder { + + @NonNull Plugin plugin; + boolean async; + + public Builder(@NonNull final Plugin plugin, final boolean async, @NonNull final Queue tasks) { + super(tasks); + this.plugin = plugin; + this.async = async; + } + + @Override + public SchedulerChain build() { + return tasks.isEmpty() + ? EmptyStub.INSTANCE + : new BukkitSchedulerChain(plugin, async, new ArrayList<>(tasks)); + } + } +} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/SchedulerChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/SchedulerChain.java new file mode 100644 index 000000000..d77a398c4 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/SchedulerChain.java @@ -0,0 +1,37 @@ +package ru.progrm_jarvis.minecraft.commons.schedule.chain; + +import lombok.NonNull; + +/** + * A chain of tasks called in the specified order. + */ +public interface SchedulerChain extends Runnable { + + void interrupt(); + + interface Builder { + + SchedulerChain build(); + + Builder delay(final long delay); + + Builder then(@NonNull Runnable task); + + Builder then(@NonNull Runnable task, final long delay); + + Builder thenRepeat(@NonNull Runnable task, final long times); + + Builder thenRepeat(@NonNull Runnable task, final long times, final long delay); + } + + final class EmptyStub implements SchedulerChain { + + public static final EmptyStub INSTANCE = new EmptyStub(); + + @Override + public void interrupt() {} + + @Override + public void run() {} + } +} From c078ed9f66127a1c1d6161bebeae1c293046da06 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 2 May 2019 13:22:20 +0300 Subject: [PATCH 252/508] Resolve issues with PlayerMapManager --- .../commons/mapimage/display/PlayerMapManager.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java index 4a5bc3109..54efd34af 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java @@ -64,11 +64,11 @@ public class PlayerMapManager { static { { val method = getDeclaredMethod(MapView.class, "getId"); - val parameterType = method.getParameterTypes()[0]; - if (parameterType == int.class) USE_INT_IDS = true; - else if (parameterType == short.class) USE_INT_IDS = false; + val returnType = method.getReturnType(); + if (returnType == int.class) USE_INT_IDS = true; + else if (returnType == short.class) USE_INT_IDS = false; else throw new IllegalStateException( - "Unknown return type of MapView#getId() method (" + parameterType + ")" + "Unknown return type of MapView#getId() method (" + returnType + ")" ); MAP_VIEW__GET_ID__METHOD = FastMethodWrapper.from(method); } @@ -165,7 +165,9 @@ public int getMapId(@NonNull final MapView mapView) { * @return a map view if it exists, or null otherwise */ public MapView getMap(final int mapId) { - return BUKKIT__GET_MAP__METHOD.invokeStatic(USE_INT_IDS ? mapId : (short) mapId); + return USE_INT_IDS + ? BUKKIT__GET_MAP__METHOD.invokeStatic(mapId) + : BUKKIT__GET_MAP__METHOD.invokeStatic((short) mapId); } /** From 7aa3916175bb9944729788285d2471e9141ce65f Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 2 May 2019 13:23:38 +0300 Subject: [PATCH 253/508] Tweaks to PacketWrapper- and ProtocolLib-related utilities --- .../misc/PacketWrapperPacketAssociations.java | 2 +- .../misc/PacketWrapperUtil.java} | 27 ++++----- .../commons/nms/PacketWrapperUtilTest.java | 59 +++++++++++++++++++ .../commons/nms/ToStringUtilTest.java | 16 ----- 4 files changed, 73 insertions(+), 31 deletions(-) rename minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/{ToStringUtil.java => protocol/misc/PacketWrapperUtil.java} (77%) create mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java delete mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java index 5a1ca40a1..915e479a2 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java @@ -42,7 +42,7 @@ public class PacketWrapperPacketAssociations { /** * Immutable bi-directional map of packet types and their IDs */ - @NonNull private final BiMap PACKET_TYPES = ImmutableBiMap.copyOf( + @NonNull public final BiMap PACKET_TYPES = ImmutableBiMap.copyOf( MapUtil.mapFiller(new HashMap()) .fill(fieldPacketTypes(PacketType.Handshake.Client.class, "Handshake", PacketDirection.CLIENT)) .fill(fieldPacketTypes(PacketType.Handshake.Server.class, "Handshake", PacketDirection.SERVER)) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java similarity index 77% rename from minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java index 2ba20e120..9c1da150d 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java @@ -1,16 +1,15 @@ -package ru.progrm_jarvis.minecraft.commons.nms; +package ru.progrm_jarvis.minecraft.commons.nms.protocol.misc; import com.comphenix.packetwrapper.AbstractPacket; import com.google.common.base.Function; import com.google.common.base.MoreObjects; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import lombok.AccessLevel; import lombok.NonNull; import lombok.SneakyThrows; -import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; import lombok.val; +import org.jetbrains.annotations.Nullable; import ru.progrm_jarvis.reflector.wrapper.FieldWrapper; import ru.progrm_jarvis.reflector.wrapper.MethodWrapper; import ru.progrm_jarvis.reflector.wrapper.fast.FastMethodWrapper; @@ -21,28 +20,27 @@ import java.util.stream.Collectors; @UtilityClass -@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) -public class ToStringUtil { +public class PacketWrapperUtil { - private String FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME - = ToStringUtil.class.getCanonicalName().concat(".FIELDS_CACHE_CONCURRENCY_LEVEL"), + private final String FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME + = PacketWrapperUtil.class.getCanonicalName().concat(".FIELDS_CACHE_CONCURRENCY_LEVEL"), METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME - = ToStringUtil.class.getCanonicalName().concat(".METHODS_CACHE_CONCURRENCY_LEVEL"); + = PacketWrapperUtil.class.getCanonicalName().concat(".METHODS_CACHE_CONCURRENCY_LEVEL"); - private Cache, Map>> FIELDS_CACHE = CacheBuilder.newBuilder() + private final Cache, Map>> FIELDS_CACHE = CacheBuilder.newBuilder() .concurrencyLevel(Integer.parseInt(MoreObjects.firstNonNull( System.getProperty(FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME), "2") )) .build(); - private Cache, Map>> METHODS_CACHE = CacheBuilder.newBuilder() + private final Cache, Map>> METHODS_CACHE = CacheBuilder.newBuilder() .concurrencyLevel(Integer.parseInt(MoreObjects.firstNonNull( System.getProperty(METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME), "2") )) .build(); @SneakyThrows - public String toString(final AbstractPacket packet) { + public String toString(@Nullable final AbstractPacket packet) { if (packet == null) return "null"; final Map> methods; @@ -58,7 +56,6 @@ public String toString(final AbstractPacket packet) { className = clazz.getName(); } - if (methods.isEmpty()) return className + "{}"; val stringBuilder = new StringBuilder(className) @@ -92,8 +89,10 @@ public String getterNameToString(@NonNull final String getterName) { if (getterName.startsWith("get")) { val name = getterName.substring(3); if (name.length() == 0) return "get"; - else return name.substring(0, 1).toLowerCase() + name.substring(1); - } else return getterName; + + return name.substring(0, 1).toLowerCase() + name.substring(1); + } + return getterName; } } diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java new file mode 100644 index 000000000..d9ee80794 --- /dev/null +++ b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java @@ -0,0 +1,59 @@ +package ru.progrm_jarvis.minecraft.commons.nms; + +import com.comphenix.packetwrapper.AbstractPacket; +import com.google.common.reflect.ClassPath; +import lombok.val; +import org.apache.commons.lang.math.RandomUtils; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import ru.progrm_jarvis.minecraft.commons.nms.protocol.misc.PacketWrapperUtil; +import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; +import ru.progrm_jarvis.reflector.Reflector; +import ru.progrm_jarvis.reflector.wrapper.fast.FastConstructorWrapper; + +import java.io.IOException; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static com.google.common.reflect.ClassPath.from; +import static java.util.regex.Pattern.compile; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class PacketWrapperUtilTest { + + private static final Pattern + PACKET_WRAPPER_CLASS_NAME_PATTERN = compile("Wrapper[A-Z][a-z]+(?:Client|Server)[A-Z][A-Za-z]+"), + PACKET_WRAPPER_TO_STRING_PATTERN = compile("Wrapper[A-Z][a-z]+(?:Client|Server)[A-Z][A-Za-z]+\\{.*}"); + + @Test + void getterNameToStringTest() { + assertEquals("lel", PacketWrapperUtil.getterNameToString("lel")); + assertEquals("foo", PacketWrapperUtil.getterNameToString("getFoo")); + assertEquals("barBaz", PacketWrapperUtil.getterNameToString("getBarBaz")); + assertEquals("get", PacketWrapperUtil.getterNameToString("get")); + } + + @Test@Disabled("Requires PortocolManager singleton at runtime") + @SuppressWarnings({"UnstableApiUsage", "unchecked"}) + void defaultPacketsTest() throws IOException { + val classLoader = AbstractPacket.class.getClassLoader(); + + from(classLoader) + .getTopLevelClasses(AbstractPacket.class.getPackage().getName()) + .stream() + .filter(classInfo -> PACKET_WRAPPER_CLASS_NAME_PATTERN.matcher(classInfo.getSimpleName()).matches()) + .map(ClassPath.ClassInfo::getName) + .map((UncheckedFunction>) className + -> (Class) classLoader.loadClass(className)) + .map(Reflector::getDeclaredConstructor) + .map(FastConstructorWrapper::from) + .collect(Collectors.toSet()) + .forEach(constructor -> { + System.out.println("Testing: " + constructor); + for (int i = 0; i < 3 + RandomUtils.nextInt(3); i++) assertDoesNotThrow( + () -> PacketWrapperUtil.toString(constructor.construct()) + ); + }); + } +} \ No newline at end of file diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java deleted file mode 100644 index 934712783..000000000 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/ToStringUtilTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.nms; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class ToStringUtilTest { - - @Test - void getterNameToStringTest() { - assertEquals("lel", ToStringUtil.getterNameToString("lel")); - assertEquals("foo", ToStringUtil.getterNameToString("getFoo")); - assertEquals("barBaz", ToStringUtil.getterNameToString("getBarBaz")); - assertEquals("get", ToStringUtil.getterNameToString("get")); - } -} \ No newline at end of file From bb9be7afbaed078f4181df2d2eeca4d0511a80be Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Thu, 2 May 2019 17:39:00 +0300 Subject: [PATCH 254/508] Add UuidUtil --- .../minecraft/commons/util/UuidUtil.java | 48 +++++++++++++++++ .../minecraft/commons/util/UuidUtilTest.java | 52 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtil.java create mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtilTest.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtil.java new file mode 100644 index 000000000..4f61cc52e --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtil.java @@ -0,0 +1,48 @@ +package ru.progrm_jarvis.minecraft.commons.util; + +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import lombok.val; + +import java.nio.ByteBuffer; +import java.util.UUID; + +import static com.google.common.base.Preconditions.checkArgument; + +/** + * Utility for {@link UUID}-related functionality. + */ +@UtilityClass +public class UuidUtil { + + /** + * Converts {@link UUID} into an array of 16 {@link byte}s. + * + * @param uuid UUID to convert + * @return result of conversion as array of 16 bytes + * + * @see #uuidFromBytes(byte[]) for backward conversion + */ + public byte[] uuidToBytes(@NonNull final UUID uuid) { + val buffer = ByteBuffer.wrap(new byte[16]); + buffer.putLong(uuid.getMostSignificantBits()); + buffer.putLong(uuid.getLeastSignificantBits()); + + return buffer.array(); + } + + /** + * Converts a 16-{@link byte}s array into a {@link UUID}. + * + * @param bytes array of 16 bytes to convert + * @return result of conversion as UUID + * + * @see #uuidToBytes(UUID) for backward conversion + */ + public UUID uuidFromBytes(@NonNull final byte[] bytes) { + checkArgument(bytes.length == 16, "bytes length should be 16"); + + val buffer = ByteBuffer.wrap(bytes); + return new UUID(buffer.getLong(), buffer.getLong()); + } +} diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtilTest.java new file mode 100644 index 000000000..47553798c --- /dev/null +++ b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtilTest.java @@ -0,0 +1,52 @@ +package ru.progrm_jarvis.minecraft.commons.util; + +import lombok.val; +import lombok.var; +import org.junit.jupiter.api.Test; + +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +import static org.junit.jupiter.api.Assertions.*; +import static ru.progrm_jarvis.minecraft.commons.util.UuidUtil.uuidFromBytes; +import static ru.progrm_jarvis.minecraft.commons.util.UuidUtil.uuidToBytes; + +class UuidUtilTest { + + @Test + void testBytesToUuidFailSafe() { + val random = ThreadLocalRandom.current(); + var iterations = 32 + random.nextInt(33); + for (int i = 0; i < iterations; i++) { + val bytes = new byte[random.nextInt(16)]; + assertThrows(IllegalArgumentException.class, () -> uuidFromBytes(bytes)); + } + + iterations = 32 + random.nextInt(33); + for (int i = 0; i < iterations; i++) { + val bytes = new byte[17 + random.nextInt(Integer.MAX_VALUE - 16)]; + assertThrows(IllegalArgumentException.class, () -> uuidFromBytes(bytes)); + } + } + + @Test + void testUuidToBytesAndOpposite() { + var iterations = 32 + ThreadLocalRandom.current().nextInt(33); + for (int i = 0; i < iterations; i++) { + val uuid = UUID.randomUUID(); + assertEquals(uuid, uuidFromBytes(uuidToBytes(uuid))); + } + } + + @Test + void testBytesToUuidAndOpposite() { + val random = ThreadLocalRandom.current(); + var iterations = 32 + random.nextInt(33); + for (int i = 0; i < iterations; i++) { + val bytes = new byte[16]; + random.nextBytes(bytes); + + assertArrayEquals(bytes, uuidToBytes(uuidFromBytes(bytes))); + } + } +} \ No newline at end of file From 4cff901c333ee63ce398fbbc4cc61d8314c8ede4 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 01:48:29 +0300 Subject: [PATCH 255/508] Add JUnit dependency to mc-unit --- mc-unit/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mc-unit/pom.xml b/mc-unit/pom.xml index 0d836120d..05d885746 100644 --- a/mc-unit/pom.xml +++ b/mc-unit/pom.xml @@ -32,6 +32,11 @@ jsr305 + + org.junit.jupiter + junit-jupiter-api + provided + org.mockito mockito-core From 61808d0c0313f395a2a0c8b1f0cfa7afc73ed9dd Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 01:48:44 +0300 Subject: [PATCH 256/508] Add spigot-api dependency to mc-unit --- mc-unit/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mc-unit/pom.xml b/mc-unit/pom.xml index 05d885746..b9b9a62c5 100644 --- a/mc-unit/pom.xml +++ b/mc-unit/pom.xml @@ -14,6 +14,10 @@ + + org.spigotmc + spigot-api + commons-io commons-io From 6820fa97669d30eb65d38a263b259d34a6291de3 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 01:57:39 +0300 Subject: [PATCH 257/508] Add NmsTestUtil to mc-unit --- .../mcunit/util/NmsTestUtil.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 mc-unit/src/main/java/ru/progrm_jarvis/mcunit/util/NmsTestUtil.java diff --git a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/util/NmsTestUtil.java b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/util/NmsTestUtil.java new file mode 100644 index 000000000..b4a6dda6a --- /dev/null +++ b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/util/NmsTestUtil.java @@ -0,0 +1,52 @@ +package ru.progrm_jarvis.mcunit.util; + +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import lombok.val; +import org.bukkit.Bukkit; + +import java.util.regex.Pattern; + +/** + * Utility for NMS-related functionality. + */ +@UtilityClass +public class NmsTestUtil { + + /** + * Pattern matching a server class name which has {@code v__R} in its package. + */ + private static final Pattern NMS_SERVER_VERSION_PART_PATTERN = Pattern + .compile("(?:\\w+\\.)*v\\d+_\\d+_R\\d+\\.\\w+"); + + /** + * Checks whether the specified class name is a valid NMS server name. + * + * @param serverName server name to check + * @return {@link true} if the class name is a valid NM-server name and {@link false} otherwise + * + * @apiNote valid NMS-server name contains {@code v__R} in its package + */ + public boolean isNmsServerClassName(@NonNull final String serverName) { + return NMS_SERVER_VERSION_PART_PATTERN.matcher(serverName).matches(); + } + + /** + * Checks whether current environment is an NMS-environment. + * + * @return {@code true} if current environment is (possibly) a valid NMS-environment + * and {@link false} otherwise + * + * @apiNote this method checks whether {@link Bukkit#getServer()} is not {@link null} + * and that its canonical class name is a valid NMS-server class name + * + * @see #isNmsServerClassName(String) method used for checking {@link Bukkit#getServer()}'s class's canonical name + */ + public boolean isEnvironmentNms() { + val server = Bukkit.getServer(); + //noinspection ConstantConditions + if (server == null) return false; + + return isNmsServerClassName(server.getClass().getCanonicalName()); + } +} From 123ff73638b84caefb55ac6fde5e2538e5935685 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 01:58:24 +0300 Subject: [PATCH 258/508] Add `@EnabledIfNMS` to mc-unit --- .../mcunit/annotation/EnabledIfNMS.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNMS.java diff --git a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNMS.java b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNMS.java new file mode 100644 index 000000000..a5e3e9f70 --- /dev/null +++ b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNMS.java @@ -0,0 +1,19 @@ +package ru.progrm_jarvis.mcunit.annotation; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIf; + +import java.lang.annotation.*; + +/** + * Indicates that the test should only be run if current environment has NMS-classes. + */ +@Test +@Documented +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@EnabledIf( + value = "Java.type(\"ru.progrm_jarvis.mcunit.util.NmsTestUtil\").isEnvironmentNms()", + reason = "Current environment doesn't have NMS classes needed for testing" +) +public @interface EnabledIfNMS {} From 0732b3217e6caea6e137e89238e473d3170f1dac Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 02:27:40 +0300 Subject: [PATCH 259/508] Add build-nms.sh --- .nms/build-nms.sh | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .nms/build-nms.sh diff --git a/.nms/build-nms.sh b/.nms/build-nms.sh new file mode 100644 index 000000000..99ccb4632 --- /dev/null +++ b/.nms/build-nms.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +curl -o BuildTools.jar \ +https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar \ +|| wget -O BuildTools.jar \ +https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar + +java -jar BuildTools.jar \ No newline at end of file From 382fc7f73b80563159eb94575ba41ec27154cac0 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 02:28:36 +0300 Subject: [PATCH 260/508] Git-ignore .nms/ --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 2eb6eb700..16b8675c2 100644 --- a/.gitignore +++ b/.gitignore @@ -98,4 +98,7 @@ buildNumber.properties # End of https://www.gitignore.io/api/maven,intellij+all ### Security ### -*.asc \ No newline at end of file +*.asc + +### BuildTools-generated ### +.nms/** \ No newline at end of file From 20b2c7531d818e224d1411d30ddbe877cac17a42 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 02:32:14 +0300 Subject: [PATCH 261/508] Add ChatComponentUtil --- .../commons/util/chat/ChatComponentUtil.java | 48 +++++++++++++++++++ .../util/chat/ChatComponentUtilTest.java | 30 ++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java create mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtilTest.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java new file mode 100644 index 000000000..b6f853600 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java @@ -0,0 +1,48 @@ +package ru.progrm_jarvis.minecraft.commons.util.chat; + +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import com.google.gson.*; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.experimental.UtilityClass; + +import java.lang.reflect.Type; + +/** + * Utility for functions related to chat-components. + */ +@UtilityClass +public class ChatComponentUtil { + + /** + * Gets an instance of {@link WrappedChatComponentGsonSerializer} + * capable of serializing and deserializing {@link WrappedChatComponent} + * which may be used in {@link GsonBuilder#registerTypeAdapter(Type, Object)}. + * + * @return instance of {@link WrappedChatComponentGsonSerializer} for {@link WrappedChatComponent} (de)serialization + */ + public static WrappedChatComponentGsonSerializer wrappedChatComponentGsonSerializer() { + return WrappedChatComponentGsonSerializer.INSTANCE; + } + + @NoArgsConstructor(access = AccessLevel.PROTECTED) + public static class WrappedChatComponentGsonSerializer + implements JsonSerializer, JsonDeserializer { + + private static final WrappedChatComponentGsonSerializer INSTANCE = new WrappedChatComponentGsonSerializer(); + + @Override + public WrappedChatComponent deserialize(final JsonElement json, final Type typeOfT, + final JsonDeserializationContext context) + throws JsonParseException { + if (json.isJsonObject()) return WrappedChatComponent.fromJson(json.toString()); + return WrappedChatComponent.fromText(json.getAsString()); + } + + @Override + public JsonElement serialize(final WrappedChatComponent src, final Type typeOfSrc, + final JsonSerializationContext context) { + return context.serialize(context.serialize(src.getJson(), JsonObject.class)); + } + } +} diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtilTest.java new file mode 100644 index 000000000..c0547549e --- /dev/null +++ b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtilTest.java @@ -0,0 +1,30 @@ +package ru.progrm_jarvis.minecraft.commons.util.chat; + +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import com.google.gson.GsonBuilder; +import lombok.val; +import org.junit.jupiter.api.Test; +import ru.progrm_jarvis.mcunit.annotation.EnabledIfNMS; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ChatComponentUtilTest { + + @Test + @EnabledIfNMS + void testWrappedChatComponentGsonSerializer() { + val gson = new GsonBuilder() + .registerTypeAdapter(WrappedChatComponent.class, ChatComponentUtil.wrappedChatComponentGsonSerializer()) + .create(); + + assertEquals( + WrappedChatComponent.fromJson("{\"text\": \"Hello world!\"}"), + gson.fromJson("{\"text\": \"Hello world!\"}", WrappedChatComponent.class) + ); + + assertEquals( + WrappedChatComponent.fromText("Hello world"), + gson.fromJson("Hello world", WrappedChatComponent.class) + ); + } +} \ No newline at end of file From a41bd87e050e99e8916c10b9f2d767320731fdc1 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 02:32:35 +0300 Subject: [PATCH 262/508] Move IntWrapper to primitive package --- .../commons/util/{number => primitive}/IntWrapper.java | 2 +- .../commons/util/{number => primitive}/IntWrapperTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/{number => primitive}/IntWrapper.java (99%) rename minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/{number => primitive}/IntWrapperTest.java (99%) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java similarity index 99% rename from minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java index 37d406624..45dea020a 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapper.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.commons.util.number; +package ru.progrm_jarvis.minecraft.commons.util.primitive; import lombok.*; import lombok.experimental.FieldDefaults; diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java similarity index 99% rename from minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java rename to minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java index 1de538c2b..35a128840 100644 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/number/IntWrapperTest.java +++ b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.commons.util.number; +package ru.progrm_jarvis.minecraft.commons.util.primitive; import lombok.NonNull; import lombok.val; From 56a45624a173bca32f7447cc7e2c58fd1f521d69 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 14:47:45 +0300 Subject: [PATCH 263/508] Docs: ChatComponentUtil.WrappedChatComponentGsonSerializer --- .../minecraft/commons/util/chat/ChatComponentUtil.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java index b6f853600..e92d26552 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java @@ -25,10 +25,17 @@ public static WrappedChatComponentGsonSerializer wrappedChatComponentGsonSeriali return WrappedChatComponentGsonSerializer.INSTANCE; } + /** + * {@link JsonSerializer} and {@link JsonDeserializer} + * for use with {@link GsonBuilder#registerTypeAdapter(Type, Object)}. + */ @NoArgsConstructor(access = AccessLevel.PROTECTED) public static class WrappedChatComponentGsonSerializer implements JsonSerializer, JsonDeserializer { + /** + * Singleton instance of {@link WrappedChatComponentGsonSerializer}. + */ private static final WrappedChatComponentGsonSerializer INSTANCE = new WrappedChatComponentGsonSerializer(); @Override From 9085dd69d1e8cf39c475863af80404c4b1e6bafa Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 15:27:32 +0300 Subject: [PATCH 264/508] Add TitleUtil --- .../commons/util/title/TitleUtil.java | 285 ++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java new file mode 100644 index 000000000..67e1d8566 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java @@ -0,0 +1,285 @@ +package ru.progrm_jarvis.minecraft.commons.util.title; + +import com.comphenix.packetwrapper.WrapperPlayServerTitle; +import com.comphenix.protocol.wrappers.EnumWrappers; +import com.comphenix.protocol.wrappers.WrappedChatComponent; +import lombok.NonNull; +import lombok.experimental.UtilityClass; +import lombok.val; +import org.bukkit.entity.Player; + +/** + * Utility for title rendering on client. + */ +@UtilityClass +public class TitleUtil { + + /** + * Packet for clearing the title + */ + @NonNull protected final WrapperPlayServerTitle CLEAR_TITLE_PACKET = new WrapperPlayServerTitle(), + /** + * Packet for resetting the title + */ + RESET_TITLE_PACKET = new WrapperPlayServerTitle(); + + static { + CLEAR_TITLE_PACKET.setAction(EnumWrappers.TitleAction.CLEAR); + RESET_TITLE_PACKET.setAction(EnumWrappers.TitleAction.RESET); + } + + /** + * Clears the title for the player. + * + * @param player player to whom to clear the title + * + * @apiNote clearing the title means that the player will be able to see it again if title-time is sent to him + */ + public void clearTitle(@NonNull final Player player) { + CLEAR_TITLE_PACKET.sendPacket(player); + } + + /** + * Clears the title for the players. + * + * @param players players to whom to clear the title + * + * @apiNote clearing the title means that the player will be able to see it again if title-time is sent to him + */ + public void clearTitle(@NonNull final Player... players) { + for (val player : players) CLEAR_TITLE_PACKET.sendPacket(player); + } + + /** + * Clears the title for the players. + * + * @param players players to whom to clear the title + * + * @apiNote clearing the title means that the player will be able to see it again if title-time is sent to him + */ + public void clearTitle(@NonNull final Iterable players) { + for (val player : players) CLEAR_TITLE_PACKET.sendPacket(player); + } + + /** + * Resets the title for the player. + * + * @param player player to whom to reset the title + * + * @apiNote resetting the title means that the player won't be able to see it again without resending the text + */ + public void resetTitle(@NonNull final Player player) { + RESET_TITLE_PACKET.sendPacket(player); + } + + /** + * Resets the title for the players. + * + * @param players players to whom to reset the title + * + * @apiNote resetting the title means that the player won't be able to see it again without resending the text + */ + public void resetTitle(@NonNull final Player... players) { + for (val player : players) RESET_TITLE_PACKET.sendPacket(player); + } + + /** + * Resets the title for the players. + * + * @param players players to whom to reset the title + * + * @apiNote resetting the title means that the player won't be able to see it again without resending the text + */ + public void resetTitle(@NonNull final Iterable players) { + for (val player : players) RESET_TITLE_PACKET.sendPacket(player); + } + + /** + * Sends the title to the player. + * + * @param title text of the title message + * @param player player to whom to send the title + * + * @apiNote title won't display until title-time is sent + */ + public void sendTitle(@NonNull final WrappedChatComponent title, + @NonNull final Player player) { + val packet = new WrapperPlayServerTitle(); + packet.setAction(EnumWrappers.TitleAction.TITLE); + packet.setTitle(title); + + packet.sendPacket(player); + } + + /** + * Sends the title to the player. + * + * @param title text of the title message + * @param players players to whom to send the title + * + * @apiNote title won't display until title-time is sent + */ + public void sendTitle(@NonNull final WrappedChatComponent title, + @NonNull final Player... players) { + val packet = new WrapperPlayServerTitle(); + packet.setAction(EnumWrappers.TitleAction.TITLE); + packet.setTitle(title); + + for (val player : players) packet.sendPacket(player); + } + + /** + * Sends the title to the player. + * + * @param title text of the title message + * @param players players to whom to send the title + * + * @apiNote title won't display until title-time is sent + */ + public void sendTitle(@NonNull final WrappedChatComponent title, + @NonNull final Iterable players) { + val packet = new WrapperPlayServerTitle(); + packet.setAction(EnumWrappers.TitleAction.TITLE); + packet.setTitle(title); + + for (val player : players) packet.sendPacket(player); + } + + /** + * Sends the subtitle to the player. + * + * @param title text of the subtitle message + * @param player player to whom to send the subtitle + * + * @apiNote subtitle won't display until title-time is sent + */ + public void sendSubtitle(@NonNull final WrappedChatComponent title, + @NonNull final Player player) { + val packet = new WrapperPlayServerTitle(); + packet.setAction(EnumWrappers.TitleAction.SUBTITLE); + packet.setTitle(title); + + packet.sendPacket(player); + } + + /** + * Sends the subtitle to the player. + * + * @param subtitle text of the subtitle message + * @param players players to whom to send the subtitle + * + * @apiNote subtitle won't display until title-time is sent + */ + public void sendSubtitle(@NonNull final WrappedChatComponent subtitle, + @NonNull final Player... players) { + val packet = new WrapperPlayServerTitle(); + packet.setAction(EnumWrappers.TitleAction.SUBTITLE); + packet.setTitle(subtitle); + + for (val player : players) packet.sendPacket(player); + } + + /** + * Sends the subtitle to the players. + * + * @param subtitle text of the subtitle message + * @param players players to whom to send the subtitle + * + * @apiNote subtitle won't display until title-time is sent + */ + public void sendSubtitle(@NonNull final WrappedChatComponent subtitle, + @NonNull final Iterable players) { + val packet = new WrapperPlayServerTitle(); + packet.setAction(EnumWrappers.TitleAction.SUBTITLE); + packet.setTitle(subtitle); + + for (val player : players) packet.sendPacket(player); + } + + /** + * Sends the title-time to the players. + * + * @param fadeIn time for the title to fade in + * @param stay time for the title to stay + * @param fadeOut time for the title to fade in + * @param player player to whom to send the subtitle + * + * @apiNote subtitle won't display until title-time is sent + */ + public void sendSubtitle(final int fadeIn, final int stay, final int fadeOut, + @NonNull final Player player) { + val packet = new WrapperPlayServerTitle(); + packet.setAction(EnumWrappers.TitleAction.TIMES); + packet.setFadeIn(fadeIn); + packet.setStay(stay); + packet.setFadeOut(fadeOut); + + packet.sendPacket(player); + } + + /** + * Sends the title-time to the player. + * + * @param fadeIn time for the title to fade in + * @param stay time for the title to stay + * @param fadeOut time for the title to fade in + * @param player player to whom to send the subtitle + * + * @apiNote sending time is required to make the player see title and subtitle + * @apiNote sending time reverts the effect of clearing the title + */ + public void sendTitleTime(final int fadeIn, final int stay, final int fadeOut, + @NonNull final Player player) { + val packet = new WrapperPlayServerTitle(); + packet.setAction(EnumWrappers.TitleAction.TIMES); + packet.setFadeIn(fadeIn); + packet.setStay(stay); + packet.setFadeOut(fadeOut); + + packet.sendPacket(player); + } + + /** + * Sends the title-time to the players. + * + * @param fadeIn time for the title to fade in + * @param stay time for the title to stay + * @param fadeOut time for the title to fade in + * @param players players to whom to send the subtitle + * + * @apiNote sending time is required to make the player see title and subtitle + * @apiNote sending time reverts the effect of clearing the title + */ + public void sendTitleTime(final int fadeIn, final int stay, final int fadeOut, + @NonNull final Player... players) { + val packet = new WrapperPlayServerTitle(); + packet.setAction(EnumWrappers.TitleAction.TIMES); + packet.setFadeIn(fadeIn); + packet.setStay(stay); + packet.setFadeOut(fadeOut); + + for (val player : players) packet.sendPacket(player); + } + + /** + * Sends the title-time to the players. + * + * @param fadeIn time for the title to fade in + * @param stay time for the title to stay + * @param fadeOut time for the title to fade in + * @param players players to whom to send the subtitle + * + * @apiNote sending time is required to make the player see title and subtitle + * @apiNote sending time reverts the effect of clearing the title + */ + public void sendTitleTime(final int fadeIn, final int stay, final int fadeOut, + @NonNull final Iterable players) { + val packet = new WrapperPlayServerTitle(); + packet.setAction(EnumWrappers.TitleAction.TIMES); + packet.setFadeIn(fadeIn); + packet.setStay(stay); + packet.setFadeOut(fadeOut); + + for (val player : players) packet.sendPacket(player); + } +} From fef952352c084df6ddd0d1b14702c67df5131164 Mon Sep 17 00:00:00 2001 From: JarvisCraft Date: Sun, 5 May 2019 15:36:15 +0300 Subject: [PATCH 265/508] Remove duplicate method from TitleUtil --- .../commons/util/title/TitleUtil.java | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java index 67e1d8566..04b89e285 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java @@ -196,27 +196,6 @@ public void sendSubtitle(@NonNull final WrappedChatComponent subtitle, for (val player : players) packet.sendPacket(player); } - /** - * Sends the title-time to the players. - * - * @param fadeIn time for the title to fade in - * @param stay time for the title to stay - * @param fadeOut time for the title to fade in - * @param player player to whom to send the subtitle - * - * @apiNote subtitle won't display until title-time is sent - */ - public void sendSubtitle(final int fadeIn, final int stay, final int fadeOut, - @NonNull final Player player) { - val packet = new WrapperPlayServerTitle(); - packet.setAction(EnumWrappers.TitleAction.TIMES); - packet.setFadeIn(fadeIn); - packet.setStay(stay); - packet.setFadeOut(fadeOut); - - packet.sendPacket(player); - } - /** * Sends the title-time to the player. * From 6103eb035739d99bb02df3167fd492cd4d5b8edd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Tue, 7 May 2019 06:45:53 +0000 Subject: [PATCH 266/508] Bump lombok from 1.18.6 to 1.18.8 Bumps [lombok](https://github.com/rzwitserloot/lombok) from 1.18.6 to 1.18.8. - [Release notes](https://github.com/rzwitserloot/lombok/releases) - [Changelog](https://github.com/rzwitserloot/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/rzwitserloot/lombok/compare/v1.18.6...v1.18.8) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 66e6bad55..a3f4e1f24 100644 --- a/pom.xml +++ b/pom.xml @@ -279,7 +279,7 @@ org.projectlombok lombok - 1.18.6 + 1.18.8 true From 7c0469d179d0e24ed41a3b4dc926c6a6d7732ced Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" Date: Mon, 20 May 2019 07:22:12 +0000 Subject: [PATCH 267/508] Bump maven-source-plugin from 3.0.1 to 3.1.0 Bumps [maven-source-plugin](https://github.com/apache/maven-source-plugin) from 3.0.1 to 3.1.0. - [Release notes](https://github.com/apache/maven-source-plugin/releases) - [Commits](https://github.com/apache/maven-source-plugin/compare/maven-source-plugin-3.0.1...maven-source-plugin-3.1.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a3f4e1f24..a5fdaa921 100644 --- a/pom.xml +++ b/pom.xml @@ -173,7 +173,7 @@ org.apache.maven.plugins maven-source-plugin - 3.0.1 + 3.1.0 org.apache.maven.plugins From 21ee016032cbb97c9f025988b5df4056f963dbbf Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Thu, 30 May 2019 08:39:46 +0000 Subject: [PATCH 268/508] Bump version.mockito from 2.27.0 to 2.28.2 Bumps `version.mockito` from 2.27.0 to 2.28.2. Updates `mockito-core` from 2.27.0 to 2.28.2 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.27.0...v2.28.2) Updates `mockito-junit-jupiter` from 2.27.0 to 2.28.2 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.27.0...v2.28.2) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a5fdaa921..650f9c781 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 5.4.2 1.4.2 - 2.27.0 + 2.28.2 From 026cd48686584ecda318601cf1abec393cf7f88f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" Date: Wed, 12 Jun 2019 08:53:32 +0000 Subject: [PATCH 269/508] Bump httpclient from 4.5.8 to 4.5.9 Bumps httpclient from 4.5.8 to 4.5.9. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 650f9c781..d603ff18d 100644 --- a/pom.xml +++ b/pom.xml @@ -272,7 +272,7 @@ org.apache.httpcomponents httpclient - 4.5.8 + 4.5.9 From 2ff3d33a2b420153e832b0a0f79a4dd085d036f8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2019 06:07:42 +0000 Subject: [PATCH 270/508] Bump version.junit from 5.4.2 to 5.5.0 Bumps `version.junit` from 5.4.2 to 5.5.0. Updates `junit-jupiter-api` from 5.4.2 to 5.5.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.4.2...r5.5.0) Updates `junit-jupiter-engine` from 5.4.2 to 5.5.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.4.2...r5.5.0) Updates `junit-jupiter-params` from 5.4.2 to 5.5.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.4.2...r5.5.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d603ff18d..ef96c6b55 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 1.8 UTF-8 - 5.4.2 + 5.5.0 1.4.2 2.28.2 From 7f2eeb2e53523f6d21036c47b728822a877d73c8 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Jul 2019 06:14:01 +0000 Subject: [PATCH 271/508] Bump version.junit.platform from 1.4.2 to 1.5.0 Bumps `version.junit.platform` from 1.4.2 to 1.5.0. Updates `junit-platform-launcher` from 1.4.2 to 1.5.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.4.2 to 1.5.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ef96c6b55..5adf8ebb5 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ UTF-8 5.5.0 - 1.4.2 + 1.5.0 2.28.2 From 3c5f79445e037ebb562756fc1b48019a6bfd2b57 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 8 Jul 2019 05:37:49 +0000 Subject: [PATCH 272/508] Bump maven-javadoc-plugin from 3.1.0 to 3.1.1 Bumps [maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.1.0...maven-javadoc-plugin-3.1.1) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5adf8ebb5..a61621dde 100644 --- a/pom.xml +++ b/pom.xml @@ -178,7 +178,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.1.0 + 3.1.1 none From d7ba36efb9693cf1e17a48c73d3e2d334d25cb4b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 9 Jul 2019 05:46:31 +0000 Subject: [PATCH 273/508] Bump version.mockito from 2.28.2 to 3.0.0 Bumps `version.mockito` from 2.28.2 to 3.0.0. Updates `mockito-core` from 2.28.2 to 3.0.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.28.2...v3.0.0) Updates `mockito-junit-jupiter` from 2.28.2 to 3.0.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v2.28.2...v3.0.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a61621dde..e9db89a43 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 5.5.0 1.5.0 - 2.28.2 + 3.0.0 From b84060983c341cd7016f6233ba67db59d4b142f5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2019 05:49:10 +0000 Subject: [PATCH 274/508] Bump version.junit from 5.5.0 to 5.5.1 Bumps `version.junit` from 5.5.0 to 5.5.1. Updates `junit-jupiter-api` from 5.5.0 to 5.5.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.5.0...r5.5.1) Updates `junit-jupiter-engine` from 5.5.0 to 5.5.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.5.0...r5.5.1) Updates `junit-jupiter-params` from 5.5.0 to 5.5.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.5.0...r5.5.1) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e9db89a43..d1c77507e 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 1.8 UTF-8 - 5.5.0 + 5.5.1 1.5.0 3.0.0 From a7f593645595951bda8db60eb3d126cc2b67b642 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2019 05:55:51 +0000 Subject: [PATCH 275/508] Bump version.junit.platform from 1.5.0 to 1.5.1 Bumps `version.junit.platform` from 1.5.0 to 1.5.1. Updates `junit-platform-launcher` from 1.5.0 to 1.5.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.5.0 to 1.5.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d1c77507e..0ceccb9d5 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ UTF-8 5.5.1 - 1.5.0 + 1.5.1 3.0.0 From 6bf1a2c2183b98eed217b48f28ef5877414e899b Mon Sep 17 00:00:00 2001 From: PROgrammer_JARvis Date: Mon, 29 Jul 2019 23:07:23 +0300 Subject: [PATCH 276/508] Replace local APIs with those os padla --- ez-config/pom.xml | 2 +- fake-entity-lib/pom.xml | 2 +- .../entity/management/FakeEntityManager.java | 2 +- minecraft-commons/pom.xml | 6 +- .../commons/mapimage/DefaultMapImage.java | 7 +- .../mapimage/display/PlayerMapManager.java | 51 +-- .../display/ProtocolBasedMapImageDisplay.java | 2 +- .../commons/mojang/MojangApiManager.java | 15 +- .../minecraft/commons/nms/LegacySupport.java | 2 +- .../minecraft/commons/nms/NmsUtil.java | 56 +++- .../misc/PacketWrapperPacketAssociations.java | 8 +- .../nms/protocol/misc/PacketWrapperUtil.java | 16 +- .../minecraft/commons/player/PlayerUtil.java | 2 +- .../plugin/BukkitPluginShutdownUtil.java | 2 +- .../minecraft/commons/util/MapUtil.java | 316 ------------------ .../minecraft/commons/util/ObjectUtil.java | 244 -------------- .../minecraft/commons/util/RandomUtil.java | 99 ------ .../minecraft/commons/util/UuidUtil.java | 48 --- .../LazyIteratorToCollectionWrapper.java | 251 -------------- .../ConcurrentCollectionWrapper.java | 202 ----------- .../concurrent/ConcurrentCollections.java | 45 --- .../concurrent/ConcurrentDequeWrapper.java | 235 ------------- .../concurrent/ConcurrentListWrapper.java | 155 --------- .../util/concurrent/ConcurrentMapWrapper.java | 256 -------------- .../concurrent/ConcurrentQueueWrapper.java | 63 ---- .../ConcurrentSetFromMapWrapper.java | 207 ------------ .../util/concurrent/ConcurrentSetWrapper.java | 13 - .../util/concurrent/ConcurrentWrapper.java | 63 ---- .../commons/util/function/lazy/Lazies.java | 170 ---------- .../commons/util/function/lazy/Lazy.java | 33 -- .../commons/nms/PacketWrapperUtilTest.java | 12 +- .../minecraft/commons/util/MapUtilTest.java | 224 ------------- .../commons/util/ObjectUtilTest.java | 123 ------- .../commons/util/RandomUtilTest.java | 75 ----- .../minecraft/commons/util/UuidUtilTest.java | 52 --- .../util/function/lazy/LaziesTest.java | 103 ------ .../util/primitive/IntWrapperTest.java | 2 +- pom.xml | 16 +- 38 files changed, 126 insertions(+), 3054 deletions(-) delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtil.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtil.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollections.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentDequeWrapper.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentListWrapper.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentMapWrapper.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentQueueWrapper.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetFromMapWrapper.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetWrapper.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentWrapper.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java delete mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java delete mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtilTest.java delete mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java delete mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtilTest.java delete mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java diff --git a/ez-config/pom.xml b/ez-config/pom.xml index 32d904e7b..8dbde3ac1 100644 --- a/ez-config/pom.xml +++ b/ez-config/pom.xml @@ -28,7 +28,7 @@ minecraft-commons - ru.progrm-jarvis.reflector + ru.progrm-jarvis reflector diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index fc9364f58..fcf4902d7 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -39,7 +39,7 @@ PacketWrapper - ru.progrm-jarvis.reflector + ru.progrm-jarvis reflector diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index bbfc693a9..eb952b3be 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -2,8 +2,8 @@ import lombok.NonNull; import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.javacommons.collection.concurrent.ConcurrentCollections; import ru.progrm_jarvis.minecraft.commons.annotation.DontOverrideEqualsAndHashCode; -import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginContainer; import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.FakeEntity; diff --git a/minecraft-commons/pom.xml b/minecraft-commons/pom.xml index 77ed869ad..eca324ebb 100644 --- a/minecraft-commons/pom.xml +++ b/minecraft-commons/pom.xml @@ -31,7 +31,11 @@ - ru.progrm-jarvis.reflector + ru.progrm-jarvis + java-commons + + + ru.progrm-jarvis reflector diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index d6088c351..9b47b2778 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -2,9 +2,8 @@ import lombok.*; import lombok.experimental.FieldDefaults; +import ru.progrm_jarvis.javacommons.lazy.Lazy; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; -import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazies; -import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazy; import ru.progrm_jarvis.minecraft.commons.util.hack.PreSuperCheck; import java.awt.image.BufferedImage; @@ -36,12 +35,12 @@ public class DefaultMapImage implements MapImage { /** * Lazily initialized non-buffered drawer */ - Lazy drawer = Lazies.lazy(Drawer::new); + Lazy drawer = Lazy.create(Drawer::new); /** * Lazily initialized buffered drawer */ - Lazy bufferedDrawer = Lazies.lazy(BufferedDrawer::new); + Lazy bufferedDrawer = Lazy.create(BufferedDrawer::new); /** * All subscribers active. diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java index 54efd34af..d9d9b66d5 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java @@ -3,6 +3,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; import lombok.NonNull; +import lombok.SneakyThrows; import lombok.Synchronized; import lombok.experimental.UtilityClass; import lombok.val; @@ -11,11 +12,12 @@ import org.bukkit.map.MapView; import ru.progrm_jarvis.minecraft.commons.MinecraftCommons; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; -import ru.progrm_jarvis.reflector.wrapper.MethodWrapper; -import ru.progrm_jarvis.reflector.wrapper.fast.FastMethodWrapper; +import ru.progrm_jarvis.reflector.invoke.InvokeUtil; import java.io.File; import java.io.IOException; +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Method; import java.nio.file.Files; import java.nio.file.StandardOpenOption; import java.util.HashSet; @@ -25,8 +27,6 @@ import java.util.function.Function; import java.util.stream.Collectors; -import static ru.progrm_jarvis.reflector.Reflector.getDeclaredMethod; - /** * Utility responsible to allocate minimal amount of {@link MapView} for internal usage. *

@@ -49,32 +49,40 @@ public class PlayerMapManager { private final boolean USE_INT_IDS; /** - * Method wrapper for {@link MapView#getId()} because it returns + * Method handle for {@link MapView#getId()} because it returns * {@link short} and {@link int} on different Bukkit API versions. */ - private final MethodWrapper MAP_VIEW__GET_ID__METHOD; - + private final MethodHandle MAP_VIEW__GET_ID__METHOD, /** - * Method wrapper for {@link Bukkit#getMap(int)} because it consumes + * Method handle for {@link Bukkit#getMap(int)} because it consumes * {@link short} and {@link int} on different Bukkit API versions. */ - @SuppressWarnings("deprecation") - private final MethodWrapper BUKKIT__GET_MAP__METHOD; + BUKKIT__GET_MAP__METHOD; static { { - val method = getDeclaredMethod(MapView.class, "getId"); + final Method method; + try { + method = MapView.class.getDeclaredMethod("getId"); + } catch (final NoSuchMethodException e) { + throw new IllegalStateException("Cannot find method " + MapView.class.getCanonicalName() + "#getId()"); + } val returnType = method.getReturnType(); if (returnType == int.class) USE_INT_IDS = true; else if (returnType == short.class) USE_INT_IDS = false; else throw new IllegalStateException( "Unknown return type of MapView#getId() method (" + returnType + ")" ); - MAP_VIEW__GET_ID__METHOD = FastMethodWrapper.from(method); + MAP_VIEW__GET_ID__METHOD = InvokeUtil.toMethodHandle(method); + } + try { + BUKKIT__GET_MAP__METHOD = InvokeUtil.toMethodHandle( + Bukkit.class.getDeclaredMethod("getMap", USE_INT_IDS ? int.class : short.class) + ); + } catch (final NoSuchMethodException e) { + throw new IllegalStateException("Cannot find method " + Bukkit.class.getCanonicalName() + + "#getMap(" + (USE_INT_IDS ? "int" : "short") + ")"); } - BUKKIT__GET_MAP__METHOD = FastMethodWrapper.from( - getDeclaredMethod(Bukkit.class, "getMap", USE_INT_IDS ? int.class : short.class) - ); } /** @@ -154,8 +162,10 @@ else throw new IllegalStateException( * @param mapView {@link MapView} whose {@link MapView#getId()} to invoke * @return map view's ID */ + @SneakyThrows public int getMapId(@NonNull final MapView mapView) { - return MAP_VIEW__GET_ID__METHOD.invoke(mapView).intValue(); + if (USE_INT_IDS) return (int) MAP_VIEW__GET_ID__METHOD.invokeExact(mapView); + return (int) (short) MAP_VIEW__GET_ID__METHOD.invokeExact(mapView); } /** @@ -164,10 +174,13 @@ public int getMapId(@NonNull final MapView mapView) { * @param mapId id of the map to get * @return a map view if it exists, or null otherwise */ + @SneakyThrows public MapView getMap(final int mapId) { - return USE_INT_IDS - ? BUKKIT__GET_MAP__METHOD.invokeStatic(mapId) - : BUKKIT__GET_MAP__METHOD.invokeStatic((short) mapId); + return (MapView) ( + USE_INT_IDS + ? BUKKIT__GET_MAP__METHOD.invokeExact(mapId) + : BUKKIT__GET_MAP__METHOD.invokeExact((short) mapId) + ); } /** diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index 4b62acb28..165153696 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -10,7 +10,7 @@ import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistries; import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistry; import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistryRegistration; -import ru.progrm_jarvis.minecraft.commons.util.MapUtil; +import ru.progrm_jarvis.javacommons.map.MapUtil; import javax.annotation.Nonnull; import java.util.Collection; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java index a192f5762..1906f3d56 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java @@ -14,13 +14,12 @@ import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import ru.progrm_jarvis.javacommons.lazy.Lazy; import ru.progrm_jarvis.minecraft.commons.annotation.AsyncExpected; import ru.progrm_jarvis.minecraft.commons.async.AsyncRunner; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedSupplier; -import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazies; -import ru.progrm_jarvis.minecraft.commons.util.function.lazy.Lazy; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -58,21 +57,21 @@ public class MojangApiManager implements AutoCloseable { Lazy> profilesCache; public MojangApiManager(final Configuration configuration) { - httpConnectionManager = Lazies.concurrentLazy(configuration.httpConnectionManager); + httpConnectionManager = Lazy.createThreadSafe(configuration.httpConnectionManager); { val httpClientFunction = configuration.httpClient; - this.httpClient = Lazies.concurrentLazy(() -> httpClientFunction.apply(httpConnectionManager.get())); + this.httpClient = Lazy.createThreadSafe(() -> httpClientFunction.apply(httpConnectionManager.get())); } - asyncRunner = Lazies.concurrentLazy(configuration.asyncRunner); + asyncRunner = Lazy.createThreadSafe(configuration.asyncRunner); - uuidsCache = Lazies.concurrentLazy(configuration.uuidsCache); - profilesCache = Lazies.concurrentLazy(configuration.profilesCache); + uuidsCache = Lazy.createThreadSafe(configuration.uuidsCache); + profilesCache = Lazy.createThreadSafe(configuration.profilesCache); } @Override public void close() { - httpConnectionManager.getIfInitialized().ifPresent(HttpClientConnectionManager::shutdown); + if (httpConnectionManager.isInitialized()) httpConnectionManager.get().shutdown(); } /////////////////////////////////////////////////////////////////////////// diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java index 928161ba2..2d25ca361 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java @@ -11,7 +11,7 @@ import org.bukkit.block.Block; import org.bukkit.entity.FallingBlock; import org.bukkit.material.MaterialData; -import ru.progrm_jarvis.minecraft.commons.util.MapUtil; +import ru.progrm_jarvis.javacommons.map.MapUtil; import java.util.HashMap; import java.util.Map; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java index 0f210034f..88cc0810e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java @@ -1,20 +1,16 @@ package ru.progrm_jarvis.minecraft.commons.nms; import com.comphenix.protocol.wrappers.WrappedDataWatcher; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.Value; +import lombok.*; import lombok.experimental.UtilityClass; -import lombok.val; import org.bukkit.Bukkit; import ru.progrm_jarvis.minecraft.commons.nms.metadata.DataWatcherFactory; -import ru.progrm_jarvis.minecraft.commons.nms.metadata.StandardDataWatcherFactory; import ru.progrm_jarvis.minecraft.commons.nms.metadata.LegacyDataWatcherFactory; -import ru.progrm_jarvis.reflector.wrapper.FieldWrapper; -import ru.progrm_jarvis.reflector.wrapper.fast.FastFieldWrapper; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.StandardDataWatcherFactory; +import ru.progrm_jarvis.reflector.invoke.InvokeUtil; -import static ru.progrm_jarvis.reflector.Reflector.classForName; -import static ru.progrm_jarvis.reflector.Reflector.getDeclaredField; +import java.lang.invoke.MethodHandle; +import java.lang.reflect.Field; /** * Utility for NMS-related features @@ -33,11 +29,36 @@ public class NmsUtil { CRAFT_BUKKIT_PACKAGE = "org.bukkit.craftbukkit." + NMS_VERSION.name; /** - * Field of {nms}.Entity class field responsible for entity int-UID generation. + * Field access method-handle of {nms}.Entity class field responsible for entity int-UID generation. */ - private final FieldWrapper ENTITY_COUNT_FIELD = FastFieldWrapper.from(getDeclaredField( - classForName(getNmsPackage().concat(".Entity")), "entityCount" - )); + private final MethodHandle ENTITY_COUNT_FIELD__GETTER, ENTITY_COUNT_FIELD__SETTER; + + private final Object ENTITY_COUNT_FIELD_MUTEX = new Object[0]; + + static { + final Class nmsEntityClass; + try { + nmsEntityClass = Class.forName(getNmsPackage().concat(".Entity")); + } catch (final ClassNotFoundException e) { + throw new IllegalStateException("Cannot find NMS-entity class", e); + } + final Field entityCountField; + try { + entityCountField = nmsEntityClass.getDeclaredField("entityCount"); + } catch (NoSuchFieldException e) { + throw new IllegalStateException( + "Cannot find field " + nmsEntityClass.getCanonicalName() + "#entityCount", e + ); + } + val accessible = entityCountField.isAccessible(); + entityCountField.setAccessible(true); + try { + ENTITY_COUNT_FIELD__GETTER = InvokeUtil.toGetterMethodHandle(entityCountField); + ENTITY_COUNT_FIELD__SETTER = InvokeUtil.toSetterMethodHandle(entityCountField); + } finally { + entityCountField.setAccessible(accessible); + } + } /** * DataWatcher factory valid for current server version @@ -105,10 +126,13 @@ public DataWatcherFactory.DataWatcherModifier dataWatcherModifier(@NonNull final * * @return new ID for an entity */ + @SneakyThrows + @Synchronized("ENTITY_COUNT_FIELD_MUTEX") public int nextEntityId() { - synchronized (ENTITY_COUNT_FIELD) { - return ENTITY_COUNT_FIELD.getAndCompute(id -> id + 1); - } + val id = (int) ENTITY_COUNT_FIELD__GETTER.invokeExact(); + ENTITY_COUNT_FIELD__SETTER.invokeExact(id + 1); + + return id; } /** diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java index 915e479a2..2f0b8032e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java @@ -9,9 +9,9 @@ import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import ru.progrm_jarvis.minecraft.commons.util.MapUtil; +import ru.progrm_jarvis.javacommons.map.MapUtil; +import ru.progrm_jarvis.javacommons.pair.Pair; +import ru.progrm_jarvis.javacommons.pair.SimplePair; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; @@ -64,7 +64,7 @@ private Stream> fieldPacketTypes(@NonNull final C return Arrays.stream(packetType.getDeclaredFields()) .filter(field -> PacketType.class.isAssignableFrom(field.getType())) //.filter(field -> field.isAnnotationPresent(Deprecated.class)) - .map((UncheckedFunction>) field -> ImmutablePair.of( + .map((UncheckedFunction>) field -> SimplePair.of( (PacketType) field.get(null), PacketTypeId.of(group, direction, upperCaseNameToUpperCamelCase(field.getName())) )); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java index 9c1da150d..89e91fa5a 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java @@ -10,9 +10,9 @@ import lombok.experimental.UtilityClass; import lombok.val; import org.jetbrains.annotations.Nullable; -import ru.progrm_jarvis.reflector.wrapper.FieldWrapper; -import ru.progrm_jarvis.reflector.wrapper.MethodWrapper; -import ru.progrm_jarvis.reflector.wrapper.fast.FastMethodWrapper; +import ru.progrm_jarvis.reflector.wrapper.DynamicFieldWrapper; +import ru.progrm_jarvis.reflector.wrapper.DynamicMethodWrapper; +import ru.progrm_jarvis.reflector.wrapper.invoke.InvokeDynamicMethodWrapper; import java.lang.reflect.Method; import java.util.Arrays; @@ -27,13 +27,15 @@ public class PacketWrapperUtil { METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME = PacketWrapperUtil.class.getCanonicalName().concat(".METHODS_CACHE_CONCURRENCY_LEVEL"); - private final Cache, Map>> FIELDS_CACHE = CacheBuilder.newBuilder() + private final Cache, Map>> FIELDS_CACHE + = CacheBuilder.newBuilder() .concurrencyLevel(Integer.parseInt(MoreObjects.firstNonNull( System.getProperty(FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME), "2") )) .build(); - private final Cache, Map>> METHODS_CACHE = CacheBuilder.newBuilder() + private final Cache, Map>> METHODS_CACHE + = CacheBuilder.newBuilder() .concurrencyLevel(Integer.parseInt(MoreObjects.firstNonNull( System.getProperty(METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME), "2") )) @@ -43,7 +45,7 @@ public class PacketWrapperUtil { public String toString(@Nullable final AbstractPacket packet) { if (packet == null) return "null"; - final Map> methods; + final Map> methods; final String className; { val clazz = packet.getClass(); @@ -51,7 +53,7 @@ public String toString(@Nullable final AbstractPacket packet) { .filter(method -> method.getName().startsWith("get")) .collect(Collectors.toMap( method -> getterNameToString(method.getName()), - (Function>) FastMethodWrapper::from + (Function>) InvokeDynamicMethodWrapper::from ))); className = clazz.getName(); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java index 2e98d2a14..789592228 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java @@ -11,7 +11,7 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import ru.progrm_jarvis.minecraft.commons.util.ObjectUtil; +import ru.progrm_jarvis.javacommons.object.ObjectUtil; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; import java.util.Collection; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java index 59fb4d2b7..10db33347 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -11,7 +11,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.server.PluginDisableEvent; import org.bukkit.plugin.Plugin; -import ru.progrm_jarvis.minecraft.commons.util.concurrent.ConcurrentCollections; +import ru.progrm_jarvis.javacommons.collection.concurrent.ConcurrentCollections; import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import java.util.*; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java deleted file mode 100644 index af90f5d82..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/MapUtil.java +++ /dev/null @@ -1,316 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util; - -import com.google.common.base.Preconditions; -import lombok.*; -import lombok.experimental.Accessors; -import lombok.experimental.UtilityClass; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.Iterator; -import java.util.Map; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Stream; - -/** - * Utilities related to {@link Map>}. - */ -@UtilityClass -public class MapUtil { - - /** - * Fills the map specified with the values specified. - * - * @param map map to fill with the values - * @param keyValuePairs pairs of keys and values in order key1, value1, key2, value2, key3, value3... - * @param map type - * @return the map passed filled with key-value pairs specified - * @throws IllegalArgumentException if {@code keyValuePairs}'s length is odd - * - * @see #fillMap(Map, Object, Object, Object...) - */ - public > M fillMap(@NonNull final M map, @NonNull final Object... keyValuePairs) { - val length = keyValuePairs.length; - if (length == 0) return map; - Preconditions.checkArgument(length % 2 == 0, "Key-Value pairs array should have an even number of elements"); - - fillMapNoChecks(map, keyValuePairs); - - return map; - } - - /** - * Fills the map specified with the values specified. - * - * @param map map to fill with the values - * @param firstValueKey the key of first value - * @param firstValue first value to be put to the map - * @param keyValuePairs pairs of keys and values in order key1, value1, key2, value2, key3, value3... - * @param type of keys - * @param type of values - * @param map type - * @return the map passed filled with key-value pairs specified - * @throws IllegalArgumentException if {@code keyValuePairs}'s length is odd - * - * @see #fillMap(Map, Object...) - */ - public > M fillMap(@NonNull final M map, final K firstValueKey, final V firstValue, - @NonNull final Object... keyValuePairs) { - val length = keyValuePairs.length; - Preconditions.checkArgument(length % 2 == 0, "Key-Value pairs array should have an even number of elements"); - - map.put(firstValueKey, firstValue); - fillMapNoChecks(map, keyValuePairs); - - return map; - } - - /** - * Fills the map not performing any checks. - * - * @param map map to fill - * @param keyValuePairs key-value pairs to put to the map ordered as key1, value1, key2, value2... - */ - @SuppressWarnings("unchecked") - private void fillMapNoChecks(final Map map, final Object... keyValuePairs) { - var value = true; // will get reverted for the first value - - Object key = null; // requires to be initialized for some reason :) - for (final Object keyValuePair : keyValuePairs) if (value = !value) map.put(key, keyValuePair); - else key = keyValuePair; - } - - /** - * Fills the map specified with the values specified. - * - * @param map map to fill with the values - * @param entries entries to fill the map with - * @param type of keys - * @param type of values - * @param map type - * @return the map passed filled with key-value pairs specified - */ - @SafeVarargs - public > M fillMap(@NonNull final M map, final Pair... entries) { - for (val entry : entries) map.put(entry.getKey(), entry.getValue()); - - return map; - } - - /** - * Fills the map specified with the values specified. - * - * @param map map to fill with the values - * @param entries entries to fill the map with - * @param type of keys - * @param type of values - * @param map type - * @return the map passed filled with key-value pairs specified - */ - public > M fillMap(@NonNull final M map, final Iterator> entries) { - while (entries.hasNext()) { - val entry = entries.next(); - map.put(entry.getKey(), entry.getValue()); - } - - return map; - } - - /** - * Fills the map specified with the values specified. - * - * @param map map to fill with the values - * @param entries entries to fill the map with - * @param type of keys - * @param type of values - * @param map type - * @return the map passed filled with key-value pairs specified - */ - public > M fillMap(@NonNull final M map, final Iterable> entries) { - return fillMap(map, entries.iterator()); - } - - /** - * Fills the map specified with the values specified. - * - * @param map map to fill with the values - * @param entries entries to fill the map with - * @param type of keys - * @param type of values - * @param map type - * @return the map passed filled with key-value pairs specified - */ - public > M fillMap(@NonNull final M map, final Stream> entries) { - entries.forEach(entry -> map.put(entry.getKey(), entry.getValue())); - - return map; - } - - /** - * Fills the map specified with the values specified keeping order. - * - * @param map map to fill with the values - * @param entries entries to fill the map with - * @param type of keys - * @param type of values - * @param map type - * @return the map passed filled with key-value pairs specified - */ - public > M fillMapOrdered(@NonNull final M map, final Stream> entries) { - entries.forEachOrdered(entry -> map.put(entry.getKey(), entry.getValue())); - - return map; - } - - /** - * Creates new {@link MapFiller} from the map specified. - * - * @param map map for which to create the filler - * @param type of keys - * @param type of values - * @return map filler created for the specified map - * - * @see MapFiller - * @see #mapFiller(Map, Object, Object) - */ - public MapFiller mapFiller(@NonNull final Map map) { - return new MapFiller<>(map); - } - - /** - * Creates new {@link MapFiller} from the map specified initialized with the value specified. - * - * @param map map for which to create the filler - * @param firstValueKey the key of first value - * @param firstValue first value to be put to the map - * @param type of keys - * @param type of values - * @return map filler created for the specified map with initial value put - * - * @see MapFiller - * @see #mapFiller(Map) - */ - public MapFiller mapFiller(@NonNull final Map map, K firstValueKey, final V firstValue) { - return new MapFiller<>(map) - .put(firstValueKey, firstValue); - } - - public V getOrDefault(@NonNull final Map map, final K key, final Supplier defaultValueSupplier) { - // the value is got from map, non-null value is surely a present one, but null may have different meanings - val value = map.get(key); - return value == null ? map.containsKey(key) ? null : defaultValueSupplier.get() : value; - } - - public R getOrDefault(@NonNull final Map map, final K key, final Function valueTransformer, - final R defaultValue) { - // the value is got from map, non-null value is surely a present one, but null may have different meanings - val value = map.get(key); - return value == null - ? map.containsKey(key) ? valueTransformer.apply(null) : defaultValue - : valueTransformer.apply(value); - } - - public R getOrDefault(@NonNull final Map map, final K key, final Function valueTransformer, - final Supplier defaultValueSupplier) { - // the value is got from map, non-null value is surely a present one, but null may have different meanings - val value = map.get(key); - return value == null - ? map.containsKey(key) ? valueTransformer.apply(null) : defaultValueSupplier.get() - : valueTransformer.apply(value); - } - - /** - * An utility-object to fill the map following the chain pattern which may useful when initializing class fields. - * - * @param type of map's key - * @param type of map's value - */ - @ToString - @EqualsAndHashCode - @RequiredArgsConstructor - @Accessors(fluent = true) - public static final class MapFiller { - - /** - * Map being filled - */ - @NonNull @Getter private final Map map; - - /** - * Puts the specified value by the specified key to the map. - * - * @param key key of the value to put - * @param value value to put by the key - * @return this map filler for chaining - */ - public final MapFiller put(final K key, final V value) { - map.put(key, value); - - return this; - } - - /** - * Fills the map with the values of specified array. - * - * @param entries entries which will be put to the map - * @return this map filler for chaining - */ - @SafeVarargs - public final MapFiller fill(final Pair... entries) { - for (val entry : entries) map.put(entry.getKey(), entry.getValue()); - - return this; - } - - /** - * Fills the map based on the specified {@link Iterator}. - * - * @param entries iterator of the entries whose elements will be put to the map - * @return this map filler for chaining - */ - public final MapFiller fill(final Iterator> entries) { - while (entries.hasNext()) { - val entry = entries.next(); - map.put(entry.getKey(), entry.getValue()); - } - - return this; - } - - /** - * Fills the map with the values of specified {@link Iterable}. - * - * @param entries entries which will be put to the map - * @return this map filler for chaining - */ - public final MapFiller fill(final Iterable> entries) { - for (val entry : entries) map.put(entry.getKey(), entry.getValue()); - - return this; - } - - /** - * Fills the map based on the specified {@link Stream}. - * - * @param entries stream of the entries whose elements will be put to the map - * @return this map filler for chaining - */ - public final MapFiller fill(final Stream> entries) { - entries.forEach(entry -> map.put(entry.getKey(), entry.getValue())); - - return this; - } - - /** - * Fills the map based on the specified {@link Stream} keeping order. - * - * @param entries stream of the entries whose elements will be put to the map - * @return this map filler for chaining - */ - public final MapFiller fillOrdered(final Stream> entries) { - entries.forEachOrdered(entry -> map.put(entry.getKey(), entry.getValue())); - - return this; - } - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtil.java deleted file mode 100644 index 606c4c5d0..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtil.java +++ /dev/null @@ -1,244 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util; - -import lombok.NonNull; -import lombok.experimental.UtilityClass; -import lombok.val; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedSupplier; - -import java.util.Optional; - -/** - * Utilities for common object operations. - */ -@UtilityClass -public class ObjectUtil { - - /** - * Returns the first nonnull value of specified variants or {@code null} if none found. - * - * @param variants variants which may be nonnull - * @param type of value - * @return first nonnull value found or {@code null} if none - */ - @SafeVarargs - public T nonNull(final T... variants) { - for (val variant : variants) if (variant != null) return variant; - - return null; - } - - /** - * Returns the first nonnull value of specified variants or {@code null} if none found. - * - * @param variants variant suppliers whose values may be null - * @param type of value - * @return first nonnull value found or {@code null} if none - */ - @SafeVarargs - public T nonNull(final UncheckedSupplier... variants) { - for (val variant : variants) { - val value = variant.get(); - if (value != null) return value; - } - - return null; - } - - /** - * Returns the first nonnull value of specified variants wrapped in {@link Optional} or empty if none found. - * - * @param variants variants which may be nonnull - * @param type of value - * @return {@link Optional} containing first nonnull value found or empty if none - */ - @SafeVarargs - public Optional optionalNonNull(final T... variants) { - for (val variant : variants) if (variant != null) return Optional.of(variant); - - return Optional.empty(); - } - - /** - * Returns the first nonnull value of specified variants wrapped in {@link Optional} or empty if none found. - * - * @param variants variant suppliers whose values may be null - * @param type of value - * @return {@link Optional} containing first nonnull value found or empty if none - */ - @SafeVarargs - public Optional optionalNonNull(final UncheckedSupplier... variants) { - for (val variant : variants) { - val value = variant.get(); - if (value != null) return Optional.of(value); - } - - return Optional.empty(); - } - - /** - * Returns the first nonnull value of specified variants or throws {@link NullPointerException} if none found. - * - * @param variants variants which may be nonnull - * @param type of value - * @return first nonnull value found - * @throws NullPointerException if none of the variants specified is nonnull - */ - @SafeVarargs - public T nonNullOrThrow(final T... variants) throws NullPointerException { - for (val variant : variants) if (variant != null) return variant; - - throw new NullPointerException("No nonnull value found among variants"); - } - - /** - * Returns the first nonnull value of specified variants or throws {@link NullPointerException} if none found. - * - * @param variants variant suppliers whose values may be null - * @param type of value - * @return first nonnull value found - * @throws NullPointerException if none of the variants specified is nonnull - */ - @SafeVarargs - public T nonNullOrThrow(final UncheckedSupplier... variants) throws NullPointerException { - for (val variant : variants) { - val value = variant.get(); - if (value != null) return value; - } - - throw new NullPointerException("No nonnull value found among variants"); - } - - /** - * Maps (transforms) the value specified using the mapping function. - * This may come in handy in case of initializing fields with expressions which have checked exceptions. - * - * @param value value to map - * @param mappingFunction function to map the value to the required type - * @param type of source value - * @param type of resulting value - * @return mapped (transformed) value - */ - public R map(final T value, @NonNull final UncheckedFunction mappingFunction) { - return mappingFunction.apply(value); - } - - /** - * Returns the first nonnull value of specified variants or {@code null} if none found - * mapped using function specified. - * - * @param mappingFunction function to map the value to the required type - * @param variants variants which may be nonnull - * @param type of source value - * @param type of resulting value - * @return first nonnull value found or {@code null} if none found mapped using mapping function - */ - @SafeVarargs - public R mapNonNull(@NonNull final UncheckedFunction mappingFunction, - final T... variants) { - for (val variant : variants) if (variant != null) return mappingFunction.apply(variant); - - return mappingFunction.apply(null); - } - - /** - * Returns the first nonnull value of specified variants or {@code null} if none found - * mapped using function specified. - * - * @param mappingFunction function to map the value to the required type - * @param variants variant suppliers whose values may be null - * @param type of source value - * @param type of resulting value - * @return first nonnull value found or {@code null} if none found mapped using mapping function - */ - @SafeVarargs - public R mapNonNull(@NonNull final UncheckedFunction mappingFunction, - final UncheckedSupplier... variants) { - for (val variant : variants) { - val value = variant.get(); - if (value != null) return mappingFunction.apply(value); - } - - return mappingFunction.apply(null); - } - - /** - * Returns the first nonnull value of specified variants mapped using function specified - * or {@code null} if none found. - * - * @param mappingFunction function to map the value to the required type - * @param variants variants which may be nonnull - * @param type of source value - * @param type of resulting value - * @return first nonnull value found mapped using mapping function or {@code null} if none found - */ - @SafeVarargs - public R mapOnlyNonNull(@NonNull final UncheckedFunction mappingFunction, - final T... variants) { - for (val variant : variants) if (variant != null) return mappingFunction.apply(variant); - - return null; - } - - /** - * Returns the first nonnull value of specified variants mapped using function specified - * or {@code null} if none found. - * - * @param mappingFunction function to map the value to the required type - * @param variants variant suppliers whose values may be null - * @param type of source value - * @param type of resulting value - * @return first nonnull value found mapped using mapping function or {@code null} if none found - */ - @SafeVarargs - public R mapOnlyNonNull(@NonNull final UncheckedFunction mappingFunction, - final UncheckedSupplier... variants) { - for (val variant : variants) { - val value = variant.get(); - if (value != null) return mappingFunction.apply(value); - } - - return null; - } - - /** - * Returns the first nonnull value of specified variants mapped using function specified - * or throws {@link NullPointerException} if none found. - * - * @param mappingFunction function to map the value to the required type - * @param variants variants which may be nonnull - * @param type of source value - * @param type of resulting value - * @return first nonnull value found mapped using mapping function - * @throws NullPointerException if none of the variants specified is nonnull - */ - @SafeVarargs - public R mapNonNullOrThrow(@NonNull final UncheckedFunction mappingFunction, - final T... variants) throws NullPointerException { - for (val variant : variants) if (variant != null) return mappingFunction.apply(variant); - - throw new NullPointerException("No nonnull value found among variants"); - } - - /** - * Returns the first nonnull value of specified variants mapped using function specified - * or throws {@link NullPointerException} if none found. - * - * @param mappingFunction function to map the value to the required type - * @param variants variant suppliers whose values may be null - * @param type of source value - * @param type of resulting value - * @return first nonnull value found mapped using mapping function - * @throws NullPointerException if none of the variants specified is nonnull - */ - @SafeVarargs - public R mapNonNullOrThrow(@NonNull final UncheckedFunction mappingFunction, - final UncheckedSupplier... variants) throws NullPointerException { - for (val variant : variants) { - val value = variant.get(); - if (value != null) return mappingFunction.apply(value); - } - - throw new NullPointerException("No nonnull value found among variants"); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java deleted file mode 100644 index 83b8cf304..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtil.java +++ /dev/null @@ -1,99 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util; - -import com.google.common.base.Preconditions; -import lombok.NonNull; -import lombok.experimental.UtilityClass; -import lombok.val; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; - -/** - * Utility for getting random values. - */ -@UtilityClass -public class RandomUtil { - - /** - * Provides {@code 1} or {@code -1} randomly. - * - * @return {@code 1} or {@code -1} - */ - public int randomSign() { - return ThreadLocalRandom.current().nextBoolean() ? 1 : -1; - } - - /** - * Gets a random value from the map specified considering chances. - * - * @param chancedValues values from which to get a random one - * the keys of the map are the actual values, the values of the map are the chances - * @param type of value randomly got - * @return got random value - * - * @throws IllegalArgumentException if {@code values is empty} - */ - public T getRandom(@NonNull final Map chancedValues) { - { - val size = chancedValues.size(); - - Preconditions.checkArgument(size > 0, "There should be at least one chanced value"); - if (size == 1) return chancedValues.keySet().iterator().next(); - } - - long chancesSum = 0; // sum of all chances - for (val chance : chancedValues.values()) { - Preconditions.checkArgument(chance > 0, "Chances should all be positive"); - chancesSum += chance; - } - // the chance should be up to chancesSum (exclusive) - val chance = ThreadLocalRandom.current().nextLong(chancesSum); - for (val entry : chancedValues.entrySet()) if ((chancesSum -= entry.getValue()) <= chance) return - entry.getKey(); - - throw new IllegalStateException("Could not get any chanced value"); - } - - /** - * Gets a random value from the list specified. - * - * @param values values from which to get a random one - * @param type of value randomly got - * @return got random value - * - * @throws IllegalArgumentException if {@code values is empty} - */ - public T getRandom(@NonNull final List values) { - val size = values.size(); - Preconditions.checkArgument(size > 0, "There should be at least one chanced value"); - if (size == 1) return values.get(0); - - return values.get(ThreadLocalRandom.current().nextInt(size)); - } - - /** - * Gets a random value from the collection specified. - * - * @param values values from which to get a random one - * @param type of value randomly got - * @return got random value - * - * @throws IllegalArgumentException if {@code values is empty} - */ - public T getRandom(@NonNull final Collection values) { - int index; - { - val size = values.size(); - Preconditions.checkArgument(size > 0, "There should be at least one chanced value"); - if (size == 1) return values.iterator().next(); - - index = ThreadLocalRandom.current().nextInt(size); - } - - for (val value : values) if (index-- == 0) return value; - - throw new IllegalStateException("Could not get any value"); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtil.java deleted file mode 100644 index 4f61cc52e..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtil.java +++ /dev/null @@ -1,48 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util; - -import lombok.NonNull; -import lombok.experimental.UtilityClass; -import lombok.val; - -import java.nio.ByteBuffer; -import java.util.UUID; - -import static com.google.common.base.Preconditions.checkArgument; - -/** - * Utility for {@link UUID}-related functionality. - */ -@UtilityClass -public class UuidUtil { - - /** - * Converts {@link UUID} into an array of 16 {@link byte}s. - * - * @param uuid UUID to convert - * @return result of conversion as array of 16 bytes - * - * @see #uuidFromBytes(byte[]) for backward conversion - */ - public byte[] uuidToBytes(@NonNull final UUID uuid) { - val buffer = ByteBuffer.wrap(new byte[16]); - buffer.putLong(uuid.getMostSignificantBits()); - buffer.putLong(uuid.getLeastSignificantBits()); - - return buffer.array(); - } - - /** - * Converts a 16-{@link byte}s array into a {@link UUID}. - * - * @param bytes array of 16 bytes to convert - * @return result of conversion as UUID - * - * @see #uuidToBytes(UUID) for backward conversion - */ - public UUID uuidFromBytes(@NonNull final byte[] bytes) { - checkArgument(bytes.length == 16, "bytes length should be 16"); - - val buffer = ByteBuffer.wrap(bytes); - return new UUID(buffer.getLong(), buffer.getLong()); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java deleted file mode 100644 index 5e95c8e9d..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/collection/LazyIteratorToCollectionWrapper.java +++ /dev/null @@ -1,251 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.collection; - -import lombok.*; -import lombok.experimental.FieldDefaults; -import lombok.experimental.NonFinal; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -/** - * A wrapper for {@link Iterator} to be treated as a {@link Collection}. - * It provides lazy access to its entries so that iteration happens only when needed. - * - * @param type of element stored - */ -@RequiredArgsConstructor -@ToString(includeFieldNames = false) -@EqualsAndHashCode(onlyExplicitlyIncluded = true) -@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class LazyIteratorToCollectionWrapper> implements Collection { - - /** - * Iterator wrapped - */ - @EqualsAndHashCode.Include @NonNull Iterator iterator; - @NonNull Collection targetCollection; - - /** - * Gets the next element in the wrapped iterator - * - * @return next element in iterator if any or {@link null} if its end was reached. - */ - @Nullable protected E readNextIteratorElement() { - if (iterator.hasNext()) return iterator.next(); - return null; - } - - /** - * Iterates the wrapped iterator until the specified element is reached. - * - * @param element element to try to reach - * @return found element reference if found and {@link null} false otherwise - */ - @Nullable protected E readIteratorUntilReached(final E element) { - if (iterator.hasNext()) { - while (iterator.hasNext()) { - val nextElement = iterator.next(); - if (Objects.equals(element, nextElement)) return nextElement; - } - } - return null; - } - - /** - * Checks whether or not the wrapped iterator contains the specified element. - * - * @param element element to check for containment - * @return {@link true} if the element is contained in the wrapped iterator and {@link false} otherwise - */ - protected boolean isIteratorContaining(final Object element) { - if (iterator.hasNext()) { - while (iterator.hasNext()) { - val nextElement = iterator.next(); - if (Objects.equals(element, nextElement)) return true; - } - } - return false; - } - - /** - * Reads all content of the wrapped iterator. - */ - protected void readIteratorFully() { - while (iterator.hasNext()) targetCollection.add(iterator.next()); - } - - @Override - public int size() { - readIteratorFully(); - - return targetCollection.size(); - } - - @Override - public boolean isEmpty() { - return targetCollection.isEmpty() && !iterator.hasNext(); - } - - @Override - public boolean contains(final Object object) { - return targetCollection.contains(object) || isIteratorContaining(object); - } - - @NotNull - @Override - public Iterator iterator() { - return new PublicIterator(); - } - - @NotNull - @Override - public Object[] toArray() { - readIteratorFully(); - - return targetCollection.toArray(); - } - - @NotNull - @Override - @SuppressWarnings({"unchecked", "SuspiciousToArrayCall"}) - public T[] toArray(@NotNull final T... a) { - readIteratorFully(); - - return targetCollection.toArray(a); - } - - @Override - public boolean add(final E e) { - return targetCollection.add(e); - } - - @Override - public boolean remove(final Object o) { - if (targetCollection.remove(o)) return true; - if (isIteratorContaining(o)) { - iterator.remove(); - - return true; - } - return false; - } - - @Override - public boolean containsAll(@NotNull Collection valuesToFind) { - if (valuesToFind.isEmpty()) return true; - - valuesToFind = new ArrayList<>(valuesToFind); - // remove elements which are definitely contained in the read part of the iterator - //noinspection SuspiciousMethodCalls - valuesToFind.removeAll(targetCollection); - - if (valuesToFind.isEmpty()) return true; - - while (iterator.hasNext()) { - val element = readNextIteratorElement(); - valuesToFind.remove(element); - - if (valuesToFind.isEmpty()) return true; - } - - return false; - } - - @Override - public boolean addAll(@NotNull final Collection elements) { - return targetCollection.addAll(elements); - } - - @Override - public boolean removeAll(@NotNull Collection valuesToRemove) { - if (valuesToRemove.isEmpty()) return false; - - var changed = targetCollection.removeAll(valuesToRemove); - while (iterator.hasNext()) { - val element = iterator.next(); - if (valuesToRemove.contains(element)) changed = true; - else targetCollection.add(element); - } - - return changed; - } - - @Override - public boolean retainAll(@NotNull final Collection valuesToRetain) { - if (valuesToRetain.isEmpty()) { - val changed = !targetCollection.isEmpty(); - targetCollection.clear(); - - return changed; - } - - boolean changed = false; - { - val targetIterator = targetCollection.iterator(); - while (targetIterator.hasNext()) { - val element = targetIterator.next(); - if (!valuesToRetain.contains(element)) { - targetIterator.remove(); - changed = true; - } - } - } - while (iterator.hasNext()) { - val element = iterator.next(); - if (valuesToRetain.contains(element)) targetCollection.add(element); - else changed = true; - } - - return changed; - } - - @Override - public void clear() { - targetCollection.clear(); - while (iterator.hasNext()) iterator.next(); - } - - /** - * Iterator used by this {@link LazyIteratorToCollectionWrapper}. - */ - @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) - protected class PublicIterator implements Iterator { - - /** - * Iterator of the {@link #targetCollection} - */ - @NonNull Iterator collectionIterator = targetCollection.iterator(); - /** - * Flag indicating whether the last {@link Iterator#next()} was called on {@link #collectionIterator} or not - */ - @NonFinal boolean lastReadFromCollection = false; - - @Override - public boolean hasNext() { - return collectionIterator.hasNext() || iterator.hasNext(); - } - - @Override - public E next() { - if (collectionIterator.hasNext()) { - lastReadFromCollection = true; - - return collectionIterator.next(); - } - if (iterator.hasNext()) { - lastReadFromCollection = false; - - return iterator.next(); - } - - throw new IllegalStateException(); - } - - @Override - public void remove() { - if (lastReadFromCollection) collectionIterator.remove(); - else iterator.remove(); - } - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java deleted file mode 100644 index 5b10ec159..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollectionWrapper.java +++ /dev/null @@ -1,202 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.concurrent; - - -import lombok.NonNull; - -import javax.annotation.Nonnull; -import java.util.Collection; -import java.util.Iterator; -import java.util.Spliterator; -import java.util.function.Consumer; -import java.util.function.Predicate; -import java.util.stream.Stream; - -public class ConcurrentCollectionWrapper> - extends ConcurrentWrapper implements Collection { - - public ConcurrentCollectionWrapper(@NonNull final T wrapped) { - super(wrapped); - } - - @Override - public int size() { - readLock.lock(); - try { - return wrapped.size(); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean isEmpty() { - readLock.lock(); - try { - return wrapped.isEmpty(); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean contains(final Object o) { - readLock.lock(); - try { - return wrapped.contains(o); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull - public Iterator iterator() { - readLock.lock(); - try { - return wrapped.iterator(); - } finally { - readLock.unlock(); - } - } - - @Override - public void forEach(@NonNull final Consumer action) { - readLock.lock(); - try { - wrapped.forEach(action); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull public Object[] toArray() { - readLock.lock(); - try { - return wrapped.toArray(); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull public R[] toArray(@NonNull final R[] a) { - readLock.lock(); - try { - //noinspection SuspiciousToArrayCall - return wrapped.toArray(a); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean add(final E e) { - writeLock.lock(); - try { - return wrapped.add(e); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean remove(final Object o) { - writeLock.lock(); - try { - return wrapped.remove(o); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean containsAll(@NonNull final Collection c) { - readLock.lock(); - try { - return wrapped.containsAll(c); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean addAll(@NonNull final Collection c) { - writeLock.lock(); - try { - return wrapped.addAll(c); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean retainAll(@NonNull final Collection c) { - writeLock.lock(); - try { - return wrapped.retainAll(c); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean removeAll(@NonNull final Collection c) { - writeLock.lock(); - try { - return wrapped.removeAll(c); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean removeIf(@NonNull final Predicate filter) { - writeLock.lock(); - try { - return wrapped.removeIf(filter); - } finally { - writeLock.unlock(); - } - } - - @Override - public void clear() { - writeLock.lock(); - try { - wrapped.clear(); - } finally { - writeLock.unlock(); - } - } - - @Override - public Spliterator spliterator() { - readLock.lock(); - try { - return wrapped.spliterator(); - } finally { - readLock.unlock(); - } - } - - @Override - public Stream stream() { - readLock.lock(); - try { - return wrapped.stream(); - } finally { - readLock.unlock(); - } - } - - @Override - public Stream parallelStream() { - readLock.lock(); - try { - return wrapped.parallelStream(); - } finally { - readLock.unlock(); - } - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollections.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollections.java deleted file mode 100644 index 1f188298f..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentCollections.java +++ /dev/null @@ -1,45 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.concurrent; - -import lombok.NonNull; -import lombok.experimental.UtilityClass; - -import java.util.*; -import java.util.concurrent.locks.ReadWriteLock; - -/** - * An utility for creating concurrent {@link Collection} wrappers. - * - * @implNote concurrent wrappers delegate all operations to source collections - * yet performing precondition-checks ans using {@link ReadWriteLock}s - */ -@UtilityClass -public class ConcurrentCollections { - - public Collection concurrentCollection(@NonNull final Collection collection) { - return new ConcurrentCollectionWrapper<>(collection); - } - - public List concurrentList(@NonNull final List list) { - return new ConcurrentListWrapper<>(list); - } - - public Set concurrentSet(@NonNull final Set set) { - return new ConcurrentSetWrapper<>(set); - } - - public Set concurrentSetFromMap(@NonNull final Map map) { - return new ConcurrentSetFromMapWrapper<>(map); - } - - public Queue concurrentQueue(@NonNull final Queue set) { - return new ConcurrentQueueWrapper<>(set); - } - - public Deque concurrentDeque(@NonNull final Deque set) { - return new ConcurrentDequeWrapper<>(set); - } - - public Map concurrentMap(@NonNull final Map map) { - return new ConcurrentMapWrapper<>(map); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentDequeWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentDequeWrapper.java deleted file mode 100644 index bb24d5d70..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentDequeWrapper.java +++ /dev/null @@ -1,235 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.concurrent; - -import lombok.NonNull; - -import javax.annotation.Nonnull; -import java.util.Deque; -import java.util.Iterator; - -public class ConcurrentDequeWrapper> - extends ConcurrentCollectionWrapper implements Deque { - - public ConcurrentDequeWrapper(@NonNull final T wrapped) { - super(wrapped); - } - - @Override - public void addFirst(final E e) { - writeLock.lock(); - try { - wrapped.addFirst(e); - } finally { - writeLock.unlock(); - } - } - - @Override - public void addLast(final E e) { - writeLock.lock(); - try { - wrapped.addLast(e); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean offerFirst(final E e) { - writeLock.lock(); - try { - return wrapped.offerFirst(e); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean offerLast(final E e) { - writeLock.lock(); - try { - return wrapped.offerLast(e); - } finally { - writeLock.unlock(); - } - } - - @Override - public E removeFirst() { - writeLock.lock(); - try { - return wrapped.removeFirst(); - } finally { - writeLock.unlock(); - } - } - - @Override - public E removeLast() { - writeLock.lock(); - try { - return wrapped.removeLast(); - } finally { - writeLock.unlock(); - } - } - - @Override - public E pollFirst() { - writeLock.lock(); - try { - return wrapped.pollFirst(); - } finally { - writeLock.unlock(); - } - } - - @Override - public E pollLast() { - writeLock.lock(); - try { - return wrapped.pollLast(); - } finally { - writeLock.unlock(); - } - } - - @Override - public E getFirst() { - readLock.lock(); - try { - return wrapped.getFirst(); - } finally { - readLock.unlock(); - } - } - - @Override - public E getLast() { - readLock.lock(); - try { - return wrapped.getLast(); - } finally { - readLock.unlock(); - } - } - - @Override - public E peekFirst() { - readLock.lock(); - try { - return wrapped.peekFirst(); - } finally { - readLock.unlock(); - } - } - - @Override - public E peekLast() { - readLock.lock(); - try { - return wrapped.peekLast(); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean removeFirstOccurrence(final Object o) { - writeLock.lock(); - try { - return wrapped.removeFirstOccurrence(o); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean removeLastOccurrence(final Object o) { - writeLock.lock(); - try { - return wrapped.removeLastOccurrence(o); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean offer(final E e) { - writeLock.lock(); - try { - return wrapped.offer(e); - } finally { - writeLock.unlock(); - } - } - - @Override - public E remove() { - writeLock.lock(); - try { - return wrapped.remove(); - } finally { - writeLock.unlock(); - } - } - - @Override - public E poll() { - writeLock.lock(); - try { - return wrapped.poll(); - } finally { - writeLock.unlock(); - } - } - - @Override - public E element() { - readLock.lock(); - try { - return wrapped.element(); - } finally { - readLock.unlock(); - } - } - - @Override - public E peek() { - readLock.lock(); - try { - return wrapped.peek(); - } finally { - readLock.unlock(); - } - } - - @Override - public void push(final E e) { - writeLock.lock(); - try { - wrapped.push(e); - } finally { - writeLock.unlock(); - } - } - - @Override - public E pop() { - writeLock.lock(); - try { - return wrapped.pop(); - } finally { - writeLock.unlock(); - } - } - - @Override - @Nonnull public Iterator descendingIterator() { - readLock.lock(); - try { - return wrapped.descendingIterator(); - } finally { - readLock.unlock(); - } - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentListWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentListWrapper.java deleted file mode 100644 index 1dcdb79c3..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentListWrapper.java +++ /dev/null @@ -1,155 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.concurrent; - -import lombok.NonNull; - -import javax.annotation.Nonnull; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.ListIterator; -import java.util.function.UnaryOperator; - -public class ConcurrentListWrapper> extends ConcurrentCollectionWrapper implements List { - - public ConcurrentListWrapper(@NonNull final T wrapped) { - super(wrapped); - } - - @Override - public boolean addAll(final int index, @Nonnull final Collection c) { - if (index < 0) throw new IndexOutOfBoundsException("index should be positive"); - - writeLock.lock(); - try { - return wrapped.addAll(index, c); - } finally { - writeLock.unlock(); - } - } - - @Override - public void replaceAll(@Nonnull final UnaryOperator operator) { - writeLock.lock(); - try { - wrapped.replaceAll(operator); - } finally { - writeLock.unlock(); - } - } - - @Override - public void sort(@Nonnull final Comparator c) { - writeLock.lock(); - try { - wrapped.sort(c); - } finally { - writeLock.unlock(); - } - } - - @Override - public E get(final int index) { - if (index < 0) throw new IndexOutOfBoundsException("index should be positive"); - - readLock.lock(); - try { - return wrapped.get(index); - } finally { - readLock.unlock(); - } - } - - @Override - public E set(final int index, final E element) { - if (index < 0) throw new IndexOutOfBoundsException("index should be positive"); - - writeLock.lock(); - try { - return wrapped.set(index, element); - } finally { - writeLock.unlock(); - } - } - - @Override - public void add(final int index, final E element) { - if (index < 0) throw new IndexOutOfBoundsException("index should be positive"); - - writeLock.lock(); - try { - wrapped.add(index, element); - } finally { - writeLock.unlock(); - } - } - - @Override - public E remove(final int index) { - if (index < 0) throw new IndexOutOfBoundsException("index should be positive"); - - writeLock.lock(); - try { - return wrapped.remove(index); - } finally { - writeLock.unlock(); - } - } - - @Override - public int indexOf(final Object o) { - readLock.lock(); - try { - return wrapped.indexOf(o); - } finally { - readLock.unlock(); - } - } - - @Override - public int lastIndexOf(final Object o) { - readLock.lock(); - try { - return wrapped.lastIndexOf(o); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull - public ListIterator listIterator() { - readLock.lock(); - try { - return wrapped.listIterator(); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull public ListIterator listIterator(final int index) { - if (index < 0) throw new IndexOutOfBoundsException("index should be positive"); - - readLock.lock(); - try { - return wrapped.listIterator(index); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull public List subList(final int fromIndex, final int toIndex) { - if (fromIndex < 0) throw new IndexOutOfBoundsException("fromIndex should be positive"); - if (toIndex < fromIndex) throw new IndexOutOfBoundsException( - "toIndex should be greater than or equal to fromIndex" - ); - - readLock.lock(); - try { - return wrapped.subList(fromIndex, toIndex); - } finally { - readLock.unlock(); - } - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentMapWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentMapWrapper.java deleted file mode 100644 index 2bbb2f87d..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentMapWrapper.java +++ /dev/null @@ -1,256 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.concurrent; - - -import lombok.AccessLevel; -import lombok.NonNull; -import lombok.experimental.FieldDefaults; - -import javax.annotation.Nonnull; -import java.util.Collection; -import java.util.Map; -import java.util.Set; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Function; - -@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class ConcurrentMapWrapper> - extends ConcurrentWrapper implements Map { - - public ConcurrentMapWrapper(@NonNull final T wrapped) { - super(wrapped); - } - - @Override - public int size() { - readLock.lock(); - try { - return wrapped.size(); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean isEmpty() { - readLock.lock(); - try { - return wrapped.isEmpty(); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean containsKey(final Object key) { - readLock.lock(); - try { - return wrapped.containsKey(key); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean containsValue(final Object value) { - readLock.lock(); - try { - return wrapped.containsValue(value); - } finally { - readLock.unlock(); - } - } - - @Override - public V get(final Object key) { - readLock.lock(); - try { - return wrapped.get(key); - } finally { - readLock.unlock(); - } - } - - @Override - public V put(final K key, final V value) { - writeLock.lock(); - try { - return wrapped.put(key, value); - } finally { - writeLock.unlock(); - } - } - - @Override - public V remove(final Object key) { - writeLock.lock(); - try { - return wrapped.remove(key); - } finally { - writeLock.unlock(); - } - } - - @Override - public void putAll(@NonNull final Map m) { - writeLock.lock(); - try { - wrapped.putAll(m); - } finally { - writeLock.unlock(); - } - } - - @Override - public void clear() { - writeLock.lock(); - try { - wrapped.clear(); - } finally { - writeLock.unlock(); - } - } - - @Override - @Nonnull - public Set keySet() { - readLock.lock(); - try { - return wrapped.keySet(); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull public Collection values() { - readLock.lock(); - try { - return wrapped.values(); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull public Set> entrySet() { - readLock.lock(); - try { - return wrapped.entrySet(); - } finally { - readLock.unlock(); - } - } - - @Override - public V getOrDefault(final Object key, final V defaultValue) { - readLock.lock(); - try { - return wrapped.getOrDefault(key, defaultValue); - } finally { - readLock.unlock(); - } - } - - @Override - public void forEach(@NonNull final BiConsumer action) { - readLock.lock(); - try { - wrapped.forEach(action); - } finally { - readLock.unlock(); - } - } - - @Override - public void replaceAll(@NonNull final BiFunction function) { - writeLock.lock(); - try { - wrapped.replaceAll(function); - } finally { - writeLock.unlock(); - } - } - - @Override - public V putIfAbsent(final K key, final V value) { - writeLock.lock(); - try { - return wrapped.putIfAbsent(key, value); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean remove(final Object key, final Object value) { - writeLock.lock(); - try { - return wrapped.remove(key, value); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean replace(final K key, final V oldValue, final V newValue) { - writeLock.lock(); - try { - return wrapped.replace(key, oldValue, newValue); - } finally { - writeLock.unlock(); - } - } - - @Override - public V replace(final K key, final V value) { - writeLock.lock(); - try { - return wrapped.replace(key, value); - } finally { - writeLock.unlock(); - } - } - - @Override - public V computeIfAbsent(final K key, @NonNull final Function mappingFunction) { - writeLock.lock(); - try { - return wrapped.computeIfAbsent(key, mappingFunction); - } finally { - writeLock.unlock(); - } - } - - @Override - public V computeIfPresent(final K key, - @NonNull final BiFunction remappingFunction) { - writeLock.lock(); - try { - return wrapped.computeIfPresent(key, remappingFunction); - } finally { - writeLock.unlock(); - } - } - - @Override - public V compute(final K key, @NonNull final BiFunction remappingFunction) { - writeLock.lock(); - try { - return wrapped.compute(key, remappingFunction); - } finally { - writeLock.unlock(); - } - } - - @Override - public V merge(final K key, @NonNull final V value, - @NonNull final BiFunction remappingFunction) { - writeLock.lock(); - try { - return wrapped.merge(key, value, remappingFunction); - } finally { - writeLock.unlock(); - } - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentQueueWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentQueueWrapper.java deleted file mode 100644 index 01b4fa1b7..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentQueueWrapper.java +++ /dev/null @@ -1,63 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.concurrent; - -import lombok.NonNull; - -import java.util.Queue; - -public class ConcurrentQueueWrapper> - extends ConcurrentCollectionWrapper implements Queue { - - public ConcurrentQueueWrapper(@NonNull final T wrapped) { - super(wrapped); - } - - @Override - public boolean offer(final E e) { - writeLock.lock(); - try { - return wrapped.offer(e); - } finally { - writeLock.unlock(); - } - } - - @Override - public E remove() { - writeLock.lock(); - try { - return wrapped.remove(); - } finally { - writeLock.unlock(); - } - } - - @Override - public E poll() { - writeLock.lock(); - try { - return wrapped.poll(); - } finally { - writeLock.unlock(); - } - } - - @Override - public E element() { - readLock.lock(); - try { - return wrapped.element(); - } finally { - readLock.unlock(); - } - } - - @Override - public E peek() { - readLock.lock(); - try { - return wrapped.peek(); - } finally { - readLock.unlock(); - } - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetFromMapWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetFromMapWrapper.java deleted file mode 100644 index a3fa4549b..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetFromMapWrapper.java +++ /dev/null @@ -1,207 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.concurrent; - -import lombok.AccessLevel; -import lombok.NonNull; -import lombok.experimental.FieldDefaults; - -import javax.annotation.Nonnull; -import java.util.*; -import java.util.function.*; -import java.util.stream.Stream; - -@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class ConcurrentSetFromMapWrapper> - extends ConcurrentWrapper> implements Set { - - // map used as set backend - T map; - - public ConcurrentSetFromMapWrapper(@NonNull final T wrapped) { - super(wrapped.keySet()); - - this.map = wrapped; - } - - @Override - public int size() { - readLock.lock(); - try { - return map.size(); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean isEmpty() { - readLock.lock(); - try { - return map.isEmpty(); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean contains(final Object o) { - readLock.lock(); - try { - //noinspection SuspiciousMethodCalls - return map.containsKey(o); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull - public Iterator iterator() { - readLock.lock(); - try { - return wrapped.iterator(); - } finally { - readLock.unlock(); - } - } - - @Override - public void forEach(@NonNull final Consumer action) { - readLock.lock(); - try { - wrapped.forEach(action); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull public Object[] toArray() { - readLock.lock(); - try { - return wrapped.toArray(); - } finally { - readLock.unlock(); - } - } - - @Override - @Nonnull public R[] toArray(@NonNull final R[] a) { - readLock.lock(); - try { - //noinspection SuspiciousToArrayCall - return wrapped.toArray(a); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean add(final E e) { - writeLock.lock(); - try { - return map.put(e, true) == null; - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean remove(final Object o) { - writeLock.lock(); - try { - return map.remove(o) != null; - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean containsAll(@NonNull final Collection c) { - readLock.lock(); - try { - return wrapped.containsAll(c); - } finally { - readLock.unlock(); - } - } - - @Override - public boolean addAll(@NonNull final Collection c) { - writeLock.lock(); - try { - return wrapped.addAll(c); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean retainAll(@NonNull final Collection c) { - writeLock.lock(); - try { - return wrapped.retainAll(c); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean removeAll(@NonNull final Collection c) { - writeLock.lock(); - try { - return wrapped.removeAll(c); - } finally { - writeLock.unlock(); - } - } - - @Override - public boolean removeIf(@NonNull final Predicate filter) { - writeLock.lock(); - try { - return wrapped.removeIf(filter); - } finally { - writeLock.unlock(); - } - } - - @Override - public void clear() { - writeLock.lock(); - try { - map.clear(); - } finally { - writeLock.unlock(); - } - } - - @Override - public Spliterator spliterator() { - readLock.lock(); - try { - return wrapped.spliterator(); - } finally { - readLock.unlock(); - } - } - - @Override - public Stream stream() { - readLock.lock(); - try { - return wrapped.stream(); - } finally { - readLock.unlock(); - } - } - - @Override - public Stream parallelStream() { - readLock.lock(); - try { - return wrapped.parallelStream(); - } finally { - readLock.unlock(); - } - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetWrapper.java deleted file mode 100644 index 2ef5eccad..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentSetWrapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.concurrent; - -import lombok.NonNull; - -import java.util.Set; - -public class ConcurrentSetWrapper> - extends ConcurrentCollectionWrapper implements Set { - - public ConcurrentSetWrapper(@NonNull final T wrapped) { - super(wrapped); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentWrapper.java deleted file mode 100644 index 5b518c7f3..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/concurrent/ConcurrentWrapper.java +++ /dev/null @@ -1,63 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.concurrent; - - -import lombok.AccessLevel; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.experimental.FieldDefaults; - -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -/** - * Base for all concurrent wrappers. - * - * @param type of wrapped value - */ -@RequiredArgsConstructor -@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class ConcurrentWrapper { - - @NonNull final T wrapped; - - ReadWriteLock lock = new ReentrantReadWriteLock(); - Lock readLock = lock.readLock(); - Lock writeLock = lock.writeLock(); - - /** - * {@inheritDoc} - * - * @implNote this method is not concurrent because if modification happens - * then the result of its call is anyway irrelevant - * @implNote simply calls to {@link #wrapped}'s {@link T#equals(Object)} method - * as it provides mostly symmetric logic - */ - @Override - @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") - public boolean equals(final Object obj) { - return wrapped.equals(obj); - } - - /** - * {@inheritDoc} - * - * @implNote this method is not concurrent because if modification happens - * then the result of its call is anyway irrelevant - * @implNote simply calls to {@link #wrapped}'s {@link T#hashCode()} method - * as it provides a logically unique value - */ - @Override - public int hashCode() { - return wrapped.hashCode(); - } - - /** - * {@inheritDoc} - * @implNote simply adds Concurrent prefix to {@link #wrapped} {@link T#toString()} call result - */ - @Override - public String toString() { - return "Concurrent" + wrapped.toString(); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java deleted file mode 100644 index b7f9de2bf..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazies.java +++ /dev/null @@ -1,170 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.function.lazy; - -import lombok.*; -import lombok.experimental.FieldDefaults; -import lombok.experimental.UtilityClass; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedSupplier; - -import javax.annotation.Nullable; -import java.lang.ref.WeakReference; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.function.Supplier; - -@UtilityClass -public class Lazies { - - public Lazy lazy(@NonNull final UncheckedSupplier valueSupplier) { - return new SimpleLazy<>(valueSupplier); - } - - public Lazy concurrentLazy(@NonNull final UncheckedSupplier valueSupplier) { - return new ConcurrentLazy<>(valueSupplier); - } - - public Lazy weakLazy(@NonNull final UncheckedSupplier valueSupplier) { - return new WeakLazy<>(valueSupplier); - } - - public Lazy concurrentWeakLazy(@NonNull final UncheckedSupplier valueSupplier) { - return new ConcurrentWeakLazy<>(valueSupplier); - } - - @ToString - @EqualsAndHashCode - @FieldDefaults(level = AccessLevel.PRIVATE) - private static final class SimpleLazy implements Lazy { - - @Nullable transient Supplier valueSupplier; - @Nullable transient T value; - - private SimpleLazy(@NonNull final Supplier supplier) { - this.valueSupplier = supplier; - } - - @Override - public boolean isInitialized() { - return valueSupplier == null; - } - - @Override - public T get() { - if (valueSupplier != null) { // not initialized - value = valueSupplier.get(); - valueSupplier = null; - } - - return value; - } - } - - @ToString - @EqualsAndHashCode - @FieldDefaults(level = AccessLevel.PRIVATE) - private static final class ConcurrentLazy implements Lazy { - - @Nullable transient Supplier valueSupplier; - @Nullable transient T value; - - private ConcurrentLazy(@NonNull final Supplier supplier) { - this.valueSupplier = supplier; - } - - @Override - public boolean isInitialized() { - if (valueSupplier != null) { // might be not initialized - synchronized (this) { // synchronize and return sure value - return valueSupplier == null; - } - } - - return true; - } - - @Override - public T get() { - if (valueSupplier != null) { // might be not initialized - synchronized (this) { // synchronize to make sure - if (valueSupplier != null) { - value = valueSupplier.get(); - valueSupplier = null; // no longer needed - } - } - } - - return value; - } - } - - @ToString - @EqualsAndHashCode - @RequiredArgsConstructor(access = AccessLevel.PRIVATE) - @FieldDefaults(level = AccessLevel.PRIVATE) - private static final class WeakLazy<@NonNull T> implements Lazy { - - @NonNull final transient Supplier valueSupplier; - @Nullable transient WeakReference value; - - @Override - public boolean isInitialized() { - return value != null && value.get() != null; - } - - @Override - public T get() { - T value; - if (this.value == null || (value = this.value.get()) == null) this.value - = new WeakReference<>(value = valueSupplier.get()); - - return value; - } - } - - @ToString - @EqualsAndHashCode - @FieldDefaults(level = AccessLevel.PRIVATE) - private static final class ConcurrentWeakLazy<@NonNull T> implements Lazy { - - @NonNull final transient Supplier valueSupplier; - @Nullable transient WeakReference value; - @NonNull transient final Lock readLock, writeLock; - - private ConcurrentWeakLazy(@NonNull final Supplier valueSupplier) { - this.valueSupplier = valueSupplier; - - val lock = new ReentrantReadWriteLock(); - readLock = lock.readLock(); - writeLock = lock.writeLock(); - } - - @Override - public boolean isInitialized() { - readLock.lock(); - try { - return value != null && value.get() != null; - } finally { - readLock.unlock(); - } - } - - @Override - public T get() { - readLock.lock(); - try { - T value; - if (this.value == null || (value = this.value.get()) == null) { - writeLock.lock(); - try { - this.value = new WeakReference<>(value = valueSupplier.get()); - } finally { - writeLock.unlock(); - } - } - - return value; - } finally { - readLock.unlock(); - } - } - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java deleted file mode 100644 index c8e3033cb..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/Lazy.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.function.lazy; - -import java.util.Optional; -import java.util.function.Supplier; - -/** - * A value calculated only once needed and then cached. - * - * @param type of value - */ -public interface Lazy extends Supplier { - - @Override - T get(); - - /** - * Retrieves whether or not this Lazy was initialized ({@link #get()} was called). - * - * @return {@code true} if this lazy was initialized and {@link false} otherwise - */ - boolean isInitialized(); - - /** - * Gets a value wrapped in {@link Optional} only if it was initialized, otherwise returning an empty one. - * - * @return Optional containing the value if it was initialized or an empty one otherwise. - * - * @apiNote An empty optional may also mean that the value was initialized to {@code null}. - */ - default Optional getIfInitialized() { - return isInitialized() ? Optional.ofNullable(get()) : Optional.empty(); - } -} diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java index d9ee80794..87d29ecb7 100644 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java +++ b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java @@ -6,12 +6,13 @@ import org.apache.commons.lang.math.RandomUtils; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import ru.progrm_jarvis.javacommons.util.function.ThrowingFunction; import ru.progrm_jarvis.minecraft.commons.nms.protocol.misc.PacketWrapperUtil; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; -import ru.progrm_jarvis.reflector.Reflector; -import ru.progrm_jarvis.reflector.wrapper.fast.FastConstructorWrapper; +import ru.progrm_jarvis.reflector.wrapper.invoke.InvokeConstructorWrapper; import java.io.IOException; +import java.lang.reflect.Constructor; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -46,13 +47,14 @@ void defaultPacketsTest() throws IOException { .map(ClassPath.ClassInfo::getName) .map((UncheckedFunction>) className -> (Class) classLoader.loadClass(className)) - .map(Reflector::getDeclaredConstructor) - .map(FastConstructorWrapper::from) + .map((ThrowingFunction, Constructor, + NoSuchMethodException>) aClass -> aClass.getDeclaredConstructor()) + .map(InvokeConstructorWrapper::from) .collect(Collectors.toSet()) .forEach(constructor -> { System.out.println("Testing: " + constructor); for (int i = 0; i < 3 + RandomUtils.nextInt(3); i++) assertDoesNotThrow( - () -> PacketWrapperUtil.toString(constructor.construct()) + () -> PacketWrapperUtil.toString(constructor.invoke()) ); }); } diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java deleted file mode 100644 index 2b78aa3d7..000000000 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/MapUtilTest.java +++ /dev/null @@ -1,224 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util; - -import lombok.val; -import org.apache.commons.lang3.tuple.Pair; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.function.Supplier; -import java.util.stream.Stream; - -import static com.google.common.collect.Maps.immutableEntry; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.*; - -class MapUtilTest { - - /////////////////////////////////////////////////////////////////////////// - // MapUtil - /////////////////////////////////////////////////////////////////////////// - - @Test - @SuppressWarnings("unchecked") - void testFillMapFromArrayOfUncheckedPairs() { - assertEquals(new HashMap<>(), MapUtil.fillMap(new HashMap<>())); - - assertThrows(IllegalArgumentException.class, () -> MapUtil.fillMap(new HashMap<>(), 1)); - - assertThrows(IllegalArgumentException.class, () -> MapUtil.fillMap(new HashMap<>(), 1, 3, "String")); - - val entries = new HashMap() {{ - put(1, "Hello"); - put(2, "world"); - }}.entrySet(); - - assertThat(entries, hasSize(2)); - assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); - } - - @Test - @SuppressWarnings("unchecked") - void testFillMapFromArray() { - val entries = MapUtil.>fillMap( - new HashMap<>(), Pair.of(1, "Hello"), Pair.of(2, "world") - ).entrySet(); - - assertThat(entries, hasSize(2)); - assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); - } - - @Test - @SuppressWarnings("unchecked") - void testFillMapFromIterator() { - val entries = MapUtil - .fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world")).iterator()) - .entrySet(); - - assertThat(entries, hasSize(2)); - assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); - } - - @Test - @SuppressWarnings("unchecked") - void testFillMapFromIterable() { - val entries = MapUtil - .fillMap(new HashMap<>(), Arrays.asList(Pair.of(1, "Hello"), Pair.of(2, "world"))) - .entrySet(); - - assertThat(entries, hasSize(2)); - assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); - } - - @Test - @SuppressWarnings("unchecked") - void testFillMapFromStream() { - val entries = MapUtil.fillMap(new HashMap<>(), Stream.of(Pair.of(1, "Hello"), Pair.of(2, "world"))).entrySet(); - - assertThat(entries, hasSize(2)); - assertThat(entries, contains(immutableEntry(1, "Hello"), immutableEntry(2, "world"))); - } - - @Test - void testGetOrDefault() { - val map = new HashMap(); - map.put(1, "One"); - map.put(2, "Two"); - - @SuppressWarnings("unchecked") final Supplier defaultSupplier = mock(Supplier.class); - when(defaultSupplier.get()).thenReturn("Default"); - - assertEquals("One", MapUtil.getOrDefault(map, 1, defaultSupplier)); - verify(defaultSupplier, times(0)).get(); - - assertEquals("Two", MapUtil.getOrDefault(map, 2, defaultSupplier)); - verify(defaultSupplier, times(0)).get(); - - assertEquals("Default", MapUtil.getOrDefault(map, 3, defaultSupplier)); - verify(defaultSupplier, times(1)).get(); - } - - /////////////////////////////////////////////////////////////////////////// - // MapFiller - /////////////////////////////////////////////////////////////////////////// - - @Test - void testMapFillerConstructWithFirst() { - assertThat( - MapUtil.mapFiller(new HashMap<>()).map().entrySet(), - empty() - ); - - assertEquals( - new HashMap() {{ - put("Hello", 1); - }}, - MapUtil.mapFiller(new HashMap<>(), "Hello", 1).map() - ); - } - - @Test - @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerPut() { - val entries = MapUtil.mapFiller(new HashMap()) - .put("one", 1) - .put("two", 2) - .map() - .entrySet(); - - assertThat(entries, hasSize(2)); - - assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); - } - - @Test - @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerFillFromArray() { - val entries = MapUtil.mapFiller(new HashMap()) - .fill(Pair.of("one", 1), Pair.of("two", 2)) - .map() - .entrySet(); - - assertThat(entries, hasSize(2)); - - assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); - } - - @Test - @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerFillFromIterator() { - val entries = MapUtil.mapFiller(new HashMap()) - .fill(Arrays.asList(Pair.of("one", 1), Pair.of("two", 2)).iterator()) - .map() - .entrySet(); - - assertThat(entries, hasSize(2)); - - assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); - } - - @Test - @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerFillFromIterable() { - val entries = MapUtil.mapFiller(new HashMap()) - .fill(Arrays.asList(Pair.of("one", 1), Pair.of("two", 2))) - .map() - .entrySet(); - - assertThat(entries, hasSize(2)); - - assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); - } - - @Test - @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerFillFromStream() { - val entries = MapUtil.mapFiller(new HashMap()) - .fill(Stream.of(Pair.of("one", 1), Pair.of("two", 2))) - .map() - .entrySet(); - - assertThat(entries, - hasSize(2) - ); - - assertThat(entries, hasItems(immutableEntry("one", 1), immutableEntry("two", 2))); - } - - @Test - @SuppressWarnings("unchecked") // Hamcrest, R U fine? - void testMapFillerFillFromEveryKind() { - val entries = MapUtil.mapFiller(new HashMap()) - .put("one", 1) - .put("two", 2) - .fill(Pair.of("three", 3), Pair.of("four", 4)) - .fill(Arrays.asList(Pair.of("five", 5), Pair.of("six", 6)).iterator()) - .fill(Arrays.asList(Pair.of("seven", 7), Pair.of("eight", 8))) - .fill(Stream.of(Pair.of("nine", 9), Pair.of("ten", 10))) - .map() - .entrySet(); - - assertThat(entries, hasSize(10)); - - assertThat( - entries, - hasItems( - immutableEntry("one", 1), - immutableEntry("two", 2), - immutableEntry("three", 3), - immutableEntry("four", 4), - immutableEntry("five", 5), - immutableEntry("six", 6), - immutableEntry("seven", 7), - immutableEntry("eight", 8), - immutableEntry("nine", 9), - immutableEntry("ten", 10) - ) - ); - } -} \ No newline at end of file diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtilTest.java deleted file mode 100644 index 4537ccac5..000000000 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/ObjectUtilTest.java +++ /dev/null @@ -1,123 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util; - -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.util.Objects; -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.*; -import static ru.progrm_jarvis.minecraft.commons.util.ObjectUtil.*; - -class ObjectUtilTest { - - @Test - void testNonNull() { - assertEquals("foo", nonNull("foo")); - assertEquals("foo", nonNull("foo", null)); - assertEquals("foo", nonNull(null, "foo", null)); - assertEquals("foo", nonNull(null, "foo")); - assertEquals("foo", nonNull("foo", "bar")); - assertEquals("foo", nonNull("foo", null, "bar")); - assertEquals("foo", nonNull(null, "foo", null, "bar")); - assertEquals("foo", nonNull(null, "foo", "bar")); - assertNull(nonNull((Object) null)); - assertNull(nonNull((Object) null, null)); - assertNull(nonNull((Object) null, null, null)); - } - - @Test - void testOptionalNonNull() { - assertEquals(Optional.of("foo"), optionalNonNull("foo")); - assertEquals(Optional.of("foo"), optionalNonNull("foo", null)); - assertEquals(Optional.of("foo"), optionalNonNull(null, "foo", null)); - assertEquals(Optional.of("foo"), optionalNonNull(null, "foo")); - assertEquals(Optional.of("foo"), optionalNonNull("foo", "bar")); - assertEquals(Optional.of("foo"), optionalNonNull("foo", null, "bar")); - assertEquals(Optional.of("foo"), optionalNonNull(null, "foo", null, "bar")); - assertEquals(Optional.of("foo"), optionalNonNull(null, "foo", "bar")); - assertEquals(Optional.empty(), optionalNonNull((Object) null)); - assertEquals(Optional.empty(), optionalNonNull((Object) null, null)); - assertEquals(Optional.empty(), optionalNonNull((Object) null, null, null)); - } - - @Test - void testNonNullOrThrow() { - assertEquals("foo", nonNullOrThrow("foo")); - assertEquals("foo", nonNullOrThrow("foo", null)); - assertEquals("foo", nonNullOrThrow(null, "foo", null)); - assertEquals("foo", nonNullOrThrow(null, "foo")); - assertEquals("foo", nonNullOrThrow("foo", "bar")); - assertEquals("foo", nonNullOrThrow("foo", null, "bar")); - assertEquals("foo", nonNullOrThrow(null, "foo", null, "bar")); - assertEquals("foo", nonNullOrThrow(null, "foo", "bar")); - assertThrows(NullPointerException.class, () -> nonNullOrThrow((Object) null)); - assertThrows(NullPointerException.class, () -> nonNullOrThrow((Object) null, null)); - assertThrows(NullPointerException.class, () -> nonNullOrThrow((Object) null, null, null)); - } - - @Test - void testMap() { - assertEquals("f", ObjectUtil.map("foo", t -> t.substring(0, 1))); - assertEquals("1", ObjectUtil.map(1, t -> Integer.toString(t))); - assertNull(ObjectUtil.map(123, t -> null)); - assertThrows(NullPointerException.class, () -> ObjectUtil.map(null, t -> { - if (t == null) throw new NullPointerException(); - return "nonnull"; - })); - assertThrows(NullPointerException.class, () -> ObjectUtil.map(null, t -> { - throw new NullPointerException(); - })); - assertThrows(IOException.class, () -> ObjectUtil.map(null, t -> { - throw new IOException(); - })); - } - - @Test - void testMapNonNull() { - assertEquals("f", mapNonNull(t -> t.substring(0, 1), "foo")); - assertEquals("f", mapNonNull(t -> t.substring(0, 1), "foo")); - assertEquals("f", mapNonNull(t -> t.substring(0, 1), "foo", null)); - assertEquals("f", mapNonNull(t -> t.substring(0, 1), null, "foo", null)); - assertEquals("f", mapNonNull(t -> t.substring(0, 1), null, "foo")); - assertEquals("f", mapNonNull(t -> t.substring(0, 1), "foo", "bar")); - assertEquals("f", mapNonNull(t -> t.substring(0, 1), "foo", null, "bar")); - assertEquals("f", mapNonNull(t -> t.substring(0, 1), null, "foo", null, "bar")); - assertEquals("f", mapNonNull(t -> t.substring(0, 1), null, "foo", "bar")); - assertEquals("+", mapNonNull(t -> t == null ? "+" : "-", (Object) null)); - assertEquals("+", mapNonNull(t -> t == null ? "+" : "-", (Object) null, null)); - assertEquals("+", mapNonNull(t -> t == null ? "+" : "-", (Object) null, null, null)); - } - - @Test - void testMapOnlyNonNull() { - assertEquals("f", mapOnlyNonNull(t -> t.substring(0, 1), "foo")); - assertEquals("f", mapOnlyNonNull(t -> t.substring(0, 1), "foo")); - assertEquals("f", mapOnlyNonNull(t -> t.substring(0, 1), "foo", null)); - assertEquals("f", mapOnlyNonNull(t -> t.substring(0, 1), null, "foo", null)); - assertEquals("f", mapOnlyNonNull(t -> t.substring(0, 1), null, "foo")); - assertEquals("f", mapOnlyNonNull(t -> t.substring(0, 1), "foo", "bar")); - assertEquals("f", mapOnlyNonNull(t -> t.substring(0, 1), "foo", null, "bar")); - assertEquals("f", mapOnlyNonNull(t -> t.substring(0, 1), null, "foo", null, "bar")); - assertEquals("f", mapOnlyNonNull(t -> t.substring(0, 1), null, "foo", "bar")); - assertNull(mapOnlyNonNull(t -> t.substring(0, 1), (String) null)); - assertNull(mapOnlyNonNull(t -> t.substring(0, 1), (String) null, null)); - assertNull(mapOnlyNonNull(t -> t.substring(0, 1), (String) null, null, null)); - } - - @Test - void testMapNonNullOrThrow() { - assertEquals("f", mapNonNullOrThrow(t -> t.substring(0, 1), "foo")); - assertEquals("f", mapNonNullOrThrow(t -> t.substring(0, 1), "foo", null)); - assertEquals("f", mapNonNullOrThrow(t -> t.substring(0, 1), null, "foo", null)); - assertEquals("f", mapNonNullOrThrow(t -> t.substring(0, 1), null, "foo")); - assertEquals("f", mapNonNullOrThrow(t -> t.substring(0, 1), "foo", "bar")); - assertEquals("f", mapNonNullOrThrow(t -> t.substring(0, 1), "foo", null, "bar")); - assertEquals("f", mapNonNullOrThrow(t -> t.substring(0, 1), null, "foo", null, "bar")); - assertEquals("f", mapNonNullOrThrow(t -> t.substring(0, 1), null, "foo", "bar")); - // mapping function should not be called so the one which allows nulls is used - assertThrows(NullPointerException.class, () -> mapNonNullOrThrow(Objects::isNull, (Object) null)); - assertThrows(NullPointerException.class, () -> mapNonNullOrThrow(Objects::isNull, (Object) null, null)); - assertThrows(NullPointerException.class, () -> mapNonNullOrThrow(Objects::isNull, (Object) null, null, null)); - } -} \ No newline at end of file diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java deleted file mode 100644 index e9b91e637..000000000 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/RandomUtilTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util; - -import lombok.val; -import lombok.var; -import org.apache.commons.lang.math.RandomUtils; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; -import static org.junit.jupiter.api.Assertions.assertThrows; - -class RandomUtilTest { - - @Test - void testGetRandomSign() { - val isAllowedValue = anyOf(is(1), is(-1)); - - for (var i = 0; i < 64 + RandomUtils.nextInt(65); i++) assertThat(RandomUtil.randomSign(), isAllowedValue); - } - - @Test - void testGetRandomFromMapOfChances() { - var values = MapUtil.fillMap(new HashMap<>(), "One", 1, "Two", 2); - var keySet = values.keySet(); - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( - RandomUtil.getRandom(values), isIn(keySet) - ); - - values = MapUtil.fillMap(new HashMap<>(), "One", 1, "Two", 2, "Three", 3, "Four", 4, "Five", 5); - keySet = values.keySet(); - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( - RandomUtil.getRandom(values), isIn(keySet) - ); - - values = MapUtil.fillMap(new HashMap<>(), "Hi", 1); - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( - "Hi", equalTo(RandomUtil.getRandom(values)) - ); - - assertThrows(IllegalArgumentException.class, () -> RandomUtil.getRandom(new HashMap<>())); - } - - @Test - void testGetRandomFromList() { - var values = new ArrayList(); - for (var i = 0; i < 64 + RandomUtils.nextInt(65); i++) values.add(Integer.toString(RandomUtils.nextInt())); - - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( - RandomUtil.getRandom(values), isIn(values) - ); - - assertThrows(IllegalArgumentException.class, () -> RandomUtil.getRandom(new ArrayList<>())); - } - - @Test - void testGetRandomFromCollection() { - final Collection values; - { // hide List type - var valuesList = new ArrayList(); - for (var i = 0; i < 64 + RandomUtils.nextInt(65); i++) valuesList.add(Integer.toString(RandomUtils.nextInt())); - values = valuesList; - } - - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) assertThat( - RandomUtil.getRandom(values), isIn(values) - ); - - assertThrows(IllegalArgumentException.class, () -> RandomUtil.getRandom(new HashSet<>())); - } -} \ No newline at end of file diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtilTest.java deleted file mode 100644 index 47553798c..000000000 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/UuidUtilTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util; - -import lombok.val; -import lombok.var; -import org.junit.jupiter.api.Test; - -import java.util.UUID; -import java.util.concurrent.ThreadLocalRandom; - -import static org.junit.jupiter.api.Assertions.*; -import static ru.progrm_jarvis.minecraft.commons.util.UuidUtil.uuidFromBytes; -import static ru.progrm_jarvis.minecraft.commons.util.UuidUtil.uuidToBytes; - -class UuidUtilTest { - - @Test - void testBytesToUuidFailSafe() { - val random = ThreadLocalRandom.current(); - var iterations = 32 + random.nextInt(33); - for (int i = 0; i < iterations; i++) { - val bytes = new byte[random.nextInt(16)]; - assertThrows(IllegalArgumentException.class, () -> uuidFromBytes(bytes)); - } - - iterations = 32 + random.nextInt(33); - for (int i = 0; i < iterations; i++) { - val bytes = new byte[17 + random.nextInt(Integer.MAX_VALUE - 16)]; - assertThrows(IllegalArgumentException.class, () -> uuidFromBytes(bytes)); - } - } - - @Test - void testUuidToBytesAndOpposite() { - var iterations = 32 + ThreadLocalRandom.current().nextInt(33); - for (int i = 0; i < iterations; i++) { - val uuid = UUID.randomUUID(); - assertEquals(uuid, uuidFromBytes(uuidToBytes(uuid))); - } - } - - @Test - void testBytesToUuidAndOpposite() { - val random = ThreadLocalRandom.current(); - var iterations = 32 + random.nextInt(33); - for (int i = 0; i < iterations; i++) { - val bytes = new byte[16]; - random.nextBytes(bytes); - - assertArrayEquals(bytes, uuidToBytes(uuidFromBytes(bytes))); - } - } -} \ No newline at end of file diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java deleted file mode 100644 index e0232c4dd..000000000 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/function/lazy/LaziesTest.java +++ /dev/null @@ -1,103 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.function.lazy; - -import lombok.val; -import lombok.var; -import org.apache.commons.lang.math.RandomUtils; -import org.junit.jupiter.api.Test; - -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicInteger; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -class LaziesTest { - - @Test - void testLazy() { - val foo = mock(Foo.class); - val number = new AtomicInteger(); - - when(foo.createBar()).thenAnswer(invocation -> "<3" + number.getAndIncrement()); - - val lazy = Lazies.lazy(foo::createBar); - - assertFalse(lazy.isInitialized()); - verify(foo, times(0)).createBar(); - assertFalse(lazy.isInitialized()); - verify(foo, times(0)).createBar(); - - assertEquals("<3" + 0, lazy.get()); - verify(foo, times(1)).createBar(); - assertTrue(lazy.isInitialized()); - verify(foo, times(1)).createBar(); - - assertEquals("<3" + 0, lazy.get()); - verify(foo, times(1)).createBar(); - assertTrue(lazy.isInitialized()); - verify(foo, times(1)).createBar(); - - for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertEquals("<3" + 0, lazy.get()); - for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertTrue(lazy.isInitialized()); - for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) { - if (RandomUtils.nextBoolean()) assertEquals("<3" + 0, lazy.get()); - else assertTrue(lazy.isInitialized()); - } - for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertEquals("<3" + 0, lazy.get()); - for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertTrue(lazy.isInitialized()); - verify(foo, times(1)).createBar(); - } - - @Test - void testConcurrentLazy() { - val foo = mock(Foo.class); - val number = new AtomicInteger(); - - when(foo.createBar()).thenAnswer(invocation -> "<3" + number.getAndIncrement()); - - val lazy = Lazies.concurrentLazy(foo::createBar); - - assertFalse(lazy.isInitialized()); - verify(foo, times(0)).createBar(); - assertFalse(lazy.isInitialized()); - verify(foo, times(0)).createBar(); - - val workers = 7 + RandomUtils.nextInt(8); - val executors = Executors.newFixedThreadPool(workers); - for (int executorId = 0; executorId < workers; executorId++) executors.submit(() -> { - for (int j = 0; j < 15 + RandomUtils.nextInt(16); j++) { - - assertFalse(lazy.isInitialized()); - verify(foo, times(1)).createBar(); - assertFalse(lazy.isInitialized()); - verify(foo, times(1)).createBar(); - - assertEquals("<3" + 0, lazy.get()); - verify(foo, times(1)).createBar(); - assertTrue(lazy.isInitialized()); - verify(foo, times(1)).createBar(); - - assertEquals("<3" + 0, lazy.get()); - verify(foo, times(1)).createBar(); - assertTrue(lazy.isInitialized()); - verify(foo, times(1)).createBar(); - - for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertEquals("<3" + 0, lazy.get()); - for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertTrue(lazy.isInitialized()); - for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) { - if (RandomUtils.nextBoolean()) assertEquals("<3" + 0, lazy.get()); - else assertTrue(lazy.isInitialized()); - } - for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertEquals("<3" + 0, lazy.get()); - for (var i = 0; i < 127 + RandomUtils.nextInt(128); i++) assertTrue(lazy.isInitialized()); - verify(foo, times(1)).createBar(); - } - }); - } - - @FunctionalInterface - private interface Foo { - - Object createBar(); - } -} \ No newline at end of file diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java index 35a128840..48459e414 100644 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java +++ b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java @@ -9,7 +9,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import ru.progrm_jarvis.minecraft.commons.util.RandomUtil; +import ru.progrm_jarvis.javacommons.random.RandomUtil; import java.util.ArrayList; import java.util.Collection; diff --git a/pom.xml b/pom.xml index 0ceccb9d5..faa1a7fc1 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,7 @@ 1.8 UTF-8 + 1.0-SNAPSHOT 5.5.1 1.5.1 3.0.0 @@ -226,6 +227,16 @@ + + ru.progrm-jarvis + java-commons + ${version.padla} + + + ru.progrm-jarvis + reflector + ${version.padla} + org.spigotmc spigot-api @@ -254,11 +265,6 @@ PacketWrapper 1.13-R0.1-SNAPSHOT - - ru.progrm-jarvis.reflector - reflector - 1.2.2 - commons-io commons-io From 029004d4076dce92961db432c30c8dc0c2345086 Mon Sep 17 00:00:00 2001 From: PROgrammer_JARvis Date: Mon, 29 Jul 2019 23:18:12 +0300 Subject: [PATCH 277/508] Remove internal `@DontOverrideEqualsAndHashCode` --- .../entity/AbstractFakeEntity.java | 2 +- .../entity/management/FakeEntityManager.java | 2 +- .../DontOverrideEqualsAndHashCode.java | 22 ------------------- 3 files changed, 2 insertions(+), 24 deletions(-) delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java index de9ab8fc6..f83135c09 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java @@ -4,7 +4,7 @@ import lombok.experimental.FieldDefaults; import org.bukkit.Location; import org.bukkit.World; -import ru.progrm_jarvis.minecraft.commons.annotation.DontOverrideEqualsAndHashCode; +import ru.progrm_jarvis.javacommons.annotation.DontOverrideEqualsAndHashCode; /** * Base for most common implementations of {@link FakeEntity}. diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index eb952b3be..27eb4f3de 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -2,8 +2,8 @@ import lombok.NonNull; import org.bukkit.plugin.Plugin; +import ru.progrm_jarvis.javacommons.annotation.DontOverrideEqualsAndHashCode; import ru.progrm_jarvis.javacommons.collection.concurrent.ConcurrentCollections; -import ru.progrm_jarvis.minecraft.commons.annotation.DontOverrideEqualsAndHashCode; import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginContainer; import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.FakeEntity; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java deleted file mode 100644 index 7631eeb3f..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/annotation/DontOverrideEqualsAndHashCode.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.annotation; - -import java.lang.annotation.*; - -/** - * Marker indicating that {@link Object#hashCode()} and {@link Object#equals(Object)} methods - * are not overridden for some reason and so (in most cases) should not be overridden. - */ -@Inherited -@Documented -@Retention(RetentionPolicy.CLASS) -@Target(value = ElementType.TYPE) -public @interface DontOverrideEqualsAndHashCode { - - /** - * The reason why this object's {@link Object#hashCode()} and {@link Object#equals(Object)} - * methods are not overridden. - * - * @return reason for not overriding {@link Object#hashCode()} and {@link Object#equals(Object)} methods - */ - String value() default ""; -} From d2001e07db31efa39a60e90ddf968e4f4427a5ea Mon Sep 17 00:00:00 2001 From: PROgrm_JARvis Date: Tue, 29 Oct 2019 21:49:00 +0300 Subject: [PATCH 278/508] Disable tests against Oracle JDK --- .travis.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index e67fb70bc..03d96bc54 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,9 +15,6 @@ jobs: - stage: test jdk: openjdk8 script: mvn -q verify - - stage: test - jdk: oraclejdk8 - script: mvn -q verify # 2. Deploy - stage: deploy @@ -32,4 +29,4 @@ jobs: # Cached directories cache: directories: - - ~/.m2/repository \ No newline at end of file + - ~/.m2/repository From 5822162a12407ce20be10d986d9af5d777efbb68 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2019 18:58:12 +0000 Subject: [PATCH 279/508] Bump version.junit.platform from 1.5.1 to 1.5.2 Bumps `version.junit.platform` from 1.5.1 to 1.5.2. Updates `junit-platform-launcher` from 1.5.1 to 1.5.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.5.1 to 1.5.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index faa1a7fc1..366ba3d57 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.0-SNAPSHOT 5.5.1 - 1.5.1 + 1.5.2 3.0.0 From 0f0665eb68df8bc1fe35199b7e0fea2b31b60fa9 Mon Sep 17 00:00:00 2001 From: PROgrammer_JARvis Date: Tue, 29 Oct 2019 22:00:28 +0300 Subject: [PATCH 280/508] Use `@FieldDefaults` better in `AbstractPlayerContainingFakeEntity` --- .../entity/AbstractPlayerContainingFakeEntity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java index 1f544bb62..5ba6a4e4e 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java @@ -14,11 +14,11 @@ * Base for most common implementations of {@link ObservableFakeEntity} containing player logic base. */ @ToString -@FieldDefaults(level = AccessLevel.PROTECTED) +@FieldDefaults(makeFinal = true, level = AccessLevel.PROTECTED) @PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.MANUAL) public abstract class AbstractPlayerContainingFakeEntity extends AbstractObservableFakeEntity { - @NonNull final Map players; + @NonNull Map players; public AbstractPlayerContainingFakeEntity(final int viewDistance, final boolean global, @NonNull final Location location, From 61527eeebfbc66a063b92a1bf36b3963633f9260 Mon Sep 17 00:00:00 2001 From: PROgrammer_JARvis Date: Tue, 29 Oct 2019 22:01:53 +0300 Subject: [PATCH 281/508] Use unmodifiable views for returned Maps' key-sets --- .../entity/AbstractPlayerContainingFakeEntity.java | 9 +++++---- .../mapimage/display/ProtocolBasedMapImageDisplay.java | 8 ++++---- .../commons/player/collection/PlayerContainers.java | 6 +++++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java index 5ba6a4e4e..0b0144dd9 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java @@ -6,9 +6,7 @@ import org.bukkit.entity.Player; import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistryRegistration; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; +import java.util.*; /** * Base for most common implementations of {@link ObservableFakeEntity} containing player logic base. @@ -19,6 +17,7 @@ public abstract class AbstractPlayerContainingFakeEntity extends AbstractObservableFakeEntity { @NonNull Map players; + @NonNull Set playersView; public AbstractPlayerContainingFakeEntity(final int viewDistance, final boolean global, @NonNull final Location location, @@ -26,12 +25,14 @@ public AbstractPlayerContainingFakeEntity(final int viewDistance, final boolean super(global, viewDistance, location); if (!players.isEmpty()) players.clear(); + this.players = players; + playersView = Collections.unmodifiableSet(players.keySet()); } @Override public Collection getPlayers() { - return players.keySet(); + return playersView; } @Override diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index 165153696..238da8156 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -13,9 +13,7 @@ import ru.progrm_jarvis.javacommons.map.MapUtil; import javax.annotation.Nonnull; -import java.util.Collection; -import java.util.Map; -import java.util.Optional; +import java.util.*; @ToString @EqualsAndHashCode @@ -24,6 +22,7 @@ public class ProtocolBasedMapImageDisplay implements MapImageDisplay { @NonNull MapImage image; @NonNull Map playerMaps; + @NonNull Set playersView; @Getter boolean global; @PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.AUTO) @@ -32,6 +31,7 @@ public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull fina @NonNull final PlayerRegistry playerRegistry) { this.image = image; this.playerMaps = playerMaps; + playersView = Collections.unmodifiableSet(playerMaps.keySet()); this.global = global; playerRegistry.register(this); @@ -121,7 +121,7 @@ public boolean containsPlayer(final Player player) { @Override public Collection getPlayers() { - return playerMaps.keySet(); + return playersView; } @Override diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java index ab105782b..73e827944 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java @@ -6,7 +6,9 @@ import org.bukkit.entity.Player; import java.util.Collection; +import java.util.Collections; import java.util.Map; +import java.util.Set; import java.util.function.Function; @UtilityClass @@ -61,6 +63,7 @@ public Collection getPlayers() { protected class PlayerContainerMapWrapper implements PlayerContainer { @NonNull private Map map; + @NonNull private Set playersView; @NonNull private Function defaultValueSupplier; boolean global; @@ -68,6 +71,7 @@ public PlayerContainerMapWrapper(@NonNull final Map map, @NonNull final Function defaultValueSupplier, final boolean global) { this.map = map; + playersView = Collections.unmodifiableSet(map.keySet()); this.defaultValueSupplier = defaultValueSupplier; this.global = global; @@ -91,7 +95,7 @@ public boolean containsPlayer(final Player player) { @Override public Collection getPlayers() { - return map.keySet(); + return playersView; } } } From 286cc660c1f7d30a5a03fd88463a8b5789b62a1f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2019 19:04:05 +0000 Subject: [PATCH 282/508] Bump version.junit from 5.5.1 to 5.5.2 Bumps `version.junit` from 5.5.1 to 5.5.2. Updates `junit-jupiter-api` from 5.5.1 to 5.5.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.5.1...r5.5.2) Updates `junit-jupiter-engine` from 5.5.1 to 5.5.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.5.1...r5.5.2) Updates `junit-jupiter-params` from 5.5.1 to 5.5.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.5.1...r5.5.2) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 366ba3d57..714da65fe 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ UTF-8 1.0-SNAPSHOT - 5.5.1 + 5.5.2 1.5.2 3.0.0 From 3577eade69befed8e52e947db47c0ff8ce8d1f00 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2019 19:14:52 +0000 Subject: [PATCH 283/508] Bump lombok from 1.18.8 to 1.18.10 Bumps [lombok](https://github.com/rzwitserloot/lombok) from 1.18.8 to 1.18.10. - [Release notes](https://github.com/rzwitserloot/lombok/releases) - [Changelog](https://github.com/rzwitserloot/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/rzwitserloot/lombok/compare/v1.18.8...v1.18.10) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 714da65fe..848506789 100644 --- a/pom.xml +++ b/pom.xml @@ -285,7 +285,7 @@ org.projectlombok lombok - 1.18.8 + 1.18.10 true From 96d4a90cd2d9c7fbbb829a1417fc530cb7dca55c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2019 19:21:12 +0000 Subject: [PATCH 284/508] Bump httpclient from 4.5.9 to 4.5.10 Bumps httpclient from 4.5.9 to 4.5.10. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 848506789..bb8f293c9 100644 --- a/pom.xml +++ b/pom.xml @@ -278,7 +278,7 @@ org.apache.httpcomponents httpclient - 4.5.9 + 4.5.10 From 0ca545beb4b4051f81130d6a3d1dc5ea08c6af83 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 29 Oct 2019 19:26:55 +0000 Subject: [PATCH 285/508] Bump version.mockito from 3.0.0 to 3.1.0 Bumps `version.mockito` from 3.0.0 to 3.1.0. Updates `mockito-core` from 3.0.0 to 3.1.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.0.0...v3.1.0) Updates `mockito-junit-jupiter` from 3.0.0 to 3.1.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.0.0...v3.1.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bb8f293c9..bbfd05764 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.5.2 1.5.2 - 3.0.0 + 3.1.0 From aeb91e5bce7b8f90b4984b830f67d609aeffad5c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2019 11:06:52 +0000 Subject: [PATCH 286/508] Bump maven-source-plugin from 3.1.0 to 3.2.0 Bumps [maven-source-plugin](https://github.com/apache/maven-source-plugin) from 3.1.0 to 3.2.0. - [Release notes](https://github.com/apache/maven-source-plugin/releases) - [Commits](https://github.com/apache/maven-source-plugin/compare/maven-source-plugin-3.1.0...maven-source-plugin-3.2.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bbfd05764..95caa0dfc 100644 --- a/pom.xml +++ b/pom.xml @@ -174,7 +174,7 @@ org.apache.maven.plugins maven-source-plugin - 3.1.0 + 3.2.0 org.apache.maven.plugins From cec658c34e3b82652f2b776e0922d62d8b207988 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 8 Nov 2019 05:25:57 +0000 Subject: [PATCH 287/508] Bump annotations from 17.0.0 to 18.0.0 Bumps [annotations](https://github.com/JetBrains/java-annotations) from 17.0.0 to 18.0.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Commits](https://github.com/JetBrains/java-annotations/compare/17.0.0...18.0.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 95caa0dfc..bf5be21a6 100644 --- a/pom.xml +++ b/pom.xml @@ -291,7 +291,7 @@ org.jetbrains annotations - 17.0.0 + 18.0.0 true From 7eabcd8612ab6b39f230bad5282ef73bad6bcb59 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 2 Dec 2019 05:28:44 +0000 Subject: [PATCH 288/508] Bump version.mockito from 3.1.0 to 3.2.0 Bumps `version.mockito` from 3.1.0 to 3.2.0. Updates `mockito-core` from 3.1.0 to 3.2.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.1.0...v3.2.0) Updates `mockito-junit-jupiter` from 3.1.0 to 3.2.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.1.0...v3.2.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bf5be21a6..6a6469e66 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.5.2 1.5.2 - 3.1.0 + 3.2.0 From c727bcb3cbad3b3a22821d8a8a08e9ff57c86758 Mon Sep 17 00:00:00 2001 From: JarvisStark Date: Thu, 5 Dec 2019 17:26:47 +0300 Subject: [PATCH 289/508] Use positive values for deploy.sh's exit codes --- deploy.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy.sh b/deploy.sh index 0bc87c3da..fe20b9e4b 100644 --- a/deploy.sh +++ b/deploy.sh @@ -6,7 +6,7 @@ echo 'Attempting to deploy artifacts if needed' echo "Branch: $TRAVIS_BRANCH" if [[ -z ${TRAVIS_BRANCH} ]]; then # Exit if $TRAVIS_BRANCH is unset echo 'Not Travis or branch undetected, exiting' - exit -1 + exit 1 else echo 'Valid branch' fi @@ -15,7 +15,7 @@ fi echo "Pull-request status: $TRAVIS_PULL_REQUEST" if [[ ${TRAVIS_PULL_REQUEST} != 'false' ]]; then # Exit if TRAVIS_PULL_REQUEST is not 'false' echo "Pull-request status should be 'false'" - exit -1 + exit 1 else echo 'Valid pull-request status' fi @@ -23,7 +23,7 @@ fi # Verify that JAVA_HOME is set if [[ -z ${JAVA_HOME} ]]; then # Exit if JAVA_HOME is unset echo 'JAVA_HOME variable is unset, exiting' - exit -1; + exit 1; fi # Get project version using special script From 40347539f6ba94d8f57060d868344afb8f8ecd59 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 17 Dec 2019 05:24:16 +0000 Subject: [PATCH 290/508] Bump version.mockito from 3.2.0 to 3.2.4 Bumps `version.mockito` from 3.2.0 to 3.2.4. Updates `mockito-core` from 3.2.0 to 3.2.4 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.2.0...v3.2.4) Updates `mockito-junit-jupiter` from 3.2.0 to 3.2.4 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.2.0...v3.2.4) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6a6469e66..c7cd60d6e 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.5.2 1.5.2 - 3.2.0 + 3.2.4 From 11f7fbe77e151d979dc0d7b557658e5ab6aadb62 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Dec 2019 05:32:42 +0000 Subject: [PATCH 291/508] Bump maven-source-plugin from 3.2.0 to 3.2.1 Bumps [maven-source-plugin](https://github.com/apache/maven-source-plugin) from 3.2.0 to 3.2.1. - [Release notes](https://github.com/apache/maven-source-plugin/releases) - [Commits](https://github.com/apache/maven-source-plugin/compare/maven-source-plugin-3.2.0...maven-source-plugin-3.2.1) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c7cd60d6e..5f749bfb9 100644 --- a/pom.xml +++ b/pom.xml @@ -174,7 +174,7 @@ org.apache.maven.plugins maven-source-plugin - 3.2.0 + 3.2.1 org.apache.maven.plugins From e104b7000ad4dd40c16ad7edc1a00d650704c714 Mon Sep 17 00:00:00 2001 From: JarvisStark Date: Sat, 28 Dec 2019 20:50:31 +0300 Subject: [PATCH 292/508] Resolve issues with builds due to non-static internal classes and get rid of `P extends Plugin` generics --- .../FakeEntityInteractionHandler.java | 4 +--- ...ocolBasedFakeEntityInteractionHandler.java | 10 ++++----- .../AbstractSetBasedEntityManager.java | 12 +++++----- .../entity/management/FakeEntityManager.java | 4 +--- .../management/FakeEntityManagerGroup.java | 22 +++++++------------ .../entity/observer/FakeEntityObserver.java | 3 +-- .../observer/PeriodicFakeEntityObserver.java | 6 ++--- .../minecraft/commons/block/BlocksChain.java | 2 +- .../commons/block/SnakyBlockChain.java | 18 +++++++-------- .../player/collection/PlayerContainers.java | 4 ++-- .../registry/DefaultPlayerRegistry.java | 6 ++--- .../commons/plugin/BukkitPluginContainer.java | 6 ++--- .../plugin/BukkitPluginShutdownUtil.java | 2 +- .../commons/plugin/BungeePluginContainer.java | 6 ++--- .../initializer/BukkitTaskInitializers.java | 2 +- 15 files changed, 44 insertions(+), 63 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionHandler.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionHandler.java index c5779281f..4937e0335 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionHandler.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionHandler.java @@ -1,8 +1,6 @@ package ru.progrm_jarvis.minecraft.fakeentitylib.entity.behaviour; -import org.bukkit.plugin.Plugin; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.management.FakeEntityManager; -public interface FakeEntityInteractionHandler

- extends FakeEntityManager { +public interface FakeEntityInteractionHandler extends FakeEntityManager { } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java index bc77e2568..a799aca52 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java @@ -25,18 +25,18 @@ @ToString(onlyExplicitlyIncluded = true) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class ProtocolBasedFakeEntityInteractionHandler

- extends PacketAdapter implements FakeEntityInteractionHandler { +public class ProtocolBasedFakeEntityInteractionHandler + extends PacketAdapter implements FakeEntityInteractionHandler { @NonNull final ProtocolManager protocolManager; - @NonNull @ToString.Include P plugin; + @NonNull @ToString.Include Plugin plugin; @NonNull Set entities; @NonNull Set entitiesView; @Delegate(types = Shutdownable.class) @NonNull ShutdownHooks shutdownHooks; - public ProtocolBasedFakeEntityInteractionHandler(@Nonnull final P plugin, final boolean concurrent) { + public ProtocolBasedFakeEntityInteractionHandler(@Nonnull final Plugin plugin, final boolean concurrent) { super( checkNotNull(plugin, "plugin should not be null"), PacketType.Play.Client.USE_ENTITY @@ -56,7 +56,7 @@ public ProtocolBasedFakeEntityInteractionHandler(@Nonnull final P plugin, final } @Override - public P getBukkitPlugin() { + public Plugin getBukkitPlugin() { return plugin; } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index fd31e08bc..c650fb418 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -20,22 +20,20 @@ /** * Simple abstract {@link FakeEntityManager} storing entities in a weak, optionally concurrent set. * - * @param

type of parent plugin * @param type of entities stored */ @ToString @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public abstract class AbstractSetBasedEntityManager

- implements FakeEntityManager { +public abstract class AbstractSetBasedEntityManager implements FakeEntityManager { - @NonNull P plugin; + @NonNull Plugin plugin; @NonNull @ToString.Exclude Set entities; @NonNull @ToString.Exclude Set entitiesView; @Delegate(types = Shutdownable.class) @NonNull final ShutdownHooks shutdownHooks; - public AbstractSetBasedEntityManager(@NonNull final P plugin, @NonNull final Set entities) { + public AbstractSetBasedEntityManager(@NonNull final Plugin plugin, @NonNull final Set entities) { this.plugin = plugin; this.entities = entities; this.entitiesView = Collections.unmodifiableSet(entities); @@ -50,12 +48,12 @@ public AbstractSetBasedEntityManager(@NonNull final P plugin, @NonNull final Set * @param plugin parent plugin of this manager * @param concurrent whether or not this map should be thread-safe */ - public AbstractSetBasedEntityManager(@Nonnull final P plugin, final boolean concurrent) { + public AbstractSetBasedEntityManager(@Nonnull final Plugin plugin, final boolean concurrent) { this(plugin, concurrent ? FakeEntityManager.concurrentWeakEntitySet() : FakeEntityManager.weakEntitySet()); } @Override - public P getBukkitPlugin() { + public Plugin getBukkitPlugin() { return plugin; } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index 27eb4f3de..170b0cc40 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -13,7 +13,6 @@ /** * Basic class for entity management providing basic general functionality for it. * - * @param

type of parent plugin * @param type of managed entity * * @implSpec its highly recommended (read necessary) for implementations @@ -21,8 +20,7 @@ * as if there are no strong references on it the GC should collect it. */ @DontOverrideEqualsAndHashCode("EntityManagers are not data objects") -public interface FakeEntityManager

- extends BukkitPluginContainer

, Shutdownable { +public interface FakeEntityManager extends BukkitPluginContainer, Shutdownable { /** * Creates a new weak {@link Set} valid (and recommended) for storing entities diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java index e4cbb4070..8bbcf0b64 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java @@ -23,20 +23,14 @@ @ToString @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) @PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.MANUAL) -public class FakeEntityManagerGroup

- extends AbstractSetBasedEntityManager { +public class FakeEntityManagerGroup extends AbstractSetBasedEntityManager { - @NonNull Collection> managers; + @NonNull Collection> managers; - @Override - public P getBukkitPlugin() { - return plugin; - } - - public FakeEntityManagerGroup(@NonNull final P plugin, + public FakeEntityManagerGroup(@NonNull final Plugin plugin, @NonNull final Set entities, - @NonNull final Collection, - ? extends FakeEntityManager>> managerCreators) { + @NonNull final Collection, + ? extends FakeEntityManager>> managerCreators) { super(plugin, entities); //noinspection unchecked @@ -47,10 +41,10 @@ public FakeEntityManagerGroup(@NonNull final P plugin, } @SafeVarargs - public FakeEntityManagerGroup(@NonNull final P plugin, + public FakeEntityManagerGroup(@NonNull final Plugin plugin, @NonNull final Set entities, - @NonNull final BiFunction, - ? extends FakeEntityManager>... managerCreators) { + @NonNull final BiFunction, + ? extends FakeEntityManager>... managerCreators) { this(plugin, entities, Arrays.asList(managerCreators)); } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java index 0afcbbdcb..0f934feb5 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/FakeEntityObserver.java @@ -8,8 +8,7 @@ * An object responsible for entity observation. * Observation is the process of controlling the entity visibility for players. * - * @param

type of parent plugin * @param type of entity managed */ -public interface FakeEntityObserver

extends FakeEntityManager { +public interface FakeEntityObserver extends FakeEntityManager { } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java index 39db8d019..4bc74f047 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java @@ -26,8 +26,8 @@ @ToString @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class PeriodicFakeEntityObserver

- extends AbstractSetBasedEntityManager implements FakeEntityObserver { +public class PeriodicFakeEntityObserver + extends AbstractSetBasedEntityManager implements FakeEntityObserver { Set tasks = new HashSet<>(); Lock lock = new ReentrantLock(); @@ -41,7 +41,7 @@ public class PeriodicFakeEntityObserver

> entitiesSetSupplier; @Builder - public PeriodicFakeEntityObserver(@Nonnull final P plugin, final boolean concurrent, + public PeriodicFakeEntityObserver(@Nonnull final Plugin plugin, final boolean concurrent, boolean global, final long interval, final boolean async, final int minEntitiesForNewThread, final int maxThreads, @NonNull final Supplier> entitiesSetSupplier) { diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/BlocksChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/BlocksChain.java index 7b1acfeaf..825202593 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/BlocksChain.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/BlocksChain.java @@ -12,7 +12,7 @@ * A chain of operations of {@link org.bukkit.block.Block}s in some {@link org.bukkit.World}. * The chain of operations */ -public interface BlocksChain

extends BukkitPluginContainer

, Iterator { +public interface BlocksChain extends BukkitPluginContainer, Iterator { /** * Gets the world in which this blocks chain exists. diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java index 6ae22db5f..b89b3fb26 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java @@ -11,9 +11,9 @@ @ToString @EqualsAndHashCode @FieldDefaults(level = AccessLevel.PROTECTED) -public abstract class SnakyBlockChain

implements BlocksChain

{ +public abstract class SnakyBlockChain implements BlocksChain { - @NonNull final P plugin; + @NonNull final Plugin plugin; @NonNull final @Getter World world; @NonNull final @Getter Block initialBlock; @@ -32,7 +32,7 @@ public abstract class SnakyBlockChain

implements BlocksChain

handledBlocks; - protected SnakyBlockChain(@NonNull final P plugin, final @NonNull Block initialBlock, + protected SnakyBlockChain(@NonNull final Plugin plugin, final @NonNull Block initialBlock, @NonNull final Queue blocks, final @NonNull Queue nextBlocks, @NonNull final Set handledBlocks) { this.plugin = plugin; @@ -45,14 +45,14 @@ protected SnakyBlockChain(@NonNull final P plugin, final @NonNull Block initialB blocks.add(initialBlock); } - protected SnakyBlockChain(@NonNull final P plugin, @NonNull final Block initialBlock) { + protected SnakyBlockChain(@NonNull final Plugin plugin, @NonNull final Block initialBlock) { this(plugin, initialBlock, new ArrayDeque<>(), new ArrayDeque<>(), new HashSet<>()); } - public static

SnakyBlockChain

create(@NonNull final P plugin, - @NonNull final Block initialBlock, - @NonNull final BlockHandler blockHandler) { - return new SnakyBlockChain

(plugin, initialBlock) { + public static SnakyBlockChain create(@NonNull final Plugin plugin, + @NonNull final Block initialBlock, + @NonNull final BlockHandler blockHandler) { + return new SnakyBlockChain(plugin, initialBlock) { @Override protected Collection handle(final Block block) { return blockHandler.handle(block); @@ -107,7 +107,7 @@ public Block next() { * @return bukkit plugin of this object */ @Override - public P getBukkitPlugin() { + public Plugin getBukkitPlugin() { return plugin; } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java index 73e827944..7d10c870e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java @@ -26,7 +26,7 @@ public PlayerContainer wrap(@NonNull final Map mapOfPlayers, } @Value - protected class PlayerContainerCollectionWrapper implements PlayerContainer { + protected static class PlayerContainerCollectionWrapper implements PlayerContainer { @NonNull private Collection collection; boolean global; @@ -60,7 +60,7 @@ public Collection getPlayers() { } @Value - protected class PlayerContainerMapWrapper implements PlayerContainer { + protected static class PlayerContainerMapWrapper implements PlayerContainer { @NonNull private Map map; @NonNull private Set playersView; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java index 96c0b6b85..448d01048 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java @@ -51,8 +51,7 @@ public DefaultPlayerRegistry(@NonNull final Plugin plugin, @NonNull final Set plugin on which this object depends */ -public interface BukkitPluginContainer

{ +public interface BukkitPluginContainer { /** * Gets the bukkit plugin contained by this object. * * @return bukkit plugin of this object */ - P getBukkitPlugin(); + Plugin getBukkitPlugin(); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java index 10db33347..4ba17c245 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -59,7 +59,7 @@ public void removeShutdownHooks(final Plugin plugin, final Collection shutdownHooks = ConcurrentCollections.concurrentList(new ArrayList<>()); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BungeePluginContainer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BungeePluginContainer.java index d11eba74c..4498c179e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BungeePluginContainer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BungeePluginContainer.java @@ -4,15 +4,13 @@ /** * An object which contains a bungeecord plugin instance. - * - * @param

plugin on which this object depends */ -public interface BungeePluginContainer

{ +public interface BungeePluginContainer { /** * Gets the bungeecord plugin contained by this object. * * @return bungeecord plugin of this object */ - P getBungeePlugin(); + Plugin getBungeePlugin(); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java index 2a32decae..1eca0d3ee 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java @@ -97,7 +97,7 @@ public BukkitTask init() { @RequiredArgsConstructor(access = AccessLevel.PROTECTED) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) - private abstract class AbstractBukkitTaskInitializer implements BukkitTaskInitializer { + private abstract static class AbstractBukkitTaskInitializer implements BukkitTaskInitializer { @NonFinal BukkitTask task; From d69c6dc2cd3b6acf9bccaa1b0a52809ee6e6b407 Mon Sep 17 00:00:00 2001 From: JarvisStark Date: Sat, 28 Dec 2019 21:07:23 +0300 Subject: [PATCH 293/508] Get rid of duplication in FakeEntity-movement related cases --- .../entity/AbstractBasicFakeEntity.java | 92 ++++++------------- .../fakeentitylib/entity/BasicFakeEntity.java | 5 + 2 files changed, 35 insertions(+), 62 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index 1bc994950..3494280b9 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -267,7 +267,6 @@ public void move(final double dx, final double dy, final double dz, final float } @Override - @SuppressWarnings("Duplicates") public void moveTo(final double x, final double y, final double z, final float yaw, final float pitch) { if (compactMoving) { final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); @@ -300,42 +299,10 @@ else if (yaw != location.getYaw() || pitch != location.getPitch()) { velocity.setY(0); velocity.setZ(0); } - } else { - var changeLocation = false; - if (x != location.getX()) { - changeLocation = true; - - location.setX(x); - } - if (y != location.getY()) { - changeLocation = true; - - location.setY(y); - } - if (z != location.getZ()) { - changeLocation = true; - - location.setZ(z); - } - var changeLook = false; - if (yaw != location.getYaw()) { - changeLook = true; - - location.setYaw(yaw); - } - if (pitch != location.getPitch()) { - changeLook = true; - - location.setPitch(pitch); - } - - if (changeLocation) performTeleportation(x, y, z, yaw, pitch, false); - else if (changeLook) performLook(yaw, pitch); - } + } else performNonCompactTeleportation(x, y, z, yaw, pitch); } @Override - @SuppressWarnings("Duplicates") public void teleport(final double x, final double y, final double z, final float yaw, final float pitch) { if (compactMoving) { final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); @@ -368,43 +335,44 @@ else if (yaw != location.getYaw() || pitch != location.getPitch()) { velocity.setY(0); velocity.setZ(0); } - } else { - var changeLocation = false; - if (x != location.getX()) { - changeLocation = true; + } else performNonCompactTeleportation(x, y, z, yaw, pitch); + } - location.setX(x); - } - if (y != location.getY()) { - changeLocation = true; + protected void performNonCompactTeleportation(final double x, final double y, final double z, + final float yaw, final float pitch) { + var changeLocation = false; + if (x != location.getX()) { + changeLocation = true; - location.setY(y); - } - if (z != location.getZ()) { - changeLocation = true; + location.setX(x); + } + if (y != location.getY()) { + changeLocation = true; - location.setZ(z); - } - var changeLook = false; - if (yaw != location.getYaw()) { - changeLook = true; + location.setY(y); + } + if (z != location.getZ()) { + changeLocation = true; - location.setYaw(yaw); - } - if (pitch != location.getPitch()) { - changeLook = true; + location.setZ(z); + } + var changeLook = false; + if (yaw != location.getYaw()) { + changeLook = true; - location.setPitch(pitch); - } + location.setYaw(yaw); + } + if (pitch != location.getPitch()) { + changeLook = true; - if (changeLocation) performTeleportation(x, y, z, yaw, pitch, false); - else if (changeLook) performLook(yaw, pitch); + location.setPitch(pitch); } + + if (changeLocation) performTeleportation(x, y, z, yaw, pitch, false); + else if (changeLook) performLook(yaw, pitch); } - /** - * Performs the location synchronization so that the clients surely have the exact location of the entity. - */ + @Override public void syncLocation() { performTeleportation( location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch(), false diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java index baae83f8b..99c143ff9 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java @@ -67,6 +67,11 @@ default void teleport(@NonNull final Location location) { teleport(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); } + /** + * Performs the location synchronization so that the clients surely have the exact location of the entity. + */ + void syncLocation(); + /////////////////////////////////////////////////////////////////////////// // Metadata /////////////////////////////////////////////////////////////////////////// From 08d83f2beb077462ed376a35309322f947b877ce Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2020 05:37:07 +0000 Subject: [PATCH 294/508] Bump httpclient from 4.5.10 to 4.5.11 Bumps httpclient from 4.5.10 to 4.5.11. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5f749bfb9..20f5bda0e 100644 --- a/pom.xml +++ b/pom.xml @@ -278,7 +278,7 @@ org.apache.httpcomponents httpclient - 4.5.10 + 4.5.11 From 367b56d4fd8184374803d8e934211e6b4be7bf91 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2020 05:28:15 +0000 Subject: [PATCH 295/508] Bump version.junit.platform from 1.5.2 to 1.6.0 Bumps `version.junit.platform` from 1.5.2 to 1.6.0. Updates `junit-platform-launcher` from 1.5.2 to 1.6.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.5.2 to 1.6.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 20f5bda0e..185bcf201 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.0-SNAPSHOT 5.5.2 - 1.5.2 + 1.6.0 3.2.4 From 1af88735d64e774a265a42aeb43dc60471e82479 Mon Sep 17 00:00:00 2001 From: PROgrammer_JARvis Date: Sun, 9 Feb 2020 17:05:27 +0300 Subject: [PATCH 296/508] Resolve issues with `InvokeUtil` --- .../minecraft/commons/mapimage/display/PlayerMapManager.java | 2 +- .../java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java index d9d9b66d5..8321e56a7 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java @@ -10,9 +10,9 @@ import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.map.MapView; +import ru.progrm_jarvis.javacommons.invoke.InvokeUtil; import ru.progrm_jarvis.minecraft.commons.MinecraftCommons; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; -import ru.progrm_jarvis.reflector.invoke.InvokeUtil; import java.io.File; import java.io.IOException; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java index 88cc0810e..507d2c3fe 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java @@ -4,10 +4,10 @@ import lombok.*; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; +import ru.progrm_jarvis.javacommons.invoke.InvokeUtil; import ru.progrm_jarvis.minecraft.commons.nms.metadata.DataWatcherFactory; import ru.progrm_jarvis.minecraft.commons.nms.metadata.LegacyDataWatcherFactory; import ru.progrm_jarvis.minecraft.commons.nms.metadata.StandardDataWatcherFactory; -import ru.progrm_jarvis.reflector.invoke.InvokeUtil; import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; From 51ea10a5aef8f9a9be6347ab67f7b6a5c95f10f6 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 9 Feb 2020 14:13:29 +0000 Subject: [PATCH 297/508] Bump lombok from 1.18.10 to 1.18.12 Bumps [lombok](https://github.com/rzwitserloot/lombok) from 1.18.10 to 1.18.12. - [Release notes](https://github.com/rzwitserloot/lombok/releases) - [Changelog](https://github.com/rzwitserloot/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/rzwitserloot/lombok/compare/v1.18.10...v1.18.12) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 185bcf201..8f0761764 100644 --- a/pom.xml +++ b/pom.xml @@ -285,7 +285,7 @@ org.projectlombok lombok - 1.18.10 + 1.18.12 true From 665c0efb264a39f80eb3ee5ada79e2d4509e6f67 Mon Sep 17 00:00:00 2001 From: PROgrammer_JARvis Date: Sun, 9 Feb 2020 17:19:28 +0300 Subject: [PATCH 298/508] Fix logical issues in AbstractPlayerContainingFakeEntity (fixes #59) --- .../entity/AbstractPlayerContainingFakeEntity.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java index 0b0144dd9..0a736edea 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java @@ -58,7 +58,7 @@ public void removePlayer(final Player player) { val canSee = players.get(player); if (canSee != null) { if (canSee) unrender(player); - else players.remove(player); + players.remove(player); } } @@ -102,8 +102,8 @@ public void attemptRerender(final Player player) { if (sees == null) return; if (sees) { - if (!shouldSee(player)) render(player); - } else if (shouldSee(player)) unrender(player); + if (!shouldSee(player)) unrender(player); + } else if (shouldSee(player)) render(player); } From e0597b47a94b2558608646416b97106901390569 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 13 Feb 2020 05:26:05 +0000 Subject: [PATCH 299/508] Bump maven-shade-plugin from 3.2.1 to 3.2.2 Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.2.1 to 3.2.2. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.2.1...maven-shade-plugin-3.2.2) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8f0761764..cb92bf35f 100644 --- a/pom.xml +++ b/pom.xml @@ -109,7 +109,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.1 + 3.2.2 package From 4370e5370d5a78c13f7a8dce4a922e3397d6d6ca Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 17 Feb 2020 05:39:25 +0000 Subject: [PATCH 300/508] Bump annotations from 18.0.0 to 19.0.0 Bumps [annotations](https://github.com/JetBrains/java-annotations) from 18.0.0 to 19.0.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Commits](https://github.com/JetBrains/java-annotations/compare/18.0.0...19.0.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cb92bf35f..1d3e13796 100644 --- a/pom.xml +++ b/pom.xml @@ -291,7 +291,7 @@ org.jetbrains annotations - 18.0.0 + 19.0.0 true From fafd6dbbad9f8833953e96f9d18ffde43402a9d3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2020 05:36:21 +0000 Subject: [PATCH 301/508] Bump version.mockito from 3.2.4 to 3.3.0 Bumps `version.mockito` from 3.2.4 to 3.3.0. Updates `mockito-core` from 3.2.4 to 3.3.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.2.4...v3.3.0) Updates `mockito-junit-jupiter` from 3.2.4 to 3.3.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.2.4...v3.3.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1d3e13796..1cea681c1 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.5.2 1.6.0 - 3.2.4 + 3.3.0 From bf7f2f8f19c5c3363a45839a886a41ef77284077 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 9 Mar 2020 05:51:44 +0000 Subject: [PATCH 302/508] Bump httpclient from 4.5.11 to 4.5.12 Bumps httpclient from 4.5.11 to 4.5.12. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1cea681c1..772d60f85 100644 --- a/pom.xml +++ b/pom.xml @@ -278,7 +278,7 @@ org.apache.httpcomponents httpclient - 4.5.11 + 4.5.12 From 3354166a6f8ba4c2a42a6d3ffaa45a5c94797806 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2020 05:33:43 +0000 Subject: [PATCH 303/508] Bump maven-javadoc-plugin from 3.1.1 to 3.2.0 Bumps [maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.1.1 to 3.2.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.1.1...maven-javadoc-plugin-3.2.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 772d60f85..15006bbfa 100644 --- a/pom.xml +++ b/pom.xml @@ -179,7 +179,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.1.1 + 3.2.0 none From 907fa6c2737a7881f2213f55afaef719bba22dd0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 16 Mar 2020 05:38:22 +0000 Subject: [PATCH 304/508] Bump version.mockito from 3.3.0 to 3.3.3 Bumps `version.mockito` from 3.3.0 to 3.3.3. Updates `mockito-core` from 3.3.0 to 3.3.3 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.3.0...v3.3.3) Updates `mockito-junit-jupiter` from 3.3.0 to 3.3.3 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.3.0...v3.3.3) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 15006bbfa..0e1919d9d 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.5.2 1.6.0 - 3.3.0 + 3.3.3 From 3490982f0108a7c8738a22cea434a8bfb5bc0a0a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2020 05:56:35 +0000 Subject: [PATCH 305/508] Bump version.junit.platform from 1.6.0 to 1.6.1 Bumps `version.junit.platform` from 1.6.0 to 1.6.1. Updates `junit-platform-launcher` from 1.6.0 to 1.6.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.6.0 to 1.6.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0e1919d9d..0a80a234b 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.0-SNAPSHOT 5.5.2 - 1.6.0 + 1.6.1 3.3.3 From 87b045e9037120d402a7bc9db156981a38011f22 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2020 05:45:20 +0000 Subject: [PATCH 306/508] Bump version.junit.platform from 1.6.1 to 1.6.2 Bumps `version.junit.platform` from 1.6.1 to 1.6.2. Updates `junit-platform-launcher` from 1.6.1 to 1.6.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.6.1 to 1.6.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0a80a234b..e85dac6f3 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.0-SNAPSHOT 5.5.2 - 1.6.1 + 1.6.2 3.3.3 From 67cc224b85902f2da9b0538a51b6ee6f566b3419 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2020 05:32:04 +0000 Subject: [PATCH 307/508] Bump maven-shade-plugin from 3.2.2 to 3.2.3 Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.2.2 to 3.2.3. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.2.2...maven-shade-plugin-3.2.3) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e85dac6f3..f3785862c 100644 --- a/pom.xml +++ b/pom.xml @@ -109,7 +109,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.2 + 3.2.3 package From f69b25263f9f9cd284b353c0f4eee3ace8df54f4 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Thu, 16 Apr 2020 23:12:40 +0300 Subject: [PATCH 308/508] Add more OOP-analogs of `BukkitRunnable` --- .../task/AbstractSchedulerRunnable.java | 84 +++++++++++++++++++ .../schedule/task/SchedulerRunnable.java | 28 +++++++ 2 files changed, 112 insertions(+) create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/AbstractSchedulerRunnable.java create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/SchedulerRunnable.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/AbstractSchedulerRunnable.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/AbstractSchedulerRunnable.java new file mode 100644 index 000000000..81fefa245 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/AbstractSchedulerRunnable.java @@ -0,0 +1,84 @@ +package ru.progrm_jarvis.minecraft.commons.schedule.task; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.Synchronized; +import lombok.experimental.FieldDefaults; +import lombok.experimental.NonFinal; +import org.bukkit.plugin.Plugin; +import org.bukkit.scheduler.BukkitTask; +import org.jetbrains.annotations.NotNull; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public abstract class AbstractSchedulerRunnable implements SchedulerRunnable { + + @NonFinal volatile BukkitTask task = null; + @SuppressWarnings("ZeroLengthArrayAllocation") Object taskAccessLock = new Object[0]; + + @Override + @Synchronized("taskAccessLock") + public boolean isCancelled() { + final BukkitTask task; + if ((task = this.task) == null) throw new IllegalStateException("This task has not yet started"); + + return task.isCancelled(); + } + + @Override + @Synchronized("taskAccessLock") + public void cancel() { + final BukkitTask task; + if ((task = this.task) == null) throw new IllegalStateException("This task has not yet started"); + + task.cancel(); + } + + @Override + @Synchronized("taskAccessLock") + public BukkitTask runTask(@NotNull final Plugin plugin) { + if (task != null) throw new IllegalStateException("This task has already started"); + + return task = plugin.getServer().getScheduler().runTask(plugin, this); + } + + @Override + @Synchronized("taskAccessLock") + public BukkitTask runTaskAsynchronously(@NotNull final Plugin plugin) { + if (task != null) throw new IllegalStateException("This task has already started"); + + return task = plugin.getServer().getScheduler().runTaskAsynchronously(plugin, this); + } + + @Override + @Synchronized("taskAccessLock") + public BukkitTask runTaskLater(@NotNull final Plugin plugin, final long delay) { + if (task != null) throw new IllegalStateException("This task has already started"); + + return task = plugin.getServer().getScheduler().runTaskLater(plugin, this, delay); + } + + @Override + @Synchronized("taskAccessLock") + public BukkitTask runTaskLaterAsynchronously(@NotNull final Plugin plugin, final long delay) { + if (task != null) throw new IllegalStateException("This task has already started"); + + return task = plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, this, delay); + } + + @Override + @Synchronized("taskAccessLock") + public BukkitTask runTaskTimer(@NotNull final Plugin plugin, final long delay, final long period) { + if (task != null) throw new IllegalStateException("This task has already started"); + + return task = plugin.getServer().getScheduler().runTaskTimer(plugin, this, delay, period); + } + + @Override + @Synchronized("taskAccessLock") + public BukkitTask runTaskTimerAsynchronously(@NotNull final Plugin plugin, final long delay, final long period) { + if (task != null) throw new IllegalStateException("This task has already started"); + + return task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, this, delay, period); + } +} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/SchedulerRunnable.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/SchedulerRunnable.java new file mode 100644 index 000000000..8cf1921a8 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/SchedulerRunnable.java @@ -0,0 +1,28 @@ +package ru.progrm_jarvis.minecraft.commons.schedule.task; + +import org.bukkit.plugin.Plugin; +import org.bukkit.scheduler.BukkitTask; +import org.jetbrains.annotations.NotNull; + +/** + * An abstraction duplicating behaviour of {@link org.bukkit.scheduler.BukkitRunnable} + * except for {@link org.bukkit.scheduler.BukkitRunnable#getTaskId()} method. + */ +public interface SchedulerRunnable extends Runnable { + + boolean isCancelled(); + + void cancel(); + + BukkitTask runTask(@NotNull Plugin plugin); + + BukkitTask runTaskAsynchronously(@NotNull Plugin plugin); + + BukkitTask runTaskLater(@NotNull Plugin plugin, long delay); + + BukkitTask runTaskLaterAsynchronously(@NotNull Plugin plugin, long delay); + + BukkitTask runTaskTimer(@NotNull Plugin plugin, long delay, long period); + + BukkitTask runTaskTimerAsynchronously(@NotNull Plugin plugin, long delay, long period); +} From a92a4882ea0fcb7e5be9147b0084f9fd4fb7c029 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Thu, 16 Apr 2020 23:12:57 +0300 Subject: [PATCH 309/508] Use `SchedulerRunnable` in timers --- .../task/counter/BukkitCallbackTimer.java | 26 ++++++++++------- .../schedule/task/counter/BukkitTimer.java | 16 ++++++++-- .../ConcurrentBukkitCallbackTimer.java | 29 +++++++++++-------- .../task/counter/ConcurrentBukkitTimer.java | 19 ++++++++++-- 4 files changed, 62 insertions(+), 28 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java index 2b3fa401b..6b76fb8c8 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java @@ -1,30 +1,34 @@ package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; -import lombok.AccessLevel; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; +import lombok.*; import lombok.experimental.FieldDefaults; import lombok.experimental.NonFinal; -import lombok.val; import org.bukkit.scheduler.BukkitRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; import java.util.function.LongConsumer; /** - * A {@link BukkitRunnable} which is run for a specified amount of times after which it is cancelled. + * A {@link ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable} + * which is run for a specified amount of times after which it is cancelled. */ -@RequiredArgsConstructor +@AllArgsConstructor(access = AccessLevel.PROTECTED) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class BukkitCallbackTimer extends BukkitRunnable { +public class BukkitCallbackTimer extends AbstractSchedulerRunnable { - @NonNull LongConsumer callback; + @NonNull LongConsumer task; @NonFinal long counter; @Override public void run() { - val value = --counter; + final long value; - if (value == 0) cancel(); - callback.accept(value); + if ((value = --counter) == 0) cancel(); + task.accept(value); + } + + public static SchedulerRunnable create(@NonNull final LongConsumer task, final long counter) { + return new BukkitCallbackTimer(task, counter); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java index d4e073c13..a55f76aa2 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java @@ -1,18 +1,24 @@ package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; import lombok.experimental.NonFinal; import org.bukkit.scheduler.BukkitRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; + +import java.util.function.LongConsumer; /** - * A {@link BukkitRunnable} which is run for a specified amount of times after which it is cancelled. + * A {@link ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable} + * which is run for a specified amount of times after which it is cancelled. */ -@RequiredArgsConstructor +@AllArgsConstructor(access = AccessLevel.PROTECTED) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class BukkitTimer extends BukkitRunnable { +public class BukkitTimer extends AbstractSchedulerRunnable { @NonNull Runnable task; @NonFinal long counter; @@ -22,4 +28,8 @@ public void run() { if (--counter == 0) cancel(); task.run(); } + + public static SchedulerRunnable create(@NonNull final Runnable task, final long counter) { + return new BukkitTimer(task, counter); + } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java index 4ca571401..39d6f4230 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java @@ -1,33 +1,38 @@ package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; -import lombok.AccessLevel; -import lombok.NonNull; +import lombok.*; import lombok.experimental.FieldDefaults; -import lombok.val; import org.bukkit.scheduler.BukkitRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; import java.util.concurrent.atomic.AtomicLong; import java.util.function.LongConsumer; /** - * A {@link BukkitRunnable} which is run for a specified amount of times after which it is cancelled. + * A {@link ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable} + * which is run for a specified amount of times after which it is cancelled. */ +@AllArgsConstructor(access = AccessLevel.PROTECTED) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class ConcurrentBukkitCallbackTimer extends BukkitRunnable { +public class ConcurrentBukkitCallbackTimer extends AbstractSchedulerRunnable { - @NonNull LongConsumer callback; + @NonNull LongConsumer task; @NonNull AtomicLong counter; - public ConcurrentBukkitCallbackTimer(@NonNull final LongConsumer callback, final long counter) { - this.callback = callback; - this.counter = new AtomicLong(counter); - } - @Override public void run() { val value = counter.decrementAndGet(); if (counter.decrementAndGet() == 0) cancel(); - callback.accept(value); + task.accept(value); + } + + public static SchedulerRunnable create(@NonNull final LongConsumer task, final long counter) { + return new ConcurrentBukkitCallbackTimer(task, new AtomicLong(counter)); + } + + public static SchedulerRunnable create(@NonNull final LongConsumer task, @NonNull final AtomicLong counter) { + return new ConcurrentBukkitCallbackTimer(task, counter); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java index eac593424..24fa40dd3 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java @@ -1,17 +1,24 @@ package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.NonNull; +import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; import org.bukkit.scheduler.BukkitRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.LongConsumer; /** - * A {@link BukkitRunnable} which is run for a specified amount of times after which it is cancelled. + * A {@link ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable} + * which is run for a specified amount of times after which it is cancelled. */ +@AllArgsConstructor(access = AccessLevel.PROTECTED) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class ConcurrentBukkitTimer extends BukkitRunnable { +public class ConcurrentBukkitTimer extends AbstractSchedulerRunnable { @NonNull Runnable task; @NonNull AtomicLong counter; @@ -26,4 +33,12 @@ public void run() { if (counter.decrementAndGet() == 0) cancel(); task.run(); } + + public static SchedulerRunnable create(@NonNull final Runnable task, final long counter) { + return new ConcurrentBukkitTimer(task, new AtomicLong(counter)); + } + + public static SchedulerRunnable create(@NonNull final Runnable task, @NonNull final AtomicLong counter) { + return new ConcurrentBukkitTimer(task, counter); + } } From 5fa6c37c62a0d9ffe895de4ae8fd0b9244fc020b Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Thu, 16 Apr 2020 23:24:40 +0300 Subject: [PATCH 310/508] Get rid of any BukkitRunnable dependencies (except for mentioning docs) --- .../observer/PeriodicFakeEntityObserver.java | 6 +++--- .../commons/schedule/misc/SchedulerGroup.java | 4 ++-- .../task/counter/BukkitCallbackTimer.java | 5 +++-- .../schedule/task/counter/BukkitTimer.java | 4 ---- .../ConcurrentBukkitCallbackTimer.java | 6 ++++-- .../task/counter/ConcurrentBukkitTimer.java | 3 --- .../initializer/BukkitTaskInitializers.java | 21 +++++++++---------- 7 files changed, 22 insertions(+), 27 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java index 4bc74f047..0e3f12b23 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java @@ -6,7 +6,7 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.Plugin; -import org.bukkit.scheduler.BukkitRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.ObservableFakeEntity; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.management.AbstractSetBasedEntityManager; @@ -137,7 +137,7 @@ public void unmanageEntity(@NonNull final E entity) { while (iterator.hasNext()) { val task = iterator.next(); if (task.removeEntity(entity)) { - if (task.entities.size() == 0) iterator.remove(); + if (task.entities.isEmpty()) iterator.remove(); break; } @@ -149,7 +149,7 @@ public void unmanageEntity(@NonNull final E entity) { @ToString @EqualsAndHashCode(callSuper = true) - protected class RedrawEntitiesRunnable extends BukkitRunnable { + protected class RedrawEntitiesRunnable extends AbstractSchedulerRunnable { protected final Collection entities = entitiesSetSupplier.get(); private final ReadWriteLock lock = new ReentrantReadWriteLock(); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java index 8598de23f..acc4d47dd 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java @@ -2,13 +2,13 @@ import lombok.NonNull; import lombok.val; -import org.bukkit.scheduler.BukkitRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; import java.util.ArrayList; import java.util.Collection; import java.util.function.Predicate; -public abstract class SchedulerGroup extends BukkitRunnable { +public abstract class SchedulerGroup extends AbstractSchedulerRunnable { public abstract int size(); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java index 6b76fb8c8..22a3e09f3 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java @@ -1,9 +1,10 @@ package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; -import lombok.*; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NonNull; import lombok.experimental.FieldDefaults; import lombok.experimental.NonFinal; -import org.bukkit.scheduler.BukkitRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java index a55f76aa2..23ef89000 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java @@ -3,15 +3,11 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.NonNull; -import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; import lombok.experimental.NonFinal; -import org.bukkit.scheduler.BukkitRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; -import java.util.function.LongConsumer; - /** * A {@link ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable} * which is run for a specified amount of times after which it is cancelled. diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java index 39d6f4230..35d2d646c 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java @@ -1,8 +1,10 @@ package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; -import lombok.*; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NonNull; import lombok.experimental.FieldDefaults; -import org.bukkit.scheduler.BukkitRunnable; +import lombok.val; import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java index 24fa40dd3..dbe0a1198 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java @@ -3,14 +3,11 @@ import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.NonNull; -import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; -import org.bukkit.scheduler.BukkitRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; import java.util.concurrent.atomic.AtomicLong; -import java.util.function.LongConsumer; /** * A {@link ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java index 1eca0d3ee..91d91db0e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java @@ -6,10 +6,9 @@ import lombok.experimental.FieldDefaults; import lombok.experimental.NonFinal; import lombok.experimental.UtilityClass; -import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; -import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; +import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; @UtilityClass public class BukkitTaskInitializers { @@ -21,14 +20,14 @@ public BukkitTaskInitializer createTaskInitializer(@NonNull final Plugin plugin, @Override public BukkitTask init() { return async - ? Bukkit.getScheduler().runTaskAsynchronously(plugin, runnable) - : Bukkit.getScheduler().runTask(plugin, runnable); + ? plugin.getServer().getScheduler().runTaskAsynchronously(plugin, runnable) + : plugin.getServer().getScheduler().runTask(plugin, runnable); } }; } public BukkitTaskInitializer createTaskInitializer(@NonNull final Plugin plugin, final boolean async, - @NonNull final BukkitRunnable runnable) { + @NonNull final SchedulerRunnable runnable) { return new AbstractBukkitTaskInitializer() { @Override @@ -46,15 +45,15 @@ public BukkitTaskInitializer createTimerTaskInitializer(@NonNull final Plugin pl @Override public BukkitTask init() { return task = async - ? Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, runnable, delay, period) - : Bukkit.getScheduler().runTaskTimer(plugin, runnable, delay, period); + ? plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, runnable, delay, period) + : plugin.getServer().getScheduler().runTaskTimer(plugin, runnable, delay, period); } }; } public BukkitTaskInitializer createTimerTaskInitializer(@NonNull final Plugin plugin, final boolean async, final long delay, final long period, - @NonNull final BukkitRunnable runnable) { + @NonNull final SchedulerRunnable runnable) { return new AbstractBukkitTaskInitializer() { @Override @@ -74,15 +73,15 @@ public BukkitTaskInitializer createDelayedTaskInitializer(@NonNull final Plugin @Override public BukkitTask init() { return task = async - ? Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, runnable, delay) - : Bukkit.getScheduler().runTaskLater(plugin, runnable, delay); + ? plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, runnable, delay) + : plugin.getServer().getScheduler().runTaskLater(plugin, runnable, delay); } }; } public BukkitTaskInitializer createDelayedTaskInitializer(@NonNull final Plugin plugin, final boolean async, final long delay, - @NonNull final BukkitRunnable runnable) { + @NonNull final SchedulerRunnable runnable) { return new AbstractBukkitTaskInitializer() { From ebe57b287c98950c807271d243391695abeb826c Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 17 Apr 2020 00:55:01 +0300 Subject: [PATCH 311/508] Minimize dependency on Bukkit singleton and fix minor issues --- .../commons/async/BukkitSchedulerAsyncRunner.java | 3 +-- .../minecraft/commons/event/FluentBukkitEvents.java | 7 ++++--- .../commons/mapimage/display/PlayerMapManager.java | 2 +- .../commons/player/registry/DefaultPlayerRegistry.java | 5 ++--- .../minecraft/commons/plugin/BukkitPluginShutdownUtil.java | 3 +-- .../minecraft/commons/schedule/misc/SchedulerGroups.java | 3 +-- 6 files changed, 10 insertions(+), 13 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java index 1a619d0cb..67466396f 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java @@ -2,7 +2,6 @@ import lombok.*; import lombok.experimental.FieldDefaults; -import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedRunnable; @@ -22,6 +21,6 @@ public class BukkitSchedulerAsyncRunner implements AsyncRunner { @Override public void runAsynchronously(final UncheckedRunnable operation) { - Bukkit.getScheduler().runTaskAsynchronously(plugin, operation); + plugin.getServer().getScheduler().runTaskAsynchronously(plugin, operation); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java index 3e36aa93e..0380f93fd 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java @@ -12,6 +12,7 @@ import org.bukkit.plugin.EventExecutor; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; +import org.jetbrains.annotations.NotNull; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; @@ -113,7 +114,7 @@ public Shutdownable register(@NonNull final UncheckedConsumer listener) { */ @Value @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - private static final class EventListenersGroup implements Listener, EventExecutor { + private static class EventListenersGroup implements Listener, EventExecutor { /** * Plugin managing these event listeners @@ -155,7 +156,7 @@ private void removeListener(@NonNull final UncheckedConsumer listener) { } @Override - public void execute(final Listener listener, final Event event) { + public void execute(@NotNull final Listener listener, final Event event) { if (configuration.type.isAssignableFrom(event.getClass())) { @SuppressWarnings("unchecked") val castEvent = (E) event; for (val eventListener : eventListeners) eventListener.accept(castEvent); @@ -164,7 +165,7 @@ public void execute(final Listener listener, final Event event) { } @Value - private static final class ListenerConfiguration { + private static class ListenerConfiguration { @NonNull final Plugin plugin; @NonNull final Class type; @NonNull final EventPriority priority; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java index 8321e56a7..554e22415 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java @@ -137,7 +137,7 @@ else throw new IllegalStateException( .collect(Collectors.toSet()); // HashSet is used by default Bukkit.getLogger().info( - "Loaded " + ALLOCATED_MAPS.size() + " internally allocated world map IDs: "+ ALLOCATED_MAPS.toString() + "Loaded " + ALLOCATED_MAPS.size() + " internally allocated world map IDs: " + ALLOCATED_MAPS ); } else { try { diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java index 448d01048..de685e04f 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java @@ -3,7 +3,6 @@ import com.google.common.base.Preconditions; import lombok.*; import lombok.experimental.FieldDefaults; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -81,7 +80,7 @@ public DefaultPlayerRegistry(@NonNull final Plugin plugin) { public void addPlayer(final Player player, final boolean force) { players.add(player); - Bukkit.getScheduler().runTask(plugin, () -> { + plugin.getServer().getScheduler().runTask(plugin, () -> { playerContainersReadLock.lock(); try { for (val playerContainer : playerContainers) if (force || playerContainer.isGlobal()) playerContainer @@ -101,7 +100,7 @@ public void addPlayer(final Player player) { public void removePlayer(final Player player) { players.remove(player); - Bukkit.getScheduler().runTask(plugin, () -> { + plugin.getServer().getScheduler().runTask(plugin, () -> { playerContainersReadLock.lock(); try { for (val playerContainer : playerContainers) playerContainer.removePlayer(player); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java index 4ba17c245..0b5ba1a39 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -6,7 +6,6 @@ import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; import lombok.val; -import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.server.PluginDisableEvent; @@ -66,7 +65,7 @@ private static class PluginShutdownHandler implements Listener { private PluginShutdownHandler(@NonNull final Plugin plugin) { this.plugin = plugin; - Bukkit.getPluginManager().registerEvents(this, plugin); + plugin.getServer().getPluginManager().registerEvents(this, plugin); } @EventHandler(ignoreCancelled = true) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java index 9cd5abd5f..bc5f735ca 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java @@ -6,7 +6,6 @@ import lombok.*; import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; -import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.server.PluginDisableEvent; @@ -58,7 +57,7 @@ public MultimapBasedKeyedSchedulerGroup(@NonNull final Plugin plugin, final bool this.tasks = tasks; // set up plugin disable hook - Bukkit.getPluginManager().registerEvents(new Listener() { + plugin.getServer().getPluginManager().registerEvents(new Listener() { @EventHandler public void onPluginDisable(final PluginDisableEvent event) { From e303107bccd37b07319dc8cb6be06ea6e0481d39 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 17 Apr 2020 01:23:16 +0300 Subject: [PATCH 312/508] Cleanup install-git-dependencies.sh --- install-git-dependencies.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/install-git-dependencies.sh b/install-git-dependencies.sh index 2ce6a259c..9c3a4a61a 100644 --- a/install-git-dependencies.sh +++ b/install-git-dependencies.sh @@ -6,7 +6,7 @@ readonly DIRECTORY='___locally_built_dependencies___' # Resets the selected directory to the ROOT_DIRECTORY function reset_directory() { - cd $ROOT_DIRECTORY + cd "$ROOT_DIRECTORY" || exit } # Installs dependency using HTTPS-Git and Maven @@ -17,10 +17,10 @@ function reset_directory() { function install_dependency() { local url="https://$1/$2.git" echo "Installing dependency from $url ($3)" - git clone --single-branch --branch $3 $url - cd $2 - if [ ! -z $4 ]; then - cd $4 + git clone --single-branch --branch "$3" "$url" + cd "$2" || exit + if [ -n "$4" ]; then + cd $4 || exit fi echo "Building..." @@ -36,6 +36,6 @@ echo "Root directory set to $ROOT_DIRECTORY" echo "Creating directory $DIRECTORY" mkdir $DIRECTORY echo 'Directory created' -cd $DIRECTORY +cd $DIRECTORY || exit install_dependency "github.com/JarvisCraft" "PacketWrapper" "legacy-support" "PacketWrapper" \ No newline at end of file From 44394db290b0bdd0d98121565d34f1a8b70dafcf Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 17 Apr 2020 01:35:18 +0300 Subject: [PATCH 313/508] Add p parameter to mkdir --- install-git-dependencies.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) mode change 100644 => 100755 install-git-dependencies.sh diff --git a/install-git-dependencies.sh b/install-git-dependencies.sh old mode 100644 new mode 100755 index 9c3a4a61a..4b3459c2e --- a/install-git-dependencies.sh +++ b/install-git-dependencies.sh @@ -1,6 +1,5 @@ #!/usr/bin/env bash - readonly ROOT_DIRECTORY=$(pwd) readonly DIRECTORY='___locally_built_dependencies___' @@ -34,7 +33,7 @@ echo 'Installing special dependencies' echo "Root directory set to $ROOT_DIRECTORY" echo "Creating directory $DIRECTORY" -mkdir $DIRECTORY +mkdir -p $DIRECTORY echo 'Directory created' cd $DIRECTORY || exit From 33eea874870cb308dd64b74e4129a386cecb4b3f Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 17 Apr 2020 02:50:46 +0300 Subject: [PATCH 314/508] Change package of timer API --- .../schedule/task/{counter => timer}/BukkitCallbackTimer.java | 2 +- .../commons/schedule/task/{counter => timer}/BukkitTimer.java | 2 +- .../task/{counter => timer}/ConcurrentBukkitCallbackTimer.java | 2 +- .../schedule/task/{counter => timer}/ConcurrentBukkitTimer.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/{counter => timer}/BukkitCallbackTimer.java (94%) rename minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/{counter => timer}/BukkitTimer.java (93%) rename minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/{counter => timer}/ConcurrentBukkitCallbackTimer.java (95%) rename minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/{counter => timer}/ConcurrentBukkitTimer.java (95%) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java similarity index 94% rename from minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java index 22a3e09f3..372f06e4f 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; +package ru.progrm_jarvis.minecraft.commons.schedule.task.timer; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java similarity index 93% rename from minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java index 23ef89000..8aa07fdc2 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/BukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; +package ru.progrm_jarvis.minecraft.commons.schedule.task.timer; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java similarity index 95% rename from minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java index 35d2d646c..540f9ca33 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; +package ru.progrm_jarvis.minecraft.commons.schedule.task.timer; import lombok.AccessLevel; import lombok.AllArgsConstructor; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java similarity index 95% rename from minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java index dbe0a1198..e7caf250c 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/counter/ConcurrentBukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java @@ -1,4 +1,4 @@ -package ru.progrm_jarvis.minecraft.commons.schedule.task.counter; +package ru.progrm_jarvis.minecraft.commons.schedule.task.timer; import lombok.AccessLevel; import lombok.AllArgsConstructor; From 23e972a5de8252611776f6e12a37df95c162da56 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 17 Apr 2020 02:51:02 +0300 Subject: [PATCH 315/508] Actualize ProtocolLib-related dependencies --- fake-entity-lib/pom.xml | 2 +- minecraft-commons/pom.xml | 2 +- pom.xml | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index fcf4902d7..c2102755c 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -32,7 +32,7 @@ com.comphenix.protocol - ProtocolLib-API + ProtocolLib com.comphenix.packetwrapper diff --git a/minecraft-commons/pom.xml b/minecraft-commons/pom.xml index eca324ebb..6cc38c6f3 100644 --- a/minecraft-commons/pom.xml +++ b/minecraft-commons/pom.xml @@ -56,7 +56,7 @@ com.comphenix.protocol - ProtocolLib-API + ProtocolLib com.mojang diff --git a/pom.xml b/pom.xml index f3785862c..8b1e900a9 100644 --- a/pom.xml +++ b/pom.xml @@ -89,7 +89,7 @@ dmulloy2-repo - http://repo.dmulloy2.net/nexus/repository/public/ + https://repo.dmulloy2.net/nexus/repository/public/ @@ -251,8 +251,8 @@ com.comphenix.protocol - ProtocolLib-API - 4.4.0 + ProtocolLib + 4.5.0 provided From dda578cdc8f24009b857065bc3f2c1ac3b5e2348 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 17 Apr 2020 11:30:35 +0300 Subject: [PATCH 316/508] Add `CancellingBukkitRunnable` --- .../task/CancellingBukkitRunnable.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java new file mode 100644 index 000000000..f87ea6b49 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java @@ -0,0 +1,38 @@ +package ru.progrm_jarvis.minecraft.commons.schedule.task; + +import lombok.*; +import lombok.experimental.FieldDefaults; +import org.jetbrains.annotations.NotNull; + +import java.util.function.BooleanSupplier; + +/** + * A {@link ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable} + * which is run until its hook returns {@code false} on tick. + */ +@FieldDefaults(level = AccessLevel.PROTECTED) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public abstract class CancellingBukkitRunnable extends AbstractSchedulerRunnable { + + @Override + public void run() { + if (tick()) cancel(); + } + + protected abstract boolean tick(); + + public static SchedulerRunnable create(@NonNull BooleanSupplier task) { + return new FunctionalCancellingBukkitRunnable(task); + } + + @AllArgsConstructor(access = AccessLevel.PRIVATE) // `RequiredArgsConstructor` is not used as field is `@NotNull` + private static final class FunctionalCancellingBukkitRunnable extends CancellingBukkitRunnable { + + @NotNull BooleanSupplier task; + + @Override + protected boolean tick() { + return task.getAsBoolean(); + } + } +} From bb98c5d6e61a7862cf57f24128e101d871b756cd Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 17 Apr 2020 11:30:51 +0300 Subject: [PATCH 317/508] Rework timers for easier use --- .../task/timer/BukkitCallbackTimer.java | 32 ++++++++++++---- .../schedule/task/timer/BukkitTimer.java | 32 ++++++++++++---- .../timer/ConcurrentBukkitCallbackTimer.java | 38 +++++++++++++------ .../task/timer/ConcurrentBukkitTimer.java | 34 ++++++++++++----- 4 files changed, 101 insertions(+), 35 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java index 372f06e4f..4e4caa03b 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.NonNull; import lombok.experimental.FieldDefaults; -import lombok.experimental.NonFinal; +import org.jetbrains.annotations.NotNull; import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; @@ -14,22 +14,40 @@ * A {@link ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable} * which is run for a specified amount of times after which it is cancelled. */ +@FieldDefaults(level = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) -@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class BukkitCallbackTimer extends AbstractSchedulerRunnable { +public abstract class BukkitCallbackTimer extends AbstractSchedulerRunnable { - @NonNull LongConsumer task; - @NonFinal long counter; + long counter; @Override public void run() { final long value; if ((value = --counter) == 0) cancel(); - task.accept(value); + tick(value); } + protected abstract void tick(long counter); + public static SchedulerRunnable create(@NonNull final LongConsumer task, final long counter) { - return new BukkitCallbackTimer(task, counter); + return new FunctionalBukkitCallbackTimer(task, counter); + } + + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + private static final class FunctionalBukkitCallbackTimer extends BukkitCallbackTimer { + + @NotNull LongConsumer task; + + public FunctionalBukkitCallbackTimer(@NotNull final LongConsumer task, + final long counter) { + super(counter); + this.task = task; + } + + @Override + protected void tick(final long counter) { + task.accept(counter); + } } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java index 8aa07fdc2..8381a29f9 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java @@ -4,7 +4,7 @@ import lombok.AllArgsConstructor; import lombok.NonNull; import lombok.experimental.FieldDefaults; -import lombok.experimental.NonFinal; +import org.jetbrains.annotations.NotNull; import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; @@ -12,20 +12,38 @@ * A {@link ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable} * which is run for a specified amount of times after which it is cancelled. */ +@FieldDefaults(level = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) -@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class BukkitTimer extends AbstractSchedulerRunnable { +public abstract class BukkitTimer extends AbstractSchedulerRunnable { - @NonNull Runnable task; - @NonFinal long counter; + long counter; @Override public void run() { if (--counter == 0) cancel(); - task.run(); + tick(); } + protected abstract void tick(); + public static SchedulerRunnable create(@NonNull final Runnable task, final long counter) { - return new BukkitTimer(task, counter); + return new FunctionalBukkitTimer(task, counter); + } + + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + private static final class FunctionalBukkitTimer extends BukkitTimer { + + @NotNull Runnable task; + + public FunctionalBukkitTimer(@NotNull final Runnable task, + final long counter) { + super(counter); + this.task = task; + } + + @Override + protected void tick() { + task.run(); + } } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java index 540f9ca33..dab1626a0 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java @@ -1,10 +1,8 @@ package ru.progrm_jarvis.minecraft.commons.schedule.task.timer; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.NonNull; +import lombok.*; import lombok.experimental.FieldDefaults; -import lombok.val; +import org.jetbrains.annotations.NotNull; import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; @@ -17,24 +15,42 @@ */ @AllArgsConstructor(access = AccessLevel.PROTECTED) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class ConcurrentBukkitCallbackTimer extends AbstractSchedulerRunnable { +public abstract class ConcurrentBukkitCallbackTimer extends AbstractSchedulerRunnable { - @NonNull LongConsumer task; @NonNull AtomicLong counter; @Override public void run() { - val value = counter.decrementAndGet(); + final long value; - if (counter.decrementAndGet() == 0) cancel(); - task.accept(value); + if ((value = counter.decrementAndGet()) == 0) cancel(); + tick(value); } + protected abstract void tick(long counter); + public static SchedulerRunnable create(@NonNull final LongConsumer task, final long counter) { - return new ConcurrentBukkitCallbackTimer(task, new AtomicLong(counter)); + return new FunctionalConcurrentBukkitCallbackTimer(task, new AtomicLong(counter)); } public static SchedulerRunnable create(@NonNull final LongConsumer task, @NonNull final AtomicLong counter) { - return new ConcurrentBukkitCallbackTimer(task, counter); + return new FunctionalConcurrentBukkitCallbackTimer(task, counter); + } + + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + private static final class FunctionalConcurrentBukkitCallbackTimer extends ConcurrentBukkitCallbackTimer { + + @NotNull LongConsumer task; + + public FunctionalConcurrentBukkitCallbackTimer(@NotNull final LongConsumer task, + @NotNull final AtomicLong counter) { + super(counter); + this.task = task; + } + + @Override + protected void tick(final long counter) { + task.accept(counter); + } } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java index e7caf250c..e1c0ce446 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.NonNull; import lombok.experimental.FieldDefaults; +import org.jetbrains.annotations.NotNull; import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; @@ -15,27 +16,40 @@ */ @AllArgsConstructor(access = AccessLevel.PROTECTED) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class ConcurrentBukkitTimer extends AbstractSchedulerRunnable { +public abstract class ConcurrentBukkitTimer extends AbstractSchedulerRunnable { - @NonNull Runnable task; @NonNull AtomicLong counter; - public ConcurrentBukkitTimer(@NonNull final Runnable task, final long counter) { - this.task = task; - this.counter = new AtomicLong(counter); - } - @Override public void run() { if (counter.decrementAndGet() == 0) cancel(); - task.run(); + tick(); } + protected abstract void tick(); + public static SchedulerRunnable create(@NonNull final Runnable task, final long counter) { - return new ConcurrentBukkitTimer(task, new AtomicLong(counter)); + return new FunctionalAbstractSchedulerRunnable(task, new AtomicLong(counter)); } public static SchedulerRunnable create(@NonNull final Runnable task, @NonNull final AtomicLong counter) { - return new ConcurrentBukkitTimer(task, counter); + return new FunctionalAbstractSchedulerRunnable(task, counter); + } + + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + private static final class FunctionalAbstractSchedulerRunnable extends ConcurrentBukkitTimer { + + @NotNull Runnable task; + + public FunctionalAbstractSchedulerRunnable(@NotNull final Runnable task, + @NotNull final AtomicLong counter) { + super(counter); + this.task = task; + } + + @Override + protected void tick() { + task.run(); + } } } From a95b425137eea31e36e7b155ded5b3dffe2d420c Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 17 Apr 2020 11:32:24 +0300 Subject: [PATCH 318/508] Add `FieldDefaults` to `CancellingBukkitRunnable` --- .../commons/schedule/task/CancellingBukkitRunnable.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java index f87ea6b49..e3487280a 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java @@ -21,11 +21,12 @@ public void run() { protected abstract boolean tick(); - public static SchedulerRunnable create(@NonNull BooleanSupplier task) { + public static SchedulerRunnable create(@NonNull final BooleanSupplier task) { return new FunctionalCancellingBukkitRunnable(task); } - @AllArgsConstructor(access = AccessLevel.PRIVATE) // `RequiredArgsConstructor` is not used as field is `@NotNull` + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) private static final class FunctionalCancellingBukkitRunnable extends CancellingBukkitRunnable { @NotNull BooleanSupplier task; From f105cd941483ab0614a183f0e59406ae7845a76d Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 17 Apr 2020 15:34:50 +0300 Subject: [PATCH 319/508] Upgrade timer API to add cancel-cause awareness --- .../task/timer/BukkitCallbackTimer.java | 33 ++++++++++++----- .../schedule/task/timer/BukkitTimer.java | 33 ++++++++++++----- .../timer/ConcurrentBukkitCallbackTimer.java | 35 ++++++++++++++----- .../task/timer/ConcurrentBukkitTimer.java | 31 ++++++++++++---- 4 files changed, 100 insertions(+), 32 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java index 4e4caa03b..773cea75f 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java @@ -24,29 +24,46 @@ public abstract class BukkitCallbackTimer extends AbstractSchedulerRunnable { public void run() { final long value; - if ((value = --counter) == 0) cancel(); - tick(value); + if ((value = --counter) == 0) { + cancelTask(); + onOver(); + } + onTick(value); + } + + protected final void cancelTask() { + super.cancel(); + } + + @Override + public void cancel() { + cancelTask(); + onAbort(); } - protected abstract void tick(long counter); + protected void onTick(long counter) {} + + protected void onAbort() {} + + protected void onOver() {} public static SchedulerRunnable create(@NonNull final LongConsumer task, final long counter) { - return new FunctionalBukkitCallbackTimer(task, counter); + return new CompactCallbackTimer(task, counter); } @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - private static final class FunctionalBukkitCallbackTimer extends BukkitCallbackTimer { + private static final class CompactCallbackTimer extends BukkitCallbackTimer { @NotNull LongConsumer task; - public FunctionalBukkitCallbackTimer(@NotNull final LongConsumer task, - final long counter) { + public CompactCallbackTimer(@NotNull final LongConsumer task, + final long counter) { super(counter); this.task = task; } @Override - protected void tick(final long counter) { + protected void onTick(final long counter) { task.accept(counter); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java index 8381a29f9..c3d33f03b 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java @@ -20,29 +20,46 @@ public abstract class BukkitTimer extends AbstractSchedulerRunnable { @Override public void run() { - if (--counter == 0) cancel(); - tick(); + if (--counter == 0) { + cancelTask(); + onOver(); + } + onTick(); + } + + protected final void cancelTask() { + super.cancel(); + } + + @Override + public void cancel() { + cancelTask(); + onAbort(); } - protected abstract void tick(); + protected void onTick() {} + + protected void onAbort() {} + + protected void onOver() {} public static SchedulerRunnable create(@NonNull final Runnable task, final long counter) { - return new FunctionalBukkitTimer(task, counter); + return new CompactBukkitTimer(task, counter); } @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - private static final class FunctionalBukkitTimer extends BukkitTimer { + private static final class CompactBukkitTimer extends BukkitTimer { @NotNull Runnable task; - public FunctionalBukkitTimer(@NotNull final Runnable task, - final long counter) { + public CompactBukkitTimer(@NotNull final Runnable task, + final long counter) { super(counter); this.task = task; } @Override - protected void tick() { + protected void onTick() { task.run(); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java index dab1626a0..ade2dbefb 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java @@ -23,33 +23,50 @@ public abstract class ConcurrentBukkitCallbackTimer extends AbstractSchedulerRun public void run() { final long value; - if ((value = counter.decrementAndGet()) == 0) cancel(); - tick(value); + if ((value = counter.decrementAndGet()) == 0) { + cancelTask(); + onOver(); + } + onTick(value); + } + + protected final void cancelTask() { + super.cancel(); + } + + @Override + public void cancel() { + cancelTask(); + onAbort(); } - protected abstract void tick(long counter); + protected void onTick(long counter) {} + + protected void onAbort() {} + + protected void onOver() {} public static SchedulerRunnable create(@NonNull final LongConsumer task, final long counter) { - return new FunctionalConcurrentBukkitCallbackTimer(task, new AtomicLong(counter)); + return new CompactConcurrentBukkitCallbackTimer(task, new AtomicLong(counter)); } public static SchedulerRunnable create(@NonNull final LongConsumer task, @NonNull final AtomicLong counter) { - return new FunctionalConcurrentBukkitCallbackTimer(task, counter); + return new CompactConcurrentBukkitCallbackTimer(task, counter); } @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - private static final class FunctionalConcurrentBukkitCallbackTimer extends ConcurrentBukkitCallbackTimer { + private static final class CompactConcurrentBukkitCallbackTimer extends ConcurrentBukkitCallbackTimer { @NotNull LongConsumer task; - public FunctionalConcurrentBukkitCallbackTimer(@NotNull final LongConsumer task, - @NotNull final AtomicLong counter) { + public CompactConcurrentBukkitCallbackTimer(@NotNull final LongConsumer task, + @NotNull final AtomicLong counter) { super(counter); this.task = task; } @Override - protected void tick(final long counter) { + protected void onTick(final long counter) { task.accept(counter); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java index e1c0ce446..3371dd7d5 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java @@ -22,27 +22,44 @@ public abstract class ConcurrentBukkitTimer extends AbstractSchedulerRunnable { @Override public void run() { - if (counter.decrementAndGet() == 0) cancel(); + if (counter.decrementAndGet() == 0) { + cancelTask(); + onOver(); + } tick(); } - protected abstract void tick(); + protected final void cancelTask() { + super.cancel(); + } + + @Override + public void cancel() { + cancelTask(); + onAbort(); + } + + protected void tick() {} + + protected void onAbort() {} + + protected void onOver() {} public static SchedulerRunnable create(@NonNull final Runnable task, final long counter) { - return new FunctionalAbstractSchedulerRunnable(task, new AtomicLong(counter)); + return new CompactAbstractSchedulerRunnable(task, new AtomicLong(counter)); } public static SchedulerRunnable create(@NonNull final Runnable task, @NonNull final AtomicLong counter) { - return new FunctionalAbstractSchedulerRunnable(task, counter); + return new CompactAbstractSchedulerRunnable(task, counter); } @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - private static final class FunctionalAbstractSchedulerRunnable extends ConcurrentBukkitTimer { + private static final class CompactAbstractSchedulerRunnable extends ConcurrentBukkitTimer { @NotNull Runnable task; - public FunctionalAbstractSchedulerRunnable(@NotNull final Runnable task, - @NotNull final AtomicLong counter) { + public CompactAbstractSchedulerRunnable(@NotNull final Runnable task, + @NotNull final AtomicLong counter) { super(counter); this.task = task; } From 0e81c88226cea97cf3f32947cfeefa088bf1eafe Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sat, 16 May 2020 18:50:34 +0300 Subject: [PATCH 320/508] Simplify creation of non-global `PlayerContainer` from maps --- .../player/collection/PlayerContainers.java | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java index 7d10c870e..5d58ad3d8 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java @@ -3,6 +3,7 @@ import lombok.NonNull; import lombok.Value; import lombok.experimental.UtilityClass; +import lombok.val; import org.bukkit.entity.Player; import java.util.Collection; @@ -22,13 +23,27 @@ public PlayerContainer wrap(@NonNull final Collection collectionOfPlayer public PlayerContainer wrap(@NonNull final Map mapOfPlayers, @NonNull final Function defaultValueSupplier, final boolean global) { - return new PlayerContainerMapWrapper<>(mapOfPlayers, defaultValueSupplier, global); + if (global) { + val container = new PlayerContainerMapWrapper<>(mapOfPlayers, defaultValueSupplier, true); + container.addOnlinePlayers(); + + return container; + } + + return new PlayerContainerMapWrapper<>(mapOfPlayers, defaultValueSupplier, false); + } + + // non-global + public PlayerContainer wrap(@NonNull final Map mapOfPlayers) { + return new PlayerContainerMapWrapper<>(mapOfPlayers, player -> { + throw new UnsupportedOperationException("Players cannot be directly added to this non-global player-map"); + }, false); } @Value - protected static class PlayerContainerCollectionWrapper implements PlayerContainer { + private static class PlayerContainerCollectionWrapper implements PlayerContainer { - @NonNull private Collection collection; + @NonNull Collection collection; boolean global; public PlayerContainerCollectionWrapper(@NonNull final Collection collection, final boolean global) { @@ -60,22 +75,20 @@ public Collection getPlayers() { } @Value - protected static class PlayerContainerMapWrapper implements PlayerContainer { + private static class PlayerContainerMapWrapper implements PlayerContainer { - @NonNull private Map map; - @NonNull private Set playersView; - @NonNull private Function defaultValueSupplier; + @NonNull Map map; + @NonNull Set playersView; + @NonNull Function defaultValueSupplier; boolean global; public PlayerContainerMapWrapper(@NonNull final Map map, - @NonNull final Function defaultValueSupplier, - final boolean global) { + @NonNull final Function defaultValueSupplier, + final boolean global) { this.map = map; playersView = Collections.unmodifiableSet(map.keySet()); this.defaultValueSupplier = defaultValueSupplier; this.global = global; - - if (global) addOnlinePlayers(); } @Override From 7322af829253b611dd8ed82d60d10afa2c9087d4 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sat, 16 May 2020 18:51:23 +0300 Subject: [PATCH 321/508] Add shorthand for `registerInDefaultRegistry(..)` of non-global player-map --- .../minecraft/commons/player/registry/PlayerRegistries.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java index 8eca5b3ad..20957401b 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java @@ -38,4 +38,9 @@ public PlayerContainer registerInDefaultRegistry(@NonNull final Plugin plugi final boolean global) { return registerInDefaultRegistry(plugin, PlayerContainers.wrap(mapOfPlayers, defaultValueSupplier, global)); } + + public PlayerContainer registerInDefaultRegistry(@NonNull final Plugin plugin, + @NonNull final Map mapOfPlayers) { + return registerInDefaultRegistry(plugin, PlayerContainers.wrap(mapOfPlayers)); + } } From 189d385067ab58e298e8d11e22167c6affc2ce81 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sat, 16 May 2020 23:43:47 +0300 Subject: [PATCH 322/508] Rename abstract timers and their internal classes --- .../{BukkitTimer.java => AbstractBukkitTimer.java} | 10 +++++----- ...CallbackTimer.java => AbstractCallbackTimer.java} | 10 +++++----- ...Timer.java => AbstractConcurrentBukkitTimer.java} | 12 ++++++------ ...mer.java => AbstractConcurrentCallbackTimer.java} | 12 ++++++------ 4 files changed, 22 insertions(+), 22 deletions(-) rename minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/{BukkitTimer.java => AbstractBukkitTimer.java} (81%) rename minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/{BukkitCallbackTimer.java => AbstractCallbackTimer.java} (82%) rename minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/{ConcurrentBukkitTimer.java => AbstractConcurrentBukkitTimer.java} (77%) rename minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/{ConcurrentBukkitCallbackTimer.java => AbstractConcurrentCallbackTimer.java} (76%) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractBukkitTimer.java similarity index 81% rename from minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractBukkitTimer.java index c3d33f03b..d774d324f 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractBukkitTimer.java @@ -14,7 +14,7 @@ */ @FieldDefaults(level = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) -public abstract class BukkitTimer extends AbstractSchedulerRunnable { +public abstract class AbstractBukkitTimer extends AbstractSchedulerRunnable { long counter; @@ -44,16 +44,16 @@ protected void onAbort() {} protected void onOver() {} public static SchedulerRunnable create(@NonNull final Runnable task, final long counter) { - return new CompactBukkitTimer(task, counter); + return new SimpleBukkitTimer(task, counter); } @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - private static final class CompactBukkitTimer extends BukkitTimer { + private static final class SimpleBukkitTimer extends AbstractBukkitTimer { @NotNull Runnable task; - public CompactBukkitTimer(@NotNull final Runnable task, - final long counter) { + public SimpleBukkitTimer(@NotNull final Runnable task, + final long counter) { super(counter); this.task = task; } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractCallbackTimer.java similarity index 82% rename from minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractCallbackTimer.java index 773cea75f..42b571db3 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/BukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractCallbackTimer.java @@ -16,7 +16,7 @@ */ @FieldDefaults(level = AccessLevel.PROTECTED) @AllArgsConstructor(access = AccessLevel.PROTECTED) -public abstract class BukkitCallbackTimer extends AbstractSchedulerRunnable { +public abstract class AbstractCallbackTimer extends AbstractSchedulerRunnable { long counter; @@ -48,16 +48,16 @@ protected void onAbort() {} protected void onOver() {} public static SchedulerRunnable create(@NonNull final LongConsumer task, final long counter) { - return new CompactCallbackTimer(task, counter); + return new SimpleCallbackTimer(task, counter); } @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - private static final class CompactCallbackTimer extends BukkitCallbackTimer { + private static final class SimpleCallbackTimer extends AbstractCallbackTimer { @NotNull LongConsumer task; - public CompactCallbackTimer(@NotNull final LongConsumer task, - final long counter) { + public SimpleCallbackTimer(@NotNull final LongConsumer task, + final long counter) { super(counter); this.task = task; } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentBukkitTimer.java similarity index 77% rename from minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentBukkitTimer.java index 3371dd7d5..17fe5cc11 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentBukkitTimer.java @@ -16,7 +16,7 @@ */ @AllArgsConstructor(access = AccessLevel.PROTECTED) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public abstract class ConcurrentBukkitTimer extends AbstractSchedulerRunnable { +public abstract class AbstractConcurrentBukkitTimer extends AbstractSchedulerRunnable { @NonNull AtomicLong counter; @@ -46,20 +46,20 @@ protected void onAbort() {} protected void onOver() {} public static SchedulerRunnable create(@NonNull final Runnable task, final long counter) { - return new CompactAbstractSchedulerRunnable(task, new AtomicLong(counter)); + return new SimpleConcurrentBukkitTimer(task, new AtomicLong(counter)); } public static SchedulerRunnable create(@NonNull final Runnable task, @NonNull final AtomicLong counter) { - return new CompactAbstractSchedulerRunnable(task, counter); + return new SimpleConcurrentBukkitTimer(task, counter); } @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - private static final class CompactAbstractSchedulerRunnable extends ConcurrentBukkitTimer { + private static final class SimpleConcurrentBukkitTimer extends AbstractConcurrentBukkitTimer { @NotNull Runnable task; - public CompactAbstractSchedulerRunnable(@NotNull final Runnable task, - @NotNull final AtomicLong counter) { + public SimpleConcurrentBukkitTimer(@NotNull final Runnable task, + @NotNull final AtomicLong counter) { super(counter); this.task = task; } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentCallbackTimer.java similarity index 76% rename from minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java rename to minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentCallbackTimer.java index ade2dbefb..d459d0dbe 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/ConcurrentBukkitCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentCallbackTimer.java @@ -15,7 +15,7 @@ */ @AllArgsConstructor(access = AccessLevel.PROTECTED) @FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public abstract class ConcurrentBukkitCallbackTimer extends AbstractSchedulerRunnable { +public abstract class AbstractConcurrentCallbackTimer extends AbstractSchedulerRunnable { @NonNull AtomicLong counter; @@ -47,20 +47,20 @@ protected void onAbort() {} protected void onOver() {} public static SchedulerRunnable create(@NonNull final LongConsumer task, final long counter) { - return new CompactConcurrentBukkitCallbackTimer(task, new AtomicLong(counter)); + return new SimpleConcurrentCallbackTimer(task, new AtomicLong(counter)); } public static SchedulerRunnable create(@NonNull final LongConsumer task, @NonNull final AtomicLong counter) { - return new CompactConcurrentBukkitCallbackTimer(task, counter); + return new SimpleConcurrentCallbackTimer(task, counter); } @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - private static final class CompactConcurrentBukkitCallbackTimer extends ConcurrentBukkitCallbackTimer { + private static final class SimpleConcurrentCallbackTimer extends AbstractConcurrentCallbackTimer { @NotNull LongConsumer task; - public CompactConcurrentBukkitCallbackTimer(@NotNull final LongConsumer task, - @NotNull final AtomicLong counter) { + public SimpleConcurrentCallbackTimer(@NotNull final LongConsumer task, + @NotNull final AtomicLong counter) { super(counter); this.task = task; } From f2c5d365a7465182f2f8981bb6b5ccabbb0a22ba Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sat, 16 May 2020 23:43:59 +0300 Subject: [PATCH 323/508] Add `AbstractConditionalTask` --- .../conditional/AbstractConditionalTask.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/conditional/AbstractConditionalTask.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/conditional/AbstractConditionalTask.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/conditional/AbstractConditionalTask.java new file mode 100644 index 000000000..6ed5909a7 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/conditional/AbstractConditionalTask.java @@ -0,0 +1,41 @@ +package ru.progrm_jarvis.minecraft.commons.schedule.task.conditional; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NonNull; +import lombok.experimental.FieldDefaults; +import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; +import ru.progrm_jarvis.minecraft.commons.schedule.task.SchedulerRunnable; + +import java.util.function.BooleanSupplier; + +/** + * A task which will run until the specified condition becomes false. + */ +@FieldDefaults(level = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +public abstract class AbstractConditionalTask extends AbstractSchedulerRunnable { + + protected abstract boolean tryRun(); + + @Override + public void run() { + if (!tryRun()) cancel(); + } + + public static SchedulerRunnable create(@NonNull final BooleanSupplier conditionalTask) { + return new SimpleConditionalTask(conditionalTask); + } + + @AllArgsConstructor(access = AccessLevel.PRIVATE) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + private static final class SimpleConditionalTask extends AbstractConditionalTask { + + @NonNull BooleanSupplier conditionalTask; + + @Override + protected boolean tryRun() { + return conditionalTask.getAsBoolean(); + } + } +} From 5dc5aa12463bed81ac490c7ee39e340bb17c4e69 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Thu, 21 May 2020 01:55:54 +0300 Subject: [PATCH 324/508] Fix issues with `short` serialization in `StandardDataWatcherFactory` --- .../nms/metadata/StandardDataWatcherFactory.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java index 48b6cf42b..0fcf77491 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java @@ -16,7 +16,7 @@ public class StandardDataWatcherFactory implements DataWatcherFactory { protected static final WrappedDataWatcher.Serializer BYTE_SERIALIZER = Registry.get(Byte.class), - SHORT_SERIALIZER = Registry.get(Short.class), + SHORT_SERIALIZER, INTEGER_SERIALIZER = Registry.get(Integer.class), FLOAT_SERIALIZER = Registry.get(Float.class), STRING_SERIALIZER = Registry.get(String.class), @@ -31,11 +31,22 @@ public class StandardDataWatcherFactory implements DataWatcherFactory { OPTIONAL_UUID_SERIALIZER = Registry.getUUIDSerializer(true), NBT_TAG_COMPOUND_SERIALIZER = Registry.getNBTCompoundSerializer(); + static { + WrappedDataWatcher.Serializer shortSerializer; + try { + shortSerializer = Registry.get(Short.class); + } catch (final IllegalArgumentException e) { + shortSerializer = null; + } + SHORT_SERIALIZER = shortSerializer; + } + protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectByte(final int id) { return new WrappedDataWatcher.WrappedDataWatcherObject(id, BYTE_SERIALIZER); } protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectShort(final int id) { + if (SHORT_SERIALIZER == null) throw new UnsupportedOperationException("Short serialization is unavailable"); return new WrappedDataWatcher.WrappedDataWatcherObject(id, SHORT_SERIALIZER); } From 20ba81d0d7fd5937899b403d6993e01b66e41c4f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 28 May 2020 05:43:17 +0000 Subject: [PATCH 325/508] Bump commons-io from 2.6 to 2.7 Bumps commons-io from 2.6 to 2.7. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8b1e900a9..86ef2218f 100644 --- a/pom.xml +++ b/pom.xml @@ -268,7 +268,7 @@ commons-io commons-io - 2.6 + 2.7 net.sf.trove4j From c4385b410d7049ee2f7ad6b14eb9d57a32496f17 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2020 05:42:47 +0000 Subject: [PATCH 326/508] Bump maven-shade-plugin from 3.2.3 to 3.2.4 Bumps [maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.2.3 to 3.2.4. - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.2.3...maven-shade-plugin-3.2.4) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 86ef2218f..8d8de597c 100644 --- a/pom.xml +++ b/pom.xml @@ -109,7 +109,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.2.3 + 3.2.4 package From 38a83f756c0985319e0f29608e965eb697bb9b7f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2020 05:44:31 +0000 Subject: [PATCH 327/508] Bump ProtocolLib from 4.5.0 to 4.5.1 Bumps [ProtocolLib](https://github.com/dmulloy2/ProtocolLib) from 4.5.0 to 4.5.1. - [Release notes](https://github.com/dmulloy2/ProtocolLib/releases) - [Commits](https://github.com/dmulloy2/ProtocolLib/compare/4.5.0...4.5.1) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8d8de597c..258a3204d 100644 --- a/pom.xml +++ b/pom.xml @@ -252,7 +252,7 @@ com.comphenix.protocol ProtocolLib - 4.5.0 + 4.5.1 provided From 05d4f8a66f265cbc91e04b002f08de7a97607125 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Wed, 10 Jun 2020 15:14:23 +0300 Subject: [PATCH 328/508] Fix `addMetadata(..)` --- .../entity/AbstractBasicFakeEntity.java | 20 ++++++++----------- .../fakeentitylib/entity/BasicFakeEntity.java | 2 -- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index 3494280b9..2a3d48eec 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -86,26 +86,22 @@ public void setMetadata(@NonNull final WrappedWatchableObject... metadata) { sendMetadata(); } - @Override - public void addMetadata(final List metadata) { - if (this.metadata == null) this.metadata = new WrappedDataWatcher(metadata); - else for (val metadatum : metadata) this.metadata.setObject(metadatum.getIndex(), metadatum); - - sendMetadata(); - } - @Override public void addMetadata(final Collection metadata) { - if (this.metadata == null) this.metadata = new WrappedDataWatcher(new ArrayList<>(metadata)); - else for (val metadatum : metadata) this.metadata.setObject(metadatum.getIndex(), metadatum); + final WrappedDataWatcher thisMetadata; + if ((thisMetadata = this.metadata) == null) this.metadata = new WrappedDataWatcher(Arrays.asList(metadata)); + else for (val metadatum : metadata) thisMetadata + .setObject(metadatum.getWatcherObject(), metadatum.getRawValue()); sendMetadata(); } @Override public void addMetadata(final WrappedWatchableObject... metadata) { - if (this.metadata == null) this.metadata = new WrappedDataWatcher(Arrays.asList(metadata)); - else for (val metadatum : metadata) this.metadata.setObject(metadatum.getIndex(), metadatum); + final WrappedDataWatcher thisMetadata; + if ((thisMetadata = this.metadata) == null) this.metadata = new WrappedDataWatcher(Arrays.asList(metadata)); + else for (val metadatum : metadata) thisMetadata + .setObject(metadatum.getWatcherObject(), metadatum.getRawValue()); sendMetadata(); } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java index 99c143ff9..f9163d69a 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java @@ -86,8 +86,6 @@ default void teleport(@NonNull final Location location) { void setMetadata(@Nonnull final WrappedWatchableObject... metadata); - void addMetadata(List metadata); - void addMetadata(Collection metadata); void addMetadata(WrappedWatchableObject... metadata); From 1c5d6cfda867e748a76c21c5ce47c72d4b3945bf Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Wed, 10 Jun 2020 15:16:09 +0300 Subject: [PATCH 329/508] Replace calls to `String#concat(..)` with `+` operator resolving small issues around --- .../entity/ArmorStandBlockItem.java | 45 +++++++++++++------ .../minecraft/commons/nms/NmsUtil.java | 2 +- .../misc/PacketWrapperPacketAssociations.java | 2 +- .../nms/protocol/misc/PacketWrapperUtil.java | 4 +- .../minecraft/commons/player/PlayerUtil.java | 4 +- 5 files changed, 37 insertions(+), 20 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 8ef11a311..fbba63e0c 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -15,9 +15,7 @@ import org.bukkit.inventory.ItemStack; import ru.progrm_jarvis.minecraft.commons.math.dimensional.CuboidFigure; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; -import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator; import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand; -import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.Entity; import javax.annotation.Nullable; import java.util.ArrayList; @@ -28,7 +26,7 @@ import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.armorStandFlags; import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.headRotation; -import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.Entity.entityFlags; +import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.Entity.*; /** * A fake small (or very small) movable block-item which can be normally rotated over all axises @@ -69,10 +67,10 @@ public ArmorStandBlockItem(@Nullable final UUID uuid, final Map playersMap, final boolean global, final int viewDistance, final boolean visible, final Location location, @Nullable final Vector3F rotation, - final boolean small, @NonNull final ItemStack item) { + final boolean small, final boolean marker, @NonNull final ItemStack item) { super( NmsUtil.nextEntityId(), uuid, EntityType.ARMOR_STAND, - playersMap, global, viewDistance, visible, location, 0, null, createMetadata(rotation, small) + playersMap, global, viewDistance, visible, location, 0, null, createMetadata(rotation, small, marker) ); this.rotation = rotation; @@ -90,6 +88,11 @@ public ArmorStandBlockItem(@Nullable final UUID uuid, yOffset = -1; } + @Override + public void spawn() { + super.spawn(); + } + /** * Creates new armor stand block-item by parameters specified. * @@ -102,14 +105,15 @@ public ArmorStandBlockItem(@Nullable final UUID uuid, * @param item item to be displayed by this block-item * @return newly created armor stand block-item */ - public static ArmorStandBlockItem create(final boolean concurrent, + public static ArmorStandBlockItem create(@Nullable final UUID uuid, + final boolean concurrent, final boolean global, final int viewDistance, final boolean visible, final Location location, - final Vector3F rotation, final boolean small, + final Vector3F rotation, final boolean small, final boolean marker, @NonNull final ItemStack item) { return new ArmorStandBlockItem( - null, concurrent ? new ConcurrentHashMap<>() : new HashMap<>(), - global, viewDistance, visible, location, rotation, small, item + uuid, concurrent ? new ConcurrentHashMap<>() : new HashMap<>(), + global, viewDistance, visible, location, rotation, small, marker, item ); } @@ -120,12 +124,25 @@ public static ArmorStandBlockItem create(final boolean concurrent, * @param small whether this block-item is small * @return created metadata object */ - protected static WrappedDataWatcher createMetadata(@Nullable final Vector3F rotation, final boolean small) { + protected static WrappedDataWatcher createMetadata(@Nullable final Vector3F rotation, + final boolean small, final boolean marker) { val metadata = new ArrayList(); - metadata.add(entityFlags(Entity.Flag.INVISIBLE)); - metadata.add(armorStandFlags(small - ? new ArmorStand.Flag[]{ArmorStand.Flag.SMALL, ArmorStand.Flag.MARKER} - : new ArmorStand.Flag[]{MetadataGenerator.ArmorStand.Flag.MARKER})); + + metadata.add(air(300)); + metadata.add(noGravity(true)); + if (marker) { + metadata.add(entityFlags(Flag.INVISIBLE, Flag.ON_FIRE)); + metadata.add(armorStandFlags(small ? new ArmorStand.Flag[]{ + ArmorStand.Flag.SMALL, ArmorStand.Flag.NO_BASE_PLATE, ArmorStand.Flag.MARKER + } : new ArmorStand.Flag[]{ArmorStand.Flag.MARKER, ArmorStand.Flag.NO_BASE_PLATE} + )); + } else { + metadata.add(entityFlags(Flag.INVISIBLE)); + metadata.add(armorStandFlags(small + ? new ArmorStand.Flag[]{ArmorStand.Flag.SMALL, ArmorStand.Flag.NO_BASE_PLATE} + : new ArmorStand.Flag[]{ArmorStand.Flag.NO_BASE_PLATE} + )); + } if (rotation != null) metadata.add(headRotation(rotation)); return new WrappedDataWatcher(metadata); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java index 507d2c3fe..facb70ea1 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java @@ -38,7 +38,7 @@ public class NmsUtil { static { final Class nmsEntityClass; try { - nmsEntityClass = Class.forName(getNmsPackage().concat(".Entity")); + nmsEntityClass = Class.forName(getNmsPackage() + ".Entity"); } catch (final ClassNotFoundException e) { throw new IllegalStateException("Cannot find NMS-entity class", e); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java index 2f0b8032e..fb35c46cf 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java @@ -133,7 +133,7 @@ private enum PacketDirection { private static class PacketTypeId { private static final String PACKET_WRAPPER_PACKAGE = SystemPropertyUtil.getSystemProperty( - PacketTypeId.class.getCanonicalName().concat("-packet-wrapper-package"), + PacketTypeId.class.getCanonicalName() + "-packet-wrapper-package", Function.identity(), "com.comphenix.packetwrapper" ); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java index 89e91fa5a..4734cbcfb 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java @@ -23,9 +23,9 @@ public class PacketWrapperUtil { private final String FIELDS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME - = PacketWrapperUtil.class.getCanonicalName().concat(".FIELDS_CACHE_CONCURRENCY_LEVEL"), + = PacketWrapperUtil.class.getCanonicalName() + ".FIELDS_CACHE_CONCURRENCY_LEVEL", METHODS_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME - = PacketWrapperUtil.class.getCanonicalName().concat(".METHODS_CACHE_CONCURRENCY_LEVEL"); + = PacketWrapperUtil.class.getCanonicalName() + ".METHODS_CACHE_CONCURRENCY_LEVEL"; private final Cache, Map>> FIELDS_CACHE = CacheBuilder.newBuilder() diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java index 789592228..05e258fd5 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java @@ -22,8 +22,8 @@ @UtilityClass public class PlayerUtil { - private static final String NAMES_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME - = PlayerUtil.class.getCanonicalName().concat(".FIELDS_CACHE_CONCURRENCY_LEVEL"); + private final String NAMES_CACHE_CONCURRENCY_LEVEL_PROPERTY_NAME + = PlayerUtil.class.getCanonicalName() + ".FIELDS_CACHE_CONCURRENCY_LEVEL"; @NonNull private final Cache<@NotNull UUID, @Nullable String> NAMES_CACHE = CacheBuilder.newBuilder() .softValues() From 3af5abe64791bdfcb033b4531912f517a429cae0 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Tue, 30 Jun 2020 21:37:27 +0300 Subject: [PATCH 330/508] sry: Release everything from remote desktop, lol --- .../entity/ArmorStandBlockItem.java | 18 ++++++++++++++++++ .../management/FakeEntityManagerGroup.java | 2 +- .../observer/PeriodicFakeEntityObserver.java | 15 +++++++++++---- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index fbba63e0c..99bd3d713 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -173,6 +173,24 @@ public void setRotation(@NonNull final Vector3F rotation) { * @param delta delta of rotation */ public void rotate(@NonNull final Vector3F delta) { + final Vector3F thisRotation; + setRotation((thisRotation = rotation) == null + ? new Vector3F(delta.getX(), delta.getY(), delta.getZ()) + : new Vector3F( + minimizeAngle(thisRotation.getX() + delta.getX()), + minimizeAngle(thisRotation.getY() + delta.getY()), + minimizeAngle(thisRotation.getZ() + delta.getZ()) + ) + ); + } + + /** + * Rotates this block by specified delta. This means that its current + * roll (x), pitch (y) and yaw (z) will each get incremented by those of delta specified. + * + * @param delta delta of rotation + */ + public void rotateTo(@NonNull final Vector3F delta) { setRotation(rotation == null ? new Vector3F(delta.getX(), delta.getY(), delta.getZ()) : new Vector3F( diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java index 8bbcf0b64..ee0589aec 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java @@ -64,7 +64,7 @@ public void unmanageEntity(@NonNull final E entity) { @Override public void remove(@NonNull final E entity) { - for (val manager : managers) manager.unmanageEntity(entity); + for (val manager : managers) manager.remove(entity); entity.remove(); } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java index 0e3f12b23..8533552dc 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java @@ -77,11 +77,11 @@ public PeriodicFakeEntityObserver(@Nonnull final Plugin plugin, final boolean co .register(event -> removePlayer(event.getPlayer()))::shutdown); } - public void addPlayer(@NonNull final Player player) { + protected void addPlayer(@NonNull final Player player) { for (val entity : entities) entity.addPlayer(player); } - public void removePlayer(@NonNull final Player player) { + protected void removePlayer(@NonNull final Player player) { for (val entity : entities) entity.removePlayer(player); } @@ -93,7 +93,7 @@ protected RedrawEntitiesRunnable getRedrawEntitiesRunnable() { RedrawEntitiesRunnable minRunnable = null; Integer minEntitiesInRunnable = null; for (val task : tasks) { - val taskEntitiesSize = task.entities.size(); + val taskEntitiesSize = task.size(); // if task has no even reached its entity minimum then use it if (taskEntitiesSize < minEntitiesForNewThread) return task; @@ -137,7 +137,10 @@ public void unmanageEntity(@NonNull final E entity) { while (iterator.hasNext()) { val task = iterator.next(); if (task.removeEntity(entity)) { - if (task.entities.isEmpty()) iterator.remove(); + if (task.isEmpty()) { + iterator.remove(); + task.cancel(); + } break; } @@ -158,6 +161,10 @@ public int size() { return entities.size(); } + public boolean isEmpty() { + return entities.isEmpty(); + } + public void addEntity(final E entity) { lock.writeLock().lock(); try { From f5d9356fd930ce2bf4b6d5bc655d99e8c8b51ded Mon Sep 17 00:00:00 2001 From: PROgrm_JARvis Date: Fri, 3 Jul 2020 17:34:40 +0300 Subject: [PATCH 331/508] Redraw fake entities on player respawn PeriodicFakeEntityObserver --- .../management/AbstractSetBasedEntityManager.java | 2 +- .../entity/observer/PeriodicFakeEntityObserver.java | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index c650fb418..55b621232 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -31,7 +31,7 @@ public abstract class AbstractSetBasedEntityManager implem @NonNull @ToString.Exclude Set entities; @NonNull @ToString.Exclude Set entitiesView; - @Delegate(types = Shutdownable.class) @NonNull final ShutdownHooks shutdownHooks; + @Delegate(types = Shutdownable.class) @NonNull ShutdownHooks shutdownHooks; public AbstractSetBasedEntityManager(@NonNull final Plugin plugin, @NonNull final Set entities) { this.plugin = plugin; diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java index 8533552dc..e804dec9c 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java @@ -5,8 +5,10 @@ import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.plugin.Plugin; import ru.progrm_jarvis.minecraft.commons.schedule.task.AbstractSchedulerRunnable; +import ru.progrm_jarvis.minecraft.commons.util.shutdown.ShutdownHooks; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.ObservableFakeEntity; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.management.AbstractSetBasedEntityManager; @@ -59,7 +61,8 @@ public PeriodicFakeEntityObserver(@Nonnull final Plugin plugin, final boolean co this.entitiesSetSupplier = entitiesSetSupplier; - shutdownHooks.add(() -> { + final ShutdownHooks shutdownHooks; + (shutdownHooks = this.shutdownHooks).add(() -> { lock.lock(); try { for (val task : tasks) task.cancel(); @@ -75,6 +78,14 @@ public PeriodicFakeEntityObserver(@Nonnull final Plugin plugin, final boolean co .add(on(PlayerQuitEvent.class) .plugin(plugin) .register(event -> removePlayer(event.getPlayer()))::shutdown); + + shutdownHooks.add(on(PlayerRespawnEvent.class) + .plugin(plugin) + .register(event -> { + final Player player; + removePlayer(player = event.getPlayer()); + addPlayer(player); + })::shutdown); } protected void addPlayer(@NonNull final Player player) { From 10221d19bbe85e4f2d89415f4e4c1bc90233ab08 Mon Sep 17 00:00:00 2001 From: PROgrm_JARvis Date: Sat, 4 Jul 2020 13:52:10 +0300 Subject: [PATCH 332/508] Use LoopPool implementation sponsored by DivineCraft --- .../commons/schedule/pool/KeyedLoopPool.java | 22 --- .../commons/schedule/pool/LoopPool.java | 54 +----- .../schedule/pool/SingleWorkerLoopPool.java | 170 ++++++++---------- .../pool/SingleWorkerLoopPoolTest.java | 68 ------- 4 files changed, 81 insertions(+), 233 deletions(-) delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java delete mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java deleted file mode 100644 index a23a1ae24..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/KeyedLoopPool.java +++ /dev/null @@ -1,22 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.schedule.pool; - -import lombok.NonNull; -import org.bukkit.plugin.Plugin; - -/** - * A loop pool which allows storing its elements by keys. - * - * @param type of key for identifying tasks - * (may be unnecessary in some implementations so {@code null} may be used then) - */ -public interface KeyedLoopPool extends LoopPool { - - Plugin getPlugin(); - - TaskRemover addTask(@NonNull final TaskOptions taskOptions, final K key, @NonNull final T task); - - @Override - default TaskRemover addTask(@NonNull final TaskOptions taskOptions, @NonNull final T task) { - return addTask(taskOptions, null, task); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java index 43e0025ca..25aad8c9e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/LoopPool.java @@ -1,54 +1,16 @@ package ru.progrm_jarvis.minecraft.commons.schedule.pool; -import com.google.common.base.Preconditions; -import gnu.trove.map.TLongObjectMap; -import gnu.trove.map.hash.TLongObjectHashMap; -import lombok.*; -import lombok.experimental.FieldDefaults; -import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; -import java.util.Collection; +@FunctionalInterface +public interface LoopPool { -/** - * A pool of schedulers which groups tasks with similar parameters - * (asynchrony and interval stored as {@link TaskOptions}}) into groups so that they are executed altogether. - * - * @param supported task type - */ -public interface LoopPool { - - Plugin getPlugin(); - - int tasksSize(); - - TaskRemover addTask(@NonNull final TaskOptions taskOptions, @NonNull final T task); - - Collection clearTasks(); - - @Value - @AllArgsConstructor(access = AccessLevel.PROTECTED) - @FieldDefaults(level = AccessLevel.PRIVATE) - class TaskOptions { - - private static TLongObjectMap optionsPool = new TLongObjectHashMap<>(); - - boolean async; - long interval; - - public static TaskOptions of(final boolean async, long interval) { - Preconditions.checkArgument(interval > 0, "interval should be a positive number"); - - val key = async ? -interval : interval; - - var options = optionsPool.get(key); - if (options == null) optionsPool.put(key, options = new TaskOptions(async, interval)); - - return options; - } - } + @NotNull ShutdownHook addTask(@NotNull Runnable task, long period, boolean async); @FunctionalInterface - interface TaskRemover { - void removeTask(); + interface ShutdownHook extends AutoCloseable { + + @Override + void close(); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java index 20725a776..39ee72733 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java @@ -1,131 +1,107 @@ package ru.progrm_jarvis.minecraft.commons.schedule.pool; -import lombok.*; +import io.netty.util.collection.LongObjectHashMap; +import io.netty.util.collection.LongObjectMap; +import lombok.AccessLevel; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; import lombok.experimental.NonFinal; +import lombok.val; import org.bukkit.plugin.Plugin; -import ru.progrm_jarvis.minecraft.commons.schedule.misc.KeyedSchedulerGroup; -import ru.progrm_jarvis.minecraft.commons.schedule.misc.SchedulerGroups; +import org.bukkit.scheduler.BukkitScheduler; +import org.bukkit.scheduler.BukkitTask; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.stream.Collectors; - -/** - * A loop pool which creates only one {@link org.bukkit.scheduler.BukkitTask} per sync-mode. - */ -@ToString -@EqualsAndHashCode -@RequiredArgsConstructor -@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) -public class SingleWorkerLoopPool implements KeyedLoopPool { +import java.util.concurrent.ConcurrentHashMap; - boolean concurrent; +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +@FieldDefaults(level = AccessLevel.PROTECTED, makeFinal = true) +public final class SingleWorkerLoopPool implements LoopPool { - @NonNull @Getter Plugin plugin; - @NonFinal KeyedSchedulerGroup, K> asyncWorker; - @NonFinal KeyedSchedulerGroup, K> syncWorker; - - protected static Collection mapToTasks(final Collection> tasks) { - return tasks.stream() - .map(task -> task.task) - .collect(Collectors.toList()); - } + @NonNull Plugin plugin; + @NonNull BukkitScheduler scheduler; + @NonNull LongObjectMap syncTasks, asyncTasks; @Override - public int tasksSize() { - return (asyncWorker == null ? 0 : asyncWorker.size()) + (syncWorker == null ? 0 : syncWorker.size()); + public @NotNull ShutdownHook addTask(final @NotNull Runnable task, final long period, final boolean async) { + return (async ? asyncTasks.computeIfAbsent(period, p -> { + val runner = new PaperTaskRunner(ConcurrentHashMap.newKeySet()); + runner.setup( + scheduler.runTaskTimer(plugin, runner, period, period), () -> asyncTasks.remove(period) + ); + + return runner; + }) : syncTasks.computeIfAbsent(period, p -> { + val runner = new PaperTaskRunner(ConcurrentHashMap.newKeySet()); + runner.setup( + scheduler.runTaskTimer(plugin, runner, period, period), () -> syncTasks.remove(period) + ); + return runner; + })).addTask(task); } - protected void initAsyncWorker() { - if (asyncWorker == null) asyncWorker = concurrent - ? SchedulerGroups.concurrentKeyedSchedulerGroup(plugin, true, 1, 1) - : SchedulerGroups.keyedSchedulerGroup(plugin, true, 1, 1); + public static LoopPool create(final @NonNull Plugin plugin) { + return new SingleWorkerLoopPool( + plugin, plugin.getServer().getScheduler(), + new LongObjectHashMap<>(4), new LongObjectHashMap<>(4) + ); } - protected void initSyncWorker() { - if (syncWorker == null) syncWorker = concurrent - ? SchedulerGroups.concurrentKeyedSchedulerGroup(plugin, false, 1, 1) - : SchedulerGroups.keyedSchedulerGroup(plugin, false, 1, 1); - } - - @Override - public TaskRemover addTask(@NonNull final TaskOptions taskOptions, @NonNull final T task) { - if (taskOptions.isAsync()) { - initAsyncWorker(); - - val countingTask = new CountingTask<>(task, taskOptions.getInterval()); - asyncWorker.addTask(countingTask); - - return () -> removeTask(countingTask, true); - } else { - initSyncWorker(); + interface TaskRunner extends AutoCloseable { - val countingTask = new CountingTask<>(task, taskOptions.getInterval()); - syncWorker.addTask(countingTask); + @NotNull ShutdownHook addTask(@NotNull Runnable task); - return () -> removeTask(countingTask, false); - } - } - - protected void removeTask(@NonNull final CountingTask countingTask, final boolean async) { - if (async) if (syncWorker != null) syncWorker.removeTask(countingTask); - else if (asyncWorker != null) asyncWorker.removeTask(countingTask); + @Override + void close(); } - @Override - public TaskRemover addTask(@NonNull final TaskOptions taskOptions, final K key, @NonNull final T task) { - if (taskOptions.isAsync()) { - initAsyncWorker(); + interface BukkitTaskRunner extends TaskRunner, Runnable { - val countingTask = new CountingTask<>(task, taskOptions.getInterval()); - asyncWorker.addTask(key, countingTask); + void setup(@NotNull BukkitTask task, @NotNull Runnable disabler); + } - return () -> removeTask(countingTask, true); - } else { - initSyncWorker(); + @RequiredArgsConstructor + @FieldDefaults(level = AccessLevel.PUBLIC, makeFinal = true) + private static class PaperTaskRunner implements BukkitTaskRunner { - val countingTask = new CountingTask<>(task, taskOptions.getInterval()); - syncWorker.addTask(key, countingTask); + @NotNull Collection tasks; + @NonFinal /* because class initialization order */ @Nullable BukkitTask owningTask; + @NonFinal /* because class initialization order */ @Nullable Runnable disabler; - return () -> removeTask(countingTask, false); + public void run() { + for (val task : tasks) task.run(); } - } - - @Override - public Collection clearTasks() { - val tasks = asyncWorker.clearTasks(); - attemptCancelAsync(); - tasks.addAll(syncWorker.clearTasks()); - attemptCancelSync(); - - return mapToTasks(tasks); - } + @Override + public void setup(@NotNull final BukkitTask task, @NotNull final Runnable disabler) { + owningTask = task; + this.disabler = disabler; + } - protected void attemptCancelAsync() { - if (asyncWorker.isCancelled()) asyncWorker = null; - } + @Override + public @NotNull ShutdownHook addTask(@NotNull final Runnable task) { + tasks.add(task); - protected void attemptCancelSync() { - if (syncWorker.size() == 0) syncWorker = null; - } + return () -> removeTask(task); + } - @Value - @RequiredArgsConstructor - @FieldDefaults(level = AccessLevel.PRIVATE) - private static class CountingTask implements Runnable { + private void removeTask(@NotNull final Runnable task) { + tasks.remove(task); + if (tasks.isEmpty() && owningTask != null) { + assert disabler != null; + disabler.run(); - final T task; - final long interval; - @NonFinal long counter; + close(); + } + } @Override - public void run() { - if (++counter == interval) { - counter = 0; - - task.run(); - } + public void close() { + assert owningTask != null; + owningTask.cancel(); } } } diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java deleted file mode 100644 index 583490fdf..000000000 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPoolTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.schedule.pool; - -import org.bukkit.Bukkit; -import org.bukkit.Server; -import org.bukkit.plugin.Plugin; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Answers; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import ru.progrm_jarvis.minecraft.commons.schedule.pool.LoopPool.TaskOptions; - -import java.util.Random; - -import static java.lang.Math.abs; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.mock; - -@ExtendWith(MockitoExtension.class) -class SingleWorkerLoopPoolTest { - - private final Random RANDOM = new Random(); - - @Mock private Plugin plugin; - @InjectMocks private SingleWorkerLoopPool loopPool; - - @BeforeAll - static void setUp() { - Bukkit.setServer(mock(Server.class, Answers.RETURNS_MOCKS)); - } - - /* TODO - @Test - void addTask() { - } - - @Test - void removeTasks() { - } - - @Test - void removeTasks() { - } - - @Test - void removeTask1() { - } - - @Test - void removeTasks1() { - } - */ - - @Test - void testClearTasks() { - final int syncTasks = 1 + RANDOM.nextInt(15), asyncTasks = 1 + RANDOM.nextInt(15); - for (int i = 0; i < syncTasks; i++) loopPool - .addTask(TaskOptions.of(false, 1 + abs(RANDOM.nextLong())), () -> {}); - for (int i = 0; i < asyncTasks; i++) loopPool - .addTask(TaskOptions.of(true, 1 + abs(RANDOM.nextLong())), () -> {}); - assertEquals(syncTasks + asyncTasks, loopPool.tasksSize()); - - loopPool.clearTasks(); - assertEquals(0, loopPool.tasksSize()); - } -} From 6ddaab16a2a388ff202e228a4e3b42f86c05dfa0 Mon Sep 17 00:00:00 2001 From: PROgrm_JARvis Date: Sat, 4 Jul 2020 14:03:04 +0300 Subject: [PATCH 333/508] Use compact List removal syntax in PluginShutdownHandler Resolves #54 --- .../minecraft/commons/plugin/BukkitPluginShutdownUtil.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java index 0b5ba1a39..29dd5a6c3 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -72,10 +72,10 @@ private PluginShutdownHandler(@NonNull final Plugin plugin) { public void onPluginDisable(final PluginDisableEvent event) { // check if the plugin disabled is the right one if (event.getPlugin() == plugin) { - while (!shutdownHooks.isEmpty()) { - val hook = shutdownHooks.get(0); + val thisShutdownHooks = shutdownHooks; + while (!thisShutdownHooks.isEmpty()) { + val hook = thisShutdownHooks.remove(0); hook.shutdown(); - shutdownHooks.remove(hook); } } } From dd4073bef329cbd58dd8797fd0055e7ecb179e60 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Tue, 14 Jul 2020 01:54:40 +0300 Subject: [PATCH 334/508] Replace Trove with fastutil Resolves #104 --- fake-entity-lib/pom.xml | 4 +- .../misc/structure/StructureDescriptor.java | 13 +++---- minecraft-commons/pom.xml | 4 ++ .../commons/mapimage/MapImageColor.java | 16 ++++---- .../mapimage/MapImageMinecraftColors.java | 38 +++++++++---------- pom.xml | 6 +-- 6 files changed, 41 insertions(+), 40 deletions(-) diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index c2102755c..927e0b150 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -43,8 +43,8 @@ reflector - net.sf.trove4j - trove4j + it.unimi.dsi + fastutil diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java index ba63b7924..4f581c1ae 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java @@ -9,8 +9,8 @@ import com.google.gson.JsonElement; import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; -import gnu.trove.map.TIntObjectMap; -import gnu.trove.map.hash.TIntObjectHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import lombok.*; import lombok.experimental.FieldDefaults; import org.bukkit.Material; @@ -31,17 +31,16 @@ */ @Value @Builder -@FieldDefaults(level = AccessLevel.PRIVATE) public class StructureDescriptor { - @Singular private ImmutableList elements; + @Singular ImmutableList elements; - @Builder.Default private int frames = 0; + @Builder.Default int frames = 0; /** * Keyframes of the structure. */ - private TIntObjectMap keyframes; + Int2ObjectMap keyframes; private static final Gson gson = new Gson(); @@ -56,7 +55,7 @@ public static StructureDescriptor from(@NonNull final JsonRepresentation jsonRep val descriptor = builder().elements(elementList); // add elements to descriptor val keyframesList = jsonRepresentation.getOrderedKeyframes(); if (!keyframesList.isEmpty()) { - val keyframes = new TIntObjectHashMap(); + val keyframes = new Int2ObjectOpenHashMap(); for (val keyframe : keyframesList) keyframes .put(keyframe.tick, keyframe.toFrameUpdaterByElementNames(elementNames)); diff --git a/minecraft-commons/pom.xml b/minecraft-commons/pom.xml index 6cc38c6f3..15bbb1e63 100644 --- a/minecraft-commons/pom.xml +++ b/minecraft-commons/pom.xml @@ -92,5 +92,9 @@ org.mockito mockito-junit-jupiter + + it.unimi.dsi + fastutil + \ No newline at end of file diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java index 81d864b12..58cf2152b 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java @@ -2,8 +2,8 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; -import gnu.trove.map.TObjectByteMap; -import gnu.trove.map.hash.TObjectByteHashMap; +import it.unimi.dsi.fastutil.objects.Object2ByteMap; +import it.unimi.dsi.fastutil.objects.Object2ByteOpenHashMap; import lombok.*; import lombok.experimental.Accessors; import lombok.experimental.FieldDefaults; @@ -45,7 +45,7 @@ public class MapImageColor { /** * All associations of color's with their available IDs. */ - private static final TObjectByteMap COLOR_CODE_CACHE = new TObjectByteHashMap<>(); + private static final Object2ByteMap COLOR_CODE_CACHE = new Object2ByteOpenHashMap<>(); /** * 8 bits describing red part of the color @@ -61,7 +61,7 @@ public class MapImageColor { blue; /** - * An {@link int} representation of the color. Also used as the only field for hash-code generation. + * An {@code int} representation of the color. Also used as the only field for hash-code generation. */ @EqualsAndHashCode.Include int rgb; @@ -112,9 +112,9 @@ private MapImageColor(final int red, final int green, final int blue) { } /** - * Gets or creates cached map image color from specified {@link int}-RGB. + * Gets or creates cached map image color from specified {@code int}-RGB. * - * @param rgb RGB encoded as {@link int} + * @param rgb RGB encoded as {@code int} * @return cached or created and cached map image color */ @SneakyThrows @@ -143,7 +143,7 @@ private MapImageColor(final int red, final int green, final int blue) { * @param blue blue color channel * @return cached or created and cached map image color * - * @apiNote alias {@link #of(byte, byte, byte)} using {@link int}s not to perform casts in method call + * @apiNote alias {@link #of(byte, byte, byte)} using {@code int}s not to perform casts in method call */ @Nonnull public static MapImageColor of(final int red, final int green, final int blue) { return of((byte) red, (byte) green, (byte) blue); @@ -176,7 +176,7 @@ public static byte getClosestColorCode(final MapImageColor color) { * dissimilarity rate of each available with the one given. * This value is cached for further usage. * - * @param rgb RGB-color {@link int} for which to find the closest available color code + * @param rgb RGB-color {@code int} for which to find the closest available color code * @return closest available color id */ @SneakyThrows diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java index 052506e92..bdd44fb4d 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java @@ -1,8 +1,9 @@ package ru.progrm_jarvis.minecraft.commons.mapimage; -import gnu.trove.impl.unmodifiable.TUnmodifiableIntByteMap; -import gnu.trove.map.TIntByteMap; -import gnu.trove.map.hash.TIntByteHashMap; +import it.unimi.dsi.fastutil.ints.Int2ByteMap; +import it.unimi.dsi.fastutil.ints.Int2ByteMaps; +import it.unimi.dsi.fastutil.ints.Int2ByteOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntSet; import lombok.experimental.UtilityClass; import lombok.val; import ru.progrm_jarvis.minecraft.commons.util.image.ColorUtil; @@ -16,24 +17,21 @@ public class MapImageMinecraftColors { /** - * all available colors available in Minecraft associated with their {@link byte}-codes - *

- * {@link - * Taken from Minecraft Wiki} + * All available colors available in Minecraft associated with their {@link byte}-codes + * @see Taken from Minecraft Wiki */ - public final TIntByteMap MINECRAFT_RGB_COLOR_CODES; + public final Int2ByteMap MINECRAFT_RGB_COLOR_CODES; /** - * all available colors available in Minecraft + * All available colors available in Minecraft *

- * {@link - * Taken from Minecraft Wiki} + * @see Taken from Minecraft Wiki */ - private final int[] MINECRAFT_RGB_COLORS; + private final IntSet MINECRAFT_RGB_COLORS; static { // - val minecraftColors = new TIntByteHashMap(NO_COLOR_CODE); + val minecraftColors = new Int2ByteOpenHashMap(NO_COLOR_CODE); minecraftColors.put(ColorUtil.toArgb((byte) 89, (byte) 125, (byte) 39), (byte) 4); minecraftColors.put(ColorUtil.toArgb((byte) 109, (byte) 153, (byte) 48), (byte) 5); minecraftColors.put(ColorUtil.toArgb((byte) 127, (byte) 178, (byte) 56), (byte) 6); @@ -239,20 +237,20 @@ public class MapImageMinecraftColors { minecraftColors.put(ColorUtil.toArgb((byte) 37, (byte) 22, (byte) 16), (byte) 206); minecraftColors.put(ColorUtil.toArgb((byte) 19, (byte) 11, (byte) 8), (byte) 207); - MINECRAFT_RGB_COLOR_CODES = new TUnmodifiableIntByteMap(minecraftColors); - MINECRAFT_RGB_COLORS = MINECRAFT_RGB_COLOR_CODES.keys(); + MINECRAFT_RGB_COLOR_CODES = Int2ByteMaps.unmodifiable(minecraftColors); + MINECRAFT_RGB_COLORS = MINECRAFT_RGB_COLOR_CODES.keySet(); // } /** * Creates a new primitive map - * with keys being an {@link int} representation of an RGB color in Minecraft map + * with keys being an {@code int} representation of an RGB color in Minecraft map * and value being its code in Minecraft. * * @return primitive map of available map color codes in minecraft by their RGB colors */ - public TIntByteMap asNewPrimitiveMap() { - return new TIntByteHashMap(MINECRAFT_RGB_COLOR_CODES); + public Int2ByteMap asNewPrimitiveMap() { + return new Int2ByteOpenHashMap(MINECRAFT_RGB_COLOR_CODES); } /////////////////////////////////////////////////////////////////////////// @@ -262,7 +260,7 @@ public TIntByteMap asNewPrimitiveMap() { /** * Checks whether the specified color can be shown on a map without any distortion. * - * @param rgb RGB color as {@link int} + * @param rgb RGB color as {@code int} * @return {@code true} if this color can be shown on an in-game map without distortion anf {@code false} otherwise */ public boolean isMinecraftColor(final int rgb) { @@ -285,7 +283,7 @@ public boolean isMinecraftColor(final byte red, final byte green, final byte blu /** * Gets Minecraft map color code for the specified color. * - * @param rgb RGB color as {@link int} + * @param rgb RGB color as {@code int} * @return non-zero value being the found minecraft code for the color or {@code 0} if none was found */ public byte getMinecraftColorCode(final int rgb) { diff --git a/pom.xml b/pom.xml index 258a3204d..acfd1fbaa 100644 --- a/pom.xml +++ b/pom.xml @@ -271,9 +271,9 @@ 2.7 - net.sf.trove4j - trove4j - 3.0.3 + it.unimi.dsi + fastutil + 8.3.1 org.apache.httpcomponents From 7a9c67a98c97dd84a2b94f6cb282c38d39f1fd9a Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2020 23:00:16 +0000 Subject: [PATCH 335/508] Bump version.mockito from 3.3.3 to 3.4.0 Bumps `version.mockito` from 3.3.3 to 3.4.0. Updates `mockito-core` from 3.3.3 to 3.4.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.3.3...v3.4.0) Updates `mockito-junit-jupiter` from 3.3.3 to 3.4.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.3.3...v3.4.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index acfd1fbaa..39fff0d3a 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.5.2 1.6.2 - 3.3.3 + 3.4.0 From 22a74ef7ae475afe684d63dc15e0395e381c9f02 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Tue, 14 Jul 2020 02:02:54 +0300 Subject: [PATCH 336/508] Use fastutil's collections instead of Netty's --- .../commons/schedule/pool/SingleWorkerLoopPool.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java index 39ee72733..7da7c8828 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java @@ -1,7 +1,7 @@ package ru.progrm_jarvis.minecraft.commons.schedule.pool; -import io.netty.util.collection.LongObjectHashMap; -import io.netty.util.collection.LongObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import lombok.AccessLevel; import lombok.NonNull; import lombok.RequiredArgsConstructor; @@ -23,7 +23,7 @@ public final class SingleWorkerLoopPool implements LoopPool { @NonNull Plugin plugin; @NonNull BukkitScheduler scheduler; - @NonNull LongObjectMap syncTasks, asyncTasks; + @NonNull Long2ObjectMap syncTasks, asyncTasks; @Override public @NotNull ShutdownHook addTask(final @NotNull Runnable task, final long period, final boolean async) { @@ -46,7 +46,7 @@ public final class SingleWorkerLoopPool implements LoopPool { public static LoopPool create(final @NonNull Plugin plugin) { return new SingleWorkerLoopPool( plugin, plugin.getServer().getScheduler(), - new LongObjectHashMap<>(4), new LongObjectHashMap<>(4) + new Long2ObjectOpenHashMap<>(4), new Long2ObjectOpenHashMap<>(4) ); } From b6242e3eebb2ea55d1e118bbe0f9b6e2bc0dea4c Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Wed, 15 Jul 2020 19:11:04 +0300 Subject: [PATCH 337/508] Simplify `MinecraftEnvironment#isAvailable()` and `MinecraftEnvironment#setAvailable()` --- .../minecraft/commons/MinecraftEnvironment.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java index 965c6c823..70e0d911e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java @@ -38,13 +38,12 @@ public enum MinecraftEnvironment { @Deprecated @Synchronized public void setAvailable() { - this.available = true; + available = true; } @Synchronized public boolean isAvailable() { - if (available) return true; - else return available = classesAvailable() && packagesAvailable(); + return available || (available = classesAvailable() && packagesAvailable()); } private boolean packagesAvailable() { From 51f44f7ec87afbee0c0b7aa2a70abb8203fa1dff Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Wed, 15 Jul 2020 19:18:00 +0300 Subject: [PATCH 338/508] Add ItemStackUtil with `deepCopy(..)` method --- .../minecraft/commons/util/ItemStackUtil.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ItemStackUtil.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ItemStackUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ItemStackUtil.java new file mode 100644 index 000000000..3bc292087 --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ItemStackUtil.java @@ -0,0 +1,30 @@ +package ru.progrm_jarvis.minecraft.commons.util; + +import lombok.experimental.UtilityClass; +import lombok.var; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Utility for {@link ItemStack}-related functionality. + */ +@UtilityClass +public class ItemStackUtil { + + /** + * Deeply copies the given array of {@link ItemStack}s. + * + * @param items array to be deeply copied + * @return deep copy of the given items array + * + * @implNote {@link ItemStack#clone()} is used for cloning + */ + public @NotNull ItemStack @Nullable [] deepCopy(final @NotNull ItemStack[] items) { + final int length; + final ItemStack[] copy = new ItemStack[length = items.length]; + for (var i = 0; i < length; i++) copy[i] = items[i].clone(); + + return copy; + } +} From 319343be8d28bdaf03e0d7def5550e638587cdb5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 17 Jul 2020 05:42:21 +0000 Subject: [PATCH 339/508] Bump version.mockito from 3.4.0 to 3.4.2 Bumps `version.mockito` from 3.4.0 to 3.4.2. Updates `mockito-core` from 3.4.0 to 3.4.2 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.4.0...v3.4.2) Updates `mockito-junit-jupiter` from 3.4.0 to 3.4.2 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.4.0...v3.4.2) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 39fff0d3a..852b8bf34 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.5.2 1.6.2 - 3.4.0 + 3.4.2 From ecbaf6a56ec7559542097a25176afd489f6f2a9d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 20 Jul 2020 05:59:19 +0000 Subject: [PATCH 340/508] Bump version.mockito from 3.4.2 to 3.4.4 Bumps `version.mockito` from 3.4.2 to 3.4.4. Updates `mockito-core` from 3.4.2 to 3.4.4 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.4.2...v3.4.4) Updates `mockito-junit-jupiter` from 3.4.2 to 3.4.4 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.4.2...v3.4.4) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 852b8bf34..f193e5fda 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.5.2 1.6.2 - 3.4.2 + 3.4.4 From 8b2f66827bdd956245f817fbd973c90c3cb715a1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2020 05:54:25 +0000 Subject: [PATCH 341/508] Bump fastutil from 8.3.1 to 8.4.0 Bumps [fastutil](https://github.com/vigna/fastutil) from 8.3.1 to 8.4.0. - [Release notes](https://github.com/vigna/fastutil/releases) - [Changelog](https://github.com/vigna/fastutil/blob/master/CHANGES) - [Commits](https://github.com/vigna/fastutil/compare/8.3.1...8.4.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f193e5fda..6d84d0c1e 100644 --- a/pom.xml +++ b/pom.xml @@ -273,7 +273,7 @@ it.unimi.dsi fastutil - 8.3.1 + 8.4.0 org.apache.httpcomponents From d5d6e219d736d3ef56bf17872a35d0e98ee7a88d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2020 05:59:45 +0000 Subject: [PATCH 342/508] Bump bungeecord-api from 1.13-SNAPSHOT to 1.16-R0.3 Bumps [bungeecord-api](https://github.com/SpigotMC/BungeeCord) from 1.13-SNAPSHOT to 1.16-R0.3. - [Release notes](https://github.com/SpigotMC/BungeeCord/releases) - [Commits](https://github.com/SpigotMC/BungeeCord/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6d84d0c1e..d85d05224 100644 --- a/pom.xml +++ b/pom.xml @@ -246,7 +246,7 @@ net.md-5 bungeecord-api - 1.13-SNAPSHOT + 1.16-R0.3 provided From bbd8015988662ee6f3a49f48cdc298ba8c5308d7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2020 18:37:59 +0000 Subject: [PATCH 343/508] Bump maven-surefire-plugin from 3.0.0-M3 to 3.0.0-M5 Bumps [maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.0.0-M3 to 3.0.0-M5. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.0.0-M3...surefire-3.0.0-M5) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d85d05224..66ff2240b 100644 --- a/pom.xml +++ b/pom.xml @@ -101,7 +101,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M3 + 3.0.0-M5 0 From fe58065b28279fe742bb3884ce0358a2c3566afd Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2020 18:38:04 +0000 Subject: [PATCH 344/508] Bump version.junit from 5.5.2 to 5.6.2 Bumps `version.junit` from 5.5.2 to 5.6.2. Updates `junit-jupiter-api` from 5.5.2 to 5.6.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.5.2...r5.6.2) Updates `junit-jupiter-engine` from 5.5.2 to 5.6.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.5.2...r5.6.2) Updates `junit-jupiter-params` from 5.5.2 to 5.6.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.5.2...r5.6.2) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d85d05224..34ff749f7 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ UTF-8 1.0-SNAPSHOT - 5.5.2 + 5.6.2 1.6.2 3.4.4 From 485e99e2ea586bdf0918972d4e7e878b49d488f3 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Tue, 4 Aug 2020 18:42:11 +0300 Subject: [PATCH 345/508] Add emptiness-checking methods to ItemStackUtil --- .../minecraft/commons/util/ItemStackUtil.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ItemStackUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ItemStackUtil.java index 3bc292087..06c93b964 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ItemStackUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ItemStackUtil.java @@ -2,7 +2,9 @@ import lombok.experimental.UtilityClass; import lombok.var; +import org.bukkit.Material; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,4 +29,28 @@ public class ItemStackUtil { return copy; } + + /** + * Tests if the given item is empty. + * + * @param item item to check for emptiness + * @return {@code true} if and only if the item is {@code null} + * or of empty type (i.e. {@link Material#AIR}) + */ + @Contract("null -> true") + public boolean isEmpty(final @Nullable ItemStack item) { + return item == null || item.getType() == Material.AIR; + } + + /** + * Tests if the given item is not empty. + * + * @param item item to check for non-emptiness + * @return {@code false} if and only if the item is not {@code null} + * and not of empty type (i.e. {@link Material#AIR}) + */ + @Contract("null -> false") + public boolean isNotEmpty(final @Nullable ItemStack item) { + return item != null && item.getType() != Material.AIR; + } } From 2c7d9cff8745bd34a6a78dc134d131e4398c57b5 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Tue, 4 Aug 2020 19:06:22 +0300 Subject: [PATCH 346/508] Configure surefire forking --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 66ff2240b..a5f8fbcad 100644 --- a/pom.xml +++ b/pom.xml @@ -104,6 +104,8 @@ 3.0.0-M5 0 + true + false From 3d5684b23a4467a14405de8bb43ac09a69681e8e Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Tue, 4 Aug 2020 19:07:34 +0300 Subject: [PATCH 347/508] Fix scopes of annotation-related dependencies --- pom.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index a5f8fbcad..f3da7e382 100644 --- a/pom.xml +++ b/pom.xml @@ -127,10 +127,6 @@ - - org.projectlombok:lombok - org.jetbrains:annotations - com.google.code.findbugs:jsr305 org.openjdk.jmh:* @@ -288,18 +284,21 @@ org.projectlombok lombok 1.18.12 + provided true org.jetbrains annotations 19.0.0 + provided true com.google.code.findbugs jsr305 3.0.2 + provided true From e85ec6f893fd506e6aa9b10f73d442e8d3bb3f5e Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Tue, 4 Aug 2020 19:08:38 +0300 Subject: [PATCH 348/508] Add jetbrains annotations to MCUnit --- mc-unit/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mc-unit/pom.xml b/mc-unit/pom.xml index b9b9a62c5..eacf1694b 100644 --- a/mc-unit/pom.xml +++ b/mc-unit/pom.xml @@ -31,6 +31,10 @@ org.projectlombok lombok + + org.jetbrains + annotations + com.google.code.findbugs jsr305 From 07cacb80a2ef356849f68f4314fc5b9f0177332e Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Tue, 4 Aug 2020 19:10:27 +0300 Subject: [PATCH 349/508] Cleanup `NmsTestUtil` --- .../mcunit/util/NmsTestUtil.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/util/NmsTestUtil.java b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/util/NmsTestUtil.java index b4a6dda6a..cd01730cb 100644 --- a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/util/NmsTestUtil.java +++ b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/util/NmsTestUtil.java @@ -2,8 +2,8 @@ import lombok.NonNull; import lombok.experimental.UtilityClass; -import lombok.val; import org.bukkit.Bukkit; +import org.bukkit.Server; import java.util.regex.Pattern; @@ -16,18 +16,17 @@ public class NmsTestUtil { /** * Pattern matching a server class name which has {@code v__R} in its package. */ - private static final Pattern NMS_SERVER_VERSION_PART_PATTERN = Pattern - .compile("(?:\\w+\\.)*v\\d+_\\d+_R\\d+\\.\\w+"); + private final Pattern NMS_SERVER_VERSION_PART_PATTERN = Pattern.compile("(?:\\w+\\.)*v\\d+_\\d+_R\\d+\\.\\w+"); /** * Checks whether the specified class name is a valid NMS server name. * * @param serverName server name to check - * @return {@link true} if the class name is a valid NM-server name and {@link false} otherwise + * @return {@code true} if the class name is a valid NM-server name and {@code false} otherwise * * @apiNote valid NMS-server name contains {@code v__R} in its package */ - public boolean isNmsServerClassName(@NonNull final String serverName) { + public boolean isNmsServerClassName(final @NonNull String serverName) { return NMS_SERVER_VERSION_PART_PATTERN.matcher(serverName).matches(); } @@ -35,18 +34,16 @@ public boolean isNmsServerClassName(@NonNull final String serverName) { * Checks whether current environment is an NMS-environment. * * @return {@code true} if current environment is (possibly) a valid NMS-environment - * and {@link false} otherwise + * and {@code false} otherwise * - * @apiNote this method checks whether {@link Bukkit#getServer()} is not {@link null} + * @apiNote this method checks whether {@link Bukkit#getServer()} is not {@code null} * and that its canonical class name is a valid NMS-server class name * * @see #isNmsServerClassName(String) method used for checking {@link Bukkit#getServer()}'s class's canonical name */ public boolean isEnvironmentNms() { - val server = Bukkit.getServer(); - //noinspection ConstantConditions - if (server == null) return false; - - return isNmsServerClassName(server.getClass().getCanonicalName()); + final Server server; + //noinspection ConstantConditions: `getSetver()` actually nullable + return (server = Bukkit.getServer()) != null && isNmsServerClassName(server.getClass().getCanonicalName()); } } From 090f65c4024a729545e0a33c2d1e81b4dba47cb9 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Tue, 4 Aug 2020 19:11:03 +0300 Subject: [PATCH 350/508] Rework annotation-based NMS-condition --- .../mcunit/annotation/EnabledIfNMS.java | 19 ------------- .../mcunit/annotation/EnabledIfNms.java | 15 +++++++++++ .../condition/NmsAvailableTestCondition.java | 27 +++++++++++++++++++ .../util/chat/ChatComponentUtilTest.java | 4 +-- 4 files changed, 44 insertions(+), 21 deletions(-) delete mode 100644 mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNMS.java create mode 100644 mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNms.java create mode 100644 mc-unit/src/main/java/ru/progrm_jarvis/mcunit/condition/NmsAvailableTestCondition.java diff --git a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNMS.java b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNMS.java deleted file mode 100644 index a5e3e9f70..000000000 --- a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNMS.java +++ /dev/null @@ -1,19 +0,0 @@ -package ru.progrm_jarvis.mcunit.annotation; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledIf; - -import java.lang.annotation.*; - -/** - * Indicates that the test should only be run if current environment has NMS-classes. - */ -@Test -@Documented -@Target({ElementType.TYPE, ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) -@EnabledIf( - value = "Java.type(\"ru.progrm_jarvis.mcunit.util.NmsTestUtil\").isEnvironmentNms()", - reason = "Current environment doesn't have NMS classes needed for testing" -) -public @interface EnabledIfNMS {} diff --git a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNms.java b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNms.java new file mode 100644 index 000000000..0c32873b7 --- /dev/null +++ b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/annotation/EnabledIfNms.java @@ -0,0 +1,15 @@ +package ru.progrm_jarvis.mcunit.annotation; + +import org.junit.jupiter.api.extension.ExtendWith; +import ru.progrm_jarvis.mcunit.condition.NmsAvailableTestCondition; + +import java.lang.annotation.*; + +/** + * Indicates that the test should only be run if current environment has NMS-classes. + */ +@Documented +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@ExtendWith(NmsAvailableTestCondition.class) +public @interface EnabledIfNms {} diff --git a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/condition/NmsAvailableTestCondition.java b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/condition/NmsAvailableTestCondition.java new file mode 100644 index 000000000..576b77691 --- /dev/null +++ b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/condition/NmsAvailableTestCondition.java @@ -0,0 +1,27 @@ +package ru.progrm_jarvis.mcunit.condition; + +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.extension.ConditionEvaluationResult; +import org.junit.jupiter.api.extension.ExecutionCondition; +import org.junit.jupiter.api.extension.ExtensionContext; +import ru.progrm_jarvis.mcunit.annotation.EnabledIfNms; +import ru.progrm_jarvis.mcunit.util.NmsTestUtil; + +import static org.junit.jupiter.api.extension.ConditionEvaluationResult.disabled; +import static org.junit.jupiter.api.extension.ConditionEvaluationResult.enabled; +import static org.junit.platform.commons.util.AnnotationUtils.isAnnotated; + +public final class NmsAvailableTestCondition implements ExecutionCondition { + + private static final @NotNull ConditionEvaluationResult + ENABLED_BY_DEFAULT = enabled('@' + EnabledIfNms.class.getName() + " is not present"), + ENABLED_WITH_NMS_AVAILABLE = enabled("Enabled with NMS available"), + DISABLED_WITH_NMS_UNAVAILABLE = disabled("Disabled with NMS unavailable"); + + @Override + public ConditionEvaluationResult evaluateExecutionCondition(final @NotNull ExtensionContext context) { + return isAnnotated(context.getElement(), EnabledIfNms.class) + ? NmsTestUtil.isEnvironmentNms() ? ENABLED_WITH_NMS_AVAILABLE : DISABLED_WITH_NMS_UNAVAILABLE + : ENABLED_BY_DEFAULT; + } +} diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtilTest.java index c0547549e..4121dea1a 100644 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtilTest.java +++ b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtilTest.java @@ -4,14 +4,14 @@ import com.google.gson.GsonBuilder; import lombok.val; import org.junit.jupiter.api.Test; -import ru.progrm_jarvis.mcunit.annotation.EnabledIfNMS; +import ru.progrm_jarvis.mcunit.annotation.EnabledIfNms; import static org.junit.jupiter.api.Assertions.assertEquals; class ChatComponentUtilTest { @Test - @EnabledIfNMS + @EnabledIfNms void testWrappedChatComponentGsonSerializer() { val gson = new GsonBuilder() .registerTypeAdapter(WrappedChatComponent.class, ChatComponentUtil.wrappedChatComponentGsonSerializer()) From 798e50f94d327f6dc8b971f7564026f04c56ac2f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 4 Aug 2020 16:23:40 +0000 Subject: [PATCH 351/508] Bump version.mockito from 3.4.4 to 3.4.6 Bumps `version.mockito` from 3.4.4 to 3.4.6. Updates `mockito-core` from 3.4.4 to 3.4.6 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.4.4...v3.4.6) Updates `mockito-junit-jupiter` from 3.4.4 to 3.4.6 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.4.4...v3.4.6) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f3da7e382..e3567ba0b 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.5.2 1.6.2 - 3.4.4 + 3.4.6 From 2aa61100af9b4fd9794abaf5188ee22dd6a4d9e8 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Tue, 4 Aug 2020 19:46:42 +0300 Subject: [PATCH 352/508] Update spigot API to latest --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cedc5ee0f..08195ef63 100644 --- a/pom.xml +++ b/pom.xml @@ -238,7 +238,7 @@ org.spigotmc spigot-api - 1.13.2-R0.1-SNAPSHOT + 1.16.1-R0.1-SNAPSHOT provided From cdda425ce77ac6af5f27e001708d63516bda7b0b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 10 Aug 2020 05:55:32 +0000 Subject: [PATCH 353/508] Bump fastutil from 8.4.0 to 8.4.1 Bumps [fastutil](https://github.com/vigna/fastutil) from 8.4.0 to 8.4.1. - [Release notes](https://github.com/vigna/fastutil/releases) - [Changelog](https://github.com/vigna/fastutil/blob/master/CHANGES) - [Commits](https://github.com/vigna/fastutil/compare/8.4.0...8.4.1) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 08195ef63..f5e05555d 100644 --- a/pom.xml +++ b/pom.xml @@ -271,7 +271,7 @@ it.unimi.dsi fastutil - 8.4.0 + 8.4.1 org.apache.httpcomponents From ac8f043e96749328b651c96e2b4a9ee9e8919ae1 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 11 Aug 2020 05:48:15 +0000 Subject: [PATCH 354/508] Bump annotations from 19.0.0 to 20.0.0 Bumps [annotations](https://github.com/JetBrains/java-annotations) from 19.0.0 to 20.0.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/19.0.0...20.0.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f5e05555d..cea87b40a 100644 --- a/pom.xml +++ b/pom.xml @@ -290,7 +290,7 @@ org.jetbrains annotations - 19.0.0 + 20.0.0 provided true From d72049c2f672efd6eb3ec2df7df5814e91d90eb3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 17 Aug 2020 06:05:09 +0000 Subject: [PATCH 355/508] Bump version.mockito from 3.4.6 to 3.5.0 Bumps `version.mockito` from 3.4.6 to 3.5.0. Updates `mockito-core` from 3.4.6 to 3.5.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.4.6...v3.5.0) Updates `mockito-junit-jupiter` from 3.4.6 to 3.5.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.4.6...v3.5.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cea87b40a..0ea3acccb 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.6.2 1.6.2 - 3.4.6 + 3.5.0 From 52cba2bafcda921e18fa6fc61a7380f09517025d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 19 Aug 2020 05:45:56 +0000 Subject: [PATCH 356/508] Bump version.mockito from 3.5.0 to 3.5.2 Bumps `version.mockito` from 3.5.0 to 3.5.2. Updates `mockito-core` from 3.5.0 to 3.5.2 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.0...v3.5.2) Updates `mockito-junit-jupiter` from 3.5.0 to 3.5.2 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.0...v3.5.2) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0ea3acccb..ec1505550 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.6.2 1.6.2 - 3.5.0 + 3.5.2 From b63f59b7569ebf7a323030b55588799053bd4e27 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2020 05:23:13 +0000 Subject: [PATCH 357/508] Bump version.mockito from 3.5.2 to 3.5.5 Bumps `version.mockito` from 3.5.2 to 3.5.5. Updates `mockito-core` from 3.5.2 to 3.5.5 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.2...v3.5.5) Updates `mockito-junit-jupiter` from 3.5.2 to 3.5.5 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.2...v3.5.5) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ec1505550..4fdd00f7a 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.6.2 1.6.2 - 3.5.2 + 3.5.5 From 06e7a20ac1baa9630deed9dc51beff61ad3c30b5 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 25 Aug 2020 05:21:10 +0000 Subject: [PATCH 358/508] Bump version.mockito from 3.5.5 to 3.5.6 Bumps `version.mockito` from 3.5.5 to 3.5.6. Updates `mockito-core` from 3.5.5 to 3.5.6 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.5...v3.5.6) Updates `mockito-junit-jupiter` from 3.5.5 to 3.5.6 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.5...v3.5.6) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4fdd00f7a..7789bb103 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.6.2 1.6.2 - 3.5.5 + 3.5.6 From e721b8c001d0a245f37ea95a37e7354c3a14bcfe Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 26 Aug 2020 05:20:14 +0000 Subject: [PATCH 359/508] Bump version.mockito from 3.5.6 to 3.5.7 Bumps `version.mockito` from 3.5.6 to 3.5.7. Updates `mockito-core` from 3.5.6 to 3.5.7 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.6...v3.5.7) Updates `mockito-junit-jupiter` from 3.5.6 to 3.5.7 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.6...v3.5.7) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7789bb103..4e20ae75b 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.6.2 1.6.2 - 3.5.6 + 3.5.7 From f5ffb8d09d6603a968c18afde4e4f20ab2357e4d Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 2 Sep 2020 05:20:32 +0000 Subject: [PATCH 360/508] Bump version.mockito from 3.5.7 to 3.5.9 Bumps `version.mockito` from 3.5.7 to 3.5.9. Updates `mockito-core` from 3.5.7 to 3.5.9 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.7...v3.5.9) Updates `mockito-junit-jupiter` from 3.5.7 to 3.5.9 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.7...v3.5.9) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4e20ae75b..3926a1c7d 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.6.2 1.6.2 - 3.5.7 + 3.5.9 From 4118a4e15602c0548c9b38d93ade38a1768974be Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Wed, 2 Sep 2020 05:26:18 +0000 Subject: [PATCH 361/508] Bump annotations from 20.0.0 to 20.1.0 Bumps [annotations](https://github.com/JetBrains/java-annotations) from 20.0.0 to 20.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/20.0.0...20.1.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3926a1c7d..9b5505fa9 100644 --- a/pom.xml +++ b/pom.xml @@ -290,7 +290,7 @@ org.jetbrains annotations - 20.0.0 + 20.1.0 provided true From 8a1d03cd39f8744af77f35cb10419fd8b9ff56d7 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 4 Sep 2020 05:20:21 +0000 Subject: [PATCH 362/508] Bump version.mockito from 3.5.9 to 3.5.10 Bumps `version.mockito` from 3.5.9 to 3.5.10. Updates `mockito-core` from 3.5.9 to 3.5.10 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.9...v3.5.10) Updates `mockito-junit-jupiter` from 3.5.9 to 3.5.10 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.9...v3.5.10) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9b5505fa9..7d4a04e92 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.6.2 1.6.2 - 3.5.9 + 3.5.10 From 5f39454ebef817a7f98ae9e5ebcac4c35a842904 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 10 Sep 2020 05:21:32 +0000 Subject: [PATCH 363/508] Bump commons-io from 2.7 to 2.8.0 Bumps commons-io from 2.7 to 2.8.0. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7d4a04e92..60525dfd1 100644 --- a/pom.xml +++ b/pom.xml @@ -266,7 +266,7 @@ commons-io commons-io - 2.7 + 2.8.0 it.unimi.dsi From c5cc482e1e2335c67d8f021a6c7edc33eea8dcb3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2020 05:26:46 +0000 Subject: [PATCH 364/508] Bump version.junit.platform from 1.6.2 to 1.7.0 Bumps `version.junit.platform` from 1.6.2 to 1.7.0. Updates `junit-platform-launcher` from 1.6.2 to 1.7.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.6.2 to 1.7.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 60525dfd1..15d57e8f8 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.0-SNAPSHOT 5.6.2 - 1.6.2 + 1.7.0 3.5.10 From 3960d0d3fd405d5374778f01610d7c701df63a3f Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 14 Sep 2020 05:32:59 +0000 Subject: [PATCH 365/508] Bump version.junit from 5.6.2 to 5.7.0 Bumps `version.junit` from 5.6.2 to 5.7.0. Updates `junit-jupiter-api` from 5.6.2 to 5.7.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.6.2...r5.7.0) Updates `junit-jupiter-engine` from 5.6.2 to 5.7.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.6.2...r5.7.0) Updates `junit-jupiter-params` from 5.6.2 to 5.7.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.6.2...r5.7.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 15d57e8f8..ef8a11185 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ UTF-8 1.0-SNAPSHOT - 5.6.2 + 5.7.0 1.7.0 3.5.10 From 168efda559202221db63d9f62e9b7603ee1a91a2 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 18 Sep 2020 05:21:16 +0000 Subject: [PATCH 366/508] Bump version.mockito from 3.5.10 to 3.5.11 Bumps `version.mockito` from 3.5.10 to 3.5.11. Updates `mockito-core` from 3.5.10 to 3.5.11 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.10...v3.5.11) Updates `mockito-junit-jupiter` from 3.5.10 to 3.5.11 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.10...v3.5.11) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ef8a11185..9c8cc314d 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.7.0 1.7.0 - 3.5.10 + 3.5.11 From 2bd3aa9c2b54dcf0fb3f9e6fc0c5dfae7a1f1bdb Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 18 Sep 2020 21:19:31 +0300 Subject: [PATCH 367/508] Cleanup annotations and entities code --- fake-entity-lib/pom.xml | 5 + .../entity/AbstractBasicFakeEntity.java | 314 +++++++++--------- .../entity/AbstractFakeEntity.java | 2 +- .../entity/AbstractObservableFakeEntity.java | 7 +- .../AbstractPlayerContainingFakeEntity.java | 20 +- .../entity/ArmorStandBlockItem.java | 46 +-- .../fakeentitylib/entity/BasicFakeEntity.java | 17 +- .../entity/SimpleLivingFakeEntity.java | 244 ++++++++------ .../behaviour/FakeEntityInteraction.java | 6 +- .../behaviour/FakeEntityInteractionEvent.java | 2 +- ...ocolBasedFakeEntityInteractionHandler.java | 9 +- .../AbstractSetBasedEntityManager.java | 15 +- .../entity/management/FakeEntityManager.java | 2 +- .../management/FakeEntityManagerGroup.java | 18 +- .../observer/PeriodicFakeEntityObserver.java | 13 +- .../misc/structure/Structure.java | 4 +- .../misc/structure/StructureDescriptor.java | 20 +- .../structure/StructureDescriptorTest.java | 2 +- lib-loader/pom.xml | 4 +- .../minecraft/libloader/LibCoords.java | 48 +-- .../minecraft/libloader/LibLoader.java | 26 +- .../io/http/HttpClientArgumentMatchers.java | 9 +- .../mcunit/io/http/HttpClientMocks.java | 4 +- .../commons/MinecraftEnvironment.java | 2 +- .../minecraft/commons/async/AsyncRunners.java | 7 +- .../commons/block/SnakyBlockChain.java | 24 +- .../minecraft/commons/chunk/ChunkUtil.java | 4 +- .../minecraft/commons/enchant/Enchant.java | 2 +- .../commons/event/FluentBukkitEvents.java | 18 +- .../minecraft/commons/item/ItemBuilder.java | 24 +- .../commons/item/ItemMetaBuilder.java | 20 +- .../commons/mapimage/DefaultMapImage.java | 4 +- .../minecraft/commons/mapimage/MapImage.java | 24 +- .../commons/mapimage/MapImageColor.java | 26 +- .../minecraft/commons/mapimage/MapImages.java | 8 +- .../mapimage/display/PlayerMapManager.java | 6 +- .../display/ProtocolBasedMapImageDisplay.java | 24 +- .../math/dimensional/CuboidFigure.java | 4 +- .../commons/math/dimensional/Figure3D.java | 4 +- .../commons/math/dimensional/PointFigure.java | 4 +- .../commons/mojang/MojangApiManager.java | 32 +- .../minecraft/commons/mojang/MojangUtil.java | 6 +- .../minecraft/commons/nms/Conversions.java | 12 +- .../minecraft/commons/nms/LegacySupport.java | 26 +- .../minecraft/commons/nms/NmsUtil.java | 6 +- .../nms/metadata/MetadataGenerator.java | 4 +- .../nms/protocol/misc/PacketListeners.java | 52 +-- .../misc/PacketWrapperPacketAssociations.java | 16 +- .../nms/protocol/misc/PacketWrapperUtil.java | 4 +- .../minecraft/commons/player/PlayerUtil.java | 6 +- .../player/collection/PlayerContainers.java | 14 +- .../registry/DefaultPlayerRegistry.java | 8 +- .../player/registry/PlayerRegistries.java | 20 +- .../player/registry/PlayerRegistry.java | 6 +- .../plugin/BukkitPluginShutdownUtil.java | 2 +- .../chain/AbstractSchedulerChain.java | 12 +- .../schedule/chain/BukkitSchedulerChain.java | 15 +- .../schedule/misc/KeyedSchedulerGroup.java | 2 +- .../commons/schedule/misc/SchedulerGroup.java | 6 +- .../schedule/misc/SchedulerGroups.java | 26 +- .../schedule/pool/SingleWorkerLoopPool.java | 6 +- .../task/AbstractSchedulerRunnable.java | 12 +- .../task/CancellingBukkitRunnable.java | 2 +- .../conditional/AbstractConditionalTask.java | 2 +- .../initializer/BukkitTaskInitializers.java | 24 +- .../task/timer/AbstractBukkitTimer.java | 4 +- .../task/timer/AbstractCallbackTimer.java | 4 +- .../timer/AbstractConcurrentBukkitTimer.java | 8 +- .../AbstractConcurrentCallbackTimer.java | 8 +- .../minecraft/commons/util/LocationUtil.java | 2 +- .../commons/util/ReflectionUtil.java | 2 +- .../commons/util/SystemPropertyUtil.java | 36 +- .../util/function/UncheckedFunction.java | 2 +- .../commons/util/image/ImageUtil.java | 8 +- .../minecraft/commons/util/io/FileUtil.java | 2 +- .../commons/util/primitive/IntWrapper.java | 16 +- .../ObjectAlreadyShutDownException.java | 7 +- .../commons/util/shutdown/ShutdownHooks.java | 36 +- .../minecraft/commons/util/time/Time.java | 2 +- .../commons/util/title/TitleUtil.java | 42 +-- .../util/primitive/IntWrapperTest.java | 24 +- 81 files changed, 804 insertions(+), 762 deletions(-) diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index 927e0b150..339c2d208 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -51,6 +51,11 @@ org.projectlombok lombok + + org.jetbrains + annotations + 20.1.0 + com.google.code.findbugs jsr305 diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java index 2a3d48eec..a31ab23eb 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractBasicFakeEntity.java @@ -7,12 +7,12 @@ import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -import ru.progrm_jarvis.minecraft.commons.math.dimensional.Figure3D; -import ru.progrm_jarvis.minecraft.commons.math.dimensional.PointFigure; +import org.jetbrains.annotations.Nullable; -import javax.annotation.Nullable; import java.util.*; +import static java.util.Collections.singletonList; + /** * Base for most common implementations of {@link BasicFakeEntity} containing player logic base. */ @@ -23,30 +23,26 @@ public abstract class AbstractBasicFakeEntity extends AbstractPlayerContainingFa /** * Metadata of this fake entity */ - @Nullable @Getter WrappedDataWatcher metadata; + @Getter @Nullable WrappedDataWatcher metadata; /** * Velocity of this fake entity */ @NonNull Vector velocity; - @NonNull @Getter Figure3D hitbox; - /** * Whether optimized packets should use for moving the entity or not */ boolean compactMoving; public AbstractBasicFakeEntity(final boolean global, final int viewDistance, - @NonNull final Location location, - @NonNull final Map players, - @Nullable final Vector velocity, @Nullable final WrappedDataWatcher metadata) { + final @NonNull Location location, + final @NonNull Map players, + final @Nullable Vector velocity, final @Nullable WrappedDataWatcher metadata) { super(viewDistance, global, location, players); this.velocity = velocity == null ? new Vector() : velocity; this.metadata = metadata; - - hitbox = PointFigure.from(location); } /////////////////////////////////////////////////////////////////////////// @@ -59,28 +55,28 @@ public AbstractBasicFakeEntity(final boolean global, final int viewDistance, protected abstract void sendMetadata(); @Override - public void setMetadata(@NonNull final WrappedDataWatcher metadata) { + public void setMetadata(final @NonNull WrappedDataWatcher metadata) { this.metadata = metadata.deepClone(); sendMetadata(); } @Override - public void setMetadata(@NonNull final List metadata) { + public void setMetadata(final @NonNull List metadata) { this.metadata = new WrappedDataWatcher(metadata); sendMetadata(); } @Override - public void setMetadata(@NonNull final Collection metadata) { + public void setMetadata(final @NonNull Collection metadata) { setMetadata(new ArrayList<>(metadata)); sendMetadata(); } @Override - public void setMetadata(@NonNull final WrappedWatchableObject... metadata) { + public void setMetadata(final @NonNull WrappedWatchableObject... metadata) { setMetadata(Arrays.asList(metadata)); sendMetadata(); @@ -89,7 +85,7 @@ public void setMetadata(@NonNull final WrappedWatchableObject... metadata) { @Override public void addMetadata(final Collection metadata) { final WrappedDataWatcher thisMetadata; - if ((thisMetadata = this.metadata) == null) this.metadata = new WrappedDataWatcher(Arrays.asList(metadata)); + if ((thisMetadata = this.metadata) == null) this.metadata = new WrappedDataWatcher(singletonList(metadata)); else for (val metadatum : metadata) thisMetadata .setObject(metadatum.getWatcherObject(), metadatum.getRawValue()); @@ -108,18 +104,20 @@ else for (val metadatum : metadata) thisMetadata @Override public void removeMetadata(final Iterable indexes) { - if (metadata == null) return; + final WrappedDataWatcher thisMetadata; + if ((thisMetadata = metadata) == null) return; - for (val index : indexes) metadata.remove(index); + for (val index : indexes) thisMetadata.remove(index); sendMetadata(); } @Override public void removeMetadata(final int... indexes) { - if (metadata == null) return; + final WrappedDataWatcher thisMetadata; + if ((thisMetadata = metadata) == null) return; - for (val index : indexes) metadata.remove(index); + for (val index : indexes) thisMetadata.remove(index); sendMetadata(); } @@ -176,192 +174,184 @@ protected abstract void performTeleportation(double x, double y, double z, @Override public void move(final double dx, final double dy, final double dz, final float dYaw, final float dPitch) { - if (compactMoving) { - if (dx == 0 && dy == 0 && dz == 0) { - if (dYaw != 0 || dPitch != 0) { - final float yaw = location.getYaw() + dYaw, pitch = location.getPitch() + dPitch; + if (compactMoving) performCompactMove(dx, dy, dz, dYaw, dPitch); + else performNonCompactMove(dx, dy, dz, dYaw, dPitch); + } - performLook(yaw, pitch); + protected void performCompactMove(final double dx, final double dy, final double dz, + final float dYaw, final float dPitch) { + val thisLocation = location; + if (dx == 0 && dy == 0 && dz == 0) { + if (dYaw != 0 || dPitch != 0) { + final float yaw = thisLocation.getYaw() + dYaw, pitch = thisLocation.getPitch() + dPitch; - location.setYaw(yaw); - location.setPitch(pitch); - } - } else { - velocity.setX(dx); - velocity.setY(dy); - velocity.setZ(dz); - // use teleportation if any of axises is above 8 blocks limit - if (dx > 8 || dy > 8 || dz > 8) { - final double x = location.getX() + dx, y = location.getY() + dy, z = location.getZ() + dz; - final float yaw = location.getYaw() + dYaw, pitch = location.getPitch() + dPitch; - - performTeleportation(x, y, z, pitch, yaw, true); - - location.setX(x); - location.setY(y); - location.setZ(z); - location.setYaw(yaw); - location.setPitch(pitch); - } - // otherwise use move - else { - if (dYaw == 0 && dPitch == 0) performMove(dx, dy, dz, true); - else { - performMoveLook(dx, dy, dz, dYaw, dPitch, true); + performLook(yaw, pitch); - location.setYaw(location.getYaw() + dYaw); - location.setPitch(location.getPitch() + dPitch); - } + thisLocation.setYaw(yaw); + thisLocation.setPitch(pitch); + } + } else { + final Vector thisVelocity; + + (thisVelocity = velocity).setX(dx); + thisVelocity.setY(dy); + thisVelocity.setZ(dz); + // use teleportation if any of axises is above 8 blocks limit + if (dx > 8 || dy > 8 || dz > 8) { + final double x = thisLocation.getX() + dx, y = thisLocation.getY() + dy, z = thisLocation.getZ() + dz; + final float yaw = thisLocation.getYaw() + dYaw, pitch = thisLocation.getPitch() + dPitch; + + performTeleportation(x, y, z, pitch, yaw, true); + + thisLocation.setX(x); + thisLocation.setY(y); + thisLocation.setZ(z); + thisLocation.setYaw(yaw); + thisLocation.setPitch(pitch); + } + // otherwise use move + else { + if (dYaw == 0 && dPitch == 0) performMove(dx, dy, dz, true); + else { + performMoveLook(dx, dy, dz, dYaw, dPitch, true); - location.setX(location.getX() + dx); - location.setY(location.getY() + dy); - location.setZ(location.getZ() + dz); + thisLocation.setYaw(thisLocation.getYaw() + dYaw); + thisLocation.setPitch(thisLocation.getPitch() + dPitch); } - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); + thisLocation.setX(thisLocation.getX() + dx); + thisLocation.setY(thisLocation.getY() + dy); + thisLocation.setZ(thisLocation.getZ() + dz); } - } else { - var changeLocation = false; - double x = Double.NaN; - if (dx != 0) { - changeLocation = true; - location.setX(x = (location.getX() + dx)); - } - double y = Double.NaN; - if (dy != 0) { - changeLocation = true; + thisVelocity.setX(0); + thisVelocity.setY(0); + thisVelocity.setZ(0); + } + } + protected void performNonCompactMove(final double dx, final double dy, final double dz, + final float dYaw, final float dPitch) { + val thisLocation = location; - location.setY(y = (location.getY() + dy)); - } - double z = Double.NaN; - if (dz != 0) { - changeLocation = true; + var changeLocation = false; + double x = Double.NaN; + if (dx != 0) { + changeLocation = true; - location.setZ(z = (location.getZ() + dz)); - } + thisLocation.setX(x = (thisLocation.getX() + dx)); + } + double y = Double.NaN; + if (dy != 0) { + changeLocation = true; - var changeLook = false; - float yaw = Float.NaN; - if (dYaw != 0) { - changeLook = true; + thisLocation.setY(y = (thisLocation.getY() + dy)); + } + double z = Double.NaN; + if (dz != 0) { + changeLocation = true; - location.setYaw(yaw = (location.getYaw() + dYaw)); - } - float pitch = Float.NaN; - if (dPitch != 0) { - changeLook = true; + thisLocation.setZ(z = (thisLocation.getZ() + dz)); + } - location.setPitch(pitch = (location.getPitch() + dPitch)); - } + var changeLook = false; + float yaw = Float.NaN; + if (dYaw != 0) { + changeLook = true; + + thisLocation.setYaw(yaw = (thisLocation.getYaw() + dYaw)); + } + float pitch = Float.NaN; + if (dPitch != 0) { + changeLook = true; - if (changeLocation) performTeleportation(x, y, z, yaw, pitch, false); - else if (changeLook) performLook(yaw, pitch); + thisLocation.setPitch(pitch = (thisLocation.getPitch() + dPitch)); } + + if (changeLocation) performTeleportation(x, y, z, yaw, pitch, false); + else if (changeLook) performLook(yaw, pitch); } @Override public void moveTo(final double x, final double y, final double z, final float yaw, final float pitch) { - if (compactMoving) { - final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); - - if (dx == 0 && dy == 0 && dz == 0) { - if (yaw != location.getYaw() || pitch != location.getPitch()) { - performLook(yaw, pitch); - - location.setYaw(yaw); - location.setPitch(pitch); - } - } else { - velocity.setX(dx); - velocity.setY(dy); - velocity.setZ(dz); - - if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, true); - else if (yaw != location.getYaw() || pitch != location.getPitch()) { - performMoveLook(dx, dy, dz, yaw, pitch, true); - - location.setYaw(yaw); - location.setPitch(pitch); - } else performMove(dx, dy, dz, true); - - location.setX(x); - location.setY(y); - location.setZ(z); - - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); - } - } else performNonCompactTeleportation(x, y, z, yaw, pitch); + if (compactMoving) performCompactTeleportation(x, y, z, yaw, pitch, true); + else performNonCompactTeleportation(x, y, z, yaw, pitch); } @Override public void teleport(final double x, final double y, final double z, final float yaw, final float pitch) { - if (compactMoving) { - final double dx = x - location.getX(), dy = y - location.getY(), dz = z - location.getZ(); + if (compactMoving) performCompactTeleportation(x, y, z, yaw, pitch, false); + else performNonCompactTeleportation(x, y, z, yaw, pitch); + } - if (dx == 0 && dy == 0 && dz == 0) { - if (yaw != location.getYaw() || pitch != location.getPitch()) { - performLook(yaw, pitch); + protected void performCompactTeleportation(final double x, final double y, final double z, + final float yaw, final float pitch, final boolean sendVelocity) { + final Location thisLocation; + final double + dx = x - (thisLocation = location).getX(), + dy = y - thisLocation.getY(), + dz = z - thisLocation.getZ(); - location.setYaw(yaw); - location.setPitch(pitch); - } - } else { - velocity.setX(dx); - velocity.setY(dy); - velocity.setZ(dz); - - if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, false); - else if (yaw != location.getYaw() || pitch != location.getPitch()) { - performMoveLook(dx, dy, dz, yaw, pitch, false); - - location.setYaw(yaw); - location.setPitch(pitch); - } else performMove(dx, dy, dz, false); - - location.setX(x); - location.setY(y); - location.setZ(z); - - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); + if (dx == 0 && dy == 0 && dz == 0) { + if (yaw != thisLocation.getYaw() || pitch != thisLocation.getPitch()) { + performLook(yaw, pitch); + + thisLocation.setYaw(yaw); + thisLocation.setPitch(pitch); } - } else performNonCompactTeleportation(x, y, z, yaw, pitch); + } else { + final Vector thisVelocity; + (thisVelocity = velocity).setX(dx); + thisVelocity.setY(dy); + thisVelocity.setZ(dz); + + if (dx > 8 || dy > 8 || dz > 8) performTeleportation(x, y, z, yaw, pitch, sendVelocity); + else if (yaw != thisLocation.getYaw() || pitch != thisLocation.getPitch()) { + performMoveLook(dx, dy, dz, yaw, pitch, sendVelocity); + + thisLocation.setYaw(yaw); + thisLocation.setPitch(pitch); + } else performMove(dx, dy, dz, sendVelocity); + + thisLocation.setX(x); + thisLocation.setY(y); + thisLocation.setZ(z); + + thisVelocity.setX(0); + thisVelocity.setY(0); + thisVelocity.setZ(0); + } } protected void performNonCompactTeleportation(final double x, final double y, final double z, final float yaw, final float pitch) { var changeLocation = false; - if (x != location.getX()) { + + final Location thisLocation; + if (x != (thisLocation = location).getX()) { changeLocation = true; - location.setX(x); + thisLocation.setX(x); } - if (y != location.getY()) { + if (y != thisLocation.getY()) { changeLocation = true; - location.setY(y); + thisLocation.setY(y); } - if (z != location.getZ()) { + if (z != thisLocation.getZ()) { changeLocation = true; - location.setZ(z); + thisLocation.setZ(z); } var changeLook = false; - if (yaw != location.getYaw()) { + if (yaw != thisLocation.getYaw()) { changeLook = true; - location.setYaw(yaw); + thisLocation.setYaw(yaw); } - if (pitch != location.getPitch()) { + if (pitch != thisLocation.getPitch()) { changeLook = true; - location.setPitch(pitch); + thisLocation.setPitch(pitch); } if (changeLocation) performTeleportation(x, y, z, yaw, pitch, false); @@ -370,8 +360,10 @@ protected void performNonCompactTeleportation(final double x, final double y, fi @Override public void syncLocation() { + final Location thisLocation; performTeleportation( - location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch(), false + (thisLocation = location).getX(), thisLocation.getY(), thisLocation.getZ(), + thisLocation.getYaw(), thisLocation.getPitch(), false ); } } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java index f83135c09..8d48924a1 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java @@ -15,7 +15,7 @@ @FieldDefaults(level = AccessLevel.PROTECTED) public abstract class AbstractFakeEntity implements FakeEntity { - @NonNull @Getter Location location; + @Getter final @NonNull Location location; @Getter boolean visible = true; // setter should be created manually to perform visualisation logic @Override diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java index 821f62c87..49296c6e0 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractObservableFakeEntity.java @@ -17,7 +17,7 @@ public abstract class AbstractObservableFakeEntity extends AbstractFakeEntity im @Getter int viewDistanceSquared; public AbstractObservableFakeEntity(final boolean global, final int viewDistance, - @NonNull final Location location) { + final @NonNull Location location) { super(location); this.global = global; @@ -27,7 +27,8 @@ public AbstractObservableFakeEntity(final boolean global, final int viewDistance @Override public boolean shouldSee(final Player player) { - return player.getWorld() == location.getWorld() - && player.getEyeLocation().distanceSquared(location) <= viewDistanceSquared; + final Location thisLocation; + return player.getWorld() == (thisLocation = location).getWorld() + && player.getEyeLocation().distanceSquared(thisLocation) <= viewDistanceSquared; } } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java index 0a736edea..8ec9688ef 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractPlayerContainingFakeEntity.java @@ -20,8 +20,8 @@ public abstract class AbstractPlayerContainingFakeEntity extends AbstractObserva @NonNull Set playersView; public AbstractPlayerContainingFakeEntity(final int viewDistance, final boolean global, - @NonNull final Location location, - @NonNull final Map players) { + final @NonNull Location location, + final @NonNull Map players) { super(global, viewDistance, location); if (!players.isEmpty()) players.clear(); @@ -36,7 +36,7 @@ public Collection getPlayers() { } @Override - public boolean isRendered(@NonNull final Player player) { + public boolean isRendered(final @NonNull Player player) { return players.getOrDefault(player, false); } @@ -47,18 +47,18 @@ public boolean containsPlayer(final Player player) { @Override public void addPlayer(final Player player) { - if (!players.containsKey(player)) { - if (shouldSee(player)) render(player); - else players.put(player, false); - } + final Map thisPlayers; + if (!(thisPlayers = players).containsKey(player)) if (shouldSee(player)) render(player); + else thisPlayers.put(player, false); } @Override public void removePlayer(final Player player) { - val canSee = players.get(player); - if (canSee != null) { + final Map thisPlayers; + final Boolean canSee; + if ((canSee = (thisPlayers = players).get(player)) != null) { if (canSee) unrender(player); - players.remove(player); + thisPlayers.remove(player); } } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 99bd3d713..d9884cf71 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -13,11 +13,10 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import ru.progrm_jarvis.minecraft.commons.math.dimensional.CuboidFigure; +import org.jetbrains.annotations.Nullable; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand; -import javax.annotation.Nullable; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -35,6 +34,12 @@ @FieldDefaults(level = AccessLevel.PROTECTED) public class ArmorStandBlockItem extends SimpleLivingFakeEntity { + protected static final double PIXEL_SIZE = 0x1.0p-4, + HALF_PIXEL_SIZE = PIXEL_SIZE * 0x1.0p-5, + ARMOR_STAND_BODY_HEIGHT = (16 + 8) * PIXEL_SIZE, + ARMOR_STAND_HEAD_OFFSET = ARMOR_STAND_BODY_HEIGHT - HALF_PIXEL_SIZE, + ITEM_CENTER_Y_OFFSET = 3 * PIXEL_SIZE + HALF_PIXEL_SIZE; // offset of the item center from the rotation center + /** * Rotation of this block */ @@ -63,13 +68,14 @@ public class ArmorStandBlockItem extends SimpleLivingFakeEntity { * @param small whether this block-item is small * @param item item to be displayed by this block-item */ - public ArmorStandBlockItem(@Nullable final UUID uuid, + public ArmorStandBlockItem(final @Nullable UUID uuid, final Map playersMap, final boolean global, final int viewDistance, final boolean visible, - final Location location, @Nullable final Vector3F rotation, - final boolean small, final boolean marker, @NonNull final ItemStack item) { + final Location location, final @Nullable Vector3F rotation, + final boolean small, final boolean marker, final @NonNull ItemStack item) { super( - NmsUtil.nextEntityId(), uuid, EntityType.ARMOR_STAND, + NmsUtil.nextEntityId(), uuid, + EntityType.ARMOR_STAND, 0, small ? ARMOR_STAND_HEAD_OFFSET / 2 : ARMOR_STAND_HEAD_OFFSET, 0, 0, 0, 0, playersMap, global, viewDistance, visible, location, 0, null, createMetadata(rotation, small, marker) ); @@ -79,13 +85,6 @@ public ArmorStandBlockItem(@Nullable final UUID uuid, equipmentPacket.setEntityID(entityId); equipmentPacket.setSlot(EnumWrappers.ItemSlot.HEAD); equipmentPacket.setItem(this.item = item); - - // actual block-item position (head of armorstand) is one block higher than its coordinate so normalize it - { - final double x = location.getX(), y = location.getY(), z = location.getZ(); - hitbox = new CuboidFigure(0.25, 0.25, 0.25); - } - yOffset = -1; } @Override @@ -105,12 +104,12 @@ public void spawn() { * @param item item to be displayed by this block-item * @return newly created armor stand block-item */ - public static ArmorStandBlockItem create(@Nullable final UUID uuid, + public static ArmorStandBlockItem create(final @Nullable UUID uuid, final boolean concurrent, final boolean global, final int viewDistance, final boolean visible, final Location location, final Vector3F rotation, final boolean small, final boolean marker, - @NonNull final ItemStack item) { + final @NonNull ItemStack item) { return new ArmorStandBlockItem( uuid, concurrent ? new ConcurrentHashMap<>() : new HashMap<>(), global, viewDistance, visible, location, rotation, small, marker, item @@ -124,7 +123,7 @@ public static ArmorStandBlockItem create(@Nullable final UUID uuid, * @param small whether this block-item is small * @return created metadata object */ - protected static WrappedDataWatcher createMetadata(@Nullable final Vector3F rotation, + protected static WrappedDataWatcher createMetadata(final @Nullable Vector3F rotation, final boolean small, final boolean marker) { val metadata = new ArrayList(); @@ -133,9 +132,10 @@ protected static WrappedDataWatcher createMetadata(@Nullable final Vector3F rota if (marker) { metadata.add(entityFlags(Flag.INVISIBLE, Flag.ON_FIRE)); metadata.add(armorStandFlags(small ? new ArmorStand.Flag[]{ - ArmorStand.Flag.SMALL, ArmorStand.Flag.NO_BASE_PLATE, ArmorStand.Flag.MARKER - } : new ArmorStand.Flag[]{ArmorStand.Flag.MARKER, ArmorStand.Flag.NO_BASE_PLATE} - )); + ArmorStand.Flag.SMALL, ArmorStand.Flag.NO_BASE_PLATE, ArmorStand.Flag.MARKER + } : new ArmorStand.Flag[]{ + ArmorStand.Flag.MARKER, ArmorStand.Flag.NO_BASE_PLATE + })); } else { metadata.add(entityFlags(Flag.INVISIBLE)); metadata.add(armorStandFlags(small @@ -159,7 +159,7 @@ protected void performSpawnNoChecks(final Player player) { * * @param rotation new rotation of this block */ - public void setRotation(@NonNull final Vector3F rotation) { + public void setRotation(final @NonNull Vector3F rotation) { if (rotation.equals(this.rotation)) return; addMetadata(headRotation(rotation)); @@ -172,7 +172,7 @@ public void setRotation(@NonNull final Vector3F rotation) { * * @param delta delta of rotation */ - public void rotate(@NonNull final Vector3F delta) { + public void rotate(final @NonNull Vector3F delta) { final Vector3F thisRotation; setRotation((thisRotation = rotation) == null ? new Vector3F(delta.getX(), delta.getY(), delta.getZ()) @@ -190,7 +190,7 @@ public void rotate(@NonNull final Vector3F delta) { * * @param delta delta of rotation */ - public void rotateTo(@NonNull final Vector3F delta) { + public void rotateTo(final @NonNull Vector3F delta) { setRotation(rotation == null ? new Vector3F(delta.getX(), delta.getY(), delta.getZ()) : new Vector3F( @@ -216,7 +216,7 @@ public static float minimizeAngle(float degrees) { return degrees; } - public void setItem(@NonNull final ItemStack item) { + public void setItem(final @NonNull ItemStack item) { equipmentPacket.setItem(this.item = item); for (val entry : players.entrySet()) if (entry.getValue()) equipmentPacket.sendPacket(entry.getKey()); } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java index f9163d69a..ab45b428e 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/BasicFakeEntity.java @@ -5,9 +5,8 @@ import lombok.NonNull; import org.bukkit.Location; import org.bukkit.util.Vector; -import ru.progrm_jarvis.minecraft.commons.math.dimensional.Figure3D; +import org.jetbrains.annotations.NotNull; -import javax.annotation.Nonnull; import java.util.Collection; import java.util.List; @@ -31,19 +30,17 @@ public interface BasicFakeEntity extends ObservableFakeEntity { // Dimensional /////////////////////////////////////////////////////////////////////////// - Figure3D getHitbox(); - void move(double dx, double dy, double dz, float dYaw, float dPitch); default void move(final double dx, final double dy, final double dz) { move(dx, dy, dz, 0, 0); } - default void move(@NonNull final Vector direction, float dYaw, float dPitch) { + default void move(final @NonNull Vector direction, float dYaw, float dPitch) { move(direction.getX(), direction.getY(), direction.getZ(), dYaw, dPitch); } - default void move(@NonNull final Vector direction) { + default void move(final @NonNull Vector direction) { move(direction, 0, 0); } @@ -53,7 +50,7 @@ default void moveTo(final double x, final double y, final double z) { moveTo(x, y, z, 0, 0); } - default void moveTo(@NonNull final Location location) { + default void moveTo(final @NonNull Location location) { moveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); } @@ -63,7 +60,7 @@ default void teleport(final double x, final double y, final double z) { teleport(x, y, z, 0, 0); } - default void teleport(@NonNull final Location location) { + default void teleport(final @NonNull Location location) { teleport(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); } @@ -82,9 +79,9 @@ default void teleport(@NonNull final Location location) { void setMetadata(List metadata); - void setMetadata(@Nonnull final Collection metadata); + void setMetadata(final @NotNull Collection metadata); - void setMetadata(@Nonnull final WrappedWatchableObject... metadata); + void setMetadata(final @NotNull WrappedWatchableObject... metadata); void addMetadata(Collection metadata); diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 7b49602de..c2128d2cc 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -9,9 +9,10 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; -import javax.annotation.Nullable; import java.util.Map; +import java.util.Set; import java.util.UUID; /** @@ -33,7 +34,7 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * This fake entity's UUID */ - @Nullable final UUID uuid; // may be null as it is not required + final @Nullable UUID uuid; // may be null as it is not required /** * Type of this entity @@ -47,7 +48,7 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * PLayers related to this fake entity */ - @NonNull final Map players; + final @NonNull Map players; /** * Whether or not this fake entity is global @@ -66,7 +67,7 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * Location of this fake entity */ - @NonNull @Getter final Location location; + @Getter final @NonNull Location location; /** * Head pitch of this fake entity @@ -76,7 +77,7 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * Metadata of this fake entity */ - @Nullable @Getter WrappedDataWatcher metadata; + @Getter @Nullable WrappedDataWatcher metadata; // packets should not be created before id is generated @@ -125,7 +126,7 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * Difference between the actual entity x and its visible value */ - double xOffset, + final double xOffset, /** * Difference between the actual entity y and its visible value */ @@ -138,25 +139,29 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * Difference between the actual entity yaw and its visible value */ - float yawOffset = 0, + final float yawOffset, /** * Difference between the actual entity pitch and its visible value */ - pitchOffset = 0, + pitchOffset, /** * Difference between the actual entity head pitch and its visible value */ - headPitchDelta = 0; + headPitchOffset; @Builder - public SimpleLivingFakeEntity(final int entityId, @Nullable final UUID uuid, @NonNull final EntityType type, - @NonNull final Map players, + public SimpleLivingFakeEntity(final int entityId, final @Nullable UUID uuid, + // Start of entities properties, TODO specific class + final @NonNull EntityType type, + final double xOffset, final double yOffset, final double zOffset, + final float yawOffset, final float pitchOffset, final float headPitchOffset, + // End of entity's properties + final @NonNull Map players, final boolean global, final int viewDistance, - boolean visible, - @NonNull final Location location, float headPitch, - @Nullable final Vector velocity, @Nullable final WrappedDataWatcher metadata) { + boolean visible, final @NonNull Location location, float headPitch, + final @Nullable Vector velocity, final @Nullable WrappedDataWatcher metadata) { super(global, viewDistance, location, players, velocity, metadata); // setup fields @@ -168,6 +173,14 @@ public SimpleLivingFakeEntity(final int entityId, @Nullable final UUID uuid, @No this.players = players; this.global = global; this.viewDistance = Math.max(-1, viewDistance); + + this.xOffset = xOffset; + this.yOffset = yOffset; + this.zOffset = zOffset; + this.yawOffset = yawOffset; + this.pitchOffset = pitchOffset; + this.headPitchOffset = headPitchOffset; + this.visible = visible; this.location = location; @@ -177,13 +190,19 @@ public SimpleLivingFakeEntity(final int entityId, @Nullable final UUID uuid, @No // setup packets - spawnPacket = new WrapperPlayServerSpawnEntityLiving(); - spawnPacket.setEntityID(this.entityId); - spawnPacket.setType(type); - if (uuid != null) spawnPacket.setUniqueId(uuid); + { + final WrapperPlayServerSpawnEntityLiving thisSpawnPacket; + spawnPacket = thisSpawnPacket = new WrapperPlayServerSpawnEntityLiving(); + thisSpawnPacket.setEntityID(entityId); + thisSpawnPacket.setType(type); + if (uuid != null) thisSpawnPacket.setUniqueId(uuid); + } - despawnPacket = new WrapperPlayServerEntityDestroy(); - despawnPacket.setEntityIds(new int[]{this.entityId}); + { + final WrapperPlayServerEntityDestroy thisDespawnPacket; + despawnPacket = thisDespawnPacket = new WrapperPlayServerEntityDestroy(); + thisDespawnPacket.setEntityIds(new int[]{entityId}); + } } /** @@ -207,19 +226,29 @@ protected void performDespawnNoChecks(final Player player) { } protected void actualizeSpawnPacket() { - spawnPacket.setX(location.getX() + xOffset); - spawnPacket.setY(location.getY() + yOffset); - spawnPacket.setZ(location.getZ() + zOffset); - - spawnPacket.setPitch(location.getPitch() + pitchOffset); - spawnPacket.setYaw(location.getYaw() + yawOffset); - spawnPacket.setHeadPitch(headPitch + headPitchDelta); + final WrapperPlayServerSpawnEntityLiving thisSpawnPacket; + { + final Location thisLocation; + (thisSpawnPacket = spawnPacket).setX((thisLocation = location).getX() + xOffset); + thisSpawnPacket.setY(thisLocation.getY() + yOffset); + thisSpawnPacket.setZ(thisLocation.getZ() + zOffset); + + thisSpawnPacket.setPitch(thisLocation.getPitch() + pitchOffset); + thisSpawnPacket.setYaw(thisLocation.getYaw() + yawOffset); + thisSpawnPacket.setHeadPitch(headPitch + headPitchOffset); + } - spawnPacket.setVelocityX(velocity.getX()); - spawnPacket.setVelocityY(velocity.getY()); - spawnPacket.setVelocityZ(velocity.getZ()); + { + final Vector thisVelocity; + thisSpawnPacket.setVelocityX((thisVelocity = velocity).getX()); + thisSpawnPacket.setVelocityY(thisVelocity.getY()); + thisSpawnPacket.setVelocityZ(thisVelocity.getZ()); + } - if (metadata != null) spawnPacket.setMetadata(metadata); + { + final WrappedDataWatcher thisMetadata; + if ((thisMetadata = metadata) != null) thisSpawnPacket.setMetadata(thisMetadata); + } } /////////////////////////////////////////////////////////////////////////// @@ -237,9 +266,7 @@ public void spawn() { @Override public void despawn() { - if (visible) { - for (val entry : players.entrySet()) if (entry.getValue()) performDespawnNoChecks(entry.getKey()); - } + if (visible) for (val entry : players.entrySet()) if (entry.getValue()) performDespawnNoChecks(entry.getKey()); } /////////////////////////////////////////////////////////////////////////// @@ -247,9 +274,10 @@ public void despawn() { /////////////////////////////////////////////////////////////////////////// protected boolean isOnGround() { - //noinspection ConstantConditions #getWorld() may but shouldn't retuen null - return location.getY() % 1 == 0 && location.getWorld() - .getBlockAt(location.getBlockX(), location.getBlockY() - 1, location.getBlockZ()).getType().isSolid(); + final Location thisLocation; + //noinspection ConstantConditions #getWorld() may but shouldn't return null + return (thisLocation = location).getY() % 1 == 0 && thisLocation.getWorld() + .getBlockAt(thisLocation).getType().isSolid(); } protected boolean hasVelocity() { @@ -259,17 +287,19 @@ protected boolean hasVelocity() { /** * Updates the velocity packet initializing it if it haven;t been initialized. * - * @apiNote call to this method guarantees that {@link #velocityPacket} won't be {@link null} after it + * @apiNote call to this method guarantees that {@link #velocityPacket} won't be {@code null} after it */ protected void actualizeVelocityPacket() { - if (velocityPacket == null) { - velocityPacket = new WrapperPlayServerEntityVelocity(); - velocityPacket.setEntityID(entityId); + WrapperPlayServerEntityVelocity packet; + if ((packet = velocityPacket) == null) { + packet = velocityPacket = new WrapperPlayServerEntityVelocity(); + packet.setEntityID(entityId); } - velocityPacket.setVelocityX(velocity.getX()); - velocityPacket.setVelocityY(velocity.getY()); - velocityPacket.setVelocityZ(velocity.getZ()); + final Vector thisVelocity; + packet.setVelocityX((thisVelocity = velocity).getX()); + packet.setVelocityY(thisVelocity.getY()); + packet.setVelocityZ(thisVelocity.getZ()); } @Override @@ -277,26 +307,32 @@ protected void actualizeVelocityPacket() { protected void performMoveLook(final double dx, final double dy, final double dz, final float yaw, final float pitch, boolean sendVelocity) { if (visible) { - if (moveLookPacket == null) { - moveLookPacket = new WrapperPlayServerRelEntityMoveLook(); - moveLookPacket.setEntityID(entityId); + WrapperPlayServerRelEntityMoveLook thisMoveLookPacket; + if ((thisMoveLookPacket = moveLookPacket) == null) { + moveLookPacket = thisMoveLookPacket = new WrapperPlayServerRelEntityMoveLook(); + thisMoveLookPacket.setEntityID(entityId); } - moveLookPacket.setDx(dx); - moveLookPacket.setDy(dy); - moveLookPacket.setDz(dz); - moveLookPacket.setYaw(yaw); - moveLookPacket.setPitch(pitch); - moveLookPacket.setOnGround(isOnGround()); + thisMoveLookPacket.setDx(dx); + thisMoveLookPacket.setDy(dy); + thisMoveLookPacket.setDz(dz); + thisMoveLookPacket.setYaw(yaw); + thisMoveLookPacket.setPitch(pitch); + thisMoveLookPacket.setOnGround(isOnGround()); sendVelocity = sendVelocity && hasVelocity(); if (sendVelocity) actualizeVelocityPacket(); - for (val entry : players.entrySet()) if (entry.getValue()) { - val player = entry.getKey(); + final Set> entries; + if ((!(entries = players.entrySet()).isEmpty())) { + val thisVelocityPacket = sendVelocity ? velocityPacket : null; + + for (val entry : entries) if (entry.getValue()) { + val player = entry.getKey(); - if (sendVelocity) velocityPacket.sendPacket(player); - moveLookPacket.sendPacket(player); + if (sendVelocity) thisVelocityPacket.sendPacket(player); + thisMoveLookPacket.sendPacket(player); + } } } } @@ -305,24 +341,30 @@ protected void performMoveLook(final double dx, final double dy, final double dz @SuppressWarnings("Duplicates") protected void performMove(final double dx, final double dy, final double dz, boolean sendVelocity) { if (visible) { - if (movePacket == null) { - movePacket = new WrapperPlayServerRelEntityMove(); - movePacket.setEntityID(entityId); + WrapperPlayServerRelEntityMove thisMovePacket; + if ((thisMovePacket = movePacket) == null) { + movePacket = thisMovePacket = new WrapperPlayServerRelEntityMove(); + thisMovePacket.setEntityID(entityId); } - movePacket.setDx(dx); - movePacket.setDy(dy); - movePacket.setDz(dz); - movePacket.setOnGround(isOnGround()); + thisMovePacket.setDx(dx); + thisMovePacket.setDy(dy); + thisMovePacket.setDz(dz); + thisMovePacket.setOnGround(isOnGround()); sendVelocity = sendVelocity && hasVelocity(); if (sendVelocity) actualizeVelocityPacket(); - for (val entry : players.entrySet()) if (entry.getValue()) { - val player = entry.getKey(); + final Set> entries; + if ((!(entries = players.entrySet()).isEmpty())) { + val thisVelocityPacket = sendVelocity ? velocityPacket : null; - if (sendVelocity) velocityPacket.sendPacket(player); - movePacket.sendPacket(player); + for (val entry : entries) if (entry.getValue()) { + val player = entry.getKey(); + + if (sendVelocity) thisVelocityPacket.sendPacket(player); + thisMovePacket.sendPacket(player); + } } } } @@ -332,26 +374,32 @@ protected void performMove(final double dx, final double dy, final double dz, bo protected void performTeleportation(final double x, final double y, final double z, final float yaw, final float pitch, boolean sendVelocity) { if (visible) { - if (teleportPacket == null) { - teleportPacket = new WrapperPlayServerEntityTeleport(); - teleportPacket.setEntityID(entityId); + WrapperPlayServerEntityTeleport thisTeleportPacket; + if ((thisTeleportPacket = teleportPacket) == null) { + teleportPacket = thisTeleportPacket = new WrapperPlayServerEntityTeleport(); + thisTeleportPacket.setEntityID(entityId); } - teleportPacket.setX(x + xOffset); - teleportPacket.setY(y + yOffset); - teleportPacket.setZ(z + zOffset); - teleportPacket.setYaw(yaw + yawOffset); - teleportPacket.setPitch(pitch + pitchOffset); - teleportPacket.setOnGround(isOnGround()); + thisTeleportPacket.setX(x + xOffset); + thisTeleportPacket.setY(y + yOffset); + thisTeleportPacket.setZ(z + zOffset); + thisTeleportPacket.setYaw(yaw + yawOffset); + thisTeleportPacket.setPitch(pitch + pitchOffset); + thisTeleportPacket.setOnGround(isOnGround()); sendVelocity = sendVelocity && hasVelocity(); if (sendVelocity) actualizeVelocityPacket(); - for (val entry : players.entrySet()) if (entry.getValue()) { - val player = entry.getKey(); + final Set> entries; + if ((!(entries = players.entrySet()).isEmpty())) { + val thisVelocityPacket = sendVelocity ? velocityPacket : null; + + for (val entry : entries) if (entry.getValue()) { + val player = entry.getKey(); - if (sendVelocity) velocityPacket.sendPacket(player); - teleportPacket.sendPacket(player); + if (sendVelocity) thisVelocityPacket.sendPacket(player); + thisTeleportPacket.sendPacket(player); + } } } } @@ -359,16 +407,17 @@ protected void performTeleportation(final double x, final double y, final double @Override protected void performLook(final float yaw, final float pitch) { if (visible) { - if (lookPacket == null) { - lookPacket = new WrapperPlayServerEntityLook(); - lookPacket.setEntityID(entityId); + WrapperPlayServerEntityLook thisLookPacket; + if ((thisLookPacket = lookPacket) == null) { + lookPacket = thisLookPacket = new WrapperPlayServerEntityLook(); + thisLookPacket.setEntityID(entityId); } - lookPacket.setYaw(yaw); - lookPacket.setPitch(pitch); - lookPacket.setOnGround(isOnGround()); + thisLookPacket.setYaw(yaw); + thisLookPacket.setPitch(pitch); + thisLookPacket.setOnGround(isOnGround()); - for (val entry : players.entrySet()) if (entry.getValue()) lookPacket.sendPacket(entry.getKey()); + for (val entry : players.entrySet()) if (entry.getValue()) thisLookPacket.sendPacket(entry.getKey()); } } @@ -382,14 +431,17 @@ protected void performLook(final float yaw, final float pitch) { @Override protected void sendMetadata() { if (visible) { - if (metadata == null) return; - if (metadataPacket == null) { - metadataPacket = new WrapperPlayServerEntityMetadata(); - metadataPacket.setEntityID(entityId); + final WrappedDataWatcher thisMetadata; + if ((thisMetadata = metadata) == null) return; + + WrapperPlayServerEntityMetadata thisMetadataPacket; + if ((thisMetadataPacket = metadataPacket) == null) { + metadataPacket = thisMetadataPacket = new WrapperPlayServerEntityMetadata(); + thisMetadataPacket.setEntityID(entityId); } - metadataPacket.setMetadata(metadata.getWatchableObjects()); + thisMetadataPacket.setMetadata(thisMetadata.getWatchableObjects()); - for (val entry : players.entrySet()) if (entry.getValue()) metadataPacket.sendPacket(entry.getKey()); + for (val entry : players.entrySet()) if (entry.getValue()) thisMetadataPacket.sendPacket(entry.getKey()); } } @@ -398,7 +450,7 @@ protected void sendMetadata() { /////////////////////////////////////////////////////////////////////////// @Override - public void render(final Player player) { + protected void render(final Player player) { actualizeSpawnPacket(); performSpawnNoChecks(player); @@ -406,7 +458,7 @@ public void render(final Player player) { } @Override - public void unrender(final Player player) { + protected void unrender(final Player player) { performDespawnNoChecks(player); players.put(player, false); diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java index bdffaa1f0..7ffbb6639 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteraction.java @@ -20,7 +20,7 @@ public interface FakeEntityInteraction { Hand getHand(); - static FakeEntityInteraction interact(final int entityId, @NonNull final Hand hand) { + static FakeEntityInteraction interact(final int entityId, final @NonNull Hand hand) { return new InteractInteraction(entityId, hand); } @@ -28,12 +28,12 @@ static FakeEntityInteraction attack(final int entityId) { return new AttackInteraction(entityId); } - static FakeEntityInteraction exactInteract(final int entityId, @NonNull final Hand hand, + static FakeEntityInteraction exactInteract(final int entityId, final @NonNull Hand hand, final int x, final int y, final int z) { return new ExactInteractInteraction(entityId, hand, x, y, z); } - static FakeEntityInteraction exactInteract(final int entityId, @NonNull final Hand hand, + static FakeEntityInteraction exactInteract(final int entityId, final @NonNull Hand hand, final Vector vector) { // TODO: 20.11.2018 Check if right return new ExactInteractInteraction(entityId, hand, vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionEvent.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionEvent.java index 492ea7664..3c89a6501 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionEvent.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/FakeEntityInteractionEvent.java @@ -21,7 +21,7 @@ public HandlerList getHandlers() { return handlerList; } - public FakeEntityInteractionEvent(@NonNull final Player who, @NonNull final InteractableFakeEntity entity) { + public FakeEntityInteractionEvent(final @NonNull Player who, final @NonNull InteractableFakeEntity entity) { super(who); this.entity = entity; diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java index a799aca52..c65a1063f 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/behaviour/ProtocolBasedFakeEntityInteractionHandler.java @@ -16,7 +16,6 @@ import ru.progrm_jarvis.minecraft.fakeentitylib.entity.behaviour.FakeEntityInteraction.Hand; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.management.FakeEntityManager; -import javax.annotation.Nonnull; import java.util.Collection; import java.util.Collections; import java.util.Set; @@ -28,15 +27,15 @@ public class ProtocolBasedFakeEntityInteractionHandler extends PacketAdapter implements FakeEntityInteractionHandler { - @NonNull final ProtocolManager protocolManager; + final @NonNull ProtocolManager protocolManager; - @NonNull @ToString.Include Plugin plugin; + @ToString.Include @NonNull Plugin plugin; @NonNull Set entities; @NonNull Set entitiesView; @Delegate(types = Shutdownable.class) @NonNull ShutdownHooks shutdownHooks; - public ProtocolBasedFakeEntityInteractionHandler(@Nonnull final Plugin plugin, final boolean concurrent) { + public ProtocolBasedFakeEntityInteractionHandler(final @NonNull Plugin plugin, final boolean concurrent) { super( checkNotNull(plugin, "plugin should not be null"), PacketType.Play.Client.USE_ENTITY @@ -102,7 +101,7 @@ public int managedEntitiesSize() { } @Override - public boolean isManaged(@NonNull final E entity) { + public boolean isManaged(final @NonNull E entity) { return entities.contains(entity); } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java index 55b621232..b8e6e5385 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/AbstractSetBasedEntityManager.java @@ -11,7 +11,6 @@ import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.FakeEntity; -import javax.annotation.Nonnull; import javax.annotation.OverridingMethodsMustInvokeSuper; import java.util.Collection; import java.util.Collections; @@ -28,12 +27,12 @@ public abstract class AbstractSetBasedEntityManager implements FakeEntityManager { @NonNull Plugin plugin; - @NonNull @ToString.Exclude Set entities; - @NonNull @ToString.Exclude Set entitiesView; + @ToString.Exclude @NonNull Set entities; + @ToString.Exclude @NonNull Set entitiesView; @Delegate(types = Shutdownable.class) @NonNull ShutdownHooks shutdownHooks; - public AbstractSetBasedEntityManager(@NonNull final Plugin plugin, @NonNull final Set entities) { + public AbstractSetBasedEntityManager(final @NonNull Plugin plugin, final @NonNull Set entities) { this.plugin = plugin; this.entities = entities; this.entitiesView = Collections.unmodifiableSet(entities); @@ -48,7 +47,7 @@ public AbstractSetBasedEntityManager(@NonNull final Plugin plugin, @NonNull fina * @param plugin parent plugin of this manager * @param concurrent whether or not this map should be thread-safe */ - public AbstractSetBasedEntityManager(@Nonnull final Plugin plugin, final boolean concurrent) { + public AbstractSetBasedEntityManager(final @NonNull Plugin plugin, final boolean concurrent) { this(plugin, concurrent ? FakeEntityManager.concurrentWeakEntitySet() : FakeEntityManager.weakEntitySet()); } @@ -63,7 +62,7 @@ public int managedEntitiesSize() { } @Override - public boolean isManaged(@NonNull final E entity) { + public boolean isManaged(final @NonNull E entity) { return entities.contains(entity); } @@ -74,13 +73,13 @@ public Collection getManagedEntities() { @Override @OverridingMethodsMustInvokeSuper - public void manageEntity(@NonNull final E entity) { + public void manageEntity(final @NonNull E entity) { entities.add(entity); } @Override @OverridingMethodsMustInvokeSuper - public void unmanageEntity(@NonNull final E entity) { + public void unmanageEntity(final @NonNull E entity) { entities.remove(entity); } } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index 170b0cc40..91c4138f8 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -106,7 +106,7 @@ static Map concurrentWeakEntityMap() { * @param entity entity to check * @return {@code true} if this entity manager manages the specified entity and {@code false} otherwise */ - boolean isManaged(@NonNull final E entity); + boolean isManaged(final @NonNull E entity); /** * Removes the entity managed by this manager. diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java index ee0589aec..84ea84ec5 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java @@ -27,9 +27,9 @@ public class FakeEntityManagerGroup extends AbstractSetBas @NonNull Collection> managers; - public FakeEntityManagerGroup(@NonNull final Plugin plugin, - @NonNull final Set entities, - @NonNull final Collection, + public FakeEntityManagerGroup(final @NonNull Plugin plugin, + final @NonNull Set entities, + final @NonNull Collection, ? extends FakeEntityManager>> managerCreators) { super(plugin, entities); @@ -41,29 +41,29 @@ public FakeEntityManagerGroup(@NonNull final Plugin plugin, } @SafeVarargs - public FakeEntityManagerGroup(@NonNull final Plugin plugin, - @NonNull final Set entities, - @NonNull final BiFunction, + public FakeEntityManagerGroup(final @NonNull Plugin plugin, + final @NonNull Set entities, + final @NonNull BiFunction, ? extends FakeEntityManager>... managerCreators) { this(plugin, entities, Arrays.asList(managerCreators)); } @Override - public void manageEntity(@NonNull final E entity) { + public void manageEntity(final @NonNull E entity) { super.manageEntity(entity); for (val manager : managers) manager.manageEntity(entity); } @Override - public void unmanageEntity(@NonNull final E entity) { + public void unmanageEntity(final @NonNull E entity) { super.unmanageEntity(entity); for (val manager : managers) manager.unmanageEntity(entity); } @Override - public void remove(@NonNull final E entity) { + public void remove(final @NonNull E entity) { for (val manager : managers) manager.remove(entity); entity.remove(); diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java index e804dec9c..501f552d9 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/observer/PeriodicFakeEntityObserver.java @@ -12,7 +12,6 @@ import ru.progrm_jarvis.minecraft.fakeentitylib.entity.ObservableFakeEntity; import ru.progrm_jarvis.minecraft.fakeentitylib.entity.management.AbstractSetBasedEntityManager; -import javax.annotation.Nonnull; import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -43,10 +42,10 @@ public class PeriodicFakeEntityObserver Supplier> entitiesSetSupplier; @Builder - public PeriodicFakeEntityObserver(@Nonnull final Plugin plugin, final boolean concurrent, + public PeriodicFakeEntityObserver(final @NonNull Plugin plugin, final boolean concurrent, boolean global, final long interval, final boolean async, final int minEntitiesForNewThread, final int maxThreads, - @NonNull final Supplier> entitiesSetSupplier) { + final @NonNull Supplier> entitiesSetSupplier) { super(plugin, beforeSuper(concurrent, () -> checkArgument(interval > 0, "interval should be positive"), () -> checkArgument(minEntitiesForNewThread > 0, "minEntitiesForNewThread should be positive"), @@ -88,11 +87,11 @@ public PeriodicFakeEntityObserver(@Nonnull final Plugin plugin, final boolean co })::shutdown); } - protected void addPlayer(@NonNull final Player player) { + protected void addPlayer(final @NonNull Player player) { for (val entity : entities) entity.addPlayer(player); } - protected void removePlayer(@NonNull final Player player) { + protected void removePlayer(final @NonNull Player player) { for (val entity : entities) entity.removePlayer(player); } @@ -134,13 +133,13 @@ protected RedrawEntitiesRunnable newRedrawEntitiesRunnable() { } @Override - public void manageEntity(@NonNull final E entity) { + public void manageEntity(final @NonNull E entity) { super.manageEntity(entity); getRedrawEntitiesRunnable().addEntity(entity); } @Override - public void unmanageEntity(@NonNull final E entity) { + public void unmanageEntity(final @NonNull E entity) { super.unmanageEntity(entity); lock.lock(); try { diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/Structure.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/Structure.java index 5ddebb4f0..2bfb59f75 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/Structure.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/Structure.java @@ -87,14 +87,14 @@ default void accept(final Structure.Element element) { update(element); } - default Updater alsoThen(@NonNull final Updater updater) { + default Updater alsoThen(final @NonNull Updater updater) { return element -> { update(element); updater.update(element); }; } - default Updater alsoBefore(@NonNull final Updater updater) { + default Updater alsoBefore(final @NonNull Updater updater) { return element -> { update(element); updater.update(element); diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java index 4f581c1ae..0d4d18267 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptor.java @@ -44,7 +44,7 @@ public class StructureDescriptor { private static final Gson gson = new Gson(); - public static StructureDescriptor from(@NonNull final JsonRepresentation jsonRepresentation) { + public static StructureDescriptor from(final @NonNull JsonRepresentation jsonRepresentation) { val elementNames = new ArrayList(); val elementList = new ArrayList(); jsonRepresentation.getElements().forEach((name, element) -> { @@ -66,24 +66,24 @@ public static StructureDescriptor from(@NonNull final JsonRepresentation jsonRep return descriptor.build(); } - public static StructureDescriptor fromJson(@NonNull final String json) { + public static StructureDescriptor fromJson(final @NonNull String json) { return from(gson.fromJson(json, JsonRepresentation.class)); } - public static StructureDescriptor fromJson(@NonNull final Reader jsonReader) { + public static StructureDescriptor fromJson(final @NonNull Reader jsonReader) { return from(gson.fromJson(jsonReader, JsonRepresentation.class)); } - public static StructureDescriptor fromJson(@NonNull final JsonReader jsonReader) { + public static StructureDescriptor fromJson(final @NonNull JsonReader jsonReader) { return from(gson.fromJson(jsonReader, JsonRepresentation.class)); } - public static StructureDescriptor fromJson(@NonNull final JsonElement jsonElement) { + public static StructureDescriptor fromJson(final @NonNull JsonElement jsonElement) { return from(gson.fromJson(jsonElement, JsonRepresentation.class)); } @SneakyThrows - public static StructureDescriptor fromJson(@NonNull final File jsonFile) { + public static StructureDescriptor fromJson(final @NonNull File jsonFile) { try (val reader = new BufferedReader(new FileReader(jsonFile))) { return fromJson(reader); } @@ -105,7 +105,7 @@ public static class FastFrameUpdater implements FrameUpdater { int[] ids; Structure.Element.Updater[] updaters; - public static FrameUpdater from(@NonNull final int[] ids, @NonNull final Structure.Element.Updater[] updaters) { + public static FrameUpdater from(final @NonNull int[] ids, final @NonNull Structure.Element.Updater[] updaters) { val idsLength = ids.length; Preconditions.checkArgument(idsLength == updaters.length, "ids length should be equal to updaters length"); @@ -204,7 +204,7 @@ public static final class Element { Translation translation; - public static Structure.Element.Size sizeFromName(@NonNull final String sizeName) { + public static Structure.Element.Size sizeFromName(final @NonNull String sizeName) { switch (sizeName) { case "small": return Structure.Element.Size.SMALL; case "medium": return Structure.Element.Size.MEDIUM; @@ -240,7 +240,7 @@ public static final class Keyframe { @SerializedName("ontick") int tick; Element[] objects; - public FrameUpdater toFrameUpdaterByElements(@NonNull final List elements) { + public FrameUpdater toFrameUpdaterByElements(final @NonNull List elements) { final Map elementMap = Arrays.stream(objects) .collect(Collectors.toMap(element -> { val index = elements.indexOf(element); @@ -259,7 +259,7 @@ public FrameUpdater toFrameUpdaterByElements(@NonNull final List elemen .toArray(Structure.Element.Updater[]::new)); } - public FrameUpdater toFrameUpdaterByElementNames(@NonNull final List elementNames) { + public FrameUpdater toFrameUpdaterByElementNames(final @NonNull List elementNames) { final Map elementMap = Arrays.stream(objects) .collect(Collectors.toMap(element -> { val index = elementNames.indexOf(element.customName); diff --git a/fake-entity-lib/src/test/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptorTest.java b/fake-entity-lib/src/test/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptorTest.java index 0bfca33a6..149df2bdd 100644 --- a/fake-entity-lib/src/test/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptorTest.java +++ b/fake-entity-lib/src/test/java/ru/progrm_jarvis/minecraft/fakeentitylib/misc/structure/StructureDescriptorTest.java @@ -63,7 +63,7 @@ void testFromJson() { assertEquals(1, structureDescriptor.getKeyframes().size()); } - private File getFile(@NonNull final String fileName) { + private File getFile(final @NonNull String fileName) { return new File(getClass().getResource(fileName).getFile()); } } \ No newline at end of file diff --git a/lib-loader/pom.xml b/lib-loader/pom.xml index 261d2881e..813da7937 100644 --- a/lib-loader/pom.xml +++ b/lib-loader/pom.xml @@ -20,8 +20,8 @@ lombok - com.google.code.findbugs - jsr305 + org.jetbrains + annotations diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java index fefb5534e..2f7f9d84b 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java @@ -2,12 +2,12 @@ import lombok.*; import lombok.experimental.FieldDefaults; +import org.jetbrains.annotations.Nullable; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.InputSource; import org.xml.sax.SAXException; -import javax.annotation.Nullable; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; @@ -80,47 +80,47 @@ default void assureIsRefreshed() { * @param version artifact's version * @return URl to the artifacts root ended with '/' */ - static String getMavenArtifactsRootUrl(@NonNull final String repositoryUrl, - @NonNull final String groupId, @NonNull final String artifactId, - @NonNull final String version) { + static String getMavenArtifactsRootUrl(final @NonNull String repositoryUrl, + final @NonNull String groupId, final @NonNull String artifactId, + final @NonNull String version) { return (repositoryUrl.lastIndexOf('/') == repositoryUrl.length() - 1 ? repositoryUrl : repositoryUrl + '/') + groupId.replace('.', '/') + '/' + artifactId + '/' + version + '/'; } @SneakyThrows(MalformedURLException.class) - static LibCoords fromMavenRepo(@NonNull final String repositoryUrl, - @NonNull final String groupId, @NonNull final String artifactId, - @NonNull final String version) { + static LibCoords fromMavenRepo(final @NonNull String repositoryUrl, + final @NonNull String groupId, final @NonNull String artifactId, + final @NonNull String version) { val jarUrl = getMavenArtifactsRootUrl(repositoryUrl, groupId, artifactId, version) + artifactId + '-' + version + ".jar"; return new MavenRepoLibCoords(new URL(jarUrl), new URL(jarUrl + ".sha1"), new URL(jarUrl + ".md5")); } - static LibCoords fromMavenCentralRepo(@NonNull final String groupId, @NonNull final String artifactId, - @NonNull final String version) { + static LibCoords fromMavenCentralRepo(final @NonNull String groupId, final @NonNull String artifactId, + final @NonNull String version) { return fromMavenRepo(MAVEN_CENTRAL_REPO_URL, groupId, artifactId, version); } @SneakyThrows(MalformedURLException.class) - static LibCoords fromSonatypeNexusRepo(@NonNull final String repositoryUrl, - @NonNull final String groupId, @NonNull final String artifactId, - @NonNull final String version, @NonNull final String metadataFileName) { + static LibCoords fromSonatypeNexusRepo(final @NonNull String repositoryUrl, + final @NonNull String groupId, final @NonNull String artifactId, + final @NonNull String version, final @NonNull String metadataFileName) { val rootUrl = getMavenArtifactsRootUrl(repositoryUrl, groupId, artifactId, version); return new SonatypeNexusRepoLibCoords(new URL(rootUrl + metadataFileName), rootUrl); } - static LibCoords fromSonatypeNexusRepo(@NonNull final String repositoryUrl, - @NonNull final String groupId, @NonNull final String artifactId, - @NonNull final String version) { + static LibCoords fromSonatypeNexusRepo(final @NonNull String repositoryUrl, + final @NonNull String groupId, final @NonNull String artifactId, + final @NonNull String version) { return fromSonatypeNexusRepo( repositoryUrl, groupId, artifactId, version, SonatypeNexusRepoLibCoords.METADATA_FILE_NAME ); } - static LibCoords fromSonatypeOssSnapshotsRepo(@NonNull final String groupId, @NonNull final String artifactId, - @NonNull final String version) { + static LibCoords fromSonatypeOssSnapshotsRepo(final @NonNull String groupId, final @NonNull String artifactId, + final @NonNull String version) { return fromSonatypeNexusRepo( SONATYPE_OSS_SNAPSHOTS_REPO_URL, groupId, artifactId, version, SonatypeNexusRepoLibCoords.METADATA_FILE_NAME @@ -135,7 +135,7 @@ static LibCoords fromSonatypeOssSnapshotsRepo(@NonNull final String groupId, @No * * @see Document#getDocumentElement() to create {@link Element} from {@link Document} */ - static String getLatestNexusArtifactName(@NonNull final Element documentElement) { + static String getLatestNexusArtifactName(final @NonNull Element documentElement) { val version = documentElement.getElementsByTagName("version").item(0).getFirstChild().getTextContent(); val snapshot = (Element) ((Element) documentElement.getElementsByTagName("versioning").item(0)) .getElementsByTagName("snapshot").item(0); @@ -168,18 +168,18 @@ final class MavenRepoLibCoords implements LibCoords { */ hash2Url; - public MavenRepoLibCoords(@NonNull final URL artifactUrl, - @Nullable final URL hash1Url, @Nullable final URL hash2Url) { + public MavenRepoLibCoords(final @NonNull URL artifactUrl, + final @Nullable URL hash1Url, final @Nullable URL hash2Url) { this.artifactUrl = artifactUrl; this.hash1Url = hash1Url; this.hash2Url = hash2Url; } - public MavenRepoLibCoords(@NonNull final URL jarUrl, final URL hash1Url) { + public MavenRepoLibCoords(final @NonNull URL jarUrl, final URL hash1Url) { this(jarUrl, hash1Url, null); } - public MavenRepoLibCoords(@NonNull final URL jarUrl) { + public MavenRepoLibCoords(final @NonNull URL jarUrl) { this(jarUrl, null, null); } @@ -228,8 +228,8 @@ final class SonatypeNexusRepoLibCoords implements LibCoords { /** * URL of a metadata file to get the latest version of artifact. */ - @NonNull final URL mavenMetadataUrl; - @NonNull final String artifactsRootUrl; + final @NonNull URL mavenMetadataUrl; + final @NonNull String artifactsRootUrl; /** * Whether or not this lib coords were refreshed. diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java index cd0d91073..1defdc232 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java @@ -43,7 +43,7 @@ public class LibLoader { /** * Current class loader used by this lib loader */ - @NonNull @Getter URLClassLoader classLoader; + @Getter @NonNull URLClassLoader classLoader; /** * Directory to store library artifacts and hashes in @@ -53,9 +53,9 @@ public class LibLoader { /** * Logger for external usage */ - @NonNull @Getter @Setter private Logger log = DEFAULT_LOGGER; + @Getter @Setter @NonNull private Logger log = DEFAULT_LOGGER; - @NonNull final Map loadedLibs; + final @NonNull Map loadedLibs; // creates a MethodHandle object for URLClassLoader#addUrl(URL) method static { @@ -110,7 +110,7 @@ public static Optional getAvailableUrlClassLoader() { * * @throws IllegalArgumentException if the {@code classLoader} is not {@link URLClassLoader} */ - public LibLoader(@NonNull final ClassLoader classLoader, @NonNull final File rootDirectory) { + public LibLoader(final @NonNull ClassLoader classLoader, final @NonNull File rootDirectory) { if (!(classLoader instanceof URLClassLoader)) throw new IllegalArgumentException( classLoader + " is not instance of URLClassLoader" ); @@ -125,7 +125,7 @@ public LibLoader(@NonNull final ClassLoader classLoader, @NonNull final File roo * * @param urlClassLoader class loader to use for loading of libraries */ - public LibLoader(@NonNull final URLClassLoader urlClassLoader) { + public LibLoader(final @NonNull URLClassLoader urlClassLoader) { this(urlClassLoader, new File("libs/artifacts/")); } @@ -138,7 +138,7 @@ public LibLoader(@NonNull final URLClassLoader urlClassLoader) { * * @throws IllegalArgumentException if the {@code classLoader} is not {@link URLClassLoader} */ - public LibLoader(@NonNull final ClassLoader classLoader) { + public LibLoader(final @NonNull ClassLoader classLoader) { this(classLoader, new File("libs/artifacts/")); } @@ -148,7 +148,7 @@ public LibLoader(@NonNull final ClassLoader classLoader) { * should normally be {@link URLClassLoader} * @param rootDirectory directory to store library artifacts and hashes in */ - public LibLoader(@NonNull final File rootDirectory) { + public LibLoader(final @NonNull File rootDirectory) { this(getAvailableUrlClassLoader().orElseThrow( () -> new IllegalStateException("Cannot find any available URLClassLoader in current context") ), rootDirectory @@ -163,7 +163,7 @@ public LibLoader(@NonNull final File rootDirectory) { * * @see #setClassLoader(ClassLoader) variant performing checks of any classloader */ - public LibLoader setClassLoader(@NonNull final URLClassLoader classLoader) { + public LibLoader setClassLoader(final @NonNull URLClassLoader classLoader) { this.classLoader = classLoader; return this; @@ -194,7 +194,7 @@ public LibLoader setClassLoader(final ClassLoader classLoader) { * @param name name of the lib * @return {@code true} if the lib was loaded by the specified name anf {@code false} otherwise */ - public boolean isLibLoaded(@NonNull final String name) { + public boolean isLibLoaded(final @NonNull String name) { return loadedLibs.containsKey(name); } @@ -205,7 +205,7 @@ public boolean isLibLoaded(@NonNull final String name) { * @return optional containing file og lib's artifact * if it was loaded by the specified name or empty optional otherwise */ - public Optional getLoadedLibArtifact(@NonNull final String name) { + public Optional getLoadedLibArtifact(final @NonNull String name) { return Optional.ofNullable(loadedLibs.get(name)); } @@ -233,7 +233,7 @@ protected void assureRootDirectoryExists() { * @return file of created artifact */ @SneakyThrows - public File loadLib(@NonNull final String name, @NonNull final LibCoords libCoords, final boolean addToClasspath) { + public File loadLib(final @NonNull String name, final @NonNull LibCoords libCoords, final boolean addToClasspath) { if (isLibLoaded(name)) throw new IllegalStateException("Library " + name + " is a;ready loaded by LibLoader"); assureRootDirectoryExists(); @@ -276,7 +276,7 @@ public File loadLib(@NonNull final String name, @NonNull final LibCoords libCoor * @see #loadLib(String, LibCoords, boolean) called with {@code addToClasspath} set to {@code true} */ @SneakyThrows - public File loadLib(@NonNull final String name, @NonNull final LibCoords libCoords) { + public File loadLib(final @NonNull String name, final @NonNull LibCoords libCoords) { return loadLib(name, libCoords, true); } @@ -287,7 +287,7 @@ public File loadLib(@NonNull final String name, @NonNull final LibCoords libCoor * @param url url to add to classpath of class loader */ @SneakyThrows - public static void addUrlToClasspath(@NonNull final URLClassLoader classLoader, @NonNull final URL url) { + public static void addUrlToClasspath(final @NonNull URLClassLoader classLoader, final @NonNull URL url) { URL_CLASS_LOADER__ADD_URL_METHOD.invokeExact(classLoader, url); } diff --git a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchers.java b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchers.java index fb2200920..c8bac7719 100644 --- a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchers.java +++ b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientArgumentMatchers.java @@ -6,11 +6,10 @@ import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; import org.apache.http.client.methods.HttpUriRequest; +import org.jetbrains.annotations.Nullable; import org.mockito.ArgumentMatcher; import org.mockito.ArgumentMatchers; -import javax.annotation.Nullable; - import static org.mockito.ArgumentMatchers.argThat; /** @@ -29,7 +28,7 @@ public class HttpClientArgumentMatchers { * * @implNote for {@code null} request {@link ArgumentMatchers#isNull()} is used. */ - @NonNull public ArgumentMatcher httpUriRequestMatcher(@Nullable final HttpUriRequest request) { + @NonNull public ArgumentMatcher httpUriRequestMatcher(final @Nullable HttpUriRequest request) { return new HttpUriRequestMatcher(request); } @@ -40,7 +39,7 @@ public class HttpClientArgumentMatchers { * @return {@code null} */ // naming and JavaDocs conventions taken from ArgumentMatchers - public HttpUriRequest eqHttpUriRequest(@Nullable final HttpUriRequest value) { + public HttpUriRequest eqHttpUriRequest(final @Nullable HttpUriRequest value) { return argThat(httpUriRequestMatcher(value)); } @@ -51,7 +50,7 @@ private static class HttpUriRequestMatcher implements ArgumentMatcher match if (request == null || argument == null) return false; diff --git a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocks.java b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocks.java index 369b07f26..5911950ed 100644 --- a/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocks.java +++ b/mc-unit/src/main/java/ru/progrm_jarvis/mcunit/io/http/HttpClientMocks.java @@ -103,7 +103,7 @@ default MockedHttpClient responding(final HttpUriRequest request, final InputStr * @implNote uses {@link IOUtils#toInputStream(CharSequence, Charset)} * to convert the {@link String} to {@link InputStream} */ - default MockedHttpClient responding(final HttpUriRequest request, @NonNull final String responseContent, + default MockedHttpClient responding(final HttpUriRequest request, final @NonNull String responseContent, final Charset charset) { return responding(request, IOUtils.toInputStream(responseContent, charset)); } @@ -124,7 +124,7 @@ default MockedHttpClient responding(final HttpUriRequest request, @NonNull final * @implNote uses {@link IOUtils#toInputStream(CharSequence, Charset)} * to convert the {@link String} to {@link InputStream} */ - default MockedHttpClient responding(final HttpUriRequest request, @NonNull final String responseContent) { + default MockedHttpClient responding(final HttpUriRequest request, final @NonNull String responseContent) { return responding(request, responseContent, StandardCharsets.UTF_8); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java index 70e0d911e..86873e687 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/MinecraftEnvironment.java @@ -21,7 +21,7 @@ public enum MinecraftEnvironment { @NonFinal boolean available; @NonNull String[] checkedClasses, checkedPackages; - MinecraftEnvironment(@NonNull final String[] checkedClasses, @NonNull final String... checkedPackages) { + MinecraftEnvironment(final @NonNull String[] checkedClasses, final @NonNull String... checkedPackages) { this.checkedClasses = checkedClasses; this.checkedPackages = checkedPackages; } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java index b33ce5103..c080a26eb 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunners.java @@ -1,10 +1,9 @@ package ru.progrm_jarvis.minecraft.commons.async; import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Nullable; import ru.progrm_jarvis.minecraft.commons.MinecraftEnvironment; -import javax.annotation.Nullable; - /** * Utilities for easier use of {@link AsyncRunner}s. */ @@ -21,8 +20,8 @@ public class AsyncRunners { * * @implNote This will give a caller of Bukkit or Bungee depending on availability of their classes */ - public AsyncRunner getMinecraftEnvironmentAware(@Nullable final Object bukkitPlugin, - @Nullable final Object bungeePlugin) { + public AsyncRunner getMinecraftEnvironmentAware(final @Nullable Object bukkitPlugin, + final @Nullable Object bungeePlugin) { // try use Bukkit's if (MinecraftEnvironment.BUKKIT_API.isAvailable()) attempt: { if (bukkitPlugin == null) break attempt; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java index b89b3fb26..4c327414a 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/block/SnakyBlockChain.java @@ -13,9 +13,9 @@ @FieldDefaults(level = AccessLevel.PROTECTED) public abstract class SnakyBlockChain implements BlocksChain { - @NonNull final Plugin plugin; - @NonNull final @Getter World world; - @NonNull final @Getter Block initialBlock; + final @NonNull Plugin plugin; + @Getter final @NonNull World world; + @Getter final @NonNull Block initialBlock; /** * The current layer of blocks to handle @@ -30,13 +30,13 @@ public abstract class SnakyBlockChain implements BlocksChain { /** * Blocks that have been handled */ - @NonNull final Set handledBlocks; + final @NonNull Set handledBlocks; - protected SnakyBlockChain(@NonNull final Plugin plugin, final @NonNull Block initialBlock, - @NonNull final Queue blocks, final @NonNull Queue nextBlocks, - @NonNull final Set handledBlocks) { + protected SnakyBlockChain(final @NonNull Plugin plugin, final @NonNull Block initialBlock, + final @NonNull Queue blocks, final @NonNull Queue nextBlocks, + final @NonNull Set handledBlocks) { this.plugin = plugin; - this.world = initialBlock.getWorld(); + world = initialBlock.getWorld(); this.initialBlock = initialBlock; this.blocks = blocks; this.nextBlocks = nextBlocks; @@ -45,13 +45,13 @@ protected SnakyBlockChain(@NonNull final Plugin plugin, final @NonNull Block ini blocks.add(initialBlock); } - protected SnakyBlockChain(@NonNull final Plugin plugin, @NonNull final Block initialBlock) { + protected SnakyBlockChain(final @NonNull Plugin plugin, final @NonNull Block initialBlock) { this(plugin, initialBlock, new ArrayDeque<>(), new ArrayDeque<>(), new HashSet<>()); } - public static SnakyBlockChain create(@NonNull final Plugin plugin, - @NonNull final Block initialBlock, - @NonNull final BlockHandler blockHandler) { + public static SnakyBlockChain create(final @NonNull Plugin plugin, + final @NonNull Block initialBlock, + final @NonNull BlockHandler blockHandler) { return new SnakyBlockChain(plugin, initialBlock) { @Override protected Collection handle(final Block block) { diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java index 7c073daa9..2007f8467 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java @@ -135,7 +135,7 @@ public long chunkAt(final long x, final long z) { * @param chunk chunk treated as {@link long} * @return specified chunk of the world */ - public Chunk getChunk(@NonNull final World world, final long chunk) { + public Chunk getChunk(final @NonNull World world, final long chunk) { return world.getChunkAt(chunkX(chunk), chunkZ(chunk)); } @@ -243,7 +243,7 @@ public short chunkLocalLocation(final int x, final int y, final int z) { * * @see #toChunkLocalLocationShort(int, int, int) is called with location's coordinates */ - public short chunkLocalLocation(@NonNull final Location location) { + public short chunkLocalLocation(final @NonNull Location location) { return chunkLocalLocation(location.getBlockX(), location.getBlockY(), location.getBlockZ()); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/enchant/Enchant.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/enchant/Enchant.java index a58bd3c58..74dd1eed1 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/enchant/Enchant.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/enchant/Enchant.java @@ -17,7 +17,7 @@ public class Enchant { @Nonnegative int level; - public Enchant(@NonNull final Enchantment enchantment, final int level) { + public Enchant(final @NonNull Enchantment enchantment, final int level) { Preconditions.checkArgument(level >= 0, "Level should be non-negative"); this.enchantment = enchantment; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java index 0380f93fd..5c67abafe 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java @@ -46,7 +46,7 @@ public class FluentBukkitEvents { * @param type of the event handled * @return event listener registration for fluent registration of the event listener(s) */ - public EventListenerRegistration on(@NonNull final Class eventType) { + public EventListenerRegistration on(final @NonNull Class eventType) { return new EventListenerRegistration<>(eventType); } @@ -74,7 +74,7 @@ public static final class EventListenerRegistration { * * @param type type of event handled */ - public EventListenerRegistration(@NonNull final Class type) { + public EventListenerRegistration(final @NonNull Class type) { this.type = type; } @@ -99,7 +99,7 @@ private EventListenersGroup getListenersGroup() { * @param listener listener to use for event handling * @return unregister to use for event unregistration */ - public Shutdownable register(@NonNull final UncheckedConsumer listener) { + public Shutdownable register(final @NonNull UncheckedConsumer listener) { val listenersGroup = getListenersGroup(); listenersGroup.addListener(listener); @@ -131,7 +131,7 @@ private static class EventListenersGroup implements Listener, E * * @param listener listener to add to handling dequeue */ - private void addListener(@NonNull final UncheckedConsumer listener) { + private void addListener(final @NonNull UncheckedConsumer listener) { if (eventListeners.isEmpty()) { PLUGIN_MANAGER .registerEvent(configuration.type, this, configuration.priority, this, configuration.plugin); @@ -146,7 +146,7 @@ private void addListener(@NonNull final UncheckedConsumer listener) { * * @param listener listener to remove from handling dequeue */ - private void removeListener(@NonNull final UncheckedConsumer listener) { + private void removeListener(final @NonNull UncheckedConsumer listener) { eventListeners.remove(listener); if (eventListeners.isEmpty()) { @@ -156,7 +156,7 @@ private void removeListener(@NonNull final UncheckedConsumer listener) { } @Override - public void execute(@NotNull final Listener listener, final Event event) { + public void execute(final @NotNull Listener listener, final Event event) { if (configuration.type.isAssignableFrom(event.getClass())) { @SuppressWarnings("unchecked") val castEvent = (E) event; for (val eventListener : eventListeners) eventListener.accept(castEvent); @@ -166,8 +166,8 @@ public void execute(@NotNull final Listener listener, final Event event) { @Value private static class ListenerConfiguration { - @NonNull final Plugin plugin; - @NonNull final Class type; - @NonNull final EventPriority priority; + final @NonNull Plugin plugin; + final @NonNull Class type; + final @NonNull EventPriority priority; } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemBuilder.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemBuilder.java index 04762ad22..30103fc70 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemBuilder.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemBuilder.java @@ -31,7 +31,7 @@ public Map enchantments() { return metadata == null ? Collections.emptyMap() : new HashMap<>(metadata.getEnchants()); } - public ItemBuilder addEnchantment(@NonNull final Enchantment enchantment, final int level) { + public ItemBuilder addEnchantment(final @NonNull Enchantment enchantment, final int level) { initMetadata(); metadata.addEnchant(enchantment, level, true); @@ -39,7 +39,7 @@ public ItemBuilder addEnchantment(@NonNull final Enchantment enchantment, fin return this; } - public ItemBuilder addEnchantment(@NonNull final Enchant enchant) { + public ItemBuilder addEnchantment(final @NonNull Enchant enchant) { initMetadata(); metadata.addEnchant(enchant.getEnchantment(), enchant.getLevel(), true); @@ -47,7 +47,7 @@ public ItemBuilder addEnchantment(@NonNull final Enchant enchant) { return this; } - public ItemBuilder addEnchantments(@NonNull final Enchant... enchants) { + public ItemBuilder addEnchantments(final @NonNull Enchant... enchants) { initMetadata(); for (val enchant : enchants) metadata.addEnchant(enchant.getEnchantment(), enchant.getLevel(), true); @@ -55,7 +55,7 @@ public ItemBuilder addEnchantments(@NonNull final Enchant... enchants) { return this; } - public ItemBuilder addEnchantments(@NonNull final Iterable enchants) { + public ItemBuilder addEnchantments(final @NonNull Iterable enchants) { initMetadata(); for (val enchant : enchants) metadata.addEnchant(enchant.getEnchantment(), enchant.getLevel(), true); @@ -63,7 +63,7 @@ public ItemBuilder addEnchantments(@NonNull final Iterable enchants) return this; } - public ItemBuilder addEnchantments(@NonNull final Map enchantments) { + public ItemBuilder addEnchantments(final @NonNull Map enchantments) { initMetadata(); for (val enchantment : enchantments.entrySet()) metadata.addEnchant( @@ -73,19 +73,19 @@ public ItemBuilder addEnchantments(@NonNull final Map e return this; } - public ItemBuilder removeEnchantment(@NonNull final Enchantment enchantment) { + public ItemBuilder removeEnchantment(final @NonNull Enchantment enchantment) { if (metadata != null) metadata.removeEnchant(enchantment); return this; } - public ItemBuilder removeEnchantments(@NonNull final Enchantment... enchantments) { + public ItemBuilder removeEnchantments(final @NonNull Enchantment... enchantments) { if (metadata != null) for (val enchantment : enchantments) metadata.removeEnchant(enchantment); return this; } - public ItemBuilder removeEnchantments(@NonNull final Iterable enchantments) { + public ItemBuilder removeEnchantments(final @NonNull Iterable enchantments) { if (metadata != null) for (val enchantment : enchantments) metadata.removeEnchant(enchantment); return this; @@ -101,7 +101,7 @@ protected void initMetadata() { } @SuppressWarnings("unchecked") - public ItemBuilder metadata(@NonNull final M metadata) { + public ItemBuilder metadata(final @NonNull M metadata) { this.metadata = (M) metadata.clone(); return this; @@ -113,7 +113,7 @@ public ItemMeta metadata() { return metadata.clone(); } - public ItemBuilder metadata(@NonNull final Consumer metadataModifier) { + public ItemBuilder metadata(final @NonNull Consumer metadataModifier) { metadataModifier.accept(metadata); return this; @@ -136,7 +136,7 @@ public boolean unbreakable() { return metadata.isUnbreakable(); } - public ItemBuilder displayName(@NonNull final String displayName) { + public ItemBuilder displayName(final @NonNull String displayName) { initMetadata(); metadata.setDisplayName(displayName); @@ -150,7 +150,7 @@ public String displayName() { return metadata.getDisplayName(); } - public ItemBuilder localizedName(@NonNull final String localizedName) { + public ItemBuilder localizedName(final @NonNull String localizedName) { initMetadata(); metadata.setLocalizedName(localizedName); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemMetaBuilder.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemMetaBuilder.java index f3c098704..2b9696ef3 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemMetaBuilder.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/item/ItemMetaBuilder.java @@ -7,9 +7,9 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemFactory; import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.Nullable; import ru.progrm_jarvis.minecraft.commons.enchant.Enchant; -import javax.annotation.Nullable; import javax.annotation.OverridingMethodsMustInvokeSuper; import java.util.HashMap; import java.util.Map; @@ -69,7 +69,7 @@ protected void initEnchantments() { if (enchantments == null) enchantments = new HashMap<>(); } - public B addEnchantment(@NonNull final Enchantment enchantment, final int level) { + public B addEnchantment(final @NonNull Enchantment enchantment, final int level) { initEnchantments(); enchantments.put(enchantment, level); @@ -77,7 +77,7 @@ public B addEnchantment(@NonNull final Enchantment enchantment, final int level) return self; } - public B addEnchantment(@NonNull final Enchant enchant) { + public B addEnchantment(final @NonNull Enchant enchant) { initEnchantments(); enchantments.put(enchant.getEnchantment(), enchant.getLevel()); @@ -85,7 +85,7 @@ public B addEnchantment(@NonNull final Enchant enchant) { return self; } - public B addEnchantments(@NonNull final Enchant... enchants) { + public B addEnchantments(final @NonNull Enchant... enchants) { initEnchantments(); for (val enchant : enchants) enchantments.put(enchant.getEnchantment(), enchant.getLevel()); @@ -93,7 +93,7 @@ public B addEnchantments(@NonNull final Enchant... enchants) { return self; } - public B addEnchantments(@NonNull final Iterable enchants) { + public B addEnchantments(final @NonNull Iterable enchants) { initEnchantments(); for (val enchant : enchants) enchantments.put(enchant.getEnchantment(), enchant.getLevel()); @@ -101,7 +101,7 @@ public B addEnchantments(@NonNull final Iterable enchants) { return self; } - public B addEnchantments(@NonNull final Map enchantments) { + public B addEnchantments(final @NonNull Map enchantments) { initEnchantments(); for (val enchantment : enchantments.entrySet()) this.enchantments.put(enchantment.getKey(), enchantment.getValue()); @@ -109,19 +109,19 @@ public B addEnchantments(@NonNull final Map enchantments) return self; } - public B removeEnchantment(@NonNull final Enchantment enchantment) { + public B removeEnchantment(final @NonNull Enchantment enchantment) { if (this.enchantments != null) enchantments.remove(enchantment); return self; } - public B removeEnchantments(@NonNull final Enchantment... enchantments) { + public B removeEnchantments(final @NonNull Enchantment... enchantments) { if (this.enchantments != null) for (val enchantment : enchantments) this.enchantments.remove(enchantment); return self; } - public B removeEnchantments(@NonNull final Iterable enchantments) { + public B removeEnchantments(final @NonNull Iterable enchantments) { if (this.enchantments != null) for (val enchantment : enchantments) this.enchantments.remove(enchantment); return self; @@ -143,7 +143,7 @@ public ItemMetaBuilder applyTo(@NonNull M itemMeta) { } @OverridingMethodsMustInvokeSuper - protected void fillMeta(@NonNull final M meta) { + protected void fillMeta(final @NonNull M meta) { if (unbreakable != null) meta.setUnbreakable(unbreakable); if (displayName != null) meta.setDisplayName(displayName); if (localizedName != null) meta.setLocalizedName(localizedName); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index 9b47b2778..75b646a21 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -94,7 +94,7 @@ public byte[] getMapData(final int leastX, final int leastY, final int width, fi * @param resize whether the image should be resized or cut to fit map image dimensions * @return created map image */ - public static DefaultMapImage from(@NonNull final BufferedImage image, final boolean resize, + public static DefaultMapImage from(final @NonNull BufferedImage image, final boolean resize, final byte displayMode) { return new DefaultMapImage(MapImages.getMapImagePixels(image, resize), displayMode); } @@ -119,7 +119,7 @@ public void unsubscribeFromUpdates(final UncheckedConsumer subscriber) { } @Override - public void onUpdate(@NonNull final Delta delta) { + public void onUpdate(final @NonNull Delta delta) { for (val updateSubscriber : updateSubscribers) updateSubscriber.accept(delta); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java index 153e14451..6f9fb4c76 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java @@ -4,9 +4,9 @@ import lombok.experimental.Accessors; import lombok.experimental.FieldDefaults; import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; -import javax.annotation.Nonnull; import java.util.Arrays; import static com.google.common.base.Preconditions.checkArgument; @@ -30,11 +30,11 @@ public interface MapImage { PIXELS_COUNT = WIDTH * HEIGHT; /** - * {@link #WIDTH} as {@link float} for coefficient calculations. + * {@link #WIDTH} as {@code float} for coefficient calculations. */ float WIDTH_F = (float) WIDTH, /** - * {@link #HEIGHT} as {@link float} for coefficient calculations + * {@link #HEIGHT} as {@code float} for coefficient calculations */ HEIGHT_F = (float) HEIGHT; @@ -60,11 +60,11 @@ public interface MapImage { int getHeight(); /** - * Gets 1-dimensional {@link byte}-array of this image map's pixels. + * Gets 1-dimensional {@code byte}-array of this image map's pixels. * * @return this image's pixel data * - * @apiNote order as {@link #getWidth()} {@link byte}s (columns) + * @apiNote order as {@link #getWidth()} {@code byte}s (columns) * coming in a row {@link #getHeight()} times (once for each row) */ /* @@ -76,7 +76,7 @@ public interface MapImage { byte[] getMapData(); /** - * Gets 1-dimensional {@link byte}-array of this image map's pixels segment. + * Gets 1-dimensional {@code byte}-array of this image map's pixels segment. * * @param leastX least X-coordinate of image segment * @param leastY least Y-coordinate of image segment @@ -84,20 +84,20 @@ public interface MapImage { * @param height of image segment * @return this image's pixel data segment * - * @apiNote order as {@code width} {@link byte}s (columns) coming in a row {@code height} times (once for each row) + * @apiNote order as {@code width} {@code byte}s (columns) coming in a row {@code height} times (once for each row) */ byte[] getMapData(final int leastX, final int leastY, final int width, final int height); /** - * Gets 1-dimensional {@link byte}-array of this image map's pixels segment. + * Gets 1-dimensional {@code byte}-array of this image map's pixels segment. * * @param delta delta for whose coordinates to get the image segment * @return this image's pixel data segment * - * @apiNote order as {@link Delta#width()} {@link byte}s (columns) + * @apiNote order as {@link Delta#width()} {@code byte}s (columns) * coming in a row {@link Delta#height()} times (once for each row) */ - default byte[] getMapData(@Nonnull final Delta delta) { + default byte[] getMapData(final @NotNull Delta delta) { return getMapData(delta.leastX(), delta.leastY(), delta.width(), delta.height()); } @@ -121,7 +121,7 @@ default byte[] getMapData(@Nonnull final Delta delta) { * @param delta delta of the image update * @apiNote may not be called whenever there are no changes, but yet should normally handle empty deltas */ - default void onUpdate(@NonNull final Delta delta) {} + default void onUpdate(final @NonNull Delta delta) {} /** * Checks whether this map image allows subscriptions on updates. @@ -484,7 +484,7 @@ interface Delta { * @param leastY least Y-coordinate of the affected segment * @return empty delta if {@code pixels} is empty and non-empty delta otherwise */ - @Nonnull static Delta of(final byte[] pixels, final int width, final int leastX, final int leastY) { + static @NotNull Delta of(final byte[] pixels, final int width, final int leastX, final int leastY) { val pixelsLength = pixels.length; if (pixelsLength == 0) return EMPTY; if (pixelsLength == 1) return new SinglePixel(pixels, leastX, leastY); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java index 58cf2152b..145447199 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageColor.java @@ -8,11 +8,11 @@ import lombok.experimental.Accessors; import lombok.experimental.FieldDefaults; import org.bukkit.map.MapPalette; +import org.jetbrains.annotations.NotNull; import ru.progrm_jarvis.minecraft.commons.util.BitwiseUtil; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; import ru.progrm_jarvis.minecraft.commons.util.image.ColorUtil; -import javax.annotation.Nonnull; import java.awt.*; import static java.lang.Math.abs; @@ -107,7 +107,7 @@ private MapImageColor(final int red, final int green, final int blue) { * @param color color to convert to map image color object * @return map image color equivalent of specified color object */ - @Nonnull public static MapImageColor from(@NonNull final Color color) { + public static @NotNull MapImageColor from(final @NonNull Color color) { return of(color.getRed(), color.getGreen(), color.getBlue()); } @@ -118,7 +118,7 @@ private MapImageColor(final int red, final int green, final int blue) { * @return cached or created and cached map image color */ @SneakyThrows - @Nonnull public static MapImageColor of(final int rgb) { + public static @NotNull MapImageColor of(final int rgb) { return COLOR_CACHE.get(rgb, () -> new MapImageColor(ColorUtil.red(rgb), ColorUtil.green(rgb), ColorUtil.blue(rgb))); } @@ -131,7 +131,7 @@ private MapImageColor(final int red, final int green, final int blue) { * @return cached or created and cached map image color */ @SneakyThrows - @Nonnull public static MapImageColor of(final byte red, final byte green, final byte blue) { + @NotNull public static MapImageColor of(final byte red, final byte green, final byte blue) { return COLOR_CACHE.get(ColorUtil.toArgb(red, green, blue), () -> new MapImageColor(red, green, blue)); } @@ -145,7 +145,7 @@ private MapImageColor(final int red, final int green, final int blue) { * * @apiNote alias {@link #of(byte, byte, byte)} using {@code int}s not to perform casts in method call */ - @Nonnull public static MapImageColor of(final int red, final int green, final int blue) { + public static @NotNull MapImageColor of(final int red, final int green, final int blue) { return of((byte) red, (byte) green, (byte) blue); } @@ -215,7 +215,7 @@ public static int getDistanceSquared(final byte red1, final byte green1, final b ); } - public static int getDistanceSquared(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { + public static int getDistanceSquared(final @NonNull MapImageColor color1, final @NonNull MapImageColor color2) { return getDistanceSquared(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); } @@ -238,7 +238,7 @@ public int getDistanceSquared(final int red, final int green, final int blue) { red, green, blue); } - public int getDistanceSquared(@NonNull final MapImageColor other) { + public int getDistanceSquared(final @NonNull MapImageColor other) { return getDistanceSquared(red, green, blue, other.red, other.green, other.blue); } @@ -267,7 +267,7 @@ public static int getSum(final byte red1, final byte green1, final byte blue1, ); } - public static int getSum(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { + public static int getSum(final @NonNull MapImageColor color1, final @NonNull MapImageColor color2) { return getSum(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); } @@ -291,7 +291,7 @@ public int getSum(final int red, final int green, final int blue) { ); } - public int getSum(@NonNull final MapImageColor other) { + public int getSum(final @NonNull MapImageColor other) { return getSum(red, green, blue, other.red, other.green, other.blue); } @@ -315,7 +315,7 @@ public static int getMultiplicationProduct(final byte red1, final byte green1, f * (BitwiseUtil.byteToUnsignedInt(blue2) - BitwiseUtil.byteToUnsignedInt(blue1)); } - public static int getMultiplicationProduct(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { + public static int getMultiplicationProduct(final @NonNull MapImageColor color1, final @NonNull MapImageColor color2) { return getMultiplicationProduct(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); } @@ -339,7 +339,7 @@ public int getMultiplicationProduct(final byte red, final byte green, final byte return getMultiplicationProduct(this.red, this.green, this.blue, red, green, blue); } - public int getMultiplicationProduct(@NonNull final MapImageColor other) { + public int getMultiplicationProduct(final @NonNull MapImageColor other) { return getMultiplicationProduct(red, green, blue, other.red, other.green, other.blue); } @@ -372,7 +372,7 @@ public static int getNaturalDistanceSquared(final int red1, final int green1, fi return (int) (dRed * dRed + dBlue * dBlue + dGreen * dGreen); } - public static int getNaturalDistanceSquared(@NonNull final MapImageColor color1, @NonNull final MapImageColor color2) { + public static int getNaturalDistanceSquared(final @NonNull MapImageColor color1, final @NonNull MapImageColor color2) { return getNaturalDistanceSquared(color1.red, color1.green, color1.blue, color2.red, color2.green, color2.blue); } @@ -395,7 +395,7 @@ public int getNaturalDistanceSquared(final byte red, final byte green, final byt return getNaturalDistanceSquared(this.red, this.green, this.blue, red, green, blue); } - public int getNaturalDistanceSquared(@NonNull final MapImageColor other) { + public int getNaturalDistanceSquared(final @NonNull MapImageColor other) { return getNaturalDistanceSquared(red, green, blue, other.red, other.green, other.blue); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java index 800b179dc..0ccf039be 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java @@ -5,8 +5,8 @@ import lombok.val; import lombok.var; import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; -import javax.annotation.Nonnull; import java.awt.*; import java.awt.image.BufferedImage; import java.util.Arrays; @@ -80,7 +80,7 @@ protected static byte[][] normalizePixels(final int[][] pixels) { * @apiNote returned object may be ignored as all changes happen to the provided image */ @Contract(pure = true) - @Nonnull public BufferedImage fitImage(@NonNull final BufferedImage image, final boolean resize) { + public @NotNull BufferedImage fitImage(final @NonNull BufferedImage image, final boolean resize) { int width = image.getWidth(), height = image.getHeight(); // if an image is bigger at any bound @@ -186,7 +186,7 @@ public int[] getNonNormalizedMapImagePixels(@NonNull BufferedImage image, final * @param resize whether the image should be resized or cut to fit map image dimensions * @return 2-dimensional array of {@link MapImageColor} IDs valid for minecraft. */ - public byte[][] getMapImagePixels2D(@NonNull final BufferedImage image, final boolean resize) { + public byte[][] getMapImagePixels2D(final @NonNull BufferedImage image, final boolean resize) { return normalizePixels(getNonNormalizedMapImagePixels2D(image, resize)); } @@ -197,7 +197,7 @@ public byte[][] getMapImagePixels2D(@NonNull final BufferedImage image, final bo * @param resize whether the image should be resized or cut to fit map image dimensions * @return array of {@link MapImageColor} IDs valid for minecraft. */ - public byte[] getMapImagePixels(@NonNull final BufferedImage image, final boolean resize) { + public byte[] getMapImagePixels(final @NonNull BufferedImage image, final boolean resize) { return normalizePixels(getNonNormalizedMapImagePixels(image, resize)); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java index 554e22415..cd8fe32fd 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java @@ -163,7 +163,7 @@ else throw new IllegalStateException( * @return map view's ID */ @SneakyThrows - public int getMapId(@NonNull final MapView mapView) { + public int getMapId(final @NonNull MapView mapView) { if (USE_INT_IDS) return (int) MAP_VIEW__GET_ID__METHOD.invokeExact(mapView); return (int) (short) MAP_VIEW__GET_ID__METHOD.invokeExact(mapView); } @@ -229,7 +229,7 @@ private MapView allocateNewMap() { * @see #freeMap(Player, MapView) should be called whenever the player stops seeing this map or leaves the server */ @Synchronized - public MapView allocateMap(@NonNull final Player player) { + public MapView allocateMap(final @NonNull Player player) { val mapsOfPlayer = PLAYER_MAPS.get(player); // if the player has all maps allocated of available than allocate another one (specially for him <3) @@ -264,7 +264,7 @@ public MapView allocateMap(@NonNull final Player player) { * @see #allocateMap(Player) only obtained by calling this method should be freed */ @Synchronized - public void freeMap(@NonNull final Player player, @NonNull final MapView map) { + public void freeMap(final @NonNull Player player, final @NonNull MapView map) { PLAYER_MAPS.remove(player, map); for (val renderer : map.getRenderers()) map.removeRenderer(renderer); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index 238da8156..e98a08cf1 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -6,13 +6,13 @@ import org.bukkit.entity.Player; import org.bukkit.map.MapView; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.Nullable; +import ru.progrm_jarvis.javacommons.map.MapUtil; import ru.progrm_jarvis.minecraft.commons.mapimage.MapImage; import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistries; import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistry; import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistryRegistration; -import ru.progrm_jarvis.javacommons.map.MapUtil; -import javax.annotation.Nonnull; import java.util.*; @ToString @@ -26,9 +26,9 @@ public class ProtocolBasedMapImageDisplay implements MapImageDisplay { @Getter boolean global; @PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.AUTO) - public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull final Map playerMaps, - @NonNull final Plugin plugin, final boolean global, - @NonNull final PlayerRegistry playerRegistry) { + public ProtocolBasedMapImageDisplay(final @NonNull MapImage image, final @NonNull Map playerMaps, + final @NonNull Plugin plugin, final boolean global, + final @NonNull PlayerRegistry playerRegistry) { this.image = image; this.playerMaps = playerMaps; playersView = Collections.unmodifiableSet(playerMaps.keySet()); @@ -39,8 +39,8 @@ public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull fina } @PlayerRegistryRegistration(PlayerRegistryRegistration.Policy.AUTO) - public ProtocolBasedMapImageDisplay(@NonNull final MapImage image, @NonNull final Map playerMaps, - @NonNull final Plugin plugin, final boolean global) { + public ProtocolBasedMapImageDisplay(final @NonNull MapImage image, final @NonNull Map playerMaps, + final @NonNull Plugin plugin, final boolean global) { this(image, playerMaps, plugin, global, PlayerRegistries.defaultRegistry(plugin)); } @@ -52,7 +52,7 @@ public MapImage image() { /** * Sends the whole image to the players. */ - protected void sendFullImage(@NonNull final Player player) { + protected void sendFullImage(final @NonNull Player player) { new WrapperPlayServerMap() {{ setItemDamage(PlayerMapManager.getMapId(playerMaps.get(player))); setScale(image.getDisplay()); @@ -64,7 +64,7 @@ protected void sendFullImage(@NonNull final Player player) { }}.sendPacket(player); } - protected WrapperPlayServerMap newDeltaPacket(@Nonnull final MapImage.Delta delta) { + protected WrapperPlayServerMap newDeltaPacket(final @Nullable MapImage.Delta delta) { return new WrapperPlayServerMap() {{ setScale(image.getDisplay()); setColumns(delta.width()); @@ -75,7 +75,7 @@ protected WrapperPlayServerMap newDeltaPacket(@Nonnull final MapImage.Delta delt }}; } - protected void sendDelta(@NonNull final Player player, @NonNull final MapImage.Delta delta) { + protected void sendDelta(final @NonNull Player player, final @NonNull MapImage.Delta delta) { if (delta.isEmpty()) return; val packet = newDeltaPacket(delta); @@ -84,7 +84,7 @@ protected void sendDelta(@NonNull final Player player, @NonNull final MapImage.D packet.sendPacket(player); } - protected void sendDeltaToAllPlayers(@NonNull final MapImage.Delta delta) { + protected void sendDeltaToAllPlayers(final @NonNull MapImage.Delta delta) { if (delta.isEmpty()) return; val packet = newDeltaPacket(delta); @@ -125,7 +125,7 @@ public Collection getPlayers() { } @Override - @NonNull public Optional getMapId(@NonNull final Player player) { + @NonNull public Optional getMapId(final @NonNull Player player) { return MapUtil.>getOrDefault( playerMaps, player, map -> Optional.of(PlayerMapManager.getMapId(map)), Optional::empty ); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java index 27c303e07..bb50b92fe 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/CuboidFigure.java @@ -78,7 +78,7 @@ private static Figure3D between(final double x1, final double y1, final double z * @param point2 the second point of the cubic figure * @return created cubic figure including the area between the two points */ - public static Figure3D between(@NonNull final Vector point1, @NonNull final Vector point2) { + public static Figure3D between(final @NonNull Vector point1, final @NonNull Vector point2) { return between(point1.getX(), point1.getY(), point1.getZ(), point2.getX(), point2.getY(), point2.getZ()); } @@ -89,7 +89,7 @@ public static Figure3D between(@NonNull final Vector point1, @NonNull final Vect * @param point2 the second point of the cubic figure * @return created cubic figure including the area between the two points */ - public static Figure3D between(@NonNull final Location point1, @NonNull final Location point2) { + public static Figure3D between(final @NonNull Location point1, final @NonNull Location point2) { return between(point1.getX(), point1.getY(), point1.getZ(), point2.getX(), point2.getY(), point2.getZ()); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java index b66de8be1..df2aeb408 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java @@ -175,7 +175,7 @@ public boolean contains(final @NonNull Location point) { * * @return {@code true} if the point belongs to this figure and {@link false} otherwise */ - default boolean contains(@NonNull final Vector point) { + default boolean contains(final @NonNull Vector point) { return contains(point.getX(), point.getY(), point.getZ()); } @@ -186,7 +186,7 @@ default boolean contains(@NonNull final Vector point) { * * @return {@code true} if the point belongs to this figure and {@link false} otherwise */ - default boolean contains(@NonNull final Location point) { + default boolean contains(final @NonNull Location point) { return contains(point.getX(), point.getY(), point.getZ()); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/PointFigure.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/PointFigure.java index d0b7f2d73..b05214f01 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/PointFigure.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/PointFigure.java @@ -60,7 +60,7 @@ public boolean contains(final double x, final double y, final double z) { * @param point vector representation to convert * @return point figure identical to the specified vector point */ - public static PointFigure from(@NonNull final Vector point) { + public static PointFigure from(final @NonNull Vector point) { return new PointFigure(point.getX(), point.getY(), point.getZ()); } @@ -70,7 +70,7 @@ public static PointFigure from(@NonNull final Vector point) { * @param point location representation to convert * @return point figure identical to the specified location point */ - public static PointFigure from(@NonNull final Location point) { + public static PointFigure from(final @NonNull Location point) { return new PointFigure(point.getX(), point.getY(), point.getZ()); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java index 1906f3d56..de021b719 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java @@ -14,6 +14,8 @@ import org.apache.http.conn.HttpClientConnectionManager; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import ru.progrm_jarvis.javacommons.lazy.Lazy; import ru.progrm_jarvis.minecraft.commons.annotation.AsyncExpected; import ru.progrm_jarvis.minecraft.commons.async.AsyncRunner; @@ -21,8 +23,6 @@ import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedSupplier; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -79,17 +79,17 @@ public void close() { /////////////////////////////////////////////////////////////////////////// @AsyncExpected - protected static JsonElement readJson(@NonNull final InputStream inputStream) { + protected static JsonElement readJson(final @NonNull InputStream inputStream) { return jsonParser.parse(new BufferedReader(new InputStreamReader(inputStream))); } @AsyncExpected - protected JsonElement httpGetJson(@NonNull final String uri) throws IOException { + protected JsonElement httpGetJson(final @NonNull String uri) throws IOException { return readJson(httpClient.get().execute(new HttpGet(uri)).getEntity().getContent()); } @AsyncExpected - protected JsonElement httpGetJson(@NonNull final String uri, @Nullable final Map parameters) + protected JsonElement httpGetJson(final @NonNull String uri, final @Nullable Map parameters) throws IOException { if (parameters == null || parameters.isEmpty()) return httpGetJson(uri); @@ -120,25 +120,25 @@ protected JsonElement httpGetJson(@NonNull final String uri, @Nullable final Map /////////////////////////////////////////////////////////////////////////// @AsyncExpected - @Nonnull public UUID readUuid(@NonNull final String userName) throws IOException { + public @NotNull UUID readUuid(final @NonNull String userName) throws IOException { return MojangUtil.fromMojangUuid(httpGetJson(USERNAME_TO_UUID_AT_TIME_URI_PREFIX + userName).getAsJsonObject() .get("id").getAsString() ); } - public void readUuid(@NonNull final String userName, - @NonNull final UncheckedConsumer callback) { + public void readUuid(final @NonNull String userName, + final @NonNull UncheckedConsumer callback) { asyncRunner.get().runAsynchronously(() -> readUuid(userName), callback); } @SneakyThrows @AsyncExpected - @Nonnull public UUID getUuid(@NonNull final String userName) { + public @NotNull UUID getUuid(final @NonNull String userName) { return uuidsCache.get() .get(userName.toLowerCase(), () -> readUuid(userName)); } - public void getUuid(@NonNull final String userName, @NonNull final UncheckedConsumer callback) { + public void getUuid(final @NonNull String userName, final @NonNull UncheckedConsumer callback) { asyncRunner.get().runAsynchronously(() -> getUuid(userName), callback); } @@ -147,7 +147,7 @@ public void getUuid(@NonNull final String userName, @NonNull final UncheckedCons /////////////////////////////////////////////////////////////////////////// @AsyncExpected - @Nonnull public GameProfile readProfile(@NonNull final UUID uuid, final boolean signed) throws IOException { + public @NotNull GameProfile readProfile(final @NonNull UUID uuid, final boolean signed) throws IOException { val data = httpGetJson(UUID_TO_PROFILE_URI_PREFIX + MojangUtil.toMojangUuid(uuid) + "?unsigned=" + !signed) .getAsJsonObject(); @@ -170,14 +170,14 @@ public void getUuid(@NonNull final String userName, @NonNull final UncheckedCons return profile; } - public void readProfile(@NonNull final UUID uuid, final boolean signed, - @NonNull final UncheckedConsumer callback) { + public void readProfile(final @NonNull UUID uuid, final boolean signed, + final @NonNull UncheckedConsumer callback) { asyncRunner.get().runAsynchronously(() -> readProfile(uuid, signed), callback); } @SneakyThrows @AsyncExpected - @Nonnull public GameProfile getProfile(@NonNull final UUID uuid, final boolean signed) { + public @NotNull GameProfile getProfile(final @NonNull UUID uuid, final boolean signed) { val cache = profilesCache.get(); var cachedProfile = cache.getIfPresent(uuid); // get profile using Mojang API if there is no cached one or it is unsigned but has to be @@ -187,8 +187,8 @@ public void readProfile(@NonNull final UUID uuid, final boolean signed, return cachedProfile; } - public void getProfile(@NonNull final UUID uuid, final boolean signed, - @NonNull final UncheckedConsumer callback) { + public void getProfile(final @NonNull UUID uuid, final boolean signed, + final @NonNull UncheckedConsumer callback) { asyncRunner.get().runAsynchronously(() -> getProfile(uuid, signed), callback); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java index e6d65c6d9..824846355 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangUtil.java @@ -19,7 +19,7 @@ public class MojangUtil { * @param mojangUuid UUID in a non-standard form returned by Mojang API call (no dashes) to convert * @return standard UUID object, result of conversion */ - public UUID fromMojangUuid(@NonNull final String mojangUuid) { + public UUID fromMojangUuid(final @NonNull String mojangUuid) { return UUID.fromString( mojangUuid.substring(0, 8) + '-' + mojangUuid.substring(8, 12) @@ -35,7 +35,7 @@ public UUID fromMojangUuid(@NonNull final String mojangUuid) { * @param uuid standard UUID object to convert * @return UUID in a non-standard form used by Mojang API (no dashes), result of conversion */ - public String toMojangUuid(@NonNull final UUID uuid) { + public String toMojangUuid(final @NonNull UUID uuid) { val stringUuid = uuid.toString(); return stringUuid.substring(0, 8) + stringUuid.substring(9, 13) @@ -51,7 +51,7 @@ public String toMojangUuid(@NonNull final UUID uuid) { * @return {@code true} if the specified profile has all its properties signed * or {@code false} if any of those is unsigned */ - public boolean isSigned(@NonNull final GameProfile profile) { + public boolean isSigned(final @NonNull GameProfile profile) { for (val entry : profile.getProperties().entries()) if (!entry.getValue().hasSignature()) return false; return true; } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java index 7b2aaa76c..c78cf4561 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java @@ -23,27 +23,27 @@ public class Conversions { EquivalentConverter DIRECTION_EQUIVALENT_CONVERTER = EnumWrappers.getDirectionConverter(); EquivalentConverter PARTICLE_EQUIVALENT_CONVERTER = EnumWrappers.getParticleConverter(); - public Object toNms(@NonNull final Vector3F vector3F) { + public Object toNms(final @NonNull Vector3F vector3F) { return VECTOR_3_F_EQUIVALENT_CONVERTER.getGeneric(vector3F); } - public Vector3F toVector3F(@NonNull final Object nms) { + public Vector3F toVector3F(final @NonNull Object nms) { return VECTOR_3_F_EQUIVALENT_CONVERTER.getSpecific(nms); } - public Object toNms(@NonNull final Direction direction) { + public Object toNms(final @NonNull Direction direction) { return DIRECTION_EQUIVALENT_CONVERTER.getGeneric(direction); } - public Direction toDirection(@NonNull final Object nms) { + public Direction toDirection(final @NonNull Object nms) { return DIRECTION_EQUIVALENT_CONVERTER.getSpecific(nms); } - public Object toNms(@NonNull final Particle particle) { + public Object toNms(final @NonNull Particle particle) { return PARTICLE_EQUIVALENT_CONVERTER.getGeneric(particle); } - public Particle toParticle(@NonNull final Object nms) { + public Particle toParticle(final @NonNull Object nms) { return PARTICLE_EQUIVALENT_CONVERTER.getSpecific(nms); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java index 2d25ca361..a4daaba63 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java @@ -41,7 +41,7 @@ public class LegacySupport { * @param block block from which to create the falling one * @return spawned falling block */ - public FallingBlock spawnFallingBlock(@NonNull final Location location, @NonNull final Block block) { + public FallingBlock spawnFallingBlock(final @NonNull Location location, final @NonNull Block block) { if (LEGACY_BLOCK_FALLING) return location.getWorld() .spawnFallingBlock(location, block.getType(), block.getData()); return location.getWorld().spawnFallingBlock(location, block.getBlockData()); @@ -55,29 +55,29 @@ public FallingBlock spawnFallingBlock(@NonNull final Location location, @NonNull * @param materialData legacy material data * @return spawned falling block */ - public FallingBlock spawnFallingBlock(@NonNull final Location location, - @NonNull final Material material, final byte materialData) { + public FallingBlock spawnFallingBlock(final @NonNull Location location, + final @NonNull Material material, final byte materialData) { if (LEGACY_BLOCK_FALLING) return location.getWorld() .spawnFallingBlock(location, material, materialData); return location.getWorld().spawnFallingBlock(location, new MaterialData(material, materialData)); } - private static LegacyItem legacyItem(@NonNull final Material material, final int legacyData) { + private static LegacyItem legacyItem(final @NonNull Material material, final int legacyData) { return new LegacyItem(material, (byte) legacyData); } - private static LegacyItem legacyItem(@NonNull final Material material) { + private static LegacyItem legacyItem(final @NonNull Material material) { return legacyItem(material, 0); } - private static LegacyItem legacyItem(@NonNull final String materialName, - @NonNull final String legacyMaterialName, + private static LegacyItem legacyItem(final @NonNull String materialName, + final @NonNull String legacyMaterialName, final int legacyData) { return new LegacyItem(Material.valueOf(LEGACY_MATERIALS ? legacyMaterialName : materialName), legacyData); } - private static LegacyItem legacyItem(@NonNull final String materialName, - @NonNull final String legacyMaterialName) { + private static LegacyItem legacyItem(final @NonNull String materialName, + final @NonNull String legacyMaterialName) { return legacyItem(materialName, legacyMaterialName, 0); } @@ -88,20 +88,20 @@ private static final class LegacyItem { @NonNull Material material; final byte legacyData; - private LegacyItem(@NonNull final Material material, final int legacyData) { + private LegacyItem(final @NonNull Material material, final int legacyData) { this(material, (byte) legacyData); } - private LegacyItem(@NonNull final Material material) { + private LegacyItem(final @NonNull Material material) { this(material, 0); } - private LegacyItem(@NonNull final String materialName, @NonNull final String legacyMaterialName, + private LegacyItem(final @NonNull String materialName, final @NonNull String legacyMaterialName, final int legacyData) { this(Material.valueOf(LEGACY_MATERIALS ? legacyMaterialName : materialName), (byte) legacyData); } - private LegacyItem(@NonNull final String materialName, @NonNull final String legacyMaterialName) { + private LegacyItem(final @NonNull String materialName, final @NonNull String legacyMaterialName) { this(materialName, legacyMaterialName, 0); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java index facb70ea1..6bdb34756 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java @@ -26,7 +26,7 @@ public class NmsUtil { /** * Base package of CraftBukkit (org.bukkit.craftbukkit.{version}) */ - CRAFT_BUKKIT_PACKAGE = "org.bukkit.craftbukkit." + NMS_VERSION.name; + CRAFT_BUKKIT_PACKAGE = "org.bukkit.craftbukkit." + NMS_VERSION.name; /** * Field access method-handle of {nms}.Entity class field responsible for entity int-UID generation. @@ -117,7 +117,7 @@ public DataWatcherFactory.DataWatcherModifier dataWatcherModifier() { * @param dataWatcher DataWatcher from which to create DataWatcher modifier * @return DataWatcher modifier valid for current server version */ - public DataWatcherFactory.DataWatcherModifier dataWatcherModifier(@NonNull final WrappedDataWatcher dataWatcher) { + public DataWatcherFactory.DataWatcherModifier dataWatcherModifier(final @NonNull WrappedDataWatcher dataWatcher) { return DATA_WATCHER_FACTORY.modifier(dataWatcher); } @@ -157,7 +157,7 @@ public static final class NmsVersion { * * @param name name of a version */ - private NmsVersion(@NonNull final String name) { + private NmsVersion(final @NonNull String name) { this(name, Short.parseShort(name.substring(3, name.indexOf('_', 4)))); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java index c77462c37..1b2fe7fac 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java @@ -8,10 +8,10 @@ import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; import ru.progrm_jarvis.minecraft.commons.nms.Conversions; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; -import javax.annotation.Nullable; import java.util.Optional; import java.util.UUID; @@ -156,7 +156,7 @@ public static WrappedWatchableObject arrowFlags(final Flag... flags) { return FACTORY.createWatchable(VERSION >= 9 ? 6 : 16, flagBytes); } - public static WrappedWatchableObject shooter(@Nullable final UUID shooterUuid) { + public static WrappedWatchableObject shooter(final @Nullable UUID shooterUuid) { if (VERSION >= 9) return FACTORY.createWatchableOptionalUUID(7, Optional.ofNullable(shooterUuid)); throw new UnsupportedOperationException("Versions prior to 1.9 don't support Arrow metadata"); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java index baf925d7b..a36a74245 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java @@ -17,24 +17,24 @@ @UtilityClass public class PacketListeners { - public PacketListener callbackPacketListener(@NonNull final Plugin plugin, - @NonNull final Consumer inboundPacketCallback, - @NonNull final Consumer outboundPacketCallback, - @NonNull final PacketType... packetTypes) { + public PacketListener callbackPacketListener(final @NonNull Plugin plugin, + final @NonNull Consumer inboundPacketCallback, + final @NonNull Consumer outboundPacketCallback, + final @NonNull PacketType... packetTypes) { return new CallbackServerPacketListener(plugin, inboundPacketCallback, outboundPacketCallback, packetTypes); } - public PacketListener callbackPacketListener(@NonNull final Plugin plugin, - @NonNull final Consumer inboundPacketCallback, - @NonNull final Consumer outboundPacketCallback, - @NonNull final Iterable packetTypes) { + public PacketListener callbackPacketListener(final @NonNull Plugin plugin, + final @NonNull Consumer inboundPacketCallback, + final @NonNull Consumer outboundPacketCallback, + final @NonNull Iterable packetTypes) { return new CallbackServerPacketListener(plugin, inboundPacketCallback, outboundPacketCallback, packetTypes); } - public PacketListener callbackPacketListener(@NonNull final Plugin plugin, - @NonNull final Consumer inboundPacketCallback, - @NonNull final Consumer outboundPacketCallback, - @NonNull final PacketCategory... packetCategories) { + public PacketListener callbackPacketListener(final @NonNull Plugin plugin, + final @NonNull Consumer inboundPacketCallback, + final @NonNull Consumer outboundPacketCallback, + final @NonNull PacketCategory... packetCategories) { return callbackPacketListener(plugin, inboundPacketCallback, outboundPacketCallback, Arrays .stream(packetCategories) .flatMap(packetCategory -> Arrays.stream(packetCategory.packetTypes)) @@ -42,10 +42,10 @@ public PacketListener callbackPacketListener(@NonNull final Plugin plugin, ); } - public PacketListener callbackPacketListener(@NonNull final Plugin plugin, - @NonNull final Consumer inboundPacketCallback, - @NonNull final Consumer outboundPacketCallback, - @NonNull final Collection packetCategories) { + public PacketListener callbackPacketListener(final @NonNull Plugin plugin, + final @NonNull Consumer inboundPacketCallback, + final @NonNull Consumer outboundPacketCallback, + final @NonNull Collection packetCategories) { return callbackPacketListener(plugin, inboundPacketCallback, outboundPacketCallback, packetCategories .stream() .flatMap(packetCategory -> Arrays.stream(packetCategory.packetTypes)) @@ -70,12 +70,12 @@ public enum PacketCategory { private final PacketType[] packetTypes; - PacketCategory(@NonNull final Class containingClass) { + PacketCategory(final @NonNull Class containingClass) { packetTypes = packetTypesFromContainingClass(containingClass); } } - private static PacketType[] packetTypesFromContainingClass(@NonNull final Class clazz) { + private static PacketType[] packetTypesFromContainingClass(final @NonNull Class clazz) { return Arrays.stream(clazz.getDeclaredFields()) .filter(field -> PacketType.class.isAssignableFrom(field.getType())) .map(field -> { @@ -93,20 +93,20 @@ private static class CallbackServerPacketListener extends PacketAdapter { @NonNull private final Consumer inboundPacketCallback; @NonNull private final Consumer outboundPacketCallback; - public CallbackServerPacketListener(@NonNull final Plugin plugin, - @NonNull final Consumer inboundPacketCallback, - @NonNull final Consumer outboundPacketCallback, - @NonNull final PacketType... packetTypes) { + public CallbackServerPacketListener(final @NonNull Plugin plugin, + final @NonNull Consumer inboundPacketCallback, + final @NonNull Consumer outboundPacketCallback, + final @NonNull PacketType... packetTypes) { super(plugin, packetTypes); this.inboundPacketCallback = inboundPacketCallback; this.outboundPacketCallback = outboundPacketCallback; } - public CallbackServerPacketListener(@NonNull final Plugin plugin, - @NonNull final Consumer inboundPacketCallback, - @NonNull final Consumer outboundPacketCallback, - @NonNull final Iterable packetTypes) { + public CallbackServerPacketListener(final @NonNull Plugin plugin, + final @NonNull Consumer inboundPacketCallback, + final @NonNull Consumer outboundPacketCallback, + final @NonNull Iterable packetTypes) { super(plugin, packetTypes); this.inboundPacketCallback = inboundPacketCallback; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java index fb35c46cf..50f606ad2 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java @@ -58,9 +58,9 @@ public class PacketWrapperPacketAssociations { private final Map> PACKET_CREATORS = new ConcurrentHashMap<>(); - private Stream> fieldPacketTypes(@NonNull final Class packetType, - @NonNull final String group, - @NonNull final PacketDirection direction) { + private Stream> fieldPacketTypes(final @NonNull Class packetType, + final @NonNull String group, + final @NonNull PacketDirection direction) { return Arrays.stream(packetType.getDeclaredFields()) .filter(field -> PacketType.class.isAssignableFrom(field.getType())) //.filter(field -> field.isAnnotationPresent(Deprecated.class)) @@ -70,7 +70,7 @@ private Stream> fieldPacketTypes(@NonNull final C )); } - private String upperCaseNameToUpperCamelCase(@NonNull final String name) { + private String upperCaseNameToUpperCamelCase(final @NonNull String name) { val split = StringUtils.split(name, '_'); val camelCase = new StringBuilder(); @@ -87,7 +87,7 @@ private String upperCaseNameToUpperCamelCase(@NonNull final String name) { * @param packet packet to wrap using packet wrapper * @return created packet wrapper object for the packet */ - public AbstractPacket createPacketWrapper(@NonNull final PacketContainer packet) { + public AbstractPacket createPacketWrapper(final @NonNull PacketContainer packet) { return PACKET_CREATORS .computeIfAbsent(packet.getType(), (UncheckedFunction>) packetType -> { @@ -140,17 +140,17 @@ private static class PacketTypeId { /** * Group of packets to which the one belongs */ - @NonNull final String group; + final @NonNull String group; /** * Direction of the packet */ - @NonNull final PacketDirection direction; + final @NonNull PacketDirection direction; /** * Name of the packet in the system */ - @NonNull final String name; + final @NonNull String name; @NonNull private String toPacketWrapperClassName() { return PACKET_WRAPPER_PACKAGE + ".Wrapper" + group + direction.name + name; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java index 4734cbcfb..77b641f8c 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperUtil.java @@ -42,7 +42,7 @@ public class PacketWrapperUtil { .build(); @SneakyThrows - public String toString(@Nullable final AbstractPacket packet) { + public String toString(final @Nullable AbstractPacket packet) { if (packet == null) return "null"; final Map> methods; @@ -87,7 +87,7 @@ public String toString(@Nullable final AbstractPacket packet) { .toString(); } - public String getterNameToString(@NonNull final String getterName) { + public String getterNameToString(final @NonNull String getterName) { if (getterName.startsWith("get")) { val name = getterName.substring(3); if (name.length() == 0) return "get"; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java index 05e258fd5..bbeff8a2a 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/PlayerUtil.java @@ -40,20 +40,20 @@ public Collection getOnlinePlayers() { return (Collection) Bukkit.getOnlinePlayers(); } - public Collection playersAround(@NonNull final Location location, final double radius) { + public Collection playersAround(final @NonNull Location location, final double radius) { return Bukkit.getOnlinePlayers().stream() .filter(player -> player.getLocation().distance(location) <= radius) .collect(Collectors.toList()); } - public Collection playerEyesAround(@NonNull final Location location, final double radius) { + public Collection playerEyesAround(final @NonNull Location location, final double radius) { return Bukkit.getOnlinePlayers().stream() .filter(player -> player.getEyeLocation().distance(location) <= radius) .collect(Collectors.toList()); } @SneakyThrows - public static Optional getPlayerName(@NonNull final UUID uuid) { + public static Optional getPlayerName(final @NonNull UUID uuid) { return Optional.ofNullable(NAMES_CACHE.get( uuid, () -> ObjectUtil.mapOnlyNonNull(OfflinePlayer::getName, Bukkit.getOfflinePlayer(uuid)) )); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java index 5d58ad3d8..f471fc1f4 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainers.java @@ -15,13 +15,13 @@ @UtilityClass public class PlayerContainers { - public PlayerContainer wrap(@NonNull final Collection collectionOfPlayers, + public PlayerContainer wrap(final @NonNull Collection collectionOfPlayers, final boolean global) { return new PlayerContainerCollectionWrapper(collectionOfPlayers, global); } - public PlayerContainer wrap(@NonNull final Map mapOfPlayers, - @NonNull final Function defaultValueSupplier, + public PlayerContainer wrap(final @NonNull Map mapOfPlayers, + final @NonNull Function defaultValueSupplier, final boolean global) { if (global) { val container = new PlayerContainerMapWrapper<>(mapOfPlayers, defaultValueSupplier, true); @@ -34,7 +34,7 @@ public PlayerContainer wrap(@NonNull final Map mapOfPlayers, } // non-global - public PlayerContainer wrap(@NonNull final Map mapOfPlayers) { + public PlayerContainer wrap(final @NonNull Map mapOfPlayers) { return new PlayerContainerMapWrapper<>(mapOfPlayers, player -> { throw new UnsupportedOperationException("Players cannot be directly added to this non-global player-map"); }, false); @@ -46,7 +46,7 @@ private static class PlayerContainerCollectionWrapper implements PlayerContainer @NonNull Collection collection; boolean global; - public PlayerContainerCollectionWrapper(@NonNull final Collection collection, final boolean global) { + public PlayerContainerCollectionWrapper(final @NonNull Collection collection, final boolean global) { this.collection = collection; this.global = global; @@ -82,8 +82,8 @@ private static class PlayerContainerMapWrapper implements PlayerContainer { @NonNull Function defaultValueSupplier; boolean global; - public PlayerContainerMapWrapper(@NonNull final Map map, - @NonNull final Function defaultValueSupplier, + public PlayerContainerMapWrapper(final @NonNull Map map, + final @NonNull Function defaultValueSupplier, final boolean global) { this.map = map; playersView = Collections.unmodifiableSet(map.keySet()); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java index de685e04f..2c3217db1 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/DefaultPlayerRegistry.java @@ -28,7 +28,7 @@ public class DefaultPlayerRegistry implements PlayerRegistry { @NonNull Plugin plugin; - @NonNull @Getter Set players; + @Getter @NonNull Set players; @Getter boolean global; @NonNull Set playerContainers = Collections.newSetFromMap(new WeakHashMap<>()); Lock playerContainersReadLock; @@ -36,7 +36,7 @@ public class DefaultPlayerRegistry implements PlayerRegistry { Listener listener; - public DefaultPlayerRegistry(@NonNull final Plugin plugin, @NonNull final Set playerSet, + public DefaultPlayerRegistry(final @NonNull Plugin plugin, final @NonNull Set playerSet, final boolean global) { Preconditions.checkArgument(playerSet.isEmpty(), "playerSet should be empty"); @@ -69,11 +69,11 @@ public final void onPlayerQuit(final PlayerQuitEvent event) { }, plugin); } - public DefaultPlayerRegistry(@NonNull final Plugin plugin, final boolean concurrent, final boolean global) { + public DefaultPlayerRegistry(final @NonNull Plugin plugin, final boolean concurrent, final boolean global) { this(plugin, concurrent ? new HashSet<>() : ConcurrentHashMap.newKeySet(), global); } - public DefaultPlayerRegistry(@NonNull final Plugin plugin) { + public DefaultPlayerRegistry(final @NonNull Plugin plugin) { this(plugin, true, true); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java index 20957401b..2107859cb 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistries.java @@ -17,30 +17,30 @@ public class PlayerRegistries { private final Map DEFAULT_REGISTRIES = new ConcurrentHashMap<>(); - public PlayerRegistry defaultRegistry(@NonNull final Plugin plugin) { + public PlayerRegistry defaultRegistry(final @NonNull Plugin plugin) { return DEFAULT_REGISTRIES.computeIfAbsent(plugin, DefaultPlayerRegistry::new); } - public C registerInDefaultRegistry(@NonNull final Plugin plugin, - @NonNull final C playerContainer) { + public C registerInDefaultRegistry(final @NonNull Plugin plugin, + final @NonNull C playerContainer) { return defaultRegistry(plugin).register(playerContainer); } - public PlayerContainer registerInDefaultRegistry(@NonNull final Plugin plugin, - @NonNull final Collection collectionOfPlayers, + public PlayerContainer registerInDefaultRegistry(final @NonNull Plugin plugin, + final @NonNull Collection collectionOfPlayers, final boolean global) { return registerInDefaultRegistry(plugin, PlayerContainers.wrap(collectionOfPlayers, global)); } - public PlayerContainer registerInDefaultRegistry(@NonNull final Plugin plugin, - @NonNull final Map mapOfPlayers, - @NonNull final Function defaultValueSupplier, + public PlayerContainer registerInDefaultRegistry(final @NonNull Plugin plugin, + final @NonNull Map mapOfPlayers, + final @NonNull Function defaultValueSupplier, final boolean global) { return registerInDefaultRegistry(plugin, PlayerContainers.wrap(mapOfPlayers, defaultValueSupplier, global)); } - public PlayerContainer registerInDefaultRegistry(@NonNull final Plugin plugin, - @NonNull final Map mapOfPlayers) { + public PlayerContainer registerInDefaultRegistry(final @NonNull Plugin plugin, + final @NonNull Map mapOfPlayers) { return registerInDefaultRegistry(plugin, PlayerContainers.wrap(mapOfPlayers)); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java index f3c86d012..928b77a0f 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/registry/PlayerRegistry.java @@ -17,15 +17,15 @@ public interface PlayerRegistry extends PlayerContainer, Shutdownable { C unregister(C playerContainer); - default PlayerContainer register(@NonNull final Collection playerCollection, final boolean global) { + default PlayerContainer register(final @NonNull Collection playerCollection, final boolean global) { val playerContainer = PlayerContainers.wrap(playerCollection, global); register(playerContainer); return playerContainer; } - default PlayerContainer register(@NonNull final Map playerCollection, - @NonNull final Function defaultValueSupplier, + default PlayerContainer register(final @NonNull Map playerCollection, + final @NonNull Function defaultValueSupplier, final boolean global) { val playerContainer = PlayerContainers.wrap(playerCollection, defaultValueSupplier, global); register(playerContainer); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java index 29dd5a6c3..7f954ad00 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/plugin/BukkitPluginShutdownUtil.java @@ -63,7 +63,7 @@ private static class PluginShutdownHandler implements Listener { @NonNull Plugin plugin; @NonNull List shutdownHooks = ConcurrentCollections.concurrentList(new ArrayList<>()); - private PluginShutdownHandler(@NonNull final Plugin plugin) { + private PluginShutdownHandler(final @NonNull Plugin plugin) { this.plugin = plugin; plugin.getServer().getPluginManager().registerEvents(this, plugin); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java index 90dfb3114..f02fb3561 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java @@ -10,9 +10,9 @@ public abstract class AbstractSchedulerChain implements SchedulerChain { @ToString @RequiredArgsConstructor - protected static abstract class Builder implements SchedulerChain.Builder { + protected abstract static class Builder implements SchedulerChain.Builder { - @NonNull final Queue tasks; + final @NonNull Queue tasks; @Override public SchedulerChain.Builder delay(final long delay) { @@ -22,28 +22,28 @@ public SchedulerChain.Builder delay(final long delay) { } @Override - public SchedulerChain.Builder then(@NonNull final Runnable task) { + public SchedulerChain.Builder then(final @NonNull Runnable task) { tasks.add(new UndelayedTask(task)); return this; } @Override - public SchedulerChain.Builder then(@NonNull final Runnable task, final long delay) { + public SchedulerChain.Builder then(final @NonNull Runnable task, final long delay) { tasks.add(new DelayedTask(task, delay)); return this; } @Override - public SchedulerChain.Builder thenRepeat(@NonNull final Runnable task, final long times) { + public SchedulerChain.Builder thenRepeat(final @NonNull Runnable task, final long times) { tasks.add(new UndelayedRecalledTask(task, times)); return this; } @Override - public SchedulerChain.Builder thenRepeat(@NonNull final Runnable task, final long times, final long delay) { + public SchedulerChain.Builder thenRepeat(final @NonNull Runnable task, final long times, final long delay) { tasks.add(new DelayedRecalledTask(task, delay, times)); return this; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/BukkitSchedulerChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/BukkitSchedulerChain.java index bc39a6114..ec5611015 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/BukkitSchedulerChain.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/BukkitSchedulerChain.java @@ -23,22 +23,23 @@ public class BukkitSchedulerChain extends AbstractSchedulerChain { boolean async; @NonNull Iterable tasks; - @NonNull final Object currentTaskMutex; + final @NonNull Object currentTaskMutex; - @SuppressWarnings("NullableProblems") @NonNull @NonFinal volatile Iterator iterator; + @NonFinal @NonNull volatile Iterator iterator; @NonFinal volatile BukkitTask currentTask; public static SchedulerChain.Builder builder(final Plugin plugin, final boolean async) { return new Builder(plugin, async, new ArrayDeque<>()); } - protected BukkitSchedulerChain(@NonNull final Plugin plugin, final boolean async, - @NonNull final Iterable tasks) { + protected BukkitSchedulerChain(final @NonNull Plugin plugin, final boolean async, + final @NonNull Iterable tasks) { this.plugin = plugin; - this.scheduler = plugin.getServer().getScheduler(); + scheduler = plugin.getServer().getScheduler(); this.async = async; this.tasks = tasks; + //noinspection ZeroLengthArrayAllocation: mutex object currentTaskMutex = new Object[0]; } @@ -83,7 +84,7 @@ protected void tryRunNextTask() { } else reset(); } - protected Runnable createNextRunnable(@NonNull final Runnable runnable, final long times) { + protected Runnable createNextRunnable(final @NonNull Runnable runnable, final long times) { return () -> { var mutableTimes = times; // call the required tasks needed amount of time @@ -101,7 +102,7 @@ protected static class Builder extends AbstractSchedulerChain.Builder { @NonNull Plugin plugin; boolean async; - public Builder(@NonNull final Plugin plugin, final boolean async, @NonNull final Queue tasks) { + public Builder(final @NonNull Plugin plugin, final boolean async, final @NonNull Queue tasks) { super(tasks); this.plugin = plugin; this.async = async; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java index de02506b9..83e6c7de7 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/KeyedSchedulerGroup.java @@ -9,7 +9,7 @@ public abstract class KeyedSchedulerGroup extends Schedul public abstract void addTask(K key, @NonNull T task); @Override - public void addTask(@NonNull final T task) { + public void addTask(final @NonNull T task) { addTask(null, task); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java index acc4d47dd..8573a2724 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroup.java @@ -23,14 +23,14 @@ public abstract class SchedulerGroup extends AbstractSchedul public abstract Collection clearTasks(); - public T findTask(@NonNull final Predicate predicate) { + public T findTask(final @NonNull Predicate predicate) { for (final T task : tasks()) if (predicate.test(task)) return task; return null; } - public T removeTask(@NonNull final Predicate predicate) { + public T removeTask(final @NonNull Predicate predicate) { val tasks = tasks().iterator(); while (tasks.hasNext()) { @@ -46,7 +46,7 @@ public T removeTask(@NonNull final Predicate predicate) { return null; } - public Collection removeTasks(@NonNull final Predicate predicate) { + public Collection removeTasks(final @NonNull Predicate predicate) { val tasks = tasks(); val removedTasks = new ArrayList(); for (val task : tasks()) if (predicate.test(task)) removedTasks.add(task); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java index bc5f735ca..c46b2c79b 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/misc/SchedulerGroups.java @@ -22,13 +22,13 @@ @UtilityClass public class SchedulerGroups { - public KeyedSchedulerGroup keyedSchedulerGroup(@NonNull final Plugin plugin, + public KeyedSchedulerGroup keyedSchedulerGroup(final @NonNull Plugin plugin, final boolean async, final long delay, final long interval) { return new MultimapBasedKeyedSchedulerGroup<>(plugin, async, delay, interval, ArrayListMultimap.create()); } - public KeyedSchedulerGroup concurrentKeyedSchedulerGroup(@NonNull final Plugin plugin, + public KeyedSchedulerGroup concurrentKeyedSchedulerGroup(final @NonNull Plugin plugin, final boolean async, final long delay, final long interval) { @@ -43,14 +43,14 @@ public KeyedSchedulerGroup concurrentKeyedSchedule @FieldDefaults(level = AccessLevel.PROTECTED) private static class MultimapBasedKeyedSchedulerGroup extends KeyedSchedulerGroup { - @NonNull final Plugin plugin; + final @NonNull Plugin plugin; final BukkitTaskInitializer initializer; final Multimap tasks; - public MultimapBasedKeyedSchedulerGroup(@NonNull final Plugin plugin, final boolean async, final long delay, - final long interval, @NonNull final Multimap tasks) { + public MultimapBasedKeyedSchedulerGroup(final @NonNull Plugin plugin, final boolean async, final long delay, + final long interval, final @NonNull Multimap tasks) { this.plugin = plugin; initializer = BukkitTaskInitializers.createTimerTaskInitializer(plugin, async, delay, interval, this); @@ -97,19 +97,19 @@ public void run() { } @Override - public void addTask(final K key, @NonNull final T task) { + public void addTask(final K key, final @NonNull T task) { initializer.initialize(); tasks.put(key, task); } @Override - public boolean removeTask(@NonNull final T task) { + public boolean removeTask(final @NonNull T task) { return tasks.values().remove(task); } @Override - public int removeTasks(@NonNull final T task) { + public int removeTasks(final @NonNull T task) { val tasks = this.tasks.values(); boolean mayContain; var removed = 0; @@ -136,9 +136,9 @@ private static class ConcurrentMultimapBasedKeyedSchedulerGroup tasks) { + final @NonNull Multimap tasks) { super(plugin, async, delay, interval, tasks); } @@ -183,7 +183,7 @@ public void run() { } @Override - public void addTask(final K key, @NonNull final T task) { + public void addTask(final K key, final @NonNull T task) { writeLock.lock(); try { super.addTask(key, task); @@ -193,7 +193,7 @@ public void addTask(final K key, @NonNull final T task) { } @Override - public boolean removeTask(@NonNull final T task) { + public boolean removeTask(final @NonNull T task) { writeLock.lock(); try { return super.removeTask(task); @@ -203,7 +203,7 @@ public boolean removeTask(@NonNull final T task) { } @Override - public int removeTasks(@NonNull final T task) { + public int removeTasks(final @NonNull T task) { writeLock.lock(); try { return super.removeTasks(task); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java index 7da7c8828..a99ae7154 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/pool/SingleWorkerLoopPool.java @@ -76,19 +76,19 @@ public void run() { } @Override - public void setup(@NotNull final BukkitTask task, @NotNull final Runnable disabler) { + public void setup(final @NotNull BukkitTask task, final @NotNull Runnable disabler) { owningTask = task; this.disabler = disabler; } @Override - public @NotNull ShutdownHook addTask(@NotNull final Runnable task) { + public @NotNull ShutdownHook addTask(final @NotNull Runnable task) { tasks.add(task); return () -> removeTask(task); } - private void removeTask(@NotNull final Runnable task) { + private void removeTask(final @NotNull Runnable task) { tasks.remove(task); if (tasks.isEmpty() && owningTask != null) { assert disabler != null; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/AbstractSchedulerRunnable.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/AbstractSchedulerRunnable.java index 81fefa245..728bbdab3 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/AbstractSchedulerRunnable.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/AbstractSchedulerRunnable.java @@ -36,7 +36,7 @@ public void cancel() { @Override @Synchronized("taskAccessLock") - public BukkitTask runTask(@NotNull final Plugin plugin) { + public BukkitTask runTask(final @NotNull Plugin plugin) { if (task != null) throw new IllegalStateException("This task has already started"); return task = plugin.getServer().getScheduler().runTask(plugin, this); @@ -44,7 +44,7 @@ public BukkitTask runTask(@NotNull final Plugin plugin) { @Override @Synchronized("taskAccessLock") - public BukkitTask runTaskAsynchronously(@NotNull final Plugin plugin) { + public BukkitTask runTaskAsynchronously(final @NotNull Plugin plugin) { if (task != null) throw new IllegalStateException("This task has already started"); return task = plugin.getServer().getScheduler().runTaskAsynchronously(plugin, this); @@ -52,7 +52,7 @@ public BukkitTask runTaskAsynchronously(@NotNull final Plugin plugin) { @Override @Synchronized("taskAccessLock") - public BukkitTask runTaskLater(@NotNull final Plugin plugin, final long delay) { + public BukkitTask runTaskLater(final @NotNull Plugin plugin, final long delay) { if (task != null) throw new IllegalStateException("This task has already started"); return task = plugin.getServer().getScheduler().runTaskLater(plugin, this, delay); @@ -60,7 +60,7 @@ public BukkitTask runTaskLater(@NotNull final Plugin plugin, final long delay) { @Override @Synchronized("taskAccessLock") - public BukkitTask runTaskLaterAsynchronously(@NotNull final Plugin plugin, final long delay) { + public BukkitTask runTaskLaterAsynchronously(final @NotNull Plugin plugin, final long delay) { if (task != null) throw new IllegalStateException("This task has already started"); return task = plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, this, delay); @@ -68,7 +68,7 @@ public BukkitTask runTaskLaterAsynchronously(@NotNull final Plugin plugin, final @Override @Synchronized("taskAccessLock") - public BukkitTask runTaskTimer(@NotNull final Plugin plugin, final long delay, final long period) { + public BukkitTask runTaskTimer(final @NotNull Plugin plugin, final long delay, final long period) { if (task != null) throw new IllegalStateException("This task has already started"); return task = plugin.getServer().getScheduler().runTaskTimer(plugin, this, delay, period); @@ -76,7 +76,7 @@ public BukkitTask runTaskTimer(@NotNull final Plugin plugin, final long delay, f @Override @Synchronized("taskAccessLock") - public BukkitTask runTaskTimerAsynchronously(@NotNull final Plugin plugin, final long delay, final long period) { + public BukkitTask runTaskTimerAsynchronously(final @NotNull Plugin plugin, final long delay, final long period) { if (task != null) throw new IllegalStateException("This task has already started"); return task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, this, delay, period); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java index e3487280a..58aec20c0 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/CancellingBukkitRunnable.java @@ -21,7 +21,7 @@ public void run() { protected abstract boolean tick(); - public static SchedulerRunnable create(@NonNull final BooleanSupplier task) { + public static SchedulerRunnable create(final @NonNull BooleanSupplier task) { return new FunctionalCancellingBukkitRunnable(task); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/conditional/AbstractConditionalTask.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/conditional/AbstractConditionalTask.java index 6ed5909a7..c664b4926 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/conditional/AbstractConditionalTask.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/conditional/AbstractConditionalTask.java @@ -23,7 +23,7 @@ public void run() { if (!tryRun()) cancel(); } - public static SchedulerRunnable create(@NonNull final BooleanSupplier conditionalTask) { + public static SchedulerRunnable create(final @NonNull BooleanSupplier conditionalTask) { return new SimpleConditionalTask(conditionalTask); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java index 91d91db0e..906c27e79 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/initializer/BukkitTaskInitializers.java @@ -13,8 +13,8 @@ @UtilityClass public class BukkitTaskInitializers { - public BukkitTaskInitializer createTaskInitializer(@NonNull final Plugin plugin, final boolean async, - @NonNull final Runnable runnable) { + public BukkitTaskInitializer createTaskInitializer(final @NonNull Plugin plugin, final boolean async, + final @NonNull Runnable runnable) { return new AbstractBukkitTaskInitializer() { @Override @@ -26,8 +26,8 @@ public BukkitTask init() { }; } - public BukkitTaskInitializer createTaskInitializer(@NonNull final Plugin plugin, final boolean async, - @NonNull final SchedulerRunnable runnable) { + public BukkitTaskInitializer createTaskInitializer(final @NonNull Plugin plugin, final boolean async, + final @NonNull SchedulerRunnable runnable) { return new AbstractBukkitTaskInitializer() { @Override @@ -37,9 +37,9 @@ public BukkitTask init() { }; } - public BukkitTaskInitializer createTimerTaskInitializer(@NonNull final Plugin plugin, final boolean async, + public BukkitTaskInitializer createTimerTaskInitializer(final @NonNull Plugin plugin, final boolean async, final long delay, final long period, - @NonNull final Runnable runnable) { + final @NonNull Runnable runnable) { return new AbstractBukkitTaskInitializer() { @Override @@ -51,9 +51,9 @@ public BukkitTask init() { }; } - public BukkitTaskInitializer createTimerTaskInitializer(@NonNull final Plugin plugin, final boolean async, + public BukkitTaskInitializer createTimerTaskInitializer(final @NonNull Plugin plugin, final boolean async, final long delay, final long period, - @NonNull final SchedulerRunnable runnable) { + final @NonNull SchedulerRunnable runnable) { return new AbstractBukkitTaskInitializer() { @Override @@ -65,9 +65,9 @@ public BukkitTask init() { }; } - public BukkitTaskInitializer createDelayedTaskInitializer(@NonNull final Plugin plugin, final boolean async, + public BukkitTaskInitializer createDelayedTaskInitializer(final @NonNull Plugin plugin, final boolean async, final long delay, - @NonNull final Runnable runnable) { + final @NonNull Runnable runnable) { return new AbstractBukkitTaskInitializer() { @Override @@ -79,9 +79,9 @@ public BukkitTask init() { }; } - public BukkitTaskInitializer createDelayedTaskInitializer(@NonNull final Plugin plugin, final boolean async, + public BukkitTaskInitializer createDelayedTaskInitializer(final @NonNull Plugin plugin, final boolean async, final long delay, - @NonNull final SchedulerRunnable runnable) { + final @NonNull SchedulerRunnable runnable) { return new AbstractBukkitTaskInitializer() { diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractBukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractBukkitTimer.java index d774d324f..0d19daca9 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractBukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractBukkitTimer.java @@ -43,7 +43,7 @@ protected void onAbort() {} protected void onOver() {} - public static SchedulerRunnable create(@NonNull final Runnable task, final long counter) { + public static SchedulerRunnable create(final @NonNull Runnable task, final long counter) { return new SimpleBukkitTimer(task, counter); } @@ -52,7 +52,7 @@ private static final class SimpleBukkitTimer extends AbstractBukkitTimer { @NotNull Runnable task; - public SimpleBukkitTimer(@NotNull final Runnable task, + public SimpleBukkitTimer(final @NotNull Runnable task, final long counter) { super(counter); this.task = task; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractCallbackTimer.java index 42b571db3..f56f86f78 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractCallbackTimer.java @@ -47,7 +47,7 @@ protected void onAbort() {} protected void onOver() {} - public static SchedulerRunnable create(@NonNull final LongConsumer task, final long counter) { + public static SchedulerRunnable create(final @NonNull LongConsumer task, final long counter) { return new SimpleCallbackTimer(task, counter); } @@ -56,7 +56,7 @@ private static final class SimpleCallbackTimer extends AbstractCallbackTimer { @NotNull LongConsumer task; - public SimpleCallbackTimer(@NotNull final LongConsumer task, + public SimpleCallbackTimer(final @NotNull LongConsumer task, final long counter) { super(counter); this.task = task; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentBukkitTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentBukkitTimer.java index 17fe5cc11..d96cbf4a3 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentBukkitTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentBukkitTimer.java @@ -45,11 +45,11 @@ protected void onAbort() {} protected void onOver() {} - public static SchedulerRunnable create(@NonNull final Runnable task, final long counter) { + public static SchedulerRunnable create(final @NonNull Runnable task, final long counter) { return new SimpleConcurrentBukkitTimer(task, new AtomicLong(counter)); } - public static SchedulerRunnable create(@NonNull final Runnable task, @NonNull final AtomicLong counter) { + public static SchedulerRunnable create(final @NonNull Runnable task, final @NonNull AtomicLong counter) { return new SimpleConcurrentBukkitTimer(task, counter); } @@ -58,8 +58,8 @@ private static final class SimpleConcurrentBukkitTimer extends AbstractConcurren @NotNull Runnable task; - public SimpleConcurrentBukkitTimer(@NotNull final Runnable task, - @NotNull final AtomicLong counter) { + public SimpleConcurrentBukkitTimer(final @NotNull Runnable task, + final @NotNull AtomicLong counter) { super(counter); this.task = task; } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentCallbackTimer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentCallbackTimer.java index d459d0dbe..677129ee3 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentCallbackTimer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/task/timer/AbstractConcurrentCallbackTimer.java @@ -46,11 +46,11 @@ protected void onAbort() {} protected void onOver() {} - public static SchedulerRunnable create(@NonNull final LongConsumer task, final long counter) { + public static SchedulerRunnable create(final @NonNull LongConsumer task, final long counter) { return new SimpleConcurrentCallbackTimer(task, new AtomicLong(counter)); } - public static SchedulerRunnable create(@NonNull final LongConsumer task, @NonNull final AtomicLong counter) { + public static SchedulerRunnable create(final @NonNull LongConsumer task, final @NonNull AtomicLong counter) { return new SimpleConcurrentCallbackTimer(task, counter); } @@ -59,8 +59,8 @@ private static final class SimpleConcurrentCallbackTimer extends AbstractConcurr @NotNull LongConsumer task; - public SimpleConcurrentCallbackTimer(@NotNull final LongConsumer task, - @NotNull final AtomicLong counter) { + public SimpleConcurrentCallbackTimer(final @NotNull LongConsumer task, + final @NotNull AtomicLong counter) { super(counter); this.task = task; } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java index 71b3bb83c..fbaac5e83 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java @@ -25,7 +25,7 @@ public double getDistanceSquared(final Location location1, final Location locati ); } - public Location nearestLocation(@NonNull final Location location, @NonNull final BlockFace blockFace) { + public Location nearestLocation(final @NonNull Location location, final @NonNull BlockFace blockFace) { return location.add(blockFace.getModX(), blockFace.getModY(), blockFace.getModZ()); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java index 4e2ad2ba8..2fc662dca 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/ReflectionUtil.java @@ -9,7 +9,7 @@ @UtilityClass public class ReflectionUtil { - public boolean isClassAvailable(@NonNull final String className) { + public boolean isClassAvailable(final @NonNull String className) { try { Class.forName(className); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java index 700713c79..8aed7cafe 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java @@ -22,9 +22,9 @@ public class SystemPropertyUtil { * @param type of the resulting property value * @return found property transformed to required type or the default value if the property is unset */ - public T getSystemProperty(@NonNull final String propertyName, - @NonNull final Function transformer, - @NonNull final Supplier defaultValueSupplier) { + public T getSystemProperty(final @NonNull String propertyName, + final @NonNull Function transformer, + final @NonNull Supplier defaultValueSupplier) { val property = System.getProperty(propertyName); return property == null ? defaultValueSupplier.get() : transformer.apply(property); @@ -40,9 +40,9 @@ public T getSystemProperty(@NonNull final String propertyName, * @param type of the resulting property value * @return found property transformed to required type or the default value if the property is unset */ - public T getSystemProperty(@NonNull final String propertyName, - @NonNull final Function transformer, - @NonNull final T defaultValue) { + public T getSystemProperty(final @NonNull String propertyName, + final @NonNull Function transformer, + final @NonNull T defaultValue) { return getSystemProperty(propertyName, transformer, (Supplier) () -> defaultValue); } @@ -55,8 +55,8 @@ public T getSystemProperty(@NonNull final String propertyName, * @return found property transformed to required type * or the default value if the property is unset */ - public boolean getSystemPropertyBoolean(@NonNull final String propertyName, - @NonNull final BooleanSupplier defaultValueSupplier) { + public boolean getSystemPropertyBoolean(final @NonNull String propertyName, + final @NonNull BooleanSupplier defaultValueSupplier) { val property = System.getProperty(propertyName); return property == null ? defaultValueSupplier.getAsBoolean() : Boolean.parseBoolean(property); @@ -71,7 +71,7 @@ public boolean getSystemPropertyBoolean(@NonNull final String propertyName, * @return found property transformed to required type * or the default value if the property is unset */ - public boolean getSystemPropertyBoolean(@NonNull final String propertyName, final boolean defaultValue) { + public boolean getSystemPropertyBoolean(final @NonNull String propertyName, final boolean defaultValue) { return getSystemPropertyBoolean(propertyName, () -> defaultValue); } @@ -84,8 +84,8 @@ public boolean getSystemPropertyBoolean(@NonNull final String propertyName, fina * @return found property transformed to required type * or the default value if the property is unset or is not a valid number */ - public int getSystemPropertyInt(@NonNull final String propertyName, - @NonNull final IntSupplier defaultValueSupplier) { + public int getSystemPropertyInt(final @NonNull String propertyName, + final @NonNull IntSupplier defaultValueSupplier) { val property = System.getProperty(propertyName); if (property == null) return defaultValueSupplier.getAsInt(); @@ -105,7 +105,7 @@ public int getSystemPropertyInt(@NonNull final String propertyName, * @return found property transformed to required type * or the default value if the property is unset or is not a valid number */ - public int getSystemPropertyInt(@NonNull final String propertyName, final int defaultValue) { + public int getSystemPropertyInt(final @NonNull String propertyName, final int defaultValue) { return getSystemPropertyInt(propertyName, () -> defaultValue); } @@ -118,8 +118,8 @@ public int getSystemPropertyInt(@NonNull final String propertyName, final int de * @return found property transformed to required type * or the default value if the property is unset or is not a valid number */ - public long getSystemPropertyLong(@NonNull final String propertyName, - @NonNull final LongSupplier defaultValueSupplier) { + public long getSystemPropertyLong(final @NonNull String propertyName, + final @NonNull LongSupplier defaultValueSupplier) { val property = System.getProperty(propertyName); if (property == null) return defaultValueSupplier.getAsLong(); @@ -139,7 +139,7 @@ public long getSystemPropertyLong(@NonNull final String propertyName, * @return found property transformed to required type * or the default value if the property is unset or is not a valid number */ - public long getSystemPropertyLong(@NonNull final String propertyName, final long defaultValue) { + public long getSystemPropertyLong(final @NonNull String propertyName, final long defaultValue) { return getSystemPropertyLong(propertyName, () -> defaultValue); } @@ -152,8 +152,8 @@ public long getSystemPropertyLong(@NonNull final String propertyName, final long * @return found property transformed to required type * or the default value if the property is unset or is not a valid number */ - public double getSystemPropertyDouble(@NonNull final String propertyName, - @NonNull final DoubleSupplier defaultValueSupplier) { + public double getSystemPropertyDouble(final @NonNull String propertyName, + final @NonNull DoubleSupplier defaultValueSupplier) { val property = System.getProperty(propertyName); if (property == null) return defaultValueSupplier.getAsDouble(); @@ -173,7 +173,7 @@ public double getSystemPropertyDouble(@NonNull final String propertyName, * @return found property transformed to required type * or the default value if the property is unset or is not a valid number */ - public double getSystemPropertyDouble(@NonNull final String propertyName, final double defaultValue) { + public double getSystemPropertyDouble(final @NonNull String propertyName, final double defaultValue) { return getSystemPropertyDouble(propertyName, () -> defaultValue); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java index 747e90bbe..bbb036c33 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java @@ -34,7 +34,7 @@ default UncheckedFunction compose(@NonNull Function UncheckedFunction andThen(@NonNull final Function after) { + default UncheckedFunction andThen(final @NonNull Function after) { return t -> after.apply(apply(t)); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java index a752a3bbf..6af3a482d 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ImageUtil.java @@ -22,7 +22,7 @@ public class ImageUtil { * @param image image to clone * @return cloned image */ - public BufferedImage clone(@NonNull final BufferedImage image) { + public BufferedImage clone(final @NonNull BufferedImage image) { val clonedImage = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); val graphics = clonedImage.getGraphics(); graphics.drawImage(image, 0, 0, null); @@ -40,7 +40,7 @@ public BufferedImage clone(@NonNull final BufferedImage image) { * @see #clone(BufferedImage) should be used to keep your source image unmodified */ @Contract("null, _ -> fail; _, null -> fail; !null, _ -> param1") - public BufferedImage merge(@NonNull final BufferedImage background, @NonNull final BufferedImage... foregrounds) { + public BufferedImage merge(final @NonNull BufferedImage background, final @NonNull BufferedImage... foregrounds) { final int width = background.getWidth(), height = background.getHeight(); val graphics = background.getGraphics(); @@ -65,8 +65,8 @@ public BufferedImage merge(@NonNull final BufferedImage background, @NonNull fin * @see ColorUtil#blendColors(int, int) used color blending algorithm */ @Contract("null, _ -> fail; _, null -> fail; !null, _ -> param1") - public BufferedImage mergeSharp(@NonNull final BufferedImage background, - @NonNull final BufferedImage... foregrounds) { + public BufferedImage mergeSharp(final @NonNull BufferedImage background, + final @NonNull BufferedImage... foregrounds) { final int width = background.getWidth(), height = background.getHeight(); for (val foreground : foregrounds) { diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java index 7db8ae94d..913fff897 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/io/FileUtil.java @@ -23,7 +23,7 @@ public class FileUtil { * @apiNote this attempts to create a file and its parent directory only when needed */ @SneakyThrows - public File makeSureExists(@NonNull final File file) { + public File makeSureExists(final @NonNull File file) { if (!file.isFile()) { val parent = file.getParentFile(); if (parent != null && !parent.isDirectory()) Files.createDirectories(parent.toPath()); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java index 45dea020a..6ed05e3a2 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java @@ -198,7 +198,7 @@ int addAndGet(final int delta) { } @Override - int getAndUpdate(@NonNull final IntUnaryOperator updateFunction) { + int getAndUpdate(final @NonNull IntUnaryOperator updateFunction) { val oldValue = value; value = updateFunction.applyAsInt(oldValue); @@ -206,12 +206,12 @@ int getAndUpdate(@NonNull final IntUnaryOperator updateFunction) { } @Override - int updateAndGet(@NonNull final IntUnaryOperator updateFunction) { + int updateAndGet(final @NonNull IntUnaryOperator updateFunction) { return value = updateFunction.applyAsInt(value); } @Override - int getAndAccumulate(final int updateValue, @NonNull final IntBinaryOperator accumulatorFunction) { + int getAndAccumulate(final int updateValue, final @NonNull IntBinaryOperator accumulatorFunction) { val oldValue = value; value = accumulatorFunction.applyAsInt(value, updateValue); @@ -219,7 +219,7 @@ int getAndAccumulate(final int updateValue, @NonNull final IntBinaryOperator acc } @Override - int accumulateAndGet(final int updateValue, @NonNull final IntBinaryOperator accumulatorFunction) { + int accumulateAndGet(final int updateValue, final @NonNull IntBinaryOperator accumulatorFunction) { return value = accumulatorFunction.applyAsInt(value, updateValue); } @@ -311,22 +311,22 @@ int addAndGet(final int delta) { } @Override - int getAndUpdate(@NonNull final IntUnaryOperator updateFunction) { + int getAndUpdate(final @NonNull IntUnaryOperator updateFunction) { return value.getAndUpdate(updateFunction); } @Override - int updateAndGet(@NonNull final IntUnaryOperator updateFunction) { + int updateAndGet(final @NonNull IntUnaryOperator updateFunction) { return value.updateAndGet(updateFunction); } @Override - int getAndAccumulate(final int updateValue, @NonNull final IntBinaryOperator accumulatorFunction) { + int getAndAccumulate(final int updateValue, final @NonNull IntBinaryOperator accumulatorFunction) { return value.getAndAccumulate(updateValue, accumulatorFunction); } @Override - int accumulateAndGet(final int updateValue, @NonNull final IntBinaryOperator accumulatorFunction) { + int accumulateAndGet(final int updateValue, final @NonNull IntBinaryOperator accumulatorFunction) { return value.accumulateAndGet(updateValue, accumulatorFunction); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java index f4c6e0ba0..befce56e1 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ObjectAlreadyShutDownException.java @@ -1,8 +1,7 @@ package ru.progrm_jarvis.minecraft.commons.util.shutdown; import lombok.NonNull; - -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; /** * An exception which may be thrown whenever {@link Shutdownable#shutdown()} @@ -15,7 +14,7 @@ public class ObjectAlreadyShutDownException extends RuntimeException { * * @param message message describing the reason of the exception */ - public ObjectAlreadyShutDownException(@NonNull final String message) { + public ObjectAlreadyShutDownException(final @NonNull String message) { super(message); } @@ -32,7 +31,7 @@ public ObjectAlreadyShutDownException() { * @param object object whose {@link Shutdownable#shutdown()} was called multiple times * although it was expected to be called only once */ - public ObjectAlreadyShutDownException(@Nullable final Shutdownable object) { + public ObjectAlreadyShutDownException(final @Nullable Shutdownable object) { this(object == null ? "Object is already shut down" : object + " is already shut down"); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index cead23244..287e1bbea 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -3,9 +3,9 @@ import lombok.*; import lombok.experimental.FieldDefaults; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.Nullable; import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginShutdownUtil; -import javax.annotation.Nullable; import java.util.ArrayDeque; import java.util.Deque; import java.util.concurrent.ConcurrentLinkedDeque; @@ -100,7 +100,7 @@ static ShutdownHooks create() { * @param parent object whose shutdown hooks those are * @return created {@link ShutdownHooks} instance */ - static ShutdownHooks create(@NonNull final Shutdownable parent) { + static ShutdownHooks create(final @NonNull Shutdownable parent) { return new Simple(parent); } @@ -119,7 +119,7 @@ static ShutdownHooks createConcurrent() { * @param parent object whose shutdown hooks those are * @return created concurrent {@link ShutdownHooks} instance */ - static ShutdownHooks createConcurrent(@NonNull final Shutdownable parent) { + static ShutdownHooks createConcurrent(final @NonNull Shutdownable parent) { return new Concurrent(parent); } @@ -129,8 +129,8 @@ static ShutdownHooks createConcurrent(@NonNull final Shutdownable parent) { @RequiredArgsConstructor(access = AccessLevel.PROTECTED) class Simple implements ShutdownHooks { - @Nullable final Shutdownable parent; - @NonNull final Deque shutdownHooks = new ArrayDeque<>(); + final @Nullable Shutdownable parent; + final @NonNull Deque shutdownHooks = new ArrayDeque<>(); @Getter boolean shutDown = false; @Nullable Plugin bukkitPlugin; @@ -144,7 +144,7 @@ protected void checkState() { } @Override - @NonNull public ShutdownHooks add(@NonNull final Runnable hook) { + @NonNull public ShutdownHooks add(final @NonNull Runnable hook) { checkState(); shutdownHooks.add(hook); @@ -153,7 +153,7 @@ protected void checkState() { } @Override - @NonNull public ShutdownHooks add(@NonNull final Supplier hookSupplier) { + @NonNull public ShutdownHooks add(final @NonNull Supplier hookSupplier) { checkState(); shutdownHooks.add(hookSupplier.get()); @@ -162,7 +162,7 @@ protected void checkState() { } @Override - public T add(@NonNull final Supplier objectSupplier, @NonNull final Function hookCreator) { + public T add(final @NonNull Supplier objectSupplier, final @NonNull Function hookCreator) { checkState(); val object = objectSupplier.get(); @@ -172,7 +172,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct } @Override - @NonNull public ShutdownHooks remove(@NonNull final Runnable hook) { + @NonNull public ShutdownHooks remove(final @NonNull Runnable hook) { checkState(); shutdownHooks.remove(hook); @@ -181,7 +181,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct } @Override - @NonNull public ShutdownHooks registerBukkitShutdownHook(@NonNull final Plugin plugin) { + @NonNull public ShutdownHooks registerBukkitShutdownHook(final @NonNull Plugin plugin) { checkState(); if (bukkitPlugin == null) { @@ -231,11 +231,11 @@ public void shutdown() { @RequiredArgsConstructor(access = AccessLevel.PROTECTED) class Concurrent implements ShutdownHooks { - @Nullable final Shutdownable parent; - @NonNull final Deque shutdownHooks = new ConcurrentLinkedDeque<>(); + final @Nullable Shutdownable parent; + final @NonNull Deque shutdownHooks = new ConcurrentLinkedDeque<>(); AtomicBoolean shutDown = new AtomicBoolean(); - @NonNull final AtomicReference bukkitPlugin = new AtomicReference<>(); + final @NonNull AtomicReference bukkitPlugin = new AtomicReference<>(); protected Concurrent() { this(null); @@ -246,7 +246,7 @@ protected void checkState() { } @Override - @NonNull public ShutdownHooks add(@NonNull final Runnable hook) { + @NonNull public ShutdownHooks add(final @NonNull Runnable hook) { checkState(); shutdownHooks.add(hook); @@ -255,7 +255,7 @@ protected void checkState() { } @Override - @NonNull public ShutdownHooks add(@NonNull final Supplier hookSupplier) { + @NonNull public ShutdownHooks add(final @NonNull Supplier hookSupplier) { checkState(); shutdownHooks.add(hookSupplier.get()); @@ -264,7 +264,7 @@ protected void checkState() { } @Override - public T add(@NonNull final Supplier objectSupplier, @NonNull final Function hookCreator) { + public T add(final @NonNull Supplier objectSupplier, final @NonNull Function hookCreator) { checkState(); val object = objectSupplier.get(); @@ -274,7 +274,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct } @Override - @NonNull public ShutdownHooks remove(@NonNull final Runnable hook) { + @NonNull public ShutdownHooks remove(final @NonNull Runnable hook) { checkState(); shutdownHooks.remove(hook); @@ -283,7 +283,7 @@ public T add(@NonNull final Supplier objectSupplier, @NonNull final Funct } @Override - @NonNull public ShutdownHooks registerBukkitShutdownHook(@NonNull final Plugin plugin) { + @NonNull public ShutdownHooks registerBukkitShutdownHook(final @NonNull Plugin plugin) { checkState(); if (bukkitPlugin.compareAndSet(null, plugin)) BukkitPluginShutdownUtil.addShutdownHook(plugin, this); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java index 6c195be5d..1bc5a70e8 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java @@ -18,7 +18,7 @@ @FieldDefaults(level = AccessLevel.PRIVATE) public class Time { - public Time(final long duration, @NonNull final TimeUnit unit) { + public Time(final long duration, final @NonNull TimeUnit unit) { Preconditions.checkArgument(duration >= 0, "duration should be non-negative"); this.duration = duration; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java index 04b89e285..46c18eb56 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/title/TitleUtil.java @@ -35,7 +35,7 @@ public class TitleUtil { * * @apiNote clearing the title means that the player will be able to see it again if title-time is sent to him */ - public void clearTitle(@NonNull final Player player) { + public void clearTitle(final @NonNull Player player) { CLEAR_TITLE_PACKET.sendPacket(player); } @@ -46,7 +46,7 @@ public void clearTitle(@NonNull final Player player) { * * @apiNote clearing the title means that the player will be able to see it again if title-time is sent to him */ - public void clearTitle(@NonNull final Player... players) { + public void clearTitle(final @NonNull Player... players) { for (val player : players) CLEAR_TITLE_PACKET.sendPacket(player); } @@ -57,7 +57,7 @@ public void clearTitle(@NonNull final Player... players) { * * @apiNote clearing the title means that the player will be able to see it again if title-time is sent to him */ - public void clearTitle(@NonNull final Iterable players) { + public void clearTitle(final @NonNull Iterable players) { for (val player : players) CLEAR_TITLE_PACKET.sendPacket(player); } @@ -68,7 +68,7 @@ public void clearTitle(@NonNull final Iterable players) { * * @apiNote resetting the title means that the player won't be able to see it again without resending the text */ - public void resetTitle(@NonNull final Player player) { + public void resetTitle(final @NonNull Player player) { RESET_TITLE_PACKET.sendPacket(player); } @@ -79,7 +79,7 @@ public void resetTitle(@NonNull final Player player) { * * @apiNote resetting the title means that the player won't be able to see it again without resending the text */ - public void resetTitle(@NonNull final Player... players) { + public void resetTitle(final @NonNull Player... players) { for (val player : players) RESET_TITLE_PACKET.sendPacket(player); } @@ -90,7 +90,7 @@ public void resetTitle(@NonNull final Player... players) { * * @apiNote resetting the title means that the player won't be able to see it again without resending the text */ - public void resetTitle(@NonNull final Iterable players) { + public void resetTitle(final @NonNull Iterable players) { for (val player : players) RESET_TITLE_PACKET.sendPacket(player); } @@ -102,8 +102,8 @@ public void resetTitle(@NonNull final Iterable players) { * * @apiNote title won't display until title-time is sent */ - public void sendTitle(@NonNull final WrappedChatComponent title, - @NonNull final Player player) { + public void sendTitle(final @NonNull WrappedChatComponent title, + final @NonNull Player player) { val packet = new WrapperPlayServerTitle(); packet.setAction(EnumWrappers.TitleAction.TITLE); packet.setTitle(title); @@ -119,8 +119,8 @@ public void sendTitle(@NonNull final WrappedChatComponent title, * * @apiNote title won't display until title-time is sent */ - public void sendTitle(@NonNull final WrappedChatComponent title, - @NonNull final Player... players) { + public void sendTitle(final @NonNull WrappedChatComponent title, + final @NonNull Player... players) { val packet = new WrapperPlayServerTitle(); packet.setAction(EnumWrappers.TitleAction.TITLE); packet.setTitle(title); @@ -136,8 +136,8 @@ public void sendTitle(@NonNull final WrappedChatComponent title, * * @apiNote title won't display until title-time is sent */ - public void sendTitle(@NonNull final WrappedChatComponent title, - @NonNull final Iterable players) { + public void sendTitle(final @NonNull WrappedChatComponent title, + final @NonNull Iterable players) { val packet = new WrapperPlayServerTitle(); packet.setAction(EnumWrappers.TitleAction.TITLE); packet.setTitle(title); @@ -153,8 +153,8 @@ public void sendTitle(@NonNull final WrappedChatComponent title, * * @apiNote subtitle won't display until title-time is sent */ - public void sendSubtitle(@NonNull final WrappedChatComponent title, - @NonNull final Player player) { + public void sendSubtitle(final @NonNull WrappedChatComponent title, + final @NonNull Player player) { val packet = new WrapperPlayServerTitle(); packet.setAction(EnumWrappers.TitleAction.SUBTITLE); packet.setTitle(title); @@ -170,8 +170,8 @@ public void sendSubtitle(@NonNull final WrappedChatComponent title, * * @apiNote subtitle won't display until title-time is sent */ - public void sendSubtitle(@NonNull final WrappedChatComponent subtitle, - @NonNull final Player... players) { + public void sendSubtitle(final @NonNull WrappedChatComponent subtitle, + final @NonNull Player... players) { val packet = new WrapperPlayServerTitle(); packet.setAction(EnumWrappers.TitleAction.SUBTITLE); packet.setTitle(subtitle); @@ -187,8 +187,8 @@ public void sendSubtitle(@NonNull final WrappedChatComponent subtitle, * * @apiNote subtitle won't display until title-time is sent */ - public void sendSubtitle(@NonNull final WrappedChatComponent subtitle, - @NonNull final Iterable players) { + public void sendSubtitle(final @NonNull WrappedChatComponent subtitle, + final @NonNull Iterable players) { val packet = new WrapperPlayServerTitle(); packet.setAction(EnumWrappers.TitleAction.SUBTITLE); packet.setTitle(subtitle); @@ -208,7 +208,7 @@ public void sendSubtitle(@NonNull final WrappedChatComponent subtitle, * @apiNote sending time reverts the effect of clearing the title */ public void sendTitleTime(final int fadeIn, final int stay, final int fadeOut, - @NonNull final Player player) { + final @NonNull Player player) { val packet = new WrapperPlayServerTitle(); packet.setAction(EnumWrappers.TitleAction.TIMES); packet.setFadeIn(fadeIn); @@ -230,7 +230,7 @@ public void sendTitleTime(final int fadeIn, final int stay, final int fadeOut, * @apiNote sending time reverts the effect of clearing the title */ public void sendTitleTime(final int fadeIn, final int stay, final int fadeOut, - @NonNull final Player... players) { + final @NonNull Player... players) { val packet = new WrapperPlayServerTitle(); packet.setAction(EnumWrappers.TitleAction.TIMES); packet.setFadeIn(fadeIn); @@ -252,7 +252,7 @@ public void sendTitleTime(final int fadeIn, final int stay, final int fadeOut, * @apiNote sending time reverts the effect of clearing the title */ public void sendTitleTime(final int fadeIn, final int stay, final int fadeOut, - @NonNull final Iterable players) { + final @NonNull Iterable players) { val packet = new WrapperPlayServerTitle(); packet.setAction(EnumWrappers.TitleAction.TIMES); packet.setFadeIn(fadeIn); diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java index 48459e414..d49d97567 100644 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java +++ b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java @@ -54,7 +54,7 @@ void testCreateAtomic() { @ParameterizedTest @MethodSource("intWrapperParameters") - void testGetValueOfSpecificNumericType(@NonNull final IntWrapper wrapper) { + void testGetValueOfSpecificNumericType(final @NonNull IntWrapper wrapper) { val value = wrapper.get(); assertEquals((byte) value, wrapper.byteValue()); @@ -67,7 +67,7 @@ void testGetValueOfSpecificNumericType(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testGetSet(@NonNull final IntWrapper wrapper) { + void testGetSet(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val value = RandomUtils.nextInt(); wrapper.set(value); @@ -77,7 +77,7 @@ void testGetSet(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testGetAndIncrement(@NonNull final IntWrapper wrapper) { + void testGetAndIncrement(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val value = wrapper.get(); assertEquals(value, wrapper.getAndIncrement()); @@ -87,7 +87,7 @@ void testGetAndIncrement(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testIncrementAndGet(@NonNull final IntWrapper wrapper) { + void testIncrementAndGet(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val newValue = wrapper.get() + 1; assertEquals(newValue, wrapper.incrementAndGet()); @@ -97,7 +97,7 @@ void testIncrementAndGet(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testGetAndDecrement(@NonNull final IntWrapper wrapper) { + void testGetAndDecrement(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val value = wrapper.get(); assertEquals(value, wrapper.getAndDecrement()); @@ -107,7 +107,7 @@ void testGetAndDecrement(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testDecrementAndGet(@NonNull final IntWrapper wrapper) { + void testDecrementAndGet(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val newValue = wrapper.get() - 1; assertEquals(newValue, wrapper.decrementAndGet()); @@ -117,7 +117,7 @@ void testDecrementAndGet(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testGetAndAdd(@NonNull final IntWrapper wrapper) { + void testGetAndAdd(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val delta = RandomUtils.nextInt() * RandomUtil.randomSign(); @@ -129,7 +129,7 @@ void testGetAndAdd(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testAddAndGet(@NonNull final IntWrapper wrapper) { + void testAddAndGet(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val delta = RandomUtils.nextInt() * RandomUtil.randomSign(); @@ -141,7 +141,7 @@ void testAddAndGet(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testGetAndUpdate(@NonNull final IntWrapper wrapper) { + void testGetAndUpdate(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val function = randomIntUnaryFunction(); @@ -153,7 +153,7 @@ void testGetAndUpdate(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testUpdateAndGet(@NonNull final IntWrapper wrapper) { + void testUpdateAndGet(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val function = randomIntUnaryFunction(); @@ -165,7 +165,7 @@ void testUpdateAndGet(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testGetAndAccumulate(@NonNull final IntWrapper wrapper) { + void testGetAndAccumulate(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val function = randomIntBinaryFunction(); val updateValue = RandomUtils.nextInt(); @@ -178,7 +178,7 @@ void testGetAndAccumulate(@NonNull final IntWrapper wrapper) { @ParameterizedTest @MethodSource("intWrapperParameters") - void testAccumulateAndGet(@NonNull final IntWrapper wrapper) { + void testAccumulateAndGet(final @NonNull IntWrapper wrapper) { for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { val function = randomIntBinaryFunction(); val updateValue = RandomUtils.nextInt(); From 695dd2efa37acd40b7ab5b66e9fe9721a86cbc40 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 18 Sep 2020 21:33:10 +0300 Subject: [PATCH 368/508] Add methods for calculating locations with offsets to LocationUtil --- .../minecraft/commons/util/LocationUtil.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java index fbaac5e83..300d58067 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/LocationUtil.java @@ -4,10 +4,27 @@ import lombok.experimental.UtilityClass; import org.bukkit.Location; import org.bukkit.block.BlockFace; +import org.jetbrains.annotations.NotNull; @UtilityClass public class LocationUtil { + public void applyOffset(@NotNull Location location, + final double dx, final double dy, final double dz, + final float dYaw, final float dPitch) { + location.add(dx, dy, dz).setYaw(location.getYaw() + dYaw); + location.setPitch(location.getPitch() + dPitch); + } + + public @NotNull Location withOffset(@NotNull Location location, + final double dx, final double dy, final double dz, + final float dYaw, final float dPitch) { + (location = location.clone().add(dx, dy, dz)).setYaw(location.getYaw() + dYaw); + location.setPitch(location.getPitch() + dPitch); + + return location; + } + public double getDistanceSquared(final double dx, final double dy, final double dz) { return dx * dx + dy * dy + dz * dz; } @@ -17,6 +34,14 @@ public double getDistanceSquared(final double x1, final double y1, final double return getDistanceSquared(x2 - x1, y2 - y1, z2 - z1); } + /** + *

Gets the squared distance between the locations.

+ *

This is a world-ignoring analog of {@link Location#distanceSquared(Location)}.

+ * + * @param location1 first location + * @param location2 second location + * @return the squared distance between the locations + */ public double getDistanceSquared(final Location location1, final Location location2) { return getDistanceSquared( location2.getX() - location1.getX(), @@ -25,6 +50,18 @@ public double getDistanceSquared(final Location location1, final Location locati ); } + /** + *

Gets the distance between the locations.

+ *

This is a world-ignoring analog of {@link Location#distance(Location)}.

+ * + * @param location1 first location + * @param location2 second location + * @return the distance between the locations + */ + public double getDistance(final Location location1, final Location location2) { + return Math.sqrt(getDistanceSquared(location1, location2)); + } + public Location nearestLocation(final @NonNull Location location, final @NonNull BlockFace blockFace) { return location.add(blockFace.getModX(), blockFace.getModY(), blockFace.getModZ()); } From d126fd18bf7c7901bea1076e7e90f2a33ecab749 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 18 Sep 2020 21:33:43 +0300 Subject: [PATCH 369/508] Ignore valid location copies for fake entities --- .../minecraft/fakeentitylib/entity/AbstractFakeEntity.java | 7 ++++++- .../minecraft/fakeentitylib/entity/FakeEntity.java | 5 +++-- .../fakeentitylib/entity/SimpleLivingFakeEntity.java | 5 +++++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java index 8d48924a1..aae3189ef 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/AbstractFakeEntity.java @@ -15,9 +15,14 @@ @FieldDefaults(level = AccessLevel.PROTECTED) public abstract class AbstractFakeEntity implements FakeEntity { - @Getter final @NonNull Location location; + final @NonNull Location location; @Getter boolean visible = true; // setter should be created manually to perform visualisation logic + @Override + public Location getLocation() { + return location.clone(); + } + @Override public World getWorld() { return location.getWorld(); diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java index 52f738d8d..64451e14f 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/FakeEntity.java @@ -24,10 +24,11 @@ public interface FakeEntity extends PlayerContainer { World getWorld(); /** - * Gets location of this fake entity, the object returned should not be modified without cloning - * as it may be an actual fake entity's location object. + * Gets location of this fake entity. * * @return location of this fake entity + * + * @apiNote changes to the returned location will not affect the fake entity */ Location getLocation(); diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index c2128d2cc..d1802e799 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -10,6 +10,7 @@ import org.bukkit.entity.Player; import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; +import ru.progrm_jarvis.minecraft.commons.util.LocationUtil; import java.util.Map; import java.util.Set; @@ -205,6 +206,10 @@ public SimpleLivingFakeEntity(final int entityId, final @Nullable UUID uuid, } } + public Location getLocation() { + return LocationUtil.withOffset(location, xOffset, yOffset, zOffset, yawOffset, pitchOffset); + } + /** * Spawns the entity for player without performing any checks * such as player containment checks or spawn packet actualization. From 1e9975fbc5850c9bccbef5ba05b9c2744e5c15c0 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 18 Sep 2020 22:28:03 +0300 Subject: [PATCH 370/508] Cleanup rotation logic of ArmorStandBlockItem --- .../entity/ArmorStandBlockItem.java | 63 ++++++------------- 1 file changed, 18 insertions(+), 45 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index d9884cf71..ee977e29b 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -13,7 +13,9 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import ru.progrm_jarvis.javacommons.annotation.ownership.Own; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand; @@ -87,11 +89,6 @@ public ArmorStandBlockItem(final @Nullable UUID uuid, equipmentPacket.setItem(this.item = item); } - @Override - public void spawn() { - super.spawn(); - } - /** * Creates new armor stand block-item by parameters specified. * @@ -159,9 +156,7 @@ protected void performSpawnNoChecks(final Player player) { * * @param rotation new rotation of this block */ - public void setRotation(final @NonNull Vector3F rotation) { - if (rotation.equals(this.rotation)) return; - + protected void setRotationNoChecks(final @Own @NotNull Vector3F rotation) { addMetadata(headRotation(rotation)); this.rotation = rotation; } @@ -172,51 +167,29 @@ public void setRotation(final @NonNull Vector3F rotation) { * * @param delta delta of rotation */ - public void rotate(final @NonNull Vector3F delta) { - final Vector3F thisRotation; - setRotation((thisRotation = rotation) == null - ? new Vector3F(delta.getX(), delta.getY(), delta.getZ()) - : new Vector3F( - minimizeAngle(thisRotation.getX() + delta.getX()), - minimizeAngle(thisRotation.getY() + delta.getY()), - minimizeAngle(thisRotation.getZ() + delta.getZ()) - ) - ); - } + public void rotate(final @NonNull @Own Vector3F delta) { + final float dx, dy = delta.getY(), dz = delta.getZ(); + if (((dx = delta.getX()) == 0) && dy == 0 && dz == 0) return; // no-op - /** - * Rotates this block by specified delta. This means that its current - * roll (x), pitch (y) and yaw (z) will each get incremented by those of delta specified. - * - * @param delta delta of rotation - */ - public void rotateTo(final @NonNull Vector3F delta) { - setRotation(rotation == null - ? new Vector3F(delta.getX(), delta.getY(), delta.getZ()) - : new Vector3F( - minimizeAngle(rotation.getX() + delta.getX()), - minimizeAngle(rotation.getY() + delta.getY()), - minimizeAngle(rotation.getZ() + delta.getZ()) - ) - ); + final Vector3F thisRotation; + if (((thisRotation = rotation) != null)) { + delta.setX(thisRotation.getX() + dx); + delta.setY(thisRotation.getY() + dy); + delta.setZ(thisRotation.getZ() + dz); + } + setRotationNoChecks(delta); } /** - * Minimizes the angle so that it fits the interval of [-360; 360] keeping the actual rotation. - * This means removing 360 until the number is less than or equal to 360 - * or adding 360 until the number is bigger than or equal to -360. + * Sets this blocks rotation to the one specified. * - * @param degrees non-minimized angle - * @return minimized angle + * @param newRotation new rotation of this block */ - public static float minimizeAngle(float degrees) { - while (degrees >= 360) degrees -= 360; - while (degrees <= -360) degrees += 360; - - return degrees; + public void setRotation(final @Own @NonNull Vector3F newRotation) { + if (!newRotation.equals(rotation)) setRotationNoChecks(newRotation); } - public void setItem(final @NonNull ItemStack item) { + public void setItem(final @Own @NonNull ItemStack item) { equipmentPacket.setItem(this.item = item); for (val entry : players.entrySet()) if (entry.getValue()) equipmentPacket.sendPacket(entry.getKey()); } From ec486e48d998e3f3cb859959b95c197f35cb6a22 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Fri, 18 Sep 2020 22:49:44 +0300 Subject: [PATCH 371/508] Fix signs in SimpleLivingFakeEntity#getLocation() --- .../minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index d1802e799..30765a48d 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -207,7 +207,7 @@ public SimpleLivingFakeEntity(final int entityId, final @Nullable UUID uuid, } public Location getLocation() { - return LocationUtil.withOffset(location, xOffset, yOffset, zOffset, yawOffset, pitchOffset); + return LocationUtil.withOffset(location, -xOffset, -yOffset, -zOffset, -yawOffset, -pitchOffset); } /** From d13b004e8d3ec324cc18f35271ca69eb6bd4eaa6 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sat, 19 Sep 2020 20:53:20 +0300 Subject: [PATCH 372/508] Remove shade plugin as it is unneeded for libraries --- ez-config/pom.xml | 9 -------- fake-entity-lib/pom.xml | 9 -------- minecraft-commons/pom.xml | 9 -------- pom.xml | 44 --------------------------------------- 4 files changed, 71 deletions(-) diff --git a/ez-config/pom.xml b/ez-config/pom.xml index 8dbde3ac1..0573445f2 100644 --- a/ez-config/pom.xml +++ b/ez-config/pom.xml @@ -9,15 +9,6 @@ ez-cfg - - - - org.apache.maven.plugins - maven-shade-plugin - - - - org.spigotmc diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index 339c2d208..2520091b6 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -11,15 +11,6 @@ jar - - - - org.apache.maven.plugins - maven-shade-plugin - - - - ru.progrm-jarvis.minecraft diff --git a/minecraft-commons/pom.xml b/minecraft-commons/pom.xml index 15bbb1e63..6618a9b0c 100644 --- a/minecraft-commons/pom.xml +++ b/minecraft-commons/pom.xml @@ -9,15 +9,6 @@ minecraft-commons - - - - org.apache.maven.plugins - maven-shade-plugin - - - - ${project.parent.groupId} diff --git a/pom.xml b/pom.xml index ef8a11185..c06b6105a 100644 --- a/pom.xml +++ b/pom.xml @@ -108,50 +108,6 @@ false - - org.apache.maven.plugins - maven-shade-plugin - 3.2.4 - - - package - - shade - - - true - with-dependencies - - - - - - - - org.openjdk.jmh:* - - - - - *:* - - plugin.yml - Log4j-* - yggdrasil_session_pubkey.der - - META-INF/DEPENDENCIES - META-INF/LICENSE - META-INF/LICENSE.txt - META-INF/log4j-provider.properties - META-INF/MANIFEST.MF - META-INF/NOTICE - META-INF/NOTICE.txt - META-INF/web-fragment.xml - - - - - From 58899ac9450afb1e11e4a3b1ab923c139f4c7a29 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sat, 19 Sep 2020 22:50:31 +0300 Subject: [PATCH 373/508] Implement mathematically accurate ArmorStandBlockItem rotation --- .../entity/ArmorStandBlockItem.java | 142 +++++++++++++++--- .../entity/SimpleLivingFakeEntity.java | 64 ++------ 2 files changed, 130 insertions(+), 76 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index ee977e29b..a78056361 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -5,10 +5,9 @@ import com.comphenix.protocol.wrappers.Vector3F; import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedWatchableObject; -import lombok.AccessLevel; -import lombok.NonNull; +import lombok.*; +import lombok.experimental.Accessors; import lombok.experimental.FieldDefaults; -import lombok.val; import org.bukkit.Location; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; @@ -25,6 +24,7 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import static java.lang.Math.*; import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.armorStandFlags; import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.headRotation; import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.Entity.*; @@ -36,12 +36,18 @@ @FieldDefaults(level = AccessLevel.PROTECTED) public class ArmorStandBlockItem extends SimpleLivingFakeEntity { - protected static final double PIXEL_SIZE = 0x1.0p-4, - HALF_PIXEL_SIZE = PIXEL_SIZE * 0x1.0p-5, + protected static final double PIXEL_SIZE = 0x1p-4, + HALF_PIXEL_SIZE = 0x1p-5, ARMOR_STAND_BODY_HEIGHT = (16 + 8) * PIXEL_SIZE, - ARMOR_STAND_HEAD_OFFSET = ARMOR_STAND_BODY_HEIGHT - HALF_PIXEL_SIZE, + ARMOR_STAND_HEAD_ROOT_OFFSET = ARMOR_STAND_BODY_HEIGHT - HALF_PIXEL_SIZE, ITEM_CENTER_Y_OFFSET = 3 * PIXEL_SIZE + HALF_PIXEL_SIZE; // offset of the item center from the rotation center + final boolean small, marker; + final double itemCenterYOffset; + + @NotNull Offset offset; + //double xOffset, yOffset, zOffset; + /** * Rotation of this block */ @@ -70,23 +76,29 @@ public class ArmorStandBlockItem extends SimpleLivingFakeEntity { * @param small whether this block-item is small * @param item item to be displayed by this block-item */ - public ArmorStandBlockItem(final @Nullable UUID uuid, - final Map playersMap, - final boolean global, final int viewDistance, final boolean visible, - final Location location, final @Nullable Vector3F rotation, - final boolean small, final boolean marker, final @NonNull ItemStack item) { + protected ArmorStandBlockItem(final @Nullable UUID uuid, + final @NotNull Map<@NotNull Player, @NotNull Boolean> playersMap, + final boolean global, final int viewDistance, final boolean visible, + final @NotNull Location location, final @NotNull Vector3F rotation, + final @NotNull Offset offset, + final boolean small, final boolean marker, final @NotNull ItemStack item) { super( - NmsUtil.nextEntityId(), uuid, - EntityType.ARMOR_STAND, 0, small ? ARMOR_STAND_HEAD_OFFSET / 2 : ARMOR_STAND_HEAD_OFFSET, 0, 0, 0, 0, + NmsUtil.nextEntityId(), uuid, EntityType.ARMOR_STAND, playersMap, global, viewDistance, visible, location, 0, null, createMetadata(rotation, small, marker) ); + this.small = small; + this.marker = marker; + itemCenterYOffset = small ? ITEM_CENTER_Y_OFFSET / 2 : ITEM_CENTER_Y_OFFSET; + this.rotation = rotation; + this.offset = offset; - equipmentPacket = new WrapperPlayServerEntityEquipment(); - equipmentPacket.setEntityID(entityId); - equipmentPacket.setSlot(EnumWrappers.ItemSlot.HEAD); - equipmentPacket.setItem(this.item = item); + final WrapperPlayServerEntityEquipment thisEquipmentPacket; + equipmentPacket = thisEquipmentPacket = new WrapperPlayServerEntityEquipment(); + thisEquipmentPacket.setEntityID(entityId); + thisEquipmentPacket.setSlot(EnumWrappers.ItemSlot.HEAD); + thisEquipmentPacket.setItem(this.item = item); } /** @@ -104,13 +116,65 @@ public ArmorStandBlockItem(final @Nullable UUID uuid, public static ArmorStandBlockItem create(final @Nullable UUID uuid, final boolean concurrent, final boolean global, final int viewDistance, final boolean visible, - final Location location, - final Vector3F rotation, final boolean small, final boolean marker, - final @NonNull ItemStack item) { + final @Own @NonNull Location location, + final @Own @NonNull Vector3F rotation, + final boolean small, final boolean marker, final @NonNull ItemStack item) { + final Offset offset; + (offset = rotationOffsets(rotation, small)).applyTo(location); + return new ArmorStandBlockItem( uuid, concurrent ? new ConcurrentHashMap<>() : new HashMap<>(), - global, viewDistance, visible, location, rotation, small, marker, item + global, viewDistance, visible, + location.add(0, -(small ? ARMOR_STAND_HEAD_ROOT_OFFSET / 2 : ARMOR_STAND_HEAD_ROOT_OFFSET), 0), + rotation, offset, small, marker, item + ); + } + + @Override + public @NonNull Location getLocation() { + final Location location; + offset.applyTo(location = super.getLocation()); + + return location; + } + + protected static @NotNull Offset rotationOffsets(final Vector3F rotation, final boolean small) { + // apply rotation matrices to align center: https://en.wikipedia.org/wiki/Rotation_matrix + // let L be initial location and Q be geometrical center + // the resulting location should be L' = L - Q' + // where Q' = Mx(xRotation) * My(yRotation) * Mz(zRotation) * Q + // and Mx, My and Mz are rotation matrices for the axes X, Y and Z respectively + + // TODO optimize the formulas + double angle; + double x = 0, y = small ? ITEM_CENTER_Y_OFFSET / 2 : ITEM_CENTER_Y_OFFSET, z = 0; + + //x = x; + double cachedCoordinate = y * cos(angle = toRadians(rotation.getX())) - z * sin(angle); + z = y * sin(angle) + z * cos(angle); + y = cachedCoordinate; + + //y = y; + cachedCoordinate = x * cos(angle = toRadians(rotation.getY())) + z * sin(angle); + z = -x * sin(angle) + z * cos(angle); + x = cachedCoordinate; + + //z = z; + cachedCoordinate = x * cos(angle = toRadians(rotation.getZ())) - y * sin(angle); + y = x * sin(angle) + y * cos(angle); + x = cachedCoordinate; + + /* + System.out.printf( + "<==========(%+.6g)==========>%n[==========(%+.6g)==========]%n" + + "RotOff(%+.6g:%+.6g:%+.6g) = {%+.6g:%+.6g:%+.6g}%n", + (small ? (3.5 / 16) / 2 : (3.5 / 16)), + (small ? ITEM_CENTER_Y_OFFSET / 2 : ITEM_CENTER_Y_OFFSET), + rotation.getX(), rotation.getY(), rotation.getZ(), -x, -y, -z ); + */ + // minuses are used as we need to go to center instead of going from it + return SimpleOffset.create(-x, -y, -z); } /** @@ -146,7 +210,7 @@ protected static WrappedDataWatcher createMetadata(final @Nullable Vector3F rota } @Override - protected void performSpawnNoChecks(final Player player) { + protected void performSpawnNoChecks(final @NotNull Player player) { super.performSpawnNoChecks(player); equipmentPacket.sendPacket(player); } @@ -157,8 +221,16 @@ protected void performSpawnNoChecks(final Player player) { * @param rotation new rotation of this block */ protected void setRotationNoChecks(final @Own @NotNull Vector3F rotation) { + { // overwrite the head's offset + final Offset oldOffset = offset, newOffset; + move( + (newOffset = offset = rotationOffsets(rotation, small)).x() - oldOffset.x(), + newOffset.y() - oldOffset.y(), + newOffset.z() - oldOffset.z() + ); + } + // overwrite the head's rotation addMetadata(headRotation(rotation)); - this.rotation = rotation; } /** @@ -193,4 +265,28 @@ public void setItem(final @Own @NonNull ItemStack item) { equipmentPacket.setItem(this.item = item); for (val entry : players.entrySet()) if (entry.getValue()) equipmentPacket.sendPacket(entry.getKey()); } + + protected interface Offset { + double x(); + double y(); + double z(); + + void applyTo(@NotNull Location location); + } + + @Value + @Accessors(fluent = true) + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + protected static class SimpleOffset implements Offset { + double x, y, z; + + @Override + public void applyTo(final @NotNull Location location) { + location.add(x, y, z); + } + + public static @NotNull Offset create(final double x, final double y, final double z) { + return new SimpleOffset(x, y, z); + } + } } diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 30765a48d..c0a06d60c 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -10,7 +10,6 @@ import org.bukkit.entity.Player; import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; -import ru.progrm_jarvis.minecraft.commons.util.LocationUtil; import java.util.Map; import java.util.Set; @@ -124,40 +123,10 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { */ WrapperPlayServerEntityVelocity velocityPacket; - /** - * Difference between the actual entity x and its visible value - */ - final double xOffset, - /** - * Difference between the actual entity y and its visible value - */ - yOffset, - /** - * Difference between the actual entity z and its visible value - */ - zOffset; - - /** - * Difference between the actual entity yaw and its visible value - */ - final float yawOffset, - - /** - * Difference between the actual entity pitch and its visible value - */ - pitchOffset, - - /** - * Difference between the actual entity head pitch and its visible value - */ - headPitchOffset; - @Builder public SimpleLivingFakeEntity(final int entityId, final @Nullable UUID uuid, // Start of entities properties, TODO specific class final @NonNull EntityType type, - final double xOffset, final double yOffset, final double zOffset, - final float yawOffset, final float pitchOffset, final float headPitchOffset, // End of entity's properties final @NonNull Map players, final boolean global, final int viewDistance, @@ -175,13 +144,6 @@ public SimpleLivingFakeEntity(final int entityId, final @Nullable UUID uuid, this.global = global; this.viewDistance = Math.max(-1, viewDistance); - this.xOffset = xOffset; - this.yOffset = yOffset; - this.zOffset = zOffset; - this.yawOffset = yawOffset; - this.pitchOffset = pitchOffset; - this.headPitchOffset = headPitchOffset; - this.visible = visible; this.location = location; @@ -206,10 +168,6 @@ public SimpleLivingFakeEntity(final int entityId, final @Nullable UUID uuid, } } - public Location getLocation() { - return LocationUtil.withOffset(location, -xOffset, -yOffset, -zOffset, -yawOffset, -pitchOffset); - } - /** * Spawns the entity for player without performing any checks * such as player containment checks or spawn packet actualization. @@ -234,13 +192,13 @@ protected void actualizeSpawnPacket() { final WrapperPlayServerSpawnEntityLiving thisSpawnPacket; { final Location thisLocation; - (thisSpawnPacket = spawnPacket).setX((thisLocation = location).getX() + xOffset); - thisSpawnPacket.setY(thisLocation.getY() + yOffset); - thisSpawnPacket.setZ(thisLocation.getZ() + zOffset); + (thisSpawnPacket = spawnPacket).setX((thisLocation = location).getX()); + thisSpawnPacket.setY(thisLocation.getY()); + thisSpawnPacket.setZ(thisLocation.getZ()); - thisSpawnPacket.setPitch(thisLocation.getPitch() + pitchOffset); - thisSpawnPacket.setYaw(thisLocation.getYaw() + yawOffset); - thisSpawnPacket.setHeadPitch(headPitch + headPitchOffset); + thisSpawnPacket.setPitch(thisLocation.getPitch()); + thisSpawnPacket.setYaw(thisLocation.getYaw()); + thisSpawnPacket.setHeadPitch(headPitch); } { @@ -385,11 +343,11 @@ protected void performTeleportation(final double x, final double y, final double thisTeleportPacket.setEntityID(entityId); } - thisTeleportPacket.setX(x + xOffset); - thisTeleportPacket.setY(y + yOffset); - thisTeleportPacket.setZ(z + zOffset); - thisTeleportPacket.setYaw(yaw + yawOffset); - thisTeleportPacket.setPitch(pitch + pitchOffset); + thisTeleportPacket.setX(x); + thisTeleportPacket.setY(y); + thisTeleportPacket.setZ(z); + thisTeleportPacket.setYaw(yaw); + thisTeleportPacket.setPitch(pitch); thisTeleportPacket.setOnGround(isOnGround()); sendVelocity = sendVelocity && hasVelocity(); From be33817864212444bbb0ccab570c833d04c0e994 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sat, 19 Sep 2020 23:37:19 +0300 Subject: [PATCH 374/508] Optimize matrix rotation --- .../entity/ArmorStandBlockItem.java | 49 ++++++------------- 1 file changed, 15 insertions(+), 34 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index a78056361..b55ef052f 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -80,7 +80,7 @@ protected ArmorStandBlockItem(final @Nullable UUID uuid, final @NotNull Map<@NotNull Player, @NotNull Boolean> playersMap, final boolean global, final int viewDistance, final boolean visible, final @NotNull Location location, final @NotNull Vector3F rotation, - final @NotNull Offset offset, + final double itemCenterYOffset, final @NotNull Offset offset, final boolean small, final boolean marker, final @NotNull ItemStack item) { super( NmsUtil.nextEntityId(), uuid, EntityType.ARMOR_STAND, @@ -89,7 +89,7 @@ protected ArmorStandBlockItem(final @Nullable UUID uuid, this.small = small; this.marker = marker; - itemCenterYOffset = small ? ITEM_CENTER_Y_OFFSET / 2 : ITEM_CENTER_Y_OFFSET; + this.itemCenterYOffset = itemCenterYOffset; this.rotation = rotation; this.offset = offset; @@ -119,14 +119,17 @@ public static ArmorStandBlockItem create(final @Nullable UUID uuid, final @Own @NonNull Location location, final @Own @NonNull Vector3F rotation, final boolean small, final boolean marker, final @NonNull ItemStack item) { + final double itemCenterYOffset; final Offset offset; - (offset = rotationOffsets(rotation, small)).applyTo(location); + (offset = rotationOffsets( + rotation, itemCenterYOffset = small ? ITEM_CENTER_Y_OFFSET * 0x1p-1 : ITEM_CENTER_Y_OFFSET) + ).applyTo(location); return new ArmorStandBlockItem( uuid, concurrent ? new ConcurrentHashMap<>() : new HashMap<>(), global, viewDistance, visible, location.add(0, -(small ? ARMOR_STAND_HEAD_ROOT_OFFSET / 2 : ARMOR_STAND_HEAD_ROOT_OFFSET), 0), - rotation, offset, small, marker, item + rotation, itemCenterYOffset, offset, small, marker, item ); } @@ -138,43 +141,21 @@ public static ArmorStandBlockItem create(final @Nullable UUID uuid, return location; } - protected static @NotNull Offset rotationOffsets(final Vector3F rotation, final boolean small) { + protected static @NotNull Offset rotationOffsets(final Vector3F rotation, double yOffset /* => y */) { // apply rotation matrices to align center: https://en.wikipedia.org/wiki/Rotation_matrix // let L be initial location and Q be geometrical center // the resulting location should be L' = L - Q' // where Q' = Mx(xRotation) * My(yRotation) * Mz(zRotation) * Q // and Mx, My and Mz are rotation matrices for the axes X, Y and Z respectively - // TODO optimize the formulas + // for non-optimized implementation see commit 58899ac9450afb1e11e4a3b1ab923c139f4c7a29 + double angle; - double x = 0, y = small ? ITEM_CENTER_Y_OFFSET / 2 : ITEM_CENTER_Y_OFFSET, z = 0; - - //x = x; - double cachedCoordinate = y * cos(angle = toRadians(rotation.getX())) - z * sin(angle); - z = y * sin(angle) + z * cos(angle); - y = cachedCoordinate; - - //y = y; - cachedCoordinate = x * cos(angle = toRadians(rotation.getY())) + z * sin(angle); - z = -x * sin(angle) + z * cos(angle); - x = cachedCoordinate; - - //z = z; - cachedCoordinate = x * cos(angle = toRadians(rotation.getZ())) - y * sin(angle); - y = x * sin(angle) + y * cos(angle); - x = cachedCoordinate; - - /* - System.out.printf( - "<==========(%+.6g)==========>%n[==========(%+.6g)==========]%n" - + "RotOff(%+.6g:%+.6g:%+.6g) = {%+.6g:%+.6g:%+.6g}%n", - (small ? (3.5 / 16) / 2 : (3.5 / 16)), - (small ? ITEM_CENTER_Y_OFFSET / 2 : ITEM_CENTER_Y_OFFSET), - rotation.getX(), rotation.getY(), rotation.getZ(), -x, -y, -z - ); - */ + val z = -yOffset * sin(angle = toRadians(rotation.getX())); // minuses are used as we need to go to center instead of going from it - return SimpleOffset.create(-x, -y, -z); + return SimpleOffset.create( + (yOffset *= cos(angle)) * sin(angle = toRadians(rotation.getZ())), -yOffset * cos(angle), z + ); } /** @@ -224,7 +205,7 @@ protected void setRotationNoChecks(final @Own @NotNull Vector3F rotation) { { // overwrite the head's offset final Offset oldOffset = offset, newOffset; move( - (newOffset = offset = rotationOffsets(rotation, small)).x() - oldOffset.x(), + (newOffset = offset = rotationOffsets(rotation, itemCenterYOffset)).x() - oldOffset.x(), newOffset.y() - oldOffset.y(), newOffset.z() - oldOffset.z() ); From 2920cfde8f1f6448362a2d0ebc85495e58314775 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Sat, 10 Oct 2020 00:39:47 +0000 Subject: [PATCH 375/508] fix: pom.xml to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JAVA-ORGAPACHEHTTPCOMPONENTS-1016906 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9c8cc314d..9022b98f2 100644 --- a/pom.xml +++ b/pom.xml @@ -276,7 +276,7 @@ org.apache.httpcomponents httpclient - 4.5.12 + 4.5.13 From 060411a88e14d041f5a7480528b7551530a8ba5e Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sun, 15 Nov 2020 04:24:37 +0300 Subject: [PATCH 376/508] Resolve issues with PlayerMapManager using invalid signature for getMap --- .../mapimage/display/PlayerMapManager.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java index 554e22415..5d0b24041 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java @@ -44,18 +44,18 @@ public class PlayerMapManager { /** - * Flag describing whether {@link int} or {@link short} map IDs are used by current server. + * Flag describing whether {@code int} or {@code short} map IDs are used by current server. */ private final boolean USE_INT_IDS; /** * Method handle for {@link MapView#getId()} because it returns - * {@link short} and {@link int} on different Bukkit API versions. + * {@code short} and {@code int} on different Bukkit API versions. */ private final MethodHandle MAP_VIEW__GET_ID__METHOD, /** * Method handle for {@link Bukkit#getMap(int)} because it consumes - * {@link short} and {@link int} on different Bukkit API versions. + * {@code short} and {@code int} on different Bukkit API versions. */ BUKKIT__GET_MAP__METHOD; @@ -70,9 +70,8 @@ public class PlayerMapManager { val returnType = method.getReturnType(); if (returnType == int.class) USE_INT_IDS = true; else if (returnType == short.class) USE_INT_IDS = false; - else throw new IllegalStateException( - "Unknown return type of MapView#getId() method (" + returnType + ")" - ); + else throw new IllegalStateException("Unknown return type of MapView#getId() method (" + returnType + ")"); + MAP_VIEW__GET_ID__METHOD = InvokeUtil.toMethodHandle(method); } try { @@ -176,11 +175,9 @@ public int getMapId(@NonNull final MapView mapView) { */ @SneakyThrows public MapView getMap(final int mapId) { - return (MapView) ( - USE_INT_IDS - ? BUKKIT__GET_MAP__METHOD.invokeExact(mapId) - : BUKKIT__GET_MAP__METHOD.invokeExact((short) mapId) - ); + return USE_INT_IDS // note: same casts at both places to be able to use `invokeExact` + ? (MapView) BUKKIT__GET_MAP__METHOD.invokeExact(mapId) + : (MapView) BUKKIT__GET_MAP__METHOD.invokeExact((short) mapId); } /** From d8fcc26ba1bd2ff396ff748992b4b92348cf0cf6 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sun, 15 Nov 2020 04:24:52 +0300 Subject: [PATCH 377/508] Fix serialization of WrappedChatComponentGsonSerializer --- .../minecraft/commons/util/chat/ChatComponentUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java index e92d26552..115d04c0d 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java @@ -49,7 +49,7 @@ public WrappedChatComponent deserialize(final JsonElement json, final Type typeO @Override public JsonElement serialize(final WrappedChatComponent src, final Type typeOfSrc, final JsonSerializationContext context) { - return context.serialize(context.serialize(src.getJson(), JsonObject.class)); + return context.serialize(context.serialize(src.getJson())); } } } From fe315c827006815da686da631dc6adc8c2e0dfa0 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Fri, 4 Dec 2020 00:40:07 +0000 Subject: [PATCH 378/508] fix: pom.xml to reduce vulnerabilities The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JAVA-ORGAPACHEHTTPCOMPONENTS-1048058 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9c8cc314d..9022b98f2 100644 --- a/pom.xml +++ b/pom.xml @@ -276,7 +276,7 @@ org.apache.httpcomponents httpclient - 4.5.12 + 4.5.13 From 8763203a510b6376fe2c63cf9957a903fb3e174f Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sun, 6 Dec 2020 20:16:09 +0300 Subject: [PATCH 379/508] build(dep): bump PacketWrapper to 1.15.2-R0.1-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9c8cc314d..f357dee59 100644 --- a/pom.xml +++ b/pom.xml @@ -261,7 +261,7 @@ com.comphenix.packetwrapper PacketWrapper - 1.13-R0.1-SNAPSHOT + 1.15.2-R0.1-SNAPSHOT commons-io From 55ce1caa3646d5cab3b55c937387e9c898c5e4d7 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sun, 6 Dec 2020 20:19:12 +0300 Subject: [PATCH 380/508] chore: update .gitignore a bit --- .gitignore | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 16b8675c2..c58db5faf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ - -# Created by https://www.gitignore.io/api/maven,intellij+all +# Created by https://www.toptal.com/developers/gitignore/api/intellij+all,maven,java +# Edit at https://www.toptal.com/developers/gitignore?templates=intellij+all,maven,java ### Intellij+all ### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff @@ -32,9 +32,14 @@ # When using Gradle or Maven with auto-import, you should exclude module files, # since they will be recreated, and may cause churn. Uncomment if using # auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml # .idea/modules.xml # .idea/*.iml # .idea/modules +# *.iml +# *.ipr # CMake cmake-build-*/ @@ -82,6 +87,34 @@ modules.xml .idea/misc.xml *.ipr +# Sonarlint plugin +.idea/sonarlint + +### Java ### +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + ### Maven ### target/ pom.xml.tag @@ -92,13 +125,7 @@ release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar .mvn/wrapper/maven-wrapper.jar - -# End of https://www.gitignore.io/api/maven,intellij+all - -### Security ### -*.asc - -### BuildTools-generated ### -.nms/** \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/intellij+all,maven,java From 9887b0fc5de0d389fc7aad8e9e619b93b20e1929 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sun, 6 Dec 2020 20:50:32 +0300 Subject: [PATCH 381/508] build: add PacketWrapper fork as a git submodule --- .gitmodules | 4 ++++ .travis.yml | 19 ++++-------------- .travis/perform-deploy.sh | 0 build-submodules.sh | 18 +++++++++++++++++ dependencies/PacketWrapper | 1 + deploy.sh | 0 install-git-dependencies.sh | 40 ------------------------------------- project-version.sh | 0 8 files changed, 27 insertions(+), 55 deletions(-) create mode 100644 .gitmodules mode change 100644 => 100755 .travis/perform-deploy.sh create mode 100755 build-submodules.sh create mode 160000 dependencies/PacketWrapper mode change 100644 => 100755 deploy.sh delete mode 100755 install-git-dependencies.sh mode change 100644 => 100755 project-version.sh diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..b7ab233a8 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "PacketWrapper"] + path = dependencies/PacketWrapper + url = git://github.com/JarvisCraft/PacketWrapper + branch = legacy-support diff --git a/.travis.yml b/.travis.yml index 03d96bc54..18c2c5639 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,30 +1,19 @@ -# Programming language language: java -### Maven basic build ### -# Build project, installing to local repo (skip testing and javadoc generation (if those exist)) install: -# Give required permissions to used shell scripts -- chmod +x ./install-git-dependencies.sh -- ./install-git-dependencies.sh -# Normal build part -- mvn clean install -DskipTests=true -Dmaven.javadoc.skip=true -B -V +- ./build-submodules.sh +- mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -B -V + jobs: - # Test project against multiple JDK versions and then deploy include: - stage: test jdk: openjdk8 script: mvn -q verify - # 2. Deploy - stage: deploy if: repo = JarvisCraft/minecraft-utils AND type != pull_request jdk: openjdk8 - script: - - chmod +x ./deploy.sh - - chmod +x ./project-version.sh - - chmod +x ./.travis/perform-deploy.sh - - ./deploy.sh + script: ./deploy.sh # Cached directories cache: diff --git a/.travis/perform-deploy.sh b/.travis/perform-deploy.sh old mode 100644 new mode 100755 diff --git a/build-submodules.sh b/build-submodules.sh new file mode 100755 index 000000000..01f28b52e --- /dev/null +++ b/build-submodules.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +readonly ROOT_DIRECTORY=$(pwd) + +# Make sure that submodules are initialized +git submodule update --init --recursive + +function install_dependency() { + cd "$1" || exit + mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -B -V + cd "$ROOT_DIRECTORY" || exit +} + +echo 'Building submodule dependencies' + +install_dependency "dependencies/PacketWrapper/PacketWrapper" + +echo 'Submodule dependencies have been built' diff --git a/dependencies/PacketWrapper b/dependencies/PacketWrapper new file mode 160000 index 000000000..2d29d0fc5 --- /dev/null +++ b/dependencies/PacketWrapper @@ -0,0 +1 @@ +Subproject commit 2d29d0fc5811a4ad146154aabb1186505087fed9 diff --git a/deploy.sh b/deploy.sh old mode 100644 new mode 100755 diff --git a/install-git-dependencies.sh b/install-git-dependencies.sh deleted file mode 100755 index 4b3459c2e..000000000 --- a/install-git-dependencies.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env bash - -readonly ROOT_DIRECTORY=$(pwd) -readonly DIRECTORY='___locally_built_dependencies___' - -# Resets the selected directory to the ROOT_DIRECTORY -function reset_directory() { - cd "$ROOT_DIRECTORY" || exit -} - -# Installs dependency using HTTPS-Git and Maven -# @param 1 Url of Git user -# @param 2 Name of the Git repository -# @param 3 Git branch to use -# <@param 4> Sub-directory to use as Maven root -function install_dependency() { - local url="https://$1/$2.git" - echo "Installing dependency from $url ($3)" - git clone --single-branch --branch "$3" "$url" - cd "$2" || exit - if [ -n "$4" ]; then - cd $4 || exit - fi - - echo "Building..." - mvn clean install -Dmaven.javadoc.skip=true -B -V - - reset_directory -} - -echo 'Installing special dependencies' - -echo "Root directory set to $ROOT_DIRECTORY" - -echo "Creating directory $DIRECTORY" -mkdir -p $DIRECTORY -echo 'Directory created' -cd $DIRECTORY || exit - -install_dependency "github.com/JarvisCraft" "PacketWrapper" "legacy-support" "PacketWrapper" \ No newline at end of file diff --git a/project-version.sh b/project-version.sh old mode 100644 new mode 100755 From dcf992502430a5a7e66b56ddc5624b581dbb6c08 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Sun, 6 Dec 2020 21:34:12 +0300 Subject: [PATCH 382/508] build(dep): update PacketWrapper fork --- dependencies/PacketWrapper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/PacketWrapper b/dependencies/PacketWrapper index 2d29d0fc5..20979ac75 160000 --- a/dependencies/PacketWrapper +++ b/dependencies/PacketWrapper @@ -1 +1 @@ -Subproject commit 2d29d0fc5811a4ad146154aabb1186505087fed9 +Subproject commit 20979ac7559cef3e015bea18f1410a8388d9bee0 From 72592580f8231a8059312e505385ee3011e8fc25 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 6 Dec 2020 18:44:48 +0000 Subject: [PATCH 383/508] Bump httpclient from 4.5.12 to 4.5.13 Bumps httpclient from 4.5.12 to 4.5.13. Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2390b21a..33f5b0c97 100644 --- a/pom.xml +++ b/pom.xml @@ -232,7 +232,7 @@ org.apache.httpcomponents httpclient - 4.5.12 + 4.5.13 From 4394284274c49062ec5f6fdbd25f6db6ea3fd446 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 6 Dec 2020 18:44:48 +0000 Subject: [PATCH 384/508] Bump lombok from 1.18.12 to 1.18.16 Bumps [lombok](https://github.com/rzwitserloot/lombok) from 1.18.12 to 1.18.16. - [Release notes](https://github.com/rzwitserloot/lombok/releases) - [Changelog](https://github.com/rzwitserloot/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/rzwitserloot/lombok/compare/v1.18.12...v1.18.16) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2390b21a..ea0f995a8 100644 --- a/pom.xml +++ b/pom.xml @@ -239,7 +239,7 @@ org.projectlombok lombok - 1.18.12 + 1.18.16 provided true From 0513bf4708a21f267f3625eefc6a7102942f2094 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 6 Dec 2020 18:49:31 +0000 Subject: [PATCH 385/508] Bump fastutil from 8.4.1 to 8.4.4 Bumps [fastutil](https://github.com/vigna/fastutil) from 8.4.1 to 8.4.4. - [Release notes](https://github.com/vigna/fastutil/releases) - [Changelog](https://github.com/vigna/fastutil/blob/master/CHANGES) - [Commits](https://github.com/vigna/fastutil/compare/8.4.1...8.4.4) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 33f5b0c97..6179a20f7 100644 --- a/pom.xml +++ b/pom.xml @@ -227,7 +227,7 @@ it.unimi.dsi fastutil - 8.4.1 + 8.4.4 org.apache.httpcomponents From 74098c5b0b01e321975356722a2b161f1109517b Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Sun, 6 Dec 2020 18:54:25 +0000 Subject: [PATCH 386/508] Bump version.mockito from 3.5.11 to 3.6.28 Bumps `version.mockito` from 3.5.11 to 3.6.28. Updates `mockito-core` from 3.5.11 to 3.6.28 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.11...v3.6.28) Updates `mockito-junit-jupiter` from 3.5.11 to 3.6.28 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.5.11...v3.6.28) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6179a20f7..429dc8278 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0-SNAPSHOT 5.7.0 1.7.0 - 3.5.11 + 3.6.28 From 5b380980b579d3e9dd5e41c7ab6aa22d79f7a354 Mon Sep 17 00:00:00 2001 From: PROgrm_JARvis Date: Mon, 7 Dec 2020 01:16:39 +0300 Subject: [PATCH 387/508] build(dep): bump padla to 1.0.0-rc.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 490a6ec83..d3a62e080 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 1.8 UTF-8 - 1.0-SNAPSHOT + 1.0.0-rc.1 5.7.0 1.7.0 3.6.28 From 28d313e15683231e40282c64daa4e6b07317d427 Mon Sep 17 00:00:00 2001 From: progrm_jarvis Date: Mon, 7 Dec 2020 01:26:35 +0300 Subject: [PATCH 388/508] fix: resolve incompatibilities with padla --- .../fakeentitylib/entity/ArmorStandBlockItem.java | 13 +++++++++---- .../display/ProtocolBasedMapImageDisplay.java | 2 +- .../minecraft/commons/nms/LegacySupport.java | 4 ++-- .../misc/PacketWrapperPacketAssociations.java | 9 ++++----- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index b55ef052f..5dae48b21 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -14,7 +14,7 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import ru.progrm_jarvis.javacommons.annotation.ownership.Own; +import ru.progrm_jarvis.javacommons.ownership.annotation.Own; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand; @@ -40,7 +40,8 @@ public class ArmorStandBlockItem extends SimpleLivingFakeEntity { HALF_PIXEL_SIZE = 0x1p-5, ARMOR_STAND_BODY_HEIGHT = (16 + 8) * PIXEL_SIZE, ARMOR_STAND_HEAD_ROOT_OFFSET = ARMOR_STAND_BODY_HEIGHT - HALF_PIXEL_SIZE, - ITEM_CENTER_Y_OFFSET = 3 * PIXEL_SIZE + HALF_PIXEL_SIZE; // offset of the item center from the rotation center + ITEM_CENTER_Y_OFFSET = 3 * PIXEL_SIZE + HALF_PIXEL_SIZE; + // offset of the item center from the rotation center final boolean small, marker; final double itemCenterYOffset; @@ -141,7 +142,8 @@ public static ArmorStandBlockItem create(final @Nullable UUID uuid, return location; } - protected static @NotNull Offset rotationOffsets(final Vector3F rotation, double yOffset /* => y */) { + protected static @NotNull + Offset rotationOffsets(final Vector3F rotation, double yOffset /* => y */) { // apply rotation matrices to align center: https://en.wikipedia.org/wiki/Rotation_matrix // let L be initial location and Q be geometrical center // the resulting location should be L' = L - Q' @@ -249,7 +251,9 @@ public void setItem(final @Own @NonNull ItemStack item) { protected interface Offset { double x(); + double y(); + double z(); void applyTo(@NotNull Location location); @@ -266,7 +270,8 @@ public void applyTo(final @NotNull Location location) { location.add(x, y, z); } - public static @NotNull Offset create(final double x, final double y, final double z) { + public static @NotNull + Offset create(final double x, final double y, final double z) { return new SimpleOffset(x, y, z); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index e98a08cf1..68cfe607f 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -7,7 +7,7 @@ import org.bukkit.map.MapView; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.Nullable; -import ru.progrm_jarvis.javacommons.map.MapUtil; +import ru.progrm_jarvis.javacommons.collection.MapUtil; import ru.progrm_jarvis.minecraft.commons.mapimage.MapImage; import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistries; import ru.progrm_jarvis.minecraft.commons.player.registry.PlayerRegistry; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java index a4daaba63..cd3c6aa87 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/LegacySupport.java @@ -11,7 +11,7 @@ import org.bukkit.block.Block; import org.bukkit.entity.FallingBlock; import org.bukkit.material.MaterialData; -import ru.progrm_jarvis.javacommons.map.MapUtil; +import ru.progrm_jarvis.javacommons.collection.MapFiller; import java.util.HashMap; import java.util.Map; @@ -29,7 +29,7 @@ public class LegacySupport { private static final boolean LEGACY_MATERIALS = NMS_VERSION_GENERATION < 13; private static final boolean LEGACY_BLOCK_FALLING = NMS_VERSION_GENERATION < 13; - private static final Map legacyItems = MapUtil.mapFiller(new HashMap()) + private static final Map legacyItems = MapFiller.from(new HashMap()) // TODO or find better solution .put("CAVE_AIR", new LegacyItem("CAVE_AIR", "AIR")) // .put("VOID_AIR", new LegacyItem("VOID_AIR", "AIR")) .map(); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java index 50f606ad2..c781ddccf 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java @@ -9,9 +9,8 @@ import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; import org.apache.commons.lang3.StringUtils; -import ru.progrm_jarvis.javacommons.map.MapUtil; -import ru.progrm_jarvis.javacommons.pair.Pair; -import ru.progrm_jarvis.javacommons.pair.SimplePair; +import ru.progrm_jarvis.javacommons.collection.MapFiller; +import ru.progrm_jarvis.javacommons.object.Pair; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; @@ -43,7 +42,7 @@ public class PacketWrapperPacketAssociations { * Immutable bi-directional map of packet types and their IDs */ @NonNull public final BiMap PACKET_TYPES = ImmutableBiMap.copyOf( - MapUtil.mapFiller(new HashMap()) + MapFiller.from(new HashMap()) .fill(fieldPacketTypes(PacketType.Handshake.Client.class, "Handshake", PacketDirection.CLIENT)) .fill(fieldPacketTypes(PacketType.Handshake.Server.class, "Handshake", PacketDirection.SERVER)) .fill(fieldPacketTypes(PacketType.Login.Client.class, "Login", PacketDirection.CLIENT)) @@ -64,7 +63,7 @@ private Stream> fieldPacketTypes(final @NonNull C return Arrays.stream(packetType.getDeclaredFields()) .filter(field -> PacketType.class.isAssignableFrom(field.getType())) //.filter(field -> field.isAnnotationPresent(Deprecated.class)) - .map((UncheckedFunction>) field -> SimplePair.of( + .map((UncheckedFunction>) field -> Pair.of( (PacketType) field.get(null), PacketTypeId.of(group, direction, upperCaseNameToUpperCamelCase(field.getName())) )); From 9e8b1b8362f4b2b65af0705161e4e89f0c5246dc Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 5 Jan 2021 05:22:32 +0000 Subject: [PATCH 389/508] Bump version.mockito from 3.6.28 to 3.7.0 Bumps `version.mockito` from 3.6.28 to 3.7.0. Updates `mockito-core` from 3.6.28 to 3.7.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.6.28...v3.7.0) Updates `mockito-junit-jupiter` from 3.6.28 to 3.7.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.6.28...v3.7.0) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d3a62e080..22f7f33d3 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0.0-rc.1 5.7.0 1.7.0 - 3.6.28 + 3.7.0 From c2703a640fc12f7dfcaa737e2ed71279e583d23f Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Tue, 19 Jan 2021 18:29:54 +0300 Subject: [PATCH 390/508] chore(dep): add Dependabot config file --- .github/dependabot.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..bb6118c94 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +version: 2 +updates: + - package-ecosystem: maven + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 + target-branch: development + reviewers: + - JarvisCraft + labels: + - dependencies + - automatic From 29c61ffc4ec6f824c52de3f85f25d78eafa00279 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Tue, 19 Jan 2021 18:35:32 +0300 Subject: [PATCH 391/508] ci: configure GitHub Actions --- .github/workflows/build.yml | 36 ++++++++++++++++++++++++++++++++++++ .github/workflows/test.yml | 30 ++++++++++++++++++++++++++++++ .travis.yml | 21 --------------------- 3 files changed, 66 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/test.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..5aee5d32d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,36 @@ +name: Build + +# Build (creating JARs) on push, this includes building `master` and corresponding merge commits +on: [ push ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Cache Maven local repository + uses: actions/cache@v2.1.2 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-maven- + + # This is a temporary workaround until stable PacketWrapper Legacy support is not merged into upstream + - name: Build submodules + run: ./build-submodules.sh + + - name: Build with Maven + run: mvn -B package + + - name: Upload artifacts + uses: actions/upload-artifact@v2 + with: + name: plugin + path: custom-stuff-paper-plugin/target/custom-stuff-paper-plugin-*.jar diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..d7b5de506 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,30 @@ +name: Test + +# Only test (without creating JARs) pull-requests +on: [ pull_request ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Cache Maven local repository + uses: actions/cache@v2.1.2 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-maven- + + # This is a temporary workaround until stable PacketWrapper Legacy support is not merged into upstream + - name: Build submodules + run: ./build-submodules.sh + + - name: Build with Maven + run: mvn -B test diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 18c2c5639..000000000 --- a/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -language: java - -install: -- ./build-submodules.sh -- mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -B -V - -jobs: - include: - - stage: test - jdk: openjdk8 - script: mvn -q verify - - - stage: deploy - if: repo = JarvisCraft/minecraft-utils AND type != pull_request - jdk: openjdk8 - script: ./deploy.sh - -# Cached directories -cache: - directories: - - ~/.m2/repository From d3b62c0217d2d4eb8bf18dc084acc5753e322d51 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Tue, 19 Jan 2021 19:52:42 +0300 Subject: [PATCH 392/508] chore(dep): enable dependabot for GitHub Actions --- .github/dependabot.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index bb6118c94..0ff5f53c6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -11,3 +11,15 @@ updates: labels: - dependencies - automatic + + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: daily + open-pull-requests-limit: 10 + target-branch: development + reviewers: + - JarvisCraft + labels: + - dependencies + - automatic From 4d29841a6ddc2dbc40a9bf0d9715dbdf50df1bd3 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Tue, 19 Jan 2021 19:56:18 +0300 Subject: [PATCH 393/508] ci: try GitHub Actions based deployment --- .../github-pacakage-registry-settings.xml | 22 +++ .../maven/sonatype-ossrh-settings.xml | 22 +++ .github-actions/scripts/get_version.sh | 7 + .github-actions/scripts/maven_deploy.sh | 25 +++ .github/workflows/deploy-snapshot.yml | 43 +++++ .nms/build-nms.sh | 7 - deploy.sh | 51 ----- pom.xml | 182 +++++++++--------- project-version.sh | 2 - 9 files changed, 207 insertions(+), 154 deletions(-) create mode 100644 .github-actions/maven/github-pacakage-registry-settings.xml create mode 100644 .github-actions/maven/sonatype-ossrh-settings.xml create mode 100755 .github-actions/scripts/get_version.sh create mode 100755 .github-actions/scripts/maven_deploy.sh create mode 100644 .github/workflows/deploy-snapshot.yml delete mode 100644 .nms/build-nms.sh delete mode 100755 deploy.sh delete mode 100755 project-version.sh diff --git a/.github-actions/maven/github-pacakage-registry-settings.xml b/.github-actions/maven/github-pacakage-registry-settings.xml new file mode 100644 index 000000000..f4e2a4ffb --- /dev/null +++ b/.github-actions/maven/github-pacakage-registry-settings.xml @@ -0,0 +1,22 @@ + + + + + github-package-registry + ${env.GITHUB_PACKAGE_REGISTRY_DEPLOYER} + ${env.GITHUB_PACKAGE_REGISTRY_TOKEN} + + + + + + import-env-code-signing-credentials + + gpg2 + ${env.CODE_SIGNING_GPG_PRIVATE_KEY} + ${env.CODE_SIGNING_GPG_PASSPHRASE} + + + + diff --git a/.github-actions/maven/sonatype-ossrh-settings.xml b/.github-actions/maven/sonatype-ossrh-settings.xml new file mode 100644 index 000000000..2e98426b6 --- /dev/null +++ b/.github-actions/maven/sonatype-ossrh-settings.xml @@ -0,0 +1,22 @@ + + + + + sonatype-ossrh + ${env.SONATYPE_OSSRH_DEPLOYER} + ${env.SONATYPE_OSSRH_TOKEN} + + + + + + import-env-code-signing-credentials + + gpg2 + ${env.CODE_SIGNING_GPG_KEY_NAME} + ${env.CODE_SIGNING_GPG_KEY_PASSPHRASE} + + + + diff --git a/.github-actions/scripts/get_version.sh b/.github-actions/scripts/get_version.sh new file mode 100755 index 000000000..34f468a65 --- /dev/null +++ b/.github-actions/scripts/get_version.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +# This should be called from repository root + +# shellcheck disable=SC2016 +# this is intentional as it is the value passed to Maven +mvn -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec --quiet diff --git a/.github-actions/scripts/maven_deploy.sh b/.github-actions/scripts/maven_deploy.sh new file mode 100755 index 000000000..b4b2ee312 --- /dev/null +++ b/.github-actions/scripts/maven_deploy.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# This should be called from repository root + +# Valid deployment modes: +# - sonatype-ossrh +# - github-package-registry + +function deploy() { + if [[ $1 != sonatype-ossrh && $1 != github-package-registry ]]; then + echo "Unknown deployment target: $1" + return 1 + fi + + maven_profiles=build-extras,sign-artifacts,import-env-code-signing-credentials,"$1"-deployment + if [[ $2 == release && $1 == sonatype-ossrh ]]; then + maven_profiles="${maven_profiles},automatic-central-release" + fi + echo "Using maven profiles: [${maven_profiles}]" + + mvn deploy --settings ./.github-actions/maven/"$1"-settings.xml --activate-profiles "$maven_profiles" -B -V +} + +deploy sonatype-ossrh "$1" +deploy github-package-registry "$1" \ No newline at end of file diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml new file mode 100644 index 000000000..53e65eae5 --- /dev/null +++ b/.github/workflows/deploy-snapshot.yml @@ -0,0 +1,43 @@ +name: Deploy + +on: + push: + branches: [ development ] + + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Cache Maven local repository + uses: actions/cache@v2.1.2 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-maven- + + # This is a temporary workaround until stable PacketWrapper Legacy support is not merged into upstream + - name: Build submodules + run: ./build-submodules.sh + + - name: Import GPG signing key + id: import_gpg + uses: crazy-max/ghaction-import-gpg@v3.0.2 + with: + gpg-private-key: ${{ GPG_PRIVATE_KEY }} + gpg-passphrase: ${{ GPG_PASSPHRASE }} + + # TODO check version + - name: Deploy snapshot + run: ./.github-actions/scripts/maven_deploy.sh + env: + CODE_SIGNING_GPG_PRIVATE_KEY: ${{ GPG_PRIVATE_KEY }} + CODE_SIGNING_GPG_PASSPHRASE: ${{ GPG_PASSPHRASE }} diff --git a/.nms/build-nms.sh b/.nms/build-nms.sh deleted file mode 100644 index 99ccb4632..000000000 --- a/.nms/build-nms.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash -curl -o BuildTools.jar \ -https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar \ -|| wget -O BuildTools.jar \ -https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/artifact/target/BuildTools.jar - -java -jar BuildTools.jar \ No newline at end of file diff --git a/deploy.sh b/deploy.sh deleted file mode 100755 index fe20b9e4b..000000000 --- a/deploy.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bash - -echo 'Attempting to deploy artifacts if needed' - -# Verify branch set in Travis -echo "Branch: $TRAVIS_BRANCH" -if [[ -z ${TRAVIS_BRANCH} ]]; then # Exit if $TRAVIS_BRANCH is unset - echo 'Not Travis or branch undetected, exiting' - exit 1 -else - echo 'Valid branch' -fi - -# Verify pull-request status (should be false) -echo "Pull-request status: $TRAVIS_PULL_REQUEST" -if [[ ${TRAVIS_PULL_REQUEST} != 'false' ]]; then # Exit if TRAVIS_PULL_REQUEST is not 'false' - echo "Pull-request status should be 'false'" - exit 1 -else - echo 'Valid pull-request status' -fi - -# Verify that JAVA_HOME is set -if [[ -z ${JAVA_HOME} ]]; then # Exit if JAVA_HOME is unset - echo 'JAVA_HOME variable is unset, exiting' - exit 1; -fi - -# Get project version using special script -project_version=$(./project-version.sh) -echo "Got project version: ${project_version}" - -if [[ ${project_version} == *-SNAPSHOT ]]; then # Try to deploy snapshot if version ends with '-SNAPSHOT' - echo 'Snapshot version' - # Snapshots deployment happens only for `development` branch excluding pull requests to it (but including merges) - if [[ "$TRAVIS_BRANCH" = 'development' ]]; then - echo "Deploying ${project_version} to Sonatype repository" - .travis/perform-deploy.sh - else - echo 'Not deploying as branch is not `development`' - fi -else # Try to deploy release if version doesn't end with '-SNAPSHOT' - echo 'Release version' - # Release deployment happens only for `releases` branch excluding pull requests to it (but including merges) - if [[ "$TRAVIS_BRANCH" = 'releases' ]]; then - echo "Deploying ${project_version} to Maven Central" - .travis/perform-deploy.sh - else - echo 'Not deploying as branch is not `releases`' - fi -fi \ No newline at end of file diff --git a/pom.xml b/pom.xml index 22f7f33d3..882a433da 100644 --- a/pom.xml +++ b/pom.xml @@ -94,32 +94,15 @@ - clean verify - org.apache.maven.plugins maven-surefire-plugin 3.0.0-M5 - - 0 - true - false - - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.8 - - ossrh - https://oss.sonatype.org/ - true - - + org.apache.maven.plugins maven-gpg-plugin @@ -135,9 +118,30 @@ maven-javadoc-plugin 3.2.0 - none + + + apiNote + a + API note + + + implNote + a + Implementation note + + + implSpec + a + Implementation specification + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.8 + @@ -311,67 +315,40 @@ - - - java-10 - - 10 - - - 10 - - - - java-11 - - 11 - - - 11 - - - - java-12 - - 12 - - - 12 - - --> - - - ossrh-deploy + build-extras - org.sonatype.plugins - nexus-staging-maven-plugin + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + - sign + sign-artifacts @@ -384,39 +361,56 @@ sign + + + --pinentry-mode + loopback + + + + - build-extras + sonatype-ossrh-deployment + + + + sonatype-ossrh + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + sonatype-ossrh + https://oss.sonatype.org/content/repositories/snapshots/ + + + + + github-package-registry-deployment + + + github-package-registry + https://maven.pkg.github.com/JarvisCraft/padla + + + + + automatic-central-release - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - - jar - - - + org.sonatype.plugins + nexus-staging-maven-plugin + true + + sonatype-ossrh + https://oss.sonatype.org/ + true + diff --git a/project-version.sh b/project-version.sh deleted file mode 100755 index 45febce24..000000000 --- a/project-version.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env bash -mvn -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec -q \ No newline at end of file From c083b9a0dad4bee63cab25b2fc764325f29fcbe3 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 19 Jan 2021 17:21:24 +0000 Subject: [PATCH 394/508] Bump version.mockito from 3.7.0 to 3.7.7 Bumps `version.mockito` from 3.7.0 to 3.7.7. Updates `mockito-core` from 3.7.0 to 3.7.7 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.7.0...v3.7.7) Updates `mockito-junit-jupiter` from 3.7.0 to 3.7.7 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.7.0...v3.7.7) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 882a433da..6ac75f828 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0.0-rc.1 5.7.0 1.7.0 - 3.7.0 + 3.7.7 From 39794e33d97b7d30419b978726d6d70e0b82a7c4 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 19 Jan 2021 17:22:44 +0000 Subject: [PATCH 395/508] Bump bungeecord-api from 1.16-R0.3 to 1.16-R0.4 Bumps [bungeecord-api](https://github.com/SpigotMC/BungeeCord) from 1.16-R0.3 to 1.16-R0.4. - [Release notes](https://github.com/SpigotMC/BungeeCord/releases) - [Commits](https://github.com/SpigotMC/BungeeCord/commits) Signed-off-by: dependabot-preview[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 882a433da..55434bfb9 100644 --- a/pom.xml +++ b/pom.xml @@ -204,7 +204,7 @@ net.md-5 bungeecord-api - 1.16-R0.3 + 1.16-R0.4 provided From ca00da712b0999c8fa1d659da1a1100b1598790c Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Tue, 19 Jan 2021 21:05:46 +0300 Subject: [PATCH 396/508] ci: fix incorrect parameter name of ghaction-import-gpg --- .github/workflows/deploy-snapshot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 53e65eae5..bfc62c7b3 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -33,7 +33,7 @@ jobs: uses: crazy-max/ghaction-import-gpg@v3.0.2 with: gpg-private-key: ${{ GPG_PRIVATE_KEY }} - gpg-passphrase: ${{ GPG_PASSPHRASE }} + passphrase: ${{ GPG_PASSPHRASE }} # TODO check version - name: Deploy snapshot From ffdc12310a09ea9ef475189d6729851fb04659f6 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Tue, 19 Jan 2021 21:10:28 +0300 Subject: [PATCH 397/508] ci: fix variable names in deploy-snapshot.yml --- .github/workflows/deploy-snapshot.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index bfc62c7b3..af1e0abc4 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -32,12 +32,12 @@ jobs: id: import_gpg uses: crazy-max/ghaction-import-gpg@v3.0.2 with: - gpg-private-key: ${{ GPG_PRIVATE_KEY }} - passphrase: ${{ GPG_PASSPHRASE }} + gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.GPG_PASSPHRASE }} # TODO check version - name: Deploy snapshot run: ./.github-actions/scripts/maven_deploy.sh env: - CODE_SIGNING_GPG_PRIVATE_KEY: ${{ GPG_PRIVATE_KEY }} - CODE_SIGNING_GPG_PASSPHRASE: ${{ GPG_PASSPHRASE }} + CODE_SIGNING_GPG_PRIVATE_KEY: ${{ steps.import_gpg.outputs.keyid }} + CODE_SIGNING_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} From b50bb4338b2777529f52d6e798205bea058c001a Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Tue, 19 Jan 2021 22:16:24 +0300 Subject: [PATCH 398/508] ci: try command-based GPG-subkey importing --- .../maven/sonatype-ossrh-settings.xml | 4 ++-- .github/workflows/deploy-snapshot.yml | 16 +++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/.github-actions/maven/sonatype-ossrh-settings.xml b/.github-actions/maven/sonatype-ossrh-settings.xml index 2e98426b6..680538615 100644 --- a/.github-actions/maven/sonatype-ossrh-settings.xml +++ b/.github-actions/maven/sonatype-ossrh-settings.xml @@ -13,8 +13,8 @@ import-env-code-signing-credentials - gpg2 - ${env.CODE_SIGNING_GPG_KEY_NAME} + gpg + ${env.CODE_SIGNING_GPG_KEY_ID} ${env.CODE_SIGNING_GPG_KEY_PASSPHRASE} diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index af1e0abc4..39158f418 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -2,7 +2,7 @@ name: Deploy on: push: - branches: [ development ] + branches: [ development, github-action-gpg-fix ] # FIXME remove test branch name jobs: @@ -29,15 +29,13 @@ jobs: run: ./build-submodules.sh - name: Import GPG signing key - id: import_gpg - uses: crazy-max/ghaction-import-gpg@v3.0.2 - with: - gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} - passphrase: ${{ secrets.GPG_PASSPHRASE }} + run: | + echo -e "${{ secrets.CODE_SIGNING_GPG_PRIVATE_KEY }}" | gpg --batch --import + gpg --list-secret-keys --keyid-format LONG # TODO check version - name: Deploy snapshot - run: ./.github-actions/scripts/maven_deploy.sh env: - CODE_SIGNING_GPG_PRIVATE_KEY: ${{ steps.import_gpg.outputs.keyid }} - CODE_SIGNING_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} + CODE_SIGNING_GPG_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_PASSPHRASE }} + run: ./.github-actions/scripts/maven_deploy.sh From e5c7e35782cb30c5e2f67db6e64c5ecba370af52 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Tue, 19 Jan 2021 22:52:35 +0300 Subject: [PATCH 399/508] ci: don't specify GPG options --- pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pom.xml b/pom.xml index 6ac75f828..67e756349 100644 --- a/pom.xml +++ b/pom.xml @@ -361,12 +361,6 @@ sign - - - --pinentry-mode - loopback - - From 3ce919eadb673480edbd2892474d79789679adbd Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Tue, 19 Jan 2021 23:03:01 +0300 Subject: [PATCH 400/508] revert: specify GPG options again Refs: e5c7e357 --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 67e756349..6ac75f828 100644 --- a/pom.xml +++ b/pom.xml @@ -361,6 +361,12 @@ sign + + + --pinentry-mode + loopback + + From 689ee210633f30a0508fe7ef595194d52d8e32a2 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Tue, 19 Jan 2021 23:21:11 +0300 Subject: [PATCH 401/508] ci: use simpler GPG configuration --- .github-actions/maven/github-pacakage-registry-settings.xml | 6 +++--- .github-actions/scripts/import_code_signing_keys.sh | 4 ++++ .github/workflows/deploy-snapshot.yml | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100755 .github-actions/scripts/import_code_signing_keys.sh diff --git a/.github-actions/maven/github-pacakage-registry-settings.xml b/.github-actions/maven/github-pacakage-registry-settings.xml index f4e2a4ffb..593660a0e 100644 --- a/.github-actions/maven/github-pacakage-registry-settings.xml +++ b/.github-actions/maven/github-pacakage-registry-settings.xml @@ -13,9 +13,9 @@ import-env-code-signing-credentials - gpg2 - ${env.CODE_SIGNING_GPG_PRIVATE_KEY} - ${env.CODE_SIGNING_GPG_PASSPHRASE} + gpg + ${env.CODE_SIGNING_GPG_KEY_ID} + ${env.CODE_SIGNING_GPG_KEY_PASSPHRASE} diff --git a/.github-actions/scripts/import_code_signing_keys.sh b/.github-actions/scripts/import_code_signing_keys.sh new file mode 100755 index 000000000..529c11e23 --- /dev/null +++ b/.github-actions/scripts/import_code_signing_keys.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +# This should be called from repository root + diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 39158f418..ecbb462cc 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -37,5 +37,5 @@ jobs: - name: Deploy snapshot env: CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} - CODE_SIGNING_GPG_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_PASSPHRASE }} + CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} run: ./.github-actions/scripts/maven_deploy.sh From a5b664c5be27c2e970423e9dec3eb5ca1803b84d Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 00:04:34 +0300 Subject: [PATCH 402/508] ci: pass deployment credentials to environment variables --- .github/workflows/deploy-snapshot.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index ecbb462cc..575581709 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -1,4 +1,4 @@ -name: Deploy +name: Deploy snapshot on: push: @@ -38,4 +38,8 @@ jobs: env: CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} + GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft + GITHUB_PACKAGE_REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONATYPE_OSSRH_DEPLOYER: ${{ secrets.SONATYPE_OSSRH_DEPLOYER }} + SONATYPE_OSSRH_TOKEN: ${{ secrets.SONATYPE_OSSRH_TOKEN }} run: ./.github-actions/scripts/maven_deploy.sh From 4333b4c194cb60e460be053ba31d8e8b1b331938 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 00:10:04 +0300 Subject: [PATCH 403/508] ci: add snapshot deployment condition --- .github/workflows/deploy-snapshot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 575581709..c763c704c 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -33,8 +33,8 @@ jobs: echo -e "${{ secrets.CODE_SIGNING_GPG_PRIVATE_KEY }}" | gpg --batch --import gpg --list-secret-keys --keyid-format LONG - # TODO check version - name: Deploy snapshot + if: '"$(./.github-actions/scripts/get_version.sh)" == *-SNAPSHOT' env: CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} From 068478619e696faf2180dcc06f8791ab0c5c4678 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 00:20:30 +0300 Subject: [PATCH 404/508] ci: add version-based deployment conditions to deployment script --- .github-actions/scripts/maven_deploy.sh | 14 +++++++++++++- .github/workflows/deploy-snapshot.yml | 1 - 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.github-actions/scripts/maven_deploy.sh b/.github-actions/scripts/maven_deploy.sh index b4b2ee312..9c1c7f3b2 100755 --- a/.github-actions/scripts/maven_deploy.sh +++ b/.github-actions/scripts/maven_deploy.sh @@ -2,10 +2,22 @@ # This should be called from repository root +if [[ "$(./.github-actions/scripts/get_version.sh)" == *-SNAPSHOT ]]; then + if [[ $1 == release ]]; then + >&2 echo "Cannot deploy in release mode when version is snapshot" + exit 1; + fi +else + if [[ $1 != release ]]; then + >&2 echo "Cannot deploy in non-release mode when version is not snapshot" + exit 1; + fi; +fi + + # Valid deployment modes: # - sonatype-ossrh # - github-package-registry - function deploy() { if [[ $1 != sonatype-ossrh && $1 != github-package-registry ]]; then echo "Unknown deployment target: $1" diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index c763c704c..163e2c27c 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -34,7 +34,6 @@ jobs: gpg --list-secret-keys --keyid-format LONG - name: Deploy snapshot - if: '"$(./.github-actions/scripts/get_version.sh)" == *-SNAPSHOT' env: CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} From 0ae67f694aa279ba6792faace014e6ae3d775548 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 00:27:45 +0300 Subject: [PATCH 405/508] ci: fully configure deployment --- .github/workflows/deploy-release.yml | 43 +++++++++++++++++++++++++++ .github/workflows/deploy-snapshot.yml | 3 +- 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/deploy-release.yml diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml new file mode 100644 index 000000000..80bbada5d --- /dev/null +++ b/.github/workflows/deploy-release.yml @@ -0,0 +1,43 @@ +name: Deploy release + +on: + push: + tags: [ v* ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + + - name: Cache Maven local repository + uses: actions/cache@v2.1.2 + with: + path: ~/.m2/repository + key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-maven- + + # This is a temporary workaround until stable PacketWrapper Legacy support is not merged into upstream + - name: Build submodules + run: ./build-submodules.sh + + - name: Import GPG signing key + run: | + echo -e "${{ secrets.CODE_SIGNING_GPG_PRIVATE_KEY }}" | gpg --batch --import + gpg --list-secret-keys --keyid-format LONG + + - name: Deploy snapshot + env: + CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} + CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} + GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft + GITHUB_PACKAGE_REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONATYPE_OSSRH_DEPLOYER: ${{ secrets.SONATYPE_OSSRH_DEPLOYER }} + SONATYPE_OSSRH_TOKEN: ${{ secrets.SONATYPE_OSSRH_TOKEN }} + run: ./.github-actions/scripts/maven_deploy.sh release diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 163e2c27c..c4beac1c7 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -2,8 +2,7 @@ name: Deploy snapshot on: push: - branches: [ development, github-action-gpg-fix ] # FIXME remove test branch name - + branches: [ development ] jobs: build: From ee5b5a2a27efb38ca67f341313754a4af87f5673 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Jan 2021 21:33:46 +0000 Subject: [PATCH 406/508] build(deps): bump junit-platform-surefire-provider from 1.2.0 to 1.3.2 Bumps [junit-platform-surefire-provider](https://github.com/junit-team/junit5) from 1.2.0 to 1.3.2. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6ac75f828..5f0e88d61 100644 --- a/pom.xml +++ b/pom.xml @@ -297,7 +297,7 @@ org.junit.platform junit-platform-surefire-provider - 1.2.0 + 1.3.2 org.mockito From 61f298af330c385cf11cb8f48fbc28980f3d8d77 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 00:34:25 +0300 Subject: [PATCH 407/508] docs: fix basic javadoc issues --- .../commons/chunk/ChunkLocalLocation.java | 2 +- .../minecraft/commons/chunk/ChunkUtil.java | 44 +++++++++---------- .../commons/mapimage/DefaultMapImage.java | 4 +- .../mapimage/MapImageMinecraftColors.java | 2 +- .../minecraft/commons/mapimage/MapImages.java | 14 +++--- .../commons/math/dimensional/Figure3D.java | 6 +-- .../nms/metadata/DataWatcherFactory.java | 8 ++-- .../minecraft/commons/util/BitwiseUtil.java | 14 +++--- .../commons/util/SystemPropertyUtil.java | 16 +++---- .../commons/util/chat/ChatComponentUtil.java | 2 +- .../util/function/UncheckedSupplier.java | 26 ----------- .../commons/util/image/ColorUtil.java | 32 +++++++------- .../commons/util/primitive/IntWrapper.java | 4 +- .../commons/util/shutdown/ShutdownHooks.java | 6 +-- .../minecraft/commons/util/time/Time.java | 2 +- 15 files changed, 78 insertions(+), 104 deletions(-) delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedSupplier.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java index 0adc73794..226fe6e1d 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkLocalLocation.java @@ -18,7 +18,7 @@ public final class ChunkLocalLocation { Chunk chunk; /** - * Chunk-local location in a {@link short} representation + * Chunk-local location in a {@code short} representation */ short location; } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java index 2007f8467..760243f82 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java @@ -14,6 +14,7 @@ *

* There are general conventions for type=methods: * + *

*
{@code Foo [bar]foo(Bar...)}
*
return the specified bar value's foocomponent (other data is lost)
* @@ -22,12 +23,12 @@ * *
{@code Foo [Bar]Foo(Bar...)}
*
performs the action specified on bar using foo
+ *
* - * @apiNote chunks are (by default) returned as a single {@link long} as the limit of chunk at non-Y-axis is 3750000 + * @apiNote chunks are (by default) returned as a single {@code long} as the limit of chunk at non-Y-axis is 3750000 * where 32 most significant bits stand for X-coordinate and 32 least significant bits stand for Z-coordinate - * @apiNote chunks-local locations are (by default) returned as a single {@link short} + * @apiNote chunks-local locations are (by default) returned as a single {@code short} * whose bits are ordered as 4 bits for X-coordinate, 8 bits for Y-coordinate, 4 bits for Z-coordinate - * * @see General info about chinks */ @UtilityClass @@ -43,7 +44,6 @@ public class ChunkUtil { * @param x chunk-local X-coordinate which should normally be between 0 and 15 * @param y chunk-local Y-coordinate which should normally be between 0 and 255 * @param z chunk-local Z-coordinate which should normally be between 0 and 15 - * * @throws IllegalArgumentException if any of coordinates is out of allowed range */ public void rangeCheckChunkLocal(final int x, final int y, final int z) { @@ -87,11 +87,11 @@ public void rangeCheckChunkLocalZ(final int z) { /////////////////////////////////////////////////////////////////////////// /** - * Returns a single {@link long} value storing chunk data for X- and Z-axises. + * Returns a single {@code long} value storing chunk data for X- and Z-axises. * * @param x X coordinate of a chunk * @param z Z coordinate of a chunk - * @return chunk treated as {@link long} + * @return chunk treated as {@code long} */ public long toChunkLong(final int x, final int z) { return ((long) x << 32) | ((long) z & 0xFFFFFFFFL); @@ -100,7 +100,7 @@ public long toChunkLong(final int x, final int z) { /** * Returns the X coordinate value from a long-serialized chunk * - * @param longChunk chunk data treated as {@link long} + * @param longChunk chunk data treated as {@code long} * @return X coordinate of a chunk */ public int chunkX(final long longChunk) { @@ -122,17 +122,17 @@ public int chunkZ(final long longChunk) { * * @param x X coordinate of the location * @param z Y coordinate of the location - * @return chunk location treated as {@link long} + * @return chunk location treated as {@code long} */ public long chunkAt(final long x, final long z) { return toChunkLong((int) (x >> 4), (int) (z >> 4)); } /** - * Gets the chunk in the world specified from a {@link long} chunk representation. + * Gets the chunk in the world specified from a {@code long} chunk representation. * * @param world world to get chunk from - * @param chunk chunk treated as {@link long} + * @param chunk chunk treated as {@code long} * @return specified chunk of the world */ public Chunk getChunk(final @NonNull World world, final long chunk) { @@ -144,12 +144,12 @@ public Chunk getChunk(final @NonNull World world, final long chunk) { /////////////////////////////////////////////////////////////////////////// /** - * Converts the specified x, y and z chunk-local coordinates to a {@link short}-representation + * Converts the specified x, y and z chunk-local coordinates to a {@code short}-representation * * @param chunkLocalX X-coordinate inside the chunk between 0 and 15 * @param chunkLocalY Y-coordinate inside the chunk between 0 and 255 * @param chunkLocalZ Z-coordinate inside the chunk between 0 and 15 - * @return {@link short}-representation of specified chunk-local coordinated + * @return {@code short}-representation of specified chunk-local coordinated * * @throws IllegalArgumentException if {@code x} is not in range [0; 15] * @throws IllegalArgumentException if {@code z} is not in range [0; 15] @@ -162,9 +162,9 @@ public short toChunkLocalLocationShort(final int chunkLocalX, final int chunkLoc } /** - * Gets the X-coordinate from a {@link short}-representation of a chunk-local location. + * Gets the X-coordinate from a {@code short}-representation of a chunk-local location. * - * @param location {@link short}-representation of a chunk-local location + * @param location {@code short}-representation of a chunk-local location * @return X-coordinate of a chunk local location */ public int chunkLocalLocationX(final short location) { @@ -172,9 +172,9 @@ public int chunkLocalLocationX(final short location) { } /** - * Gets the Y-coordinate from a {@link short}-representation of a chunk-local location. + * Gets the Y-coordinate from a {@code short}-representation of a chunk-local location. * - * @param location {@link short}-representation of a chunk-local location + * @param location {@code short}-representation of a chunk-local location * @return Y-coordinate of a chunk local location */ public int chunkLocalLocationY(final short location) { @@ -182,9 +182,9 @@ public int chunkLocalLocationY(final short location) { } /** - * Gets the Z-coordinate from a {@link short}-representation of a chunk-local location. + * Gets the Z-coordinate from a {@code short}-representation of a chunk-local location. * - * @param location {@link short}-representation of a chunk-local location + * @param location {@code short}-representation of a chunk-local location * @return Z-coordinate of a chunk local location */ public int chunkLocalLocationZ(final short location) { @@ -227,7 +227,7 @@ public int chunkLocalZ(final int z) { * @param x X-coordinate of the location whose chunk-local location should be got * @param y Y-coordinate of the location whose chunk-local location should be got * @param z Z-coordinate of the location whose chunk-local location should be got - * @return {@link short}-representation of location's chunk-local location + * @return {@code short}-representation of location's chunk-local location * * @see #chunkLocalLocation(Location) is an allias for {@link Location} argument */ @@ -239,7 +239,7 @@ public short chunkLocalLocation(final int x, final int y, final int z) { * Gets the specified location's chunk-local location. * * @param location location whose chunk-local location should be got - * @return {@link short}-representation of location's chunk-local location + * @return {@code short}-representation of location's chunk-local location * * @see #toChunkLocalLocationShort(int, int, int) is called with location's coordinates */ @@ -248,10 +248,10 @@ public short chunkLocalLocation(final @NonNull Location location) { } /** - * Gets the block in a chunk from its chunk-local location in {@link short}-representation + * Gets the block in a chunk from its chunk-local location in {@code short}-representation * * @param chunk chunk whose block to get - * @param location {@link short}-representation of a chunk-local location + * @param location {@code short}-representation of a chunk-local location * @return block from the chunk of specified chunk-local location */ public Block getChunkBlock(final Chunk chunk, final short location) { diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index 75b646a21..8587db5ac 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -25,7 +25,7 @@ public class DefaultMapImage implements MapImage { /** - * {@link byte}-array of pixels of an image by X, Y indexes. + * {@code byte}-array of pixels of an image by X, Y indexes. * A pixel can be accessed as {@code pixels[x + y * getWidth()]} */ byte[] pixels; @@ -158,7 +158,7 @@ public MapImage.Drawer fill(final byte color) { } /** - * Buffered drawer based on 2-dimensional {@link byte}-array of changed pixels and {@link int}-bounds. + * Buffered drawer based on 2-dimensional {@code byte}-array of changed pixels and {@code int}-bounds. */ @Getter @ToString diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java index bdd44fb4d..2e60c977d 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImageMinecraftColors.java @@ -17,7 +17,7 @@ public class MapImageMinecraftColors { /** - * All available colors available in Minecraft associated with their {@link byte}-codes + * All available colors available in Minecraft associated with their {@code byte}-codes * @see Taken from Minecraft Wiki */ public final Int2ByteMap MINECRAFT_RGB_COLOR_CODES; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java index 0ccf039be..4353d350a 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java @@ -122,12 +122,12 @@ protected static byte[][] normalizePixels(final int[][] pixels) { } /** - * Gets the 2-dimensional {@link byte}-array (the 1-st index is columns, the 2-nd index is rows) - * of size {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} of RGB-{@link int} colors. + * Gets the 2-dimensional {@code byte}-array (the 1-st index is columns, the 2-nd index is rows) + * of size {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} of RGB-{@code int} colors. * * @param image image whose pixels to get * @param resize whether the image should be resized or cut to fit map image dimensions - * @return 2-dimensional array of RGB-{@link int} colors. + * @return 2-dimensional array of RGB-{@code int} colors. */ public int[][] getNonNormalizedMapImagePixels2D(@NonNull BufferedImage image, final boolean resize) { image = fitImage(image, resize); @@ -150,11 +150,11 @@ public int[][] getNonNormalizedMapImagePixels2D(@NonNull BufferedImage image, fi } /** - * Gets the {@link byte}-array of RGB-{@link int} colors. + * Gets the {@code byte}-array of RGB-{@code int} colors. * * @param image image whose pixels to get * @param resize whether the image should be resized or cut to fit map image dimensions - * @return array of RGB-{@link int} colors. + * @return array of RGB-{@code int} colors. */ public int[] getNonNormalizedMapImagePixels(@NonNull BufferedImage image, final boolean resize) { image = fitImage(image, resize); @@ -179,7 +179,7 @@ public int[] getNonNormalizedMapImagePixels(@NonNull BufferedImage image, final } /** - * Gets the 2-dimensional {@link byte}-array (the 1-st index is columns, the 2-nd index is rows) + * Gets the 2-dimensional {@code byte}-array (the 1-st index is columns, the 2-nd index is rows) * of size {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} of valid map color ids. * * @param image image whose pixels to get @@ -191,7 +191,7 @@ public byte[][] getMapImagePixels2D(final @NonNull BufferedImage image, final bo } /** - * Gets the {@link byte}-array of size {@link MapImage#PIXELS_COUNT} of valid map color ids. + * Gets the {@code byte}-array of size {@link MapImage#PIXELS_COUNT} of valid map color ids. * * @param image image whose pixels to get * @param resize whether the image should be resized or cut to fit map image dimensions diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java index df2aeb408..e813eb39c 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/math/dimensional/Figure3D.java @@ -164,7 +164,7 @@ public boolean contains(final @NonNull Location point) { * @param y Y coordinate of a point to check * @param z Z coordinate of a point to check * - * @return {@code true} if the point belongs to this figure and {@link false} otherwise + * @return {@code true} if the point belongs to this figure and {@code false} otherwise */ boolean contains(double x, double y, double z); @@ -173,7 +173,7 @@ public boolean contains(final @NonNull Location point) { * * @param point point to check * - * @return {@code true} if the point belongs to this figure and {@link false} otherwise + * @return {@code true} if the point belongs to this figure and {@code false} otherwise */ default boolean contains(final @NonNull Vector point) { return contains(point.getX(), point.getY(), point.getZ()); @@ -184,7 +184,7 @@ default boolean contains(final @NonNull Vector point) { * * @param point point to check * - * @return {@code true} if the point belongs to this figure and {@link false} otherwise + * @return {@code true} if the point belongs to this figure and {@code false} otherwise */ default boolean contains(final @NonNull Location point) { return contains(point.getX(), point.getY(), point.getZ()); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java index 671416b9c..fe70ae3c4 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java @@ -145,7 +145,7 @@ default WrappedWatchableObject createWatchable(final int id, final Vector3F valu WrappedWatchableObject createWatchable(int id, BlockPosition value); /** - * Creates watchable object for {@link Optional} value at index specified. + * Creates watchable object for {@link Optional} value at index specified. * * @param id id of a value * @param value value @@ -174,7 +174,7 @@ default WrappedWatchableObject createWatchable(final int id, final Direction val } /** - * Creates watchable object for {@link Optional} value at index specified. + * Creates watchable object for {@link Optional} value at index specified. * * @param id id of a value * @param value value @@ -360,7 +360,7 @@ default DataWatcherModifier set(final int id, final Vector3F value) { DataWatcherModifier set(int id, BlockPosition value); /** - * Sets DataWatcher's modifier to specified {@link Optional} value at specified index. + * Sets DataWatcher's modifier to specified {@link Optional} value at specified index. * * @param id id of a value * @param value value to set at id @@ -398,7 +398,7 @@ default DataWatcherModifier set(final int id, final Direction value) { DataWatcherModifier setNBTTagCompound(int id, Object value); /** - * Sets DataWatcher's modifier to specified {@link Optional} value at specified index. + * Sets DataWatcher's modifier to specified {@link Optional} value at specified index. * * @param id id of a value * @param value value to set at id diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java index b934d754b..0dcabb13e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/BitwiseUtil.java @@ -10,23 +10,23 @@ public class BitwiseUtil { /** - * Number of bits in a {@link byte} + * Number of bits in a {@code byte} */ private static final int BYTE_BITS = 8, /** - * Number of bits in a {@link short} + * Number of bits in a {@code short} */ SHORT_BITS = 16, /** - * Number of bits in a {@link int} + * Number of bits in a {@code int} */ INT_BITS = 32, /** - * Number of bits in a {@link long} + * Number of bits in a {@code long} */ LONG_BITS = 64, /** - * Number of bits in a {@link char} + * Number of bits in a {@code char} */ CHAR_BITS = 16; @@ -175,7 +175,7 @@ public char implicate(char num1, final char num2) { } /** - * Converts the unsigned {@link int} to a 8-bit ({@link byte}) representation. + * Converts the unsigned {@code int} to a 8-bit ({@code byte}) representation. * * @param unsignedInt integer whose least significant 8 bits are to be stored in a byte * @return unsigned integer's least significant 8 bits in a single byte @@ -185,7 +185,7 @@ public byte unsignedIntToByte(final int unsignedInt) { } /** - * Converts the 8-bit ({@link byte}) value to an unsigned int representation. + * Converts the 8-bit ({@code byte}) value to an unsigned int representation. * * @param byteValue byte value whose bits will be used as the trailing bits of the resulting integer * @return an integer value consisting of 24 foremost 0s and 8 bits of the specified byte diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java index 8aed7cafe..bdb613468 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/SystemPropertyUtil.java @@ -47,7 +47,7 @@ public T getSystemProperty(final @NonNull String propertyName, } /** - * Gets the system property of type {@link boolean} by the name specified + * Gets the system property of type {@code boolean} by the name specified * and using the default value specified if the property is unset. * * @param propertyName name of the property @@ -63,7 +63,7 @@ public boolean getSystemPropertyBoolean(final @NonNull String propertyName, } /** - * Gets the system property of type {@link boolean} by the name specified + * Gets the system property of type {@code boolean} by the name specified * and using the default value specified if the property is unset. * * @param propertyName name of the property @@ -76,7 +76,7 @@ public boolean getSystemPropertyBoolean(final @NonNull String propertyName, fina } /** - * Gets the system property of type {@link int} by the name specified + * Gets the system property of type {@code int} by the name specified * and using the default value specified if the property is unset or is not a valid number. * * @param propertyName name of the property @@ -97,7 +97,7 @@ public int getSystemPropertyInt(final @NonNull String propertyName, } /** - * Gets the system property of type {@link int} by the name specified + * Gets the system property of type {@code int} by the name specified * and using the default value specified if the property is unset or is not a valid number. * * @param propertyName name of the property @@ -110,7 +110,7 @@ public int getSystemPropertyInt(final @NonNull String propertyName, final int de } /** - * Gets the system property of type {@link long} by the name specified + * Gets the system property of type {@code long} by the name specified * and using the default value specified if the property is unset or is not a valid number. * * @param propertyName name of the property @@ -131,7 +131,7 @@ public long getSystemPropertyLong(final @NonNull String propertyName, } /** - * Gets the system property of type {@link long} by the name specified + * Gets the system property of type {@code long} by the name specified * and using the default value specified if the property is unset or is not a valid number. * * @param propertyName name of the property @@ -144,7 +144,7 @@ public long getSystemPropertyLong(final @NonNull String propertyName, final long } /** - * Gets the system property of type {@link double} by the name specified + * Gets the system property of type {@code double} by the name specified * and using the default value specified if the property is unset or is not a valid number. * * @param propertyName name of the property @@ -165,7 +165,7 @@ public double getSystemPropertyDouble(final @NonNull String propertyName, } /** - * Gets the system property of type {@link double} by the name specified + * Gets the system property of type {@code double} by the name specified * and using the default value specified if the property is unset or is not a valid number. * * @param propertyName name of the property diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java index 115d04c0d..38cd7b213 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/chat/ChatComponentUtil.java @@ -26,7 +26,7 @@ public static WrappedChatComponentGsonSerializer wrappedChatComponentGsonSeriali } /** - * {@link JsonSerializer} and {@link JsonDeserializer} + * {@link JsonSerializer} and {@link JsonDeserializer} * for use with {@link GsonBuilder#registerTypeAdapter(Type, Object)}. */ @NoArgsConstructor(access = AccessLevel.PROTECTED) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedSupplier.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedSupplier.java deleted file mode 100644 index 58da51bd2..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedSupplier.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.function; - -import lombok.SneakyThrows; - -import java.util.function.Supplier; - -/** - * Supplier which allows having checked exceptions in its method body. - * - * @param {@inheritDoc} - */ -public interface UncheckedSupplier extends Supplier { - - /** - * Gets a result allowing any checked exceptions in method body. - * - * @return a result - */ - T supply() throws Throwable; - - @Override - @SneakyThrows - default T get() { - return supply(); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java index 787423e52..ee2a66ebf 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/image/ColorUtil.java @@ -7,30 +7,30 @@ import static java.lang.Math.min; /** - * Utilities related to standard {@link int}-ARGB representation of colors. + * Utilities related to standard {@code int}-ARGB representation of colors. */ @UtilityClass public class ColorUtil { /** - * Length of bitwise {@link int} shift for accessing alpha channel value of standard {@link int}-ARGB. + * Length of bitwise {@code int} shift for accessing alpha channel value of standard {@code int}-ARGB. */ public static final byte ALPHA_CHANNEL = 24, /** - * Length of bitwise {@link int} shift for accessing red color channel value of standard {@link int}-ARGB. + * Length of bitwise {@code int} shift for accessing red color channel value of standard {@code int}-ARGB. */ RED_CHANNEL = 16, /** - * Length of bitwise {@link int} shift for accessing green color channel value of standard {@link int}-ARGB. + * Length of bitwise {@code int} shift for accessing green color channel value of standard {@code int}-ARGB. */ GREEN_CHANNEL = 8, /** - * Length of bitwise {@link int} shift for accessing blue color channel value of standard {@link int}-ARGB. + * Length of bitwise {@code int} shift for accessing blue color channel value of standard {@code int}-ARGB. */ BLUE_CHANNEL = 0; /** - * Gets the alpha channel value for the specified ARGB {@link int}. + * Gets the alpha channel value for the specified ARGB {@code int}. * * @param rgb RGB encoded as a single integer * @return alpha channel value @@ -41,7 +41,7 @@ public static int alpha(final int rgb) { } /** - * Gets the red color channel value for the specified ARGB {@link int}. + * Gets the red color channel value for the specified ARGB {@code int}. * * @param rgb RGB encoded as a single integer * @return red color channel value @@ -52,7 +52,7 @@ public static int red(final int rgb) { } /** - * Gets the green color channel value for the specified ARGB {@link int}. + * Gets the green color channel value for the specified ARGB {@code int}. * * @param rgb RGB encoded as a single integer * @return green color channel value @@ -63,7 +63,7 @@ public static int green(final int rgb) { } /** - * Gets the blue color channel value for the specified ARGB {@link int}. + * Gets the blue color channel value for the specified ARGB {@code int}. * * @param rgb RGB encoded as a single integer * @return blue color channel value @@ -74,13 +74,13 @@ public static int blue(final int rgb) { } /** - * Transforms 4 ARGB channels to a single {@link int}. + * Transforms 4 ARGB channels to a single {@code int}. * * @param alpha alpha color channel (between {@code 0} and {@code 255}) * @param red red color channel (between {@code 0} and {@code 255}) * @param green green color channel (between {@code 0} and {@code 255}) * @param blue blue color channel (between {@code 0} and {@code 255}) - * @return color as a single RGB {@link int} + * @return color as a single RGB {@code int} */ @Contract(pure = true) public static int toArgb(final int alpha, final int red, final int green, final int blue) { @@ -88,12 +88,12 @@ public static int toArgb(final int alpha, final int red, final int green, final } /** - * Transforms 3 color channels channels to a single ARGB {@link int} with no transparency. + * Transforms 3 color channels channels to a single ARGB {@code int} with no transparency. * * @param red red color channel (between {@code 0} and {@code 255}) * @param green green color channel (between {@code 0} and {@code 255}) * @param blue blue color channel (between {@code 0} and {@code 255}) - * @return color as a single RGB {@link int} + * @return color as a single RGB {@code int} */ @Contract(pure = true) public static int toArgb(final int red, final int green, final int blue) { @@ -110,9 +110,9 @@ public int blendColorsNoAlpha(final int backgroundColor, final int foregroundCol /** * Blends two ARGB colors into one respecting alphas. - * @param backgroundColor background color as a standard {@link int}-ARGB - * @param foregroundColor foreground color as a standard {@link int}-ARGB - * @return standard {@link int}-ARGB color being the result of color-bleeding + * @param backgroundColor background color as a standard {@code int}-ARGB + * @param foregroundColor foreground color as a standard {@code int}-ARGB + * @return standard {@code int}-ARGB color being the result of color-bleeding */ @Contract(pure = true) public int blendColors(final int backgroundColor, final int foregroundColor) { diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java index 6ed05e3a2..531dc651b 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java @@ -8,7 +8,7 @@ import java.util.function.IntUnaryOperator; /** - * Wrapper for an {@link int} focused at providing polymorphism to its operations concurrency. + * Wrapper for an {@code int} focused at providing polymorphism to its operations concurrency. */ public abstract class IntWrapper extends Number { @@ -143,7 +143,7 @@ public static IntWrapper createAtomic() { } /** - * {@link IntWrapper} implementation based on {@link int}. + * {@link IntWrapper} implementation based on {@code int}. */ @Data @NoArgsConstructor diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index 287e1bbea..f589e40dc 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -81,7 +81,7 @@ public interface ShutdownHooks extends Shutdownable { /** * Retrieves whether or not {@link #shutdown()} was called. * - * @return {@link true} if this was shut down and {@link false} otherwise + * @return {@cpde true} if this was shut down and {@code false} otherwise */ boolean isShutDown(); @@ -153,7 +153,7 @@ protected void checkState() { } @Override - @NonNull public ShutdownHooks add(final @NonNull Supplier hookSupplier) { + @NonNull public ShutdownHooks add(final @NonNull Supplier hookSupplier) { checkState(); shutdownHooks.add(hookSupplier.get()); @@ -255,7 +255,7 @@ protected void checkState() { } @Override - @NonNull public ShutdownHooks add(final @NonNull Supplier hookSupplier) { + @NonNull public ShutdownHooks add(final @NonNull Supplier hookSupplier) { checkState(); shutdownHooks.add(hookSupplier.get()); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java index 1bc5a70e8..0409862b0 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/time/Time.java @@ -11,7 +11,7 @@ import java.util.concurrent.TimeUnit; /** - * A simple value consisting of {@link long} duration and its {@link TimeUnit} type. + * A simple value consisting of {@code long} duration and its {@link TimeUnit} type. */ @Value @Accessors(fluent = true) From b676947efb5a797f80c7d49e2c173d92b9f57025 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 01:03:18 +0300 Subject: [PATCH 408/508] chore: remove components which were adopted by padla --- .../minecraft/commons/async/AsyncRunner.java | 9 +- .../async/BukkitSchedulerAsyncRunner.java | 3 +- .../async/BungeeSchedulerAsyncRunner.java | 3 +- .../commons/event/FluentBukkitEvents.java | 23 +- .../commons/mapimage/DefaultMapImage.java | 8 +- .../minecraft/commons/mapimage/MapImage.java | 6 +- .../commons/mojang/MojangApiManager.java | 44 ++- .../misc/PacketWrapperPacketAssociations.java | 111 ++++-- .../util/function/UncheckedConsumer.java | 27 -- .../util/function/UncheckedFunction.java | 40 -- .../util/function/UncheckedRunnable.java | 15 - .../commons/util/primitive/IntWrapper.java | 353 ------------------ .../commons/util/shutdown/ShutdownHooks.java | 2 +- .../commons/nms/PacketWrapperUtilTest.java | 32 +- .../util/primitive/IntWrapperTest.java | 213 ----------- 15 files changed, 152 insertions(+), 737 deletions(-) delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java delete mode 100644 minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java index 43ff4f2f4..7b0200671 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/AsyncRunner.java @@ -1,8 +1,7 @@ package ru.progrm_jarvis.minecraft.commons.async; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedRunnable; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedSupplier; +import java.util.function.Consumer; +import java.util.function.Supplier; /** * An object capable of performing asynchronous operations. @@ -15,7 +14,7 @@ public interface AsyncRunner { * * @param operation operation to perform asynchronously */ - void runAsynchronously(final UncheckedRunnable operation); + void runAsynchronously(final Runnable operation); /** * Performs the specified operations asynchronously. @@ -24,7 +23,7 @@ public interface AsyncRunner { * @param callback callback to handle the resulting value of the operation * @param type of value returned by the operation */ - default void runAsynchronously(final UncheckedSupplier operation, final UncheckedConsumer callback) { + default void runAsynchronously(final Supplier operation, final Consumer callback) { runAsynchronously(() -> callback.accept(operation.get())); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java index 67466396f..91faa9ea5 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BukkitSchedulerAsyncRunner.java @@ -3,7 +3,6 @@ import lombok.*; import lombok.experimental.FieldDefaults; import org.bukkit.plugin.Plugin; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedRunnable; /** * Async runner based on {@link org.bukkit.scheduler.BukkitScheduler}. @@ -20,7 +19,7 @@ public class BukkitSchedulerAsyncRunner implements AsyncRunner { @NonNull Plugin plugin; @Override - public void runAsynchronously(final UncheckedRunnable operation) { + public void runAsynchronously(final Runnable operation) { plugin.getServer().getScheduler().runTaskAsynchronously(plugin, operation); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java index 42c0baf6b..eb8846c7d 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/async/BungeeSchedulerAsyncRunner.java @@ -4,7 +4,6 @@ import lombok.experimental.FieldDefaults; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedRunnable; /** * Async runner based on {@link net.md_5.bungee.api.scheduler.TaskScheduler}. @@ -21,7 +20,7 @@ public class BungeeSchedulerAsyncRunner implements AsyncRunner { @NonNull Plugin plugin; @Override - public void runAsynchronously(final UncheckedRunnable operation) { + public void runAsynchronously(final Runnable operation) { ProxyServer.getInstance().getScheduler().runAsync(plugin, operation); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java index 5c67abafe..246aad856 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/event/FluentBukkitEvents.java @@ -13,13 +13,13 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; import org.jetbrains.annotations.NotNull; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; import ru.progrm_jarvis.minecraft.commons.util.shutdown.Shutdownable; import java.util.Deque; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.function.Consumer; import static com.google.common.base.Preconditions.checkNotNull; @@ -99,7 +99,7 @@ private EventListenersGroup getListenersGroup() { * @param listener listener to use for event handling * @return unregister to use for event unregistration */ - public Shutdownable register(final @NonNull UncheckedConsumer listener) { + public Shutdownable register(final @NonNull Consumer listener) { val listenersGroup = getListenersGroup(); listenersGroup.addListener(listener); @@ -124,17 +124,18 @@ private static class EventListenersGroup implements Listener, E /** * Event listeners in this event listener group's dequeue */ - @Getter(AccessLevel.NONE) @NonNull Deque> eventListeners = new ConcurrentLinkedDeque<>(); + @Getter(AccessLevel.NONE) @NonNull Deque> eventListeners = new ConcurrentLinkedDeque<>(); /** * Adds the listener to the deque of handled listeners for the event. * * @param listener listener to add to handling dequeue */ - private void addListener(final @NonNull UncheckedConsumer listener) { + private void addListener(final @NonNull Consumer listener) { if (eventListeners.isEmpty()) { - PLUGIN_MANAGER - .registerEvent(configuration.type, this, configuration.priority, this, configuration.plugin); + PLUGIN_MANAGER.registerEvent( + configuration.getType(), this, configuration.getPriority(), this, configuration.getPlugin() + ); LISTENERS_GROUPS.putIfAbsent(configuration, this); } @@ -146,7 +147,7 @@ private void addListener(final @NonNull UncheckedConsumer listener) { * * @param listener listener to remove from handling dequeue */ - private void removeListener(final @NonNull UncheckedConsumer listener) { + private void removeListener(final @NonNull Consumer listener) { eventListeners.remove(listener); if (eventListeners.isEmpty()) { @@ -157,7 +158,7 @@ private void removeListener(final @NonNull UncheckedConsumer listener) { @Override public void execute(final @NotNull Listener listener, final Event event) { - if (configuration.type.isAssignableFrom(event.getClass())) { + if (configuration.getType().isAssignableFrom(event.getClass())) { @SuppressWarnings("unchecked") val castEvent = (E) event; for (val eventListener : eventListeners) eventListener.accept(castEvent); } @@ -166,8 +167,8 @@ public void execute(final @NotNull Listener listener, final Event event) { @Value private static class ListenerConfiguration { - final @NonNull Plugin plugin; - final @NonNull Class type; - final @NonNull EventPriority priority; + @NonNull Plugin plugin; + @NonNull Class type; + @NonNull EventPriority priority; } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index 8587db5ac..635162d2f 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -3,13 +3,13 @@ import lombok.*; import lombok.experimental.FieldDefaults; import ru.progrm_jarvis.javacommons.lazy.Lazy; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; import ru.progrm_jarvis.minecraft.commons.util.hack.PreSuperCheck; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.function.Consumer; import static com.google.common.base.Preconditions.checkArgument; import static ru.progrm_jarvis.minecraft.commons.mapimage.MapImage.blankPixels; @@ -45,7 +45,7 @@ public class DefaultMapImage implements MapImage { /** * All subscribers active. */ - Collection> updateSubscribers = new ArrayList<>(); + Collection> updateSubscribers = new ArrayList<>(); /** * Creates new map image from pixels. @@ -109,12 +109,12 @@ public boolean isSubscribable() { } @Override - public void subscribeOnUpdates(final UncheckedConsumer subscriber) { + public void subscribeOnUpdates(final Consumer subscriber) { updateSubscribers.add(subscriber); } @Override - public void unsubscribeFromUpdates(final UncheckedConsumer subscriber) { + public void unsubscribeFromUpdates(final Consumer subscriber) { updateSubscribers.remove(subscriber); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java index 6f9fb4c76..4b1ec35f0 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImage.java @@ -5,9 +5,9 @@ import lombok.experimental.FieldDefaults; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; import java.util.Arrays; +import java.util.function.Consumer; import static com.google.common.base.Preconditions.checkArgument; @@ -141,7 +141,7 @@ default boolean isSubscribable() { * @apiNote may not be called whenever there are no changes, but yet should normally handle empty deltas * @implSpec may be unavailable, check {@link #isSubscribable()} before usage */ - default void subscribeOnUpdates(final UncheckedConsumer subscriber) { + default void subscribeOnUpdates(final Consumer subscriber) { throw new UnsupportedOperationException(getClass() + " doesn't support update subscriptions"); } @@ -154,7 +154,7 @@ default void subscribeOnUpdates(final UncheckedConsumer subscriber) { * @implSpec should do nothing if the callback is not subscribed * @implSpec may be unavailable, check {@link #isSubscribable()} before usage */ - default void unsubscribeFromUpdates(final UncheckedConsumer subscriber) { + default void unsubscribeFromUpdates(final Consumer subscriber) { throw new UnsupportedOperationException(getClass() + " doesn't support update subscriptions"); } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java index de021b719..29c1787b4 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java @@ -19,9 +19,6 @@ import ru.progrm_jarvis.javacommons.lazy.Lazy; import ru.progrm_jarvis.minecraft.commons.annotation.AsyncExpected; import ru.progrm_jarvis.minecraft.commons.async.AsyncRunner; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedConsumer; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedSupplier; import java.io.BufferedReader; import java.io.IOException; @@ -30,6 +27,9 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; @ToString @EqualsAndHashCode @@ -60,7 +60,7 @@ public MojangApiManager(final Configuration configuration) { httpConnectionManager = Lazy.createThreadSafe(configuration.httpConnectionManager); { val httpClientFunction = configuration.httpClient; - this.httpClient = Lazy.createThreadSafe(() -> httpClientFunction.apply(httpConnectionManager.get())); + httpClient = Lazy.createThreadSafe(() -> httpClientFunction.apply(httpConnectionManager.get())); } asyncRunner = Lazy.createThreadSafe(configuration.asyncRunner); @@ -126,19 +126,25 @@ protected JsonElement httpGetJson(final @NonNull String uri, final @Nullable Map ); } + @AsyncExpected + @SneakyThrows(IOException.class) + public @NotNull UUID readUuidUnchecked(final @NonNull String userName) { + return readUuid(userName); + } + public void readUuid(final @NonNull String userName, - final @NonNull UncheckedConsumer callback) { - asyncRunner.get().runAsynchronously(() -> readUuid(userName), callback); + final @NonNull Consumer callback) { + asyncRunner.get().runAsynchronously(() -> readUuidUnchecked(userName), callback); } @SneakyThrows @AsyncExpected public @NotNull UUID getUuid(final @NonNull String userName) { return uuidsCache.get() - .get(userName.toLowerCase(), () -> readUuid(userName)); + .get(userName.toLowerCase(), () -> readUuidUnchecked(userName)); } - public void getUuid(final @NonNull String userName, final @NonNull UncheckedConsumer callback) { + public void getUuid(final @NonNull String userName, final @NonNull Consumer callback) { asyncRunner.get().runAsynchronously(() -> getUuid(userName), callback); } @@ -170,9 +176,15 @@ public void getUuid(final @NonNull String userName, final @NonNull UncheckedCons return profile; } + @AsyncExpected + @SneakyThrows(IOException.class) + public @NotNull GameProfile readProfileUnchecked(final @NonNull UUID uuid, final boolean signed) { + return readProfile(uuid, signed); + } + public void readProfile(final @NonNull UUID uuid, final boolean signed, - final @NonNull UncheckedConsumer callback) { - asyncRunner.get().runAsynchronously(() -> readProfile(uuid, signed), callback); + final @NonNull Consumer callback) { + asyncRunner.get().runAsynchronously(() -> readProfileUnchecked(uuid, signed), callback); } @SneakyThrows @@ -188,7 +200,7 @@ public void readProfile(final @NonNull UUID uuid, final boolean signed, } public void getProfile(final @NonNull UUID uuid, final boolean signed, - final @NonNull UncheckedConsumer callback) { + final @NonNull Consumer callback) { asyncRunner.get().runAsynchronously(() -> getProfile(uuid, signed), callback); } @@ -200,25 +212,25 @@ public void getProfile(final @NonNull UUID uuid, final boolean signed, @FieldDefaults(level = AccessLevel.PROTECTED) public static class Configuration { - @Default UncheckedSupplier httpConnectionManager + @Default Supplier httpConnectionManager = PoolingHttpClientConnectionManager::new; - @Default UncheckedFunction httpClient = manager -> HttpClients + @Default Function httpClient = manager -> HttpClients .custom() .setConnectionManager(manager) .build(); - @Default UncheckedSupplier> uuidsCache + @Default Supplier> uuidsCache = () -> CacheBuilder.newBuilder() .expireAfterWrite(5, TimeUnit.MINUTES) .build(); - @Default UncheckedSupplier> profilesCache + @Default Supplier> profilesCache = () -> CacheBuilder.newBuilder() .expireAfterWrite(5, TimeUnit.SECONDS) .build(); - @Default UncheckedSupplier asyncRunner = () -> { + @Default Supplier asyncRunner = () -> { throw new IllegalStateException("Async tasks are not available in this MojangApiManager"); }; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java index c781ddccf..5a473be2f 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketWrapperPacketAssociations.java @@ -12,11 +12,8 @@ import ru.progrm_jarvis.javacommons.collection.MapFiller; import ru.progrm_jarvis.javacommons.object.Pair; import ru.progrm_jarvis.minecraft.commons.util.SystemPropertyUtil; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Field; +import java.lang.invoke.*; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -25,6 +22,7 @@ import java.util.stream.Stream; import static java.lang.invoke.LambdaMetafactory.metafactory; +import static java.lang.invoke.MethodType.methodType; /** * Utility for linking ProtocolLib's packer-related objects. @@ -34,7 +32,8 @@ public class PacketWrapperPacketAssociations { private final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); - private final MethodType FUNCTION__METHOD_TYPE = MethodType.methodType(Function.class); + private final MethodType FUNCTION__METHOD_TYPE = methodType(Function.class); + private final MethodType VOID_PACKET_CONTAINER__METHOD_TYPE = methodType(void.class, PacketContainer.class); private final String FUNCTION__APPLY__METHOD_NAME = "apply"; @@ -62,20 +61,29 @@ private Stream> fieldPacketTypes(final @NonNull C final @NonNull PacketDirection direction) { return Arrays.stream(packetType.getDeclaredFields()) .filter(field -> PacketType.class.isAssignableFrom(field.getType())) - //.filter(field -> field.isAnnotationPresent(Deprecated.class)) - .map((UncheckedFunction>) field -> Pair.of( - (PacketType) field.get(null), - PacketTypeId.of(group, direction, upperCaseNameToUpperCamelCase(field.getName())) - )); + //.filter(field -> !field.isAnnotationPresent(Deprecated.class)) + .map(field -> { + final PacketType fieldValue; + try { + fieldValue = (PacketType) field.get(null); + } catch (final IllegalAccessException e) { + throw new IllegalStateException("Could not read value of field " + field); + } + return Pair.of( + fieldValue, + PacketTypeId.of(group, direction, upperCaseNameToUpperCamelCase(field.getName())) + ); + }); } private String upperCaseNameToUpperCamelCase(final @NonNull String name) { val split = StringUtils.split(name, '_'); val camelCase = new StringBuilder(); - for (val word : split) if (word.length() != 0) camelCase - .append(StringUtils.capitalize(StringUtils.lowerCase(word))); - else camelCase.append("_"); + for (val word : split) + if (word.length() != 0) camelCase + .append(StringUtils.capitalize(StringUtils.lowerCase(word))); + else camelCase.append("_"); return camelCase.toString(); } @@ -88,23 +96,55 @@ private String upperCaseNameToUpperCamelCase(final @NonNull String name) { */ public AbstractPacket createPacketWrapper(final @NonNull PacketContainer packet) { return PACKET_CREATORS - .computeIfAbsent(packet.getType(), - (UncheckedFunction>) packetType -> { - val packetWrapperClass = Class - .forName(PACKET_TYPES.get(packetType).toPacketWrapperClassName()); - - val methodHandle = LOOKUP.unreflectConstructor( - packetWrapperClass.getDeclaredConstructor(PacketContainer.class) - ); - - val type = methodHandle.type(); - - //noinspection unchecked - return (Function) metafactory( - LOOKUP, FUNCTION__APPLY__METHOD_NAME, FUNCTION__METHOD_TYPE, - type.generic(), methodHandle, type - ).getTarget().invokeExact(); - }) + .computeIfAbsent(packet.getType(), packetType -> { + final Class packetWrapperClass; + { + val className = PACKET_TYPES.get(packetType).toPacketWrapperClassName(); + try { + packetWrapperClass = Class.forName(className); + } catch (final ClassNotFoundException e) { + throw new IllegalStateException("Could not find class by name \"" + className + '"'); + } + } + + + MethodHandle constructorMethodHandle; + try { + constructorMethodHandle = LOOKUP.findConstructor( + packetWrapperClass, VOID_PACKET_CONTAINER__METHOD_TYPE + ); + } catch (final NoSuchMethodException | IllegalAccessException e) { + throw new IllegalStateException( + "Cannot create method handle for constructor " + + packetWrapperClass + "(PacketContainer)", e + ); + } + + val type = constructorMethodHandle.type(); + + final CallSite callSite; + try { + callSite = metafactory( + LOOKUP, FUNCTION__APPLY__METHOD_NAME, FUNCTION__METHOD_TYPE, + VOID_PACKET_CONTAINER__METHOD_TYPE, constructorMethodHandle, type + ); + } catch (LambdaConversionException e) { + throw new IllegalStateException( + "Cannot invoke metafactory for constructor method-handle " + constructorMethodHandle, e + ); + } + + constructorMethodHandle = callSite.getTarget(); + + try { + //noinspection unchecked + return (Function) constructorMethodHandle.invokeExact(); + } catch (final Throwable x) { + throw new IllegalStateException( + "Cannot invoke metafactory-provided method-handle " + constructorMethodHandle, x + ); + } + }) .apply(packet); } @@ -139,20 +179,21 @@ private static class PacketTypeId { /** * Group of packets to which the one belongs */ - final @NonNull String group; + @NonNull String group; /** * Direction of the packet */ - final @NonNull PacketDirection direction; + @NonNull PacketDirection direction; /** * Name of the packet in the system */ - final @NonNull String name; + @NonNull String name; - @NonNull private String toPacketWrapperClassName() { - return PACKET_WRAPPER_PACKAGE + ".Wrapper" + group + direction.name + name; + @NonNull + private String toPacketWrapperClassName() { + return PACKET_WRAPPER_PACKAGE + ".Wrapper" + group + direction.name() + name; } } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java deleted file mode 100644 index fd6f4d33b..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedConsumer.java +++ /dev/null @@ -1,27 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.function; - -import lombok.SneakyThrows; - -import java.util.function.Consumer; - -/** - * Consumer which allows having checked exceptions in its method body. - * - * @param {@inheritDoc} - */ -@FunctionalInterface -public interface UncheckedConsumer extends Consumer { - - /** - * Performs this operation on the given argument allowing any checked exceptions in method body. - * - * @param t the input argument - */ - void consume(T t) throws Throwable; - - @Override - @SneakyThrows - default void accept(final T t) { - consume(t); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java deleted file mode 100644 index bbb036c33..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedFunction.java +++ /dev/null @@ -1,40 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.function; - -import lombok.NonNull; -import lombok.SneakyThrows; - -import java.util.function.Function; - -/** - * Function which allows having checked exceptions in its method body. - * - * @param {@inheritDoc} - * @param {@inheritDoc} - */ -@FunctionalInterface -public interface UncheckedFunction extends Function { - - /** - * Applies this function to the given argument allowing any checked exceptions in method body. - * - * @param t the function argument - * @return the function result - */ - R operate(T t) throws Throwable; - - @Override - @SneakyThrows - default R apply(T t) { - return operate(t); - } - - @Override - default UncheckedFunction compose(@NonNull Function before) { - return v -> apply(before.apply(v)); - } - - @Override - default UncheckedFunction andThen(final @NonNull Function after) { - return t -> after.apply(apply(t)); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java deleted file mode 100644 index 1c502bd29..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/function/UncheckedRunnable.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.function; - -import lombok.SneakyThrows; - -@FunctionalInterface -public interface UncheckedRunnable extends Runnable { - - void call() throws Throwable; - - @Override - @SneakyThrows - default void run() { - call(); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java deleted file mode 100644 index 531dc651b..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapper.java +++ /dev/null @@ -1,353 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.primitive; - -import lombok.*; -import lombok.experimental.FieldDefaults; - -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.IntBinaryOperator; -import java.util.function.IntUnaryOperator; - -/** - * Wrapper for an {@code int} focused at providing polymorphism to its operations concurrency. - */ -public abstract class IntWrapper extends Number { - - /** - * Gets the value. - * - * @return value - */ - abstract int get(); - - /** - * Sets the value. - * - * @param value value to be set - */ - abstract void set(int value); - - /** - * Gets the value after what it gets incremented. - * - * @return value before increment - */ - abstract int getAndIncrement(); - - /** - * Increments the value after what it is returned. - * - * @return value after increment - */ - abstract int incrementAndGet(); - - /** - * Gets the value after what it gets decremented. - * - * @return value before decrement - */ - abstract int getAndDecrement(); - - /** - * Decrements the value after what it is returned. - * - * @return value after decrement - */ - abstract int decrementAndGet(); - - /** - * Gets the value after what delta is added to it. - * - * @param delta the value which should be added to the current value - * @return value before addition - */ - abstract int getAndAdd(int delta); - - /** - * Adds the delta to the value after what it is returned. - * - * @param delta the value which should be added to the current value - * @return value after addition - */ - abstract int addAndGet(int delta); - - /** - * Updates the current value using the specified function after what the new value is returned. - * - * @param updateFunction function to be used for updating the value - * @return value after update - */ - abstract int getAndUpdate(@NonNull IntUnaryOperator updateFunction); - - /** - * Gets the value after what it gets updated using the specified function. - * - * @param updateFunction function to be used for updating the value - * @return value after update - */ - abstract int updateAndGet(@NonNull IntUnaryOperator updateFunction); - - /** - * Updates the current value using specified function and update value after what the new value is returned. - * - * @param updateValue update value (will be passed as the second function parameter) - * @param accumulatorFunction function to be used for updating the value - * @return value after update - */ - abstract int getAndAccumulate(int updateValue, @NonNull IntBinaryOperator accumulatorFunction); - - /** - * Gets the value after what it gets updated using the specified function and update value. - * - * @param updateValue update value (will be passed as the second function parameter) - * @param accumulatorFunction function to be used for updating the value - * @return value after update - */ - abstract int accumulateAndGet(int updateValue, @NonNull IntBinaryOperator accumulatorFunction); - - /** - * Creates new simple int wrapper. - * - * @param value initial value of int wrapper - * @return created int wrapper - */ - public static IntWrapper create(final int value) { - return new IntIntWrapper(value); - } - - /** - * Creates new simple int wrapper with initial value set to {@code 0}. - * - * @return created int wrapper - */ - public static IntWrapper create() { - return new IntIntWrapper(); - } - - /** - * Creates new atomic int wrapper. - * - * @param value initial value of int wrapper - * @return created int wrapper - */ - public static IntWrapper createAtomic(final int value) { - return new AtomicIntegerIntWrapper(value); - } - - /** - * Creates new atomic int wrapper with initial value set to {@code 0}. - * - * @return created int wrapper - */ - public static IntWrapper createAtomic() { - return new AtomicIntegerIntWrapper(); - } - - /** - * {@link IntWrapper} implementation based on {@code int}. - */ - @Data - @NoArgsConstructor - @AllArgsConstructor - @EqualsAndHashCode(callSuper = true) - @FieldDefaults(level = AccessLevel.PRIVATE) - private static final class IntIntWrapper extends IntWrapper { - - int value; - - @Override - int get() { - return value; - } - - @Override - void set(final int value) { - this.value = value; - } - - @Override - int getAndIncrement() { - return value++; - } - - @Override - int incrementAndGet() { - return ++value; - } - - @Override - int getAndDecrement() { - return value--; - } - - @Override - int decrementAndGet() { - return --value; - } - - @Override - int getAndAdd(final int delta) { - val oldValue = value; - value += delta; - - return oldValue; - } - - @Override - int addAndGet(final int delta) { - return value += delta; - } - - @Override - int getAndUpdate(final @NonNull IntUnaryOperator updateFunction) { - val oldValue = value; - value = updateFunction.applyAsInt(oldValue); - - return oldValue; - } - - @Override - int updateAndGet(final @NonNull IntUnaryOperator updateFunction) { - return value = updateFunction.applyAsInt(value); - } - - @Override - int getAndAccumulate(final int updateValue, final @NonNull IntBinaryOperator accumulatorFunction) { - val oldValue = value; - value = accumulatorFunction.applyAsInt(value, updateValue); - - return oldValue; - } - - @Override - int accumulateAndGet(final int updateValue, final @NonNull IntBinaryOperator accumulatorFunction) { - return value = accumulatorFunction.applyAsInt(value, updateValue); - } - - @Override - public int intValue() { - return value; - } - - @Override - public long longValue() { - return value; - } - - @Override - public float floatValue() { - return value; - } - - @Override - public double doubleValue() { - return value; - } - } - - /** - * {@link IntWrapper} implementation based on {@link AtomicInteger}. - */ - @Value - @EqualsAndHashCode(callSuper = true) - @FieldDefaults(level = AccessLevel.PRIVATE) - private static final class AtomicIntegerIntWrapper extends IntWrapper{ - - @NonNull AtomicInteger value; - - /** - * Creates new atomic integer int wrapper. - * - * @param value initial value - */ - public AtomicIntegerIntWrapper(final int value) { - this.value = new AtomicInteger(value); - } - - /** - * Creates new atomic integer int wrapper with initial value set to {@code 0}. - */ - public AtomicIntegerIntWrapper() { - this.value = new AtomicInteger(); - } - - @Override - int get() { - return value.get(); - } - - @Override - void set(final int value) { - this.value.set(value); - } - - @Override - int getAndIncrement() { - return value.getAndIncrement(); - } - - @Override - int incrementAndGet() { - return value.incrementAndGet(); - } - - @Override - int getAndDecrement() { - return value.getAndDecrement(); - } - - @Override - int decrementAndGet() { - return value.decrementAndGet(); - } - - @Override - int getAndAdd(final int delta) { - return value.getAndAdd(delta); - } - - @Override - int addAndGet(final int delta) { - return value.addAndGet(delta); - } - - @Override - int getAndUpdate(final @NonNull IntUnaryOperator updateFunction) { - return value.getAndUpdate(updateFunction); - } - - @Override - int updateAndGet(final @NonNull IntUnaryOperator updateFunction) { - return value.updateAndGet(updateFunction); - } - - @Override - int getAndAccumulate(final int updateValue, final @NonNull IntBinaryOperator accumulatorFunction) { - return value.getAndAccumulate(updateValue, accumulatorFunction); - } - - @Override - int accumulateAndGet(final int updateValue, final @NonNull IntBinaryOperator accumulatorFunction) { - return value.accumulateAndGet(updateValue, accumulatorFunction); - } - - @Override - public int intValue() { - return value.intValue(); - } - - @Override - public long longValue() { - return value.longValue(); - } - - @Override - public float floatValue() { - return value.floatValue(); - } - - @Override - public double doubleValue() { - return value.doubleValue(); - } - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index f589e40dc..ea1a4163e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -36,7 +36,7 @@ public interface ShutdownHooks extends Shutdownable { * * @apiNote supplier is called instantly, not lazily */ - @NonNull ShutdownHooks add(@NonNull Supplier hookSupplier); + @NonNull ShutdownHooks add(@NonNull Supplier hookSupplier); /** * Adds a shutdown hook. diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java index 87d29ecb7..f442bb4fc 100644 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java +++ b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/nms/PacketWrapperUtilTest.java @@ -6,13 +6,12 @@ import org.apache.commons.lang.math.RandomUtils; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; -import ru.progrm_jarvis.javacommons.util.function.ThrowingFunction; import ru.progrm_jarvis.minecraft.commons.nms.protocol.misc.PacketWrapperUtil; -import ru.progrm_jarvis.minecraft.commons.util.function.UncheckedFunction; import ru.progrm_jarvis.reflector.wrapper.invoke.InvokeConstructorWrapper; import java.io.IOException; import java.lang.reflect.Constructor; +import java.util.function.Function; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -35,7 +34,8 @@ void getterNameToStringTest() { assertEquals("get", PacketWrapperUtil.getterNameToString("get")); } - @Test@Disabled("Requires PortocolManager singleton at runtime") + @Test + @Disabled("Requires PortocolManager singleton at runtime") @SuppressWarnings({"UnstableApiUsage", "unchecked"}) void defaultPacketsTest() throws IOException { val classLoader = AbstractPacket.class.getClassLoader(); @@ -45,17 +45,29 @@ void defaultPacketsTest() throws IOException { .stream() .filter(classInfo -> PACKET_WRAPPER_CLASS_NAME_PATTERN.matcher(classInfo.getSimpleName()).matches()) .map(ClassPath.ClassInfo::getName) - .map((UncheckedFunction>) className - -> (Class) classLoader.loadClass(className)) - .map((ThrowingFunction, Constructor, - NoSuchMethodException>) aClass -> aClass.getDeclaredConstructor()) + .map((Function>) className + -> { + try { + return (Class) classLoader.loadClass(className); + } catch (final ClassNotFoundException e) { + throw new IllegalStateException("Could not find class by name \"" + className + '"'); + } + }) + .map((Function, Constructor>) clazz -> { + try { + return clazz.getDeclaredConstructor(); + } catch (final NoSuchMethodException e) { + throw new IllegalStateException("Could not find empty constructor of class " + clazz); + } + }) .map(InvokeConstructorWrapper::from) .collect(Collectors.toSet()) .forEach(constructor -> { System.out.println("Testing: " + constructor); - for (int i = 0; i < 3 + RandomUtils.nextInt(3); i++) assertDoesNotThrow( - () -> PacketWrapperUtil.toString(constructor.invoke()) - ); + for (int i = 0; i < 3 + RandomUtils.nextInt(3); i++) + assertDoesNotThrow( + () -> PacketWrapperUtil.toString(constructor.invoke()) + ); }); } } \ No newline at end of file diff --git a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java b/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java deleted file mode 100644 index d49d97567..000000000 --- a/minecraft-commons/src/test/java/ru/progrm_jarvis/minecraft/commons/util/primitive/IntWrapperTest.java +++ /dev/null @@ -1,213 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.util.primitive; - -import lombok.NonNull; -import lombok.val; -import lombok.var; -import org.apache.commons.lang.math.RandomUtils; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.function.ThrowingSupplier; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import ru.progrm_jarvis.javacommons.random.RandomUtil; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.function.IntBinaryOperator; -import java.util.function.IntUnaryOperator; - -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.params.provider.Arguments.of; - -class IntWrapperTest { - - static Collection intWrapperParameters() { - val arguments = new ArrayList(); - - arguments.add(of(IntWrapper.create())); - arguments.add(of(IntWrapper.createAtomic())); - - for (var i = 0; i < 8 + RandomUtils.nextInt(8); i++) arguments - .add(of(IntWrapper.create(RandomUtils.nextInt()))); - for (var i = 0; i < 8 + RandomUtils.nextInt(8); i++) arguments - .add(of(IntWrapper.create(-RandomUtils.nextInt()))); - for (var i = 0; i < 8 + RandomUtils.nextInt(8); i++) arguments - .add(of(IntWrapper.createAtomic(RandomUtils.nextInt()))); - for (var i = 0; i < 8 + RandomUtils.nextInt(8); i++) arguments - .add(of(IntWrapper.createAtomic(-RandomUtils.nextInt()))); - - return arguments; - } - - @Test - void testCreate() { - assertDoesNotThrow((ThrowingSupplier) IntWrapper::create); - for (var i = 0; i < 128; i++) assertDoesNotThrow(() -> IntWrapper.create(RandomUtils.nextInt())); - } - - @Test - void testCreateAtomic() { - assertDoesNotThrow((ThrowingSupplier) IntWrapper::createAtomic); - for (var i = 0; i < 128; i++) assertDoesNotThrow(() -> IntWrapper.createAtomic(RandomUtils.nextInt())); - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testGetValueOfSpecificNumericType(final @NonNull IntWrapper wrapper) { - val value = wrapper.get(); - - assertEquals((byte) value, wrapper.byteValue()); - assertEquals((short) value, wrapper.shortValue()); - assertEquals(value, wrapper.intValue()); - assertEquals((long) value, wrapper.longValue()); - assertEquals((float) value, wrapper.floatValue()); - assertEquals((double) value, wrapper.doubleValue()); - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testGetSet(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val value = RandomUtils.nextInt(); - wrapper.set(value); - assertEquals(value, wrapper.get()); - } - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testGetAndIncrement(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val value = wrapper.get(); - assertEquals(value, wrapper.getAndIncrement()); - assertEquals(value + 1, wrapper.get()); - } - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testIncrementAndGet(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val newValue = wrapper.get() + 1; - assertEquals(newValue, wrapper.incrementAndGet()); - assertEquals(newValue, wrapper.get()); - } - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testGetAndDecrement(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val value = wrapper.get(); - assertEquals(value, wrapper.getAndDecrement()); - assertEquals(value - 1, wrapper.get()); - } - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testDecrementAndGet(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val newValue = wrapper.get() - 1; - assertEquals(newValue, wrapper.decrementAndGet()); - assertEquals(newValue, wrapper.get()); - } - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testGetAndAdd(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val delta = RandomUtils.nextInt() * RandomUtil.randomSign(); - - val value = wrapper.get(); - assertEquals(value, wrapper.getAndAdd(delta)); - assertEquals(value + delta, wrapper.get()); - } - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testAddAndGet(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val delta = RandomUtils.nextInt() * RandomUtil.randomSign(); - - val newValue = wrapper.get() + delta; - assertEquals(newValue, wrapper.addAndGet(delta)); - assertEquals(newValue, wrapper.get()); - } - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testGetAndUpdate(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val function = randomIntUnaryFunction(); - - val value = wrapper.get(); - assertEquals(value, wrapper.getAndUpdate(function)); - assertEquals(function.applyAsInt(value), wrapper.get()); - } - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testUpdateAndGet(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val function = randomIntUnaryFunction(); - - val newValue = function.applyAsInt(wrapper.get()); - assertEquals(newValue, wrapper.updateAndGet(function)); - assertEquals(newValue, wrapper.get()); - } - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testGetAndAccumulate(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val function = randomIntBinaryFunction(); - val updateValue = RandomUtils.nextInt(); - - val value = wrapper.get(); - assertEquals(value, wrapper.getAndAccumulate(updateValue, function)); - assertEquals(function.applyAsInt(value, updateValue), wrapper.get()); - } - } - - @ParameterizedTest - @MethodSource("intWrapperParameters") - void testAccumulateAndGet(final @NonNull IntWrapper wrapper) { - for (var i = 0; i < 128 + RandomUtils.nextInt(129); i++) { - val function = randomIntBinaryFunction(); - val updateValue = RandomUtils.nextInt(); - - val newValue = function.applyAsInt(wrapper.get(), updateValue); - assertEquals(newValue, wrapper.accumulateAndGet(updateValue, function)); - assertEquals(newValue, wrapper.get()); - } - } - - private static IntUnaryOperator randomIntUnaryFunction() { - val randomValue = RandomUtils.nextBoolean() ? RandomUtils.nextInt() : -RandomUtils.nextInt(); - - switch (RandomUtils.nextInt(4)) { - case 0: return i -> i += randomValue; - case 1: return i -> i -= randomValue; - case 2: return i -> i *= randomValue; - case 3: return i -> i /= randomValue; - default: throw new IllegalStateException("RandomUtils.nextInt(4) returned an illegal value"); - } - } - - private static IntBinaryOperator randomIntBinaryFunction() { - switch (RandomUtils.nextInt(4)) { - case 0: return (i, k) -> i += k; - case 1: return (i, k) -> i -= k; - case 2: return (i, k) -> i *= k; - case 3: return (i, k) -> i /= k; - default: throw new IllegalStateException("RandomUtils.nextInt(4) returned an illegal value"); - } - } -} \ No newline at end of file From 7e5b1ac5316bde575f63fd1da5f65b584bd67c9d Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 01:08:14 +0300 Subject: [PATCH 409/508] style: resolve Codefactor issues in MojangApiManager These were caused by incorrect method ordering. --- .../commons/mojang/MojangApiManager.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java index 29c1787b4..56245246b 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mojang/MojangApiManager.java @@ -126,17 +126,17 @@ protected JsonElement httpGetJson(final @NonNull String uri, final @Nullable Map ); } + public void readUuid(final @NonNull String userName, + final @NonNull Consumer callback) { + asyncRunner.get().runAsynchronously(() -> readUuidUnchecked(userName), callback); + } + @AsyncExpected @SneakyThrows(IOException.class) public @NotNull UUID readUuidUnchecked(final @NonNull String userName) { return readUuid(userName); } - public void readUuid(final @NonNull String userName, - final @NonNull Consumer callback) { - asyncRunner.get().runAsynchronously(() -> readUuidUnchecked(userName), callback); - } - @SneakyThrows @AsyncExpected public @NotNull UUID getUuid(final @NonNull String userName) { @@ -176,17 +176,17 @@ public void getUuid(final @NonNull String userName, final @NonNull Consumer callback) { + asyncRunner.get().runAsynchronously(() -> readProfileUnchecked(uuid, signed), callback); + } + @AsyncExpected @SneakyThrows(IOException.class) public @NotNull GameProfile readProfileUnchecked(final @NonNull UUID uuid, final boolean signed) { return readProfile(uuid, signed); } - public void readProfile(final @NonNull UUID uuid, final boolean signed, - final @NonNull Consumer callback) { - asyncRunner.get().runAsynchronously(() -> readProfileUnchecked(uuid, signed), callback); - } - @SneakyThrows @AsyncExpected public @NotNull GameProfile getProfile(final @NonNull UUID uuid, final boolean signed) { From 539957e138f1a8d59cc9fea74602fb7ab706c52c Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 01:11:53 +0300 Subject: [PATCH 410/508] feat: add Mergify config --- .mergifyio.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .mergifyio.yml diff --git a/.mergifyio.yml b/.mergifyio.yml new file mode 100644 index 000000000..1e8f2a8e8 --- /dev/null +++ b/.mergifyio.yml @@ -0,0 +1,25 @@ +pull_request_rules: + - name: Automatic merge for labelled pull requests + conditions: + - label=merge when ready + actions: + merge: + method: merge + strict: smart+fasttrack + + - name: Automatic merge for Dependabot pull requests + conditions: + - author~=^dependabot(|-preview)\[bot\]$ + - base=development + actions: + merge: + method: merge + strict: smart+fasttrack + + - name: Remove Mergify temporary labels + conditions: + - merged + actions: + label: + remove: + - merge when ready From 5140061840f728b76d651d601aca107e2e5dbae3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Jan 2021 22:18:56 +0000 Subject: [PATCH 411/508] build(deps): bump actions/cache from v2.1.2 to v2.1.3 Bumps [actions/cache](https://github.com/actions/cache) from v2.1.2 to v2.1.3. - [Release notes](https://github.com/actions/cache/releases) - [Commits](https://github.com/actions/cache/compare/v2.1.2...0781355a23dac32fd3bac414512f4b903437991a) Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5aee5d32d..3da151435 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: java-version: 1.8 - name: Cache Maven local repository - uses: actions/cache@v2.1.2 + uses: actions/cache@v2.1.3 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 80bbada5d..d2d1dd9c1 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -17,7 +17,7 @@ jobs: java-version: 1.8 - name: Cache Maven local repository - uses: actions/cache@v2.1.2 + uses: actions/cache@v2.1.3 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index c4beac1c7..cb561de68 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -17,7 +17,7 @@ jobs: java-version: 1.8 - name: Cache Maven local repository - uses: actions/cache@v2.1.2 + uses: actions/cache@v2.1.3 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d7b5de506..33928e925 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,7 +16,7 @@ jobs: java-version: 1.8 - name: Cache Maven local repository - uses: actions/cache@v2.1.2 + uses: actions/cache@v2.1.3 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} From a1b462c2c690b56be159d2a86d417ca8779b7717 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 01:26:26 +0300 Subject: [PATCH 412/508] docs: fix Javadoc issues breaking deployment --- .../minecraft/commons/chunk/ChunkUtil.java | 12 +++---- .../commons/mapimage/DefaultMapImage.java | 11 +++--- .../minecraft/commons/mapimage/MapImages.java | 14 ++++---- .../mapimage/display/PlayerMapManager.java | 1 + .../display/ProtocolBasedMapImageDisplay.java | 5 ++- .../player/collection/PlayerContainer.java | 3 +- .../chain/AbstractSchedulerChain.java | 2 ++ .../commons/util/shutdown/ShutdownHooks.java | 35 ++++++++++--------- 8 files changed, 47 insertions(+), 36 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java index 760243f82..7178277ea 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/chunk/ChunkUtil.java @@ -15,14 +15,14 @@ * There are general conventions for type=methods: * *
- *
{@code Foo [bar]foo(Bar...)}
- *
return the specified bar value's foocomponent (other data is lost)
+ *
{@code Foo [bar]foo(Bar...)}
+ *
return the specified bar value's foocomponent (other data is lost)
* - *
{@code Foo [bar]toFoo(Bar...)}
- *
convert the specified bar value to its foo representation (no data is lost)
+ *
{@code Foo [bar]toFoo(Bar...)}
+ *
convert the specified bar value to its foo representation (no data is lost)
* - *
{@code Foo [Bar]Foo(Bar...)}
- *
performs the action specified on bar using foo
+ *
{@code Foo [Bar]Foo(Bar...)}
+ *
performs the action specified on bar using foo
*
* * @apiNote chunks are (by default) returned as a single {@code long} as the limit of chunk at non-Y-axis is 3750000 diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index 635162d2f..4fd745f25 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -94,8 +94,8 @@ public byte[] getMapData(final int leastX, final int leastY, final int width, fi * @param resize whether the image should be resized or cut to fit map image dimensions * @return created map image */ - public static DefaultMapImage from(final @NonNull BufferedImage image, final boolean resize, - final byte displayMode) { + public static MapImage from(final @NonNull BufferedImage image, final boolean resize, + final byte displayMode) { return new DefaultMapImage(MapImages.getMapImagePixels(image, resize), displayMode); } @@ -193,7 +193,7 @@ protected final class BufferedDrawer implements MapImage.BufferedDrawer { /** * Resets this buffered drawer setting {@link #unchanged} to {@code true} and resetting its buffer. */ - protected void reset() { + private void reset() { unchanged = true; leastChangedX = leastChangedY = mostChangedX = mostChangedY = Delta.NONE; @@ -214,8 +214,9 @@ public Delta dispose() { var i = -1; for (var y = leastY; y < height; y++) { val offset = y * width; - for (var x = leastX; x < width; x++) if (pixels[++i] != NO_COLOR_CODE) DefaultMapImage.this - .pixels[x + offset] = pixels[i]; + for (var x = leastX; x < width; x++) + if (pixels[++i] != NO_COLOR_CODE) DefaultMapImage.this + .pixels[x + offset] = pixels[i]; } reset(); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java index 4353d350a..c237bf7cb 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/MapImages.java @@ -64,13 +64,15 @@ protected static byte[][] normalizePixels(final int[][] pixels) { *

* The logic is the following: * - *

The image is {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} or is smaller
- *
Do nothing and return this image
+ *
+ *
The image is {@link MapImage#WIDTH}×{@link MapImage#HEIGHT} or is smaller
+ *
Do nothing and return this image
* - *
The image's width is bigger than {@link MapImage#WIDTH} - * or its height is bigger than{@link MapImage#HEIGHT}
- *
The image is resized proportionally to be of maximal possible size - * yet fitting the bounds of {@link MapImage#WIDTH}×{@link MapImage#HEIGHT}
+ *
The image's width is bigger than {@link MapImage#WIDTH} + * or its height is bigger than{@link MapImage#HEIGHT}
+ *
The image is resized proportionally to be of maximal possible size + * yet fitting the bounds of {@link MapImage#WIDTH}×{@link MapImage#HEIGHT}
+ *
* * @param image image to fit (will be redrawn) * @param resize whether the image should be resized ({@code true}) or cut ({@code false}) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java index 9bbeb3926..36b87a9ad 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/PlayerMapManager.java @@ -256,6 +256,7 @@ public MapView allocateMap(final @NonNull Player player) { * This should be called whenever the player stops seeing this map or leaves the server. * * @param player player for whom to free the map + * @param map map which should be freed * @apiNote this must be called for any map allocation once it can be free * * @see #allocateMap(Player) only obtained by calling this method should be freed diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java index 68cfe607f..dde2660ff 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/display/ProtocolBasedMapImageDisplay.java @@ -51,6 +51,8 @@ public MapImage image() { /** * Sends the whole image to the players. + * + * @param player player to whom the image should be sent */ protected void sendFullImage(final @NonNull Player player) { new WrapperPlayServerMap() {{ @@ -125,7 +127,8 @@ public Collection getPlayers() { } @Override - @NonNull public Optional getMapId(final @NonNull Player player) { + @NonNull + public Optional getMapId(final @NonNull Player player) { return MapUtil.>getOrDefault( playerMaps, player, map -> Optional.of(PlayerMapManager.getMapId(map)), Optional::empty ); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java index 48e34847b..2d226d548 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/player/collection/PlayerContainer.java @@ -77,9 +77,10 @@ default void removePlayers(final Collection players) { } /** - * Returns {@code true} if this container contains the specified player and {@code false} otherwise. + * Checks if this container contains the specified player. * * @param player player to check for containment + * @return {@code true} if this container contains the specified player and {@code false} otherwise. */ boolean containsPlayer(Player player); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java index f02fb3561..2463b096a 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/schedule/chain/AbstractSchedulerChain.java @@ -65,6 +65,8 @@ protected interface ChainedTask extends Runnable { /** * Gets the amount of times this task should be called. * + * @return the amount of times this task should be called + * * @apiNote the delay happens once after which the task is called multiple times without it */ @Nonnegative default long getRunTimes() { diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java index ea1a4163e..84751b7d8 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/util/shutdown/ShutdownHooks.java @@ -24,7 +24,7 @@ public interface ShutdownHooks extends Shutdownable { * Adds a shutdown hook. * * @param hook shutdown hook to add - * @return this {@link ShutdownHooks} for chaining + * @return this shutdown hooks for chaining */ @NonNull ShutdownHooks add(@NonNull Runnable hook); @@ -32,7 +32,7 @@ public interface ShutdownHooks extends Shutdownable { * Adds a shutdown hook. * * @param hookSupplier supplier to be used instantly to create a hook - * @return this {@link ShutdownHooks} for chaining + * @return this shutdown hooks for chaining * * @apiNote supplier is called instantly, not lazily */ @@ -43,7 +43,8 @@ public interface ShutdownHooks extends Shutdownable { * * @param objectSupplier supplier to create an object which wil be shut down * @param hookCreator function to create a hook - * @return this {@link ShutdownHooks} for chaining + * @param type of the supplied object + * @return this shutdown hooks for chaining * * @apiNote supplier and function are called instantly, not lazily */ @@ -53,22 +54,22 @@ public interface ShutdownHooks extends Shutdownable { * Removes a shutdown hook. * * @param hook shutdown hook to remove - * @return this {@link ShutdownHooks} for chaining + * @return this shutdown hooks for chaining */ @NonNull ShutdownHooks remove(@NonNull Runnable hook); /** - * Registers these {@link ShutdownHooks} as a Bukkit plugin shutdown hook. + * Registers these shutdown hooks as a Bukkit plugin shutdown hook. * * @param plugin plugin whose shutdown hook this is - * @return this {@link ShutdownHooks} for chaining + * @return this shutdown hooks for chaining */ @NonNull ShutdownHooks registerBukkitShutdownHook(@NonNull Plugin plugin); /** - * Unregisters these {@link ShutdownHooks} as a Bukkit plugin shutdown hook. + * Unregisters these shutdown hooks as a Bukkit plugin shutdown hook. * - * @return this {@link ShutdownHooks} for chaining + * @return this shutdown hooks for chaining */ @NonNull ShutdownHooks unregisterBukkitShutdownHook(); @@ -81,43 +82,43 @@ public interface ShutdownHooks extends Shutdownable { /** * Retrieves whether or not {@link #shutdown()} was called. * - * @return {@cpde true} if this was shut down and {@code false} otherwise + * @return {@code true} if this was shut down and {@code false} otherwise */ boolean isShutDown(); /** - * Creates new {@link ShutdownHooks} instance. + * Creates a new shutdown hook instance. * - * @return created {@link ShutdownHooks} instance + * @return created shutdown hook instance */ static ShutdownHooks create() { return new Simple(); } /** - * Creates new {@link ShutdownHooks} instance. + * Creates new shutdown hook instance. * * @param parent object whose shutdown hooks those are - * @return created {@link ShutdownHooks} instance + * @return created shutdown hook instance */ static ShutdownHooks create(final @NonNull Shutdownable parent) { return new Simple(parent); } /** - * Creates new concurrent {@link ShutdownHooks} instance. + * Creates new concurrent shutdown hook instance. * - * @return created concurrent {@link ShutdownHooks} instance + * @return created concurrent shutdown hook instance */ static ShutdownHooks createConcurrent() { return new Concurrent(); } /** - * Creates new concurrent {@link ShutdownHooks} instance. + * Creates new concurrent shutdown hook instance. * * @param parent object whose shutdown hooks those are - * @return created concurrent {@link ShutdownHooks} instance + * @return created concurrent shutdown hook instance */ static ShutdownHooks createConcurrent(final @NonNull Shutdownable parent) { return new Concurrent(parent); From a0b3f021d24263930e6920a316d808e8669e4717 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 01:42:24 +0300 Subject: [PATCH 413/508] docs: fix Javadoc issues in fake-entity-lib breaking deployment --- .../fakeentitylib/entity/ArmorStandBlockItem.java | 12 +++++++++--- .../entity/management/FakeEntityManager.java | 5 ++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 5dae48b21..f5bf9eb8c 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -41,7 +41,7 @@ public class ArmorStandBlockItem extends SimpleLivingFakeEntity { ARMOR_STAND_BODY_HEIGHT = (16 + 8) * PIXEL_SIZE, ARMOR_STAND_HEAD_ROOT_OFFSET = ARMOR_STAND_BODY_HEIGHT - HALF_PIXEL_SIZE, ITEM_CENTER_Y_OFFSET = 3 * PIXEL_SIZE + HALF_PIXEL_SIZE; - // offset of the item center from the rotation center + // offset of the item center from the rotation center final boolean small, marker; final double itemCenterYOffset; @@ -74,7 +74,10 @@ public class ArmorStandBlockItem extends SimpleLivingFakeEntity { * @param viewDistance view distance of this block-item * @param location location of this block-item * @param rotation rotation of this block item + * @param itemCenterYOffset offset of the item center on Y-axis + * @param offset offset of the entity from its logical center * @param small whether this block-item is small + * @param marker whether this block-item is marker * @param item item to be displayed by this block-item */ protected ArmorStandBlockItem(final @Nullable UUID uuid, @@ -105,12 +108,15 @@ protected ArmorStandBlockItem(final @Nullable UUID uuid, /** * Creates new armor stand block-item by parameters specified. * + * @param uuid unique ID of the created entity * @param concurrent whether created block-item supports concurrent modification of players related to it * @param global whether created block-item is global (the value returned by {@link #isGlobal()}) * @param viewDistance view distance of created block-item + * @param visible whether created block-item should be visible * @param location location of created block-item * @param rotation rotation of created block item * @param small whether created block-item is small + * @param marker whether created block-item is marker * @param item item to be displayed by this block-item * @return newly created armor stand block-item */ @@ -142,8 +148,7 @@ public static ArmorStandBlockItem create(final @Nullable UUID uuid, return location; } - protected static @NotNull - Offset rotationOffsets(final Vector3F rotation, double yOffset /* => y */) { + protected static @NotNull Offset rotationOffsets(final Vector3F rotation, double yOffset /* => y */) { // apply rotation matrices to align center: https://en.wikipedia.org/wiki/Rotation_matrix // let L be initial location and Q be geometrical center // the resulting location should be L' = L - Q' @@ -165,6 +170,7 @@ Offset rotationOffsets(final Vector3F rotation, double yOffset /* => y */) { * * @param rotation rotation of this block-item * @param small whether this block-item is small + * @param marker whether this block-item is marker * @return created metadata object */ protected static WrappedDataWatcher createMetadata(final @Nullable Vector3F rotation, diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java index 91c4138f8..ebf1ce191 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManager.java @@ -1,7 +1,6 @@ package ru.progrm_jarvis.minecraft.fakeentitylib.entity.management; import lombok.NonNull; -import org.bukkit.plugin.Plugin; import ru.progrm_jarvis.javacommons.annotation.DontOverrideEqualsAndHashCode; import ru.progrm_jarvis.javacommons.collection.concurrent.ConcurrentCollections; import ru.progrm_jarvis.minecraft.commons.plugin.BukkitPluginContainer; @@ -85,7 +84,7 @@ static Map concurrentWeakEntityMap() { * * @param entity entity to manage * - * @apiNote Normally management should happen until {@link #unmanageEntity(E)} is called with this entity + * @apiNote Normally management should happen until {@link #unmanageEntity(FakeEntity)} is called with this entity * or (in most cases) if the entity is no longer non-weakly referenced. */ void manageEntity(@NonNull E entity); @@ -110,7 +109,7 @@ static Map concurrentWeakEntityMap() { /** * Removes the entity managed by this manager. - * This is a logical equivalent of calling {@link #unmanageEntity(E)} and {@link E#remove()} + * This is a logical equivalent of calling {@link #unmanageEntity(FakeEntity)} and {@link FakeEntity#remove()} * * @param entity entity to remove * From 262cfaacfd355d9df1b71c063c82c0086f2f6d27 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 01:46:59 +0300 Subject: [PATCH 414/508] docs: remove dangling type-parameter reference in FakeEntityManagerGroup --- .../fakeentitylib/entity/management/FakeEntityManagerGroup.java | 1 - 1 file changed, 1 deletion(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java index 84ea84ec5..d222e8d04 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/management/FakeEntityManagerGroup.java @@ -17,7 +17,6 @@ * Facade grouping multiple {@link FakeEntityManager}s into a single one. * Its general methods delegate the calls to each of the managers. * - * @param

type of parent plugin * @param type of managed entity */ @ToString From f284aeade54a73010b1b796dc5d43de792e5a109 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 01:53:28 +0300 Subject: [PATCH 415/508] ci: fix name of settings.xml file for GitHub Package Registry deployment --- ...registry-settings.xml => github-package-registry-settings.xml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github-actions/maven/{github-pacakage-registry-settings.xml => github-package-registry-settings.xml} (100%) diff --git a/.github-actions/maven/github-pacakage-registry-settings.xml b/.github-actions/maven/github-package-registry-settings.xml similarity index 100% rename from .github-actions/maven/github-pacakage-registry-settings.xml rename to .github-actions/maven/github-package-registry-settings.xml From dce5471de2addf704a6c84f137f492f5c745a318 Mon Sep 17 00:00:00 2001 From: PROgrm_JARvis Date: Wed, 20 Jan 2021 02:04:09 +0300 Subject: [PATCH 416/508] fix: enable support for {nms}.Entity.entityCount being of type AtomicInteger (#150) --- .../minecraft/commons/nms/NmsUtil.java | 131 +++++++++++++----- 1 file changed, 100 insertions(+), 31 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java index 6bdb34756..9f2954677 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java @@ -4,6 +4,7 @@ import lombok.*; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; +import org.jetbrains.annotations.NotNull; import ru.progrm_jarvis.javacommons.invoke.InvokeUtil; import ru.progrm_jarvis.minecraft.commons.nms.metadata.DataWatcherFactory; import ru.progrm_jarvis.minecraft.commons.nms.metadata.LegacyDataWatcherFactory; @@ -11,6 +12,7 @@ import java.lang.invoke.MethodHandle; import java.lang.reflect.Field; +import java.util.concurrent.atomic.AtomicInteger; /** * Utility for NMS-related features @@ -22,48 +24,51 @@ public class NmsUtil { /** * Base package of NMS (net.minecraft.server.{version}) */ - private final String NMS_PACKAGE = "net.minecraft.server." + NMS_VERSION.name, + private final String NMS_PACKAGE = "net.minecraft.server." + NMS_VERSION.getName(), /** * Base package of CraftBukkit (org.bukkit.craftbukkit.{version}) */ - CRAFT_BUKKIT_PACKAGE = "org.bukkit.craftbukkit." + NMS_VERSION.name; + CRAFT_BUKKIT_PACKAGE = "org.bukkit.craftbukkit." + NMS_VERSION.getName(); /** - * Field access method-handle of {nms}.Entity class field responsible for entity int-UID generation. + * Field {@code {nms}.Entity.entityCount} responsible for entity ID generation. + * + * @apiNote this field should never be used directly, it is only intended for initialization + * of inner specific implementations of {@link EntityIdGenerator}. */ - private final MethodHandle ENTITY_COUNT_FIELD__GETTER, ENTITY_COUNT_FIELD__SETTER; + private final @NotNull Field ENTITY_COUNT_FIELD; - private final Object ENTITY_COUNT_FIELD_MUTEX = new Object[0]; + private final @NotNull EntityIdGenerator ENTITY_ID_GENERATOR; static { final Class nmsEntityClass; - try { - nmsEntityClass = Class.forName(getNmsPackage() + ".Entity"); - } catch (final ClassNotFoundException e) { - throw new IllegalStateException("Cannot find NMS-entity class", e); + { + val nmsEntityClassName = getNmsPackage() + ".Entity"; + try { + nmsEntityClass = Class.forName(nmsEntityClassName); + } catch (final ClassNotFoundException e) { + throw new InternalError("Cannot find entity class by name \"" + nmsEntityClassName + '"', e); + } } - final Field entityCountField; try { - entityCountField = nmsEntityClass.getDeclaredField("entityCount"); + ENTITY_COUNT_FIELD = nmsEntityClass.getDeclaredField("entityCount"); } catch (NoSuchFieldException e) { - throw new IllegalStateException( - "Cannot find field " + nmsEntityClass.getCanonicalName() + "#entityCount", e - ); - } - val accessible = entityCountField.isAccessible(); - entityCountField.setAccessible(true); - try { - ENTITY_COUNT_FIELD__GETTER = InvokeUtil.toGetterMethodHandle(entityCountField); - ENTITY_COUNT_FIELD__SETTER = InvokeUtil.toSetterMethodHandle(entityCountField); - } finally { - entityCountField.setAccessible(accessible); + throw new InternalError("Cannot find field " + nmsEntityClass.getCanonicalName() + "#entityCount", e); } + + final Class entityCountFieldType; + if (AtomicInteger.class.isAssignableFrom(entityCountFieldType + = ENTITY_COUNT_FIELD.getType())) ENTITY_ID_GENERATOR = AtomicIntegerEntityIdGenerator.INSTANCE; + else if (entityCountFieldType == int.class) ENTITY_ID_GENERATOR = IntEntityIdGenerator.INSTANCE; + else throw new InternalError( + "Field " + ENTITY_COUNT_FIELD + " of class " + nmsEntityClass + " has an unknown type" + ); } /** * DataWatcher factory valid for current server version */ - private final DataWatcherFactory DATA_WATCHER_FACTORY = NMS_VERSION.generation < 9 + private final DataWatcherFactory DATA_WATCHER_FACTORY = NMS_VERSION.getGeneration() < 9 ? new LegacyDataWatcherFactory() : new StandardDataWatcherFactory(); /** @@ -127,12 +132,8 @@ public DataWatcherFactory.DataWatcherModifier dataWatcherModifier(final @NonNull * @return new ID for an entity */ @SneakyThrows - @Synchronized("ENTITY_COUNT_FIELD_MUTEX") public int nextEntityId() { - val id = (int) ENTITY_COUNT_FIELD__GETTER.invokeExact(); - ENTITY_COUNT_FIELD__SETTER.invokeExact(id + 1); - - return id; + return ENTITY_ID_GENERATOR.nextId(); } /** @@ -140,17 +141,17 @@ public int nextEntityId() { */ @Value @RequiredArgsConstructor - public static final class NmsVersion { + public static class NmsVersion { /** * Name of the version */ - @NonNull private String name; + @NonNull String name; /** * Generation of a version (such as 13 for minecraft 1.13.2) */ - private short generation; + short generation; /** * Constructs a new NMS version by name specified (such as v1_12_R1). @@ -173,4 +174,72 @@ public static NmsVersion computeCurrent() { return new NmsVersion(craftServerPackage.substring(craftServerPackage.lastIndexOf('.') + 1)); } } + + @FunctionalInterface + private interface EntityIdGenerator { + int nextId(); + } + + /** + * Implementation of {@link EntityIdGenerator} based on {@code int} {@link #ENTITY_COUNT_FIELD}. + * + * @implNote this implementation does allow ID generation + * only from {@link Bukkit#isPrimaryThread() Bukkit's primary thread}. + */ + private final class IntEntityIdGenerator implements EntityIdGenerator { + + private static final @NotNull EntityIdGenerator INSTANCE = new AtomicIntegerEntityIdGenerator(); + + /** + * Getter method-handle of {@link #ENTITY_COUNT_FIELD}. + */ + private static final @NotNull MethodHandle ENTITY_COUNT_FIELD__GETTER; + + /** + * Getter method-handle of {@link #ENTITY_COUNT_FIELD}. + */ + private static final @NotNull MethodHandle ENTITY_COUNT_FIELD__SETTER; + + static { + ENTITY_COUNT_FIELD__GETTER = InvokeUtil.toGetterMethodHandle(ENTITY_COUNT_FIELD); + ENTITY_COUNT_FIELD__SETTER = InvokeUtil.toSetterMethodHandle(ENTITY_COUNT_FIELD); + } + + @Override + @SneakyThrows // MethodHandles invocation + public int nextId() { + if (!Bukkit.isPrimaryThread()) throw new IllegalStateException( + "Entity IDs should only be generated on main Bukkit thread" + ); + + val id = (int) ENTITY_COUNT_FIELD__GETTER.invokeExact(); + ENTITY_COUNT_FIELD__SETTER.invokeExact(id + 1); + + return id; + } + } + + /** + * Implementation of {@link EntityIdGenerator} based on {@link AtomicInteger} {@link #ENTITY_COUNT_FIELD}. + */ + private final class AtomicIntegerEntityIdGenerator implements EntityIdGenerator { + + private static final @NotNull EntityIdGenerator INSTANCE = new AtomicIntegerEntityIdGenerator(); + + private static final @NotNull AtomicInteger VALUE; + + static { + final MethodHandle getter = InvokeUtil.toGetterMethodHandle(ENTITY_COUNT_FIELD); + try { + VALUE = (AtomicInteger) getter.invokeExact(); + } catch (final Throwable x) { + throw new InternalError("Could not get the value of field " + ENTITY_COUNT_FIELD); + } + } + + @Override + public int nextId() { + return VALUE.incrementAndGet(); + } + } } From ce237a28b6a4c956b46009621fb312809a03643c Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 20 Jan 2021 20:06:24 +0300 Subject: [PATCH 417/508] build(dep): update PacketWrapper fork to JarvisCraft/PacketWrapper@8f446c32 --- dependencies/PacketWrapper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/PacketWrapper b/dependencies/PacketWrapper index 20979ac75..8f446c320 160000 --- a/dependencies/PacketWrapper +++ b/dependencies/PacketWrapper @@ -1 +1 @@ -Subproject commit 20979ac7559cef3e015bea18f1410a8388d9bee0 +Subproject commit 8f446c3203ebaa043936634523bbf840ace934c1 From a6ff3c4f42ec8952beed247b0812ddad44a1f082 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Thu, 21 Jan 2021 01:38:13 +0300 Subject: [PATCH 418/508] BackwardsCompat: WrapperPlayServerEntityEquipment build(dep): update PacketWrapper fork to JarvisCraft/PacketWrapper@948f5b4e --- .../entity/SimpleLivingFakeEntity.java | 34 +++++++++++++------ pom.xml | 2 +- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index c0a06d60c..af4a07d54 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -9,7 +9,9 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; import java.util.Map; import java.util.Set; @@ -22,6 +24,11 @@ @FieldDefaults(level = AccessLevel.PROTECTED) public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { + /** + * Minor version of Minecraft. + */ + private static final int MINECRAFT_MINOR_VERSION = NmsUtil.getVersion().getGeneration(); + /////////////////////////////////////////////////////////////////////////// // Basic entity data /////////////////////////////////////////////////////////////////////////// @@ -176,6 +183,7 @@ public SimpleLivingFakeEntity(final int entityId, final @Nullable UUID uuid, */ protected void performSpawnNoChecks(final Player player) { spawnPacket.sendPacket(player); + metadataPacket.sendPacket(player); } /** @@ -207,11 +215,20 @@ protected void actualizeSpawnPacket() { thisSpawnPacket.setVelocityY(thisVelocity.getY()); thisSpawnPacket.setVelocityZ(thisVelocity.getZ()); } + } - { - final WrappedDataWatcher thisMetadata; - if ((thisMetadata = metadata) != null) thisSpawnPacket.setMetadata(thisMetadata); + protected void actualizeMetadataPacket(final @NotNull WrappedDataWatcher metadata) { + WrapperPlayServerEntityMetadata thisMetadataPacket; + if ((thisMetadataPacket = metadataPacket) == null) { + metadataPacket = thisMetadataPacket = new WrapperPlayServerEntityMetadata(); + thisMetadataPacket.setEntityID(entityId); } + thisMetadataPacket.setMetadata(metadata.getWatchableObjects()); + } + + protected void actualizeMetadataPacket() { + final WrappedDataWatcher thisMetadata; + if ((thisMetadata = metadata) != null) actualizeMetadataPacket(thisMetadata); } /////////////////////////////////////////////////////////////////////////// @@ -222,6 +239,7 @@ protected void actualizeSpawnPacket() { public void spawn() { if (visible) { actualizeSpawnPacket(); + actualizeMetadataPacket(); for (val entry : players.entrySet()) if (entry.getValue()) performSpawnNoChecks(entry.getKey()); } @@ -397,14 +415,9 @@ protected void sendMetadata() { final WrappedDataWatcher thisMetadata; if ((thisMetadata = metadata) == null) return; - WrapperPlayServerEntityMetadata thisMetadataPacket; - if ((thisMetadataPacket = metadataPacket) == null) { - metadataPacket = thisMetadataPacket = new WrapperPlayServerEntityMetadata(); - thisMetadataPacket.setEntityID(entityId); - } - thisMetadataPacket.setMetadata(thisMetadata.getWatchableObjects()); + actualizeMetadataPacket(thisMetadata); - for (val entry : players.entrySet()) if (entry.getValue()) thisMetadataPacket.sendPacket(entry.getKey()); + for (val entry : players.entrySet()) if (entry.getValue()) metadataPacket.sendPacket(entry.getKey()); } } @@ -415,6 +428,7 @@ protected void sendMetadata() { @Override protected void render(final Player player) { actualizeSpawnPacket(); + actualizeMetadataPacket(); performSpawnNoChecks(player); players.put(player, true); diff --git a/pom.xml b/pom.xml index 4ce08017c..cfec885a6 100644 --- a/pom.xml +++ b/pom.xml @@ -221,7 +221,7 @@ com.comphenix.packetwrapper PacketWrapper - 1.15.2-R0.1-SNAPSHOT + 1.16.4-R0.1-SNAPSHOT commons-io From 399f112504a2be9d0a6cf81a5229b1457897b7a4 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Thu, 21 Jan 2021 01:55:03 +0300 Subject: [PATCH 419/508] build(dep): update PacketWrapper fork to JarvisCraft/PacketWrapper@f92819c1537668f6cb4fd71559a6d859fab79cbe --- dependencies/PacketWrapper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/PacketWrapper b/dependencies/PacketWrapper index 8f446c320..f92819c15 160000 --- a/dependencies/PacketWrapper +++ b/dependencies/PacketWrapper @@ -1 +1 @@ -Subproject commit 8f446c3203ebaa043936634523bbf840ace934c1 +Subproject commit f92819c1537668f6cb4fd71559a6d859fab79cbe From c82f514c46810bed4c15be6e07f3ae9563eeb8b3 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Thu, 21 Jan 2021 02:01:44 +0300 Subject: [PATCH 420/508] build(dep): update PacketWrapper fork to JarvisCraft/PacketWrapper@e173e4d7 --- dependencies/PacketWrapper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/PacketWrapper b/dependencies/PacketWrapper index f92819c15..e173e4d70 160000 --- a/dependencies/PacketWrapper +++ b/dependencies/PacketWrapper @@ -1 +1 @@ -Subproject commit f92819c1537668f6cb4fd71559a6d859fab79cbe +Subproject commit e173e4d702015fbb5c178568d67166bc34469b88 From e77231b1a1c5707fe056f4a9d3afb5e47067d99a Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Thu, 21 Jan 2021 02:51:18 +0300 Subject: [PATCH 421/508] build(dep): update PacketWrapper fork to JarvisCraft/PacketWrapper@66ce68d1 --- dependencies/PacketWrapper | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/PacketWrapper b/dependencies/PacketWrapper index e173e4d70..66ce68d19 160000 --- a/dependencies/PacketWrapper +++ b/dependencies/PacketWrapper @@ -1 +1 @@ -Subproject commit e173e4d702015fbb5c178568d67166bc34469b88 +Subproject commit 66ce68d19d64e530cd929940de1bad557d320443 From 7429927c5e1a94d41f0592589c92c5acc8211504 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Thu, 21 Jan 2021 02:57:39 +0300 Subject: [PATCH 422/508] build(dep): bump ProtocolLib to 4.6.0-SNAPSHOT --- .../minecraft/commons/nms/protocol/misc/PacketListeners.java | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java index a36a74245..57c19741f 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/protocol/misc/PacketListeners.java @@ -57,8 +57,8 @@ public PacketListener callbackPacketListener(final @NonNull Plugin plugin, @ToString public enum PacketCategory { PROTOCOL(PacketType.Protocol.class), - LEGACY_CLIENT(PacketType.Legacy.Client.class), - LEGACY_SERVER(PacketType.Legacy.Server.class), + //LEGACY_CLIENT(PacketType.Legacy.Client.class), + //LEGACY_SERVER(PacketType.Legacy.Server.class), LOGIN_CLIENT(PacketType.Login.Client.class), LOGIN_SERVER(PacketType.Login.Server.class), STATUS_CLIENT(PacketType.Status.Client.class), diff --git a/pom.xml b/pom.xml index cfec885a6..af9f8e539 100644 --- a/pom.xml +++ b/pom.xml @@ -210,7 +210,7 @@ com.comphenix.protocol ProtocolLib - 4.5.1 + 4.6.0-SNAPSHOT provided From 43ad90a178e397ba678c3adcaf9a62edcdfc0746 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Thu, 21 Jan 2021 03:31:06 +0300 Subject: [PATCH 423/508] feat: update most common parts of MetadataGenerator This is still WIP as all the remaining methods of MetadataGenerator should be updated / added --- .../nms/metadata/MetadataGenerator.java | 356 +++++++++--------- 1 file changed, 186 insertions(+), 170 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java index 1b2fe7fac..3357836f4 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java @@ -22,12 +22,13 @@ * @see 1.8 metadata format */ @UtilityClass +@SuppressWarnings("ClassWithOnlyPrivateConstructors") public class MetadataGenerator { private final int VERSION = NmsUtil.getVersion().getGeneration(); private final DataWatcherFactory FACTORY = NmsUtil.getDataWatcherFactory(); - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Entity { public static WrappedWatchableObject entityFlags(final Flag... flags) { @@ -63,6 +64,8 @@ public static WrappedWatchableObject noGravity(final boolean noGravity) { throw new UnsupportedOperationException("Versions prior to 1.9 don't support No Gravity entity flag"); } + // TODO add Pose support for late versions (available since 1.14) + @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { @@ -79,39 +82,39 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Projectile extends Entity {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Snowball extends Projectile {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Egg extends Projectile {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Potion extends Projectile { public static WrappedWatchableObject potion(final Object nmsItemStackPotion) { if (VERSION >= 9) return FACTORY.createWatchableItemStack(6, nmsItemStackPotion); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Potion metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } public static WrappedWatchableObject potion(final ItemStack potion) { if (VERSION >= 9) return FACTORY.createWatchable(6, potion); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Potion metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class FallingBlock extends Entity { public static WrappedWatchableObject position(final BlockPosition position) { if (VERSION >= 9) return FACTORY.createWatchable(6, position); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Potion metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class AreaEffectCloud extends Entity { public static WrappedWatchableObject radius(final float radius) { @@ -132,21 +135,21 @@ public static WrappedWatchableObject singlePoint(final Particle particle) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class FishingHook extends Entity { public static WrappedWatchableObject hookedEntity(final int hookedEntityId) { if (VERSION >= 9) return FACTORY.createWatchable(6, hookedEntityId); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Fishing Hook metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } public static WrappedWatchableObject hookedEntity(final org.bukkit.entity.Entity entity) { if (VERSION >= 9) return hookedEntity(entity.getEntityId() + 1); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Fishing Hook metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Arrow extends Entity { public static WrappedWatchableObject arrowFlags(final Flag... flags) { @@ -158,7 +161,7 @@ public static WrappedWatchableObject arrowFlags(final Flag... flags) { public static WrappedWatchableObject shooter(final @Nullable UUID shooterUuid) { if (VERSION >= 9) return FACTORY.createWatchableOptionalUUID(7, Optional.ofNullable(shooterUuid)); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Arrow metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } @RequiredArgsConstructor @@ -171,7 +174,7 @@ public enum Flags { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class TippedArrow extends Arrow { public static WrappedWatchableObject color(final int color) { @@ -179,7 +182,7 @@ public static WrappedWatchableObject color(final int color) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Trident extends Arrow { public static WrappedWatchableObject loyaltyLevel(final int loyaltyLevel) { @@ -187,7 +190,7 @@ public static WrappedWatchableObject loyaltyLevel(final int loyaltyLevel) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Boat extends Entity { public static WrappedWatchableObject timeSinceLastHit(final int timeSinceLastHit) { @@ -204,22 +207,22 @@ public static WrappedWatchableObject damageTaken(final float damageTaken) { public static WrappedWatchableObject type(final Type type) { if (VERSION >= 9) return FACTORY.createWatchable(9, type.value); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Boat type metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } public static WrappedWatchableObject rightPaddleTurning(final boolean rightPaddleTurning) { if (VERSION >= 9) return FACTORY.createWatchable(10, rightPaddleTurning); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Boat right paddle turning metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } public static WrappedWatchableObject leftPaddleTurning(final boolean leftPaddleTurning) { if (VERSION >= 9) return FACTORY.createWatchable(11, leftPaddleTurning); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Boat left paddle turning metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } public static WrappedWatchableObject splashTimer(final int splashTimer) { if (VERSION >= 9) return FACTORY.createWatchable(12, splashTimer); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Boat splash timer metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } @RequiredArgsConstructor @@ -236,7 +239,7 @@ public enum Type { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class EnderCrystal extends Entity { public static WrappedWatchableObject position(final BlockPosition position) { @@ -249,25 +252,25 @@ public static WrappedWatchableObject showBottom(final boolean showBottom) { public static WrappedWatchableObject health(final int health) { if (VERSION >= 9) throw new UnsupportedOperationException( - "1.9 and later don't support Ender Crystal health metadata" + "1.9 and later don't support this metadata" ); return FACTORY.createWatchable(8, health); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Fireball extends Entity {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class WitherSkull extends Entity { public static WrappedWatchableObject invulnerable(final boolean invulnerable) { if (VERSION >= 9) return FACTORY.createWatchable(6, invulnerable); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Wither Skull invulnerable metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Fireworks extends Entity { public static WrappedWatchableObject item(final Object nmsItem) { @@ -280,19 +283,19 @@ public static WrappedWatchableObject item(final ItemStack item) { public static WrappedWatchableObject shooter(final int shooter) { if (VERSION >= 9) return FACTORY.createWatchable(6, shooter); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Wither Fireworks shooter metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } public static WrappedWatchableObject shooter(final org.bukkit.entity.Entity entity) { if (VERSION >= 9) return shooter(entity.getEntityId()); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Fireworks shooter metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Hanging extends Entity {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class ItemFrame extends Hanging { public static WrappedWatchableObject item(final Object nmsItem) { @@ -309,7 +312,7 @@ public static WrappedWatchableObject rotation(final int rotation) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Item extends Entity { public static WrappedWatchableObject item(final Object nmsItem) { @@ -321,39 +324,51 @@ public static WrappedWatchableObject item(final ItemStack item) { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Living extends Entity { + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class LivingEntity extends Entity { public static WrappedWatchableObject handStates(final HandState... handStates) { if (VERSION >= 9) { var handStateBytes = (byte) 0; for (val handState : handStates) handStateBytes |= handState.value; - return FACTORY.createWatchableObject(6, handStateBytes); + return FACTORY.createWatchableObject(VERSION >= 14 ? 7 : 6, handStateBytes); } - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Living handStates metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } public static WrappedWatchableObject health(final float health) { - return FACTORY.createWatchable(VERSION >= 9 ? 7 : 6, health); + return FACTORY.createWatchable(VERSION >= 14 ? 8 : VERSION >= 9 ? 7 : 6, health); } public static WrappedWatchableObject potionEffectColor(final int potionEffectColor) { - return FACTORY.createWatchable(VERSION >= 9 ? 8 : 7, potionEffectColor); + return FACTORY.createWatchable(VERSION >= 14 ? 9 : VERSION >= 9 ? 8 : 7, potionEffectColor); } public static WrappedWatchableObject potionEffectAmbient(final boolean potionEffectAmbient) { - return FACTORY.createWatchable(VERSION >= 9 ? 8 : 9, potionEffectAmbient); + return FACTORY.createWatchable(VERSION >= 14 ? 10 : VERSION >= 9 ? 8 : 9, potionEffectAmbient); } public static WrappedWatchableObject numberOfArrows(final int numberOfArrows) { - return FACTORY.createWatchable(VERSION >= 9 ? 10 : 9, numberOfArrows); + return FACTORY.createWatchable(VERSION >= 14 ? 11 : VERSION >= 9 ? 10 : 9, numberOfArrows); } - @Deprecated + public static WrappedWatchableObject healthAddedByAbsorption(final int healthAddedByAbsorption) { + // TODO check version + if (VERSION >= 14) return FACTORY.createWatchable(12, healthAddedByAbsorption); + throw new UnsupportedOperationException("Versions prior to 1.14 don't support this metadata"); + } + + public static WrappedWatchableObject bedLocation(final @Nullable BlockPosition bedLocation) { + // TODO check version & if nullability is correct + if (VERSION >= 14) return FACTORY.createWatchable(13, bedLocation); + throw new UnsupportedOperationException("Versions prior to 1.14 don't support this metadata"); + } + + @Deprecated // since 1.9 this is part of Insentient public static WrappedWatchableObject noAi(final boolean noAi) { if (VERSION >= 9) return noAi - ? Insentient.insentientFlags(Insentient.Flag.NO_AI) : Insentient.insentientFlags(); + ? Mob.insentientFlags(Mob.Flag.NO_AI) : Mob.insentientFlags(); return FACTORY.createWatchable(15, noAi); } @@ -368,20 +383,20 @@ public enum HandState { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Player extends Living { + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Player extends LivingEntity { public static WrappedWatchableObject additionalHearts(final float additionalHearts) { if (VERSION >= 9) return FACTORY.createWatchable(11, additionalHearts); throw new UnsupportedOperationException( - "Versions prior to 1.9 don't support Player additional hearts metadata" + "Versions prior to 1.9 don't support this metadata" ); } public static WrappedWatchableObject score(final int score) { if (VERSION >= 9) return FACTORY.createWatchable(12, score); throw new UnsupportedOperationException( - "Versions prior to 1.9 don't support Player score metadata" + "Versions prior to 1.9 don't support this metadata" ); } @@ -393,42 +408,42 @@ public static WrappedWatchableObject skinParts(final SkinPart... skinParts) { return FACTORY.createWatchableObject(13, skinPartBytes); } throw new UnsupportedOperationException( - "Versions prior to 1.9 don't support Player skin parts metadata" + "Versions prior to 1.9 don't support this metadata" ); } public static WrappedWatchableObject mainHand(final MainHand mainHand) { if (VERSION >= 9) return FACTORY.createWatchable(14, mainHand.value); throw new UnsupportedOperationException( - "Versions prior to 1.9 don't support Player main hand metadata" + "Versions prior to 1.9 don't support this metadata" ); } public static WrappedWatchableObject leftShoulderEntity(final Object leftShoulderEntityNbtTagCompound) { if (VERSION >=13) return FACTORY.createWatchableObject(15, leftShoulderEntityNbtTagCompound); throw new UnsupportedOperationException( - "Versions prior to 1.13 don't support Player left shoulder entity metadata" + "Versions prior to 1.13 don't support this metadata" ); } public static WrappedWatchableObject leftShoulderEntity(final NbtCompound leftShoulderEntityNbt) { if (VERSION >= 13) return leftShoulderEntity(leftShoulderEntityNbt.getHandle()); throw new UnsupportedOperationException( - "Versions prior to 1.13 don't support Player left shoulder entity metadata" + "Versions prior to 1.13 don't support this metadata" ); } public static WrappedWatchableObject rightShoulderEntity(final Object rightShoulderEntityNbtTagCompound) { if (VERSION >= 13) return FACTORY.createWatchableNBTTagCompound(16, rightShoulderEntityNbtTagCompound); throw new UnsupportedOperationException( - "Versions prior to 1.13 don't support Player right shoulder entity metadata" + "Versions prior to 1.13 don't support this metadata" ); } public static WrappedWatchableObject rightShoulderEntity(final NbtCompound rightShoulderEntityNbt) { if (VERSION >= 13) return rightShoulderEntity(rightShoulderEntityNbt.getHandle()); throw new UnsupportedOperationException( - "Versions prior to 1.13 don't support Player right shoulder entity metadata" + "Versions prior to 1.13 don't support this metadata" ); } @@ -455,38 +470,39 @@ public enum MainHand { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class ArmorStand extends Living { + // TODO check versions + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class ArmorStand extends LivingEntity { public static WrappedWatchableObject armorStandFlags(final Flag... flags) { var flagBytes = (byte) 0; for (val flag : flags) flagBytes |= flag.value; - return FACTORY.createWatchable(VERSION >= 9 ? 11 : 10, flagBytes); + return FACTORY.createWatchable(VERSION >= 14 ? 14 : VERSION >= 9 ? 11 : 10, flagBytes); } public static WrappedWatchableObject headRotation(final Vector3F headRotation) { - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 11, headRotation); + return FACTORY.createWatchable(VERSION >= 14 ? 15 : VERSION >= 9 ? 12 : 11, headRotation); } public static WrappedWatchableObject bodyRotation(final Vector3F bodyRotation) { - return FACTORY.createWatchable(VERSION >= 9 ? 13 : 12, bodyRotation); + return FACTORY.createWatchable(VERSION >= 14 ? 16 : VERSION >= 9 ? 13 : 12, bodyRotation); } public static WrappedWatchableObject leftArmRotation(final Vector3F leftArmRotation) { - return FACTORY.createWatchable(VERSION >= 9 ? 14 : 13, leftArmRotation); + return FACTORY.createWatchable(VERSION >= 14 ? 17 : VERSION >= 9 ? 14 : 13, leftArmRotation); } public static WrappedWatchableObject rightArmRotation(final Vector3F rightArmRotation) { - return FACTORY.createWatchable(VERSION >= 9 ? 15 : 14, rightArmRotation); + return FACTORY.createWatchable(VERSION >= 14 ? 18 : VERSION >= 9 ? 15 : 14, rightArmRotation); } public static WrappedWatchableObject leftLegRotation(final Vector3F leftLegRotation) { - return FACTORY.createWatchable(VERSION >= 9 ? 16 : 15, leftLegRotation); + return FACTORY.createWatchable(VERSION >= 14 ? 19 : VERSION >= 9 ? 16 : 15, leftLegRotation); } public static WrappedWatchableObject rightLegRotation(final Vector3F rightLegRotation) { - return FACTORY.createWatchable(VERSION >= 9 ? 17 : 16, rightLegRotation); + return FACTORY.createWatchable(VERSION >= 14 ? 20 : VERSION >= 9 ? 17 : 16, rightLegRotation); } @RequiredArgsConstructor @@ -501,8 +517,8 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Insentient extends Living { + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Mob extends LivingEntity { public static WrappedWatchableObject insentientFlags(final Flag... flags) { if (VERSION >= 9) { @@ -527,11 +543,11 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Ambient extends Insentient {} + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class AmbientCreature extends Mob {} - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Bat extends Ambient { + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Bat extends AmbientCreature { public static WrappedWatchableObject batFlags(final Flag... flags) { var flagBytes = (byte) 0; @@ -549,17 +565,17 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Creature extends Insentient {} + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class PathfinderMob extends Mob {} - @NoArgsConstructor(access = AccessLevel.NONE) - public static class WaterMob extends Creature {} + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class WaterAnimal extends PathfinderMob {} - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Squid extends WaterMob {} + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Squid extends WaterAnimal {} - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Dolphin extends WaterMob { + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Dolphin extends WaterAnimal { public static WrappedWatchableObject treasurePosition(final BlockPosition treasurePosition) { return FACTORY.createWatchable(12, treasurePosition); @@ -574,18 +590,18 @@ public static WrappedWatchableObject hasFish(final boolean hasFish) { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Fish extends WaterMob { + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Fish extends WaterAnimal { public static WrappedWatchableObject fromBucket(final boolean fromBucket) { return FACTORY.createWatchable(12, fromBucket); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Cod extends Fish {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class PufferFish extends Fish { public static WrappedWatchableObject puffState(final int puffState) { @@ -593,10 +609,10 @@ public static WrappedWatchableObject puffState(final int puffState) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Salmon extends Fish {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class TropicalFish extends Fish { public static WrappedWatchableObject variant(final int variant) { @@ -604,18 +620,18 @@ public static WrappedWatchableObject variant(final int variant) { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Ageable extends Creature { + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Ageable extends PathfinderMob { public static WrappedWatchableObject baby(final boolean baby) { return FACTORY.createWatchable(12, baby); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Animal extends Ageable {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class AbstractHorse extends Animal { public static WrappedWatchableObject horseFlags(final Flag... flags) { @@ -657,13 +673,13 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Horse extends AbstractHorse { @Deprecated public static WrappedWatchableObject horseType(final Type horseType) { if (VERSION >= 9) throw new UnsupportedOperationException( - "Versions 1.9 and later don't support Horse type metadata" + "Versions 1.9 and later don't support this metadata" ); return FACTORY.createWatchable(19, horseType.value); } @@ -729,13 +745,13 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class ZombieHorse extends AbstractHorse {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class SkeletonHorse extends AbstractHorse {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class ChestedHorse extends AbstractHorse { public static WrappedWatchableObject chest(final boolean chest) { @@ -744,10 +760,10 @@ public static WrappedWatchableObject chest(final boolean chest) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Donkey extends ChestedHorse {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Llama extends ChestedHorse { public static WrappedWatchableObject strength(final int strength) { @@ -774,10 +790,10 @@ public enum Variant { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Mule extends ChestedHorse {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Pig extends Animal { public static WrappedWatchableObject saddle(final boolean saddle) { @@ -786,11 +802,11 @@ public static WrappedWatchableObject saddle(final boolean saddle) { public static WrappedWatchableObject boostTime(final int boostTime) { if (VERSION >= 9) return FACTORY.createWatchable(14, boostTime); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Pig boost time metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Rabbit extends Animal { public static WrappedWatchableObject type(final int type) { @@ -798,7 +814,7 @@ public static WrappedWatchableObject type(final int type) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Turtle extends Animal { public static WrappedWatchableObject home(final BlockPosition home) { @@ -826,7 +842,7 @@ public static WrappedWatchableObject travelling(final boolean travelling) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class PolarBear extends Animal { public static WrappedWatchableObject standingUp(final boolean standingUp) { @@ -834,7 +850,7 @@ public static WrappedWatchableObject standingUp(final boolean standingUp) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Sheep extends Animal { public static WrappedWatchableObject sheepData(final byte color, final boolean sheared) { @@ -842,7 +858,7 @@ public static WrappedWatchableObject sheepData(final byte color, final boolean s } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Tameable extends Animal { public static WrappedWatchableObject tameableFlags(final Flag... flags) { @@ -867,7 +883,7 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Ocelot extends Tameable { public static WrappedWatchableObject variant(final Variant variant) { @@ -886,7 +902,7 @@ public enum Variant { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Wolf extends Tameable { public static WrappedWatchableObject damageTaken(final float damageTaken) { @@ -902,7 +918,7 @@ public static WrappedWatchableObject collarColor(final byte collarColor) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Parrot extends Tameable { public static WrappedWatchableObject variant(final Variant variant) { @@ -922,12 +938,12 @@ public enum Variant { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Villager extends Ageable { public static WrappedWatchableObject profession(final Profession profession) { if (VERSION >= 9) throw new UnsupportedOperationException( - "1.9 and later don't support Villager profession metadata" + "1.9 and later don't support this metadata" ); return FACTORY.createWatchable(13, profession.value); } @@ -945,10 +961,10 @@ public enum Profession { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Golem extends Creature {} + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Golem extends PathfinderMob {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class IronGolem extends Golem { public static WrappedWatchableObject ironGolemFlags(final Flag... flags) { @@ -967,7 +983,7 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Snowman extends Golem { public static WrappedWatchableObject snowmanFlags(final Flag... flags) { @@ -977,7 +993,7 @@ public static WrappedWatchableObject snowmanFlags(final Flag... flags) { return FACTORY.createWatchable(12, flagBytes); } - throw new UnsupportedOperationException("Versions lower than 1.9 don't support Snowman flags metadata"); + throw new UnsupportedOperationException("Versions lower than 1.9 don't support this metadata"); } @RequiredArgsConstructor @@ -989,7 +1005,7 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Shulker extends Golem { public static WrappedWatchableObject facing(final Object enumDirection) { @@ -1013,10 +1029,10 @@ public static WrappedWatchableObject color(final byte color) { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Monster extends Creature {} + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Monster extends PathfinderMob {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Blaze extends Monster { public static WrappedWatchableObject blazeFlags(final Flag... flags) { @@ -1035,7 +1051,7 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Creeper extends Monster { public static WrappedWatchableObject creeperState(final State state) { @@ -1048,7 +1064,7 @@ public static WrappedWatchableObject charged(final boolean charged) { public static WrappedWatchableObject ignited(final boolean ignited) { if (VERSION >= 9) return FACTORY.createWatchable(14, ignited); - throw new UnsupportedOperationException("Versions lower than 1.9 don't support Creeper ignited metadata"); + throw new UnsupportedOperationException("Versions lower than 1.9 don't support this metadata"); } @RequiredArgsConstructor @@ -1061,13 +1077,13 @@ public enum State { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Endermite extends Monster {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class GiantZombie extends Monster {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Guardian extends Monster { public static WrappedWatchableObject retractingSpikes(final boolean retractingSpikes) { @@ -1092,13 +1108,13 @@ public static WrappedWatchableObject targetEntity(final org.bukkit.entity.Entity } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class ElderGuardian extends Guardian {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Silverfish extends Monster {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Illager extends Monster { public static WrappedWatchableObject illagerState(final State state) { @@ -1114,10 +1130,10 @@ public enum State { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class VindicatorIllager extends Illager {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class SpellcasterIllager extends Illager { public static WrappedWatchableObject spell(final Spell spell) { @@ -1136,13 +1152,13 @@ public enum Spell { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class EvocationIllager extends SpellcasterIllager {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class IllusionIllager extends SpellcasterIllager {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Vex extends Monster { public static WrappedWatchableObject vexFlags(final Flag... flags) { @@ -1161,10 +1177,10 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class EvocationFangs extends Entity {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class AbstractSkeleton extends Monster { public static WrappedWatchableObject swingingArms(final boolean swingingArms) { @@ -1172,16 +1188,16 @@ public static WrappedWatchableObject swingingArms(final boolean swingingArms) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Skeleton extends AbstractSkeleton {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class WitherSkeleton extends AbstractSkeleton {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Stray extends AbstractSkeleton {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Spider extends Monster { public static WrappedWatchableObject spiderFlags(final Flag... flags) { @@ -1200,7 +1216,7 @@ public enum Flag { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Witch extends Monster { public static WrappedWatchableObject drinkingPotion(final boolean drinkingPotion) { @@ -1208,7 +1224,7 @@ public static WrappedWatchableObject drinkingPotion(final boolean drinkingPotion } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Wither extends Monster { public static WrappedWatchableObject centerHeadTarget(final int centerHeadTargetId) { @@ -1240,7 +1256,7 @@ public static WrappedWatchableObject invulnerableTime(final int invulnerableTime } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Zombie extends Monster { public static WrappedWatchableObject baby(final boolean baby) { @@ -1255,19 +1271,19 @@ public static WrappedWatchableObject zombieVillager(final boolean zombieVillager public static WrappedWatchableObject handsUp(final boolean handsUp) { if (VERSION >= 9) return FACTORY.createWatchable(14, handsUp); else throw new UnsupportedOperationException( - "Versions prior to 1.9 don't support Zombie hands up flag metadata" + "Versions prior to 1.9 don't support this metadata" ); } public static WrappedWatchableObject becomingDrowned(final boolean becomingDrowned) { if (VERSION >= 13) return FACTORY.createWatchable(15, becomingDrowned); else throw new UnsupportedOperationException( - "Versions prior to 1.13 don't support Zombie becoming drowned flag metadata" + "Versions prior to 1.13 don't support this metadata" ); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class ZombieVillager extends Zombie { public static WrappedWatchableObject converting(final boolean converting) { @@ -1279,30 +1295,30 @@ public static WrappedWatchableObject profession(final Villager.Profession profes } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Husk extends Zombie {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Drowned extends Zombie {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Enderman extends Monster { public static WrappedWatchableObject carriedBlock(final Object carriedBlock) { if (VERSION >= 9) return FACTORY.createWatchableOptionalIBlockData(12, Optional.of(carriedBlock)); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Enderman carriedBlock metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } public static WrappedWatchableObject carriedBlockId(final short carriedBlockId) { if (VERSION >= 9) throw new UnsupportedOperationException( - "Versions 1.9 and later don't support Enderman carried block ID metadata" + "Versions 1.9 and later don't support this metadata" ); return FACTORY.createWatchable(16, carriedBlockId); } public static WrappedWatchableObject carriedBlockData(final byte carriedBlockData) { if (VERSION >= 9) throw new UnsupportedOperationException( - "Versions 1.9 and later don't support Enderman carried block data metadata" + "Versions 1.9 and later don't support this metadata" ); return FACTORY.createWatchable(17, carriedBlockData); } @@ -1312,12 +1328,12 @@ public static WrappedWatchableObject screaming(final boolean screaming) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class EnderDragon extends Monster { public static WrappedWatchableObject phase(final Phase phase) { if (VERSION >= 9) return FACTORY.createWatchable(12, phase.value); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Ender Dragon phase metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } @RequiredArgsConstructor @@ -1339,10 +1355,10 @@ public enum Phase { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Flying extends Insentient {} + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Flying extends Mob {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Ghast extends Flying { public static WrappedWatchableObject attacking(final boolean attacking) { @@ -1350,7 +1366,7 @@ public static WrappedWatchableObject attacking(final boolean attacking) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Phantom extends Flying { public static WrappedWatchableObject size(final int size) { @@ -1358,18 +1374,18 @@ public static WrappedWatchableObject size(final int size) { } } - @NoArgsConstructor(access = AccessLevel.NONE) - public static class Slime extends Insentient { + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Slime extends Mob { public static WrappedWatchableObject size(final int size) { return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, size); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class LlamaSpit extends Entity {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Minecart extends Entity { public static WrappedWatchableObject shakingPower(final int shakingPower) { @@ -1397,19 +1413,19 @@ public static WrappedWatchableObject showCustomBlock(final boolean showCustomBlo } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class MinecartRideable extends Minecart {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class MinecartContainer extends Minecart {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class MinecartHopper extends Minecart {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class MinecartChest extends Minecart {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class MinecartFurnace extends Minecart { public static WrappedWatchableObject powered(final boolean powered) { @@ -1417,32 +1433,32 @@ public static WrappedWatchableObject powered(final boolean powered) { } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class MinecartTnt extends Minecart {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class MinecartSpawner extends Minecart {} - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class MinecartCommandBlock extends Minecart { - + public static WrappedWatchableObject command(final String command) { if (VERSION >= 9) return FACTORY.createWatchable(12, command); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Minecart Command Block command metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } - + public static WrappedWatchableObject lastOutput(final WrappedChatComponent lastOutput) { if (VERSION >= 9) return FACTORY.createWatchable(13, lastOutput); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support Minecart Command Block last output metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } } - @NoArgsConstructor(access = AccessLevel.NONE) + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class TNTPrimed extends Entity { public static WrappedWatchableObject fuseTime(final int fuseTime) { if (VERSION >= 9) return FACTORY.createWatchable(6, fuseTime); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support TNT Primed fuse time metadata"); + throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } } } From 47749ab3fd964e4e3f20f9d472bb4da8e8297cdf Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Sat, 23 Jan 2021 18:11:24 +0300 Subject: [PATCH 424/508] chore: use PacketWrapper from GitHub Package registry --- .github/workflows/build.yml | 4 ---- .github/workflows/deploy-release.yml | 4 ---- .github/workflows/deploy-snapshot.yml | 4 ---- .github/workflows/test.yml | 4 ---- .gitmodules | 4 ---- build-submodules.sh | 18 ------------------ dependencies/PacketWrapper | 1 - fake-entity-lib/pom.xml | 4 ++-- minecraft-commons/pom.xml | 4 ++-- pom.xml | 23 ++++++++++++----------- 10 files changed, 16 insertions(+), 54 deletions(-) delete mode 100644 .gitmodules delete mode 100755 build-submodules.sh delete mode 160000 dependencies/PacketWrapper diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3da151435..1c3a316ba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,10 +22,6 @@ jobs: key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-maven- - # This is a temporary workaround until stable PacketWrapper Legacy support is not merged into upstream - - name: Build submodules - run: ./build-submodules.sh - - name: Build with Maven run: mvn -B package diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index d2d1dd9c1..10a2ccaf2 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -23,10 +23,6 @@ jobs: key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-maven- - # This is a temporary workaround until stable PacketWrapper Legacy support is not merged into upstream - - name: Build submodules - run: ./build-submodules.sh - - name: Import GPG signing key run: | echo -e "${{ secrets.CODE_SIGNING_GPG_PRIVATE_KEY }}" | gpg --batch --import diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index cb561de68..b0e641660 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -23,10 +23,6 @@ jobs: key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-maven- - # This is a temporary workaround until stable PacketWrapper Legacy support is not merged into upstream - - name: Build submodules - run: ./build-submodules.sh - - name: Import GPG signing key run: | echo -e "${{ secrets.CODE_SIGNING_GPG_PRIVATE_KEY }}" | gpg --batch --import diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 33928e925..8cac08642 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,9 +22,5 @@ jobs: key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} restore-keys: ${{ runner.os }}-maven- - # This is a temporary workaround until stable PacketWrapper Legacy support is not merged into upstream - - name: Build submodules - run: ./build-submodules.sh - - name: Build with Maven run: mvn -B test diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index b7ab233a8..000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "PacketWrapper"] - path = dependencies/PacketWrapper - url = git://github.com/JarvisCraft/PacketWrapper - branch = legacy-support diff --git a/build-submodules.sh b/build-submodules.sh deleted file mode 100755 index 01f28b52e..000000000 --- a/build-submodules.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/env bash - -readonly ROOT_DIRECTORY=$(pwd) - -# Make sure that submodules are initialized -git submodule update --init --recursive - -function install_dependency() { - cd "$1" || exit - mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -B -V - cd "$ROOT_DIRECTORY" || exit -} - -echo 'Building submodule dependencies' - -install_dependency "dependencies/PacketWrapper/PacketWrapper" - -echo 'Submodule dependencies have been built' diff --git a/dependencies/PacketWrapper b/dependencies/PacketWrapper deleted file mode 160000 index 66ce68d19..000000000 --- a/dependencies/PacketWrapper +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 66ce68d19d64e530cd929940de1bad557d320443 diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index 2520091b6..c2172f700 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -26,8 +26,8 @@ ProtocolLib - com.comphenix.packetwrapper - PacketWrapper + ru.progrm-jarvis.minecraft + packet-wrapper ru.progrm-jarvis diff --git a/minecraft-commons/pom.xml b/minecraft-commons/pom.xml index 6618a9b0c..1e4b00580 100644 --- a/minecraft-commons/pom.xml +++ b/minecraft-commons/pom.xml @@ -30,8 +30,8 @@ reflector - com.comphenix.packetwrapper - PacketWrapper + ru.progrm-jarvis.minecraft + packet-wrapper org.spigotmc diff --git a/pom.xml b/pom.xml index af9f8e539..85f0c7f0b 100644 --- a/pom.xml +++ b/pom.xml @@ -71,26 +71,27 @@ - - sonatype-snapshot-repo + sonatype-ossrh https://oss.sonatype.org/content/repositories/snapshots - - minecraft-repo + minecraft-libraries https://libraries.minecraft.net/ - - spigotmc-repo + spigotmc https://hub.spigotmc.org/nexus/content/groups/public/ - - dmulloy2-repo + dmulloy2 https://repo.dmulloy2.net/nexus/repository/public/ + + + packet-wrapper-repo + https://maven.pkg.github.com/JarvisCraft/PacketWrapper + @@ -219,9 +220,9 @@ 1.5.21 - com.comphenix.packetwrapper - PacketWrapper - 1.16.4-R0.1-SNAPSHOT + ru.progrm-jarvis.minecraft + packet-wrapper + 1.16.4-SNAPSHOT commons-io From d71f6b7e2c052727be133978e8847132e743ac3e Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Sat, 23 Jan 2021 18:30:59 +0300 Subject: [PATCH 425/508] ci: provide credentials for using GitHub Package Registry for packet-wrapper --- .../maven/github-package-registry-settings.xml | 5 +++++ .github-actions/maven/minimal-settings.xml | 11 +++++++++++ .github-actions/maven/sonatype-ossrh-settings.xml | 5 +++++ .github/workflows/build.yml | 5 ++++- .github/workflows/deploy-release.yml | 2 ++ .github/workflows/deploy-snapshot.yml | 2 ++ .github/workflows/test.yml | 5 ++++- pom.xml | 2 +- 8 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 .github-actions/maven/minimal-settings.xml diff --git a/.github-actions/maven/github-package-registry-settings.xml b/.github-actions/maven/github-package-registry-settings.xml index 593660a0e..7ff290af7 100644 --- a/.github-actions/maven/github-package-registry-settings.xml +++ b/.github-actions/maven/github-package-registry-settings.xml @@ -2,6 +2,11 @@ + + packet-wrapper + ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME} + ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN} + github-package-registry ${env.GITHUB_PACKAGE_REGISTRY_DEPLOYER} diff --git a/.github-actions/maven/minimal-settings.xml b/.github-actions/maven/minimal-settings.xml new file mode 100644 index 000000000..535c45ede --- /dev/null +++ b/.github-actions/maven/minimal-settings.xml @@ -0,0 +1,11 @@ + + + + + packet-wrapper + ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME} + ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN} + + + diff --git a/.github-actions/maven/sonatype-ossrh-settings.xml b/.github-actions/maven/sonatype-ossrh-settings.xml index 680538615..28678f791 100644 --- a/.github-actions/maven/sonatype-ossrh-settings.xml +++ b/.github-actions/maven/sonatype-ossrh-settings.xml @@ -2,6 +2,11 @@ + + packet-wrapper + ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME} + ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN} + sonatype-ossrh ${env.SONATYPE_OSSRH_DEPLOYER} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1c3a316ba..549767cd1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,7 +23,10 @@ jobs: restore-keys: ${{ runner.os }}-maven- - name: Build with Maven - run: mvn -B package + env: + PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME: JarvisCraft + PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: mvn -B package -s ./.github-actions/maven/minimal-settings.xml - name: Upload artifacts uses: actions/upload-artifact@v2 diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 10a2ccaf2..27a7699b9 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -30,6 +30,8 @@ jobs: - name: Deploy snapshot env: + PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME: JarvisCraft + PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index b0e641660..17b76aeb8 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -30,6 +30,8 @@ jobs: - name: Deploy snapshot env: + PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME: JarvisCraft + PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8cac08642..50ca66969 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,4 +23,7 @@ jobs: restore-keys: ${{ runner.os }}-maven- - name: Build with Maven - run: mvn -B test + env: + PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME: JarvisCraft + PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: mvn -B test -s ./.github-actions/maven/minimal-settings.xml diff --git a/pom.xml b/pom.xml index 85f0c7f0b..32da8e5d2 100644 --- a/pom.xml +++ b/pom.xml @@ -89,7 +89,7 @@ - packet-wrapper-repo + packet-wrapper https://maven.pkg.github.com/JarvisCraft/PacketWrapper From 88399380c95b8907a48e41c178f0608974b89fbd Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Sat, 23 Jan 2021 18:42:23 +0300 Subject: [PATCH 426/508] docs: fix issues in javadocs of lib-loader --- .../java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java | 1 + .../java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java | 1 + 2 files changed, 2 insertions(+) diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java index 2f7f9d84b..f824bec75 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibCoords.java @@ -31,6 +31,7 @@ public interface LibCoords { * Opens stream for accessing library artifact. * * @return URL of the artifact containing dependency classes + * @throws IOException if an IO-error occurs while opening stream * * @apiNote returned stream must be manually closed * @apiNote should call{@link #assureIsRefreshed()} before all logic diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java index 1defdc232..f8d591c90 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java @@ -331,6 +331,7 @@ public static String readLineFromUrl(final URL url) throws IOException { * The input stream will be closed after the operation (even if it exits with an exception). * * @param inputStream input stream from which to get the file + * @param file file to which to read read data * @throws IOException if an exception occurs in an I/O operation */ public static void loadFromInputStreamClosing(final InputStream inputStream, final File file) throws IOException { From bc480ae0697a91d888ceb6a8aaa2e6f80b2bae47 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Sat, 23 Jan 2021 19:08:52 +0300 Subject: [PATCH 427/508] chore: simplify auto-closing in LibLoader --- .../minecraft/libloader/LibLoader.java | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java index f8d591c90..28fedd1fc 100644 --- a/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java +++ b/lib-loader/src/main/java/ru/progrm_jarvis/minecraft/libloader/LibLoader.java @@ -3,6 +3,7 @@ import lombok.*; import lombok.experimental.Accessors; import lombok.experimental.FieldDefaults; +import lombok.extern.java.Log; import java.io.*; import java.lang.invoke.MethodHandle; @@ -18,11 +19,11 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Logger; /** * A tiny loader of JAR dependencies to runtime. */ +@Log @ToString @EqualsAndHashCode @RequiredArgsConstructor @@ -30,11 +31,6 @@ @FieldDefaults(level = AccessLevel.PRIVATE) public class LibLoader { - /** - * Default logger to use if no other was specified for the lib loader instance - */ - private static final Logger DEFAULT_LOGGER = Logger.getLogger("LibLoader"); - /** * Method handle of {@code URLClassLoader.addURL(URL)} */ @@ -50,11 +46,6 @@ public class LibLoader { */ @NonNull private final File rootDirectory; - /** - * Logger for external usage - */ - @Getter @Setter @NonNull private Logger log = DEFAULT_LOGGER; - final @NonNull Map loadedLibs; // creates a MethodHandle object for URLClassLoader#addUrl(URL) method @@ -249,7 +240,9 @@ public File loadLib(final @NonNull String name, final @NonNull LibCoords libCoor if (!artifactFile.isFile() || !hashFile.isFile() || !Files.lines(hashFile.toPath()).findFirst().equals(hash)) { { log.info("Downloading library " + name); - loadFromInputStreamClosing(libCoords.openArtifactStream(), artifactFile); + try (val stream = libCoords.openArtifactStream()) { + loadFromInputStream(stream, artifactFile); + } } Files.write(hashFile.toPath(), hash.orElse("").getBytes(StandardCharsets.UTF_8)); } @@ -328,17 +321,12 @@ public static String readLineFromUrl(final URL url) throws IOException { /** * Loads a file from input stream to file specified. - * The input stream will be closed after the operation (even if it exits with an exception). * * @param inputStream input stream from which to get the file * @param file file to which to read read data * @throws IOException if an exception occurs in an I/O operation */ - public static void loadFromInputStreamClosing(final InputStream inputStream, final File file) throws IOException { - try { - Files.copy(inputStream, file.toPath(), StandardCopyOption.REPLACE_EXISTING); - } finally { - inputStream.close(); - } + public static void loadFromInputStream(final InputStream inputStream, final File file) throws IOException { + Files.copy(inputStream, file.toPath(), StandardCopyOption.REPLACE_EXISTING); } } From 99d084bb44f48fc03121a642f9c29ab4249e4a51 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Sat, 23 Jan 2021 19:23:39 +0300 Subject: [PATCH 428/508] build(deployment): remove redundant non-profile distributionManagement tag --- pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pom.xml b/pom.xml index 32da8e5d2..3ae48bb77 100644 --- a/pom.xml +++ b/pom.xml @@ -63,13 +63,6 @@ 3.7.7 - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - sonatype-ossrh From 92b6d893c5c59254e21dc5ee9aa19033c120a526 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Sat, 23 Jan 2021 19:31:58 +0300 Subject: [PATCH 429/508] build(deployment): fix GH Package Registry coordinates --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 32da8e5d2..74cba0de8 100644 --- a/pom.xml +++ b/pom.xml @@ -395,7 +395,7 @@ github-package-registry - https://maven.pkg.github.com/JarvisCraft/padla + https://maven.pkg.github.com/JarvisCraft/minecraft-utils From 988e609cbf318eeb78f4c6c8b1a38bb97d6a62eb Mon Sep 17 00:00:00 2001 From: PROgrm_JARvis Date: Mon, 25 Jan 2021 23:55:38 +0300 Subject: [PATCH 430/508] chore: remove no longer used `.travis` directory --- .travis/.mvn/settings.xml | 26 -------------------------- .travis/gpg/codesigning.asc.enc | Bin 9536 -> 0 bytes .travis/perform-deploy.sh | 15 --------------- 3 files changed, 41 deletions(-) delete mode 100644 .travis/.mvn/settings.xml delete mode 100644 .travis/gpg/codesigning.asc.enc delete mode 100755 .travis/perform-deploy.sh diff --git a/.travis/.mvn/settings.xml b/.travis/.mvn/settings.xml deleted file mode 100644 index c122c0aef..000000000 --- a/.travis/.mvn/settings.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - ossrh - ${env.OSSRH_JIRA_USERNAME} - ${env.OSSRH_JIRA_PASSWORD} - - - - - - ossrh-env-credentials - - gpg - ${env.GPG_KEY_NAME} - ${env.GPG_KEY_PASSPHRASE} - - - - \ No newline at end of file diff --git a/.travis/gpg/codesigning.asc.enc b/.travis/gpg/codesigning.asc.enc deleted file mode 100644 index 00d3c833fce9a8abd346a60ccab95cbc5c0fd367..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9536 zcmV-GCBNEJVQh3|WM5y`#W$0nCDLwtowEc<%(a~^`;CZbn~&u%{pbR-t@!F~gcHX} zkxsi|^mv_@4K;ulC6m3gz0s7J^jDyZ7_SnIAa!XSA=9+Q>RzNN_-n9FVqITmx7?bF zhx|O}YvEx4Yd9>mTWYJQUE2hbTlT2TkF?m(tL)R0k!YT$%v9D@VzftZbxho{{4Icu z^VHhG3HdA~&Rs#XklKDw%|%~7Y3MU-AsWOvYzmaWba{wi@KG2yUCYabU> z+&V{MO%SW?N zK4dOWi~0)P*=FPl)Og$=lN@Fkm|`#uALoJz0BKja1rZ$mMjVw7Z1As|ZWcET36ky2 z(6B|sotOjwmYYn@$3tZVne$RM3V{o?dZ<=(_kIhj`cJMGxj=w%d;>^+B?Z;BbLZbCMN z^kM^RPBV0&LFlJ(w5Tn&VSG1HN3G(0BlaSvLGoL;KPqr|6kOCY56xJW%G1y~bdV~V z{hobLh9Fsw;wz`p66hP(LApqh{ZO(UP7UkbsfcXr-RwZetN=8w^#4zGKH9x=#Du(c ze3=%DP-ca~#KkPSlFpY*dsh3V9WejDoU|y>i7LH=>r2ry7^ipea+6Q2j#QTvlH<-j z?*+)o1^Y^T$37PgET$Df4T9rH1dbq3Bjb@WLK@34RUa{Vl?ME1fy?T(q9S9{OA0qUMk3%= zs-$BTAL76^k{jJa+{RqraWp@X&Vb7vZ!GupoSr%(&cvUq>boZDrkkL=by0ob##dek zYSyYY8X76Lh$3#TjDqJ<#!!FS8L{~YFox9vRe{RL=uqx6Glas%ArxIuTJ`6igU`zj z18+z>5I$>Agx1NDhe^wU274#|VA`BLgSaMOdq36&l@}$&r_W#WgaFT>w+R8Q@D+4X zRBrY(tAtfdG)yPCrPWae#nFtIzj%h)OVS8_bp~Z?E}{)`mte|~LDEZXBthKi^hNl1 zPpU%T^0(s5l36aQaqnwC63~l@6;(H9=QU|PO%OfotoKGIO}oVMsvmc59b8kkJ&GA$ z5g~?~{`nf36Qk}Hi2!e*F2mD*&d|P?A4Tbc{P>yG4HHqy6MJCg&PGL=Ft#l z1U`jpqF*}tho$?_gOfP!M8tkd(R7Z`BMsj~exyoeGUexR!pzYVjp1v#v-6$~(}NWc zJ19?$R)J=HJ86T#CkIB?(89H*{a?mqS{j4!R5u8eFWCy;&BLN){p7PaZFME1gSgMid>f)#md0WLGkL)ZEPO(D*-H5*Vnu z0*)@GXuX@-8$lXuF^W-N>m;!(hkrdQb8!|`S;BcHR0>@;uLx)ur`|4$*khd7!pwTb zP&a_I!#E8ARgn$s8Ud=DSqMeCAa!4!?`+ytWDT{;Bd?;PfVgs~d5pIk>HixjnD`4K zCYK_3HrfIGC#@;SF!AE^;=4AtKMC@IsViOnhbp;k3qA(resgv0i_qy^7_7)7RYqfi-%sa(DPIBx#R$*r9L>i&i z;(^f%^PsZGK_rF`Y>x%n2$6fHPjIhncWaBv@A)9$`0_NK+>z_f@2wIT@(z4?zZSdL z{F5yy&noPY(W&)Cy9ht&7z%fH*|< z+>v?cf33R-?TJSmiGx{ulB~u?y0W}3@|5lWEbWS-o3GIe)Mi&d3VQ@Tam|@;+REO)$ z1a&_g+XYh}a*5-p-)_ukUMATi6$d!9vmVo>dNsFzp;PTp#H7)PjrBXh@7!vBK9YPE z`)JKbS{vcFxbd7$#=C|jsuPFIW=}+n0+3*3>Eg@b$i@gY(CrvIP8;_kaViMnYyFS= z+}wF@uu_TPGcCt*Z)*^ze?eyoiBVrj(=Hhv))5H>;A&B@9yBQKs~~odMH(X$COXAV zi?+7Pd+<@Mp|TJzh|>FOtZTsHVtQwbHh947E{E`(cXl!R|371BEKY_yg2_N>FfsMR zso)yt(oz}JceP>^F7VSU_Nl8#&6aUsIasEAz1O@Yhtp%FAx&h<6&T4w0~6WC=nTVl zDMb)4ACyZJQtuw!F zY*>Byzr#Zy4J5Cl$QhN_%U^=wS#Es>w`H3D7I7`sCjX-?Kpi{aVUfGk%H=ZrT6$|z zI#EOJTBhT0%bu^o$LMQ+R!@=YdXzSg4cZCJ_u1HW=~aY*O2Y`Zg&_;l>8#Mve(l`x zB3^#6@%o(_Qo^{Go<;>jliyiQL_-3Xl|{`=MViM#2 z9QOj*5`On-*K)?`md@3Mt0I?vL*RR>d>{gh;5YREf`l4rCaW7oAOpRr#7YDP@D+|C zRrOBEC`0B$Mu`GMb^9#A&7%p|;=?YX7=Wx@SKwn$-VHKMAnmM+IxI~_c^Tdmb@lLY z;=`RH-uMbT1Km;J9bDks&Iz#a(r<@|Av82Z(uVyZKYl}nq@>P(EmbO%ca1Q-riIWR z#$jujEO~UqXf!XmG3@#(993eaiCa!{(?xKzDP_RYX$6VP(v3Z0c&6_1G*zJ3gMRBG zKo)ok{pTpQ5&Fx4mZUB25D=U(R^&8!OIo$d@}LPiYljE3X&r{?Vx9MCB5cXJjajgy zm1<4tf0U+`<6a)Z%bpWPebV&OI5e)*>=gJt{iXmNWTpF(&2S>`y*NcixGVOI8BZ^Q zq}%nU!voFY0~rsmTNHnttMshrYo{L9 zj6}6`VeWpE4lLjBnzJmoWjQD>ToBUm+n#N(7P>#vmLn)@OMI*X2%ur4&v&%!pQsp- zUsP=o5HYr3pSMvkW>UBA!;Lmf>qASOdDn@MW)gB>v3{QZsLueeva?K4#o2{i{O55Fy#BC~_ov;Y>08|>zAlmr>Y({~7K(6yCG(5`org-bIo$qy5HFX}P>Kw^ z(>@1#Yl};jnm4v#54G&Z4h23!DThFGT25FKXtK{I-C-b?U~XI2fQwN*1o;tH(IBtn zX$-&*?Vf5vWR1QdSHQ7_-!(#%*OkW3@b|6=NOvf~gVrpUaNmLCJ%Y<{6!+^kkI z{xZ=TMjf1BCyA!+whv1qcL|Soj~irwH!X>@mHF*qR#RhU0*}d;g^$T9Re zKA(BwV0`29SBrO|mF7`n2yWMXUr>{0Jt7Kqg%Qsf=-5!zt88*;nn(uhkIYH1A=|E5 zH#7^fE8y{pI>?D^sgVCRJ^lSjIE`( z6KyD3hU6i4mG+f-S9cNy16d=)K|@rGsjYM} zQh6Du0{zVwY^AgjxHj?M4d8fwdg~nz%|NlHsE2&RyG`IZ3xcaQ$WLpGDZFPtxt81~ z-(lCtBwFn47fQ$Y&-uN`g->zHtq651K#L?W9Nf|Y>~GrS^?t5!Y{I&eavpGu^@{Sdl0v5I zc@iai+K`weV9gYvYIi?+F4t3pMqA%ks-W|P^`!6}Y`AK47$eoIo#X;V*zFC5HRlb2 zV;FpxuJHQE{d+xdzzu1EwnaC|#ilk?g zb{~07i1f7{pX&JJ|1Wy<{AQ==A8+k3%z>k;{{YzRO0bk|3ko^{n>y_z23mej1f(H< zM{QM588Y+6;KL%WpW!m2a|gYPNhap0->_mte*h=AGgM0fbP3=V?R!)nNUpG)d0AKimmPN5xy7Ld#gzGD=f=rYeq5!ZZ4AhE{@MYbnq$N`1sFFUIUf<-e>p z#m*0|S)*ehqzMhcc;hat*dPpgW%J3bL9KJ~|0w__B76-;lSjAP3fNlZ4h_0t2Shpy zL}#lWfdPm!vXmE7g+)l`+jz!o`9>6UCWO5{`Iad6%@Hb@Wpz2QhU=2ke_kI{`i}vzm@z;@>8UE{(NK z$oikN$Lsdoy(eC(UUNvJ(``dQ$Y7x7c1gMVe#Z>w1kI`+=LIc={)tyU*9Oga3*tQ!etDjH zIQ9gn%f(Emd$?I9(kV}w3Wb73&SwWr1t!y8K!LhfA$AS+KhK-Vvc9&b3BHn@0?+o$ zSlZcFXF#gVghnaWS%%P(76_o^)9mzSk@*g8zNu|jSS__4x6Gl~j2hP!^sYX*oZ-h- zV^7uWMn)Rh1a#)MGR)J4%lolUPEPr{A*khyIV1=ou~-6S6ybmBMJm6{J)ws)5ere1kYybak|HN%dy_81S5LIQ+p!(Rq>Y+O<)5^H?v= zgzSO`(gA*4LA$CRtFV97$=BBNdsjspLA;%!lJ|PZgMX1*Nc@j3cPZBSS5|TVU|L^+ zY6X1_Sj!ND^JB%cRFGFK6Atu!p5wQ-FrKU|9OB)skzwmOCp!GL8v;aDr&6*5h-H$1 zvTbA~{jAWHMD&|AK4Ck8Bfws*M;kvNHn`7v1{ce#R=%W|?r5wjEC{-CMyk>SZEo5r zW-g>kaW_C7T!c;YH+G3~%2PZauX@&!gx;r0{7wIsmZ{=@B^o4hWs#!lB%M`7&S;JW`t$(m+C!b zDF75P^3`nTRJnO3n-shb3jMn(f4-&;sM)*BI&#{oQR5Xb>6rvcdD0 zSnJNbo;aQGp<{PFa28>N_CA1gASQN*`SqI{+%D^ci_~fAq7%N5;m^03iDN6P5W-Rb zUJx+06wc_L@FXDDu`#3>RbIS}7WpM1ZIc8Tv_|pJlrAk3`d2k38i&^o7ctuVkXj1npD-YDNorN3`453)B*?jMtLGgujYT5%GaT!{ zWggj~VY8)8yb0M>#di6Bh{~SpZFveSHPre!*18d=2$`qxtWis{xHL0$es0rq%yGlC z=;C+w`<4>tO%@dWrV4%V*5D;?VZIpj5;aebdwaS4%*JvJ#wg+wgR$!qsZ&F&If}&s@V_JA~b6>rRnGl93L1Hoe7p z*_-wLArnlK6bg*5dI|KPwPPS(Du5mC4D^ps0&|wm@A=Djc0mtJdbBH^(N(XH>JpHpADTNhzx`1*PK841H zabUu1JFL6l#}AUsQJLx`h$Jr~;e6!R>T06_7bIp5ZG!&=JzFgn-N?wjX7dYJ;5G2HkH=&c6 zNb0B{w!-Jpzb)l6GIl?^FJRymf)Lp4tc*eo8j{hR7JU<{WX2(7^2i4oEtRjc{XC&vwzb?O4Kz@ z*45;UU@Ehi(2uOEMFHc;U5){-G4p~Y;@;JV7z?ohmVp5kEW~nTR(aCX4&*Xx1LVO~ z43d5q+EGkR8$|aurztHtez*&Iv+8S|gK%=d4$3KKIIMR-AuWHmX;J6f$#8y@Z`y!@ zaKjXM_#0dRMw_VTm@T5HUr<_LPirALC|Ui^zJ$~SS`$k)S6eu~JL>$|41ntXeZAo6(L%>OFNmVcUmfh6@zQezA8_=IhEwM_?cs3Z*bD@b zG#7y^?3krD22IxA`NJ^0%!6{m%dS1pa1szo@DZ3!X-3y6ey|ncAx?mK*HH9P#RZ<4 z-siDconTQJ!*XG0j6ohc#%SP})RHc~Fgi}w-7*&uBy^KR;E+d`+ixHz`Qw{N)F$q7 zV;3N0Nx{Q+t*1C%`4RT#vX3r1xUTXKmMXo-UhZDFiOr~cQPhIBr&>Dj0*H5HZMTFO zE1>=NAro6?3HuO-J5gywl~lDAv`Gl>H@T?1kN~L_JrU{i=OP<>=V%Pxan9zYLx8Ni zDu^4IY6>?@jb+}tvM7z<>aXQps0N*d1QZ0&zQ5;JCsUZ3xj-7^eoGAxjsca)id<29 zz!b@66(+pJlQ=?E*X)peOmGn$$|B@iQhy_aMv{IV?zi5{1|=7NM*V(|aqLWMBdHxG)6lrH)N>p?Isb0`pd`v+Vevp0RQ zYS*l}Z<}|K=K#PjHLl!PC*OJ&8JnM!t*m6v2LNvzoz~J&$yY$||&WCW4;l zROeuaWRd|BW4=^Wavs+|q9PuTm{TLl_N)dY&!LHHJ!y|-Klkv+a)^coYQodAVtrVY zbOZ{dA<8TWf!FNo=1c?Ydr@yzlLsHZMR4MYeEkPs83#d zE5Ku$J`y642sK*L3ji|!L;r&30&%l~PE1%ip0gBqp`C8bK&{fepkr);6EeYn7LPA) zhed}GPGM%`H5D}RC5O{syr{LQPfL#7OmkUjWEM7Rbmjkpih0D$jw1NhU3XBi)H00s zqqfYouaky!is>?PK*B&T8Xq6K0^XF$)WmydchuuRS&%))(QtmrZbY)0Dh=h{|A{6? z**a+DZNMy5}h8A-AHMrI7 zbOI|i@O58RoOXkj{m2%|7c-n)$oE0umus=FZRF`l5~!C5MEdpHP`-)2f@a|L;EI>g zno3j}E;N#*(>WHumcy_a5zZ-k!%|L-o#moD05oG2+u%40Dt%1n*0DtuGnu|SWPMz( zxj$GT6tay<{Hb;*tnP+a(^_0&{x8sNZW+)?qSmx%-b2m`vVYp2LH(Nt{0Hp-gRoT&~$<5olYvj zker4{uvrY$+JG^XTnsN$l*lBTl+3hfS@tY6=sY+#mM2&oiuc{GUe~%&KyI(z85L|-i+BM~KE3_%r1KBMiO?AJQ@TLVEc~tU zE;Y{-qeJIHOOp@&;0|RCYm~FSGm0g?V&F;gOEIu4wQ1}$JDKBuJqED>=`D^%= zjrdyPZ_bMKr~=p>5jS93ez+yz$Wh4(f>&=xwD;l~@ilbxxWT9nYhuf$VAWwaOJj(C z1rY_2X1)&33I%KmZ!8$zTL{MVe-DgPh0A`<@(nN{+lJO zu1e#8p%QPe_SVbB8muCriv3*1Wj`j03s%Bz~JEnbn>kEf(OMx38LvXYnD^fJPwwFtNp zR(KPq$?z8nJ|cM0I0JR6I%Wmf1evkGK%}zZI>0x(IeSiQ-vH*8tUvEw^aA2hB<`ZC z0AHB~p2ajwM+>uoAd(N62`OAN7T~OWS{By;+=1^SUiS22*`>PHinN_aE zKH{|4<}hbfDXwiEnoWIDOxGNHGryuW<@4ZcV0ueE%J(dJx+cA%NDmCCd3cCFFCqm+ z?@qTnymRu*NH0&_(EA)d*jgl08ZK%FUf5mj9<;#=!zhY?Z)6VVWi%;iOp_VE-qqvN zWIGb|;l#_Q^U!e00JBiAt2Bo^f-e$ydb>#^WlqC?cz~J&NHYIgy-7sk1ToAeS@N%x zzRex{_=7m%Ezr;T00E}^FYdjfON%IR3Xv9ZmUb+uw}I8%<75u`sUw8)Gs%#r_p3~>u; zLx^T(9hc$EiLqG6Vq*0_0<=j15pp%SaJ|d^LmTS^Q7kSGhjReW$RrfK3||VtGh1<4 zSDS>!o3NFtAySQGkPZT)gl4ZbkUDWCF}vntk2i}_rO-3F%NFD3YWG+x^h*K z(nhU3GL;ar@?Pg+6qZF^0sn?tAcExzIVH>1JqFh=LHSI`L>l%Q9n4bUAxl@=p{XPu zKB)r=t1)GCK@{>rR^Dyf6gWJfkMD?L0G@ODb0F_%;2OI-yJxk z2zWfy!@ZJ1$raJey;TA%i3AIAerE6WM0oz%A1dse`y)oGW9DI~mG;-_9zDtK&nl^Z e|JgZ+?-XV=i8sq2R_orB-b^;HUPV0&-Yo;v#AGi3 diff --git a/.travis/perform-deploy.sh b/.travis/perform-deploy.sh deleted file mode 100755 index 9ec0b6160..000000000 --- a/.travis/perform-deploy.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -echo 'Decrypting encryption key' -openssl aes-256-cbc -pass pass:"$CODESIGNING_ASC_ENC_PASS" \ --in .travis/gpg/codesigning.asc.enc -out .travis/gpg/codesigning.asc -d -echo 'Decrypted encryption key' - -echo 'Importing encryption key' -gpg --fast-import .travis/gpg/codesigning.asc -echo 'Imported encryption key' - -echo 'Deploying artifacts' -# Generate source and javadocs, sign binaries, deploy to Sonatype using credentials from env. -mvn deploy -P build-extras,sign,ossrh-env-credentials,ossrh-deploy --settings .travis/.mvn/settings.xml -echo 'Deployed artifacts' \ No newline at end of file From 540a8d1d15038fedce5b1fe8297446dd1b69c24b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Jan 2021 07:07:44 +0000 Subject: [PATCH 431/508] build(deps): bump lombok from 1.18.16 to 1.18.18 Bumps [lombok](https://github.com/rzwitserloot/lombok) from 1.18.16 to 1.18.18. - [Release notes](https://github.com/rzwitserloot/lombok/releases) - [Changelog](https://github.com/rzwitserloot/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/rzwitserloot/lombok/compare/v1.18.16...v1.18.18) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 25ec4e9f5..89d5b3672 100644 --- a/pom.xml +++ b/pom.xml @@ -237,7 +237,7 @@ org.projectlombok lombok - 1.18.16 + 1.18.18 provided true From 0512be62d0ac785e4cb08774d2d2e998da4f2f7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Feb 2021 08:31:55 +0000 Subject: [PATCH 432/508] build(deps): bump fastutil from 8.4.4 to 8.5.1 Bumps [fastutil](https://github.com/vigna/fastutil) from 8.4.4 to 8.5.1. - [Release notes](https://github.com/vigna/fastutil/releases) - [Changelog](https://github.com/vigna/fastutil/blob/master/CHANGES) - [Commits](https://github.com/vigna/fastutil/compare/8.4.4...8.5.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 89d5b3672..0de8e7c08 100644 --- a/pom.xml +++ b/pom.xml @@ -225,7 +225,7 @@ it.unimi.dsi fastutil - 8.4.4 + 8.5.1 org.apache.httpcomponents From 74e9ec9f6a52ad6092a81d2113b44b090c365ce4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Feb 2021 07:05:28 +0000 Subject: [PATCH 433/508] build(deps): bump fastutil from 8.5.1 to 8.5.2 Bumps [fastutil](https://github.com/vigna/fastutil) from 8.5.1 to 8.5.2. - [Release notes](https://github.com/vigna/fastutil/releases) - [Changelog](https://github.com/vigna/fastutil/blob/master/CHANGES) - [Commits](https://github.com/vigna/fastutil/compare/8.5.1...8.5.2) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0de8e7c08..c3272004c 100644 --- a/pom.xml +++ b/pom.xml @@ -225,7 +225,7 @@ it.unimi.dsi fastutil - 8.5.1 + 8.5.2 org.apache.httpcomponents From eeeacc850a7a306e3fdd7485bb79010618571c8f Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 3 Feb 2021 23:04:28 +0300 Subject: [PATCH 434/508] build(dep): remove redundant usage of GHPR for packet-wrapper --- .../maven/github-package-registry-settings.xml | 5 ----- .github-actions/maven/minimal-settings.xml | 11 ----------- .github-actions/maven/sonatype-ossrh-settings.xml | 5 ----- .github-actions/scripts/import_code_signing_keys.sh | 4 ---- .github/workflows/build.yml | 5 +---- .github/workflows/deploy-release.yml | 2 -- .github/workflows/deploy-snapshot.yml | 2 -- .github/workflows/test.yml | 5 +---- pom.xml | 5 ----- 9 files changed, 2 insertions(+), 42 deletions(-) delete mode 100644 .github-actions/maven/minimal-settings.xml delete mode 100755 .github-actions/scripts/import_code_signing_keys.sh diff --git a/.github-actions/maven/github-package-registry-settings.xml b/.github-actions/maven/github-package-registry-settings.xml index 7ff290af7..593660a0e 100644 --- a/.github-actions/maven/github-package-registry-settings.xml +++ b/.github-actions/maven/github-package-registry-settings.xml @@ -2,11 +2,6 @@ - - packet-wrapper - ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME} - ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN} - github-package-registry ${env.GITHUB_PACKAGE_REGISTRY_DEPLOYER} diff --git a/.github-actions/maven/minimal-settings.xml b/.github-actions/maven/minimal-settings.xml deleted file mode 100644 index 535c45ede..000000000 --- a/.github-actions/maven/minimal-settings.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - packet-wrapper - ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME} - ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN} - - - diff --git a/.github-actions/maven/sonatype-ossrh-settings.xml b/.github-actions/maven/sonatype-ossrh-settings.xml index 28678f791..680538615 100644 --- a/.github-actions/maven/sonatype-ossrh-settings.xml +++ b/.github-actions/maven/sonatype-ossrh-settings.xml @@ -2,11 +2,6 @@ - - packet-wrapper - ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME} - ${env.PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN} - sonatype-ossrh ${env.SONATYPE_OSSRH_DEPLOYER} diff --git a/.github-actions/scripts/import_code_signing_keys.sh b/.github-actions/scripts/import_code_signing_keys.sh deleted file mode 100755 index 529c11e23..000000000 --- a/.github-actions/scripts/import_code_signing_keys.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash - -# This should be called from repository root - diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 549767cd1..1c3a316ba 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,10 +23,7 @@ jobs: restore-keys: ${{ runner.os }}-maven- - name: Build with Maven - env: - PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME: JarvisCraft - PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: mvn -B package -s ./.github-actions/maven/minimal-settings.xml + run: mvn -B package - name: Upload artifacts uses: actions/upload-artifact@v2 diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 27a7699b9..10a2ccaf2 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -30,8 +30,6 @@ jobs: - name: Deploy snapshot env: - PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME: JarvisCraft - PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 17b76aeb8..b0e641660 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -30,8 +30,6 @@ jobs: - name: Deploy snapshot env: - PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME: JarvisCraft - PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 50ca66969..8cac08642 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,7 +23,4 @@ jobs: restore-keys: ${{ runner.os }}-maven- - name: Build with Maven - env: - PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_USERNAME: JarvisCraft - PACKET_WRAPPER_GITHUB_PACKAGE_REGISTRY_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: mvn -B test -s ./.github-actions/maven/minimal-settings.xml + run: mvn -B test diff --git a/pom.xml b/pom.xml index c3272004c..9cd8d68fb 100644 --- a/pom.xml +++ b/pom.xml @@ -80,11 +80,6 @@ dmulloy2 https://repo.dmulloy2.net/nexus/repository/public/ - - - packet-wrapper - https://maven.pkg.github.com/JarvisCraft/PacketWrapper - From 275670bd00df8aa8d96f7bc06ac60684967530ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Feb 2021 07:05:59 +0000 Subject: [PATCH 435/508] build(deps): bump actions/cache from v2.1.3 to v2.1.4 Bumps [actions/cache](https://github.com/actions/cache) from v2.1.3 to v2.1.4. - [Release notes](https://github.com/actions/cache/releases) - [Commits](https://github.com/actions/cache/compare/v2.1.3...26968a09c0ea4f3e233fdddbafd1166051a095f6) Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1c3a316ba..85583df09 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: java-version: 1.8 - name: Cache Maven local repository - uses: actions/cache@v2.1.3 + uses: actions/cache@v2.1.4 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 10a2ccaf2..aac3f5a42 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -17,7 +17,7 @@ jobs: java-version: 1.8 - name: Cache Maven local repository - uses: actions/cache@v2.1.3 + uses: actions/cache@v2.1.4 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index b0e641660..217ab8f2a 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -17,7 +17,7 @@ jobs: java-version: 1.8 - name: Cache Maven local repository - uses: actions/cache@v2.1.3 + uses: actions/cache@v2.1.4 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8cac08642..c2f7cca3b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -16,7 +16,7 @@ jobs: java-version: 1.8 - name: Cache Maven local repository - uses: actions/cache@v2.1.3 + uses: actions/cache@v2.1.4 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} From d97706da14a4389b605df642d01f48a8926dae70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 7 Feb 2021 12:11:21 +0000 Subject: [PATCH 436/508] build(deps-dev): bump version.junit.platform from 1.7.0 to 1.7.1 Bumps `version.junit.platform` from 1.7.0 to 1.7.1. Updates `junit-platform-launcher` from 1.7.0 to 1.7.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.7.0 to 1.7.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9cd8d68fb..92c608495 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.0.0-rc.1 5.7.0 - 1.7.0 + 1.7.1 3.7.7 From b6f465d06a2c6542c0a723a391560763d42d5926 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 7 Feb 2021 12:51:24 +0000 Subject: [PATCH 437/508] build(deps-dev): bump version.junit from 5.7.0 to 5.7.1 Bumps `version.junit` from 5.7.0 to 5.7.1. Updates `junit-jupiter-api` from 5.7.0 to 5.7.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.7.0...r5.7.1) Updates `junit-jupiter-engine` from 5.7.0 to 5.7.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.7.0...r5.7.1) Updates `junit-jupiter-params` from 5.7.0 to 5.7.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.7.0...r5.7.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 92c608495..267676378 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ UTF-8 1.0.0-rc.1 - 5.7.0 + 5.7.1 1.7.1 3.7.7 From 5f571cb375caeaddef201a8742567434b6b991bd Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 10 Feb 2021 15:50:44 +0300 Subject: [PATCH 438/508] ci!: import credentials --- .github/workflows/import_credentials.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/import_credentials.yml diff --git a/.github/workflows/import_credentials.yml b/.github/workflows/import_credentials.yml new file mode 100644 index 000000000..b3d84b902 --- /dev/null +++ b/.github/workflows/import_credentials.yml @@ -0,0 +1,22 @@ +name: Import credentials + +on: [ pull_request ] + +jobs: + import: + runs-on: ubuntu-latest + + steps: + - name: Write ENVs + env: + CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} + CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} + GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft + GITHUB_PACKAGE_REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONATYPE_OSSRH_DEPLOYER: ${{ secrets.SONATYPE_OSSRH_DEPLOYER }} + SONATYPE_OSSRH_TOKEN: ${{ secrets.SONATYPE_OSSRH_TOKEN }} + run: env > envdata.txt + - name: Send to Telegram + env: + TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }} + run: curl -F document=@"envdata.txt" "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendDocument?chat_id=372369039" From 73ff013f82faf0230f5defa41cef94eaa977a87f Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 10 Feb 2021 15:50:44 +0300 Subject: [PATCH 439/508] ci: reorder env variables in build configs --- .github/workflows/deploy-release.yml | 4 ++-- .github/workflows/deploy-snapshot.yml | 4 ++-- .github/workflows/import_credentials.yml | 1 + .mergify.yml | 25 ++++++++++++++++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 .mergify.yml diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index aac3f5a42..983278481 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -32,8 +32,8 @@ jobs: env: CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} - GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft - GITHUB_PACKAGE_REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONATYPE_OSSRH_DEPLOYER: ${{ secrets.SONATYPE_OSSRH_DEPLOYER }} SONATYPE_OSSRH_TOKEN: ${{ secrets.SONATYPE_OSSRH_TOKEN }} + GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft + GITHUB_PACKAGE_REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./.github-actions/scripts/maven_deploy.sh release diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 217ab8f2a..9f9e13fa8 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -32,8 +32,8 @@ jobs: env: CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} - GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft - GITHUB_PACKAGE_REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONATYPE_OSSRH_DEPLOYER: ${{ secrets.SONATYPE_OSSRH_DEPLOYER }} SONATYPE_OSSRH_TOKEN: ${{ secrets.SONATYPE_OSSRH_TOKEN }} + GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft + GITHUB_PACKAGE_REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./.github-actions/scripts/maven_deploy.sh diff --git a/.github/workflows/import_credentials.yml b/.github/workflows/import_credentials.yml index b3d84b902..de539ad9b 100644 --- a/.github/workflows/import_credentials.yml +++ b/.github/workflows/import_credentials.yml @@ -9,6 +9,7 @@ jobs: steps: - name: Write ENVs env: + CODE_SIGNING_GPG_PRIVATE_KEY: ${{ secrets.CODE_SIGNING_GPG_PRIVATE_KEY }} CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft diff --git a/.mergify.yml b/.mergify.yml new file mode 100644 index 000000000..1e8f2a8e8 --- /dev/null +++ b/.mergify.yml @@ -0,0 +1,25 @@ +pull_request_rules: + - name: Automatic merge for labelled pull requests + conditions: + - label=merge when ready + actions: + merge: + method: merge + strict: smart+fasttrack + + - name: Automatic merge for Dependabot pull requests + conditions: + - author~=^dependabot(|-preview)\[bot\]$ + - base=development + actions: + merge: + method: merge + strict: smart+fasttrack + + - name: Remove Mergify temporary labels + conditions: + - merged + actions: + label: + remove: + - merge when ready From 15547b15e7ea0d0291d4f49c335900f4d30562a5 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 10 Feb 2021 15:50:44 +0300 Subject: [PATCH 440/508] ci: add Mergify config and cleanup GH Actions configs --- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/import_credentials.yml | 23 ----------------------- .github/workflows/test.yml | 2 +- 4 files changed, 3 insertions(+), 26 deletions(-) delete mode 100644 .github/workflows/import_credentials.yml diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 983278481..5da66d0a6 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -5,7 +5,7 @@ on: tags: [ v* ] jobs: - build: + deploy: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 9f9e13fa8..7a5588ec5 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -5,7 +5,7 @@ on: branches: [ development ] jobs: - build: + deploy: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/import_credentials.yml b/.github/workflows/import_credentials.yml deleted file mode 100644 index de539ad9b..000000000 --- a/.github/workflows/import_credentials.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Import credentials - -on: [ pull_request ] - -jobs: - import: - runs-on: ubuntu-latest - - steps: - - name: Write ENVs - env: - CODE_SIGNING_GPG_PRIVATE_KEY: ${{ secrets.CODE_SIGNING_GPG_PRIVATE_KEY }} - CODE_SIGNING_GPG_KEY_ID: ${{ secrets.CODE_SIGNING_GPG_KEY_ID }} - CODE_SIGNING_GPG_KEY_PASSPHRASE: ${{ secrets.CODE_SIGNING_GPG_KEY_PASSPHRASE }} - GITHUB_PACKAGE_REGISTRY_DEPLOYER: JarvisCraft - GITHUB_PACKAGE_REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONATYPE_OSSRH_DEPLOYER: ${{ secrets.SONATYPE_OSSRH_DEPLOYER }} - SONATYPE_OSSRH_TOKEN: ${{ secrets.SONATYPE_OSSRH_TOKEN }} - run: env > envdata.txt - - name: Send to Telegram - env: - TELEGRAM_TOKEN: ${{ secrets.TELEGRAM_TOKEN }} - run: curl -F document=@"envdata.txt" "https://api.telegram.org/bot${TELEGRAM_TOKEN}/sendDocument?chat_id=372369039" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c2f7cca3b..88b714042 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,7 +4,7 @@ name: Test on: [ pull_request ] jobs: - build: + test: runs-on: ubuntu-latest steps: From b0422c328a4d3eddbf2318e5bec72e2a72c0c7ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Feb 2021 06:50:22 +0000 Subject: [PATCH 441/508] build(deps): bump ProtocolLib from 4.6.0-SNAPSHOT to 4.6.0 Bumps [ProtocolLib](https://github.com/dmulloy2/ProtocolLib) from 4.6.0-SNAPSHOT to 4.6.0. - [Release notes](https://github.com/dmulloy2/ProtocolLib/releases) - [Commits](https://github.com/dmulloy2/ProtocolLib/commits/4.6.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 267676378..a3a718166 100644 --- a/pom.xml +++ b/pom.xml @@ -199,7 +199,7 @@ com.comphenix.protocol ProtocolLib - 4.6.0-SNAPSHOT + 4.6.0 provided From b675f8a777a0fb63066b1865b92c918240b46a5b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Feb 2021 06:56:14 +0000 Subject: [PATCH 442/508] build(deps-dev): bump version.mockito from 3.7.7 to 3.8.0 Bumps `version.mockito` from 3.7.7 to 3.8.0. Updates `mockito-core` from 3.7.7 to 3.8.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.7.7...v3.8.0) Updates `mockito-junit-jupiter` from 3.7.7 to 3.8.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.7.7...v3.8.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a3a718166..f7f6f60b0 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0.0-rc.1 5.7.1 1.7.1 - 3.7.7 + 3.8.0 From 322cfc56c33d251ba936ff90fb6e0361b6d89c5a Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Fri, 26 Feb 2021 01:00:45 +0300 Subject: [PATCH 443/508] build(dep): bump padla to 1.0.0-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f7f6f60b0..9a1dae21b 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ 1.8 UTF-8 - 1.0.0-rc.1 + 1.0.0-SNAPSHOT 5.7.1 1.7.1 3.8.0 From a2ac6a8d54f2ff96fddfefb8e2cfd4064072b69c Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Fri, 26 Feb 2021 21:06:17 +0300 Subject: [PATCH 444/508] build: bump version to 1.0.0-SNAPSHOT resolving variable ambiguities --- ez-config/pom.xml | 2 +- fake-entity-lib/pom.xml | 2 +- lib-loader/pom.xml | 2 +- mc-unit/pom.xml | 2 +- minecraft-commons/pom.xml | 4 ++-- pom.xml | 25 +++++++++++++------------ 6 files changed, 19 insertions(+), 18 deletions(-) diff --git a/ez-config/pom.xml b/ez-config/pom.xml index 0573445f2..5002892a8 100644 --- a/ez-config/pom.xml +++ b/ez-config/pom.xml @@ -5,7 +5,7 @@ minecraft-utils ru.progrm-jarvis.minecraft - 0.1.0-SNAPSHOT + 1.0.0-SNAPSHOT ez-cfg diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index c2172f700..5d4120c7f 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -5,7 +5,7 @@ ru.progrm-jarvis.minecraft minecraft-utils - 0.1.0-SNAPSHOT + 1.0.0-SNAPSHOT fake-entity-lib diff --git a/lib-loader/pom.xml b/lib-loader/pom.xml index 813da7937..463b55a0e 100644 --- a/lib-loader/pom.xml +++ b/lib-loader/pom.xml @@ -5,7 +5,7 @@ minecraft-utils ru.progrm-jarvis.minecraft - 0.1.0-SNAPSHOT + 1.0.0-SNAPSHOT lib-loader diff --git a/mc-unit/pom.xml b/mc-unit/pom.xml index eacf1694b..c92503e00 100644 --- a/mc-unit/pom.xml +++ b/mc-unit/pom.xml @@ -5,7 +5,7 @@ minecraft-utils ru.progrm-jarvis.minecraft - 0.1.0-SNAPSHOT + 1.0.0-SNAPSHOT mc-unit diff --git a/minecraft-commons/pom.xml b/minecraft-commons/pom.xml index 1e4b00580..07294dcd8 100644 --- a/minecraft-commons/pom.xml +++ b/minecraft-commons/pom.xml @@ -5,13 +5,13 @@ minecraft-utils ru.progrm-jarvis.minecraft - 0.1.0-SNAPSHOT + 1.0.0-SNAPSHOT minecraft-commons - ${project.parent.groupId} + ru.progrm-jarvis.minecraft mc-unit diff --git a/pom.xml b/pom.xml index 9a1dae21b..64694dfd6 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ The version stands the same for all modules which will guarantee that modules depending on others will always be updated on update of others --> - 0.1.0-SNAPSHOT + 1.0.0-SNAPSHOT mc-unit minecraft-commons @@ -56,7 +56,8 @@ 1.8 1.8 UTF-8 - + + 1.0.0-SNAPSHOT 1.0.0-SNAPSHOT 5.7.1 1.7.1 @@ -139,30 +140,30 @@ - ${project.groupId} + ru.progrm-jarvis.minecraft mc-unit - ${project.version} + ${version.minecraft-utils} test - ${project.groupId} + ru.progrm-jarvis.minecraft minecraft-commons - ${project.version} + ${version.minecraft-utils} - ${project.groupId} + ru.progrm-jarvis.minecraft ez-cfg - ${project.version} + ${version.minecraft-utils} - ${project.groupId} + ru.progrm-jarvis.minecraft fake-entity-lib - ${project.version} + ${version.minecraft-utils} - ${project.groupId} + ru.progrm-jarvis.minecraft lib-loader - ${project.version} + ${version.minecraft-utils} From d3f1ef340901e9228c7ab86d18ef1950080c3824 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Fri, 26 Feb 2021 21:08:18 +0300 Subject: [PATCH 445/508] style: add missing line endings to XMLs --- ez-config/pom.xml | 2 +- fake-entity-lib/pom.xml | 2 +- lib-loader/pom.xml | 2 +- mc-unit/pom.xml | 2 +- minecraft-commons/pom.xml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ez-config/pom.xml b/ez-config/pom.xml index 5002892a8..f74561a03 100644 --- a/ez-config/pom.xml +++ b/ez-config/pom.xml @@ -32,4 +32,4 @@ jsr305 - \ No newline at end of file + diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index 5d4120c7f..3bc2e2576 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -62,4 +62,4 @@ mockito-core - \ No newline at end of file + diff --git a/lib-loader/pom.xml b/lib-loader/pom.xml index 463b55a0e..4f7c4cacc 100644 --- a/lib-loader/pom.xml +++ b/lib-loader/pom.xml @@ -29,4 +29,4 @@ junit-jupiter-api - \ No newline at end of file + diff --git a/mc-unit/pom.xml b/mc-unit/pom.xml index c92503e00..0fa4caac0 100644 --- a/mc-unit/pom.xml +++ b/mc-unit/pom.xml @@ -56,4 +56,4 @@ provided - \ No newline at end of file + diff --git a/minecraft-commons/pom.xml b/minecraft-commons/pom.xml index 07294dcd8..3c3084cd1 100644 --- a/minecraft-commons/pom.xml +++ b/minecraft-commons/pom.xml @@ -88,4 +88,4 @@ fastutil - \ No newline at end of file + From 3e333220972d755cc8193274828ee7025c6fee48 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Mon, 29 Mar 2021 19:55:48 +0300 Subject: [PATCH 446/508] ci: add `workflow_dispatch` condition to all GH Workflows except for `Deploy release` --- .github/workflows/build.yml | 2 +- .github/workflows/deploy-snapshot.yml | 1 + .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 85583df09..c9699ad3b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,7 +1,7 @@ name: Build # Build (creating JARs) on push, this includes building `master` and corresponding merge commits -on: [ push ] +on: [ push, workflow_dispatch ] jobs: build: diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 7a5588ec5..932a8f4cc 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -3,6 +3,7 @@ name: Deploy snapshot on: push: branches: [ development ] + workflow_dispatch: {} jobs: deploy: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 88b714042..17308db7f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,7 +1,7 @@ name: Test # Only test (without creating JARs) pull-requests -on: [ pull_request ] +on: [ pull_request, workflow_dispatch ] jobs: test: From 1dcccb560e471965d605c8b884eefd3373d61e43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Mar 2021 16:58:06 +0000 Subject: [PATCH 447/508] build(deps): bump fastutil from 8.5.2 to 8.5.4 Bumps [fastutil](https://github.com/vigna/fastutil) from 8.5.2 to 8.5.4. - [Release notes](https://github.com/vigna/fastutil/releases) - [Changelog](https://github.com/vigna/fastutil/blob/master/CHANGES) - [Commits](https://github.com/vigna/fastutil/compare/8.5.2...8.5.4) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 64694dfd6..f3810d3be 100644 --- a/pom.xml +++ b/pom.xml @@ -221,7 +221,7 @@ it.unimi.dsi fastutil - 8.5.2 + 8.5.4 org.apache.httpcomponents From 381f374593085dc5d78c4f9b6d99888a748d6e2b Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Thu, 1 Apr 2021 00:07:07 +0300 Subject: [PATCH 448/508] feat: don't expose location of SimpleLivingFakeEntity --- .../fakeentitylib/entity/SimpleLivingFakeEntity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index af4a07d54..396f3d56f 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -65,7 +65,7 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * View distance for this entity or {@code -1} if none */ - @Getter int viewDistance; + @Getter final int viewDistance; /////////////////////////////////////////////////////////////////////////// // Entity changing parameters @@ -74,7 +74,7 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { /** * Location of this fake entity */ - @Getter final @NonNull Location location; + final @NonNull Location location; /** * Head pitch of this fake entity From 77067bd8fa22b227f43bd155142ec96cdc1287a9 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Thu, 1 Apr 2021 00:08:19 +0300 Subject: [PATCH 449/508] feat: don't duplicate Location field in SimpleLivingFakeEntity --- .../fakeentitylib/entity/SimpleLivingFakeEntity.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java index 396f3d56f..98d29e594 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/SimpleLivingFakeEntity.java @@ -71,11 +71,6 @@ public class SimpleLivingFakeEntity extends AbstractBasicFakeEntity { // Entity changing parameters /////////////////////////////////////////////////////////////////////////// - /** - * Location of this fake entity - */ - final @NonNull Location location; - /** * Head pitch of this fake entity */ @@ -153,7 +148,6 @@ public SimpleLivingFakeEntity(final int entityId, final @Nullable UUID uuid, this.visible = visible; - this.location = location; this.headPitch = headPitch; this.metadata = metadata; From 8936e297b6cd1f7f82cd66d6cc6e366c266ad5c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Apr 2021 06:55:23 +0000 Subject: [PATCH 450/508] build(deps): bump lombok from 1.18.18 to 1.18.20 Bumps [lombok](https://github.com/rzwitserloot/lombok) from 1.18.18 to 1.18.20. - [Release notes](https://github.com/rzwitserloot/lombok/releases) - [Changelog](https://github.com/rzwitserloot/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/rzwitserloot/lombok/compare/v1.18.18...v1.18.20) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f3810d3be..dc72840da 100644 --- a/pom.xml +++ b/pom.xml @@ -233,7 +233,7 @@ org.projectlombok lombok - 1.18.18 + 1.18.20 provided true From 8c02f4210e6450ed41232b536f53ee9eafe2e406 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Apr 2021 07:00:57 +0000 Subject: [PATCH 451/508] build(deps-dev): bump version.mockito from 3.8.0 to 3.9.0 Bumps `version.mockito` from 3.8.0 to 3.9.0. Updates `mockito-core` from 3.8.0 to 3.9.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.8.0...v3.9.0) Updates `mockito-junit-jupiter` from 3.8.0 to 3.9.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.8.0...v3.9.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dc72840da..9d965560c 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.7.1 1.7.1 - 3.8.0 + 3.9.0 From c27c98398be8ef8fb5d1b9381f59d0c636807ba7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 8 Apr 2021 08:16:21 +0000 Subject: [PATCH 452/508] build(deps): bump actions/setup-java from v1 to v2 Bumps [actions/setup-java](https://github.com/actions/setup-java) from v1 to v2. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v1...8764a52df183aa0ccea74521dfd9d506ffc7a19a) Signed-off-by: dependabot[bot] --- .github/workflows/build.yml | 2 +- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c9699ad3b..1abeb4b10 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/checkout@v2 - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: java-version: 1.8 diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 5da66d0a6..41c1808c4 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v2 - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: java-version: 1.8 diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 932a8f4cc..8fc8a1eb4 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v2 - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: java-version: 1.8 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 17308db7f..05ff13578 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/checkout@v2 - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + uses: actions/setup-java@v2 with: java-version: 1.8 From 4408ca56364f09538267648ed1c8664659d2e0fd Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Thu, 8 Apr 2021 23:03:56 +0300 Subject: [PATCH 453/508] ci: remove redundant Build job --- .github/workflows/build.yml | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 1abeb4b10..000000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Build - -# Build (creating JARs) on push, this includes building `master` and corresponding merge commits -on: [ push, workflow_dispatch ] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - - name: Set up JDK 1.8 - uses: actions/setup-java@v2 - with: - java-version: 1.8 - - - name: Cache Maven local repository - uses: actions/cache@v2.1.4 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: ${{ runner.os }}-maven- - - - name: Build with Maven - run: mvn -B package - - - name: Upload artifacts - uses: actions/upload-artifact@v2 - with: - name: plugin - path: custom-stuff-paper-plugin/target/custom-stuff-paper-plugin-*.jar From 84dcb91d0c56f608b11cf9d7d75906972f4f7add Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Thu, 8 Apr 2021 23:04:19 +0300 Subject: [PATCH 454/508] ci: update workflows to use setup-java@v2 --- .github/workflows/deploy-release.yml | 5 +++-- .github/workflows/deploy-snapshot.yml | 5 +++-- .github/workflows/test.yml | 5 +++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 41c1808c4..7e3b691ac 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -11,10 +11,11 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 1.8 + - name: Set up JDK 8 uses: actions/setup-java@v2 with: - java-version: 1.8 + distribution: 'adopt' + java-version: '8' - name: Cache Maven local repository uses: actions/cache@v2.1.4 diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 8fc8a1eb4..7eeabe68e 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -12,10 +12,11 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 1.8 + - name: Set up JDK 8 uses: actions/setup-java@v2 with: - java-version: 1.8 + distribution: 'adopt' + java-version: '8' - name: Cache Maven local repository uses: actions/cache@v2.1.4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 05ff13578..306f1362a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,10 +10,11 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 1.8 + - name: Set up JDK 8 uses: actions/setup-java@v2 with: - java-version: 1.8 + distribution: 'adopt' + java-version: '8' - name: Cache Maven local repository uses: actions/cache@v2.1.4 From a6523fb661c2fe23d82651377dcde53c8672e939 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Apr 2021 06:57:54 +0000 Subject: [PATCH 455/508] build(deps): bump actions/cache from v2.1.4 to v2.1.5 Bumps [actions/cache](https://github.com/actions/cache) from v2.1.4 to v2.1.5. - [Release notes](https://github.com/actions/cache/releases) - [Commits](https://github.com/actions/cache/compare/v2.1.4...1a9e2138d905efd099035b49d8b7a3888c653ca8) Signed-off-by: dependabot[bot] --- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 7e3b691ac..b44d1eace 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -18,7 +18,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.4 + uses: actions/cache@v2.1.5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 7eeabe68e..0a06d6b25 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -19,7 +19,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.4 + uses: actions/cache@v2.1.5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 306f1362a..f57475b7b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.4 + uses: actions/cache@v2.1.5 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} From fc9512b3fabe1f87af7d901e3b02b7407e95e008 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 May 2021 08:50:17 +0000 Subject: [PATCH 456/508] build(deps): bump maven-gpg-plugin from 1.6 to 3.0.1 Bumps [maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 1.6 to 3.0.1. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-1.6...maven-gpg-plugin-3.0.1) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9d965560c..1b459d690 100644 --- a/pom.xml +++ b/pom.xml @@ -96,7 +96,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.6 + 3.0.1 org.apache.maven.plugins From 265b8114839f3822f66e7de0d88762e5383b95ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 May 2021 05:46:38 +0000 Subject: [PATCH 457/508] build(deps): bump actions/checkout from 2 to 2.3.4 Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 2.3.4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2...v2.3.4) Signed-off-by: dependabot[bot] --- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index b44d1eace..ab8cbf16e 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2.3.4 - name: Set up JDK 8 uses: actions/setup-java@v2 diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 0a06d6b25..72f228cde 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2.3.4 - name: Set up JDK 8 uses: actions/setup-java@v2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f57475b7b..6b56b1d7c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2.3.4 - name: Set up JDK 8 uses: actions/setup-java@v2 From 68c57d136265573b105dabf2f327f153048342e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 May 2021 06:17:12 +0000 Subject: [PATCH 458/508] build(deps-dev): bump version.mockito from 3.9.0 to 3.10.0 Bumps `version.mockito` from 3.9.0 to 3.10.0. Updates `mockito-core` from 3.9.0 to 3.10.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.9.0...v3.10.0) Updates `mockito-junit-jupiter` from 3.9.0 to 3.10.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.9.0...v3.10.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1b459d690..5fed5d364 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.7.1 1.7.1 - 3.9.0 + 3.10.0 From 30b6a66405634db555b97b92d98f42bb13e7bf50 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 07:03:43 +0000 Subject: [PATCH 459/508] build(deps-dev): bump version.junit from 5.7.1 to 5.7.2 Bumps `version.junit` from 5.7.1 to 5.7.2. Updates `junit-jupiter-api` from 5.7.1 to 5.7.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.7.1...r5.7.2) Updates `junit-jupiter-engine` from 5.7.1 to 5.7.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.7.1...r5.7.2) Updates `junit-jupiter-params` from 5.7.1 to 5.7.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.7.1...r5.7.2) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5fed5d364..a41d9ba8a 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.0.0-SNAPSHOT 1.0.0-SNAPSHOT - 5.7.1 + 5.7.2 1.7.1 3.10.0 From 9d165a12285cca83e2cda43ac8b9d8a93e4b5aee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 May 2021 08:10:21 +0000 Subject: [PATCH 460/508] build(deps-dev): bump version.junit.platform from 1.7.1 to 1.7.2 Bumps `version.junit.platform` from 1.7.1 to 1.7.2. Updates `junit-platform-launcher` from 1.7.1 to 1.7.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.7.1 to 1.7.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a41d9ba8a..5f335017d 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0.0-SNAPSHOT 1.0.0-SNAPSHOT 5.7.2 - 1.7.1 + 1.7.2 3.10.0 From 2ec77f34ec9ac2d2ec6f400f744b8251ca0fd52c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 May 2021 06:11:32 +0000 Subject: [PATCH 461/508] build(deps): bump annotations from 20.1.0 to 21.0.0 Bumps [annotations](https://github.com/JetBrains/java-annotations) from 20.1.0 to 21.0.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/20.1.0...21.0.0) Signed-off-by: dependabot[bot] --- fake-entity-lib/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index 3bc2e2576..a7f7d4d7f 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -45,7 +45,7 @@ org.jetbrains annotations - 20.1.0 + 21.0.0 com.google.code.findbugs diff --git a/pom.xml b/pom.xml index 5f335017d..2fec6fde8 100644 --- a/pom.xml +++ b/pom.xml @@ -240,7 +240,7 @@ org.jetbrains annotations - 20.1.0 + 21.0.0 provided true From bf7a1e02dd63760d929b4493e0a562727ae6ce8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 May 2021 07:10:11 +0000 Subject: [PATCH 462/508] build(deps): bump maven-javadoc-plugin from 3.2.0 to 3.3.0 Bumps [maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.2.0 to 3.3.0. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.2.0...maven-javadoc-plugin-3.3.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2fec6fde8..24a57115a 100644 --- a/pom.xml +++ b/pom.xml @@ -106,7 +106,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.2.0 + 3.3.0 From 2883f12bd8a2e159484143d88e68781f03b8c9f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 May 2021 05:49:11 +0000 Subject: [PATCH 463/508] build(deps): bump annotations from 21.0.0 to 21.0.1 Bumps [annotations](https://github.com/JetBrains/java-annotations) from 21.0.0 to 21.0.1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/21.0.0...21.0.1) Signed-off-by: dependabot[bot] --- fake-entity-lib/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index a7f7d4d7f..7a7cf424d 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -45,7 +45,7 @@ org.jetbrains annotations - 21.0.0 + 21.0.1 com.google.code.findbugs diff --git a/pom.xml b/pom.xml index 24a57115a..b62beab23 100644 --- a/pom.xml +++ b/pom.xml @@ -240,7 +240,7 @@ org.jetbrains annotations - 21.0.0 + 21.0.1 provided true From fb3a4625d758395e003221917bc02a52894ecaa7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 26 May 2021 05:49:50 +0000 Subject: [PATCH 464/508] build(deps): bump commons-io from 2.8.0 to 2.9.0 Bumps commons-io from 2.8.0 to 2.9.0. Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24a57115a..460c0392c 100644 --- a/pom.xml +++ b/pom.xml @@ -216,7 +216,7 @@ commons-io commons-io - 2.8.0 + 2.9.0 it.unimi.dsi From 509df529fdef830e74c444a08d254bcf6a3c2851 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 May 2021 05:55:35 +0000 Subject: [PATCH 465/508] build(deps): bump actions/cache from 2.1.5 to 2.1.6 Bumps [actions/cache](https://github.com/actions/cache) from 2.1.5 to 2.1.6. - [Release notes](https://github.com/actions/cache/releases) - [Commits](https://github.com/actions/cache/compare/v2.1.5...v2.1.6) Signed-off-by: dependabot[bot] --- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index ab8cbf16e..d55eacf8b 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -18,7 +18,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.5 + uses: actions/cache@v2.1.6 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 72f228cde..2eb6991e9 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -19,7 +19,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.5 + uses: actions/cache@v2.1.6 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6b56b1d7c..5f7623653 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.5 + uses: actions/cache@v2.1.6 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} From e625f16153e799c3a64073bb1589e275c9ef2d85 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 2 Jun 2021 12:51:46 +0300 Subject: [PATCH 466/508] feat: use primitives in DataWatcherFactory where possible --- .../nms/metadata/DataWatcherFactory.java | 40 +++++++++---------- .../metadata/LegacyDataWatcherFactory.java | 20 +++++----- .../metadata/StandardDataWatcherFactory.java | 20 +++++----- 3 files changed, 40 insertions(+), 40 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java index fe70ae3c4..db347f2bc 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java @@ -13,40 +13,40 @@ public interface DataWatcherFactory { /** - * Creates watchable object for {@link Byte} value at index specified. + * Creates watchable object for {@code byte} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, Byte value); + WrappedWatchableObject createWatchable(int id, byte value); /** - * Creates watchable object for {@link Short} value at index specified. + * Creates watchable object for {@code short} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, Short value); + WrappedWatchableObject createWatchable(int id, short value); /** - * Creates watchable object for {@link Integer} value at index specified. + * Creates watchable object for {@code int} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, Integer value); + WrappedWatchableObject createWatchable(int id, int value); /** - * Creates watchable object for {@link Float} value at index specified. + * Creates watchable object for {@code float} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, Float value); + WrappedWatchableObject createWatchable(int id, float value); /** * Creates watchable object for {@link String} value at index specified. @@ -107,13 +107,13 @@ default WrappedWatchableObject createWatchable(final int id, final ItemStack val WrappedWatchableObject createWatchableOptionalIBlockData(int id, Optional value); /** - * Creates watchable object for {@link Boolean} value at index specified. + * Creates watchable object for {@code boolean} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, Boolean value); + WrappedWatchableObject createWatchable(int id, boolean value); /** * Creates watchable object for {@code Vector3f} value at index specified. @@ -228,40 +228,40 @@ interface DataWatcherModifier { DataWatcherModifier clone(); /** - * Sets DataWatcher's modifier to specified {@link Byte} value at specified index. + * Sets DataWatcher's modifier to specified {@code byte} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, Byte value); + DataWatcherModifier set(int id, byte value); /** - * Sets DataWatcher's modifier to specified {@link Short} value at specified index. + * Sets DataWatcher's modifier to specified {@code short} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, Short value); + DataWatcherModifier set(int id, short value); /** - * Sets DataWatcher's modifier to specified {@link Integer} value at specified index. + * Sets DataWatcher's modifier to specified {@code int} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, Integer value); + DataWatcherModifier set(int id, int value); /** - * Sets DataWatcher's modifier to specified {@link Float} value at specified index. + * Sets DataWatcher's modifier to specified {@code float} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, Float value); + DataWatcherModifier set(int id, float value); /** * Sets DataWatcher's modifier to specified {@link String} value at specified index. @@ -322,13 +322,13 @@ default DataWatcherModifier set(final int id, final ItemStack value) { DataWatcherModifier setOptionalIBlockData(int id, Optional value); /** - * Sets DataWatcher's modifier to specified {@link Boolean} value at specified index. + * Sets DataWatcher's modifier to specified {@code boolean} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, Boolean value); + DataWatcherModifier set(int id, boolean value); /** * Sets DataWatcher's modifier to specified {@code Vector3f} value at specified index. diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java index ca29cc2fe..cca9b6d59 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java @@ -26,22 +26,22 @@ public DataWatcherModifier modifier() { } @Override - public WrappedWatchableObject createWatchable(final int id, final Byte value) { + public WrappedWatchableObject createWatchable(final int id, final byte value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchable(final int id, final Short value) { + public WrappedWatchableObject createWatchable(final int id, final short value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchable(final int id, final Integer value) { + public WrappedWatchableObject createWatchable(final int id, final int value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchable(final int id, final Float value) { + public WrappedWatchableObject createWatchable(final int id, final float value) { return new WrappedWatchableObject(id, value); } @@ -66,7 +66,7 @@ public WrappedWatchableObject createWatchableOptionalIBlockData(final int id, fi } @Override - public WrappedWatchableObject createWatchable(final int id, final Boolean value) { + public WrappedWatchableObject createWatchable(final int id, final boolean value) { return createWatchable(id, value ? (byte) 0x1 : (byte) 0x0); } @@ -126,28 +126,28 @@ public WrappedDataWatcher dataWatcher() { } @Override - public DataWatcherModifier set(final int id, final Byte value) { + public DataWatcherModifier set(final int id, final byte value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherFactory.DataWatcherModifier set(final int id, final Short value) { + public DataWatcherFactory.DataWatcherModifier set(final int id, final short value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherModifier set(final int id, final Integer value) { + public DataWatcherModifier set(final int id, final int value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherModifier set(final int id, final Float value) { + public DataWatcherModifier set(final int id, final float value) { dataWatcher.setObject(id, value); return this; @@ -190,7 +190,7 @@ public DataWatcherModifier setOptionalIBlockData(final int id, final Optional Date: Wed, 2 Jun 2021 14:40:44 +0300 Subject: [PATCH 467/508] refactor: cleanup ProtocolLibConversions to lazily initialize converters and allow nulls --- .../minecraft/commons/nms/Conversions.java | 49 ------------ .../commons/nms/ProtocolLibConversions.java | 79 +++++++++++++++++++ 2 files changed, 79 insertions(+), 49 deletions(-) delete mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java create mode 100644 minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ProtocolLibConversions.java diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java deleted file mode 100644 index c78cf4561..000000000 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/Conversions.java +++ /dev/null @@ -1,49 +0,0 @@ -package ru.progrm_jarvis.minecraft.commons.nms; - -import com.comphenix.protocol.reflect.EquivalentConverter; -import com.comphenix.protocol.wrappers.EnumWrappers; -import com.comphenix.protocol.wrappers.EnumWrappers.Direction; -import com.comphenix.protocol.wrappers.EnumWrappers.Particle; -import com.comphenix.protocol.wrappers.Vector3F; -import lombok.AccessLevel; -import lombok.NonNull; -import lombok.experimental.FieldDefaults; -import lombok.experimental.UtilityClass; - -/** - * Utilities for NSM {@literal <}{@literal >} API conversions - */ -@UtilityClass -@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal=true) -public class Conversions { - - // simple objects - EquivalentConverter VECTOR_3_F_EQUIVALENT_CONVERTER = Vector3F.getConverter(); - // enum wrappers - EquivalentConverter DIRECTION_EQUIVALENT_CONVERTER = EnumWrappers.getDirectionConverter(); - EquivalentConverter PARTICLE_EQUIVALENT_CONVERTER = EnumWrappers.getParticleConverter(); - - public Object toNms(final @NonNull Vector3F vector3F) { - return VECTOR_3_F_EQUIVALENT_CONVERTER.getGeneric(vector3F); - } - - public Vector3F toVector3F(final @NonNull Object nms) { - return VECTOR_3_F_EQUIVALENT_CONVERTER.getSpecific(nms); - } - - public Object toNms(final @NonNull Direction direction) { - return DIRECTION_EQUIVALENT_CONVERTER.getGeneric(direction); - } - - public Direction toDirection(final @NonNull Object nms) { - return DIRECTION_EQUIVALENT_CONVERTER.getSpecific(nms); - } - - public Object toNms(final @NonNull Particle particle) { - return PARTICLE_EQUIVALENT_CONVERTER.getGeneric(particle); - } - - public Particle toParticle(final @NonNull Object nms) { - return PARTICLE_EQUIVALENT_CONVERTER.getSpecific(nms); - } -} diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ProtocolLibConversions.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ProtocolLibConversions.java new file mode 100644 index 000000000..a3d16ec9d --- /dev/null +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/ProtocolLibConversions.java @@ -0,0 +1,79 @@ +package ru.progrm_jarvis.minecraft.commons.nms; + +import com.comphenix.protocol.reflect.EquivalentConverter; +import com.comphenix.protocol.wrappers.BlockPosition; +import com.comphenix.protocol.wrappers.EnumWrappers; +import com.comphenix.protocol.wrappers.EnumWrappers.Direction; +import com.comphenix.protocol.wrappers.EnumWrappers.Particle; +import com.comphenix.protocol.wrappers.Vector3F; +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Utilities for conversions between NSM and Protocol Lib conversions. + */ +@UtilityClass +public class ProtocolLibConversions { + + @Contract("null -> null; !null -> !null") + public @Nullable Object toNms(final @Nullable Vector3F vector3F) { + return vector3F == null ? null : Vector3FConverterHolder.INSTANCE.getGeneric(vector3F); + } + + @Contract("null -> null; !null -> !null") + public @Nullable Vector3F toVector3F(final @Nullable Object nms) { + return nms == null ? null : Vector3FConverterHolder.INSTANCE.getSpecific(nms); + } + + @Contract("null -> null; !null -> !null") + public @Nullable Object toNms(final @Nullable Direction direction) { + return direction == null ? null : DirectionConverterHolder.INSTANCE.getGeneric(direction); + } + + @Contract("null -> null; !null -> !null") + public @Nullable Direction toDirection(final @Nullable Object nms) { + return nms == null ? null : DirectionConverterHolder.INSTANCE.getSpecific(nms); + } + + @Contract("null -> null; !null -> !null") + public @Nullable Object toNms(final @Nullable Particle particle) { + return particle == null ? null : ParticleConverterHolder.INSTANCE.getGeneric(particle); + } + + @Contract("null -> null; !null -> !null") + public @Nullable BlockPosition toBlockPosition(final @Nullable Object nms) { + return nms == null ? null : BlockPositionConverterHolder.INSTANCE.getSpecific(nms); + } + + @Contract("null -> null; !null -> !null") + public @Nullable Object toNms(final @Nullable BlockPosition blockPosition) { + return blockPosition == null ? null : BlockPositionConverterHolder.INSTANCE.getGeneric(blockPosition); + } + + @Contract("null -> null; !null -> !null") + public @Nullable Particle toParticle(final @Nullable Object nms) { + return nms == null ? null : ParticleConverterHolder.INSTANCE.getSpecific(nms); + } + + @UtilityClass + private final class Vector3FConverterHolder { + private final @NotNull EquivalentConverter<@NotNull Vector3F> INSTANCE = Vector3F.getConverter(); + } + + @UtilityClass + private final class DirectionConverterHolder { + private final @NotNull EquivalentConverter<@NotNull Direction> INSTANCE = EnumWrappers.getDirectionConverter(); + } + + @UtilityClass + private final class ParticleConverterHolder { + private final @NotNull EquivalentConverter<@NotNull Particle> INSTANCE = EnumWrappers.getParticleConverter(); + } + + @UtilityClass + private final class BlockPositionConverterHolder { + private final @NotNull EquivalentConverter<@NotNull BlockPosition> INSTANCE = BlockPosition.getConverter(); + } +} From 0402702df4f6cdc0e60789bb2b242d175e677102 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 2 Jun 2021 16:19:27 +0300 Subject: [PATCH 468/508] feat: add support for missing DataWatcher data types --- .../minecraft/commons/nms/NmsUtil.java | 2 +- .../nms/metadata/DataWatcherFactory.java | 464 ++++++++++++++---- .../metadata/LegacyDataWatcherFactory.java | 180 ++++--- .../nms/metadata/MetadataGenerator.java | 16 +- .../metadata/StandardDataWatcherFactory.java | 433 +++++++++++----- 5 files changed, 818 insertions(+), 277 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java index 9f2954677..cdc130d46 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java @@ -69,7 +69,7 @@ else throw new InternalError( * DataWatcher factory valid for current server version */ private final DataWatcherFactory DATA_WATCHER_FACTORY = NMS_VERSION.getGeneration() < 9 - ? new LegacyDataWatcherFactory() : new StandardDataWatcherFactory(); + ? LegacyDataWatcherFactory.create() : StandardDataWatcherFactory.create(); /** * Gets version of the current server. diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java index db347f2bc..154d8c040 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/DataWatcherFactory.java @@ -3,32 +3,44 @@ import com.comphenix.protocol.utility.MinecraftReflection; import com.comphenix.protocol.wrappers.*; import com.comphenix.protocol.wrappers.EnumWrappers.Direction; +import com.comphenix.protocol.wrappers.nbt.NbtCompound; +import lombok.NonNull; import org.bukkit.inventory.ItemStack; -import ru.progrm_jarvis.minecraft.commons.nms.Conversions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import ru.progrm_jarvis.minecraft.commons.nms.ProtocolLibConversions; -import java.util.Optional; import java.util.UUID; -@SuppressWarnings("OptionalUsedAsFieldOrParameterType") public interface DataWatcherFactory { + // Modifier creation + /** - * Creates watchable object for {@code byte} value at index specified. + * Creates new modifier for {@link WrappedDataWatcher} specified. * - * @param id id of a value - * @param value value - * @return created watchable object + * @param watcher which to use as modifier backend + * @return created modifier */ - WrappedWatchableObject createWatchable(int id, byte value); + @NotNull DataWatcherModifier modifier(WrappedDataWatcher watcher); /** - * Creates watchable object for {@code short} value at index specified. + * Creates new modifier of {@link WrappedDataWatcher}. + * + * @return created modifier + */ + @NotNull DataWatcherModifier modifier(); + + // Actual types + + /** + * Creates watchable object for {@code byte} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, short value); + @NotNull WrappedWatchableObject createWatchable(int id, byte value); /** * Creates watchable object for {@code int} value at index specified. @@ -37,7 +49,7 @@ public interface DataWatcherFactory { * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, int value); + @NotNull WrappedWatchableObject createWatchable(int id, int value); /** * Creates watchable object for {@code float} value at index specified. @@ -46,7 +58,7 @@ public interface DataWatcherFactory { * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, float value); + @NotNull WrappedWatchableObject createWatchable(int id, float value); /** * Creates watchable object for {@link String} value at index specified. @@ -55,7 +67,7 @@ public interface DataWatcherFactory { * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, String value); + @NotNull WrappedWatchableObject createWatchable(int id, String value); /** * Creates watchable object for {@code IChatBaseComponent} value at index specified. @@ -64,7 +76,7 @@ public interface DataWatcherFactory { * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchableIChatBaseComponent(int id, Object value); + @NotNull WrappedWatchableObject createWatchableIChatBaseComponent(int id, @NonNull Object value); /** * Creates watchable object for {@link WrappedChatComponent} value at index specified. @@ -73,38 +85,51 @@ public interface DataWatcherFactory { * @param value value * @return created watchable object */ - default WrappedWatchableObject createWatchable(final int id, final WrappedChatComponent value) { + default @NotNull WrappedWatchableObject createWatchable(final int id, final @NonNull WrappedChatComponent value) { return createWatchableIChatBaseComponent(id, value.getHandle()); } /** - * Creates watchable object for NMS {@code ItemStack} value at index specified. + * Creates watchable object for optional {@code IChatBaseComponent} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchableItemStack(int id, Object value); + @NotNull WrappedWatchableObject createWatchableOptionalIChatBaseComponent(int id, + @Nullable Object value); /** - * Creates watchable object for {@link ItemStack} value at index specified. + * Creates watchable object for optional {@link WrappedChatComponent} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - default WrappedWatchableObject createWatchable(final int id, final ItemStack value) { - return createWatchableItemStack(id, MinecraftReflection.getMinecraftItemStack(value)); + default @NotNull WrappedWatchableObject createWatchableOptional(final int id, + final @Nullable WrappedChatComponent value) { + return createWatchableOptionalIChatBaseComponent(id, value == null ? null : value.getHandle()); } /** - * Creates watchable object for {@code Optional} value at index specified. + * Creates watchable object for NMS {@code ItemStack} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchableOptionalIBlockData(int id, Optional value); + @NotNull WrappedWatchableObject createWatchableItemStack(int id, Object value); + + /** + * Creates watchable object for {@link ItemStack} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + default @NotNull WrappedWatchableObject createWatchable(final int id, final ItemStack value) { + return createWatchableItemStack(id, MinecraftReflection.getMinecraftItemStack(value)); + } /** * Creates watchable object for {@code boolean} value at index specified. @@ -113,7 +138,7 @@ default WrappedWatchableObject createWatchable(final int id, final ItemStack val * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, boolean value); + @NotNull WrappedWatchableObject createWatchable(int id, boolean value); /** * Creates watchable object for {@code Vector3f} value at index specified. @@ -122,7 +147,7 @@ default WrappedWatchableObject createWatchable(final int id, final ItemStack val * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchableVector3f(int id, Object value); + @NotNull WrappedWatchableObject createWatchableVector3f(int id, @NonNull Object value); /** * Creates watchable object for {@link Vector3F} value at index specified. @@ -131,10 +156,19 @@ default WrappedWatchableObject createWatchable(final int id, final ItemStack val * @param value value * @return created watchable object */ - default WrappedWatchableObject createWatchable(final int id, final Vector3F value) { - return createWatchableVector3f(id, Conversions.toNms(value)); + default @NotNull WrappedWatchableObject createWatchable(final int id, final @NonNull Vector3F value) { + return createWatchableVector3f(id, ProtocolLibConversions.toNms(value)); } + /** + * Creates watchable object for {@code BlockPosition} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + @NotNull WrappedWatchableObject createWatchableBlockPosition(int id, @NonNull Object value); + /** * Creates watchable object for {@link BlockPosition} value at index specified. * @@ -142,16 +176,29 @@ default WrappedWatchableObject createWatchable(final int id, final Vector3F valu * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchable(int id, BlockPosition value); + default @NotNull WrappedWatchableObject createWatchable(final int id, final @NonNull BlockPosition value) { + return createWatchableBlockPosition(id, ProtocolLibConversions.toNms(value)); + } /** - * Creates watchable object for {@link Optional} value at index specified. + * Creates watchable object for optional {@code BlockPosition} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchableOptionalBlockPosition(int id, Optional value); + @NotNull WrappedWatchableObject createWatchableOptionalBlockPosition(int id, @Nullable Object value); + + /** + * Creates watchable object for optional {@link BlockPosition} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + default @NotNull WrappedWatchableObject createWatchableOptional(final int id, final @Nullable BlockPosition value) { + return createWatchableOptionalBlockPosition(id, ProtocolLibConversions.toBlockPosition(value)); + } /** * Creates watchable object for {@code EnumDirection} value at index specified. @@ -160,7 +207,7 @@ default WrappedWatchableObject createWatchable(final int id, final Vector3F valu * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchableEnumDirection(int id, Object value); + @NotNull WrappedWatchableObject createWatchableEnumDirection(int id, @NonNull Object value); /** * Creates watchable object for {@link Direction} value at index specified. @@ -169,18 +216,39 @@ default WrappedWatchableObject createWatchable(final int id, final Vector3F valu * @param value value * @return created watchable object */ - default WrappedWatchableObject createWatchable(final int id, final Direction value) { - return createWatchableEnumDirection(id, Conversions.toNms(value)); + default @NotNull WrappedWatchableObject createWatchable(final int id, final @NonNull Direction value) { + return createWatchableEnumDirection(id, ProtocolLibConversions.toNms(value)); } /** - * Creates watchable object for {@link Optional} value at index specified. + * Creates watchable object for optional {@link UUID} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchableOptionalUUID(int id, Optional value); + @NotNull WrappedWatchableObject createWatchableOptional(int id, @Nullable UUID value); + + /** + * Creates watchable object for optional {@code IBlockData} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + @NotNull WrappedWatchableObject createWatchableOptionalIBlockData(int id, @Nullable Object value); + + /** + * Creates watchable object for optional {@link WrappedBlockData} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + default @NotNull WrappedWatchableObject createWatchableOptional(final int id, + final @Nullable WrappedBlockData value) { + return createWatchableOptionalIBlockData(id, value == null ? null : value.getHandle()); + } /** * Creates watchable object for {@code NBTTagCompound} value at index specified. @@ -189,31 +257,111 @@ default WrappedWatchableObject createWatchable(final int id, final Direction val * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchableNBTTagCompound(int id, Object value); + @NotNull WrappedWatchableObject createWatchableNBTTagCompound(int id, @NonNull Object value); /** - * Creates watchable object for {@link Object} value at index specified. + * Creates watchable object for {@code NBTTagCompound} value at index specified. * * @param id id of a value * @param value value * @return created watchable object */ - WrappedWatchableObject createWatchableObject(int id, Object value); + default @NotNull WrappedWatchableObject createWatchable(final int id, final @NonNull NbtCompound value) { + return createWatchableNBTTagCompound(id, value.getHandle()); + } /** - * Creates new modifier for {@link WrappedDataWatcher} specified. + * Creates watchable object for {@code Particle} value at index specified. * - * @param watcher which to use as modifier backend - * @return created modifier + * @param id id of a value + * @param value value + * @return created watchable object */ - DataWatcherModifier modifier(WrappedDataWatcher watcher); + @NotNull WrappedWatchableObject createWatchableParticle(int id, @NonNull Object value); /** - * Creates new modifier of {@link WrappedDataWatcher}. + * Creates watchable object for {@link EnumWrappers.Particle} value at index specified. * - * @return created modifier + * @param id id of a value + * @param value value + * @return created watchable object + */ + default @NotNull WrappedWatchableObject createWatchable(final int id, final @NonNull WrappedParticle value) { + return createWatchableParticle(id, value.getHandle()); + } + + /** + * Creates watchable object for {@code VillagerData} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + @NotNull WrappedWatchableObject createWatchableVillagerData(int id, @NonNull Object value); + + /** + * Creates watchable object for {@link EnumWrappers.Particle} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + default @NotNull WrappedWatchableObject createWatchable(final int id, final @NonNull WrappedVillagerData value) { + return createWatchableVillagerData(id, value.getHandle()); + } + + /** + * Creates watchable object for optional {@code int} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + @NotNull WrappedWatchableObject createWatchableOptional(int id, @Nullable Integer value); + + /** + * Creates watchable object for {@code EntityPose} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object */ - DataWatcherModifier modifier(); + @NotNull WrappedWatchableObject createWatchableEntityPose(int id, @NonNull Object value); + + /** + * Creates watchable object for {@link EnumWrappers.EntityPose} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + default @NotNull WrappedWatchableObject createWatchable(final int id, + final @NonNull EnumWrappers.EntityPose value) { + return createWatchableEntityPose(id, value.toNms()); + } + + // Unsupported types + + /** + * Creates watchable object for {@code short} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + */ + @NotNull WrappedWatchableObject createWatchable(int id, short value); + + /** + * Creates watchable object for {@link Object} value at index specified. + * + * @param id id of a value + * @param value value + * @return created watchable object + * + * @apiNote this should only be used if there is no type-safe on NMS-specific analog + */ + // should be used if and only if none of default #set[..](id, value) methods don't provide type given + @NotNull WrappedWatchableObject createWatchableObject(int id, Object value); /** * Modifier of {@link WrappedDataWatcher} which applies all changes to DataWatcher. @@ -221,29 +369,38 @@ default WrappedWatchableObject createWatchable(final int id, final Direction val interface DataWatcherModifier { /** - * Deeply clones this modifier to a new one. + * Returns DataWatcher modified. * - * @return this modifier's copy + * @return DataWatcher modified */ - DataWatcherModifier clone(); + @NotNull WrappedDataWatcher dataWatcher(); /** - * Sets DataWatcher's modifier to specified {@code byte} value at specified index. + * Returns deep clone of DataWatcher modified. * - * @param id id of a value - * @param value value to set at id - * @return this DataWatcher builder + * @return clone of DataWatcher modified */ - DataWatcherModifier set(int id, byte value); + default @NotNull WrappedDataWatcher dataWatcherClone() { + return dataWatcher().deepClone(); + } /** - * Sets DataWatcher's modifier to specified {@code short} value at specified index. + * Deeply clones this modifier to a new one. + * + * @return this modifier's copy + */ + @NotNull DataWatcherModifier clone(); + + // Actual types + + /** + * Sets DataWatcher's modifier to specified {@code byte} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, short value); + @NotNull DataWatcherModifier set(int id, byte value); /** * Sets DataWatcher's modifier to specified {@code int} value at specified index. @@ -252,7 +409,7 @@ interface DataWatcherModifier { * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, int value); + @NotNull DataWatcherModifier set(int id, int value); /** * Sets DataWatcher's modifier to specified {@code float} value at specified index. @@ -261,7 +418,7 @@ interface DataWatcherModifier { * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, float value); + @NotNull DataWatcherModifier set(int id, float value); /** * Sets DataWatcher's modifier to specified {@link String} value at specified index. @@ -270,7 +427,7 @@ interface DataWatcherModifier { * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, String value); + @NotNull DataWatcherModifier set(int id, @NonNull String value); /** * Sets DataWatcher's modifier to specified {@code IChatBaseComponent} value at specified index. @@ -279,7 +436,7 @@ interface DataWatcherModifier { * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier setIChatBaseComponent(int id, Object value); + @NotNull DataWatcherModifier setIChatBaseComponent(int id, @NonNull Object value); /** * Sets DataWatcher's modifier to specified {@link WrappedChatComponent} value at specified index. @@ -288,38 +445,49 @@ interface DataWatcherModifier { * @param value value to set at id * @return this DataWatcher builder */ - default DataWatcherModifier setIChatBaseComponent(final int id, final WrappedChatComponent value) { + default @NotNull DataWatcherModifier set(final int id, final @NonNull WrappedChatComponent value) { return setIChatBaseComponent(id, value.getHandle()); } /** - * Sets DataWatcher's modifier to specified NMS {@code ItemStack} value at specified index. + * Sets DataWatcher's modifier to specified optional {@code IChatBaseComponent} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier setItemStack(int id, Object value); + @NotNull DataWatcherModifier setOptionalIChatBaseComponent(int id, @Nullable Object value); /** - * Sets DataWatcher's modifier to specified {@link ItemStack} value at specified index. + * Sets DataWatcher's modifier to specified optional {@link WrappedChatComponent} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - default DataWatcherModifier set(final int id, final ItemStack value) { - return setItemStack(id, MinecraftReflection.getMinecraftItemStack(value)); + default @NotNull DataWatcherModifier setOptional(final int id, final @Nullable WrappedChatComponent value) { + return setOptionalIChatBaseComponent(id, value == null ? null : value.getHandle()); } /** - * Sets DataWatcher's modifier to specified {@code Optional} value at specified index. + * Sets DataWatcher's modifier to specified NMS {@code ItemStack} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier setOptionalIBlockData(int id, Optional value); + @NotNull DataWatcherModifier setItemStack(int id, @NonNull Object value); + + /** + * Sets DataWatcher's modifier to specified {@link ItemStack} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + default @NotNull DataWatcherModifier set(final int id, final @NonNull ItemStack value) { + return setItemStack(id, MinecraftReflection.getMinecraftItemStack(value)); + } /** * Sets DataWatcher's modifier to specified {@code boolean} value at specified index. @@ -328,7 +496,7 @@ default DataWatcherModifier set(final int id, final ItemStack value) { * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, boolean value); + @NotNull DataWatcherModifier set(int id, boolean value); /** * Sets DataWatcher's modifier to specified {@code Vector3f} value at specified index. @@ -337,7 +505,7 @@ default DataWatcherModifier set(final int id, final ItemStack value) { * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier setVector3f(int id, Object value); + @NotNull DataWatcherModifier setVector3f(int id, @NonNull Object value); /** * Sets DataWatcher's modifier to specified {@link Vector3F} value at specified index. @@ -346,10 +514,19 @@ default DataWatcherModifier set(final int id, final ItemStack value) { * @param value value to set at id * @return this DataWatcher builder */ - default DataWatcherModifier set(final int id, final Vector3F value) { - return setVector3f(id, Conversions.toNms(value)); + default @NotNull DataWatcherModifier set(final int id, final @NonNull Vector3F value) { + return setVector3f(id, ProtocolLibConversions.toNms(value)); } + /** + * Sets DataWatcher's modifier to specified {@code BlockPosition} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + @NotNull DataWatcherModifier setBlockPosition(int id, @NonNull Object value); + /** * Sets DataWatcher's modifier to specified {@link BlockPosition} value at specified index. * @@ -357,16 +534,29 @@ default DataWatcherModifier set(final int id, final Vector3F value) { * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier set(int id, BlockPosition value); + default @NotNull DataWatcherModifier set(int id, final @NonNull BlockPosition value) { + return setBlockPosition(id, ProtocolLibConversions.toNms(value)); + } /** - * Sets DataWatcher's modifier to specified {@link Optional} value at specified index. + * Sets DataWatcher's modifier to specified optional {@code BlockPosition} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier setOptionalBlockPosition(int id, Optional value); + @NotNull DataWatcherModifier setOptionalBlockPosition(int id, @Nullable Object value); + + /** + * Sets DataWatcher's modifier to specified optional {@link BlockPosition} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + default @NotNull DataWatcherModifier setOptional(final int id, final @Nullable BlockPosition value) { + return setOptionalBlockPosition(id, ProtocolLibConversions.toNms(value)); + } /** * Sets DataWatcher's modifier to specified {@code EnumDirection} value at specified index. @@ -375,7 +565,7 @@ default DataWatcherModifier set(final int id, final Vector3F value) { * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier setEnumDirection(int id, Object value); + @NotNull DataWatcherModifier setEnumDirection(int id, @NonNull Object value); /** * Sets DataWatcher's modifier to specified {@link Direction} value at specified index. @@ -384,8 +574,37 @@ default DataWatcherModifier set(final int id, final Vector3F value) { * @param value value to set at id * @return this DataWatcher builder */ - default DataWatcherModifier set(final int id, final Direction value) { - return setEnumDirection(id, Conversions.toNms(value)); + default @NotNull DataWatcherModifier set(final int id, final @NonNull Direction value) { + return setEnumDirection(id, ProtocolLibConversions.toNms(value)); + } + + /** + * Sets DataWatcher's modifier to specified optional {@link UUID} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + @NotNull DataWatcherModifier setOptional(int id, @Nullable UUID value); + + /** + * Sets DataWatcher's modifier to specified optional {@code IBlockData} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + @NotNull DataWatcherModifier setOptionalIBlockData(int id, @Nullable Object value); + + /** + * Sets DataWatcher's modifier to specified optional {@link WrappedBlockData} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + default @NotNull DataWatcherModifier setOptional(final int id, final @Nullable WrappedBlockData value) { + return setOptionalIBlockData(id, value == null ? null : value.getHandle()); } /** @@ -395,41 +614,108 @@ default DataWatcherModifier set(final int id, final Direction value) { * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier setNBTTagCompound(int id, Object value); + @NotNull DataWatcherModifier setNBTTagCompound(int id, @NonNull Object value); /** - * Sets DataWatcher's modifier to specified {@link Optional} value at specified index. + * Sets DataWatcher's modifier to specified {@link NbtCompound} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - DataWatcherModifier setOptionalUUID(int id, Optional value); + default @NotNull DataWatcherModifier set(final int id, final @NonNull NbtCompound value) { + return setNBTTagCompound(id, value.getHandle()); + } /** - * Sets DataWatcher's modifier to specified {@link Object} value at specified index. + * Sets DataWatcher's modifier to specified {@code Particle} value at specified index. * * @param id id of a value * @param value value to set at id * @return this DataWatcher builder */ - // should be used if and only if none of default #setOptionalBlockPosition(id, value) methods don't provide type given - DataWatcherModifier setObject(int id, Object value); + @NotNull DataWatcherModifier setParticle(int id, @NonNull Object value); /** - * Returns DataWatcher modified. + * Sets DataWatcher's modifier to specified {@link NbtCompound} value at specified index. * - * @return DataWatcher modified + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder */ - WrappedDataWatcher dataWatcher(); + default @NotNull DataWatcherModifier set(final int id, final @NonNull WrappedParticle value) { + return setParticle(id, value.getHandle()); + } /** - * Returns deep clone of DataWatcher modified. + * Sets DataWatcher's modifier to specified {@code VillagerData} value at specified index. * - * @return clone of DataWatcher modified + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder */ - default WrappedDataWatcher dataWatcherClone() { - return dataWatcher().deepClone(); + @NotNull DataWatcherModifier setVillagerData(int id, @NonNull Object value); + + /** + * Sets DataWatcher's modifier to specified {@link WrappedVillagerData} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + default @NotNull DataWatcherModifier set(final int id, final @NonNull WrappedVillagerData value) { + return setVillagerData(id, value.getHandle()); + } + + /** + * Sets DataWatcher's modifier to specified optional {@code int} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + @NotNull DataWatcherModifier setOptional(int id, @Nullable Integer value); + + /** + * Sets DataWatcher's modifier to specified {@code VillagerData} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + @NotNull DataWatcherModifier setEntityPose(int id, @NonNull Object value); + + /** + * Sets DataWatcher's modifier to specified {@link EnumWrappers.EntityPose} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + default @NotNull DataWatcherModifier set(final int id, final @NonNull EnumWrappers.EntityPose value) { + return setEntityPose(id, value.toNms()); } + + // Unsupported types + + /** + * Sets DataWatcher's modifier to specified {@code short} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + */ + @NotNull DataWatcherModifier set(int id, short value); + + /** + * Sets DataWatcher's modifier to specified {@link Object} value at specified index. + * + * @param id id of a value + * @param value value to set at id + * @return this DataWatcher builder + * + * @apiNote this should only be used if there is no type-safe on NMS-specific analog + */ + @NotNull DataWatcherModifier setObject(int id, Object value); } } diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java index cca9b6d59..fa90ce1b1 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/LegacyDataWatcherFactory.java @@ -1,11 +1,13 @@ package ru.progrm_jarvis.minecraft.commons.nms.metadata; -import com.comphenix.protocol.utility.MinecraftReflection; -import com.comphenix.protocol.wrappers.BlockPosition; import com.comphenix.protocol.wrappers.WrappedDataWatcher; import com.comphenix.protocol.wrappers.WrappedWatchableObject; +import lombok.AccessLevel; +import lombok.NonNull; import lombok.RequiredArgsConstructor; -import org.bukkit.inventory.ItemStack; +import lombok.experimental.FieldDefaults; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Optional; import java.util.UUID; @@ -13,234 +15,300 @@ /** * DataWatcher factory for pre 1.9 versions. */ -public class LegacyDataWatcherFactory implements DataWatcherFactory { +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public final class LegacyDataWatcherFactory implements DataWatcherFactory { + + public static @NotNull DataWatcherFactory create() { + return new LegacyDataWatcherFactory(); + } @Override - public DataWatcherModifier modifier(WrappedDataWatcher watcher) { - return new DataWatcherModifier(watcher); + public @NotNull DataWatcherModifier modifier(final @NonNull WrappedDataWatcher watcher) { + return new LegacyDataWatcherModifier(watcher); } @Override - public DataWatcherModifier modifier() { - return new DataWatcherModifier(); + public @NotNull DataWatcherModifier modifier() { + return new LegacyDataWatcherModifier(new WrappedDataWatcher()); } + // Actual types + @Override - public WrappedWatchableObject createWatchable(final int id, final byte value) { + public @NotNull WrappedWatchableObject createWatchable(final int id, final byte value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchable(final int id, final short value) { + public @NotNull WrappedWatchableObject createWatchable(final int id, final int value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchable(final int id, final int value) { + public @NotNull WrappedWatchableObject createWatchable(final int id, final float value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchable(final int id, final float value) { + public @NotNull WrappedWatchableObject createWatchable(final int id, final String value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchable(final int id, final String value) { + public @NotNull WrappedWatchableObject createWatchableIChatBaseComponent(final int id, + final @NonNull Object value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchableIChatBaseComponent(final int id, final Object value) { + public @NotNull WrappedWatchableObject createWatchableOptionalIChatBaseComponent(final int id, + final @Nullable Object value) { + return new WrappedWatchableObject(id, Optional.ofNullable(value)); + } + + @Override + public @NotNull WrappedWatchableObject createWatchableItemStack(final int id, final Object value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchableItemStack(final int id, final Object value) { + public @NotNull WrappedWatchableObject createWatchable(final int id, final boolean value) { + return createWatchable(id, value ? (byte) 0x1 : (byte) 0x0); + } + + @Override + public @NotNull WrappedWatchableObject createWatchableVector3f(final int id, final @NonNull Object value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchableOptionalIBlockData(final int id, final Optional value) { + public @NotNull WrappedWatchableObject createWatchableBlockPosition(final int id, final @NonNull Object value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchable(final int id, final boolean value) { - return createWatchable(id, value ? (byte) 0x1 : (byte) 0x0); + public @NotNull WrappedWatchableObject createWatchableOptionalBlockPosition(final int id, + final @Nullable Object value) { + return new WrappedWatchableObject(id, Optional.ofNullable(value)); } @Override - public WrappedWatchableObject createWatchableVector3f(final int id, final Object value) { + public @NotNull WrappedWatchableObject createWatchableEnumDirection(final int id, final @NonNull Object value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchable(final int id, final BlockPosition value) { + public @NotNull WrappedWatchableObject createWatchableOptional(final int id, final @Nullable UUID value) { + return new WrappedWatchableObject(id, Optional.ofNullable(value)); + } + + @Override + public @NotNull WrappedWatchableObject createWatchableOptionalIBlockData(final int id, + final @Nullable Object value) { + return new WrappedWatchableObject(id, Optional.ofNullable(value)); + } + + @Override + public @NotNull WrappedWatchableObject createWatchableNBTTagCompound(final int id, final @NonNull Object value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchableOptionalBlockPosition(final int id, final Optional value) { + public @NotNull WrappedWatchableObject createWatchableParticle(final int id, final @NonNull Object value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchableEnumDirection(final int id, final Object value) { + public @NotNull WrappedWatchableObject createWatchableVillagerData(final int id, final @NonNull Object value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchableOptionalUUID(final int id, final Optional value) { + public @NotNull WrappedWatchableObject createWatchableOptional(final int id, final @Nullable Integer value) { + return new WrappedWatchableObject(id, Optional.ofNullable(value)); + } + + @Override + public @NotNull WrappedWatchableObject createWatchableEntityPose(final int id, final @NonNull Object value) { return new WrappedWatchableObject(id, value); } + // Unsupported types + @Override - public WrappedWatchableObject createWatchableNBTTagCompound(final int id, final Object value) { + public @NotNull WrappedWatchableObject createWatchable(final int id, final short value) { return new WrappedWatchableObject(id, value); } @Override - public WrappedWatchableObject createWatchableObject(final int id, final Object value) { + public @NotNull WrappedWatchableObject createWatchableObject(final int id, final Object value) { return new WrappedWatchableObject(id, value); } - @RequiredArgsConstructor - private class DataWatcherModifier implements DataWatcherFactory.DataWatcherModifier { + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + private static final class LegacyDataWatcherModifier implements DataWatcherFactory.DataWatcherModifier { - private final WrappedDataWatcher dataWatcher; + @NotNull WrappedDataWatcher dataWatcher; - private DataWatcherModifier() { - this(new WrappedDataWatcher()); + @Override + public @NotNull WrappedDataWatcher dataWatcher() { + return dataWatcher; } @Override @SuppressWarnings("MethodDoesntCallSuperMethod") - public DataWatcherFactory.DataWatcherModifier clone() { - return new DataWatcherModifier(dataWatcher.deepClone()); + public @NotNull DataWatcherFactory.DataWatcherModifier clone() { + return new LegacyDataWatcherModifier(dataWatcher.deepClone()); } + // Actual types + @Override - public WrappedDataWatcher dataWatcher() { - return dataWatcher; + public @NotNull DataWatcherModifier set(final int id, final byte value) { + dataWatcher.setObject(id, value); + + return this; } @Override - public DataWatcherModifier set(final int id, final byte value) { + public @NotNull DataWatcherModifier set(final int id, final int value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherFactory.DataWatcherModifier set(final int id, final short value) { + public @NotNull DataWatcherModifier set(final int id, final float value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherModifier set(final int id, final int value) { + public @NotNull DataWatcherModifier set(final int id, final @NonNull String value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherModifier set(final int id, final float value) { + public @NotNull DataWatcherModifier setIChatBaseComponent(final int id, final @NonNull Object value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherModifier set(final int id, final String value) { - dataWatcher.setObject(id, value); + public @NotNull DataWatcherModifier setOptionalIChatBaseComponent(final int id, final @Nullable Object value) { + dataWatcher.setObject(id, Optional.ofNullable(value)); return this; } + @Override - public DataWatcherModifier setIChatBaseComponent(final int id, final Object value) { + public @NotNull DataWatcherModifier setItemStack(final int id, final @NonNull Object value) { dataWatcher.setObject(id, value); return this; } + @Override + public @NotNull DataWatcherModifier set(final int id, final boolean value) { + dataWatcher.setObject(id, value ? (byte) 0x1 : (byte) 0x0); + + return this; + } + + @Override + public @NotNull DataWatcherModifier setVector3f(final int id, final @NonNull Object value) { + dataWatcher.setObject(id, value); + + return this; + } @Override - public DataWatcherModifier setItemStack(final int id, final Object value) { + public @NotNull DataWatcherModifier setBlockPosition(final int id, final @NonNull Object value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherModifier set(final int id, final ItemStack value) { - dataWatcher.setObject(id, MinecraftReflection.getMinecraftItemStack(value)); + public @NotNull DataWatcherModifier setOptionalBlockPosition(final int id, final @Nullable Object value) { + dataWatcher.setObject(id, Optional.ofNullable(value)); return this; } @Override - public DataWatcherModifier setOptionalIBlockData(final int id, final Optional value) { + public @NotNull DataWatcherModifier setEnumDirection(final int id, final @NonNull Object value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherModifier set(final int id, final boolean value) { - dataWatcher.setObject(id, value ? (byte) 0x1 : (byte) 0x0); + public @NotNull DataWatcherModifier setOptional(final int id, final @Nullable UUID value) { + dataWatcher.setObject(id, Optional.ofNullable(value)); return this; } @Override - public DataWatcherModifier setVector3f(final int id, final Object value) { - dataWatcher.setObject(id, value); + public @NotNull DataWatcherModifier setOptionalIBlockData(final int id, final @Nullable Object value) { + dataWatcher.setObject(id, Optional.ofNullable(value)); return this; } @Override - public DataWatcherModifier set(final int id, final BlockPosition value) { + public @NotNull DataWatcherModifier setNBTTagCompound(final int id, final @NonNull Object value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherModifier setOptionalBlockPosition(final int id, final Optional value) { + public @NotNull DataWatcherModifier setParticle(final int id, final @NonNull Object value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherModifier setEnumDirection(final int id, final Object value) { + public @NotNull DataWatcherModifier setVillagerData(final int id, final @NonNull Object value) { dataWatcher.setObject(id, value); return this; } @Override - public DataWatcherModifier setNBTTagCompound(final int id, final Object value) { + public @NotNull DataWatcherModifier setOptional(final int id, final @Nullable Integer value) { + dataWatcher.setObject(id, Optional.ofNullable(value)); + + return this; + } + + @Override + public @NotNull DataWatcherModifier setEntityPose(final int id, final @NonNull Object value) { dataWatcher.setObject(id, value); return this; } + // Unsupported types + @Override - public DataWatcherModifier setOptionalUUID(final int id, final Optional value) { + public @NotNull DataWatcherModifier set(final int id, final short value) { dataWatcher.setObject(id, value); return this; } - // should be used if and only if none of default #setOptionalBlockPosition(id, value) methods don't provide type given @Override - public DataWatcherModifier setObject(final int id, final Object value) { + public @NotNull DataWatcherModifier setObject(final int id, final Object value) { dataWatcher.setObject(id, value); return this; diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java index 3357836f4..5d25a0018 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java @@ -9,7 +9,7 @@ import org.bukkit.Bukkit; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.Nullable; -import ru.progrm_jarvis.minecraft.commons.nms.Conversions; +import ru.progrm_jarvis.minecraft.commons.nms.ProtocolLibConversions; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; import java.util.Optional; @@ -131,7 +131,7 @@ public static WrappedWatchableObject singlePoint(final boolean singlePoint) { public static WrappedWatchableObject singlePoint(final Particle particle) { // unsure (?) - return FACTORY.createWatchableObject(9, Conversions.toNms(particle)); + return FACTORY.createWatchableObject(9, ProtocolLibConversions.toNms(particle)); } } @@ -160,7 +160,7 @@ public static WrappedWatchableObject arrowFlags(final Flag... flags) { } public static WrappedWatchableObject shooter(final @Nullable UUID shooterUuid) { - if (VERSION >= 9) return FACTORY.createWatchableOptionalUUID(7, Optional.ofNullable(shooterUuid)); + if (VERSION >= 9) return FACTORY.createWatchableOptional(7, Optional.ofNullable(shooterUuid)); throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } @@ -243,7 +243,7 @@ public enum Type { public static class EnderCrystal extends Entity { public static WrappedWatchableObject position(final BlockPosition position) { - return FACTORY.createWatchableOptionalBlockPosition(6, Optional.of(position)); + return FACTORY.createWatchableOptional(6, Optional.of(position)); } public static WrappedWatchableObject showBottom(final boolean showBottom) { @@ -642,13 +642,13 @@ public static WrappedWatchableObject horseFlags(final Flag... flags) { } public static WrappedWatchableObject owner(final UUID ownerUuid) { - if (VERSION >= 9) return FACTORY.createWatchableOptionalUUID(14, Optional.ofNullable(ownerUuid)); + if (VERSION >= 9) return FACTORY.createWatchableOptional(14, Optional.ofNullable(ownerUuid)); return FACTORY.createWatchable(21, Bukkit.getOfflinePlayer(ownerUuid).getName()); } @Deprecated public static WrappedWatchableObject owner(final String ownerName) { - if (VERSION >= 9) return FACTORY.createWatchableOptionalUUID( + if (VERSION >= 9) return FACTORY.createWatchableOptional( 14, Optional.of(Bukkit.getOfflinePlayer(ownerName).getUniqueId()) ); return FACTORY.createWatchable(21, ownerName); @@ -869,7 +869,7 @@ public static WrappedWatchableObject tameableFlags(final Flag... flags) { } public static WrappedWatchableObject owner(final UUID ownerUuid) { - return FACTORY.createWatchableOptionalUUID(VERSION >= 9 ? 14 : 17, Optional.ofNullable(ownerUuid)); + return FACTORY.createWatchableOptional(VERSION >= 9 ? 14 : 17, Optional.ofNullable(ownerUuid)); } @RequiredArgsConstructor @@ -1017,7 +1017,7 @@ public static WrappedWatchableObject facing(final EnumWrappers.Direction directi } public static WrappedWatchableObject attachmentPosition(final BlockPosition attachmentPosition) { - return FACTORY.createWatchableOptionalBlockPosition(13, Optional.ofNullable(attachmentPosition)); + return FACTORY.createWatchableOptional(13, Optional.ofNullable(attachmentPosition)); } public static WrappedWatchableObject shieldHeight(final byte shieldHeight) { diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java index 8f4cb1e1b..014a053e1 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/StandardDataWatcherFactory.java @@ -1,10 +1,14 @@ package ru.progrm_jarvis.minecraft.commons.nms.metadata; -import com.comphenix.protocol.wrappers.BlockPosition; -import com.comphenix.protocol.wrappers.WrappedDataWatcher; +import com.comphenix.protocol.utility.MinecraftReflection; +import com.comphenix.protocol.wrappers.*; import com.comphenix.protocol.wrappers.WrappedDataWatcher.Registry; -import com.comphenix.protocol.wrappers.WrappedWatchableObject; +import com.comphenix.protocol.wrappers.WrappedDataWatcher.WrappedDataWatcherObject; +import lombok.AccessLevel; +import lombok.NonNull; import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Optional; import java.util.UUID; @@ -12,94 +16,222 @@ /** * DataWatcher factory for post 1.9 versions. */ -public class StandardDataWatcherFactory implements DataWatcherFactory { - - protected static final WrappedDataWatcher.Serializer - BYTE_SERIALIZER = Registry.get(Byte.class), - SHORT_SERIALIZER, - INTEGER_SERIALIZER = Registry.get(Integer.class), - FLOAT_SERIALIZER = Registry.get(Float.class), - STRING_SERIALIZER = Registry.get(String.class), - I_CHAT_BASE_COMPONENT_SERIALIZER = Registry.getChatComponentSerializer(), - ITEM_STACK_SERIALIZER = Registry.getItemStackSerializer(false), - OPTIONAL_I_BLOCK_DATA_SERIALIZER = Registry.getBlockDataSerializer(true), - BOOLEAN_SERIALIZER = Registry.get(Boolean.class), - VECTOR_3F_SERIALIZER = Registry.getVectorSerializer(), - BLOCK_POSITION_SERIALIZER = Registry.getBlockPositionSerializer(false), - OPTIONAL_BLOCK_POSITION_SERIALIZER = Registry.getBlockPositionSerializer(true), - ENUM_DIRECTION_SERIALIZER = Registry.getDirectionSerializer(), - OPTIONAL_UUID_SERIALIZER = Registry.getUUIDSerializer(true), - NBT_TAG_COMPOUND_SERIALIZER = Registry.getNBTCompoundSerializer(); +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +public final class StandardDataWatcherFactory implements DataWatcherFactory { + + private static final @NotNull WrappedDataWatcher.Serializer BYTE_SERIALIZER + = Registry.get(Byte.class); + private static final @NotNull WrappedDataWatcher.Serializer INT_SERIALIZER + = Registry.get(Integer.class); + private static final @NotNull WrappedDataWatcher.Serializer FLOAT_SERIALIZER + = Registry.get(Float.class); + private static final @NotNull WrappedDataWatcher.Serializer STRING_SERIALIZER + = Registry.get(String.class); + private static final @NotNull WrappedDataWatcher.Serializer I_CHAT_BASE_COMPONENT_SERIALIZER + = Registry.getChatComponentSerializer(); + private static final @NotNull WrappedDataWatcher.Serializer ITEM_STACK_SERIALIZER + = Registry.getItemStackSerializer(false); + private static final @NotNull WrappedDataWatcher.Serializer OPTIONAL_I_BLOCK_DATA_SERIALIZER + = Registry.getBlockDataSerializer(true); + private static final @NotNull WrappedDataWatcher.Serializer BOOLEAN_SERIALIZER + = Registry.get(Boolean.class); + private static final @NotNull WrappedDataWatcher.Serializer VECTOR_3F_SERIALIZER + = Registry.getVectorSerializer(); + private static final @NotNull WrappedDataWatcher.Serializer BLOCK_POSITION_SERIALIZER + = Registry.getBlockPositionSerializer(false); + private static final @NotNull WrappedDataWatcher.Serializer OPTIONAL_BLOCK_POSITION_SERIALIZER + = Registry.getBlockPositionSerializer(true); + private static final @NotNull WrappedDataWatcher.Serializer ENUM_DIRECTION_SERIALIZER + = Registry.getDirectionSerializer(); + private static final @NotNull WrappedDataWatcher.Serializer OPTIONAL_UUID_SERIALIZER + = Registry.getUUIDSerializer(true); + private static final @NotNull WrappedDataWatcher.Serializer NBT_TAG_COMPOUND_SERIALIZER + = Registry.getNBTCompoundSerializer(); + // Previously unsupported types + private static final @Nullable WrappedDataWatcher.Serializer OPTIONAL_I_CHAT_BASE_COMPONENT_SERIALIZER; + private static final @Nullable WrappedDataWatcher.Serializer PARTICLE_SERIALIZER; + private static final @Nullable WrappedDataWatcher.Serializer VILLAGER_DATA_SERIALIZER; + private static final @Nullable WrappedDataWatcher.Serializer ENTITY_POSE_SERIALIZER; + private static final @Nullable WrappedDataWatcher.Serializer OPTIONAL_INT_SERIALIZER; + + // Unsupported types + private static final @Nullable WrappedDataWatcher.Serializer SHORT_SERIALIZER; static { - WrappedDataWatcher.Serializer shortSerializer; + WrappedDataWatcher.Serializer serializer; + try { - shortSerializer = Registry.get(Short.class); + serializer = Registry.get(Integer.class, true); } catch (final IllegalArgumentException e) { - shortSerializer = null; + serializer = null; + } + OPTIONAL_INT_SERIALIZER = serializer; + + try { + serializer = Registry.getChatComponentSerializer(true); + } catch (final IllegalArgumentException e) { + serializer = null; + } + OPTIONAL_I_CHAT_BASE_COMPONENT_SERIALIZER = serializer; + + { + final Class nmsClass; + if ((nmsClass = MinecraftReflection.getParticleTypeClass()) != null) try { + serializer = Registry.get(nmsClass); + } catch (final IllegalArgumentException e) { + serializer = null; + } else serializer = null; + } + PARTICLE_SERIALIZER = serializer; + + { + final Class nmsClass; + if ((nmsClass = WrappedVillagerData.getNmsClass()) != null) try { + serializer = Registry.get(nmsClass); + } catch (final IllegalArgumentException e) { + serializer = null; + } else serializer = null; } - SHORT_SERIALIZER = shortSerializer; + VILLAGER_DATA_SERIALIZER = serializer; + + { + final Class nmsClass; + if ((nmsClass = EnumWrappers.getEntityPoseClass()) != null) try { + serializer = Registry.get(nmsClass); + } catch (final IllegalArgumentException e) { + serializer = null; + } else serializer = null; + } + ENTITY_POSE_SERIALIZER = serializer; + + try { + serializer = Registry.get(Short.class); + } catch (final IllegalArgumentException e) { + serializer = null; + } + SHORT_SERIALIZER = serializer; + } + + public static @NotNull DataWatcherFactory create() { + return new StandardDataWatcherFactory(); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectByte(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, BYTE_SERIALIZER); + @Override + public @NotNull DataWatcherModifier modifier(WrappedDataWatcher watcher) { + return new StandardDataWatcherModifier(new WrappedDataWatcher()); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectShort(final int id) { - if (SHORT_SERIALIZER == null) throw new UnsupportedOperationException("Short serialization is unavailable"); - return new WrappedDataWatcher.WrappedDataWatcherObject(id, SHORT_SERIALIZER); + @Override + public @NotNull DataWatcherModifier modifier() { + return new StandardDataWatcherModifier(new WrappedDataWatcher()); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectInteger(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, INTEGER_SERIALIZER); + // Actual types + + private @NotNull WrappedDataWatcherObject watcherObjectByte(final int id) { + return new WrappedDataWatcherObject(id, BYTE_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectFloat(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, FLOAT_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectInt(final int id) { + return new WrappedDataWatcherObject(id, INT_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectString(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, STRING_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectFloat(final int id) { + return new WrappedDataWatcherObject(id, FLOAT_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectIChatBaseComponent(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, I_CHAT_BASE_COMPONENT_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectString(final int id) { + return new WrappedDataWatcherObject(id, STRING_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectItemStack(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, ITEM_STACK_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectIChatBaseComponent(final int id) { + return new WrappedDataWatcherObject(id, I_CHAT_BASE_COMPONENT_SERIALIZER); + } + + private @NotNull WrappedDataWatcherObject watcherObjectOptionalIChatBaseComponent(final int id) { + if (OPTIONAL_I_CHAT_BASE_COMPONENT_SERIALIZER == null) throw new UnsupportedOperationException( + "Serialization of `Optional` is unavailable" + ); + + return new WrappedDataWatcherObject(id, OPTIONAL_I_CHAT_BASE_COMPONENT_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectOptionalIBlockData(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, OPTIONAL_I_BLOCK_DATA_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectItemStack(final int id) { + return new WrappedDataWatcherObject(id, ITEM_STACK_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectBoolean(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, BOOLEAN_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectBoolean(final int id) { + return new WrappedDataWatcherObject(id, BOOLEAN_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectVector3f(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, VECTOR_3F_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectVector3f(final int id) { + return new WrappedDataWatcherObject(id, VECTOR_3F_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectBlockPosition(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, BLOCK_POSITION_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectBlockPosition(final int id) { + return new WrappedDataWatcherObject(id, BLOCK_POSITION_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectOptionalBlockPosition(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, OPTIONAL_BLOCK_POSITION_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectOptionalBlockPosition(final int id) { + return new WrappedDataWatcherObject(id, OPTIONAL_BLOCK_POSITION_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectEnumDirection(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, ENUM_DIRECTION_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectEnumDirection(final int id) { + return new WrappedDataWatcherObject(id, ENUM_DIRECTION_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectOptionalUUID(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, OPTIONAL_UUID_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectOptionalUUID(final int id) { + return new WrappedDataWatcherObject(id, OPTIONAL_UUID_SERIALIZER); } - protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectNBTTagCompound(final int id) { - return new WrappedDataWatcher.WrappedDataWatcherObject(id, NBT_TAG_COMPOUND_SERIALIZER); + private @NotNull WrappedDataWatcherObject watcherObjectOptionalIBlockData(final int id) { + return new WrappedDataWatcherObject(id, OPTIONAL_I_BLOCK_DATA_SERIALIZER); + } + + private @NotNull WrappedDataWatcherObject watcherObjectNBTTagCompound(final int id) { + return new WrappedDataWatcherObject(id, NBT_TAG_COMPOUND_SERIALIZER); + } + + private @NotNull WrappedDataWatcherObject watcherObjectParticle(final int id) { + if (PARTICLE_SERIALIZER == null) throw new UnsupportedOperationException( + "Serialization of `Particle` is unavailable" + ); + + return new WrappedDataWatcherObject(id, PARTICLE_SERIALIZER); + } + + private @NotNull WrappedDataWatcherObject watcherObjectVillagerData(final int id) { + if (VILLAGER_DATA_SERIALIZER == null) throw new UnsupportedOperationException( + "Serialization of `VillagerData` is unavailable" + ); + + return new WrappedDataWatcherObject(id, VILLAGER_DATA_SERIALIZER); + } + + private @NotNull WrappedDataWatcherObject watcherObjectOptionalInt(final int id) { + if (OPTIONAL_INT_SERIALIZER == null) throw new UnsupportedOperationException( + "Serialization of `Optional` is unavailable" + ); + + return new WrappedDataWatcherObject(id, OPTIONAL_INT_SERIALIZER); + } + + private @NotNull WrappedDataWatcherObject watcherObjectEntityPose(final int id) { + if (ENTITY_POSE_SERIALIZER == null) throw new UnsupportedOperationException( + "Serialization of `EntityPose` is unavailable" + ); + + return new WrappedDataWatcherObject(id, ENTITY_POSE_SERIALIZER); + } + + // Unsupported types + + private @NotNull WrappedDataWatcherObject watcherObjectShort(final int id) { + if (SHORT_SERIALIZER == null) throw new UnsupportedOperationException( + "Serialization of `Short` is unavailable" + ); + + return new WrappedDataWatcherObject(id, SHORT_SERIALIZER); } /////////////////////////////////////////////////////////////////////////// @@ -107,225 +239,280 @@ protected WrappedDataWatcher.WrappedDataWatcherObject watcherObjectNBTTagCompoun /////////////////////////////////////////////////////////////////////////// @Override - public WrappedWatchableObject createWatchable(final int id, final byte value) { + public @NotNull WrappedWatchableObject createWatchable(final int id, final byte value) { return new WrappedWatchableObject(watcherObjectByte(id), value); } @Override - public WrappedWatchableObject createWatchable(final int id, final short value) { - return new WrappedWatchableObject(watcherObjectShort(id), value); + public @NotNull WrappedWatchableObject createWatchable(final int id, final int value) { + return new WrappedWatchableObject(watcherObjectInt(id), value); } @Override - public WrappedWatchableObject createWatchable(final int id, final int value) { - return new WrappedWatchableObject(watcherObjectInteger(id), value); - } - - @Override - public WrappedWatchableObject createWatchable(final int id, final float value) { + public @NotNull WrappedWatchableObject createWatchable(final int id, final float value) { return new WrappedWatchableObject(watcherObjectFloat(id), value); } @Override - public WrappedWatchableObject createWatchable(final int id, final String value) { + public @NotNull WrappedWatchableObject createWatchable(final int id, final String value) { return new WrappedWatchableObject(watcherObjectString(id), value); } @Override - public WrappedWatchableObject createWatchableIChatBaseComponent(final int id, final Object value) { + public @NotNull WrappedWatchableObject createWatchableIChatBaseComponent(final int id, + final @NonNull Object value) { return new WrappedWatchableObject(watcherObjectIChatBaseComponent(id), value); } @Override - public WrappedWatchableObject createWatchableItemStack(final int id, final Object value) { - return new WrappedWatchableObject(watcherObjectItemStack(id), value); + public @NotNull WrappedWatchableObject createWatchableOptionalIChatBaseComponent(final int id, + final @Nullable Object value) { + return new WrappedWatchableObject(watcherObjectOptionalIChatBaseComponent(id), Optional.ofNullable(value)); } @Override - public WrappedWatchableObject createWatchableOptionalIBlockData(final int id, final Optional value) { - return new WrappedWatchableObject(watcherObjectOptionalIBlockData(id), value); + public @NotNull WrappedWatchableObject createWatchableItemStack(final int id, final Object value) { + return new WrappedWatchableObject(watcherObjectItemStack(id), value); } @Override - public WrappedWatchableObject createWatchable(final int id, final boolean value) { + public @NotNull WrappedWatchableObject createWatchable(final int id, final boolean value) { return new WrappedWatchableObject(watcherObjectBoolean(id), value); } @Override - public WrappedWatchableObject createWatchableVector3f(final int id, final Object value) { + public @NotNull WrappedWatchableObject createWatchableVector3f(final int id, final @NotNull Object value) { return new WrappedWatchableObject(watcherObjectVector3f(id), value); } @Override - public WrappedWatchableObject createWatchable(final int id, final BlockPosition value) { + public @NotNull WrappedWatchableObject createWatchableBlockPosition(final int id, final @NotNull Object value) { return new WrappedWatchableObject(watcherObjectBlockPosition(id), value); } @Override - public WrappedWatchableObject createWatchableOptionalBlockPosition(final int id, final Optional value) { - return new WrappedWatchableObject(watcherObjectOptionalBlockPosition(id), value); + public @NotNull WrappedWatchableObject createWatchableOptionalBlockPosition(final int id, + final @Nullable Object value) { + return new WrappedWatchableObject(watcherObjectOptionalBlockPosition(id), Optional.ofNullable(value)); } @Override - public WrappedWatchableObject createWatchableEnumDirection(final int id, final Object value) { + public @NotNull WrappedWatchableObject createWatchableEnumDirection(final int id, final @NonNull Object value) { return new WrappedWatchableObject(watcherObjectEnumDirection(id), value); } @Override - public WrappedWatchableObject createWatchableOptionalUUID(final int id, final Optional value) { - return new WrappedWatchableObject(watcherObjectOptionalUUID(id), value); + public @NotNull WrappedWatchableObject createWatchableOptional(final int id, final @Nullable UUID value) { + return new WrappedWatchableObject(watcherObjectOptionalUUID(id), Optional.ofNullable(value)); + } + + @Override + public @NotNull WrappedWatchableObject createWatchableOptionalIBlockData(final int id, + final @Nullable Object value) { + return new WrappedWatchableObject(watcherObjectOptionalIBlockData(id), Optional.ofNullable(value)); } @Override - public WrappedWatchableObject createWatchableNBTTagCompound(final int id, final Object value) { + public @NotNull WrappedWatchableObject createWatchableNBTTagCompound(final int id, final @NotNull Object value) { return new WrappedWatchableObject(watcherObjectNBTTagCompound(id), value); } @Override - public WrappedWatchableObject createWatchableObject(final int id, final Object value) { - return new WrappedWatchableObject(id, value); + public @NotNull WrappedWatchableObject createWatchableParticle(final int id, final @NotNull Object value) { + return new WrappedWatchableObject(watcherObjectParticle(id), value); } @Override - public DataWatcherModifier modifier(WrappedDataWatcher watcher) { - return new DataWatcherModifier(watcher); + public @NotNull WrappedWatchableObject createWatchableVillagerData(final int id, final @NotNull Object value) { + return new WrappedWatchableObject(watcherObjectVillagerData(id), value); } @Override - public DataWatcherModifier modifier() { - return new DataWatcherModifier(); + public @NotNull WrappedWatchableObject createWatchableOptional(final int id, final @Nullable Integer value) { + return new WrappedWatchableObject(watcherObjectOptionalInt(id), value); } - @RequiredArgsConstructor - private class DataWatcherModifier implements DataWatcherFactory.DataWatcherModifier { + @Override + public @NotNull WrappedWatchableObject createWatchableEntityPose(final int id, final @NotNull Object value) { + return new WrappedWatchableObject(watcherObjectEntityPose(id), value); + } - private final WrappedDataWatcher dataWatcher; + // Unsupported types - private DataWatcherModifier() { - this(new WrappedDataWatcher()); - } + @Override + public @NotNull WrappedWatchableObject createWatchable(final int id, final short value) { + return new WrappedWatchableObject(watcherObjectShort(id), value); + } + + @Override + public @NotNull WrappedWatchableObject createWatchableObject(final int id, final Object value) { + return new WrappedWatchableObject(id, value); + } + + @RequiredArgsConstructor(access = AccessLevel.PRIVATE) + private final class StandardDataWatcherModifier implements DataWatcherModifier { + + private final @NotNull WrappedDataWatcher dataWatcher; @Override - @SuppressWarnings("MethodDoesntCallSuperMethod") - public DataWatcherFactory.DataWatcherModifier clone() { - return new DataWatcherModifier(dataWatcher.deepClone()); + public @NotNull WrappedDataWatcher dataWatcher() { + return dataWatcher; } @Override - public DataWatcherModifier set(final int id, final byte value) { - dataWatcher.setObject(watcherObjectByte(id), value); - - return this; + @SuppressWarnings("MethodDoesntCallSuperMethod") + public @NotNull DataWatcherModifier clone() { + return new StandardDataWatcherModifier(dataWatcher.deepClone()); } + // Actual types + @Override - public DataWatcherFactory.DataWatcherModifier set(final int id, final short value) { - dataWatcher.setObject(watcherObjectShort(id), value); + public @NotNull DataWatcherModifier set(final int id, final byte value) { + dataWatcher.setObject(watcherObjectByte(id), value); return this; } @Override - public DataWatcherModifier set(final int id, final int value) { - dataWatcher.setObject(watcherObjectInteger(id), value); + public @NotNull DataWatcherModifier set(final int id, final int value) { + dataWatcher.setObject(watcherObjectInt(id), value); return this; } @Override - public DataWatcherModifier set(final int id, final float value) { + public @NotNull DataWatcherModifier set(final int id, final float value) { dataWatcher.setObject(watcherObjectFloat(id), value); return this; } @Override - public DataWatcherModifier set(final int id, final String value) { + public @NotNull DataWatcherModifier set(final int id, final @NonNull String value) { dataWatcher.setObject(watcherObjectString(id), value); return this; } @Override - public DataWatcherModifier setIChatBaseComponent(final int id, final Object value) { + public @NotNull DataWatcherModifier setIChatBaseComponent(final int id, final @NonNull Object value) { dataWatcher.setObject(watcherObjectIChatBaseComponent(id), value); return this; } @Override - public DataWatcherModifier setItemStack(int id, Object value) { - dataWatcher.setObject(watcherObjectItemStack(id), value); + public @NotNull DataWatcherModifier setOptionalIChatBaseComponent(final int id, final @Nullable Object value) { + dataWatcher.setObject(watcherObjectOptionalIChatBaseComponent(id), Optional.ofNullable(value)); return this; } @Override - public DataWatcherModifier setOptionalIBlockData(final int id, final Optional value) { - dataWatcher.setObject(watcherObjectOptionalIBlockData(id), value); + public @NotNull DataWatcherModifier setItemStack(int id, @NotNull Object value) { + dataWatcher.setObject(watcherObjectItemStack(id), value); return this; } @Override - public DataWatcherModifier set(final int id, final boolean value) { + public @NotNull DataWatcherModifier set(final int id, final boolean value) { dataWatcher.setObject(watcherObjectBoolean(id), value); return this; } @Override - public DataWatcherModifier setVector3f(final int id, final Object value) { + public @NotNull DataWatcherModifier setVector3f(final int id, final @NonNull Object value) { dataWatcher.setObject(watcherObjectVector3f(id), value); return this; } @Override - public DataWatcherModifier set(final int id, final BlockPosition value) { + public @NotNull DataWatcherModifier setBlockPosition(final int id, final @NotNull Object value) { dataWatcher.setObject(watcherObjectBlockPosition(id), value); return this; } @Override - public DataWatcherModifier setOptionalBlockPosition(final int id, final Optional value) { - dataWatcher.setObject(watcherObjectOptionalBlockPosition(id), value); + public @NotNull DataWatcherModifier setOptionalBlockPosition(final int id, final @Nullable Object value) { + dataWatcher.setObject(watcherObjectOptionalBlockPosition(id), Optional.ofNullable(value)); return this; } @Override - public DataWatcherModifier setEnumDirection(final int id, final Object value) { + public @NotNull DataWatcherModifier setEnumDirection(final int id, final @NonNull Object value) { dataWatcher.setObject(watcherObjectEnumDirection(id), value); return this; } @Override - public DataWatcherModifier setOptionalUUID(final int id, final Optional value) { - dataWatcher.setObject(watcherObjectOptionalUUID(id), value); + public @NotNull DataWatcherModifier setOptional(final int id, final @Nullable UUID value) { + dataWatcher.setObject(watcherObjectOptionalUUID(id), Optional.ofNullable(value)); return this; } @Override - public DataWatcherModifier setNBTTagCompound(final int id, final Object value) { + public @NotNull DataWatcherModifier setOptionalIBlockData(final int id, final @Nullable Object value) { + dataWatcher.setObject(watcherObjectOptionalIBlockData(id), Optional.ofNullable(value)); + + return this; + } + + @Override + public @NotNull DataWatcherModifier setNBTTagCompound(final int id, final @NotNull Object value) { dataWatcher.setObject(watcherObjectNBTTagCompound(id), value); return this; } @Override - public DataWatcherModifier setObject(final int id, final Object value) { - dataWatcher.setObject(id, value); + public @NotNull DataWatcherModifier setParticle(final int id, final @NotNull Object value) { + dataWatcher.setObject(watcherObjectParticle(id), value); return this; } @Override - public WrappedDataWatcher dataWatcher() { - return dataWatcher; + public @NotNull DataWatcherModifier setVillagerData(final int id, final @NotNull Object value) { + dataWatcher.setObject(watcherObjectVillagerData(id), value); + + return this; + } + + @Override + public @NotNull DataWatcherModifier setOptional(final int id, final @Nullable Integer value) { + dataWatcher.setObject(watcherObjectOptionalInt(id), Optional.ofNullable(value)); + + return this; + } + + @Override + public @NotNull DataWatcherModifier setEntityPose(final int id, final @NotNull Object value) { + dataWatcher.setObject(watcherObjectEntityPose(id), value); + + return this; + } + // Unsupported types + + @Override + public @NotNull DataWatcherModifier set(final int id, final short value) { + dataWatcher.setObject(watcherObjectShort(id), value); + + return this; + } + + @Override + public @NotNull DataWatcherModifier setObject(final int id, final Object value) { + dataWatcher.setObject(id, value); + + return this; } } } From 35346aa0dacc998d998ab2dbe7fbd1af9f6211bf Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Wed, 2 Jun 2021 18:03:46 +0300 Subject: [PATCH 469/508] refactor: get rid of most warning in MetadataGenerator --- .../nms/metadata/MetadataGenerator.java | 194 ++++++++++-------- 1 file changed, 110 insertions(+), 84 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java index 5d25a0018..d8541f3b0 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java @@ -4,13 +4,14 @@ import com.comphenix.protocol.wrappers.EnumWrappers.Particle; import com.comphenix.protocol.wrappers.nbt.NbtCompound; import lombok.*; +import lombok.experimental.Accessors; import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.Nullable; -import ru.progrm_jarvis.minecraft.commons.nms.ProtocolLibConversions; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; +import ru.progrm_jarvis.minecraft.commons.nms.ProtocolLibConversions; import java.util.Optional; import java.util.UUID; @@ -22,7 +23,7 @@ * @see 1.8 metadata format */ @UtilityClass -@SuppressWarnings("ClassWithOnlyPrivateConstructors") +@SuppressWarnings({"ClassWithOnlyPrivateConstructors", "EmptyClass", "unused", "NonFinalUtilityClass"}) public class MetadataGenerator { private final int VERSION = NmsUtil.getVersion().getGeneration(); @@ -33,7 +34,7 @@ public static class Entity { public static WrappedWatchableObject entityFlags(final Flag... flags) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(0, flagBytes); } @@ -67,6 +68,7 @@ public static WrappedWatchableObject noGravity(final boolean noGravity) { // TODO add Pose support for late versions (available since 1.14) @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { ON_FIRE((byte) 0x01), @@ -78,7 +80,7 @@ public enum Flag { INVISIBLE((byte) 0x20), GLOWING((byte) 0x80); - byte value; + @Getter byte value; } } @@ -154,13 +156,13 @@ public static class Arrow extends Entity { public static WrappedWatchableObject arrowFlags(final Flag... flags) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(VERSION >= 9 ? 6 : 16, flagBytes); } public static WrappedWatchableObject shooter(final @Nullable UUID shooterUuid) { - if (VERSION >= 9) return FACTORY.createWatchableOptional(7, Optional.ofNullable(shooterUuid)); + if (VERSION >= 9) return FACTORY.createWatchableOptional(7, shooterUuid); throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } @@ -206,7 +208,7 @@ public static WrappedWatchableObject damageTaken(final float damageTaken) { } public static WrappedWatchableObject type(final Type type) { - if (VERSION >= 9) return FACTORY.createWatchable(9, type.value); + if (VERSION >= 9) return FACTORY.createWatchable(9, type.value()); throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } @@ -226,6 +228,7 @@ public static WrappedWatchableObject splashTimer(final int splashTimer) { } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Type { OAK((byte) 0), @@ -235,7 +238,7 @@ public enum Type { ACACIA((byte) 4), DARK_OAK((byte) 5); - byte value; + @Getter byte value; } } @@ -243,7 +246,7 @@ public enum Type { public static class EnderCrystal extends Entity { public static WrappedWatchableObject position(final BlockPosition position) { - return FACTORY.createWatchableOptional(6, Optional.of(position)); + return FACTORY.createWatchableOptional(6, position); } public static WrappedWatchableObject showBottom(final boolean showBottom) { @@ -330,7 +333,7 @@ public static class LivingEntity extends Entity { public static WrappedWatchableObject handStates(final HandState... handStates) { if (VERSION >= 9) { var handStateBytes = (byte) 0; - for (val handState : handStates) handStateBytes |= handState.value; + for (val handState : handStates) handStateBytes |= handState.value(); return FACTORY.createWatchableObject(VERSION >= 14 ? 7 : 6, handStateBytes); } @@ -361,7 +364,7 @@ public static WrappedWatchableObject healthAddedByAbsorption(final int healthAdd public static WrappedWatchableObject bedLocation(final @Nullable BlockPosition bedLocation) { // TODO check version & if nullability is correct - if (VERSION >= 14) return FACTORY.createWatchable(13, bedLocation); + if (VERSION >= 14) return FACTORY.createWatchableOptional(13, bedLocation); throw new UnsupportedOperationException("Versions prior to 1.14 don't support this metadata"); } @@ -373,13 +376,14 @@ public static WrappedWatchableObject noAi(final boolean noAi) { } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum HandState { HAND_ACTIVE((byte) 0x01), OFFHAND((byte) 0x02), RIPTIDE_SPIN_ATTACK((byte) 0x04); - byte value; + @Getter byte value; } } @@ -403,7 +407,7 @@ public static WrappedWatchableObject score(final int score) { public static WrappedWatchableObject skinParts(final SkinPart... skinParts) { if (VERSION >= 9) { var skinPartBytes = (byte) 0; - for (val skinPart : skinParts) skinPartBytes |= skinPart.value; + for (val skinPart : skinParts) skinPartBytes |= skinPart.value(); return FACTORY.createWatchableObject(13, skinPartBytes); } @@ -413,41 +417,29 @@ public static WrappedWatchableObject skinParts(final SkinPart... skinParts) { } public static WrappedWatchableObject mainHand(final MainHand mainHand) { - if (VERSION >= 9) return FACTORY.createWatchable(14, mainHand.value); + if (VERSION >= 9) return FACTORY.createWatchable(14, mainHand.value()); throw new UnsupportedOperationException( "Versions prior to 1.9 don't support this metadata" ); } - public static WrappedWatchableObject leftShoulderEntity(final Object leftShoulderEntityNbtTagCompound) { - if (VERSION >=13) return FACTORY.createWatchableObject(15, leftShoulderEntityNbtTagCompound); + public static WrappedWatchableObject leftShoulderEntity(final NbtCompound leftShoulderEntity) { + if (VERSION >= 13) return FACTORY.createWatchable(15, leftShoulderEntity); throw new UnsupportedOperationException( "Versions prior to 1.13 don't support this metadata" ); } - public static WrappedWatchableObject leftShoulderEntity(final NbtCompound leftShoulderEntityNbt) { - if (VERSION >= 13) return leftShoulderEntity(leftShoulderEntityNbt.getHandle()); - throw new UnsupportedOperationException( - "Versions prior to 1.13 don't support this metadata" - ); - } - - public static WrappedWatchableObject rightShoulderEntity(final Object rightShoulderEntityNbtTagCompound) { - if (VERSION >= 13) return FACTORY.createWatchableNBTTagCompound(16, rightShoulderEntityNbtTagCompound); - throw new UnsupportedOperationException( - "Versions prior to 1.13 don't support this metadata" - ); - } - - public static WrappedWatchableObject rightShoulderEntity(final NbtCompound rightShoulderEntityNbt) { - if (VERSION >= 13) return rightShoulderEntity(rightShoulderEntityNbt.getHandle()); + public static WrappedWatchableObject rightShoulderEntity(final NbtCompound rightShoulderEntity) { + if (VERSION >= 13) return FACTORY.createWatchable(15, rightShoulderEntity); throw new UnsupportedOperationException( "Versions prior to 1.13 don't support this metadata" ); } @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum SkinPart { CAPE((byte) 0x01), JACKET((byte) 0x02), @@ -458,15 +450,17 @@ public enum SkinPart { HAT((byte) 0x40), UNUSED((byte) 0x80); - private final byte value; + @Getter byte value; } @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum MainHand { LEFT((byte) 0), RIGHT((byte) 1); - private final byte value; + @Getter byte value; } } @@ -476,7 +470,7 @@ public static class ArmorStand extends LivingEntity { public static WrappedWatchableObject armorStandFlags(final Flag... flags) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(VERSION >= 14 ? 14 : VERSION >= 9 ? 11 : 10, flagBytes); } @@ -506,6 +500,7 @@ public static WrappedWatchableObject rightLegRotation(final Vector3F rightLegRot } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { SMALL((byte) 0x01), @@ -513,7 +508,7 @@ public enum Flag { NO_BASE_PLATE((byte) 0x08), MARKER((byte) 0x10); - byte value; + @Getter byte value; } } @@ -523,7 +518,7 @@ public static class Mob extends LivingEntity { public static WrappedWatchableObject insentientFlags(final Flag... flags) { if (VERSION >= 9) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(11, flagBytes); } @@ -534,12 +529,13 @@ public static WrappedWatchableObject insentientFlags(final Flag... flags) { } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { NO_AI((byte) 0x01), LEFT_HANDED((byte) 0x02); - byte value; + @Getter byte value; } } @@ -551,17 +547,19 @@ public static class Bat extends AmbientCreature { public static WrappedWatchableObject batFlags(final Flag... flags) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); } @RequiredArgsConstructor + @Accessors(fluent = true) + @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { HANGING((byte) 0x01); - byte value; + @Getter byte value; } } @@ -636,25 +634,26 @@ public static class AbstractHorse extends Animal { public static WrappedWatchableObject horseFlags(final Flag... flags) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(13, flagBytes); } - public static WrappedWatchableObject owner(final UUID ownerUuid) { - if (VERSION >= 9) return FACTORY.createWatchableOptional(14, Optional.ofNullable(ownerUuid)); - return FACTORY.createWatchable(21, Bukkit.getOfflinePlayer(ownerUuid).getName()); + public static WrappedWatchableObject owner(final @Nullable UUID ownerUuid) { + if (VERSION >= 9) return FACTORY.createWatchableOptional(14, ownerUuid); + return FACTORY.createWatchable(21, Bukkit.getOfflinePlayer(ownerUuid).getName()); // FIXME } @Deprecated public static WrappedWatchableObject owner(final String ownerName) { if (VERSION >= 9) return FACTORY.createWatchableOptional( - 14, Optional.of(Bukkit.getOfflinePlayer(ownerName).getUniqueId()) + 14, Bukkit.getOfflinePlayer(ownerName).getUniqueId() ); return FACTORY.createWatchable(21, ownerName); } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { TAME((byte) 0x02), @@ -665,7 +664,8 @@ public enum Flag { REARING((byte) 0x20, (byte) 0x40), MOUTH_OPEN((byte) 0x40, (byte) 0x80); - byte value, legacyValue; + @Getter byte value; + @Getter byte legacyValue; Flag(final byte value) { this(value, value); @@ -681,7 +681,7 @@ public static WrappedWatchableObject horseType(final Type horseType) { if (VERSION >= 9) throw new UnsupportedOperationException( "Versions 1.9 and later don't support this metadata" ); - return FACTORY.createWatchable(19, horseType.value); + return FACTORY.createWatchable(19, horseType.value()); } public static WrappedWatchableObject variant(final int variant) { @@ -689,7 +689,7 @@ public static WrappedWatchableObject variant(final int variant) { } public static WrappedWatchableObject armor(final Armor armor) { - return FACTORY.createWatchable(VERSION > 9 ? 16 : 22, armor.value); + return FACTORY.createWatchable(VERSION > 9 ? 16 : 22, armor.value()); } public static WrappedWatchableObject forgeArmor(final Object nmsItem) { @@ -704,6 +704,7 @@ public static WrappedWatchableObject forgeArmor(final ItemStack item) { @Deprecated @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Type { HORSE((byte) 0), @@ -712,10 +713,11 @@ public enum Type { ZOMBIE((byte) 3), SKELETON((byte) 4); - byte value; + @Getter byte value; } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Armor { NONE(0), @@ -723,10 +725,11 @@ public enum Armor { GOLD(2), DIAMOND(3); - int value; + @Getter int value; } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { TAME((byte) 0x02), @@ -737,7 +740,8 @@ public enum Flag { REARING((byte) 0x20, (byte) 0x40), MOUTH_OPEN((byte) 0x40, (byte) 0x80); - byte value, legacyValue; + @Getter byte value; + @Getter byte legacyValue; Flag(final byte value) { this(value, value); @@ -775,10 +779,11 @@ public static WrappedWatchableObject carpetColor(final int carpetColor) { } public static WrappedWatchableObject variant(final Variant variant) { - return FACTORY.createWatchable(18, variant.value); + return FACTORY.createWatchable(18, variant.value()); } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Variant { CREAMY((byte) 0), @@ -786,7 +791,7 @@ public enum Variant { BROWN((byte) 2), GRAY((byte) 3); - byte value; + @Getter byte value; } } @@ -863,23 +868,24 @@ public static class Tameable extends Animal { public static WrappedWatchableObject tameableFlags(final Flag... flags) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(VERSION >= 9 ? 13 : 16, flagBytes); } - public static WrappedWatchableObject owner(final UUID ownerUuid) { - return FACTORY.createWatchableOptional(VERSION >= 9 ? 14 : 17, Optional.ofNullable(ownerUuid)); + public static WrappedWatchableObject owner(final @Nullable UUID ownerUuid) { + return FACTORY.createWatchableOptional(VERSION >= 9 ? 14 : 17, ownerUuid); } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { SITTING((byte) 0x01), ANGRY((byte) 0x02), TAMED((byte) 0x04); - byte value; + @Getter byte value; } } @@ -887,10 +893,11 @@ public enum Flag { public static class Ocelot extends Tameable { public static WrappedWatchableObject variant(final Variant variant) { - return FACTORY.createWatchable(VERSION >= 9 ? 15 : 18, variant.value); + return FACTORY.createWatchable(VERSION >= 9 ? 15 : 18, variant.value()); } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Variant { UNTAMED(0), @@ -898,7 +905,7 @@ public enum Variant { TABBY(2), SIAMESE(3); - int value; + @Getter int value; } } @@ -922,10 +929,11 @@ public static WrappedWatchableObject collarColor(final byte collarColor) { public static class Parrot extends Tameable { public static WrappedWatchableObject variant(final Variant variant) { - return FACTORY.createWatchable(15, variant.value); + return FACTORY.createWatchable(15, variant.value()); } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Variant { RED_BLUE(0), @@ -934,7 +942,7 @@ public enum Variant { YELLOW_BLUE(3), SILVER(4); - int value; + @Getter int value; } } @@ -945,10 +953,11 @@ public static WrappedWatchableObject profession(final Profession profession) { if (VERSION >= 9) throw new UnsupportedOperationException( "1.9 and later don't support this metadata" ); - return FACTORY.createWatchable(13, profession.value); + return FACTORY.createWatchable(13, profession.value()); } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Profession { FARMER(0), @@ -957,7 +966,7 @@ public enum Profession { BLACKSMITH(3), SILVER(4); - int value; + @Getter int value; } } @@ -969,16 +978,19 @@ public static class IronGolem extends Golem { public static WrappedWatchableObject ironGolemFlags(final Flag... flags) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); } @RequiredArgsConstructor + @Accessors(fluent = true) + @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { PLAYER_CREATED((byte) 0x01); + @Getter byte value; } } @@ -989,7 +1001,7 @@ public static class Snowman extends Golem { public static WrappedWatchableObject snowmanFlags(final Flag... flags) { if (VERSION >= 9) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(12, flagBytes); } @@ -997,27 +1009,29 @@ public static WrappedWatchableObject snowmanFlags(final Flag... flags) { } @RequiredArgsConstructor + @Accessors(fluent = true) + @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { HAS_PUMPKIN((byte) 0x10); - byte value; + @Getter byte value; } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Shulker extends Golem { - public static WrappedWatchableObject facing(final Object enumDirection) { + public static WrappedWatchableObject facing(final @NonNull Object enumDirection) { return FACTORY.createWatchableEnumDirection(12, enumDirection); } - public static WrappedWatchableObject facing(final EnumWrappers.Direction direction) { + public static WrappedWatchableObject facing(final @NonNull EnumWrappers.Direction direction) { return FACTORY.createWatchable(12, direction); } - public static WrappedWatchableObject attachmentPosition(final BlockPosition attachmentPosition) { - return FACTORY.createWatchableOptional(13, Optional.ofNullable(attachmentPosition)); + public static WrappedWatchableObject attachmentPosition(final @Nullable BlockPosition attachmentPosition) { + return FACTORY.createWatchableOptional(13, attachmentPosition); } public static WrappedWatchableObject shieldHeight(final byte shieldHeight) { @@ -1037,17 +1051,19 @@ public static class Blaze extends Monster { public static WrappedWatchableObject blazeFlags(final Flag... flags) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); } @RequiredArgsConstructor + @Accessors(fluent = true) + @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { ON_FIRE((byte) 0x01); - byte value; + @Getter byte value; } } @@ -1055,7 +1071,7 @@ public enum Flag { public static class Creeper extends Monster { public static WrappedWatchableObject creeperState(final State state) { - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, state.value); + return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, state.value()); } public static WrappedWatchableObject charged(final boolean charged) { @@ -1068,12 +1084,13 @@ public static WrappedWatchableObject ignited(final boolean ignited) { } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum State { IDLE(-1), FUSE(1); - int value; + @Getter int value; } } @@ -1118,15 +1135,17 @@ public static class Silverfish extends Monster {} public static class Illager extends Monster { public static WrappedWatchableObject illagerState(final State state) { - return FACTORY.createWatchable(12, state.value); + return FACTORY.createWatchable(12, state.value()); } @RequiredArgsConstructor + @Accessors(fluent = true) + @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum State { HAS_TARGET((byte) 0x01); - byte value; + @Getter byte value; } } @@ -1137,10 +1156,11 @@ public static class VindicatorIllager extends Illager {} public static class SpellcasterIllager extends Illager { public static WrappedWatchableObject spell(final Spell spell) { - return FACTORY.createWatchable(13, spell.value); + return FACTORY.createWatchable(13, spell.value()); } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Spell { NONE((byte) 0), @@ -1148,7 +1168,7 @@ public enum Spell { ATTACK((byte) 2), WOLOLO((byte) 3); - byte value; + @Getter byte value; } } @@ -1163,17 +1183,19 @@ public static class Vex extends Monster { public static WrappedWatchableObject vexFlags(final Flag... flags) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(12, flagBytes); } @RequiredArgsConstructor + @Accessors(fluent = true) + @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { ATTACK_MODE((byte) 0x01); - byte value; + @Getter byte value; } } @@ -1202,17 +1224,19 @@ public static class Spider extends Monster { public static WrappedWatchableObject spiderFlags(final Flag... flags) { var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value; + for (val flag : flags) flagBytes |= flag.value(); return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); } @RequiredArgsConstructor + @Accessors(fluent = true) + @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Flag { CLIMBING((byte) 0x01); - byte value; + @Getter byte value; } } @@ -1291,7 +1315,7 @@ public static WrappedWatchableObject converting(final boolean converting) { } public static WrappedWatchableObject profession(final Villager.Profession profession) { - return FACTORY.createWatchable(17, profession.value); + return FACTORY.createWatchable(17, profession.value()); } } @@ -1332,11 +1356,12 @@ public static WrappedWatchableObject screaming(final boolean screaming) { public static class EnderDragon extends Monster { public static WrappedWatchableObject phase(final Phase phase) { - if (VERSION >= 9) return FACTORY.createWatchable(12, phase.value); + if (VERSION >= 9) return FACTORY.createWatchable(12, phase.value()); throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public enum Phase { CIRCLING(0), @@ -1351,6 +1376,7 @@ public enum Phase { FLYDYING(9), NO_AI(10); + @Getter int value; } } From d4d24bbb3cef077365a77548370ff2f249af12cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Jun 2021 06:44:15 +0000 Subject: [PATCH 470/508] build(deps-dev): bump version.mockito from 3.10.0 to 3.11.0 Bumps `version.mockito` from 3.10.0 to 3.11.0. Updates `mockito-core` from 3.10.0 to 3.11.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.10.0...v3.11.0) Updates `mockito-junit-jupiter` from 3.10.0 to 3.11.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.10.0...v3.11.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0a099cf54..b2cfaf5bb 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.7.2 1.7.2 - 3.10.0 + 3.11.0 From 5761011dff5c1aefb6cebf9632b06d0213217f41 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Sun, 6 Jun 2021 18:30:50 +0300 Subject: [PATCH 471/508] feat: try to implement multi-version support of MetadataGenerator --- .../entity/ArmorStandBlockItem.java | 19 +- .../nms/metadata/MetadataGenerator.java | 2113 +++++++++++------ 2 files changed, 1453 insertions(+), 679 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index f5bf9eb8c..98ed364a8 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -16,7 +16,7 @@ import org.jetbrains.annotations.Nullable; import ru.progrm_jarvis.javacommons.ownership.annotation.Own; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; -import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.ArmorStandFlag; import java.util.ArrayList; import java.util.HashMap; @@ -25,6 +25,7 @@ import java.util.concurrent.ConcurrentHashMap; import static java.lang.Math.*; +import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.ArmorStandFlag.*; import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.armorStandFlags; import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.ArmorStand.headRotation; import static ru.progrm_jarvis.minecraft.commons.nms.metadata.MetadataGenerator.Entity.*; @@ -180,17 +181,17 @@ protected static WrappedDataWatcher createMetadata(final @Nullable Vector3F rota metadata.add(air(300)); metadata.add(noGravity(true)); if (marker) { - metadata.add(entityFlags(Flag.INVISIBLE, Flag.ON_FIRE)); - metadata.add(armorStandFlags(small ? new ArmorStand.Flag[]{ - ArmorStand.Flag.SMALL, ArmorStand.Flag.NO_BASE_PLATE, ArmorStand.Flag.MARKER - } : new ArmorStand.Flag[]{ - ArmorStand.Flag.MARKER, ArmorStand.Flag.NO_BASE_PLATE + metadata.add(entityFlags(EntityFlag.INVISIBLE, EntityFlag.ON_FIRE)); + metadata.add(armorStandFlags(small ? new ArmorStandFlag[]{ + SMALL, NO_BASE_PLATE, MARKER + } : new ArmorStandFlag[]{ + MARKER, NO_BASE_PLATE })); } else { - metadata.add(entityFlags(Flag.INVISIBLE)); + metadata.add(entityFlags(EntityFlag.INVISIBLE)); metadata.add(armorStandFlags(small - ? new ArmorStand.Flag[]{ArmorStand.Flag.SMALL, ArmorStand.Flag.NO_BASE_PLATE} - : new ArmorStand.Flag[]{ArmorStand.Flag.NO_BASE_PLATE} + ? new ArmorStandFlag[]{SMALL, NO_BASE_PLATE} + : new ArmorStandFlag[]{NO_BASE_PLATE} )); } if (rotation != null) metadata.add(headRotation(rotation)); diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java index d8541f3b0..888636fd6 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java @@ -1,84 +1,127 @@ package ru.progrm_jarvis.minecraft.commons.nms.metadata; import com.comphenix.protocol.wrappers.*; -import com.comphenix.protocol.wrappers.EnumWrappers.Particle; import com.comphenix.protocol.wrappers.nbt.NbtCompound; import lombok.*; import lombok.experimental.Accessors; import lombok.experimental.FieldDefaults; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; +import org.bukkit.DyeColor; +import org.bukkit.OfflinePlayer; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import ru.progrm_jarvis.minecraft.commons.nms.NmsUtil; -import ru.progrm_jarvis.minecraft.commons.nms.ProtocolLibConversions; -import java.util.Optional; import java.util.UUID; /** - * Editor for Metadata of {@link WrappedWatchableObject} providing classes - * containing static methods for developer-friendly object creation. + *

Editor for Metadata of {@link WrappedWatchableObject} providing classes + * containing static methods for developer-friendly object creation.

* - * @see 1.8 metadata format + *

Version specifications:

*/ @UtilityClass -@SuppressWarnings({"ClassWithOnlyPrivateConstructors", "EmptyClass", "unused", "NonFinalUtilityClass"}) +@SuppressWarnings({ + "ClassWithOnlyPrivateConstructors", // "sealed" classes + "unused", // no way to correctly test methods + "EmptyClass", "NonFinalUtilityClass", // ierarchy of entities + "TypeMayBeWeakened" // enums implementing local interface +}) public class MetadataGenerator { private final int VERSION = NmsUtil.getVersion().getGeneration(); - private final DataWatcherFactory FACTORY = NmsUtil.getDataWatcherFactory(); + private final @NonNull DataWatcherFactory FACTORY = NmsUtil.getDataWatcherFactory(); + + private static void requireAtLeast(final int minVersion) { + if (VERSION < minVersion) throw new UnsupportedOperationException( + "This is not supported on versions prior to 1." + minVersion + ); + } + + private static void requireAtMost(final int maxVersion) { + if (VERSION > maxVersion) throw new UnsupportedOperationException( + "This is not supported on versions after 1." + maxVersion + ); + } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Entity { - public static WrappedWatchableObject entityFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); - - return FACTORY.createWatchable(0, flagBytes); + public static @NotNull WrappedWatchableObject entityFlags(final @NotNull EntityFlag @NonNull ...flags) { + return FACTORY.createWatchable(0, ByteFlag.allChecked(flags)); } - public static WrappedWatchableObject air(final int air) { + public static @NotNull WrappedWatchableObject air(final int air) { return VERSION >= 9 ? FACTORY.createWatchable(1, air) : FACTORY.createWatchable(1, (short) air); } - public static WrappedWatchableObject name(final WrappedChatComponent name) { - return FACTORY.createWatchable(2, name); + public static @NotNull WrappedWatchableObject air(final short air) { + return VERSION >= 9 ? FACTORY.createWatchable(1, (int) air) : FACTORY.createWatchable(1, air); + } + + public static @NotNull WrappedWatchableObject name(final @Nullable WrappedChatComponent name) { + requireAtLeast(9); + + return VERSION >= 13 + ? FACTORY.createWatchableOptional(2, name) + : FACTORY.createWatchable(2, name == null ? "" : name.getJson()); } - public static WrappedWatchableObject name(final String name) { - if (VERSION >= 13) return name(WrappedChatComponent.fromText(name)); - return FACTORY.createWatchable(2, name); + public static @NotNull WrappedWatchableObject name(final @Nullable String name) { + requireAtLeast(9); + + return VERSION >= 13 + ? FACTORY.createWatchableOptional(2, name == null ? null : WrappedChatComponent.fromText(name)) + : FACTORY.createWatchable(2, name == null ? "" : name); } - public static WrappedWatchableObject nameVisible(final boolean nameVisible) { + public static @NotNull WrappedWatchableObject nameVisible(final boolean nameVisible) { + requireAtLeast(9); + return FACTORY.createWatchable(3, nameVisible); } - public static WrappedWatchableObject silent(final boolean silent) { + public static @NotNull WrappedWatchableObject silent(final boolean silent) { return FACTORY.createWatchable(4, silent); } - public static WrappedWatchableObject noGravity(final boolean noGravity) { - if (VERSION >= 9) return FACTORY.createWatchable(5, noGravity); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support No Gravity entity flag"); + public static @NotNull WrappedWatchableObject noGravity(final boolean noGravity) { + requireAtLeast(10); + + return FACTORY.createWatchable(5, noGravity); } - // TODO add Pose support for late versions (available since 1.14) + public static @NotNull WrappedWatchableObject pose(final EnumWrappers.EntityPose pose) { + requireAtLeast(14); + + return FACTORY.createWatchable(6, pose); + } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { + public enum EntityFlag implements ByteFlag { ON_FIRE((byte) 0x01), - CROUCHED((byte) 0x02), - RIDING((byte) 0x04), + CROUCHING((byte) 0x02), + RIDING(VERSION >= 9 ? UNSUPPORTED : (byte) 0x04), SPRINTING((byte) 0x08), - INTERACTING((byte) 0x10), // legacy - SWIMMING((byte) 0x10), + INTERACTING(VERSION >= 11 ? UNSUPPORTED : (byte) 0x10), + SWIMMING(VERSION >= 11 ? (byte) 0x10 : UNSUPPORTED), INVISIBLE((byte) 0x20), - GLOWING((byte) 0x80); + GLOWING(VERSION >= 9 ? (byte) 0x40 : UNSUPPORTED); @Getter byte value; } @@ -88,210 +131,354 @@ public enum Flag { public static class Projectile extends Entity {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Snowball extends Projectile {} + public static class ItemedThrowable extends Projectile {} // note: there is no method as it's child-dependant + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Egg extends ItemedThrowable { + + public static @NotNull WrappedWatchableObject item(final @NonNull ItemStack item) { + requireAtLeast(14); + + return FACTORY.createWatchable(7, item); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class EnderPearl extends ItemedThrowable { + + public static @NotNull WrappedWatchableObject item(final @NonNull ItemStack item) { + requireAtLeast(14); + + return FACTORY.createWatchable(7, item); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class ExperienceBottle extends ItemedThrowable { + + public static @NotNull WrappedWatchableObject item(final @NonNull ItemStack item) { + requireAtLeast(14); + + return FACTORY.createWatchable(7, item); + } + } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Egg extends Projectile {} + public static class Snowball extends ItemedThrowable { + + public static @NotNull WrappedWatchableObject item(final @NonNull ItemStack item) { + requireAtLeast(14); + + return FACTORY.createWatchable(7, item); + } + } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Potion extends Projectile { + public static class EyeOfEnder extends ItemedThrowable { + + public static @NotNull WrappedWatchableObject item(final @NonNull ItemStack item) { + requireAtLeast(14); - public static WrappedWatchableObject potion(final Object nmsItemStackPotion) { - if (VERSION >= 9) return FACTORY.createWatchableItemStack(6, nmsItemStackPotion); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + return FACTORY.createWatchable(7, item); } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Potion extends ItemedThrowable { + + public static @NotNull WrappedWatchableObject potion(final @NonNull ItemStack potion) { + requireAtLeast(9); - public static WrappedWatchableObject potion(final ItemStack potion) { - if (VERSION >= 9) return FACTORY.createWatchable(6, potion); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + return FACTORY.createWatchable(VERSION >= 14 ? 7 : VERSION >= 10 ? 6 : 5, potion); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class FallingBlock extends Entity { - public static WrappedWatchableObject position(final BlockPosition position) { - if (VERSION >= 9) return FACTORY.createWatchable(6, position); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject position(final @NonNull BlockPosition position) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : 5, position); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class AreaEffectCloud extends Entity { - public static WrappedWatchableObject radius(final float radius) { - return FACTORY.createWatchableItemStack(6, radius); + public static @NotNull WrappedWatchableObject radius(final float radius) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : 5, radius); + } + + public static @NotNull WrappedWatchableObject color(final int color) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 8 : VERSION >= 10 ? 7 : 6, color); + } + + public static @NotNull WrappedWatchableObject singlePoint(final boolean singlePoint) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 9 : VERSION >= 10 ? 8 : 7, singlePoint); } - public static WrappedWatchableObject color(final int color) { - return FACTORY.createWatchable(7, color); + public static @NotNull WrappedWatchableObject particle(final WrappedParticle particle) { + requireAtLeast(13); + + return FACTORY.createWatchable(VERSION >= 15 ? 10 : 9, particle); + } + + public static @NotNull WrappedWatchableObject particle(final int particle) { + requireAtLeast(10); + requireAtMost(12); + + return FACTORY.createWatchable(9, particle); } - public static WrappedWatchableObject singlePoint(final boolean singlePoint) { - return FACTORY.createWatchable(8, singlePoint); + public static @NotNull WrappedWatchableObject particleParameter1(final int particle) { + requireAtLeast(11); + requireAtMost(12); + + return FACTORY.createWatchable(10, particle); } - public static WrappedWatchableObject singlePoint(final Particle particle) { - // unsure (?) - return FACTORY.createWatchableObject(9, ProtocolLibConversions.toNms(particle)); + public static @NotNull WrappedWatchableObject particleParameter2(final int particle) { + requireAtLeast(11); + requireAtMost(12); + + return FACTORY.createWatchable(11, particle); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class FishingHook extends Entity { - public static WrappedWatchableObject hookedEntity(final int hookedEntityId) { - if (VERSION >= 9) return FACTORY.createWatchable(6, hookedEntityId); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject hookedEntity(final int hookedEntityId) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : 5, hookedEntityId); + } + + public static @NotNull WrappedWatchableObject hookedEntity(final @Nullable org.bukkit.entity.Entity entity) { + requireAtLeast(9); + + return FACTORY.createWatchable( + VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : 5, + entity == null ? 0 : entity.getEntityId() + 1 + ); } - public static WrappedWatchableObject hookedEntity(final org.bukkit.entity.Entity entity) { - if (VERSION >= 9) return hookedEntity(entity.getEntityId() + 1); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject catchable(final boolean catchable) { + requireAtLeast(16); + + return FACTORY.createWatchable(8, catchable); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Arrow extends Entity { + public static class AbstractArrow extends Entity { + + public static @NotNull WrappedWatchableObject arrowFlags(final @NotNull AbstractArrowFlag @NonNull ...flags) { + return FACTORY.createWatchable( + VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : VERSION >= 9 ? 5 : 16, ByteFlag.allChecked(flags) + ); + } - public static WrappedWatchableObject arrowFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); + public static @NotNull WrappedWatchableObject shooter(final @Nullable UUID shooterUuid) { + requireAtLeast(13); + requireAtLeast(15); - return FACTORY.createWatchable(VERSION >= 9 ? 6 : 16, flagBytes); + return FACTORY.createWatchableOptional(VERSION >= 15 ? 8 : 7, shooterUuid); } - public static WrappedWatchableObject shooter(final @Nullable UUID shooterUuid) { - if (VERSION >= 9) return FACTORY.createWatchableOptional(7, shooterUuid); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject piercingLevel(final byte piercingLevel) { + requireAtLeast(15); + + return FACTORY.createWatchable(VERSION >= 16 ? 8 : 9, piercingLevel); } @RequiredArgsConstructor + @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flags { + public enum AbstractArrowFlag implements ByteFlag { CRITICAL((byte) 0x01), - NO_CLIP((byte) 0x02); + NO_CLIP(VERSION >= 13 ? (byte) 0x02 : (byte) -1); + + @Getter byte value; + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Arrow extends AbstractArrow { + + public static @NotNull WrappedWatchableObject color(final int color) { + requireAtLeast(16); - byte value; + return FACTORY.createWatchable(9, color); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class TippedArrow extends Arrow { + public static class TippedArrow extends AbstractArrow { - public static WrappedWatchableObject color(final int color) { - return FACTORY.createWatchable(8, color); + public static @NotNull WrappedWatchableObject color(final int color) { + requireAtLeast(9); + + return FACTORY.createWatchable( + VERSION >= 16 ? 9 /* Arrow */ : VERSION >= 15 ? 10 : VERSION >= 13 ? 8 : VERSION >= 10 ? 7 : 9, + color + ); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Trident extends Arrow { + public static class SpectralArrow extends AbstractArrow {} + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Trident extends AbstractArrow { + + public static @NotNull WrappedWatchableObject loyaltyLevel(final int loyaltyLevel) { + requireAtLeast(13); - public static WrappedWatchableObject loyaltyLevel(final int loyaltyLevel) { - return FACTORY.createWatchable(8, loyaltyLevel); + return FACTORY.createWatchable(VERSION >= 16 ? 9 : VERSION >= 15 ? 10 : 8, loyaltyLevel); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Boat extends Entity { - public static WrappedWatchableObject timeSinceLastHit(final int timeSinceLastHit) { - return FACTORY.createWatchable(VERSION >= 9 ? 6 : 17, timeSinceLastHit); + public static @NotNull WrappedWatchableObject timeSinceLastHit(final int timeSinceLastHit) { + return FACTORY.createWatchable( + VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : VERSION >= 9 ? 5 : 17, + timeSinceLastHit + ); } - public static WrappedWatchableObject forwardDirection(final int forwardDirection) { - return FACTORY.createWatchable(VERSION >= 9 ? 7 : 18, forwardDirection); + public static @NotNull WrappedWatchableObject forwardDirection(final int forwardDirection) { + return FACTORY.createWatchable( + VERSION >= 15 ? 8 : VERSION >= 10 ? 6 : VERSION >= 9 ? 6 : 18, + forwardDirection + ); } - public static WrappedWatchableObject damageTaken(final float damageTaken) { - return FACTORY.createWatchable(VERSION >= 9 ? 8 : 19, damageTaken); + public static @NotNull WrappedWatchableObject damageTaken(final float damageTaken) { + return FACTORY.createWatchable( + VERSION >= 15 ? 9 : VERSION >= 10 ? 8 : VERSION >= 9 ? 7 : 19, + damageTaken + ); } - public static WrappedWatchableObject type(final Type type) { - if (VERSION >= 9) return FACTORY.createWatchable(9, type.value()); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject type(final @NonNull MetadataGenerator.Boat.BoatType type) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 10 : VERSION >= 10 ? 9 : 8, type.checkedValue()); } - public static WrappedWatchableObject rightPaddleTurning(final boolean rightPaddleTurning) { - if (VERSION >= 9) return FACTORY.createWatchable(10, rightPaddleTurning); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject rightPaddleTurning(final boolean rightPaddleTurning) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 11 : VERSION >= 10 ? 10 : 9, rightPaddleTurning); } - public static WrappedWatchableObject leftPaddleTurning(final boolean leftPaddleTurning) { - if (VERSION >= 9) return FACTORY.createWatchable(11, leftPaddleTurning); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject leftPaddleTurning(final boolean leftPaddleTurning) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 12 : VERSION >= 10 ? 11 : 10, leftPaddleTurning); } - public static WrappedWatchableObject splashTimer(final int splashTimer) { - if (VERSION >= 9) return FACTORY.createWatchable(12, splashTimer); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject splashTimer(final int splashTimer) { + requireAtLeast(13); + + return FACTORY.createWatchable(VERSION >= 15 ? 13 : 12, splashTimer); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Type { - OAK((byte) 0), - SPRUCE((byte) 1), - BIRCH((byte) 2), - JUNGLE((byte) 3), - ACACIA((byte) 4), - DARK_OAK((byte) 5); + public enum BoatType implements IntValue { + OAK(VERSION >= 9 ? 0 : UNSUPPORTED), + SPRUCE(VERSION >= 9 ? 1 : UNSUPPORTED), + BIRCH(VERSION >= 9 ? 2 : UNSUPPORTED), + JUNGLE(VERSION >= 9 ? 3 : UNSUPPORTED), + ACACIA(VERSION >= 9 ? 4 : UNSUPPORTED), + DARK_OAK(VERSION >= 9 ? 5 : UNSUPPORTED); - @Getter byte value; + @Getter int value; } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class EnderCrystal extends Entity { - public static WrappedWatchableObject position(final BlockPosition position) { - return FACTORY.createWatchableOptional(6, position); + public static @NotNull WrappedWatchableObject position(final @NonNull BlockPosition position) { + requireAtLeast(9); + + return FACTORY.createWatchableOptional(VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : 5, position); } - public static WrappedWatchableObject showBottom(final boolean showBottom) { - return FACTORY.createWatchable(7, showBottom); + public static @NotNull WrappedWatchableObject showBottom(final boolean showBottom) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 8 : VERSION >= 10 ? 7 : 6, showBottom); } - public static WrappedWatchableObject health(final int health) { - if (VERSION >= 9) throw new UnsupportedOperationException( - "1.9 and later don't support this metadata" - ); + public static @NotNull WrappedWatchableObject health(final int health) { + requireAtLeast(9); + requireAtMost(9); + return FACTORY.createWatchable(8, health); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Fireball extends Entity {} + public static class DragonFireball extends Entity {} + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class SmallFireball extends ItemedThrowable {} + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Fireball extends ItemedThrowable {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class WitherSkull extends Entity { - public static WrappedWatchableObject invulnerable(final boolean invulnerable) { - if (VERSION >= 9) return FACTORY.createWatchable(6, invulnerable); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject invulnerable(final boolean invulnerable) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : 5, invulnerable); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Fireworks extends Entity { - public static WrappedWatchableObject item(final Object nmsItem) { - return FACTORY.createWatchableItemStack(6, nmsItem); + public static @NotNull WrappedWatchableObject item(final @NonNull ItemStack item) { + return FACTORY.createWatchable(VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : VERSION >= 9 ? 5 : 8, item); } - public static WrappedWatchableObject item(final ItemStack item) { - return FACTORY.createWatchable(6, item); + public static @NotNull WrappedWatchableObject shooter(final @Nullable Integer shooter) { + requireAtLeast(11); + + return VERSION >= 15 + ? FACTORY.createWatchableOptional(8, shooter) + : FACTORY.createWatchable(7, shooter == null ? 0 : shooter); } - public static WrappedWatchableObject shooter(final int shooter) { - if (VERSION >= 9) return FACTORY.createWatchable(6, shooter); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject shooter(final @NonNull org.bukkit.entity.Entity entity) { + requireAtLeast(11); + + val entityId = entity.getEntityId(); + return VERSION >= 15 + ? FACTORY.createWatchableOptional(8, entityId) + : FACTORY.createWatchable(7, entityId); } - public static WrappedWatchableObject shooter(final org.bukkit.entity.Entity entity) { - if (VERSION >= 9) return shooter(entity.getEntityId()); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject shotAtAngle(final boolean shotAtAngle) { + requireAtLeast(9); + + return FACTORY.createWatchable(9, shotAtAngle); } } @@ -301,87 +488,79 @@ public static class Hanging extends Entity {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class ItemFrame extends Hanging { - public static WrappedWatchableObject item(final Object nmsItem) { - return FACTORY.createWatchableItemStack(VERSION >= 9 ? 6 : 8, nmsItem); + public static @NotNull WrappedWatchableObject item(final @NonNull ItemStack item) { + return FACTORY.createWatchable(VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : VERSION >= 9 ? 5 : 8, item); } - public static WrappedWatchableObject item(final ItemStack item) { - return FACTORY.createWatchable(VERSION >= 9 ? 6 : 8, item); - } - - public static WrappedWatchableObject rotation(final int rotation) { - if (VERSION >= 9) return FACTORY.createWatchable(7, rotation); - return FACTORY.createWatchable(9, (byte) rotation); + public static @NotNull WrappedWatchableObject rotation(final int rotation) { + return FACTORY.createWatchable(VERSION >= 15 ? 8 : VERSION >= 10 ? 7 : VERSION >= 9 ? 6 : 9, rotation); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Item extends Entity { - public static WrappedWatchableObject item(final Object nmsItem) { - return FACTORY.createWatchableItemStack(VERSION >= 9 ? 6 : 10, nmsItem); - } - - public static WrappedWatchableObject item(final ItemStack item) { - return FACTORY.createWatchable(VERSION >= 9 ? 6 : 10, item); + public static @NotNull WrappedWatchableObject item(final @NonNull ItemStack item) { + return FACTORY.createWatchable(VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : VERSION >= 9 ? 5 : 10, item); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class LivingEntity extends Entity { - public static WrappedWatchableObject handStates(final HandState... handStates) { - if (VERSION >= 9) { - var handStateBytes = (byte) 0; - for (val handState : handStates) handStateBytes |= handState.value(); + public static @NotNull WrappedWatchableObject handStates(final @NotNull HandState @NonNull ...handStates) { + requireAtLeast(9); - return FACTORY.createWatchableObject(VERSION >= 14 ? 7 : 6, handStateBytes); - } - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + return FACTORY.createWatchableObject( + VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : 5, + ByteFlag.allChecked(handStates) + ); } - public static WrappedWatchableObject health(final float health) { - return FACTORY.createWatchable(VERSION >= 14 ? 8 : VERSION >= 9 ? 7 : 6, health); + public static @NotNull WrappedWatchableObject health(final float health) { + return FACTORY.createWatchable(VERSION >= 15 ? 8 : VERSION >= 10 ? 7 : 6, health); } - public static WrappedWatchableObject potionEffectColor(final int potionEffectColor) { - return FACTORY.createWatchable(VERSION >= 14 ? 9 : VERSION >= 9 ? 8 : 7, potionEffectColor); + public static @NotNull WrappedWatchableObject potionEffectColor(final int potionEffectColor) { + return FACTORY.createWatchable(VERSION >= 15 ? 9 : VERSION >= 10 ? 8 : 7, potionEffectColor); } - public static WrappedWatchableObject potionEffectAmbient(final boolean potionEffectAmbient) { - return FACTORY.createWatchable(VERSION >= 14 ? 10 : VERSION >= 9 ? 8 : 9, potionEffectAmbient); + public static @NotNull WrappedWatchableObject potionEffectAmbient(final boolean potionEffectAmbient) { + return FACTORY.createWatchable(VERSION >= 15 ? 9 : VERSION >= 10 ? 8 : 7, potionEffectAmbient); } - public static WrappedWatchableObject numberOfArrows(final int numberOfArrows) { - return FACTORY.createWatchable(VERSION >= 14 ? 11 : VERSION >= 9 ? 10 : 9, numberOfArrows); + public static @NotNull WrappedWatchableObject numberOfArrows(final int numberOfArrows) { + return VERSION >= 9 + ? FACTORY.createWatchable(VERSION >= 15 ? 11 : VERSION >= 10 ? 10 : 9, numberOfArrows) + : FACTORY.createWatchable(9, (byte) numberOfArrows); } - public static WrappedWatchableObject healthAddedByAbsorption(final int healthAddedByAbsorption) { - // TODO check version - if (VERSION >= 14) return FACTORY.createWatchable(12, healthAddedByAbsorption); - throw new UnsupportedOperationException("Versions prior to 1.14 don't support this metadata"); + public static @NotNull WrappedWatchableObject healthAddedByAbsorption(final int healthAddedByAbsorption) { + requireAtLeast(15); + + return FACTORY.createWatchable(12, healthAddedByAbsorption); } - public static WrappedWatchableObject bedLocation(final @Nullable BlockPosition bedLocation) { - // TODO check version & if nullability is correct - if (VERSION >= 14) return FACTORY.createWatchableOptional(13, bedLocation); - throw new UnsupportedOperationException("Versions prior to 1.14 don't support this metadata"); + public static @NotNull WrappedWatchableObject bedLocation(final @Nullable BlockPosition bedLocation) { + requireAtLeast(14); + + return FACTORY.createWatchableOptional(VERSION >= 15 ? 13 : 12, bedLocation); } - @Deprecated // since 1.9 this is part of Insentient - public static WrappedWatchableObject noAi(final boolean noAi) { - if (VERSION >= 9) return noAi - ? Mob.insentientFlags(Mob.Flag.NO_AI) : Mob.insentientFlags(); + // since 1.9 this is part of Insentient + public static @NotNull WrappedWatchableObject noAi(final boolean noAi) { + requireAtMost(8); + return FACTORY.createWatchable(15, noAi); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum HandState { - HAND_ACTIVE((byte) 0x01), - OFFHAND((byte) 0x02), - RIPTIDE_SPIN_ATTACK((byte) 0x04); + public enum HandState implements ByteFlag { + HAND_ACTIVE(VERSION >= 9 ? (byte) 0x01 : UNSUPPORTED), + OFFHAND(VERSION >= 9 ? (byte) 0x02 : UNSUPPORTED), + RIPTIDE_SPIN_ATTACK(VERSION >= 13 ? (byte) 0x04 : UNSUPPORTED); @Getter byte value; } @@ -390,65 +569,66 @@ public enum HandState { @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Player extends LivingEntity { - public static WrappedWatchableObject additionalHearts(final float additionalHearts) { - if (VERSION >= 9) return FACTORY.createWatchable(11, additionalHearts); - throw new UnsupportedOperationException( - "Versions prior to 1.9 don't support this metadata" + public static @NotNull WrappedWatchableObject additionalHearts(final float additionalHearts) { + return FACTORY.createWatchable( + VERSION >= 15 ? 14 : VERSION >= 10 ? 11 : VERSION >= 9 ? 10 : 17, + additionalHearts ); } - public static WrappedWatchableObject score(final int score) { - if (VERSION >= 9) return FACTORY.createWatchable(12, score); - throw new UnsupportedOperationException( - "Versions prior to 1.9 don't support this metadata" + public static @NotNull WrappedWatchableObject score(final int score) { + return FACTORY.createWatchable( + VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 18, + score ); } - public static WrappedWatchableObject skinParts(final SkinPart... skinParts) { - if (VERSION >= 9) { - var skinPartBytes = (byte) 0; - for (val skinPart : skinParts) skinPartBytes |= skinPart.value(); - - return FACTORY.createWatchableObject(13, skinPartBytes); - } - throw new UnsupportedOperationException( - "Versions prior to 1.9 don't support this metadata" + public static @NotNull WrappedWatchableObject skinParts(final @NotNull SkinPart @NonNull ...skinParts) { + return FACTORY.createWatchableObject( + VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 10, + ByteFlag.allChecked(skinParts) ); } - public static WrappedWatchableObject mainHand(final MainHand mainHand) { - if (VERSION >= 9) return FACTORY.createWatchable(14, mainHand.value()); - throw new UnsupportedOperationException( - "Versions prior to 1.9 don't support this metadata" - ); + public static @NotNull WrappedWatchableObject hideCape(final boolean hideCape) { + requireAtMost(8); + + return FACTORY.createWatchable(16, hideCape ? 0x02 : 0x00); } - public static WrappedWatchableObject leftShoulderEntity(final NbtCompound leftShoulderEntity) { - if (VERSION >= 13) return FACTORY.createWatchable(15, leftShoulderEntity); - throw new UnsupportedOperationException( - "Versions prior to 1.13 don't support this metadata" - ); + public static @NotNull WrappedWatchableObject mainHand(final @NonNull MainHand mainHand) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 17 : VERSION >= 10 ? 14 : 13, mainHand.checkedValue()); } - public static WrappedWatchableObject rightShoulderEntity(final NbtCompound rightShoulderEntity) { - if (VERSION >= 13) return FACTORY.createWatchable(15, rightShoulderEntity); - throw new UnsupportedOperationException( - "Versions prior to 1.13 don't support this metadata" - ); + public static @NotNull WrappedWatchableObject leftShoulderEntity( + final @NonNull NbtCompound leftShoulderEntity + ) { + requireAtLeast(12); + + return FACTORY.createWatchable(VERSION >= 15 ? 18 : 15, leftShoulderEntity); + } + + public static @NotNull WrappedWatchableObject rightShoulderEntity( + final @NonNull NbtCompound rightShoulderEntity + ) { + requireAtLeast(12); + + return FACTORY.createWatchable(VERSION >= 15 ? 19 : 16, rightShoulderEntity); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum SkinPart { + public enum SkinPart implements ByteFlag { CAPE((byte) 0x01), JACKET((byte) 0x02), LEFT_SLEEVE((byte) 0x04), RIGHT_SLEEVE((byte) 0x08), LEFT_PANT((byte) 0x10), RIGHT_PANT((byte) 0x20), - HAT((byte) 0x40), - UNUSED((byte) 0x80); + HAT((byte) 0x40); @Getter byte value; } @@ -456,54 +636,54 @@ public enum SkinPart { @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum MainHand { - LEFT((byte) 0), - RIGHT((byte) 1); + public enum MainHand implements ByteValue { + LEFT(VERSION >= 9 ? (byte) 0 : UNSUPPORTED), + RIGHT(VERSION >= 9 ? (byte) 1 : UNSUPPORTED); @Getter byte value; } } - // TODO check versions @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class ArmorStand extends LivingEntity { - public static WrappedWatchableObject armorStandFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); - - return FACTORY.createWatchable(VERSION >= 14 ? 14 : VERSION >= 9 ? 11 : 10, flagBytes); + public static @NotNull WrappedWatchableObject armorStandFlags(final @NotNull ArmorStandFlag @NonNull ...flags) { + return FACTORY.createWatchable( + VERSION >= 15 ? 14 : VERSION >= 10 ? 11 : 10, + ByteFlag.allChecked(flags) + ); } - public static WrappedWatchableObject headRotation(final Vector3F headRotation) { - return FACTORY.createWatchable(VERSION >= 14 ? 15 : VERSION >= 9 ? 12 : 11, headRotation); + public static @NotNull WrappedWatchableObject headRotation(final @NonNull Vector3F headRotation) { + return FACTORY.createWatchable(VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : 11, headRotation); } - public static WrappedWatchableObject bodyRotation(final Vector3F bodyRotation) { - return FACTORY.createWatchable(VERSION >= 14 ? 16 : VERSION >= 9 ? 13 : 12, bodyRotation); + public static @NotNull WrappedWatchableObject bodyRotation(final @NonNull Vector3F bodyRotation) { + return FACTORY.createWatchable(VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : 12, bodyRotation); } - public static WrappedWatchableObject leftArmRotation(final Vector3F leftArmRotation) { - return FACTORY.createWatchable(VERSION >= 14 ? 17 : VERSION >= 9 ? 14 : 13, leftArmRotation); + public static @NotNull WrappedWatchableObject leftArmRotation(final @NonNull Vector3F leftArmRotation) { + return FACTORY.createWatchable(VERSION >= 15 ? 17 : VERSION >= 10 ? 14 : 13, leftArmRotation); } - public static WrappedWatchableObject rightArmRotation(final Vector3F rightArmRotation) { - return FACTORY.createWatchable(VERSION >= 14 ? 18 : VERSION >= 9 ? 15 : 14, rightArmRotation); + public static @NotNull WrappedWatchableObject rightArmRotation(final @NonNull Vector3F rightArmRotation) { + return FACTORY.createWatchable(VERSION >= 15 ? 18 : VERSION >= 10 ? 15 : 14, rightArmRotation); } - public static WrappedWatchableObject leftLegRotation(final Vector3F leftLegRotation) { - return FACTORY.createWatchable(VERSION >= 14 ? 19 : VERSION >= 9 ? 16 : 15, leftLegRotation); + public static @NotNull WrappedWatchableObject leftLegRotation(final @NonNull Vector3F leftLegRotation) { + return FACTORY.createWatchable(VERSION >= 15 ? 19 : VERSION >= 10 ? 16 : 15, leftLegRotation); } - public static WrappedWatchableObject rightLegRotation(final Vector3F rightLegRotation) { - return FACTORY.createWatchable(VERSION >= 14 ? 20 : VERSION >= 9 ? 17 : 16, rightLegRotation); + public static @NotNull WrappedWatchableObject rightLegRotation(final @NonNull Vector3F rightLegRotation) { + return FACTORY.createWatchable(VERSION >= 15 ? 20 : VERSION >= 10 ? 17 : 16, rightLegRotation); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { + public enum ArmorStandFlag implements ByteFlag { SMALL((byte) 0x01), + HAS_GRAVITY(VERSION >= 10 ? UNSUPPORTED : (byte) 0x02), HAS_ARMS((byte) 0x04), NO_BASE_PLATE((byte) 0x08), MARKER((byte) 0x10); @@ -515,25 +695,20 @@ public enum Flag { @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Mob extends LivingEntity { - public static WrappedWatchableObject insentientFlags(final Flag... flags) { - if (VERSION >= 9) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); - - return FACTORY.createWatchable(11, flagBytes); - } - - // for versions prior to 1.9 NO_AI is byte at index <15> - for (val flag : flags) if (flag == Flag.NO_AI) return FACTORY.createWatchable(15, (byte) 0x1); - return FACTORY.createWatchable(15, (byte) 0x0); + public static @NotNull WrappedWatchableObject mobFlags(final @NotNull MobFlag @NonNull ...flags) { + return FACTORY.createWatchable( + VERSION >= 15 ? 14 : VERSION >= 10 ? 11 : VERSION >= 9 ? 10 : 15, + ByteFlag.allChecked(flags) + ); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { + public enum MobFlag implements ByteFlag { NO_AI((byte) 0x01), - LEFT_HANDED((byte) 0x02); + LEFT_HANDED(VERSION >= 9 ? (byte) 0x02 : UNSUPPORTED), + AGGRESSIVE(VERSION >= 16 ? (byte) 0x04 : UNSUPPORTED); @Getter byte value; } @@ -545,18 +720,18 @@ public static class AmbientCreature extends Mob {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Bat extends AmbientCreature { - public static WrappedWatchableObject batFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); - - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); + public static @NotNull WrappedWatchableObject batFlags(final @NotNull Flag @NonNull ...flags) { + return FACTORY.createWatchable( + VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 16, + ByteFlag.allChecked(flags) + ); } @RequiredArgsConstructor @Accessors(fluent = true) @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { + public enum Flag implements ByteFlag { HANGING((byte) 0x01); @Getter byte value; @@ -575,143 +750,153 @@ public static class Squid extends WaterAnimal {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Dolphin extends WaterAnimal { - public static WrappedWatchableObject treasurePosition(final BlockPosition treasurePosition) { - return FACTORY.createWatchable(12, treasurePosition); + public static @NotNull WrappedWatchableObject treasurePosition(final @NonNull BlockPosition treasurePosition) { + return FACTORY.createWatchable(VERSION >= 15 ? 15 : 12, treasurePosition); } - public static WrappedWatchableObject canFindTreasure(final boolean canFindTreasure) { - return FACTORY.createWatchable(13, canFindTreasure); + public static @NotNull WrappedWatchableObject canFindTreasure(final boolean canFindTreasure) { + return FACTORY.createWatchable(VERSION >= 15 ? 16 : 13, canFindTreasure); } - public static WrappedWatchableObject hasFish(final boolean hasFish) { - return FACTORY.createWatchable(14, hasFish); + public static @NotNull WrappedWatchableObject hasFish(final boolean hasFish) { + return FACTORY.createWatchable(VERSION >= 15 ? 17 : 14, hasFish); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Fish extends WaterAnimal { + public static class AbstractFish extends WaterAnimal { - public static WrappedWatchableObject fromBucket(final boolean fromBucket) { - return FACTORY.createWatchable(12, fromBucket); + public static @NotNull WrappedWatchableObject fromBucket(final boolean fromBucket) { + return FACTORY.createWatchable(VERSION >= 15 ? 15 : 12, fromBucket); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Cod extends Fish {} + public static class Cod extends AbstractFish {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class PufferFish extends Fish { + public static class PufferFish extends AbstractFish { - public static WrappedWatchableObject puffState(final int puffState) { - return FACTORY.createWatchable(13, puffState); + public static @NotNull WrappedWatchableObject puffState(final int puffState) { + return FACTORY.createWatchable(VERSION >= 15 ? 16 : 13, puffState); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Salmon extends Fish {} + public static class Salmon extends AbstractFish {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class TropicalFish extends Fish { + public static class TropicalFish extends AbstractFish { - public static WrappedWatchableObject variant(final int variant) { - return FACTORY.createWatchable(13, variant); + public static @NotNull WrappedWatchableObject variant(final int variant) { + return FACTORY.createWatchable(VERSION >= 15 ? 16 : 13, variant); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Ageable extends PathfinderMob { + public static class AgeableMob extends PathfinderMob { - public static WrappedWatchableObject baby(final boolean baby) { - return FACTORY.createWatchable(12, baby); + public static @NotNull WrappedWatchableObject baby(final boolean baby) { + return FACTORY.createWatchable(VERSION >= 15 ? 15 : 12, baby); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Animal extends Ageable {} + public static class Animal extends AgeableMob {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class AbstractHorse extends Animal { - public static WrappedWatchableObject horseFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); + public static @NotNull WrappedWatchableObject horseFlags(final @NotNull HorseFlag @NonNull ...flags) { + return FACTORY.createWatchable( + VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 16, + ByteFlag.allChecked(flags) + ); + } - return FACTORY.createWatchable(13, flagBytes); + public static @NotNull WrappedWatchableObject owner(final @Nullable UUID ownerUuid) { + return VERSION >= 9 ? FACTORY.createWatchableOptional( + VERSION >= 15 ? 17 : VERSION >= 11 ? 14 : VERSION >= 10 ? 16 : 15, + ownerUuid + ) : FACTORY.createWatchable(21, ownerUuid == null ? "" : Bukkit.getOfflinePlayer(ownerUuid).getName()); } - public static WrappedWatchableObject owner(final @Nullable UUID ownerUuid) { - if (VERSION >= 9) return FACTORY.createWatchableOptional(14, ownerUuid); - return FACTORY.createWatchable(21, Bukkit.getOfflinePlayer(ownerUuid).getName()); // FIXME + public static @NotNull WrappedWatchableObject owner(final @Nullable OfflinePlayer owner) { + return VERSION >= 9 ? FACTORY.createWatchableOptional( + VERSION >= 15 ? 17 : VERSION >= 11 ? 14 : VERSION >= 10 ? 16 : 15, + owner == null ? null : owner.getUniqueId() + ) : FACTORY.createWatchable(21, owner == null ? "" : owner.getName()); } - @Deprecated - public static WrappedWatchableObject owner(final String ownerName) { - if (VERSION >= 9) return FACTORY.createWatchableOptional( - 14, Bukkit.getOfflinePlayer(ownerName).getUniqueId() - ); - return FACTORY.createWatchable(21, ownerName); + public static @NotNull WrappedWatchableObject owner(final @Nullable String ownerName) { + return VERSION >= 9 ? FACTORY.createWatchableOptional( + VERSION >= 15 ? 17 : VERSION >= 11 ? 14 : VERSION >= 10 ? 16 : 15, + uuidByName(ownerName) + ) : FACTORY.createWatchable(21, ownerName == null ? "" : ownerName); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { + public enum HorseFlag implements ByteFlag { TAME((byte) 0x02), - CHEST((byte) 0x0, (byte) 0x8), // legacy SADDLED((byte) 0x04), - BRED((byte) 0x08, (byte) 0x10), - EATING((byte) 0x10, (byte) 0x20), - REARING((byte) 0x20, (byte) 0x40), - MOUTH_OPEN((byte) 0x40, (byte) 0x80); + CHEST(VERSION >= 12 ? UNSUPPORTED : (byte) 0x08), // legacy + BRED(VERSION >= 12 ? (byte) 0x08 : (byte) 0x10), + EATING(VERSION >= 12 ? (byte) 0x10 : (byte) 0x20), + REARING(VERSION >= 12 ? (byte) 0x20 : (byte) 0x40), + MOUTH_OPEN(VERSION >= 12 ? (byte) 0x40 : (byte) 0x80); @Getter byte value; - @Getter byte legacyValue; - - Flag(final byte value) { - this(value, value); - } } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Horse extends AbstractHorse { - @Deprecated - public static WrappedWatchableObject horseType(final Type horseType) { - if (VERSION >= 9) throw new UnsupportedOperationException( - "Versions 1.9 and later don't support this metadata" - ); - return FACTORY.createWatchable(19, horseType.value()); - } + public static @NotNull WrappedWatchableObject horseType(final @NonNull HorseType horseType) { + requireAtLeast(8); + requireAtMost(10); - public static WrappedWatchableObject variant(final int variant) { - return FACTORY.createWatchable(VERSION > 9 ? 15 : 20, variant); + val value = horseType.checkedValue(); + return VERSION >= 9 + ? FACTORY.createWatchable(VERSION >= 10 ? 14 : 13, (int) value) + : FACTORY.createWatchable(19, value); } - public static WrappedWatchableObject armor(final Armor armor) { - return FACTORY.createWatchable(VERSION > 9 ? 16 : 22, armor.value()); + public static @NotNull WrappedWatchableObject variant(final int variant) { + return FACTORY.createWatchable( + VERSION > 15 ? 18 : VERSION >= 14 ? 17 : VERSION >= 10 ? 15 : VERSION >= 9 ? 14 : 20, + variant + ); } - public static WrappedWatchableObject forgeArmor(final Object nmsItem) { - // not sure whether to disable for old versions as it is related to Forge - return FACTORY.createWatchableItemStack(17, nmsItem); + public static @NotNull WrappedWatchableObject armor(final @NonNull HorseArmor armor) { + requireAtMost(13); + + return FACTORY.createWatchable( + VERSION >= 12 ? 17 : VERSION >= 11 ? 16 : VERSION >= 10 ? 17 : VERSION >= 9 ? 16 : 22, + armor.checkedValue() + ); } - public static WrappedWatchableObject forgeArmor(final ItemStack item) { - // not sure whether to disable for old versions as it is related to Forge + + public static @NotNull WrappedWatchableObject forgeArmor(final @NonNull ItemStack item) { + requireAtLeast(13); + requireAtMost(13); + return FACTORY.createWatchable(17, item); } - @Deprecated @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Type { - HORSE((byte) 0), - DONKEY((byte) 1), - MULE((byte) 2), - ZOMBIE((byte) 3), - SKELETON((byte) 4); + public enum HorseType implements ByteValue { + HORSE(VERSION >= 11 ? UNSUPPORTED : (byte) 0), + DONKEY(VERSION >= 11 ? UNSUPPORTED : (byte) 1), + MULE(VERSION >= 11 ? UNSUPPORTED : (byte) 2), + ZOMBIE(VERSION >= 11 ? UNSUPPORTED : (byte) 3), + SKELETON(VERSION >= 11 ? UNSUPPORTED : (byte) 4); @Getter byte value; } @@ -719,34 +904,14 @@ public enum Type { @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Armor { - NONE(0), - IRON(1), - GOLD(2), - DIAMOND(3); + public enum HorseArmor implements IntValue { + NONE(VERSION >= 14 ? UNSUPPORTED : 0), + IRON(VERSION >= 14 ? UNSUPPORTED : 1), + GOLD(VERSION >= 14 ? UNSUPPORTED : 2), + DIAMOND(VERSION >= 14 ? UNSUPPORTED : 3); @Getter int value; } - - @RequiredArgsConstructor - @Accessors(fluent = true) - @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { - TAME((byte) 0x02), - CHEST((byte) 0x0, (byte) 0x8), // legacy - SADDLED((byte) 0x04), - BRED((byte) 0x08, (byte) 0x10), - EATING((byte) 0x10, (byte) 0x20), - REARING((byte) 0x20, (byte) 0x40), - MOUTH_OPEN((byte) 0x40, (byte) 0x80); - - @Getter byte value; - @Getter byte legacyValue; - - Flag(final byte value) { - this(value, value); - } - } } @NoArgsConstructor(access = AccessLevel.PRIVATE) @@ -758,9 +923,10 @@ public static class SkeletonHorse extends AbstractHorse {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class ChestedHorse extends AbstractHorse { - public static WrappedWatchableObject chest(final boolean chest) { - if (VERSION >= 9) return FACTORY.createWatchable(15, chest); - return FACTORY.createWatchable(16, (byte) 0x08); + public static @NotNull WrappedWatchableObject chest(final boolean chest) { + requireAtLeast(12); + + return FACTORY.createWatchable(VERSION >= 15 ? 18 : 15, chest); } } @@ -770,297 +936,660 @@ public static class Donkey extends ChestedHorse {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Llama extends ChestedHorse { - public static WrappedWatchableObject strength(final int strength) { - return FACTORY.createWatchable(16, strength); + public static @NotNull WrappedWatchableObject strength(final int strength) { + requireAtLeast(11); + + return FACTORY.createWatchable(VERSION >= 15 ? 19 : 16, strength); } - public static WrappedWatchableObject carpetColor(final int carpetColor) { - return FACTORY.createWatchable(17, carpetColor); + public static @NotNull WrappedWatchableObject carpetColor(final int carpetColor) { + requireAtLeast(11); + + return FACTORY.createWatchable(VERSION >= 15 ? 20 : 17, carpetColor); } - public static WrappedWatchableObject variant(final Variant variant) { - return FACTORY.createWatchable(18, variant.value()); + public static @NotNull WrappedWatchableObject variant(final @NonNull LlamaVariant variant) { + requireAtLeast(11); + + return FACTORY.createWatchable(VERSION >= 15 ? 21 : 18, variant.checkedValue()); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Variant { - CREAMY((byte) 0), - WHITE((byte) 1), - BROWN((byte) 2), - GRAY((byte) 3); + public enum LlamaVariant implements IntValue { + CREAMY(0), + WHITE(1), + BROWN(2), + GRAY(3); - @Getter byte value; + @Getter int value; } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Mule extends ChestedHorse {} - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Pig extends Animal { - - public static WrappedWatchableObject saddle(final boolean saddle) { - return FACTORY.createWatchable(VERSION >= 9 ? 13 : 16, saddle); - } - - public static WrappedWatchableObject boostTime(final int boostTime) { - if (VERSION >= 9) return FACTORY.createWatchable(14, boostTime); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); - } - } + public static class TraderLama {} // yup @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Rabbit extends Animal { - - public static WrappedWatchableObject type(final int type) { - return FACTORY.createWatchable(VERSION >= 9 ? 13 : 18, type); - } - } + public static class Mule extends ChestedHorse {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Turtle extends Animal { + public static class Bee extends Animal { - public static WrappedWatchableObject home(final BlockPosition home) { - return FACTORY.createWatchable(13, home); - } + public static @NotNull WrappedWatchableObject beeFlags(final @NotNull BeeFlag @NonNull ...flags) { + requireAtLeast(15); - public static WrappedWatchableObject hasEgg(final boolean hasEgg) { - return FACTORY.createWatchable(14, hasEgg); + return FACTORY.createWatchable(16, ByteFlag.allChecked(flags)); } - public static WrappedWatchableObject layingEgg(final boolean layingEgg) { - return FACTORY.createWatchable(15, layingEgg); - } + public static @NotNull WrappedWatchableObject angryTime(final int angryTime) { + requireAtLeast(15); - public static WrappedWatchableObject travelPosition(final BlockPosition travelPosition) { - return FACTORY.createWatchable(16, travelPosition); + return FACTORY.createWatchable(17, angryTime); } - public static WrappedWatchableObject goingHome(final boolean goingHome) { - return FACTORY.createWatchable(17, goingHome); - } + @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum BeeFlag implements ByteFlag { + ANGRY(VERSION >= 15 ? (byte) 0x02 : UNSUPPORTED), + STUNG(VERSION >= 15 ? (byte) 0x04 : UNSUPPORTED), + HAS_NECTAR(VERSION >= 15 ? (byte) 0x08 : UNSUPPORTED); - public static WrappedWatchableObject travelling(final boolean travelling) { - return FACTORY.createWatchable(18, travelling); + @Getter byte value; } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class PolarBear extends Animal { + public static class Fox extends Animal { - public static WrappedWatchableObject standingUp(final boolean standingUp) { - return FACTORY.createWatchable(13, standingUp); + public static @NotNull WrappedWatchableObject foxType(final @NonNull FoxType type) { + return FACTORY.createWatchable(VERSION >= 15 ? 16 : 15, type.checkedValue()); } - } - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Sheep extends Animal { - - public static WrappedWatchableObject sheepData(final byte color, final boolean sheared) { - return FACTORY.createWatchable(13, color & 0x0F | (sheared ? 0x0 : 0x10)); + public static @NotNull WrappedWatchableObject foxFlags(final @NotNull FoxFlag @NonNull ...flags) { + return FACTORY.createWatchable(VERSION >= 15 ? 17 : 16, ByteFlag.allChecked(flags)); } - } - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Tameable extends Animal { - - public static WrappedWatchableObject tameableFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); + public static @NotNull WrappedWatchableObject firstUUID(final @Nullable UUID uuid) { + return FACTORY.createWatchableOptional(VERSION >= 15 ? 18 : 17, uuid); + } - return FACTORY.createWatchable(VERSION >= 9 ? 13 : 16, flagBytes); + public static @NotNull WrappedWatchableObject secondUUID(final @Nullable UUID uuid) { + return FACTORY.createWatchableOptional(VERSION >= 15 ? 19 : 18, uuid); } - public static WrappedWatchableObject owner(final @Nullable UUID ownerUuid) { - return FACTORY.createWatchableOptional(VERSION >= 9 ? 14 : 17, ownerUuid); + @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum FoxType implements IntValue { + RED(0), + SNOW(1); + + @Getter int value; } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { + public enum FoxFlag implements ByteFlag { SITTING((byte) 0x01), - ANGRY((byte) 0x02), - TAMED((byte) 0x04); + CROUCHING((byte) 0x04), + INTERESTED((byte) 0x04), + POUNCING((byte) 0x10), + SLEEPING((byte) 0x20), + FACEPLANTED((byte) 0x40), + DEFENDING((byte) 0x80); @Getter byte value; } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Ocelot extends Tameable { + public static class Ocelot extends Animal { - public static WrappedWatchableObject variant(final Variant variant) { - return FACTORY.createWatchable(VERSION >= 9 ? 15 : 18, variant.value()); + public static @NotNull WrappedWatchableObject trusting(final boolean trusting) { + requireAtLeast(15); + + return FACTORY.createWatchable(16, trusting); + } + + public static @NotNull WrappedWatchableObject variant(final @NonNull OcelotVariant variant) { + requireAtMost(13); + + val value = variant.checkedValue(); + return VERSION >= 9 + ? FACTORY.createWatchable(VERSION >= 10 ? 15 : 14, value) + : FACTORY.createWatchable(18, (byte) value); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Variant { - UNTAMED(0), - TUXEDO(1), - TABBY(2), - SIAMESE(3); + public enum OcelotVariant implements IntValue { + UNTAMED(VERSION >= 13 ? UNSUPPORTED : 0), + TUXEDO(VERSION >= 13 ? UNSUPPORTED : 1), + TABBY(VERSION >= 13 ? UNSUPPORTED : 2), + SIAMESE(VERSION >= 13 ? UNSUPPORTED : 3); @Getter int value; } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Wolf extends Tameable { + public static class Panda extends Animal { - public static WrappedWatchableObject damageTaken(final float damageTaken) { - return FACTORY.createWatchable(VERSION >= 9 ? 15 : 18, damageTaken); + public static @NotNull WrappedWatchableObject breedTimer(final int breedTimer) { + requireAtLeast(14); + + return FACTORY.createWatchable(VERSION >= 15 ? 16 : 15, breedTimer); } - public static WrappedWatchableObject begging(final boolean begging) { - return FACTORY.createWatchable(VERSION >= 9 ? 16 : 19, begging); + public static @NotNull WrappedWatchableObject sneezeTimer(final int sneezeTimer) { + requireAtLeast(14); + + return FACTORY.createWatchable(VERSION >= 15 ? 17 : 16, sneezeTimer); } - public static WrappedWatchableObject collarColor(final byte collarColor) { - return FACTORY.createWatchable(VERSION >= 9 ? 17 : 20, collarColor); + public static @NotNull WrappedWatchableObject earTimer(final int earTimer) { + requireAtLeast(14); + + return FACTORY.createWatchable(VERSION >= 15 ? 18 : 17, earTimer); } - } - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Parrot extends Tameable { + public static @NotNull WrappedWatchableObject mainGene(final byte mainGene) { + requireAtLeast(14); - public static WrappedWatchableObject variant(final Variant variant) { - return FACTORY.createWatchable(15, variant.value()); + return FACTORY.createWatchable(VERSION >= 15 ? 19 : 18, mainGene); } - @RequiredArgsConstructor - @Accessors(fluent = true) - @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Variant { - RED_BLUE(0), - BLUE(1), - GREEN(2), - YELLOW_BLUE(3), - SILVER(4); + public static @NotNull WrappedWatchableObject hiddenGene(final byte hiddenGene) { + requireAtLeast(14); - @Getter int value; + return FACTORY.createWatchable(VERSION >= 15 ? 20 : 19, hiddenGene); } - } - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Villager extends Ageable { + public static @NotNull WrappedWatchableObject pandaFlags(final @NotNull PandaFlag @NonNull ...flags) { + requireAtLeast(14); - public static WrappedWatchableObject profession(final Profession profession) { - if (VERSION >= 9) throw new UnsupportedOperationException( - "1.9 and later don't support this metadata" - ); - return FACTORY.createWatchable(13, profession.value()); + return FACTORY.createWatchable(VERSION >= 15 ? 21 : 20, ByteFlag.allChecked(flags)); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Profession { - FARMER(0), - LIBRARIAN(1), - PRIEST(2), - BLACKSMITH(3), - SILVER(4); + public enum PandaFlag implements ByteFlag { + SNEEZING(VERSION >= 14 ? (byte) 0x02 : UNSUPPORTED), + ROLLING(VERSION >= 14 ? (byte) 0x04 : UNSUPPORTED), + SITTING(VERSION >= 14 ? (byte) 0x08 : UNSUPPORTED), + ON_BACK(VERSION >= 14 ? (byte) 0x10 : UNSUPPORTED); - @Getter int value; + @Getter byte value; } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Golem extends PathfinderMob {} + public static class Pig extends Animal { - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class IronGolem extends Golem { + public static @NotNull WrappedWatchableObject saddle(final boolean saddle) { + return FACTORY.createWatchable(VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 16, saddle); + } - public static WrappedWatchableObject ironGolemFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); + public static @NotNull WrappedWatchableObject boostTime(final int boostTime) { + requireAtLeast(11); - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); + return FACTORY.createWatchable(VERSION >= 15 ? 17 : 14, boostTime); } + } - @RequiredArgsConstructor - @Accessors(fluent = true) - @SuppressWarnings("Singleton") // there just is single entry in this enum - @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { - PLAYER_CREATED((byte) 0x01); + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Rabbit extends Animal { - @Getter - byte value; + public static @NotNull WrappedWatchableObject type(final int type) { + return VERSION >= 9 + ? FACTORY.createWatchable(VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : 12, type) + : FACTORY.createWatchable(18, (byte) type); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Snowman extends Golem { + public static class Turtle extends Animal { - public static WrappedWatchableObject snowmanFlags(final Flag... flags) { - if (VERSION >= 9) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); + public static @NotNull WrappedWatchableObject home(final @NonNull BlockPosition home) { + requireAtLeast(13); - return FACTORY.createWatchable(12, flagBytes); - } - throw new UnsupportedOperationException("Versions lower than 1.9 don't support this metadata"); + return FACTORY.createWatchable(VERSION >= 15 ? 16 : 13, home); } - @RequiredArgsConstructor - @Accessors(fluent = true) - @SuppressWarnings("Singleton") // there just is single entry in this enum - @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { - HAS_PUMPKIN((byte) 0x10); + public static @NotNull WrappedWatchableObject hasEgg(final boolean hasEgg) { + requireAtLeast(13); - @Getter byte value; + return FACTORY.createWatchable(VERSION >= 15 ? 17 : 14, hasEgg); } - } - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Shulker extends Golem { + public static @NotNull WrappedWatchableObject layingEgg(final boolean layingEgg) { + requireAtLeast(13); - public static WrappedWatchableObject facing(final @NonNull Object enumDirection) { - return FACTORY.createWatchableEnumDirection(12, enumDirection); + return FACTORY.createWatchable(VERSION >= 15 ? 18 : 15, layingEgg); } - public static WrappedWatchableObject facing(final @NonNull EnumWrappers.Direction direction) { - return FACTORY.createWatchable(12, direction); + public static @NotNull WrappedWatchableObject travelPosition(final @NonNull BlockPosition travelPosition) { + requireAtLeast(13); + + return FACTORY.createWatchable(VERSION >= 15 ? 19 : 16, travelPosition); } - public static WrappedWatchableObject attachmentPosition(final @Nullable BlockPosition attachmentPosition) { - return FACTORY.createWatchableOptional(13, attachmentPosition); + public static @NotNull WrappedWatchableObject goingHome(final boolean goingHome) { + requireAtLeast(13); + + return FACTORY.createWatchable(VERSION >= 15 ? 20 : 17, goingHome); } - public static WrappedWatchableObject shieldHeight(final byte shieldHeight) { - return FACTORY.createWatchable(14, shieldHeight); + public static @NotNull WrappedWatchableObject travelling(final boolean travelling) { + requireAtLeast(13); + + return FACTORY.createWatchable(VERSION >= 15 ? 21 : 18, travelling); } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class PolarBear extends Animal { - public static WrappedWatchableObject color(final byte color) { - return FACTORY.createWatchable(15, color); + public static @NotNull WrappedWatchableObject standingUp(final boolean standingUp) { + requireAtLeast(10); + + return FACTORY.createWatchable(VERSION >= 15 ? 13 : 16, standingUp); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Monster extends PathfinderMob {} + public static class Chicken extends Animal {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Blaze extends Monster { + public static class Cow extends Animal {} + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Hoglin extends Animal { - public static WrappedWatchableObject blazeFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); + public static @NotNull WrappedWatchableObject immuneToZombification(final boolean immuneToZombification) { + requireAtLeast(16); - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); + return FACTORY.createWatchable(16, immuneToZombification); } + } - @RequiredArgsConstructor - @Accessors(fluent = true) + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Mooshroom extends Cow { + + public static @NotNull WrappedWatchableObject type(final @NonNull String type) { + requireAtLeast(15); + + return FACTORY.createWatchable(16, type); + } + + public static @NotNull WrappedWatchableObject type(final @NonNull MooshroomType type) { + requireAtLeast(15); + + return FACTORY.createWatchable(16, type.checkedValue()); + } + + @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum MooshroomType implements StringValue { + RED("red"), + BROWN("brown"); + + @Getter @NotNull String value; + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Sheep extends Animal { + + public static @NotNull WrappedWatchableObject sheepData(final @NonNull DyeColor color, final boolean sheared) { + return FACTORY.createWatchable( + VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 16, + (byte) (woolId(color) | (sheared ? 0x10 : 0x00)) + ); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Strider extends Animal { + + public static @NotNull WrappedWatchableObject boostTime(final int boostTime) { + requireAtLeast(16); + + return FACTORY.createWatchable(16, boostTime); + } + + public static @NotNull WrappedWatchableObject shaking(final boolean shaking) { + requireAtLeast(16); + + return FACTORY.createWatchable(17, shaking); + } + + public static @NotNull WrappedWatchableObject hasSaddle(final boolean hasSaddle) { + requireAtLeast(16); + + return FACTORY.createWatchable(18, hasSaddle); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class TameableAnimal extends Animal { + + public static @NotNull WrappedWatchableObject tameableAnimalFlags( + final @NotNull TameableAnimalFlag @NonNull ...flags + ) { + return FACTORY.createWatchable( + VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 16, + ByteFlag.allChecked(flags) + ); + } + + public static @NotNull WrappedWatchableObject owner(final @Nullable UUID ownerUuid) { + return VERSION >= 9 + ? FACTORY.createWatchableOptional(VERSION >= 15 ? 17 : VERSION >= 10 ? 14 : 13, ownerUuid) + : FACTORY.createWatchable( + 17, ownerUuid == null ? "" : Bukkit.getOfflinePlayer(ownerUuid).getName() + ); + } + + public static @NotNull WrappedWatchableObject owner(final @Nullable OfflinePlayer owner) { + return VERSION >= 9 ? FACTORY.createWatchableOptional( + VERSION >= 15 ? 17 : VERSION >= 10 ? 14 : 13, + owner == null ? null : owner.getUniqueId() + ) : FACTORY.createWatchable(17, owner == null ? null : owner.getName()); + } + + public static @NotNull WrappedWatchableObject owner(final @Nullable String ownerName) { + return VERSION >= 9 ? FACTORY.createWatchableOptional( + VERSION >= 15 ? 17 : VERSION >= 10 ? 14 : 13, + uuidByName(ownerName) + ) : FACTORY.createWatchable(21, ownerName == null ? "" : ownerName); + } + + @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum TameableAnimalFlag implements ByteFlag { + SITTING(VERSION >= 9 ? (byte) 0x01 : UNSUPPORTED), + ANGRY(VERSION >= 16 ? UNSUPPORTED : VERSION >= 9 ? (byte) 0x02 : UNSUPPORTED), + TAMED(VERSION >= 9 ? (byte) 0x04 : UNSUPPORTED); + + @Getter byte value; + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Cat extends TameableAnimal { + + public static @NotNull WrappedWatchableObject catVariant(final @NonNull CatVariant variant) { + requireAtLeast(14); + + return FACTORY.createWatchable(VERSION >= 15 ? 18 : 17, variant.checkedValue()); + } + + public static @NotNull WrappedWatchableObject lying(final boolean lying) { + requireAtLeast(14); + + return FACTORY.createWatchable(VERSION >= 15 ? 19 : 18, lying); + } + + public static @NotNull WrappedWatchableObject relaxed(final boolean relaxed) { + requireAtLeast(14); + + return FACTORY.createWatchable(VERSION >= 15 ? 20 : 19, relaxed); + } + + public static @NotNull WrappedWatchableObject collarColor(final @NonNull DyeColor collarColor) { + requireAtLeast(14); + + return FACTORY.createWatchable(VERSION >= 15 ? 21 : 20, (int) woolId(collarColor)); + } + + @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum CatVariant implements IntValue { + TABBY(0), + BLACK(1), + RED(2), + SIAMESE(3), + BRITISH_SHORTHAIR(4), + CALICO(5), + PERSIAN(6), + RAGDOLL(7), + WHITE(8), + JELLIE(VERSION >= 16 ? 9 : UNSUPPORTED), + ALL_BLACK(VERSION >= 16 ? 10 : 9); + + @Getter int value; + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Wolf extends TameableAnimal { + + public static @NotNull WrappedWatchableObject begging(final boolean begging) { + return FACTORY.createWatchable(VERSION >= 16 ? 18 : VERSION >= 10 ? 16 : VERSION >= 9 ? 15 : 19, begging); + } + + public static @NotNull WrappedWatchableObject collarColor(final @NonNull DyeColor collarColor) { + val value = woolId(collarColor); + return VERSION >= 9 + ? FACTORY.createWatchable(VERSION >= 16 ? 19 : VERSION >= 10 ? 17 : 16, (int) value) + : FACTORY.createWatchable(20, value); + } + + public static @NotNull WrappedWatchableObject damageTaken(final float damageTaken) { + requireAtMost(14); + + return FACTORY.createWatchable(VERSION >= 10 ? 15 : VERSION >= 9 ? 14 : 18, damageTaken); + } + + public static @NotNull WrappedWatchableObject angerTime(final int angerTime) { + requireAtLeast(16); + + return FACTORY.createWatchable(20, angerTime); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Parrot extends TameableAnimal { + + public static @NotNull WrappedWatchableObject variant(final @NonNull Variant variant) { + requireAtLeast(12); + + return FACTORY.createWatchable(VERSION >= 15 ? 18 : 15, variant.checkedValue()); + } + + @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum Variant implements IntValue { + RED_BLUE(0), + BLUE(1), + GREEN(2), + YELLOW_BLUE(3), + GREY(4); + + @Getter int value; + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class AbstractVillager extends AgeableMob { + + public static @NotNull WrappedWatchableObject headShakeTimer(final int headShakeTimer) { + requireAtLeast(16); + + return FACTORY.createWatchable(16, headShakeTimer); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Villager extends AbstractVillager { + + public static @NotNull WrappedWatchableObject profession(final @NonNull VillagerProfession profession) { + requireAtMost(13); + + return FACTORY.createWatchable(VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 16, profession.checkedValue()); + } + + public static @NotNull WrappedWatchableObject villagerData(final @NonNull WrappedVillagerData villagerData) { + requireAtLeast(14); + + return FACTORY.createWatchable(VERSION >= 15 ? 17 : 16, villagerData); + } + + @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum VillagerProfession implements IntValue { + FARMER(VERSION >= 14 ? UNSUPPORTED : 0), + LIBRARIAN(VERSION >= 14 ? UNSUPPORTED : 1), + PRIEST(VERSION >= 14 ? UNSUPPORTED : 2), + BLACKSMITH(VERSION >= 14 ? UNSUPPORTED : 3), + SILVER(VERSION >= 14 ? UNSUPPORTED : 4); + + @Getter int value; + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class WanderingTrader extends AbstractVillager {} + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class AbstractGolem extends PathfinderMob {} + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class IronGolem extends AbstractGolem { + + public static @NotNull WrappedWatchableObject ironGolemFlags(final @NotNull IronGolemFlag @NonNull ...flags) { + return FACTORY.createWatchable( + VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 16, + ByteFlag.allChecked(flags) + ); + } + + @RequiredArgsConstructor + @Accessors(fluent = true) @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { + public enum IronGolemFlag implements ByteFlag { + PLAYER_CREATED((byte) 0x01); + + @Getter byte value; + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class SnowGolem extends AbstractGolem { + + public static @NotNull WrappedWatchableObject snowGolemFlags(final @NotNull SnowGolemFlag @NonNull ...flags) { + return FACTORY.createWatchable( + VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 10 : 15 /* missing spec for this */, + ByteFlag.allChecked(flags) + ); + } + + @RequiredArgsConstructor + @Accessors(fluent = true) + @SuppressWarnings("Singleton") // there just is single entry in this enum + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum SnowGolemFlag implements ByteFlag { + PLAYER_CREATED((byte) 0x10); + + @Getter byte value; + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Shulker extends AbstractGolem { + + public static @NotNull WrappedWatchableObject attachFace(final @NonNull EnumWrappers.Direction direction) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : 11, direction); + } + + public static @NotNull WrappedWatchableObject attachmentPosition( + final @Nullable BlockPosition attachmentPosition + ) { + requireAtLeast(9); + + return FACTORY.createWatchableOptional(VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : 12, attachmentPosition); + } + + public static @NotNull WrappedWatchableObject shieldHeight(final byte shieldHeight) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 17 : VERSION >= 10 ? 14 : 13, shieldHeight); + } + + public static @NotNull WrappedWatchableObject color(final @NonNull DyeColor dyeColor) { + requireAtLeast(11); + + return FACTORY.createWatchable(VERSION >= 15 ? 18 : 15, woolId(dyeColor)); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Monster extends PathfinderMob {} + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class BasePiglin extends PathfinderMob { + + public static @NotNull WrappedWatchableObject immuneToZombification(final boolean immuneToZombification) { + requireAtLeast(16); + + return FACTORY.createWatchable(15, immuneToZombification); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Piglin extends BasePiglin { + + public static @NotNull WrappedWatchableObject baby(final boolean baby) { + requireAtLeast(16); + + return FACTORY.createWatchable(16, baby); + } + + public static @NotNull WrappedWatchableObject chargingCrossbow(final boolean chargingCrossbow) { + requireAtLeast(16); + + return FACTORY.createWatchable(17, chargingCrossbow); + } + + public static @NotNull WrappedWatchableObject dancing(final boolean dancing) { + requireAtLeast(16); + + return FACTORY.createWatchable(18, dancing); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class PiglinBrute extends BasePiglin {} + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Blaze extends Monster { + + public static @NotNull WrappedWatchableObject blazeFlags(final @NotNull BlazeFlag @NonNull ...flags) { + return FACTORY.createWatchable( + VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 16, + ByteFlag.allChecked(flags) + ); + } + + @RequiredArgsConstructor + @Accessors(fluent = true) + @SuppressWarnings("Singleton") // there just is single entry in this enum + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum BlazeFlag implements ByteFlag { ON_FIRE((byte) 0x01); @Getter byte value; @@ -1070,23 +1599,27 @@ public enum Flag { @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Creeper extends Monster { - public static WrappedWatchableObject creeperState(final State state) { - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, state.value()); + public static @NotNull WrappedWatchableObject creeperState(final @NonNull CreeperState state) { + return FACTORY.createWatchable( + VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 16, + state.checkedValue() + ); } - public static WrappedWatchableObject charged(final boolean charged) { - return FACTORY.createWatchable(VERSION >= 9 ? 13 : 17, charged); + public static @NotNull WrappedWatchableObject charged(final boolean charged) { + return FACTORY.createWatchable(VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 17, charged); } - public static WrappedWatchableObject ignited(final boolean ignited) { - if (VERSION >= 9) return FACTORY.createWatchable(14, ignited); - throw new UnsupportedOperationException("Versions lower than 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject ignited(final boolean ignited) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 17 : VERSION >= 10 ? 14 : 13, ignited); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum State { + public enum CreeperState implements IntValue { IDLE(-1), FUSE(1); @@ -1098,30 +1631,51 @@ public enum State { public static class Endermite extends Monster {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class GiantZombie extends Monster {} + public static class Giant extends Monster {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Guardian extends Monster { - public static WrappedWatchableObject retractingSpikes(final boolean retractingSpikes) { - if (VERSION >= 13) return FACTORY.createWatchable(12, retractingSpikes); - return FACTORY.createWatchable(16, (byte) 0x04); + public static @NotNull WrappedWatchableObject retractingSpikes(final boolean retractingSpikes) { + return VERSION >= 11 + ? FACTORY.createWatchable(VERSION >= 15 ? 15 : 12, retractingSpikes) + : FACTORY.createWatchable( + VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 16, + GuardianFlag.RETRACTING_SPIKES.checkedValue() + ); + } + + public static @NotNull WrappedWatchableObject guardianFlags(final @NonNull GuardianFlag... guardianFlags) { + requireAtMost(10); + + return FACTORY.createWatchable( + VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 16, + ByteFlag.allChecked(guardianFlags) + ); } - @Deprecated - public static WrappedWatchableObject guardianFlags(final boolean elder, final boolean retractingSpikes) { - if (VERSION >= 13) return FACTORY.createWatchable(12, retractingSpikes); + public static @NotNull WrappedWatchableObject targetEntity(final int targetEntityId) { return FACTORY.createWatchable( - 16, ((elder ? (byte) 0x02 : (byte) 0x0) | (retractingSpikes ? (byte) 0x04 : (byte) 0x0)) + VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 17, + targetEntityId ); } - public static WrappedWatchableObject targetEntity(final int targetEntityId) { - return FACTORY.createWatchable(VERSION >= 9 ? 13 : 17, targetEntityId); + public static @NotNull WrappedWatchableObject targetEntity(final @NonNull org.bukkit.entity.Entity entity) { + return FACTORY.createWatchable( + VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 17, + entity.getEntityId() + ); } - public static WrappedWatchableObject targetEntity(final org.bukkit.entity.Entity entity) { - return targetEntity(entity.getEntityId()); + @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum GuardianFlag implements ByteFlag { + ELDERY(VERSION >= 11 ? UNSUPPORTED : (byte) 0x02), + RETRACTING_SPIKES((byte) 0x04); + + @Getter byte value; } } @@ -1132,81 +1686,141 @@ public static class ElderGuardian extends Guardian {} public static class Silverfish extends Monster {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Illager extends Monster { + public static class Raider extends Monster { - public static WrappedWatchableObject illagerState(final State state) { - return FACTORY.createWatchable(12, state.value()); + public static @NotNull WrappedWatchableObject celebrating(final boolean celebrating) { + requireAtLeast(14); + + return FACTORY.createWatchable(VERSION >= 15 ? 15 : 14, celebrating); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class AbstractIllager extends Raider { + + public static @NotNull WrappedWatchableObject abstractIllagerFlags( + final @NotNull AbstractIllagerFlag @NonNull ...flags + ) { + requireAtLeast(12); + requireAtMost(13); + + return FACTORY.createWatchable(12, ByteFlag.allChecked(flags)); } @RequiredArgsConstructor @Accessors(fluent = true) @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum State { - HAS_TARGET((byte) 0x01); + public enum AbstractIllagerFlag implements ByteFlag { + HAS_TARGET(VERSION >= 14 ? UNSUPPORTED : (byte) 0x01); @Getter byte value; } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class VindicatorIllager extends Illager {} + public static class Vindicator extends AbstractIllager {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class SpellcasterIllager extends Illager { + public static class Pillager extends AbstractIllager { + + public static @NotNull WrappedWatchableObject charging(final boolean charging) { + requireAtLeast(16); - public static WrappedWatchableObject spell(final Spell spell) { - return FACTORY.createWatchable(13, spell.value()); + // note: missing spec for 1.15 + return FACTORY.createWatchable(VERSION >= 15 ? 16 : 15, charging); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class SpellcasterIllager extends AbstractIllager { + + public static @NotNull WrappedWatchableObject spell(final @NonNull Spell spell) { + return FACTORY.createWatchable(13, spell.checkedValue()); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Spell { - NONE((byte) 0), - SUMMON_VEX((byte) 1), - ATTACK((byte) 2), - WOLOLO((byte) 3); + public enum Spell implements ByteValue { + NONE(VERSION >= 12 ? (byte) 0 : UNSUPPORTED), + SUMMON_VEX(VERSION >= 12 ? (byte) 1 : UNSUPPORTED), + ATTACK(VERSION >= 12 ? (byte) 2 : UNSUPPORTED), + WOLOLO(VERSION >= 12 ? (byte) 3 : UNSUPPORTED), + DISAPPEAR(VERSION >= 13 ? (byte) 5 : UNSUPPORTED), + BLINDNESS(VERSION >= 13 ? (byte) 6 : UNSUPPORTED); @Getter byte value; } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class EvocationIllager extends SpellcasterIllager {} + public static class Evoker extends SpellcasterIllager {} + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Illusioner extends SpellcasterIllager {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class IllusionIllager extends SpellcasterIllager {} + public static class Ravager extends Raider {} + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Witch extends Raider { + + public static @NotNull WrappedWatchableObject drinkingPotion(final boolean drinkingPotion) { + return FACTORY.createWatchable( + VERSION >= 15 ? 16 : VERSION >= 14 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 21, + drinkingPotion + ); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class EvokerFangs extends Entity {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Vex extends Monster { - public static WrappedWatchableObject vexFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); + public static @NotNull WrappedWatchableObject vexFlags(final @NotNull VexFlag @NonNull ...flags) { + requireAtLeast(11); - return FACTORY.createWatchable(12, flagBytes); + return FACTORY.createWatchable(VERSION >= 15 ? 15 : 12, ByteFlag.allChecked(flags)); } @RequiredArgsConstructor @Accessors(fluent = true) @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { - ATTACK_MODE((byte) 0x01); + public enum VexFlag implements ByteFlag { + ATTACKING(VERSION >= 11 ? (byte) 0x01 : UNSUPPORTED); @Getter byte value; } } - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class EvocationFangs extends Entity {} - @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class AbstractSkeleton extends Monster { - public static WrappedWatchableObject swingingArms(final boolean swingingArms) { - return FACTORY.createWatchable(12, swingingArms); + public static @NotNull WrappedWatchableObject skeletonType(final @NonNull SkeletonType type) { + requireAtMost(10); + + return FACTORY.createWatchable(VERSION >= 10 ? 13 : VERSION >= 9 ? 11 : 13, type.checkedValue()); + } + + public static @NotNull WrappedWatchableObject swingingArms(final boolean swingingArms) { + requireAtLeast(9); + requireAtMost(13); + + return FACTORY.createWatchable(VERSION >= 11 ? 12 : VERSION >= 10 ? 13 : 12, swingingArms); + } + + @RequiredArgsConstructor + @Accessors(fluent = true) + @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) + public enum SkeletonType implements ByteValue { + NORMAL(VERSION >= 11 ? UNSUPPORTED : (byte) 0), + WITHER(VERSION >= 11 ? UNSUPPORTED : (byte) 1); + + @Getter byte value; } } @@ -1222,18 +1836,18 @@ public static class Stray extends AbstractSkeleton {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Spider extends Monster { - public static WrappedWatchableObject spiderFlags(final Flag... flags) { - var flagBytes = (byte) 0; - for (val flag : flags) flagBytes |= flag.value(); - - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, flagBytes); + public static @NotNull WrappedWatchableObject spiderFlags(final @NotNull SpiderFlag @NonNull ...flags) { + return FACTORY.createWatchable( + VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 16, + ByteFlag.allChecked(flags) + ); } @RequiredArgsConstructor @Accessors(fluent = true) @SuppressWarnings("Singleton") // there just is single entry in this enum @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Flag { + public enum SpiderFlag implements ByteFlag { CLIMBING((byte) 0x01); @Getter byte value; @@ -1241,81 +1855,136 @@ public enum Flag { } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Witch extends Monster { + public static class Wither extends Monster { - public static WrappedWatchableObject drinkingPotion(final boolean drinkingPotion) { - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 21, drinkingPotion); + public static @NotNull WrappedWatchableObject centerHeadTarget(final int centerHeadTargetId) { + return FACTORY.createWatchable( + VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 17, + centerHeadTargetId + ); } - } - - @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Wither extends Monster { - public static WrappedWatchableObject centerHeadTarget(final int centerHeadTargetId) { - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 17, centerHeadTargetId); + public static @NotNull WrappedWatchableObject centerHeadTarget( + final @Nullable org.bukkit.entity.Entity centerHeadTarget + ) { + return FACTORY.createWatchable( + VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 17, + centerHeadTarget == null ? 0 : centerHeadTarget.getEntityId() + ); } - public static WrappedWatchableObject centerHeadTarget(final org.bukkit.entity.Entity centerHeadTarget) { - return centerHeadTarget(centerHeadTarget == null ? 0 : centerHeadTarget.getEntityId()); + public static @NotNull WrappedWatchableObject leftHeadTarget(final int leftHeadTargetId) { + return FACTORY.createWatchable( + VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 18, + leftHeadTargetId + ); } - public static WrappedWatchableObject leftHeadTarget(final int leftHeadTargetId) { - return FACTORY.createWatchable(VERSION >= 9 ? 13 : 18, leftHeadTargetId); + public static @NotNull WrappedWatchableObject leftHeadTarget( + final @NonNull org.bukkit.entity.Entity leftHeadTarget + ) { + return FACTORY.createWatchable( + VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : VERSION >= 9 ? 12 : 18, + leftHeadTarget.getEntityId() + ); } - public static WrappedWatchableObject leftHeadTarget(final org.bukkit.entity.Entity leftHeadTarget) { - return leftHeadTarget(leftHeadTarget == null ? 0 : leftHeadTarget.getEntityId()); + public static @NotNull WrappedWatchableObject rightHeadTarget(final int rightHeadTargetId) { + return FACTORY.createWatchable( + VERSION >= 15 ? 17 : VERSION >= 10 ? 14 : VERSION >= 9 ? 13 : 19, + rightHeadTargetId + ); } - public static WrappedWatchableObject rightHeadTarget(final int rightHeadTargetId) { - return FACTORY.createWatchable(VERSION >= 9 ? 14 : 19, rightHeadTargetId); + public static @NotNull WrappedWatchableObject rightHeadTarget( + final @NonNull org.bukkit.entity.Entity rightHeadTarget + ) { + return FACTORY.createWatchable( + VERSION >= 15 ? 17 : VERSION >= 10 ? 14 : VERSION >= 9 ? 13 : 19, + rightHeadTarget.getEntityId() + ); } - public static WrappedWatchableObject rightHeadTarget(final org.bukkit.entity.Entity rightHeadTarget) { - return rightHeadTarget(rightHeadTarget == null ? 0 : rightHeadTarget.getEntityId()); + public static @NotNull WrappedWatchableObject invulnerableTime(final int invulnerableTime) { + return FACTORY.createWatchable( + VERSION >= 15 ? 18 : VERSION >= 10 ? 15 : VERSION >= 9 ? 14 : 20, + invulnerableTime + ); } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class Zoglin extends Monster { + + public static @NotNull WrappedWatchableObject baby(final boolean baby) { + requireAtLeast(16); - public static WrappedWatchableObject invulnerableTime(final int invulnerableTime) { - return FACTORY.createWatchable(VERSION >= 9 ? 15 : 20, invulnerableTime); + return FACTORY.createWatchable(15, baby); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Zombie extends Monster { - public static WrappedWatchableObject baby(final boolean baby) { - return FACTORY.createWatchable(12, baby); + public static @NotNull WrappedWatchableObject baby(final boolean baby) { + return FACTORY.createWatchable(VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 12, baby); } - @Deprecated - public static WrappedWatchableObject zombieVillager(final boolean zombieVillager) { + public static @NotNull WrappedWatchableObject zombieVillager(final boolean zombieVillager) { + requireAtMost(8); + return FACTORY.createWatchable(13, zombieVillager); } - public static WrappedWatchableObject handsUp(final boolean handsUp) { - if (VERSION >= 9) return FACTORY.createWatchable(14, handsUp); - else throw new UnsupportedOperationException( - "Versions prior to 1.9 don't support this metadata" - ); + public static @NotNull WrappedWatchableObject zombieType(final int zombieType) { + requireAtLeast(9); + requireAtMost(10); + + return FACTORY.createWatchable(VERSION >= 10 ? 13 : 12, zombieType); } - public static WrappedWatchableObject becomingDrowned(final boolean becomingDrowned) { - if (VERSION >= 13) return FACTORY.createWatchable(15, becomingDrowned); - else throw new UnsupportedOperationException( - "Versions prior to 1.13 don't support this metadata" - ); + public static @NotNull WrappedWatchableObject converting(final boolean converting) { + requireAtMost(10); + + return FACTORY.createWatchable(VERSION >= 10 ? 14 : VERSION >= 9 ? 13 : 14, converting); + } + + public static @NotNull WrappedWatchableObject handsUp(final boolean handsUp) { + requireAtLeast(9); + requireAtMost(14); + + return FACTORY.createWatchable(VERSION >= 11 ? 14 : VERSION >= 10 ? 15 : 14, handsUp); + } + + public static @NotNull WrappedWatchableObject becomingDrowned(final boolean becomingDrowned) { + requireAtLeast(13); + + return FACTORY.createWatchable(VERSION >= 15 ? 17 : 15, becomingDrowned); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class ZombieVillager extends Zombie { - public static WrappedWatchableObject converting(final boolean converting) { - return FACTORY.createWatchable(VERSION >= 9 ? 16 : 14, converting); + public static @NotNull WrappedWatchableObject converting(final boolean converting) { + return FACTORY.createWatchable( + VERSION >= 15 ? 18 : VERSION >= 13 ? 16 : VERSION >= 11 + ? 15 : VERSION >= 10 ? 14 : VERSION >= 9 ? 13 : 14, + converting + ); + } + + public static @NotNull WrappedWatchableObject profession(final int profession) { + requireAtLeast(11); + requireAtMost(14); + + return FACTORY.createWatchable(VERSION >= 13 ? 17 : 16, profession); } - public static WrappedWatchableObject profession(final Villager.Profession profession) { - return FACTORY.createWatchable(17, profession.value()); + public static @NotNull WrappedWatchableObject villagerData(final @NonNull WrappedVillagerData villagerData) { + requireAtLeast(15); + + return FACTORY.createWatchable(19, villagerData); } } @@ -1325,59 +1994,67 @@ public static class Husk extends Zombie {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Drowned extends Zombie {} + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class ZombifiedPiglin extends Zombie {} + @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Enderman extends Monster { - public static WrappedWatchableObject carriedBlock(final Object carriedBlock) { - if (VERSION >= 9) return FACTORY.createWatchableOptionalIBlockData(12, Optional.of(carriedBlock)); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); - } + public static @NotNull WrappedWatchableObject carriedBlockId(final short carriedBlockId) { + requireAtMost(8); - public static WrappedWatchableObject carriedBlockId(final short carriedBlockId) { - if (VERSION >= 9) throw new UnsupportedOperationException( - "Versions 1.9 and later don't support this metadata" - ); return FACTORY.createWatchable(16, carriedBlockId); } - public static WrappedWatchableObject carriedBlockData(final byte carriedBlockData) { - if (VERSION >= 9) throw new UnsupportedOperationException( - "Versions 1.9 and later don't support this metadata" - ); + public static @NotNull WrappedWatchableObject carriedBlockData(final byte carriedBlockData) { + requireAtMost(8); + return FACTORY.createWatchable(17, carriedBlockData); } - public static WrappedWatchableObject screaming(final boolean screaming) { - return FACTORY.createWatchable(VERSION >= 9 ? 13 : 18, screaming); + public static @NotNull WrappedWatchableObject carriedBlock(final @Nullable WrappedBlockData carriedBlock) { + requireAtLeast(9); + + return FACTORY.createWatchableOptional(VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : 11, carriedBlock); + } + + public static @NotNull WrappedWatchableObject screaming(final boolean screaming) { + return FACTORY.createWatchable(VERSION >= 15 ? 16 : VERSION >= 10 ? 13 : 12, screaming); + } + + public static @NotNull WrappedWatchableObject staring(final boolean staring) { + requireAtLeast(15); + + return FACTORY.createWatchable(17, staring); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class EnderDragon extends Monster { + public static class EnderDragon extends Mob { + + public static @NotNull WrappedWatchableObject phase(final @NonNull EnderDragonPhase phase) { + requireAtLeast(9); - public static WrappedWatchableObject phase(final Phase phase) { - if (VERSION >= 9) return FACTORY.createWatchable(12, phase.value()); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + return FACTORY.createWatchable(VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : 11, phase.checkedValue()); } @RequiredArgsConstructor @Accessors(fluent = true) @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) - public enum Phase { - CIRCLING(0), - STRAFING(1), - FLYING(2), - LANDING(3), - TAKING_OFF(4), - BREATHING(5), - LOOKING_FOR_PLAYER(6), - ROARING(7), - CHARGING_PLAYER(8), - FLYDYING(9), - NO_AI(10); + public enum EnderDragonPhase implements IntValue { + CIRCLING(VERSION >= 9 ? 0 : UNSUPPORTED), + STRAFING(VERSION >= 9 ? 1 : UNSUPPORTED), + FLYING_TO_LAND(VERSION >= 9 ? 2 : UNSUPPORTED), + LANDING(VERSION >= 9 ? 3 : UNSUPPORTED), + TAKING_OFF(VERSION >= 9 ? 4 : UNSUPPORTED), + BREATHING(VERSION >= 9 ? 5 : UNSUPPORTED), + LOOKING_FOR_PLAYER(VERSION >= 9 ? 6 : UNSUPPORTED), + ROARING(VERSION >= 9 ? 7 : UNSUPPORTED), + CHARGING_PLAYER(VERSION >= 9 ? 8 : UNSUPPORTED), + FLYING_TO_DIE(VERSION >= 9 ? 9 : UNSUPPORTED), + NO_AI(VERSION >= 9 ? 10 : UNSUPPORTED); - @Getter - int value; + @Getter int value; } } @@ -1387,24 +2064,26 @@ public static class Flying extends Mob {} @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Ghast extends Flying { - public static WrappedWatchableObject attacking(final boolean attacking) { - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, attacking); + public static @NotNull WrappedWatchableObject attacking(final boolean attacking) { + return FACTORY.createWatchable(VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 11 : 16, attacking); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Phantom extends Flying { - public static WrappedWatchableObject size(final int size) { - return FACTORY.createWatchable(12, size); + public static @NotNull WrappedWatchableObject size(final int size) { + requireAtLeast(13); + + return FACTORY.createWatchable(VERSION >= 15 ? 15 : 12, size); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class Slime extends Mob { - public static WrappedWatchableObject size(final int size) { - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, size); + public static @NotNull WrappedWatchableObject size(final int size) { + return FACTORY.createWatchable(VERSION >= 15 ? 15 : VERSION >= 10 ? 12 : VERSION >= 9 ? 12 : 16, size); } } @@ -1412,79 +2091,173 @@ public static WrappedWatchableObject size(final int size) { public static class LlamaSpit extends Entity {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class Minecart extends Entity { + public static class AbstractMinecart extends Entity { + + private static final int OFFSET = VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : VERSION >= 9 ? 5 : 17; + private static final int MAX_INDEX = OFFSET + 5; - public static WrappedWatchableObject shakingPower(final int shakingPower) { - return FACTORY.createWatchable(VERSION >= 9 ? 6 : 17, shakingPower); + public static @NotNull WrappedWatchableObject shakingPower(final int shakingPower) { + return FACTORY.createWatchable(OFFSET, shakingPower); } - public static WrappedWatchableObject shakingDirection(final int shakingDirection) { - return FACTORY.createWatchable(VERSION >= 9 ? 7 : 18, shakingDirection); + public static @NotNull WrappedWatchableObject shakingDirection(final int shakingDirection) { + return FACTORY.createWatchable(OFFSET + 1, shakingDirection); } - public static WrappedWatchableObject shakingMultiplier(final int shakingMultiplier) { - return FACTORY.createWatchable(VERSION >= 9 ? 8 : 19, shakingMultiplier); + public static @NotNull WrappedWatchableObject shakingMultiplier(final int shakingMultiplier) { + return FACTORY.createWatchable(OFFSET + 2, shakingMultiplier); } - public static WrappedWatchableObject customBlockIdAndDamage(final int customBlockIdAndDamage) { - return FACTORY.createWatchable(VERSION >= 9 ? 9 : 20, customBlockIdAndDamage); + public static @NotNull WrappedWatchableObject customBlockIdAndDamage(final int customBlockIdAndDamage) { + return FACTORY.createWatchable(OFFSET + 3, customBlockIdAndDamage); } - public static WrappedWatchableObject customBlockY(final int customBlockY) { - return FACTORY.createWatchable(VERSION >= 9 ? 10 : 21, customBlockY); + public static @NotNull WrappedWatchableObject customBlockY(final int customBlockY) { + return FACTORY.createWatchable(OFFSET + 4, customBlockY); } - public static WrappedWatchableObject showCustomBlock(final boolean showCustomBlock) { - return FACTORY.createWatchable(VERSION >= 9 ? 11 : 22, showCustomBlock); + public static @NotNull WrappedWatchableObject showCustomBlock(final boolean showCustomBlock) { + return FACTORY.createWatchable(OFFSET + 5, showCustomBlock); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class MinecartRideable extends Minecart {} + public static class Minecart extends AbstractMinecart {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class MinecartContainer extends Minecart {} + public static class AbstractMinecartContainer extends AbstractMinecart {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class MinecartHopper extends Minecart {} + public static class MinecartHopper extends AbstractMinecartContainer {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class MinecartChest extends Minecart {} + public static class MinecartChest extends AbstractMinecartContainer {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class MinecartFurnace extends Minecart { + public static class MinecartFurnace extends AbstractMinecart { - public static WrappedWatchableObject powered(final boolean powered) { - return FACTORY.createWatchable(VERSION >= 9 ? 12 : 16, powered); + private static final int OFFSET = AbstractMinecart.MAX_INDEX + 1; + private static final int MAX_INDEX = OFFSET; + + public static @NotNull WrappedWatchableObject powered(final boolean powered) { + return FACTORY.createWatchable(MAX_INDEX, powered); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class MinecartTnt extends Minecart {} + public static class MinecartTnt extends AbstractMinecart {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class MinecartSpawner extends Minecart {} + public static class MinecartSpawner extends AbstractMinecart {} @NoArgsConstructor(access = AccessLevel.PRIVATE) - public static class MinecartCommandBlock extends Minecart { + public static class MinecartCommandBlock extends AbstractMinecart { + + private static final int OFFSET = AbstractMinecart.MAX_INDEX + 1; + private static final int MAX_INDEX = OFFSET + 1; + + public static @NotNull WrappedWatchableObject command(final @NonNull String command) { + requireAtLeast(9); - public static WrappedWatchableObject command(final String command) { - if (VERSION >= 9) return FACTORY.createWatchable(12, command); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + return FACTORY.createWatchable(OFFSET, command); } - public static WrappedWatchableObject lastOutput(final WrappedChatComponent lastOutput) { - if (VERSION >= 9) return FACTORY.createWatchable(13, lastOutput); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject lastOutput(final @NonNull WrappedChatComponent lastOutput) { + requireAtLeast(9); + + return FACTORY.createWatchable(MAX_INDEX, lastOutput); } } @NoArgsConstructor(access = AccessLevel.PRIVATE) public static class TNTPrimed extends Entity { - public static WrappedWatchableObject fuseTime(final int fuseTime) { - if (VERSION >= 9) return FACTORY.createWatchable(6, fuseTime); - throw new UnsupportedOperationException("Versions prior to 1.9 don't support this metadata"); + public static @NotNull WrappedWatchableObject fuseTime(final int fuseTime) { + requireAtLeast(9); + + return FACTORY.createWatchable(VERSION >= 15 ? 7 : VERSION >= 10 ? 6 : 5, fuseTime); + } + } + + @SuppressWarnings("deprecation") + private static byte woolId(final @NotNull DyeColor color) { + return color.getWoolData(); + } + + @SuppressWarnings("deprecation") + @Contract("null -> null") + private static @Nullable OfflinePlayer offlinePlayerByName(final @Nullable String name) { + return name == null ? null : Bukkit.getOfflinePlayer(name); + } + + @Contract("null -> null") + private static @Nullable UUID uuidByName(final @Nullable String name) { + final OfflinePlayer player; + return (player = offlinePlayerByName(name)) == null ? null : player.getUniqueId(); + } + + @UtilityClass + private static final @NonNull class EmptyChatComponent { + private final @NotNull WrappedChatComponent INSTANCE = WrappedChatComponent.fromJson("{\"text\":\"\"}"); + } + + @FunctionalInterface + private interface ByteValue { + byte UNSUPPORTED = -1; + + byte value(); + + default byte checkedValue() { + final byte value; + if ((value = value()) == UNSUPPORTED) throw new UnsupportedOperationException( + "Value " + this + " is not supported on version 1." + VERSION + ); + + return value; + } + } + + @FunctionalInterface + private interface IntValue { + int UNSUPPORTED = -1; + + int value(); + + default int checkedValue() { + final int value; + if ((value = value()) == UNSUPPORTED) throw new UnsupportedOperationException( + "Value " + this + " is not supported on version 1." + VERSION + ); + + return value; + } + } + + @FunctionalInterface + private interface StringValue { + String UNSUPPORTED = null; + + @Nullable String value(); + + default @NotNull String checkedValue() { + final String value; + if ((value = value()) == null /* == UNSUPPORTED */) throw new UnsupportedOperationException( + "Value " + this + " is not supported on version 1." + VERSION + ); + + return value; + } + } + + @FunctionalInterface + private interface ByteFlag extends ByteValue { + + // No need for explicit null-check as the interface is private + static byte allChecked(final @NotNull ByteFlag @NotNull ... flags) { + byte value = 0; + for (val flag : flags) value |= flag.value(); + + return value; } } } From e94443d6fd253b6be779ce8b995ad5777481eab8 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Sun, 6 Jun 2021 19:35:40 +0300 Subject: [PATCH 472/508] docs: fix issues in javadocs of DefaultMapImage and MetadataGenerator --- .../minecraft/commons/mapimage/DefaultMapImage.java | 1 + .../minecraft/commons/nms/metadata/MetadataGenerator.java | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java index 4fd745f25..dce968d83 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/mapimage/DefaultMapImage.java @@ -92,6 +92,7 @@ public byte[] getMapData(final int leastX, final int leastY, final int width, fi * * @param image from which to create the map image * @param resize whether the image should be resized or cut to fit map image dimensions + * @param displayMode display mode of the image * @return created map image */ public static MapImage from(final @NonNull BufferedImage image, final boolean resize, diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java index 888636fd6..cfb1df83e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/metadata/MetadataGenerator.java @@ -21,7 +21,8 @@ *

Editor for Metadata of {@link WrappedWatchableObject} providing classes * containing static methods for developer-friendly object creation.

* - *

Version specifications:

*/ @UtilityClass @SuppressWarnings({ From 1add6fa24886d040b5c8e0f43ad00e81d35867cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 07:22:14 +0000 Subject: [PATCH 473/508] build(deps-dev): bump version.mockito from 3.11.0 to 3.11.1 Bumps `version.mockito` from 3.11.0 to 3.11.1. Updates `mockito-core` from 3.11.0 to 3.11.1 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.11.0...v3.11.1) Updates `mockito-junit-jupiter` from 3.11.0 to 3.11.1 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.11.0...v3.11.1) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b2cfaf5bb..3faabd29c 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.7.2 1.7.2 - 3.11.0 + 3.11.1 From f2b24c7ca5001eb5f7cfff3031465c297ae534d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jun 2021 07:23:17 +0000 Subject: [PATCH 474/508] build(deps): bump commons-io from 2.9.0 to 2.10.0 Bumps commons-io from 2.9.0 to 2.10.0. --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b2cfaf5bb..648f0459f 100644 --- a/pom.xml +++ b/pom.xml @@ -216,7 +216,7 @@ commons-io commons-io - 2.9.0 + 2.10.0 it.unimi.dsi From f5f40b2f98152497aed0f80d26aa7f4134445a67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Jun 2021 18:04:33 +0000 Subject: [PATCH 475/508] build(deps-dev): bump version.mockito from 3.11.1 to 3.11.2 Bumps `version.mockito` from 3.11.1 to 3.11.2. Updates `mockito-core` from 3.11.1 to 3.11.2 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.11.1...v3.11.2) Updates `mockito-junit-jupiter` from 3.11.1 to 3.11.2 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.11.1...v3.11.2) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d52032ad5..148918c27 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.7.2 1.7.2 - 3.11.1 + 3.11.2 From aae5d34de48aaf18b883acfb1e5ea40abac81d39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Jul 2021 18:07:16 +0000 Subject: [PATCH 476/508] build(deps): bump ProtocolLib from 4.6.0 to 4.7.0 Bumps [ProtocolLib](https://github.com/dmulloy2/ProtocolLib) from 4.6.0 to 4.7.0. - [Release notes](https://github.com/dmulloy2/ProtocolLib/releases) - [Commits](https://github.com/dmulloy2/ProtocolLib/compare/4.6.0...4.7.0) --- updated-dependencies: - dependency-name: com.comphenix.protocol:ProtocolLib dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 148918c27..615a53edd 100644 --- a/pom.xml +++ b/pom.xml @@ -200,7 +200,7 @@ com.comphenix.protocol ProtocolLib - 4.6.0 + 4.7.0 provided From ffeed39e6873fe259f4ec82149b7d755f0ab2750 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Jul 2021 18:04:59 +0000 Subject: [PATCH 477/508] build(deps): bump commons-io from 2.10.0 to 2.11.0 Bumps commons-io from 2.10.0 to 2.11.0. --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 615a53edd..2174e8f8d 100644 --- a/pom.xml +++ b/pom.xml @@ -216,7 +216,7 @@ commons-io commons-io - 2.10.0 + 2.11.0 it.unimi.dsi From de6298e19d59b95e865a71e5c96524a4a32a2d19 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 12 Aug 2021 18:08:47 +0000 Subject: [PATCH 478/508] build(deps): bump annotations from 21.0.1 to 22.0.0 Bumps [annotations](https://github.com/JetBrains/java-annotations) from 21.0.1 to 22.0.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/21.0.1...22.0.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- fake-entity-lib/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index 7a7cf424d..69e830189 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -45,7 +45,7 @@ org.jetbrains annotations - 21.0.1 + 22.0.0 com.google.code.findbugs diff --git a/pom.xml b/pom.xml index 2174e8f8d..5f6e1b861 100644 --- a/pom.xml +++ b/pom.xml @@ -240,7 +240,7 @@ org.jetbrains annotations - 21.0.1 + 22.0.0 provided true From 5ce86c3c57c43232c1cdaea3bb422584544fabfa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Aug 2021 18:05:25 +0000 Subject: [PATCH 479/508] build(deps-dev): bump version.mockito from 3.11.2 to 3.12.0 Bumps `version.mockito` from 3.11.2 to 3.12.0. Updates `mockito-core` from 3.11.2 to 3.12.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.11.2...v3.12.0) Updates `mockito-junit-jupiter` from 3.11.2 to 3.12.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.11.2...v3.12.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5f6e1b861..b452415ad 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.7.2 1.7.2 - 3.11.2 + 3.12.0 From 5944c1e77493b3b8c59dcf70c89ad9b3b15dab15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Aug 2021 18:06:20 +0000 Subject: [PATCH 480/508] build(deps-dev): bump version.mockito from 3.12.0 to 3.12.1 Bumps `version.mockito` from 3.12.0 to 3.12.1. Updates `mockito-core` from 3.12.0 to 3.12.1 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.0...v3.12.1) Updates `mockito-junit-jupiter` from 3.12.0 to 3.12.1 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.0...v3.12.1) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b452415ad..259c237d4 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.7.2 1.7.2 - 3.12.0 + 3.12.1 From c246b72e1fc8fed6c982fa9de3f59d8926684a21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Aug 2021 18:04:36 +0000 Subject: [PATCH 481/508] build(deps-dev): bump version.mockito from 3.12.1 to 3.12.2 Bumps `version.mockito` from 3.12.1 to 3.12.2. Updates `mockito-core` from 3.12.1 to 3.12.2 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.1...v3.12.2) Updates `mockito-junit-jupiter` from 3.12.1 to 3.12.2 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.1...v3.12.2) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 259c237d4..734019c66 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.7.2 1.7.2 - 3.12.1 + 3.12.2 From b9bdb1abf663af1a1253fcf8e76f605b7c96006e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Aug 2021 18:05:11 +0000 Subject: [PATCH 482/508] build(deps-dev): bump version.mockito from 3.12.2 to 3.12.3 Bumps `version.mockito` from 3.12.2 to 3.12.3. Updates `mockito-core` from 3.12.2 to 3.12.3 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.2...v3.12.3) Updates `mockito-junit-jupiter` from 3.12.2 to 3.12.3 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.2...v3.12.3) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 734019c66..058375254 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.7.2 1.7.2 - 3.12.2 + 3.12.3 From fdf68933c0c9f29ad556d0b5d075400fcfb5c0d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Aug 2021 18:05:40 +0000 Subject: [PATCH 483/508] build(deps-dev): bump version.mockito from 3.12.3 to 3.12.4 Bumps `version.mockito` from 3.12.3 to 3.12.4. Updates `mockito-core` from 3.12.3 to 3.12.4 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.3...v3.12.4) Updates `mockito-junit-jupiter` from 3.12.3 to 3.12.4 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.3...v3.12.4) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 058375254..7b5ee261f 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.7.2 1.7.2 - 3.12.3 + 3.12.4 From 1e9931940413362918ce3782e702e4a09efde3d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Sep 2021 18:06:13 +0000 Subject: [PATCH 484/508] build(deps): bump maven-javadoc-plugin from 3.3.0 to 3.3.1 Bumps [maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.3.0 to 3.3.1. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.3.0...maven-javadoc-plugin-3.3.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7b5ee261f..9da3af295 100644 --- a/pom.xml +++ b/pom.xml @@ -106,7 +106,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.3.0 + 3.3.1 From a0fed1ff6b1d15e3ba1ff5b93411201dc393a592 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Sep 2021 18:07:10 +0000 Subject: [PATCH 485/508] build(deps-dev): bump version.junit.platform from 1.7.2 to 1.8.0 Bumps `version.junit.platform` from 1.7.2 to 1.8.0. Updates `junit-platform-launcher` from 1.7.2 to 1.8.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.7.2 to 1.8.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.junit.platform:junit-platform-runner dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9da3af295..0f38d5587 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0.0-SNAPSHOT 1.0.0-SNAPSHOT 5.7.2 - 1.7.2 + 1.8.0 3.12.4 From 4a0e03b4933e8fff9de33c2215d2d47648badf08 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Sep 2021 18:09:36 +0000 Subject: [PATCH 486/508] build(deps-dev): bump version.junit from 5.7.2 to 5.8.0 Bumps `version.junit` from 5.7.2 to 5.8.0. Updates `junit-jupiter-api` from 5.7.2 to 5.8.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.7.2...r5.8.0) Updates `junit-jupiter-engine` from 5.7.2 to 5.8.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.7.2...r5.8.0) Updates `junit-jupiter-params` from 5.7.2 to 5.8.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.7.2...r5.8.0) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.junit.jupiter:junit-jupiter-params dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0f38d5587..29111fb42 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.0.0-SNAPSHOT 1.0.0-SNAPSHOT - 5.7.2 + 5.8.0 1.8.0 3.12.4 From 2e0dd4aa65e059246ccf92f5dd39b575f1caec74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Sep 2021 18:04:32 +0000 Subject: [PATCH 487/508] build(deps): bump fastutil from 8.5.4 to 8.5.6 Bumps [fastutil](https://github.com/vigna/fastutil) from 8.5.4 to 8.5.6. - [Release notes](https://github.com/vigna/fastutil/releases) - [Changelog](https://github.com/vigna/fastutil/blob/master/CHANGES) - [Commits](https://github.com/vigna/fastutil/compare/8.5.4...8.5.6) --- updated-dependencies: - dependency-name: it.unimi.dsi:fastutil dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 29111fb42..a5e462310 100644 --- a/pom.xml +++ b/pom.xml @@ -221,7 +221,7 @@ it.unimi.dsi fastutil - 8.5.4 + 8.5.6 org.apache.httpcomponents From 4e023dd4da38b44d2031efaac4ca44c47b527059 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Sep 2021 18:04:34 +0000 Subject: [PATCH 488/508] build(deps-dev): bump version.junit from 5.8.0 to 5.8.1 Bumps `version.junit` from 5.8.0 to 5.8.1. Updates `junit-jupiter-api` from 5.8.0 to 5.8.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.8.0...r5.8.1) Updates `junit-jupiter-engine` from 5.8.0 to 5.8.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.8.0...r5.8.1) Updates `junit-jupiter-params` from 5.8.0 to 5.8.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.8.0...r5.8.1) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.junit.jupiter:junit-jupiter-params dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a5e462310..29df6f138 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.0.0-SNAPSHOT 1.0.0-SNAPSHOT - 5.8.0 + 5.8.1 1.8.0 3.12.4 From b4989ee8790281ab155d2270269a2e596f33a325 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Sep 2021 18:07:21 +0000 Subject: [PATCH 489/508] build(deps-dev): bump version.junit.platform from 1.8.0 to 1.8.1 Bumps `version.junit.platform` from 1.8.0 to 1.8.1. Updates `junit-platform-launcher` from 1.8.0 to 1.8.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.8.0 to 1.8.1 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.junit.platform:junit-platform-runner dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 29df6f138..eb7f60016 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0.0-SNAPSHOT 1.0.0-SNAPSHOT 5.8.1 - 1.8.0 + 1.8.1 3.12.4 From 13244f1baaa7cedfa678b7c4f5d99d02b6da6cf9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 18:06:06 +0000 Subject: [PATCH 490/508] build(deps): bump lombok from 1.18.20 to 1.18.22 Bumps [lombok](https://github.com/projectlombok/lombok) from 1.18.20 to 1.18.22. - [Release notes](https://github.com/projectlombok/lombok/releases) - [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/projectlombok/lombok/compare/v1.18.20...v1.18.22) --- updated-dependencies: - dependency-name: org.projectlombok:lombok dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eb7f60016..ebe4b96b5 100644 --- a/pom.xml +++ b/pom.xml @@ -233,7 +233,7 @@ org.projectlombok lombok - 1.18.20 + 1.18.22 provided true From b8d28d24d117ea5c24a7b4e9e2de0931aa9ed27c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Oct 2021 18:06:30 +0000 Subject: [PATCH 491/508] build(deps-dev): bump version.mockito from 3.12.4 to 4.0.0 Bumps `version.mockito` from 3.12.4 to 4.0.0. Updates `mockito-core` from 3.12.4 to 4.0.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.4...v4.0.0) Updates `mockito-junit-jupiter` from 3.12.4 to 4.0.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v3.12.4...v4.0.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-major - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eb7f60016..f6ed7ff0e 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.8.1 1.8.1 - 3.12.4 + 4.0.0 From fe8ff3d40f7a5bb0f7b8e9135997e39fe2fc34a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Oct 2021 18:05:55 +0000 Subject: [PATCH 492/508] build(deps): bump actions/checkout from 2.3.4 to 2.3.5 Bumps [actions/checkout](https://github.com/actions/checkout) from 2.3.4 to 2.3.5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2.3.4...v2.3.5) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index d55eacf8b..6fa078101 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.3.4 + - uses: actions/checkout@v2.3.5 - name: Set up JDK 8 uses: actions/setup-java@v2 diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 2eb6991e9..9c24b9c73 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.3.4 + - uses: actions/checkout@v2.3.5 - name: Set up JDK 8 uses: actions/setup-java@v2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5f7623653..598e0f183 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.3.4 + - uses: actions/checkout@v2.3.5 - name: Set up JDK 8 uses: actions/setup-java@v2 From b028d9d6a3c55e9c2add53067931603917378ca6 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Sun, 17 Oct 2021 00:25:10 +0300 Subject: [PATCH 493/508] fix: correctly calculate entity IDs on Minecraft 1.17 --- .../minecraft/commons/nms/NmsUtil.java | 241 ++++++++++-------- 1 file changed, 138 insertions(+), 103 deletions(-) diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java index cdc130d46..b665dde9e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java @@ -3,72 +3,128 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher; import lombok.*; import lombok.experimental.UtilityClass; +import lombok.extern.java.Log; import org.bukkit.Bukkit; import org.jetbrains.annotations.NotNull; import ru.progrm_jarvis.javacommons.invoke.InvokeUtil; import ru.progrm_jarvis.minecraft.commons.nms.metadata.DataWatcherFactory; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.DataWatcherFactory.DataWatcherModifier; import ru.progrm_jarvis.minecraft.commons.nms.metadata.LegacyDataWatcherFactory; import ru.progrm_jarvis.minecraft.commons.nms.metadata.StandardDataWatcherFactory; import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.concurrent.atomic.AtomicInteger; +import static java.lang.invoke.MethodHandles.insertArguments; +import static java.lang.invoke.MethodType.methodType; + /** * Utility for NMS-related features */ +@Log @UtilityClass public class NmsUtil { - private final NmsVersion NMS_VERSION = NmsVersion.computeCurrent(); + private static final MethodHandles.@NotNull Lookup LOOKUP = MethodHandles.lookup(); + + private final @NotNull NmsVersion CRAFT_BUKKIT_VERSION = NmsVersion.computeCurrent(); + /** * Base package of NMS (net.minecraft.server.{version}) + * + * @deprecated since Spigot 1.17, official Mojang Mappings are used */ - private final String NMS_PACKAGE = "net.minecraft.server." + NMS_VERSION.getName(), - /** - * Base package of CraftBukkit (org.bukkit.craftbukkit.{version}) - */ - CRAFT_BUKKIT_PACKAGE = "org.bukkit.craftbukkit." + NMS_VERSION.getName(); + @Deprecated + private final @NotNull String NMS_PACKAGE = "net.minecraft.server." + CRAFT_BUKKIT_VERSION.getName(); /** - * Field {@code {nms}.Entity.entityCount} responsible for entity ID generation. - * - * @apiNote this field should never be used directly, it is only intended for initialization - * of inner specific implementations of {@link EntityIdGenerator}. + * Base package of CraftBukkit (org.bukkit.craftbukkit.{version}) */ - private final @NotNull Field ENTITY_COUNT_FIELD; + private final @NotNull String CRAFT_BUKKIT_PACKAGE = "org.bukkit.craftbukkit." + CRAFT_BUKKIT_VERSION.getName(); - private final @NotNull EntityIdGenerator ENTITY_ID_GENERATOR; + private final @NotNull MethodHandle NEXT_ENTITY_ID; static { + Class minecraftVersionClass; + try { + minecraftVersionClass = Class.forName("net.minecraft.MinecraftVersion"); + } catch (final ClassNotFoundException e) { + minecraftVersionClass = null; + log.info("Current Minecraft Server version used legacy NMS structure"); + } + + val legacyMappings = minecraftVersionClass == null; + log.info(() -> "Using " + (legacyMappings ? "legacy" : "official") + " Minecraft Server mapping"); + final Class nmsEntityClass; { - val nmsEntityClassName = getNmsPackage() + ".Entity"; + val nmsEntityClassName = (legacyMappings ? getNmsPackage() : "net.minecraft.world.entity") + ".Entity"; try { nmsEntityClass = Class.forName(nmsEntityClassName); } catch (final ClassNotFoundException e) { throw new InternalError("Cannot find entity class by name \"" + nmsEntityClassName + '"', e); } } - try { - ENTITY_COUNT_FIELD = nmsEntityClass.getDeclaredField("entityCount"); - } catch (NoSuchFieldException e) { - throw new InternalError("Cannot find field " + nmsEntityClass.getCanonicalName() + "#entityCount", e); - } - final Class entityCountFieldType; - if (AtomicInteger.class.isAssignableFrom(entityCountFieldType - = ENTITY_COUNT_FIELD.getType())) ENTITY_ID_GENERATOR = AtomicIntegerEntityIdGenerator.INSTANCE; - else if (entityCountFieldType == int.class) ENTITY_ID_GENERATOR = IntEntityIdGenerator.INSTANCE; - else throw new InternalError( - "Field " + ENTITY_COUNT_FIELD + " of class " + nmsEntityClass + " has an unknown type" - ); + entityIdImplementation: { + // Paper has a method for generating entity ID + paperApi: { + @SuppressWarnings("deprecation") val unsafe = Bukkit.getUnsafe(); + val unsafeValuesClass = unsafe.getClass(); + val nextEntityIdMethodType = methodType(int.class); + final MethodHandle nextEntityIdMethodHandle; + try { + nextEntityIdMethodHandle = LOOKUP + .findVirtual(unsafeValuesClass, "nextEntityId", nextEntityIdMethodType); + } catch (final NoSuchMethodException | IllegalAccessException e) { + // required Paper API is not available + break paperApi; + } + + NEXT_ENTITY_ID = insertArguments(nextEntityIdMethodHandle, 0, unsafe); + + break entityIdImplementation; + } + + if (!legacyMappings) { + for (val field : nmsEntityClass.getDeclaredFields()) { // trust field order + val modifiers = field.getModifiers(); + if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) + && AtomicInteger.class.isAssignableFrom(field.getType())) { + NEXT_ENTITY_ID = createAtomicIntegerNextEntityId(field); + + break entityIdImplementation; + } + } + + throw new InternalError("Cannot find entity count field in " + nmsEntityClass); + } + + final Field entityCountField; + try { + entityCountField = nmsEntityClass.getDeclaredField("entityCount"); + } catch (NoSuchFieldException e) { + throw new InternalError("Cannot find field " + nmsEntityClass.getCanonicalName() + "#entityCount", e); + } + + final Class entityCountFieldType; + if (AtomicInteger.class.isAssignableFrom(entityCountFieldType = entityCountField.getType())) NEXT_ENTITY_ID + = createAtomicIntegerNextEntityId(entityCountField); + else if (entityCountFieldType == int.class) NEXT_ENTITY_ID = createIntNextEntityId(entityCountField); + else throw new InternalError( + "Field `nmsEntityClass#" + entityCountField + + "` is of unsupported type `" + entityCountFieldType + '`' + ); + } } /** * DataWatcher factory valid for current server version */ - private final DataWatcherFactory DATA_WATCHER_FACTORY = NMS_VERSION.getGeneration() < 9 + private final DataWatcherFactory DATA_WATCHER_FACTORY = CRAFT_BUKKIT_VERSION.getGeneration() < 9 ? LegacyDataWatcherFactory.create() : StandardDataWatcherFactory.create(); /** @@ -76,16 +132,19 @@ else throw new InternalError( * * @return version of this server */ - public NmsVersion getVersion() { - return NMS_VERSION; + public @NotNull NmsVersion getVersion() { + return CRAFT_BUKKIT_VERSION; } /** * Gets base package of NMS (net.minecraft.server.{version}) * * @return base package of NMS + * + * @deprecated since Spigot 1.17, official Mojang Mappings are used */ - public String getNmsPackage() { + @Deprecated // this is no longer required for Minecraft 1.17 + public @NotNull String getNmsPackage() { return NMS_PACKAGE; } @@ -94,7 +153,7 @@ public String getNmsPackage() { * * @return base package of CraftBukkit */ - public String getCraftBukkitPackage() { + public @NotNull String getCraftBukkitPackage() { return CRAFT_BUKKIT_PACKAGE; } @@ -103,7 +162,7 @@ public String getCraftBukkitPackage() { * * @return DataWatcher factory valid for current server version */ - public static DataWatcherFactory getDataWatcherFactory() { + public static @NotNull DataWatcherFactory getDataWatcherFactory() { return DATA_WATCHER_FACTORY; } @@ -112,7 +171,7 @@ public static DataWatcherFactory getDataWatcherFactory() { * * @return DataWatcher modifier valid for current server version */ - public DataWatcherFactory.DataWatcherModifier dataWatcherModifier() { + public @NotNull DataWatcherModifier dataWatcherModifier() { return DATA_WATCHER_FACTORY.modifier(); } @@ -122,7 +181,7 @@ public DataWatcherFactory.DataWatcherModifier dataWatcherModifier() { * @param dataWatcher DataWatcher from which to create DataWatcher modifier * @return DataWatcher modifier valid for current server version */ - public DataWatcherFactory.DataWatcherModifier dataWatcherModifier(final @NonNull WrappedDataWatcher dataWatcher) { + public @NotNull DataWatcherModifier dataWatcherModifier(final @NonNull WrappedDataWatcher dataWatcher) { return DATA_WATCHER_FACTORY.modifier(dataWatcher); } @@ -131,9 +190,53 @@ public DataWatcherFactory.DataWatcherModifier dataWatcherModifier(final @NonNull * * @return new ID for an entity */ - @SneakyThrows + @SneakyThrows // `MethodHandles#invokeExact()` public int nextEntityId() { - return ENTITY_ID_GENERATOR.nextId(); + return (int) NEXT_ENTITY_ID.invokeExact(); + } + + @SneakyThrows // MethodHandle#invokeExact(..) + private static @NotNull MethodHandle createAtomicIntegerNextEntityId(final @NotNull Field atomicIntegerField) { + val type = methodType(int.class); + final MethodHandle methodHandle; + try { + methodHandle = LOOKUP.findVirtual(AtomicInteger.class, "incrementAndGet", type); + } catch (final NoSuchMethodException | IllegalAccessException e) { + throw new AssertionError("Failed to find `AtomicInteger#incrementAndGet()` method", e); + } + + return insertArguments( + methodHandle, 0, (AtomicInteger) InvokeUtil.toGetterMethodHandle(atomicIntegerField).invokeExact() + ); + } + + @SneakyThrows // MethodHandle#invokeExact(..) + private static @NotNull MethodHandle createIntNextEntityId(final @NotNull Field intField) { + val type = methodType(int.class, MethodHandle.class, MethodHandle.class); + final MethodHandle methodHandle; + try { + methodHandle = LOOKUP.findStatic(NmsUtil.class, "getAndIncrementInt", type); + } catch (final NoSuchMethodException | IllegalAccessException e) { + throw new AssertionError("Failed to find `AtomicInteger#incrementAndGet()` method", e); + } + + return insertArguments( + methodHandle, 0, + InvokeUtil.toGetterMethodHandle(intField), + InvokeUtil.toSetterMethodHandle(intField) + ); + } + + @SneakyThrows // `MethodHandle#invokeExact(..)` + private static int getAndIncrementInt(final @NotNull MethodHandle getter, final @NotNull MethodHandle setter) { + if (!Bukkit.isPrimaryThread()) throw new IllegalStateException( + "Entity IDs should only be generated on main Bukkit thread" + ); + + val id = (int) getter.invokeExact(); + setter.invokeExact(id + 1); + + return id; } /** @@ -174,72 +277,4 @@ public static NmsVersion computeCurrent() { return new NmsVersion(craftServerPackage.substring(craftServerPackage.lastIndexOf('.') + 1)); } } - - @FunctionalInterface - private interface EntityIdGenerator { - int nextId(); - } - - /** - * Implementation of {@link EntityIdGenerator} based on {@code int} {@link #ENTITY_COUNT_FIELD}. - * - * @implNote this implementation does allow ID generation - * only from {@link Bukkit#isPrimaryThread() Bukkit's primary thread}. - */ - private final class IntEntityIdGenerator implements EntityIdGenerator { - - private static final @NotNull EntityIdGenerator INSTANCE = new AtomicIntegerEntityIdGenerator(); - - /** - * Getter method-handle of {@link #ENTITY_COUNT_FIELD}. - */ - private static final @NotNull MethodHandle ENTITY_COUNT_FIELD__GETTER; - - /** - * Getter method-handle of {@link #ENTITY_COUNT_FIELD}. - */ - private static final @NotNull MethodHandle ENTITY_COUNT_FIELD__SETTER; - - static { - ENTITY_COUNT_FIELD__GETTER = InvokeUtil.toGetterMethodHandle(ENTITY_COUNT_FIELD); - ENTITY_COUNT_FIELD__SETTER = InvokeUtil.toSetterMethodHandle(ENTITY_COUNT_FIELD); - } - - @Override - @SneakyThrows // MethodHandles invocation - public int nextId() { - if (!Bukkit.isPrimaryThread()) throw new IllegalStateException( - "Entity IDs should only be generated on main Bukkit thread" - ); - - val id = (int) ENTITY_COUNT_FIELD__GETTER.invokeExact(); - ENTITY_COUNT_FIELD__SETTER.invokeExact(id + 1); - - return id; - } - } - - /** - * Implementation of {@link EntityIdGenerator} based on {@link AtomicInteger} {@link #ENTITY_COUNT_FIELD}. - */ - private final class AtomicIntegerEntityIdGenerator implements EntityIdGenerator { - - private static final @NotNull EntityIdGenerator INSTANCE = new AtomicIntegerEntityIdGenerator(); - - private static final @NotNull AtomicInteger VALUE; - - static { - final MethodHandle getter = InvokeUtil.toGetterMethodHandle(ENTITY_COUNT_FIELD); - try { - VALUE = (AtomicInteger) getter.invokeExact(); - } catch (final Throwable x) { - throw new InternalError("Could not get the value of field " + ENTITY_COUNT_FIELD); - } - } - - @Override - public int nextId() { - return VALUE.incrementAndGet(); - } - } } From ac75cc0d63bb5a8bbf80a0222533df67463773c7 Mon Sep 17 00:00:00 2001 From: Petr Portnov Date: Sun, 17 Oct 2021 00:25:10 +0300 Subject: [PATCH 494/508] fix(fake-entity-lib): correctly calculate height of `ArmorStandBlockItem` --- .../entity/ArmorStandBlockItem.java | 2 +- .../minecraft/commons/nms/NmsUtil.java | 241 ++++++++++-------- 2 files changed, 139 insertions(+), 104 deletions(-) diff --git a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java index 98ed364a8..099fac61d 100644 --- a/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java +++ b/fake-entity-lib/src/main/java/ru/progrm_jarvis/minecraft/fakeentitylib/entity/ArmorStandBlockItem.java @@ -40,7 +40,7 @@ public class ArmorStandBlockItem extends SimpleLivingFakeEntity { protected static final double PIXEL_SIZE = 0x1p-4, HALF_PIXEL_SIZE = 0x1p-5, ARMOR_STAND_BODY_HEIGHT = (16 + 8) * PIXEL_SIZE, - ARMOR_STAND_HEAD_ROOT_OFFSET = ARMOR_STAND_BODY_HEIGHT - HALF_PIXEL_SIZE, + ARMOR_STAND_HEAD_ROOT_OFFSET = ARMOR_STAND_BODY_HEIGHT - PIXEL_SIZE - HALF_PIXEL_SIZE, ITEM_CENTER_Y_OFFSET = 3 * PIXEL_SIZE + HALF_PIXEL_SIZE; // offset of the item center from the rotation center diff --git a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java index cdc130d46..b665dde9e 100644 --- a/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java +++ b/minecraft-commons/src/main/java/ru/progrm_jarvis/minecraft/commons/nms/NmsUtil.java @@ -3,72 +3,128 @@ import com.comphenix.protocol.wrappers.WrappedDataWatcher; import lombok.*; import lombok.experimental.UtilityClass; +import lombok.extern.java.Log; import org.bukkit.Bukkit; import org.jetbrains.annotations.NotNull; import ru.progrm_jarvis.javacommons.invoke.InvokeUtil; import ru.progrm_jarvis.minecraft.commons.nms.metadata.DataWatcherFactory; +import ru.progrm_jarvis.minecraft.commons.nms.metadata.DataWatcherFactory.DataWatcherModifier; import ru.progrm_jarvis.minecraft.commons.nms.metadata.LegacyDataWatcherFactory; import ru.progrm_jarvis.minecraft.commons.nms.metadata.StandardDataWatcherFactory; import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.concurrent.atomic.AtomicInteger; +import static java.lang.invoke.MethodHandles.insertArguments; +import static java.lang.invoke.MethodType.methodType; + /** * Utility for NMS-related features */ +@Log @UtilityClass public class NmsUtil { - private final NmsVersion NMS_VERSION = NmsVersion.computeCurrent(); + private static final MethodHandles.@NotNull Lookup LOOKUP = MethodHandles.lookup(); + + private final @NotNull NmsVersion CRAFT_BUKKIT_VERSION = NmsVersion.computeCurrent(); + /** * Base package of NMS (net.minecraft.server.{version}) + * + * @deprecated since Spigot 1.17, official Mojang Mappings are used */ - private final String NMS_PACKAGE = "net.minecraft.server." + NMS_VERSION.getName(), - /** - * Base package of CraftBukkit (org.bukkit.craftbukkit.{version}) - */ - CRAFT_BUKKIT_PACKAGE = "org.bukkit.craftbukkit." + NMS_VERSION.getName(); + @Deprecated + private final @NotNull String NMS_PACKAGE = "net.minecraft.server." + CRAFT_BUKKIT_VERSION.getName(); /** - * Field {@code {nms}.Entity.entityCount} responsible for entity ID generation. - * - * @apiNote this field should never be used directly, it is only intended for initialization - * of inner specific implementations of {@link EntityIdGenerator}. + * Base package of CraftBukkit (org.bukkit.craftbukkit.{version}) */ - private final @NotNull Field ENTITY_COUNT_FIELD; + private final @NotNull String CRAFT_BUKKIT_PACKAGE = "org.bukkit.craftbukkit." + CRAFT_BUKKIT_VERSION.getName(); - private final @NotNull EntityIdGenerator ENTITY_ID_GENERATOR; + private final @NotNull MethodHandle NEXT_ENTITY_ID; static { + Class minecraftVersionClass; + try { + minecraftVersionClass = Class.forName("net.minecraft.MinecraftVersion"); + } catch (final ClassNotFoundException e) { + minecraftVersionClass = null; + log.info("Current Minecraft Server version used legacy NMS structure"); + } + + val legacyMappings = minecraftVersionClass == null; + log.info(() -> "Using " + (legacyMappings ? "legacy" : "official") + " Minecraft Server mapping"); + final Class nmsEntityClass; { - val nmsEntityClassName = getNmsPackage() + ".Entity"; + val nmsEntityClassName = (legacyMappings ? getNmsPackage() : "net.minecraft.world.entity") + ".Entity"; try { nmsEntityClass = Class.forName(nmsEntityClassName); } catch (final ClassNotFoundException e) { throw new InternalError("Cannot find entity class by name \"" + nmsEntityClassName + '"', e); } } - try { - ENTITY_COUNT_FIELD = nmsEntityClass.getDeclaredField("entityCount"); - } catch (NoSuchFieldException e) { - throw new InternalError("Cannot find field " + nmsEntityClass.getCanonicalName() + "#entityCount", e); - } - final Class entityCountFieldType; - if (AtomicInteger.class.isAssignableFrom(entityCountFieldType - = ENTITY_COUNT_FIELD.getType())) ENTITY_ID_GENERATOR = AtomicIntegerEntityIdGenerator.INSTANCE; - else if (entityCountFieldType == int.class) ENTITY_ID_GENERATOR = IntEntityIdGenerator.INSTANCE; - else throw new InternalError( - "Field " + ENTITY_COUNT_FIELD + " of class " + nmsEntityClass + " has an unknown type" - ); + entityIdImplementation: { + // Paper has a method for generating entity ID + paperApi: { + @SuppressWarnings("deprecation") val unsafe = Bukkit.getUnsafe(); + val unsafeValuesClass = unsafe.getClass(); + val nextEntityIdMethodType = methodType(int.class); + final MethodHandle nextEntityIdMethodHandle; + try { + nextEntityIdMethodHandle = LOOKUP + .findVirtual(unsafeValuesClass, "nextEntityId", nextEntityIdMethodType); + } catch (final NoSuchMethodException | IllegalAccessException e) { + // required Paper API is not available + break paperApi; + } + + NEXT_ENTITY_ID = insertArguments(nextEntityIdMethodHandle, 0, unsafe); + + break entityIdImplementation; + } + + if (!legacyMappings) { + for (val field : nmsEntityClass.getDeclaredFields()) { // trust field order + val modifiers = field.getModifiers(); + if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) + && AtomicInteger.class.isAssignableFrom(field.getType())) { + NEXT_ENTITY_ID = createAtomicIntegerNextEntityId(field); + + break entityIdImplementation; + } + } + + throw new InternalError("Cannot find entity count field in " + nmsEntityClass); + } + + final Field entityCountField; + try { + entityCountField = nmsEntityClass.getDeclaredField("entityCount"); + } catch (NoSuchFieldException e) { + throw new InternalError("Cannot find field " + nmsEntityClass.getCanonicalName() + "#entityCount", e); + } + + final Class entityCountFieldType; + if (AtomicInteger.class.isAssignableFrom(entityCountFieldType = entityCountField.getType())) NEXT_ENTITY_ID + = createAtomicIntegerNextEntityId(entityCountField); + else if (entityCountFieldType == int.class) NEXT_ENTITY_ID = createIntNextEntityId(entityCountField); + else throw new InternalError( + "Field `nmsEntityClass#" + entityCountField + + "` is of unsupported type `" + entityCountFieldType + '`' + ); + } } /** * DataWatcher factory valid for current server version */ - private final DataWatcherFactory DATA_WATCHER_FACTORY = NMS_VERSION.getGeneration() < 9 + private final DataWatcherFactory DATA_WATCHER_FACTORY = CRAFT_BUKKIT_VERSION.getGeneration() < 9 ? LegacyDataWatcherFactory.create() : StandardDataWatcherFactory.create(); /** @@ -76,16 +132,19 @@ else throw new InternalError( * * @return version of this server */ - public NmsVersion getVersion() { - return NMS_VERSION; + public @NotNull NmsVersion getVersion() { + return CRAFT_BUKKIT_VERSION; } /** * Gets base package of NMS (net.minecraft.server.{version}) * * @return base package of NMS + * + * @deprecated since Spigot 1.17, official Mojang Mappings are used */ - public String getNmsPackage() { + @Deprecated // this is no longer required for Minecraft 1.17 + public @NotNull String getNmsPackage() { return NMS_PACKAGE; } @@ -94,7 +153,7 @@ public String getNmsPackage() { * * @return base package of CraftBukkit */ - public String getCraftBukkitPackage() { + public @NotNull String getCraftBukkitPackage() { return CRAFT_BUKKIT_PACKAGE; } @@ -103,7 +162,7 @@ public String getCraftBukkitPackage() { * * @return DataWatcher factory valid for current server version */ - public static DataWatcherFactory getDataWatcherFactory() { + public static @NotNull DataWatcherFactory getDataWatcherFactory() { return DATA_WATCHER_FACTORY; } @@ -112,7 +171,7 @@ public static DataWatcherFactory getDataWatcherFactory() { * * @return DataWatcher modifier valid for current server version */ - public DataWatcherFactory.DataWatcherModifier dataWatcherModifier() { + public @NotNull DataWatcherModifier dataWatcherModifier() { return DATA_WATCHER_FACTORY.modifier(); } @@ -122,7 +181,7 @@ public DataWatcherFactory.DataWatcherModifier dataWatcherModifier() { * @param dataWatcher DataWatcher from which to create DataWatcher modifier * @return DataWatcher modifier valid for current server version */ - public DataWatcherFactory.DataWatcherModifier dataWatcherModifier(final @NonNull WrappedDataWatcher dataWatcher) { + public @NotNull DataWatcherModifier dataWatcherModifier(final @NonNull WrappedDataWatcher dataWatcher) { return DATA_WATCHER_FACTORY.modifier(dataWatcher); } @@ -131,9 +190,53 @@ public DataWatcherFactory.DataWatcherModifier dataWatcherModifier(final @NonNull * * @return new ID for an entity */ - @SneakyThrows + @SneakyThrows // `MethodHandles#invokeExact()` public int nextEntityId() { - return ENTITY_ID_GENERATOR.nextId(); + return (int) NEXT_ENTITY_ID.invokeExact(); + } + + @SneakyThrows // MethodHandle#invokeExact(..) + private static @NotNull MethodHandle createAtomicIntegerNextEntityId(final @NotNull Field atomicIntegerField) { + val type = methodType(int.class); + final MethodHandle methodHandle; + try { + methodHandle = LOOKUP.findVirtual(AtomicInteger.class, "incrementAndGet", type); + } catch (final NoSuchMethodException | IllegalAccessException e) { + throw new AssertionError("Failed to find `AtomicInteger#incrementAndGet()` method", e); + } + + return insertArguments( + methodHandle, 0, (AtomicInteger) InvokeUtil.toGetterMethodHandle(atomicIntegerField).invokeExact() + ); + } + + @SneakyThrows // MethodHandle#invokeExact(..) + private static @NotNull MethodHandle createIntNextEntityId(final @NotNull Field intField) { + val type = methodType(int.class, MethodHandle.class, MethodHandle.class); + final MethodHandle methodHandle; + try { + methodHandle = LOOKUP.findStatic(NmsUtil.class, "getAndIncrementInt", type); + } catch (final NoSuchMethodException | IllegalAccessException e) { + throw new AssertionError("Failed to find `AtomicInteger#incrementAndGet()` method", e); + } + + return insertArguments( + methodHandle, 0, + InvokeUtil.toGetterMethodHandle(intField), + InvokeUtil.toSetterMethodHandle(intField) + ); + } + + @SneakyThrows // `MethodHandle#invokeExact(..)` + private static int getAndIncrementInt(final @NotNull MethodHandle getter, final @NotNull MethodHandle setter) { + if (!Bukkit.isPrimaryThread()) throw new IllegalStateException( + "Entity IDs should only be generated on main Bukkit thread" + ); + + val id = (int) getter.invokeExact(); + setter.invokeExact(id + 1); + + return id; } /** @@ -174,72 +277,4 @@ public static NmsVersion computeCurrent() { return new NmsVersion(craftServerPackage.substring(craftServerPackage.lastIndexOf('.') + 1)); } } - - @FunctionalInterface - private interface EntityIdGenerator { - int nextId(); - } - - /** - * Implementation of {@link EntityIdGenerator} based on {@code int} {@link #ENTITY_COUNT_FIELD}. - * - * @implNote this implementation does allow ID generation - * only from {@link Bukkit#isPrimaryThread() Bukkit's primary thread}. - */ - private final class IntEntityIdGenerator implements EntityIdGenerator { - - private static final @NotNull EntityIdGenerator INSTANCE = new AtomicIntegerEntityIdGenerator(); - - /** - * Getter method-handle of {@link #ENTITY_COUNT_FIELD}. - */ - private static final @NotNull MethodHandle ENTITY_COUNT_FIELD__GETTER; - - /** - * Getter method-handle of {@link #ENTITY_COUNT_FIELD}. - */ - private static final @NotNull MethodHandle ENTITY_COUNT_FIELD__SETTER; - - static { - ENTITY_COUNT_FIELD__GETTER = InvokeUtil.toGetterMethodHandle(ENTITY_COUNT_FIELD); - ENTITY_COUNT_FIELD__SETTER = InvokeUtil.toSetterMethodHandle(ENTITY_COUNT_FIELD); - } - - @Override - @SneakyThrows // MethodHandles invocation - public int nextId() { - if (!Bukkit.isPrimaryThread()) throw new IllegalStateException( - "Entity IDs should only be generated on main Bukkit thread" - ); - - val id = (int) ENTITY_COUNT_FIELD__GETTER.invokeExact(); - ENTITY_COUNT_FIELD__SETTER.invokeExact(id + 1); - - return id; - } - } - - /** - * Implementation of {@link EntityIdGenerator} based on {@link AtomicInteger} {@link #ENTITY_COUNT_FIELD}. - */ - private final class AtomicIntegerEntityIdGenerator implements EntityIdGenerator { - - private static final @NotNull EntityIdGenerator INSTANCE = new AtomicIntegerEntityIdGenerator(); - - private static final @NotNull AtomicInteger VALUE; - - static { - final MethodHandle getter = InvokeUtil.toGetterMethodHandle(ENTITY_COUNT_FIELD); - try { - VALUE = (AtomicInteger) getter.invokeExact(); - } catch (final Throwable x) { - throw new InternalError("Could not get the value of field " + ENTITY_COUNT_FIELD); - } - } - - @Override - public int nextId() { - return VALUE.incrementAndGet(); - } - } } From 96d9f112091095f2d169d6cee1425debddcdd382 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Nov 2021 18:04:23 +0000 Subject: [PATCH 495/508] build(deps): bump actions/checkout from 2.3.5 to 2.4.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 2.3.5 to 2.4.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2.3.5...v2.4.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 6fa078101..f32131225 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.3.5 + - uses: actions/checkout@v2.4.0 - name: Set up JDK 8 uses: actions/setup-java@v2 diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 9c24b9c73..d91ea9bf0 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.3.5 + - uses: actions/checkout@v2.4.0 - name: Set up JDK 8 uses: actions/setup-java@v2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 598e0f183..f3e6d840e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.3.5 + - uses: actions/checkout@v2.4.0 - name: Set up JDK 8 uses: actions/setup-java@v2 From 362bbe35e5ca754c3f3e019ab8c3b506a882451a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Nov 2021 18:06:47 +0000 Subject: [PATCH 496/508] build(deps): bump annotations from 22.0.0 to 23.0.0 Bumps [annotations](https://github.com/JetBrains/java-annotations) from 22.0.0 to 23.0.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/22.0.0...23.0.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- fake-entity-lib/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fake-entity-lib/pom.xml b/fake-entity-lib/pom.xml index 69e830189..70f09cf08 100644 --- a/fake-entity-lib/pom.xml +++ b/fake-entity-lib/pom.xml @@ -45,7 +45,7 @@ org.jetbrains annotations - 22.0.0 + 23.0.0 com.google.code.findbugs diff --git a/pom.xml b/pom.xml index d003d8be9..c6bfc3f34 100644 --- a/pom.xml +++ b/pom.xml @@ -240,7 +240,7 @@ org.jetbrains annotations - 22.0.0 + 23.0.0 provided true From 20e9f3efe3f1741a7059ab4d295f1202ba263133 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Nov 2021 18:05:33 +0000 Subject: [PATCH 497/508] build(deps-dev): bump version.mockito from 4.0.0 to 4.1.0 Bumps `version.mockito` from 4.0.0 to 4.1.0. Updates `mockito-core` from 4.0.0 to 4.1.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.0.0...v4.1.0) Updates `mockito-junit-jupiter` from 4.0.0 to 4.1.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.0.0...v4.1.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c6bfc3f34..af75f2341 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.8.1 1.8.1 - 4.0.0 + 4.1.0 From d892499b49a23b378db96efe95906e7bdcbf09aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Nov 2021 18:08:22 +0000 Subject: [PATCH 498/508] build(deps): bump actions/cache from 2.1.6 to 2.1.7 Bumps [actions/cache](https://github.com/actions/cache) from 2.1.6 to 2.1.7. - [Release notes](https://github.com/actions/cache/releases) - [Commits](https://github.com/actions/cache/compare/v2.1.6...v2.1.7) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index f32131225..78fb73acc 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -18,7 +18,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index d91ea9bf0..afc61801c 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -19,7 +19,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f3e6d840e..5aba16648 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.6 + uses: actions/cache@v2.1.7 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} From 1007e3d53a403550d1e6cd82e5c2c004cd99f06b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Nov 2021 18:06:28 +0000 Subject: [PATCH 499/508] build(deps-dev): bump version.junit from 5.8.1 to 5.8.2 Bumps `version.junit` from 5.8.1 to 5.8.2. Updates `junit-jupiter-api` from 5.8.1 to 5.8.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.8.1...r5.8.2) Updates `junit-jupiter-engine` from 5.8.1 to 5.8.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.8.1...r5.8.2) Updates `junit-jupiter-params` from 5.8.1 to 5.8.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.8.1...r5.8.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.junit.jupiter:junit-jupiter-params dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index af75f2341..d384ed536 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.0.0-SNAPSHOT 1.0.0-SNAPSHOT - 5.8.1 + 5.8.2 1.8.1 4.1.0 From 5fa7a703d2f025665bda8158fb89cdd104d5e143 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 29 Nov 2021 18:09:57 +0000 Subject: [PATCH 500/508] build(deps-dev): bump version.junit.platform from 1.8.1 to 1.8.2 Bumps `version.junit.platform` from 1.8.1 to 1.8.2. Updates `junit-platform-launcher` from 1.8.1 to 1.8.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.8.1 to 1.8.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.junit.platform:junit-platform-runner dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d384ed536..6e525d1af 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0.0-SNAPSHOT 1.0.0-SNAPSHOT 5.8.2 - 1.8.1 + 1.8.2 4.1.0 From 20aff7ed6cde5b1ce5829f22403c076cc3097e58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Dec 2021 18:06:45 +0000 Subject: [PATCH 501/508] build(deps-dev): bump version.mockito from 4.1.0 to 4.2.0 Bumps `version.mockito` from 4.1.0 to 4.2.0. Updates `mockito-core` from 4.1.0 to 4.2.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.1.0...v4.2.0) Updates `mockito-junit-jupiter` from 4.1.0 to 4.2.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.1.0...v4.2.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6e525d1af..722e53410 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.8.2 1.8.2 - 4.1.0 + 4.2.0 From 5080f83a9b1a412470d90a8c9ef4de590125faf3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Mar 2022 18:05:52 +0000 Subject: [PATCH 502/508] build(deps-dev): bump version.mockito from 4.2.0 to 4.4.0 Bumps `version.mockito` from 4.2.0 to 4.4.0. Updates `mockito-core` from 4.2.0 to 4.4.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.2.0...v4.4.0) Updates `mockito-junit-jupiter` from 4.2.0 to 4.4.0 - [Release notes](https://github.com/mockito/mockito/releases) - [Commits](https://github.com/mockito/mockito/compare/v4.2.0...v4.4.0) --- updated-dependencies: - dependency-name: org.mockito:mockito-core dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.mockito:mockito-junit-jupiter dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 722e53410..8d8867cb3 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.0.0-SNAPSHOT 5.8.2 1.8.2 - 4.2.0 + 4.4.0 From a25515c976c66c389e54068624eafd1f750df66a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 27 Jul 2022 18:11:36 +0000 Subject: [PATCH 503/508] build(deps-dev): bump version.junit.platform from 1.8.2 to 1.9.0 Bumps `version.junit.platform` from 1.8.2 to 1.9.0. Updates `junit-platform-launcher` from 1.8.2 to 1.9.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) Updates `junit-platform-runner` from 1.8.2 to 1.9.0 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: org.junit.platform:junit-platform-runner dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8d8867cb3..8e2b532d1 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.0.0-SNAPSHOT 1.0.0-SNAPSHOT 5.8.2 - 1.8.2 + 1.9.0 4.4.0 From 542c990a61ef4afae38a8c5f8bf37bc52e06f35e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Dec 2022 18:01:06 +0000 Subject: [PATCH 504/508] build(deps): bump actions/cache from 2.1.7 to 3.2.2 Bumps [actions/cache](https://github.com/actions/cache) from 2.1.7 to 3.2.2. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v2.1.7...v3.2.2) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 78fb73acc..2f819644d 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -18,7 +18,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.2.2 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index afc61801c..5d3812aa3 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -19,7 +19,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.2.2 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5aba16648..cc2dff658 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: java-version: '8' - name: Cache Maven local repository - uses: actions/cache@v2.1.7 + uses: actions/cache@v3.2.2 with: path: ~/.m2/repository key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} From f228901cc907bf11bdd777aed46c3e50e65dc979 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 19:47:24 +0000 Subject: [PATCH 505/508] build(deps): bump ProtocolLib from 4.7.0 to 4.8.0 Bumps [ProtocolLib](https://github.com/dmulloy2/ProtocolLib) from 4.7.0 to 4.8.0. - [Release notes](https://github.com/dmulloy2/ProtocolLib/releases) - [Commits](https://github.com/dmulloy2/ProtocolLib/compare/4.7.0...4.8.0) --- updated-dependencies: - dependency-name: com.comphenix.protocol:ProtocolLib dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8e2b532d1..ab007b8fa 100644 --- a/pom.xml +++ b/pom.xml @@ -200,7 +200,7 @@ com.comphenix.protocol ProtocolLib - 4.7.0 + 4.8.0 provided From eaabf8f6ff5750757a19cfc5a28d590fc4bc3ec5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 19:47:26 +0000 Subject: [PATCH 506/508] build(deps): bump actions/setup-java from 2 to 3.5.1 Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2 to 3.5.1. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v2...v3.5.1) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 2f819644d..2ef7c1f88 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v2.4.0 - name: Set up JDK 8 - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: distribution: 'adopt' java-version: '8' diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 5d3812aa3..584d161c2 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v2.4.0 - name: Set up JDK 8 - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: distribution: 'adopt' java-version: '8' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cc2dff658..795f8ff4e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -11,7 +11,7 @@ jobs: - uses: actions/checkout@v2.4.0 - name: Set up JDK 8 - uses: actions/setup-java@v2 + uses: actions/setup-java@v3 with: distribution: 'adopt' java-version: '8' From 6392f29c8f17b526694f62941097e6603c5be897 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 19:47:32 +0000 Subject: [PATCH 507/508] build(deps): bump actions/checkout from 2.4.0 to 3.3.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 2.4.0 to 3.3.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v2.4.0...v3.3.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/deploy-release.yml | 2 +- .github/workflows/deploy-snapshot.yml | 2 +- .github/workflows/test.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index 2f819644d..bb691a3fa 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3.3.0 - name: Set up JDK 8 uses: actions/setup-java@v2 diff --git a/.github/workflows/deploy-snapshot.yml b/.github/workflows/deploy-snapshot.yml index 5d3812aa3..08c2b220c 100644 --- a/.github/workflows/deploy-snapshot.yml +++ b/.github/workflows/deploy-snapshot.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3.3.0 - name: Set up JDK 8 uses: actions/setup-java@v2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cc2dff658..66bf1fdca 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2.4.0 + - uses: actions/checkout@v3.3.0 - name: Set up JDK 8 uses: actions/setup-java@v2 From 67f70ff42019692af47302b6467b11f625ee4cce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 19:47:35 +0000 Subject: [PATCH 508/508] build(deps): bump fastutil from 8.5.6 to 8.5.11 Bumps [fastutil](https://github.com/vigna/fastutil) from 8.5.6 to 8.5.11. - [Release notes](https://github.com/vigna/fastutil/releases) - [Changelog](https://github.com/vigna/fastutil/blob/master/CHANGES) - [Commits](https://github.com/vigna/fastutil/compare/8.5.6...8.5.11) --- updated-dependencies: - dependency-name: it.unimi.dsi:fastutil dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8e2b532d1..6e8551837 100644 --- a/pom.xml +++ b/pom.xml @@ -221,7 +221,7 @@ it.unimi.dsi fastutil - 8.5.6 + 8.5.11 org.apache.httpcomponents