mirror of
https://github.com/dmulloy2/ProtocolLib.git
synced 2024-11-30 14:43:27 +01:00
Merge branch 'master' into gradle-update
This commit is contained in:
commit
65258d5977
@ -27,6 +27,7 @@ import com.comphenix.protocol.reflect.fuzzy.FuzzyMethodContract;
|
||||
import com.comphenix.protocol.utility.MinecraftFields;
|
||||
import com.comphenix.protocol.utility.MinecraftReflection;
|
||||
import com.comphenix.protocol.utility.MinecraftVersion;
|
||||
import com.comphenix.protocol.utility.Util;
|
||||
import com.comphenix.protocol.wrappers.WrappedIntHashMap;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
@ -34,7 +35,6 @@ import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
@ -61,6 +61,7 @@ class EntityUtilities {
|
||||
private FieldAccessor entityTrackerField;
|
||||
private FieldAccessor trackedPlayersField;
|
||||
private FieldAccessor trackedEntitiesField;
|
||||
private FieldAccessor foliaTrackerField;
|
||||
|
||||
private MethodAccessor getEntity;
|
||||
private MethodAccessor getChunkProvider;
|
||||
@ -203,6 +204,25 @@ class EntityUtilities {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private Object getNewEntityTracker(Object worldServer, int entityId) {
|
||||
if (Util.isUsingFolia()) {
|
||||
if (this.getEntity == null) {
|
||||
Method entityGetter = FuzzyReflection.fromObject(worldServer).getMethodByReturnTypeAndParameters(
|
||||
"getEntity",
|
||||
MinecraftReflection.getEntityClass(),
|
||||
int.class);
|
||||
this.getEntity = Accessors.getMethodAccessor(entityGetter);
|
||||
}
|
||||
|
||||
Object entity = this.getEntity.invoke(worldServer, entityId);
|
||||
|
||||
if (this.foliaTrackerField == null) {
|
||||
this.foliaTrackerField = Accessors.getFieldAccessor(FuzzyReflection.fromClass(entity.getClass(), false)
|
||||
.getField(FuzzyFieldContract.newBuilder().typeExact(MinecraftReflection.getEntityTrackerClass()).build()));
|
||||
}
|
||||
|
||||
return this.foliaTrackerField.get(entity);
|
||||
}
|
||||
|
||||
if (this.getChunkProvider == null) {
|
||||
Class<?> chunkProviderClass = MinecraftReflection.getChunkProviderServer();
|
||||
this.getChunkProvider = Accessors.getMethodAccessor(FuzzyReflection.fromClass(worldServer.getClass(), false)
|
||||
|
@ -1,9 +1,9 @@
|
||||
package com.comphenix.protocol.metrics;
|
||||
|
||||
import com.comphenix.protocol.ProtocolLib;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.ServicePriority;
|
||||
import org.json.simple.JSONArray;
|
||||
@ -56,7 +56,7 @@ public class Metrics {
|
||||
private static String serverUUID;
|
||||
|
||||
// The plugin
|
||||
private final Plugin plugin;
|
||||
private final ProtocolLib plugin;
|
||||
|
||||
// A list with all custom charts
|
||||
private final List<CustomChart> charts = new ArrayList<>();
|
||||
@ -66,7 +66,7 @@ public class Metrics {
|
||||
*
|
||||
* @param plugin The plugin which stats should be submitted.
|
||||
*/
|
||||
public Metrics(Plugin plugin) {
|
||||
public Metrics(ProtocolLib plugin) {
|
||||
if (plugin == null) {
|
||||
throw new IllegalArgumentException("Plugin cannot be null!");
|
||||
}
|
||||
@ -151,7 +151,7 @@ public class Metrics {
|
||||
}
|
||||
// Nevertheless we want our code to run in the Bukkit main thread, so we have to use the Bukkit scheduler
|
||||
// Don't be afraid! The connection to the bStats server is still async, only the stats collection is sync ;)
|
||||
Bukkit.getScheduler().runTask(plugin, Metrics.this::submitData);
|
||||
plugin.getScheduler().runTask(Metrics.this::submitData);
|
||||
}
|
||||
}, 1000L * 60 * 5, 1000L * 60 * 30);
|
||||
// Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start
|
||||
|
@ -75,9 +75,31 @@ public class WrappedParticle<T> {
|
||||
|
||||
/**
|
||||
* Gets this Particle's Bukkit/ProtocolLib data. The type of this data depends on the
|
||||
* {@link #getParticle() Particle type}. For Block particles it will be {@link WrappedBlockData},
|
||||
* for Item crack particles, it will be an {@link ItemStack}, and for redstone particles it will
|
||||
* be {@link Particle.DustOptions}
|
||||
* {@link #getParticle() Particle type}. Refer to the table below for the corresponding data types.
|
||||
* <p>
|
||||
* <table border="1">
|
||||
* <caption>Particle Data Types</caption>
|
||||
* <tr>
|
||||
* <td><b>Particle Type</b></td>
|
||||
* <td><b>Particle Data Type</b></td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>Block particles (BLOCK_CRACK, BLOCK_DUST, FALLING_DUST)</td>
|
||||
* <td>{@link WrappedBlockData}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>Item crack particles</td>
|
||||
* <td>{@link ItemStack}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>Redstone particles</td>
|
||||
* <td>{@link Particle.DustOptions}</td>
|
||||
* </tr>
|
||||
* <tr>
|
||||
* <td>Dust color transition particles</td>
|
||||
* <td>{@link Particle.DustTransition}</td>
|
||||
* </tr>
|
||||
* </table>
|
||||
*
|
||||
* @return The particle data
|
||||
*/
|
||||
@ -110,6 +132,9 @@ public class WrappedParticle<T> {
|
||||
case REDSTONE:
|
||||
data = getRedstone(handle);
|
||||
break;
|
||||
case DUST_COLOR_TRANSITION:
|
||||
data = getDustTransition(handle);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -133,7 +158,7 @@ public class WrappedParticle<T> {
|
||||
|
||||
private static Object getRedstone(Object handle) {
|
||||
int r, g, b;
|
||||
float alpha;
|
||||
float size;
|
||||
|
||||
if (MinecraftVersion.FEATURE_PREVIEW_UPDATE.atOrAbove()) {
|
||||
StructureModifier<Object> modifier = new StructureModifier<>(handle.getClass()).withTarget(handle);
|
||||
@ -142,7 +167,7 @@ public class WrappedParticle<T> {
|
||||
r = (int) (rgb.x() * 255);
|
||||
g = (int) (rgb.y() * 255);
|
||||
b = (int) (rgb.z() * 255);
|
||||
alpha = (float) modifier.withType(float.class).read(0);
|
||||
size = (float) modifier.withType(float.class).read(0);
|
||||
} else if (MinecraftVersion.CAVES_CLIFFS_1.atOrAbove()) {
|
||||
if (VECTOR_3FA == null) {
|
||||
VECTOR_3FA = MinecraftReflection.getLibraryClass("com.mojang.math.Vector3fa");
|
||||
@ -156,16 +181,67 @@ public class WrappedParticle<T> {
|
||||
r = (int) (rgbModifier.<Float>withType(float.class).read(0) * 255);
|
||||
g = (int) (rgbModifier.<Float>withType(float.class).read(1) * 255);
|
||||
b = (int) (rgbModifier.<Float>withType(float.class).read(2) * 255);
|
||||
alpha = (float) modifier.withType(float.class).read(0);
|
||||
size = (float) modifier.withType(float.class).read(0);
|
||||
} else {
|
||||
StructureModifier<Float> modifier = new StructureModifier<>(handle.getClass()).withTarget(handle).withType(float.class);
|
||||
r = (int) (modifier.read(0) * 255);
|
||||
g = (int) (modifier.read(1) * 255);
|
||||
b = (int) (modifier.read(2) * 255);
|
||||
alpha = modifier.read(3);
|
||||
size = modifier.read(3);
|
||||
}
|
||||
|
||||
return new Particle.DustOptions(Color.fromRGB(r, g, b), alpha);
|
||||
return new Particle.DustOptions(Color.fromRGB(r, g, b), size);
|
||||
}
|
||||
|
||||
private static Object getDustTransition(Object handle) {
|
||||
int fromR, fromG, fromB, toR, toG, toB;
|
||||
float size;
|
||||
|
||||
if (MinecraftVersion.FEATURE_PREVIEW_UPDATE.atOrAbove()) {
|
||||
StructureModifier<Object> modifier = new StructureModifier<>(handle.getClass()).withTarget(handle);
|
||||
org.joml.Vector3f toRGB = (org.joml.Vector3f) modifier.withType(org.joml.Vector3f.class).read(0);
|
||||
org.joml.Vector3f fromRGB = (org.joml.Vector3f) modifier.withType(org.joml.Vector3f.class).read(1);
|
||||
size = (float) modifier.withType(float.class).read(0);
|
||||
|
||||
fromR = (int) (fromRGB.x() * 255);
|
||||
fromG = (int) (fromRGB.y() * 255);
|
||||
fromB = (int) (fromRGB.z() * 255);
|
||||
|
||||
toR = (int) (toRGB.x() * 255);
|
||||
toG = (int) (toRGB.y() * 255);
|
||||
toB = (int) (toRGB.z() * 255);
|
||||
} else if (MinecraftVersion.CAVES_CLIFFS_1.atOrAbove()) {
|
||||
if (VECTOR_3FA == null) {
|
||||
VECTOR_3FA = MinecraftReflection.getLibraryClass("com.mojang.math.Vector3fa");
|
||||
}
|
||||
|
||||
StructureModifier<Object> modifier = new StructureModifier<>(handle.getClass()).withTarget(handle);
|
||||
|
||||
Object toRGB = modifier.withType(VECTOR_3FA).read(0);
|
||||
Object fromRGB = modifier.withType(VECTOR_3FA).read(1);
|
||||
size = (float) modifier.withType(float.class).read(0);
|
||||
StructureModifier<Object> rgbModifier = new StructureModifier<>(VECTOR_3FA).withTarget(fromRGB);
|
||||
StructureModifier<Object> rgbModifier2 = new StructureModifier<>(VECTOR_3FA).withTarget(toRGB);
|
||||
|
||||
fromR = (int) (rgbModifier.<Float>withType(float.class).read(0) * 255);
|
||||
fromG = (int) (rgbModifier.<Float>withType(float.class).read(1) * 255);
|
||||
fromB = (int) (rgbModifier.<Float>withType(float.class).read(2) * 255);
|
||||
|
||||
toR = (int) (rgbModifier2.<Float>withType(float.class).read(0) * 255);
|
||||
toG = (int) (rgbModifier2.<Float>withType(float.class).read(1) * 255);
|
||||
toB = (int) (rgbModifier2.<Float>withType(float.class).read(2) * 255);
|
||||
} else {
|
||||
StructureModifier<Float> modifier = new StructureModifier<>(handle.getClass()).withTarget(handle).withType(float.class);
|
||||
toR = (int) (modifier.read(0) * 255);
|
||||
toG = (int) (modifier.read(1) * 255);
|
||||
toB = (int) (modifier.read(2) * 255);
|
||||
size = modifier.read(3);
|
||||
fromR = (int) (modifier.read(4) * 255);
|
||||
fromG = (int) (modifier.read(5) * 255);
|
||||
fromB = (int) (modifier.read(6) * 255);
|
||||
}
|
||||
|
||||
return new Particle.DustTransition(Color.fromRGB(fromR, fromG, fromB), Color.fromRGB(toR, toG, toB), size);
|
||||
}
|
||||
|
||||
public static <T> WrappedParticle<T> create(Particle particle, T data) {
|
||||
|
@ -10,6 +10,7 @@ import org.bukkit.Color;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Particle;
|
||||
import org.bukkit.Particle.DustOptions;
|
||||
import org.bukkit.Particle.DustTransition;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
@ -59,4 +60,21 @@ public class WrappedParticleTest {
|
||||
assertEquals(beforeDust.getColor(), afterDust.getColor());
|
||||
assertEquals(beforeDust.getSize(), afterDust.getSize(), 0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDustColorTransition() {
|
||||
PacketContainer packet = new PacketContainer(PacketType.Play.Server.WORLD_PARTICLES);
|
||||
WrappedParticle before = WrappedParticle.create(Particle.DUST_COLOR_TRANSITION, new DustTransition(Color.BLUE, Color.RED, 1));
|
||||
packet.getNewParticles().write(0, before);
|
||||
|
||||
WrappedParticle after = packet.getNewParticles().read(0);
|
||||
assertEquals(before.getParticle(), after.getParticle());
|
||||
|
||||
Particle.DustTransition beforeDust = (Particle.DustTransition) before.getData();
|
||||
Particle.DustTransition afterDust = (Particle.DustTransition) after.getData();
|
||||
|
||||
assertEquals(beforeDust.getColor(), afterDust.getColor());
|
||||
assertEquals(beforeDust.getToColor(), afterDust.getToColor());
|
||||
assertEquals(beforeDust.getSize(), afterDust.getSize(), 0);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user