mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-01 15:36:45 +00:00
remove unused util to fix class not found exception
This commit is contained in:
parent
b8ee7561dd
commit
9cf567e1ff
@ -1,179 +0,0 @@
|
|||||||
/*
|
|
||||||
* Iris is a World Generator for Minecraft Bukkit Servers
|
|
||||||
* Copyright (c) 2022 Arcane Arts (Volmit Software)
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.volmit.iris.util.particle;
|
|
||||||
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Simple Bukkit Particles API with 1.7 to 1.13.2 support !
|
|
||||||
* <p>
|
|
||||||
* You can find the project on <a href="https://github.com/MrMicky-FR/FastParticles">GitHub</a>
|
|
||||||
*
|
|
||||||
* @author MrMicky
|
|
||||||
*/
|
|
||||||
public final class FastParticle {
|
|
||||||
|
|
||||||
private static final ParticleSender PARTICLE_SENDER;
|
|
||||||
|
|
||||||
static {
|
|
||||||
if (FastReflection.optionalClass("org.bukkit.Particle$DustOptions").isPresent()) {
|
|
||||||
PARTICLE_SENDER = new ParticleSender.ParticleSender1_13();
|
|
||||||
} else if (FastReflection.optionalClass("org.bukkit.Particle").isPresent()) {
|
|
||||||
PARTICLE_SENDER = new ParticleSender.ParticleSenderImpl();
|
|
||||||
} else {
|
|
||||||
PARTICLE_SENDER = new ParticleSenderLegacy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private FastParticle() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Worlds methods
|
|
||||||
*/
|
|
||||||
public static void spawnParticle(World world, ParticleType particle, Location location, int count) {
|
|
||||||
spawnParticle(world, particle, location.getX(), location.getY(), location.getZ(), count);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void spawnParticle(World world, ParticleType particle, double x, double y, double z, int count) {
|
|
||||||
spawnParticle(world, particle, x, y, z, count, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(World world, ParticleType particle, Location location, int count, T data) {
|
|
||||||
spawnParticle(world, particle, location.getX(), location.getY(), location.getZ(), count, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(World world, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
T data) {
|
|
||||||
spawnParticle(world, particle, x, y, z, count, 0.0D, 0.0D, 0.0D, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void spawnParticle(World world, ParticleType particle, Location location, int count, double offsetX,
|
|
||||||
double offsetY, double offsetZ) {
|
|
||||||
spawnParticle(world, particle, location.getX(), location.getY(), location.getZ(), count, offsetX, offsetY, offsetZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void spawnParticle(World world, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ) {
|
|
||||||
spawnParticle(world, particle, x, y, z, count, offsetX, offsetY, offsetZ, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(World world, ParticleType particle, Location location, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, T data) {
|
|
||||||
spawnParticle(world, particle, location.getX(), location.getY(), location.getZ(), count, offsetX, offsetY,
|
|
||||||
offsetZ, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(World world, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, T data) {
|
|
||||||
spawnParticle(world, particle, x, y, z, count, offsetX, offsetY, offsetZ, 1.0D, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void spawnParticle(World world, ParticleType particle, Location location, int count, double offsetX,
|
|
||||||
double offsetY, double offsetZ, double extra) {
|
|
||||||
spawnParticle(world, particle, location.getX(), location.getY(), location.getZ(), count, offsetX, offsetY, offsetZ, extra);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void spawnParticle(World world, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, double extra) {
|
|
||||||
spawnParticle(world, particle, x, y, z, count, offsetX, offsetY, offsetZ, extra, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(World world, ParticleType particle, Location location, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, double extra, T data) {
|
|
||||||
spawnParticle(world, particle, location.getX(), location.getY(), location.getZ(), count, offsetX, offsetY, offsetZ, extra, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(World world, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, double extra, T data) {
|
|
||||||
sendParticle(world, particle, x, y, z, count, offsetX, offsetY, offsetZ, extra, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Player methods
|
|
||||||
*/
|
|
||||||
public static void spawnParticle(Player player, ParticleType particle, Location location, int count) {
|
|
||||||
spawnParticle(player, particle, location.getX(), location.getY(), location.getZ(), count);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void spawnParticle(Player player, ParticleType particle, double x, double y, double z, int count) {
|
|
||||||
spawnParticle(player, particle, x, y, z, count, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(Player player, ParticleType particle, Location location, int count, T data) {
|
|
||||||
spawnParticle(player, particle, location.getX(), location.getY(), location.getZ(), count, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(Player player, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
T data) {
|
|
||||||
spawnParticle(player, particle, x, y, z, count, 0.0D, 0.0D, 0.0D, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void spawnParticle(Player player, ParticleType particle, Location location, int count, double offsetX,
|
|
||||||
double offsetY, double offsetZ) {
|
|
||||||
spawnParticle(player, particle, location.getX(), location.getY(), location.getZ(), count, offsetX, offsetY, offsetZ);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void spawnParticle(Player player, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ) {
|
|
||||||
spawnParticle(player, particle, x, y, z, count, offsetX, offsetY, offsetZ, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(Player player, ParticleType particle, Location location, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, T data) {
|
|
||||||
spawnParticle(player, particle, location.getX(), location.getY(), location.getZ(), count, offsetX, offsetY, offsetZ, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(Player player, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, T data) {
|
|
||||||
spawnParticle(player, particle, x, y, z, count, offsetX, offsetY, offsetZ, 1.0D, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void spawnParticle(Player player, ParticleType particle, Location location, int count, double offsetX,
|
|
||||||
double offsetY, double offsetZ, double extra) {
|
|
||||||
spawnParticle(player, particle, location.getX(), location.getY(), location.getZ(), count, offsetX, offsetY, offsetZ, extra);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void spawnParticle(Player player, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, double extra) {
|
|
||||||
spawnParticle(player, particle, x, y, z, count, offsetX, offsetY, offsetZ, extra, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(Player player, ParticleType particle, Location location, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, double extra, T data) {
|
|
||||||
spawnParticle(player, particle, location.getX(), location.getY(), location.getZ(), count, offsetX, offsetY, offsetZ, extra, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> void spawnParticle(Player player, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, double extra, T data) {
|
|
||||||
sendParticle(player, particle, x, y, z, count, offsetX, offsetY, offsetZ, extra, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void sendParticle(Object receiver, ParticleType particle, double x, double y, double z, int count,
|
|
||||||
double offsetX, double offsetY, double offsetZ, double extra, Object data) {
|
|
||||||
if (!particle.isSupported()) {
|
|
||||||
throw new IllegalArgumentException("The particle '" + particle + "' is not compatible with your server version");
|
|
||||||
}
|
|
||||||
|
|
||||||
PARTICLE_SENDER.spawnParticle(receiver, particle, x, y, z, count, offsetX, offsetY, offsetZ, extra, data);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,79 +0,0 @@
|
|||||||
/*
|
|
||||||
* Iris is a World Generator for Minecraft Bukkit Servers
|
|
||||||
* Copyright (c) 2022 Arcane Arts (Volmit Software)
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.volmit.iris.util.particle;
|
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Small reflection class to use CraftBukkit and NMS
|
|
||||||
*
|
|
||||||
* @author MrMicky
|
|
||||||
*/
|
|
||||||
public final class FastReflection {
|
|
||||||
|
|
||||||
public static final String OBC_PACKAGE = "org.bukkit.craftbukkit";
|
|
||||||
public static final String NMS_PACKAGE = "net.minecraft.server";
|
|
||||||
|
|
||||||
public static final String VERSION = Bukkit.getServer().getClass().getPackage().getName().substring(OBC_PACKAGE.length() + 1);
|
|
||||||
|
|
||||||
private FastReflection() {
|
|
||||||
throw new UnsupportedOperationException();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String nmsClassName(String className) {
|
|
||||||
return NMS_PACKAGE + '.' + VERSION + '.' + className;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Class<?> nmsClass(String className) throws ClassNotFoundException {
|
|
||||||
return Class.forName(nmsClassName(className));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Optional<Class<?>> nmsOptionalClass(String className) {
|
|
||||||
return optionalClass(nmsClassName(className));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String obcClassName(String className) {
|
|
||||||
return OBC_PACKAGE + '.' + VERSION + '.' + className;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Class<?> obcClass(String className) throws ClassNotFoundException {
|
|
||||||
return Class.forName(obcClassName(className));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Optional<Class<?>> obcOptionalClass(String className) {
|
|
||||||
return optionalClass(obcClassName(className));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Optional<Class<?>> optionalClass(String className) {
|
|
||||||
try {
|
|
||||||
return Optional.of(Class.forName(className));
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
Iris.reportError(e);
|
|
||||||
return Optional.empty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
||||||
public static Object enumValueOf(Class<?> enumClass, String enumName) {
|
|
||||||
return Enum.valueOf((Class<Enum>) enumClass, enumName.toUpperCase());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,124 +0,0 @@
|
|||||||
/*
|
|
||||||
* Iris is a World Generator for Minecraft Bukkit Servers
|
|
||||||
* Copyright (c) 2022 Arcane Arts (Volmit Software)
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.volmit.iris.util.particle;
|
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Color;
|
|
||||||
import org.bukkit.Particle;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.data.BlockData;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.material.MaterialData;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Particle sender using the Bukkit particles API for 1.9+ servers
|
|
||||||
*
|
|
||||||
* @author MrMicky
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
interface ParticleSender {
|
|
||||||
|
|
||||||
void spawnParticle(Object receiver, ParticleType particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, Object data);
|
|
||||||
|
|
||||||
Object getParticle(ParticleType particle);
|
|
||||||
|
|
||||||
boolean isValidData(Object particle, Object data);
|
|
||||||
|
|
||||||
default double color(double color) {
|
|
||||||
return color / 255.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
class ParticleSenderImpl implements ParticleSender {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void spawnParticle(Object receiver, ParticleType particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, Object data) {
|
|
||||||
Particle bukkitParticle = Particle.valueOf(particle.toString());
|
|
||||||
|
|
||||||
if (data instanceof Color) {
|
|
||||||
if (particle.getDataType() == Color.class) {
|
|
||||||
Color color = (Color) data;
|
|
||||||
count = 0;
|
|
||||||
offsetX = color(color.getRed());
|
|
||||||
offsetY = color(color.getGreen());
|
|
||||||
offsetZ = color(color.getBlue());
|
|
||||||
extra = 1.0;
|
|
||||||
}
|
|
||||||
data = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (receiver instanceof World) {
|
|
||||||
((World) receiver).spawnParticle(bukkitParticle, x, y, z, count, offsetX, offsetY, offsetZ, extra, data);
|
|
||||||
} else if (receiver instanceof Player) {
|
|
||||||
((Player) receiver).spawnParticle(bukkitParticle, x, y, z, count, offsetX, offsetY, offsetZ, extra, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Particle getParticle(ParticleType particle) {
|
|
||||||
try {
|
|
||||||
return Particle.valueOf(particle.toString());
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
Iris.reportError(e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isValidData(Object particle, Object data) {
|
|
||||||
return isValidDataBukkit((Particle) particle, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isValidDataBukkit(Particle particle, Object data) {
|
|
||||||
return particle.getDataType() == Void.class || particle.getDataType().isInstance(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ParticleSender1_13 extends ParticleSenderImpl {
|
|
||||||
@Override
|
|
||||||
public void spawnParticle(Object receiver, ParticleType particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, Object data) {
|
|
||||||
Particle bukkitParticle = Particle.valueOf(particle.toString());
|
|
||||||
|
|
||||||
if (bukkitParticle.getDataType() == Particle.DustOptions.class) {
|
|
||||||
if (data instanceof Color) {
|
|
||||||
data = new Particle.DustOptions((Color) data, 1);
|
|
||||||
} else if (data == null) {
|
|
||||||
data = new Particle.DustOptions(Color.RED, 1);
|
|
||||||
}
|
|
||||||
} else if (bukkitParticle.getDataType() == BlockData.class && data instanceof MaterialData) {
|
|
||||||
data = Bukkit.createBlockData(((MaterialData) data).getItemType());
|
|
||||||
}
|
|
||||||
|
|
||||||
super.spawnParticle(receiver, particle, x, y, z, count, offsetX, offsetY, offsetZ, extra, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isValidDataBukkit(Particle particle, Object data) {
|
|
||||||
if (particle.getDataType() == Particle.DustOptions.class && data instanceof Color) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (particle.getDataType() == BlockData.class && data instanceof MaterialData) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.isValidDataBukkit(particle, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,185 +0,0 @@
|
|||||||
/*
|
|
||||||
* Iris is a World Generator for Minecraft Bukkit Servers
|
|
||||||
* Copyright (c) 2022 Arcane Arts (Volmit Software)
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.volmit.iris.util.particle;
|
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
|
||||||
import org.bukkit.Color;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.material.MaterialData;
|
|
||||||
|
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Legacy particle sender with NMS for 1.7/1.8 servers
|
|
||||||
*
|
|
||||||
* @author MrMicky
|
|
||||||
*/
|
|
||||||
@SuppressWarnings({"deprecation", "JavaReflectionInvocation"})
|
|
||||||
class ParticleSenderLegacy implements ParticleSender {
|
|
||||||
|
|
||||||
private static final boolean SERVER_IS_1_8;
|
|
||||||
|
|
||||||
private static final Constructor<?> PACKET_PARTICLE;
|
|
||||||
private static final Class<?> ENUM_PARTICLE;
|
|
||||||
|
|
||||||
private static final Method WORLD_GET_HANDLE;
|
|
||||||
private static final Method WORLD_SEND_PARTICLE;
|
|
||||||
|
|
||||||
private static final Method PLAYER_GET_HANDLE;
|
|
||||||
private static final Field PLAYER_CONNECTION;
|
|
||||||
private static final Method SEND_PACKET;
|
|
||||||
private static final int[] EMPTY = new int[0];
|
|
||||||
|
|
||||||
static {
|
|
||||||
ENUM_PARTICLE = FastReflection.nmsOptionalClass("EnumParticle").orElse(null);
|
|
||||||
SERVER_IS_1_8 = ENUM_PARTICLE != null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
Class<?> packetParticleClass = FastReflection.nmsClass("PacketPlayOutWorldParticles");
|
|
||||||
Class<?> playerClass = FastReflection.nmsClass("EntityPlayer");
|
|
||||||
Class<?> playerConnectionClass = FastReflection.nmsClass("PlayerConnection");
|
|
||||||
Class<?> worldClass = FastReflection.nmsClass("WorldServer");
|
|
||||||
Class<?> entityPlayerClass = FastReflection.nmsClass("EntityPlayer");
|
|
||||||
|
|
||||||
Class<?> craftPlayerClass = FastReflection.obcClass("entity.CraftPlayer");
|
|
||||||
Class<?> craftWorldClass = FastReflection.obcClass("CraftWorld");
|
|
||||||
|
|
||||||
if (SERVER_IS_1_8) {
|
|
||||||
PACKET_PARTICLE = packetParticleClass.getConstructor(ENUM_PARTICLE, boolean.class, float.class,
|
|
||||||
float.class, float.class, float.class, float.class, float.class, float.class, int.class,
|
|
||||||
int[].class);
|
|
||||||
WORLD_SEND_PARTICLE = worldClass.getDeclaredMethod("sendParticles", entityPlayerClass, ENUM_PARTICLE,
|
|
||||||
boolean.class, double.class, double.class, double.class, int.class, double.class, double.class,
|
|
||||||
double.class, double.class, int[].class);
|
|
||||||
} else {
|
|
||||||
PACKET_PARTICLE = packetParticleClass.getConstructor(String.class, float.class, float.class, float.class,
|
|
||||||
float.class, float.class, float.class, float.class, int.class);
|
|
||||||
WORLD_SEND_PARTICLE = worldClass.getDeclaredMethod("a", String.class, double.class, double.class,
|
|
||||||
double.class, int.class, double.class, double.class, double.class, double.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
WORLD_GET_HANDLE = craftWorldClass.getDeclaredMethod("getHandle");
|
|
||||||
PLAYER_GET_HANDLE = craftPlayerClass.getDeclaredMethod("getHandle");
|
|
||||||
PLAYER_CONNECTION = playerClass.getField("playerConnection");
|
|
||||||
SEND_PACKET = playerConnectionClass.getMethod("sendPacket", FastReflection.nmsClass("Packet"));
|
|
||||||
} catch (ReflectiveOperationException e) {
|
|
||||||
throw new ExceptionInInitializerError(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void spawnParticle(Object receiver, ParticleType particle, double x, double y, double z, int count, double offsetX, double offsetY,
|
|
||||||
double offsetZ, double extra, Object data) {
|
|
||||||
try {
|
|
||||||
int[] datas = toData(particle, data);
|
|
||||||
|
|
||||||
if (data instanceof Color) {
|
|
||||||
if (particle.getDataType() == Color.class) {
|
|
||||||
Color color = (Color) data;
|
|
||||||
count = 0;
|
|
||||||
offsetX = color(color.getRed());
|
|
||||||
offsetY = color(color.getGreen());
|
|
||||||
offsetZ = color(color.getBlue());
|
|
||||||
extra = 1.0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (receiver instanceof World) {
|
|
||||||
Object worldServer = WORLD_GET_HANDLE.invoke(receiver);
|
|
||||||
|
|
||||||
if (SERVER_IS_1_8) {
|
|
||||||
WORLD_SEND_PARTICLE.invoke(worldServer, null, getEnumParticle(particle), true, x, y, z, count, offsetX, offsetY, offsetZ, extra, datas);
|
|
||||||
} else {
|
|
||||||
String particleName = particle.getLegacyName() + (datas.length != 2 ? "" : "_" + datas[0] + "_" + datas[1]);
|
|
||||||
WORLD_SEND_PARTICLE.invoke(worldServer, particleName, x, y, z, count, offsetX, offsetY, offsetZ, extra);
|
|
||||||
}
|
|
||||||
} else if (receiver instanceof Player) {
|
|
||||||
Object packet;
|
|
||||||
|
|
||||||
if (SERVER_IS_1_8) {
|
|
||||||
packet = PACKET_PARTICLE.newInstance(getEnumParticle(particle), true, (float) x, (float) y,
|
|
||||||
(float) z, (float) offsetX, (float) offsetY, (float) offsetZ, (float) extra, count, datas);
|
|
||||||
} else {
|
|
||||||
String particleName = particle.getLegacyName() + (datas.length != 2 ? "" : "_" + datas[0] + "_" + datas[1]);
|
|
||||||
packet = PACKET_PARTICLE.newInstance(particleName, (float) x, (float) y, (float) z,
|
|
||||||
(float) offsetX, (float) offsetY, (float) offsetZ, (float) extra, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
Object entityPlayer = PLAYER_GET_HANDLE.invoke(receiver);
|
|
||||||
Object playerConnection = PLAYER_CONNECTION.get(entityPlayer);
|
|
||||||
SEND_PACKET.invoke(playerConnection, packet);
|
|
||||||
}
|
|
||||||
} catch (ReflectiveOperationException e) {
|
|
||||||
Iris.reportError(e);
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isValidData(Object particle, Object data) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object getParticle(ParticleType particle) {
|
|
||||||
if (!SERVER_IS_1_8) {
|
|
||||||
return particle.getLegacyName();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
return getEnumParticle(particle);
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
Iris.reportError(e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private Object getEnumParticle(ParticleType particleType) {
|
|
||||||
return FastReflection.enumValueOf(ENUM_PARTICLE, particleType.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
private int[] toData(ParticleType particle, Object data) {
|
|
||||||
Class<?> dataType = particle.getDataType();
|
|
||||||
if (dataType == ItemStack.class) {
|
|
||||||
if (!(data instanceof ItemStack itemStack)) {
|
|
||||||
return SERVER_IS_1_8 ? new int[2] : new int[]{1, 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
return new int[]{itemStack.getType().getId(), itemStack.getDurability()};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dataType == MaterialData.class) {
|
|
||||||
if (!(data instanceof MaterialData materialData)) {
|
|
||||||
return SERVER_IS_1_8 ? new int[1] : new int[]{1, 0};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SERVER_IS_1_8) {
|
|
||||||
return new int[]{materialData.getItemType().getId() + (materialData.getData() << 12)};
|
|
||||||
} else {
|
|
||||||
return new int[]{materialData.getItemType().getId(), materialData.getData()};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return EMPTY;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,192 +0,0 @@
|
|||||||
/*
|
|
||||||
* Iris is a World Generator for Minecraft Bukkit Servers
|
|
||||||
* Copyright (c) 2022 Arcane Arts (Volmit Software)
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.volmit.iris.util.particle;
|
|
||||||
|
|
||||||
import com.volmit.iris.Iris;
|
|
||||||
import org.bukkit.Color;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.bukkit.material.MaterialData;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author MrMicky
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public enum ParticleType {
|
|
||||||
|
|
||||||
// 1.7+
|
|
||||||
EXPLOSION_NORMAL("explode", "poof"),
|
|
||||||
EXPLOSION_LARGE("largeexplode", "explosion"),
|
|
||||||
EXPLOSION_HUGE("hugeexplosion", "explosion_emitter"),
|
|
||||||
FIREWORKS_SPARK("fireworksSpark", "firework"),
|
|
||||||
WATER_BUBBLE("bubble", "bubble"),
|
|
||||||
WATER_SPLASH("splash", "splash"),
|
|
||||||
WATER_WAKE("wake", "fishing"),
|
|
||||||
SUSPENDED("suspended", "underwater"),
|
|
||||||
SUSPENDED_DEPTH("depthsuspend", "underwater"),
|
|
||||||
CRIT("crit", "crit"),
|
|
||||||
CRIT_MAGIC("magicCrit", "enchanted_hit"),
|
|
||||||
SMOKE_NORMAL("smoke", "smoke"),
|
|
||||||
SMOKE_LARGE("largesmoke", "large_smoke"),
|
|
||||||
SPELL("spell", "effect"),
|
|
||||||
SPELL_INSTANT("instantSpell", "instant_effect"),
|
|
||||||
SPELL_MOB("mobSpell", "entity_effect"),
|
|
||||||
SPELL_MOB_AMBIENT("mobSpellAmbient", "ambient_entity_effect"),
|
|
||||||
SPELL_WITCH("witchMagic", "witch"),
|
|
||||||
DRIP_WATER("dripWater", "dripping_water"),
|
|
||||||
DRIP_LAVA("dripLava", "dripping_lava"),
|
|
||||||
VILLAGER_ANGRY("angryVillager", "angry_villager"),
|
|
||||||
VILLAGER_HAPPY("happyVillager", "happy_villager"),
|
|
||||||
TOWN_AURA("townaura", "mycelium"),
|
|
||||||
NOTE("note", "note"),
|
|
||||||
PORTAL("portal", "portal"),
|
|
||||||
ENCHANTMENT_TABLE("enchantmenttable", "enchant"),
|
|
||||||
FLAME("flame", "flame"),
|
|
||||||
LAVA("lava", "lava"),
|
|
||||||
// FOOTSTEP("footstep", null),
|
|
||||||
CLOUD("cloud", "cloud"),
|
|
||||||
REDSTONE("reddust", "dust"),
|
|
||||||
SNOWBALL("snowballpoof", "item_snowball"),
|
|
||||||
SNOW_SHOVEL("snowshovel", "item_snowball"),
|
|
||||||
SLIME("slime", "item_slime"),
|
|
||||||
HEART("heart", "heart"),
|
|
||||||
ITEM_CRACK("iconcrack", "item"),
|
|
||||||
BLOCK_CRACK("blockcrack", "block"),
|
|
||||||
BLOCK_DUST("blockdust", "block"),
|
|
||||||
|
|
||||||
// 1.8+
|
|
||||||
BARRIER("barrier", "barrier", 8),
|
|
||||||
WATER_DROP("droplet", "rain", 8),
|
|
||||||
MOB_APPEARANCE("mobappearance", "elder_guardian", 8),
|
|
||||||
// ITEM_TAKE("take", null, 8),
|
|
||||||
|
|
||||||
// 1.9+
|
|
||||||
DRAGON_BREATH("dragonbreath", "dragon_breath", 9),
|
|
||||||
END_ROD("endRod", "end_rod", 9),
|
|
||||||
DAMAGE_INDICATOR("damageIndicator", "damage_indicator", 9),
|
|
||||||
SWEEP_ATTACK("sweepAttack", "sweep_attack", 9),
|
|
||||||
|
|
||||||
// 1.10+
|
|
||||||
FALLING_DUST("fallingdust", "falling_dust", 10),
|
|
||||||
|
|
||||||
// 1.11+
|
|
||||||
TOTEM("totem", "totem_of_undying", 11),
|
|
||||||
SPIT("spit", "spit", 11),
|
|
||||||
|
|
||||||
// 1.13+
|
|
||||||
SQUID_INK(13),
|
|
||||||
BUBBLE_POP(13),
|
|
||||||
CURRENT_DOWN(13),
|
|
||||||
BUBBLE_COLUMN_UP(13),
|
|
||||||
NAUTILUS(13),
|
|
||||||
DOLPHIN(13),
|
|
||||||
|
|
||||||
// 1.14+
|
|
||||||
SNEEZE(14),
|
|
||||||
CAMPFIRE_COSY_SMOKE(14),
|
|
||||||
CAMPFIRE_SIGNAL_SMOKE(14),
|
|
||||||
COMPOSTER(14),
|
|
||||||
FLASH(14),
|
|
||||||
FALLING_LAVA(14),
|
|
||||||
LANDING_LAVA(14),
|
|
||||||
FALLING_WATER(14),
|
|
||||||
|
|
||||||
// 1.15+
|
|
||||||
DRIPPING_HONEY(15),
|
|
||||||
FALLING_HONEY(15),
|
|
||||||
LANDING_HONEY(15),
|
|
||||||
FALLING_NECTAR(15);
|
|
||||||
|
|
||||||
private static final int SERVER_VERSION_ID;
|
|
||||||
|
|
||||||
static {
|
|
||||||
String ver = FastReflection.VERSION;
|
|
||||||
SERVER_VERSION_ID = ver.charAt(4) == '_' ? Character.getNumericValue(ver.charAt(3)) : Integer.parseInt(ver.substring(3, 5));
|
|
||||||
}
|
|
||||||
|
|
||||||
private final String legacyName;
|
|
||||||
private final String name;
|
|
||||||
private final int minimumVersion;
|
|
||||||
|
|
||||||
// 1.7 particles
|
|
||||||
ParticleType(String legacyName, String name) {
|
|
||||||
this(legacyName, name, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1.13+ particles
|
|
||||||
ParticleType(int minimumVersion) {
|
|
||||||
this.legacyName = null;
|
|
||||||
this.name = name().toLowerCase();
|
|
||||||
this.minimumVersion = minimumVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1.8-1.12 particles
|
|
||||||
ParticleType(String legacyName, String name, int minimumVersion) {
|
|
||||||
this.legacyName = legacyName;
|
|
||||||
this.name = name;
|
|
||||||
this.minimumVersion = minimumVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ParticleType getParticle(String particleName) {
|
|
||||||
try {
|
|
||||||
return ParticleType.valueOf(particleName.toUpperCase());
|
|
||||||
} catch (IllegalArgumentException e) {
|
|
||||||
Iris.reportError(e);
|
|
||||||
for (ParticleType particle : values()) {
|
|
||||||
if (particle.getName().equalsIgnoreCase(particleName)) {
|
|
||||||
return particle;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (particle.hasLegacyName() && particle.getLegacyName().equalsIgnoreCase(particleName)) {
|
|
||||||
return particle;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasLegacyName() {
|
|
||||||
return legacyName != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLegacyName() {
|
|
||||||
if (!hasLegacyName()) {
|
|
||||||
throw new IllegalStateException("Particle " + name() + " don't have legacy name");
|
|
||||||
}
|
|
||||||
return legacyName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isSupported() {
|
|
||||||
return minimumVersion <= 0 || SERVER_VERSION_ID >= minimumVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Class<?> getDataType() {
|
|
||||||
return switch (this) {
|
|
||||||
case ITEM_CRACK -> ItemStack.class;
|
|
||||||
case BLOCK_CRACK, BLOCK_DUST, FALLING_DUST ->
|
|
||||||
//noinspection deprecation
|
|
||||||
MaterialData.class;
|
|
||||||
case REDSTONE -> Color.class;
|
|
||||||
default -> Void.class;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user