Updated to 1.19, removed API manager because it's a plugin now #1

Merged
stijnb1234 merged 1 commit from 119-support into master 2022-10-31 19:01:09 +00:00
13 changed files with 381 additions and 779 deletions

21
LICENSE
View file

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2020 Stijn Bannink
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

26
pom.xml
View file

@ -110,21 +110,9 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.18.1-R0.1-SNAPSHOT</version>
<version>1.19-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.inventivetalent</groupId>
<artifactId>apimanager</artifactId>
<version>1.0.5-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>22.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>fr.minuskube.inv</groupId>
<artifactId>smart-invs</artifactId>
@ -134,18 +122,24 @@
<dependency>
<groupId>com.github.cryptomorin</groupId>
<artifactId>XSeries</artifactId>
<version>8.6.1</version>
<version>8.8.0</version>
</dependency>
<dependency>
<groupId>com.github.fierioziy.particlenativeapi</groupId>
<artifactId>ParticleNativeAPI-plugin</artifactId>
<version>3.2.0</version>
<version>3.2.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>co.aikar</groupId>
<artifactId>acf-paper</artifactId>
<version>0.5.0-SNAPSHOT</version>
<version>0.5.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.github.skytasul</groupId>
<artifactId>guardianbeam</artifactId>
<version>2.3.0</version>
<scope>compile</scope>
</dependency>
</dependencies>

View file

@ -1,367 +0,0 @@
package nl.sbdeveloper.showapi;
import nl.sbdeveloper.showapi.utils.Laser;
import nl.sbdeveloper.showapi.utils.VersionUtil;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.Location;
import org.bukkit.entity.EnderCrystal;
import org.bukkit.entity.EntityType;
import org.bukkit.event.Listener;
import org.bukkit.inventory.meta.FireworkMeta;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.inventivetalent.apihelper.API;
import org.inventivetalent.apihelper.APIManager;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
public class ShowAPI implements API, Listener {
Logger logger = Logger.getLogger("ShowAPI");
//This gets called either by #registerAPI above, or by the API manager if another plugin requires this API
@Override
public void load() {
}
//This gets called either by #initAPI above or #initAPI in one of the requiring plugins
@Override
public void init(Plugin plugin) {
if (VersionUtil.getVersion() < 9 || VersionUtil.getVersion() > 17) {
logger.severe("Deze API werkt alleen tussen 1.9.x en 1.17.x.");
disable(plugin);
return;
}
APIManager.registerEvents(this, this);
}
//This gets called either by #disableAPI above or #disableAPI in one of the requiring plugins
@Override
public void disable(Plugin plugin) {
}
public static class Fireworks {
public static void spawn(@NotNull Firework fw, Location baseLoc) {
fw.spawn(baseLoc);
}
public static class Firework {
private final FireworkEffect.Builder effectBuilder;
private int power;
public Firework() {
effectBuilder = FireworkEffect.builder();
}
public Firework addFlicker() {
effectBuilder.flicker(true);
return this;
}
public Firework addTrail() {
effectBuilder.trail(true);
return this;
}
public Firework addColor(Color color) {
effectBuilder.withColor(color);
return this;
}
public Firework addFade(Color color) {
effectBuilder.withFade(color);
return this;
}
public Firework setType(FireworkEffect.Type type) {
effectBuilder.with(type);
return this;
}
public Firework setPower(int power) {
this.power = power;
return this;
}
private void spawn(@NotNull Location loc) {
org.bukkit.entity.Firework fw = (org.bukkit.entity.Firework) loc.getWorld().spawnEntity(loc, EntityType.FIREWORK);
FireworkMeta fwm = fw.getFireworkMeta();
fwm.addEffect(effectBuilder.build());
fwm.setPower(power);
fw.setFireworkMeta(fwm);
}
}
}
//SPOTS -> End Crystals
public static class Spots {
private static final Map<String, SpotRunnable> spots = new HashMap<>();
/**
* Check if a spot exists
*
* @param name The name of the spot
* @return true if it exists, false if not
*/
public static boolean exists(String name) {
return spots.containsKey(name);
}
/**
* Spawn a new spot, and start it
*
* @param name The name of the spot
* @param baseLoc The start location
*/
public static void start(String name, Location baseLoc) {
spots.put(name, new SpotRunnable(name, baseLoc));
spots.get(name).runTaskTimer(ShowAPIPlugin.getInstance(), 0, 1);
}
/**
* Move a spot to a location
*
* @param name The name of the spot
* @param posLoc The new location
*
* @return true if done, false if it doesn't exists
*/
public static boolean move(String name, Location posLoc) {
if (!spots.containsKey(name)) return false;
SpotRunnable spot = spots.get(name);
new BukkitRunnable() {
boolean fired = false;
Location oldLoc = spot.posLoc;
@Override
public void run() {
if (oldLoc.getBlockX() != posLoc.getBlockX()) {
if (oldLoc.getX() > posLoc.getX()) { //De x gaat omhoog
oldLoc = oldLoc.add(0.01, 0, 0);
} else {
oldLoc = oldLoc.add(-0.01, 0, 0);
}
fired = true;
} else {
fired = false;
}
if (oldLoc.getBlockY() != posLoc.getBlockY()) {
if (oldLoc.getY() > posLoc.getY()) { //De y gaat omhoog
oldLoc = oldLoc.add(0, 0.01, 0);
} else {
oldLoc = oldLoc.add(0, -0.01, 0);
}
fired = true;
} else {
fired = false;
}
if (oldLoc.getBlockZ() != posLoc.getBlockZ()) {
if (oldLoc.getZ() > posLoc.getZ()) { //De z gaat omhoog
oldLoc = oldLoc.add(0, 0, 0.01);
} else {
oldLoc = oldLoc.add(0, 0, -0.01);
}
fired = true;
} else {
fired = false;
}
if (!fired) {
cancel();
return;
}
spot.changePositionLocation(oldLoc);
}
}.runTaskTimer(ShowAPIPlugin.getInstance(), 0L, 1L);
return true;
}
public static void remove(String name) {
if (!spots.containsKey(name)) return;
spots.get(name).cancel();
}
private static class SpotRunnable extends BukkitRunnable {
private final EnderCrystal crystal;
private final String name;
private Location posLoc;
public SpotRunnable(String name, Location baseLoc) {
this.name = name;
this.crystal = (EnderCrystal) baseLoc.getWorld().spawnEntity(baseLoc, EntityType.ENDER_CRYSTAL);
this.crystal.setCustomName(name);
this.crystal.setShowingBottom(false);
this.crystal.setCustomNameVisible(false);
this.crystal.setBeamTarget(baseLoc.clone().add(0, 5, 0));
}
@Override
public void run() {
if (posLoc == null) return;
this.crystal.setBeamTarget(posLoc);
}
public void changePositionLocation(Location posLoc) {
this.posLoc = posLoc;
}
public synchronized void cancel() throws IllegalStateException {
crystal.remove();
spots.remove(name);
super.cancel();
}
}
}
//LASERS -> Guardian beams
public static class Lasers {
private static final Map<String, LaserRunnable> lasers = new HashMap<>();
/**
* Check if a laser exists
*
* @param name The name of the laser
* @return true if it exists, false if not
*/
public static boolean exists(String name) {
return lasers.containsKey(name);
}
/**
* Spawn a new laser, and start it
*
* @param name The name of the laser
* @param baseLoc The start location
*
* @return true if done, false if an exception
*/
public static boolean start(String name, Location baseLoc) {
try {
lasers.put(name, new LaserRunnable(name, baseLoc));
lasers.get(name).runTaskTimer(ShowAPIPlugin.getInstance(), 0, 1);
return true;
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
return false;
}
/**
* Move a laser to a location
* @param name The name of the laser
* @param posLoc The new location
*
* @return true if done, false if it doesn't exists
*/
public static boolean move(String name, Location posLoc) {
if (!lasers.containsKey(name)) return false;
LaserRunnable laser = lasers.get(name);
new BukkitRunnable() {
boolean fired = false;
Location oldLoc = laser.posLoc;
@Override
public void run() {
if (oldLoc.getBlockX() != posLoc.getBlockX()) {
if (oldLoc.getX() > posLoc.getX()) { //De x gaat omhoog
oldLoc = oldLoc.add(0.01, 0, 0);
} else {
oldLoc = oldLoc.add(-0.01, 0, 0);
}
fired = true;
} else {
fired = false;
}
if (oldLoc.getBlockY() != posLoc.getBlockY()) {
if (oldLoc.getY() > posLoc.getY()) { //De y gaat omhoog
oldLoc = oldLoc.add(0, 0.01, 0);
} else {
oldLoc = oldLoc.add(0, -0.01, 0);
}
fired = true;
} else {
fired = false;
}
if (oldLoc.getBlockZ() != posLoc.getBlockZ()) {
if (oldLoc.getZ() > posLoc.getZ()) { //De z gaat omhoog
oldLoc = oldLoc.add(0, 0, 0.01);
} else {
oldLoc = oldLoc.add(0, 0, -0.01);
}
fired = true;
} else {
fired = false;
}
if (!fired) {
cancel();
return;
}
laser.changePositionLocation(oldLoc);
}
}.runTaskTimer(ShowAPIPlugin.getInstance(), 0L, 1L);
return true;
}
public static void remove(String name) {
if (!lasers.containsKey(name)) return;
lasers.get(name).cancel();
lasers.remove(name);
}
private static class LaserRunnable extends BukkitRunnable {
private final Laser laser;
private final String name;
private final Location baseLoc;
private Location posLoc;
public LaserRunnable(String name, Location baseLoc) throws ReflectiveOperationException {
this.name = name;
this.baseLoc = baseLoc;
this.laser = new Laser(baseLoc, baseLoc.add(0, 5, 0), -1, 50);
this.laser.start(ShowAPIPlugin.getInstance());
}
@Override
public void run() {
if (posLoc == null) return;
try {
laser.moveStart(baseLoc);
laser.moveEnd(posLoc);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
public void changePositionLocation(Location posLoc) {
this.posLoc = posLoc;
}
public synchronized void cancel() throws IllegalStateException {
laser.stop();
lasers.remove(name);
super.cancel();
}
}
}
}

View file

@ -12,32 +12,23 @@ import nl.sbdeveloper.showapi.data.Shows;
import nl.sbdeveloper.showapi.utils.Inventory;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import org.inventivetalent.apihelper.APIManager;
import java.util.Arrays;
import java.util.stream.Collectors;
public final class ShowAPIPlugin extends JavaPlugin {
private static ShowAPIPlugin instance;
private final ShowAPI showAPI = new ShowAPI();
private static PaperCommandManager commandManager;
private static ParticleNativeAPI particleAPI;
@Override
public void onLoad() {
APIManager.registerAPI(showAPI, this);
}
@Override
public void onEnable() {
instance = this;
DataConversion.handle();
APIManager.initAPI(ShowAPI.class);
commandManager = new PaperCommandManager(this);
commandManager.enableUnstableAPI("help");
@ -66,8 +57,6 @@ public final class ShowAPIPlugin extends JavaPlugin {
DataSaving.save();
Shows.getShowsMap().values().forEach(show -> show.forEach(showCue -> showCue.getTask().remove()));
APIManager.disableAPI(ShowAPI.class);
}
public static ShowAPIPlugin getInstance() {

View file

@ -1,8 +1,8 @@
package nl.sbdeveloper.showapi.api.triggers;
import nl.sbdeveloper.showapi.ShowAPI;
import nl.sbdeveloper.showapi.api.TriggerTask;
import nl.sbdeveloper.showapi.api.TriggerType;
import nl.sbdeveloper.showapi.elements.Fireworks;
import nl.sbdeveloper.showapi.utils.Color;
import org.bukkit.Bukkit;
import org.bukkit.FireworkEffect;
@ -10,7 +10,7 @@ import org.bukkit.Location;
import org.bukkit.World;
public class FireworkTrigger extends TriggerTask {
private ShowAPI.Fireworks.Firework fw;
private Fireworks.Firework fw;
private Location spawnLoc;
public FireworkTrigger(String[] data) {
@ -36,7 +36,7 @@ public class FireworkTrigger extends TriggerTask {
this.spawnLoc = new Location(w, x, y, z);
ShowAPI.Fireworks.Firework firework = new ShowAPI.Fireworks.Firework();
Fireworks.Firework firework = new Fireworks.Firework();
for (int i = 4; i < data.length; i++) {
if (data[i].split(":").length != 2) continue;
@ -71,6 +71,6 @@ public class FireworkTrigger extends TriggerTask {
@Override
public void trigger() {
ShowAPI.Fireworks.spawn(fw, spawnLoc);
Fireworks.spawn(fw, spawnLoc);
}
}

View file

@ -1,8 +1,8 @@
package nl.sbdeveloper.showapi.api.triggers;
import nl.sbdeveloper.showapi.ShowAPI;
import nl.sbdeveloper.showapi.api.TriggerTask;
import nl.sbdeveloper.showapi.api.TriggerType;
import nl.sbdeveloper.showapi.elements.Lasers;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
@ -37,8 +37,8 @@ public class LaserTrigger extends TriggerTask {
this.newLocation = new Location(w, x, y, z);
if (!ShowAPI.Lasers.exists(name)) {
ShowAPI.Lasers.start(name, newLocation);
if (!Lasers.exists(name)) {
Lasers.start(name, newLocation);
}
}
@ -50,6 +50,6 @@ public class LaserTrigger extends TriggerTask {
@Override
public void remove() {
ShowAPI.Lasers.remove(name);
Lasers.remove(name);
}
}

View file

@ -1,8 +1,8 @@
package nl.sbdeveloper.showapi.api.triggers;
import nl.sbdeveloper.showapi.ShowAPI;
import nl.sbdeveloper.showapi.api.TriggerTask;
import nl.sbdeveloper.showapi.api.TriggerType;
import nl.sbdeveloper.showapi.elements.Spots;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
@ -36,8 +36,8 @@ public class SpotTrigger extends TriggerTask {
this.newLocation = new Location(w, x, y, z);
if (!ShowAPI.Spots.exists(name)) {
ShowAPI.Spots.start(name, newLocation);
if (!Spots.exists(name)) {
Spots.start(name, newLocation);
}
}
@ -49,6 +49,6 @@ public class SpotTrigger extends TriggerTask {
@Override
public void remove() {
ShowAPI.Spots.remove(name);
Spots.remove(name);
}
}

View file

@ -0,0 +1,60 @@
package nl.sbdeveloper.showapi.elements;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.Location;
import org.bukkit.entity.EntityType;
import org.bukkit.inventory.meta.FireworkMeta;
public class Fireworks {
public static void spawn(Firework fw, Location baseLoc) {
fw.spawn(baseLoc);
}
public static class Firework {
private final FireworkEffect.Builder effectBuilder;
private int power;
public Firework() {
effectBuilder = FireworkEffect.builder();
}
public Firework addFlicker() {
effectBuilder.flicker(true);
return this;
}
public Firework addTrail() {
effectBuilder.trail(true);
return this;
}
public Firework addColor(Color color) {
effectBuilder.withColor(color);
return this;
}
public Firework addFade(Color color) {
effectBuilder.withFade(color);
return this;
}
public Firework setType(FireworkEffect.Type type) {
effectBuilder.with(type);
return this;
}
public Firework setPower(int power) {
this.power = power;
return this;
}
private void spawn(Location loc) {
org.bukkit.entity.Firework fw = (org.bukkit.entity.Firework) loc.getWorld().spawnEntity(loc, EntityType.FIREWORK);
FireworkMeta fwm = fw.getFireworkMeta();
fwm.addEffect(effectBuilder.build());
fwm.setPower(power);
fw.setFireworkMeta(fwm);
}
}
}

View file

@ -0,0 +1,147 @@
package nl.sbdeveloper.showapi.elements;
import fr.skytasul.guardianbeam.Laser;
import nl.sbdeveloper.showapi.ShowAPIPlugin;
import org.bukkit.Location;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashMap;
import java.util.Map;
public class Lasers {
private static final Map<String, LaserRunnable> lasers = new HashMap<>();
/**
* Check if a laser exists
*
* @param name The name of the laser
* @return true if it exists, false if not
*/
public static boolean exists(String name) {
return lasers.containsKey(name);
}
/**
* Spawn a new laser, and start it
*
* @param name The name of the laser
* @param baseLoc The start location
*
* @return true if done, false if an exception
*/
public static boolean start(String name, Location baseLoc) {
try {
lasers.put(name, new LaserRunnable(name, baseLoc));
lasers.get(name).runTaskTimer(ShowAPIPlugin.getInstance(), 0, 1);
return true;
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
return false;
}
/**
* Move a laser to a location
* @param name The name of the laser
* @param posLoc The new location
*
* @return true if done, false if it doesn't exists
*/
public static boolean move(String name, Location posLoc) {
if (!lasers.containsKey(name)) return false;
LaserRunnable laser = lasers.get(name);
new BukkitRunnable() {
boolean fired = false;
Location oldLoc = laser.posLoc;
@Override
public void run() {
if (oldLoc.getBlockX() != posLoc.getBlockX()) {
if (oldLoc.getX() > posLoc.getX()) { //De x gaat omhoog
oldLoc = oldLoc.add(0.01, 0, 0);
} else {
oldLoc = oldLoc.add(-0.01, 0, 0);
}
fired = true;
} else {
fired = false;
}
if (oldLoc.getBlockY() != posLoc.getBlockY()) {
if (oldLoc.getY() > posLoc.getY()) { //De y gaat omhoog
oldLoc = oldLoc.add(0, 0.01, 0);
} else {
oldLoc = oldLoc.add(0, -0.01, 0);
}
fired = true;
} else {
fired = false;
}
if (oldLoc.getBlockZ() != posLoc.getBlockZ()) {
if (oldLoc.getZ() > posLoc.getZ()) { //De z gaat omhoog
oldLoc = oldLoc.add(0, 0, 0.01);
} else {
oldLoc = oldLoc.add(0, 0, -0.01);
}
fired = true;
} else {
fired = false;
}
if (!fired) {
cancel();
return;
}
laser.changePositionLocation(oldLoc);
}
}.runTaskTimer(ShowAPIPlugin.getInstance(), 0L, 1L);
return true;
}
public static void remove(String name) {
if (!lasers.containsKey(name)) return;
lasers.get(name).cancel();
lasers.remove(name);
}
private static class LaserRunnable extends BukkitRunnable {
private final Laser laser;
private final String name;
private final Location baseLoc;
private Location posLoc;
public LaserRunnable(String name, Location baseLoc) throws ReflectiveOperationException {
this.name = name;
this.baseLoc = baseLoc;
this.laser = new Laser.GuardianLaser(baseLoc, baseLoc.add(0, 5, 0), -1, 50);
this.laser.start(ShowAPIPlugin.getInstance());
}
@Override
public void run() {
if (posLoc == null) return;
try {
laser.moveStart(baseLoc);
laser.moveEnd(posLoc);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
public void changePositionLocation(Location posLoc) {
this.posLoc = posLoc;
}
public synchronized void cancel() throws IllegalStateException {
laser.stop();
lasers.remove(name);
super.cancel();
}
}
}

View file

@ -0,0 +1,147 @@
package nl.sbdeveloper.showapi.elements;
import fr.skytasul.guardianbeam.Laser;
import nl.sbdeveloper.showapi.ShowAPIPlugin;
import org.bukkit.Location;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.HashMap;
import java.util.Map;
public class Spots {
private static final Map<String, SpotRunnable> spots = new HashMap<>();
/**
* Check if a spot exists
*
* @param name The name of the spot
* @return true if it exists, false if not
*/
public static boolean exists(String name) {
return spots.containsKey(name);
}
/**
* Spawn a new spot, and start it
*
* @param name The name of the spot
* @param baseLoc The start location
*
* @return true if done, false if an exception
*/
public static boolean start(String name, Location baseLoc) {
try {
spots.put(name, new SpotRunnable(name, baseLoc));
spots.get(name).runTaskTimer(ShowAPIPlugin.getInstance(), 0, 1);
return true;
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
return false;
}
/**
* Move a spot to a location
* @param name The name of the spot
* @param posLoc The new location
*
* @return true if done, false if it doesn't exists
*/
public static boolean move(String name, Location posLoc) {
if (!spots.containsKey(name)) return false;
SpotRunnable laser = spots.get(name);
new BukkitRunnable() {
boolean fired = false;
Location oldLoc = laser.posLoc;
@Override
public void run() {
if (oldLoc.getBlockX() != posLoc.getBlockX()) {
if (oldLoc.getX() > posLoc.getX()) { //De x gaat omhoog
oldLoc = oldLoc.add(0.01, 0, 0);
} else {
oldLoc = oldLoc.add(-0.01, 0, 0);
}
fired = true;
} else {
fired = false;
}
if (oldLoc.getBlockY() != posLoc.getBlockY()) {
if (oldLoc.getY() > posLoc.getY()) { //De y gaat omhoog
oldLoc = oldLoc.add(0, 0.01, 0);
} else {
oldLoc = oldLoc.add(0, -0.01, 0);
}
fired = true;
} else {
fired = false;
}
if (oldLoc.getBlockZ() != posLoc.getBlockZ()) {
if (oldLoc.getZ() > posLoc.getZ()) { //De z gaat omhoog
oldLoc = oldLoc.add(0, 0, 0.01);
} else {
oldLoc = oldLoc.add(0, 0, -0.01);
}
fired = true;
} else {
fired = false;
}
if (!fired) {
cancel();
return;
}
laser.changePositionLocation(oldLoc);
}
}.runTaskTimer(ShowAPIPlugin.getInstance(), 0L, 1L);
return true;
}
public static void remove(String name) {
if (!spots.containsKey(name)) return;
spots.get(name).cancel();
spots.remove(name);
}
private static class SpotRunnable extends BukkitRunnable {
private final Laser spot;
private final String name;
private final Location baseLoc;
private Location posLoc;
public SpotRunnable(String name, Location baseLoc) throws ReflectiveOperationException {
this.name = name;
this.baseLoc = baseLoc;
this.spot = new Laser.CrystalLaser(baseLoc, baseLoc.add(0, 5, 0), -1, 50);
this.spot.start(ShowAPIPlugin.getInstance());
}
@Override
public void run() {
if (posLoc == null) return;
try {
spot.moveStart(baseLoc);
spot.moveEnd(posLoc);
} catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
public void changePositionLocation(Location posLoc) {
this.posLoc = posLoc;
}
public synchronized void cancel() throws IllegalStateException {
spot.stop();
spots.remove(name);
super.cancel();
}
}
}

View file

@ -1,345 +0,0 @@
package nl.sbdeveloper.showapi.utils;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashSet;
import java.util.UUID;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
/**
* A whole class to create Guardian Beams by reflection </br>
* Inspired by the API <a href="https://www.spigotmc.org/resources/guardianbeamapi.18329">GuardianBeamAPI</a></br>
* <b>1.9 -> 1.16</b>
*
* @see <a href="https://github.com/SkytAsul/GuardianBeam">GitHub page</a>
* @author SkytAsul
*/
public class Laser {
private final int duration;
private final int distanceSquared;
private Location start;
private Location end;
private final Object createGuardianPacket;
private final Object createSquidPacket;
private final Object teamAddPacket;
private final Object destroyPacket;
private final Object metadataPacketGuardian;
private final Object metadataPacketSquid;
private final Object fakeGuardianDataWatcher;
private final int squid;
private final UUID squidUUID;
private final int guardian;
private final UUID guardianUUID;
private BukkitRunnable run;
private HashSet<Player> show = new HashSet<>();
/**
* Create a Laser instance
* @param start Location where laser will starts
* @param end Location where laser will ends
* @param duration Duration of laser in seconds (<i>-1 if infinite</i>)
* @param distance Distance where laser will be visible
*/
public Laser(Location start, Location end, int duration, int distance) throws ReflectiveOperationException {
this.start = start;
this.end = end;
this.duration = duration;
distanceSquared = distance * distance;
createSquidPacket = Packets.createPacketSquidSpawn(end);
squid = (int) Packets.getField(Packets.packetSpawn, "a", createSquidPacket);
squidUUID = (UUID) Packets.getField(Packets.packetSpawn, "b", createSquidPacket);
metadataPacketSquid = Packets.createPacketMetadata(squid, Packets.fakeSquidWatcher);
Packets.setDirtyWatcher(Packets.fakeSquidWatcher);
fakeGuardianDataWatcher = Packets.createFakeDataWatcher();
createGuardianPacket = Packets.createPacketGuardianSpawn(start, fakeGuardianDataWatcher, squid);
guardian = (int) Packets.getField(Packets.packetSpawn, "a", createGuardianPacket);
guardianUUID = (UUID) Packets.getField(Packets.packetSpawn, "b", createGuardianPacket);
metadataPacketGuardian = Packets.createPacketMetadata(guardian, fakeGuardianDataWatcher);
teamAddPacket = Packets.createPacketTeamAddEntities(squidUUID, guardianUUID);
destroyPacket = Packets.createPacketRemoveEntities(squid, guardian);
}
public void start(Plugin plugin) {
Validate.isTrue(run == null, "Task already started");
run = new BukkitRunnable() {
int time = duration;
@Override
public void run() {
try {
if (time == 0) {
cancel();
return;
}
for (Player p : start.getWorld().getPlayers()) {
if (isCloseEnough(p.getLocation())) {
if (!show.contains(p)) {
sendStartPackets(p);
show.add(p);
}
}else if (show.contains(p)) {
Packets.sendPacket(p, destroyPacket);
show.remove(p);
}
}
if (time != -1) time--;
}catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
@Override
public synchronized void cancel() throws IllegalStateException {
super.cancel();
try {
for (Player p : show) {
Packets.sendPacket(p, destroyPacket);
}
}catch (ReflectiveOperationException e) {
e.printStackTrace();
}
run = null;
}
};
run.runTaskTimerAsynchronously(plugin, 0L, 20L);
}
public void stop() {
Validate.isTrue(run != null, "Task not started");
run.cancel();
}
public void moveStart(Location location) throws ReflectiveOperationException {
this.start = location;
Object packet = Packets.createPacketMoveEntity(start, guardian);
for (Player p : show) {
Packets.sendPacket(p, packet);
}
}
public Location getStart() {
return start;
}
public void moveEnd(Location location) throws ReflectiveOperationException {
this.end = location;
Object packet = Packets.createPacketMoveEntity(end, squid);
for (Player p : show) {
Packets.sendPacket(p, packet);
}
}
public Location getEnd() {
return end;
}
public void callColorChange() throws ReflectiveOperationException{
for (Player p : show) {
Packets.sendPacket(p, metadataPacketGuardian);
}
}
public boolean isStarted() {
return run != null;
}
private void sendStartPackets(Player p) throws ReflectiveOperationException {
Packets.sendPacket(p, createSquidPacket);
Packets.sendPacket(p, createGuardianPacket);
if (Packets.version > 14) {
Packets.sendPacket(p, metadataPacketSquid);
Packets.sendPacket(p, metadataPacketGuardian);
}
Packets.sendPacket(p, Packets.packetTeamCreate);
Packets.sendPacket(p, teamAddPacket);
}
private boolean isCloseEnough(Location location) {
return start.distanceSquared(location) <= distanceSquared ||
end.distanceSquared(location) <= distanceSquared;
}
private static class Packets {
private static int lastIssuedEID = 2000000000;
static int generateEID() {
return lastIssuedEID++;
}
private static String nmsVersion = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
private static int version = Integer.parseInt(Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3].substring(1).split("_")[1]);
private static String npack = "net.minecraft.server." + Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3] + ".";
private static String cpack = Bukkit.getServer().getClass().getPackage().getName() + ".";
private static Object packetTeamCreate;
private static Constructor<?> watcherConstructor;
private static Method watcherSet;
private static Method watcherRegister;
private static Method watcherDirty;
private static Class<?> packetSpawn;
private static Class<?> packetRemove;
private static Class<?> packetTeleport;
private static Class<?> packetTeam;
private static Class<?> packetMetadata;
private static Object watcherObject1; // invisilibity
private static Object watcherObject2; // spikes
private static Object watcherObject3; // attack id
private static int squidID;
private static int guardianID;
private static Object fakeSquid;
private static Object fakeSquidWatcher;
static {
try {
String watcherName1 = null, watcherName2 = null, watcherName3 = null;
if (version < 13) {
watcherName1 = "Z";
watcherName2 = "bA";
watcherName3 = "bB";
squidID = 94;
guardianID = 68;
}else if (version == 13) {
watcherName1 = "ac";
watcherName2 = "bF";
watcherName3 = "bG";
squidID = 70;
guardianID = 28;
}else if (version == 14) {
watcherName1 = "W";
watcherName2 = "b";
watcherName3 = "bD";
squidID = 73;
guardianID = 30;
}else if (version == 15) {
watcherName1 = "T";
watcherName2 = "b";
watcherName3 = "bA";
squidID = 74;
guardianID = 31;
}else if (version == 16) {
if (nmsVersion.equals("v1_16_R3")) {
watcherName1 = "S";
} else {
watcherName1 = "T";
}
watcherName2 = "b";
watcherName3 = "d";
squidID = 74;
guardianID = 31;
}
watcherObject1 = getField(Class.forName(npack + "Entity"), watcherName1, null);
watcherObject2 = getField(Class.forName(npack + "EntityGuardian"), watcherName2, null);
watcherObject3 = getField(Class.forName(npack + "EntityGuardian"), watcherName3, null);
watcherConstructor = Class.forName(npack + "DataWatcher").getDeclaredConstructor(Class.forName(npack + "Entity"));
watcherSet = getMethod(Class.forName(npack + "DataWatcher"), "set");
watcherRegister = getMethod(Class.forName(npack + "DataWatcher"), "register");
if (version >= 15) watcherDirty = getMethod(Class.forName(npack + "DataWatcher"), "markDirty");
packetSpawn = Class.forName(npack + "PacketPlayOutSpawnEntityLiving");
packetRemove = Class.forName(npack + "PacketPlayOutEntityDestroy");
packetTeleport = Class.forName(npack + "PacketPlayOutEntityTeleport");
packetTeam = Class.forName(npack + "PacketPlayOutScoreboardTeam");
packetMetadata = Class.forName(npack + "PacketPlayOutEntityMetadata");
packetTeamCreate = packetTeam.newInstance();
setField(packetTeamCreate, "a", "noclip");
setField(packetTeamCreate, "i", 0);
setField(packetTeamCreate, "f", "never");
Object world = Class.forName(cpack + "CraftWorld").getDeclaredMethod("getHandle").invoke(Bukkit.getWorlds().get(0));
Object[] entityConstructorParams = version < 14 ? new Object[] { world } : new Object[] { Class.forName(npack + "EntityTypes").getDeclaredField("SQUID").get(null), world };
fakeSquid = getMethod(Class.forName(cpack + "entity.CraftSquid"), "getHandle").invoke(Class.forName(cpack + "entity.CraftSquid").getDeclaredConstructors()[0].newInstance(
null, Class.forName(npack + "EntitySquid").getDeclaredConstructors()[0].newInstance(
entityConstructorParams)));
fakeSquidWatcher = createFakeDataWatcher();
tryWatcherSet(fakeSquidWatcher, watcherObject1, (byte) 32);
}catch (ReflectiveOperationException e) {
e.printStackTrace();
}
}
public static void sendPacket(Player p, Object packet) throws ReflectiveOperationException {
Object entityPlayer = Class.forName(cpack + "entity.CraftPlayer").getDeclaredMethod("getHandle").invoke(p);
Object playerConnection = entityPlayer.getClass().getDeclaredField("playerConnection").get(entityPlayer);
playerConnection.getClass().getDeclaredMethod("sendPacket", Class.forName(npack + "Packet")).invoke(playerConnection, packet);
}
public static Object createFakeDataWatcher() throws ReflectiveOperationException {
Object watcher = watcherConstructor.newInstance(fakeSquid);
if (version > 13) setField(watcher, "registrationLocked", false);
return watcher;
}
public static void setDirtyWatcher(Object watcher) throws ReflectiveOperationException {
if (version >= 15) watcherDirty.invoke(watcher, watcherObject1);
}
public static Object createPacketSquidSpawn(Location location) throws ReflectiveOperationException {
Object packet = packetSpawn.newInstance();
setField(packet, "a", generateEID());
setField(packet, "b", UUID.randomUUID());
setField(packet, "c", squidID);
setField(packet, "d", location.getX());
setField(packet, "e", location.getY());
setField(packet, "f", location.getZ());
setField(packet, "j", (byte) (location.getYaw() * 256.0F / 360.0F));
setField(packet, "k", (byte) (location.getPitch() * 256.0F / 360.0F));
if (version <= 14) setField(packet, "m", fakeSquidWatcher);
return packet;
}
public static Object createPacketGuardianSpawn(Location location, Object watcher, int squidId) throws ReflectiveOperationException {
Object packet = packetSpawn.newInstance();
setField(packet, "a", generateEID());
setField(packet, "b", UUID.randomUUID());
setField(packet, "c", guardianID);
setField(packet, "d", location.getX());
setField(packet, "e", location.getY());
setField(packet, "f", location.getZ());
setField(packet, "j", (byte) (location.getYaw() * 256.0F / 360.0F));
setField(packet, "k", (byte) (location.getPitch() * 256.0F / 360.0F));
tryWatcherSet(watcher, watcherObject1, (byte) 32);
tryWatcherSet(watcher, watcherObject2, false);
tryWatcherSet(watcher, watcherObject3, squidId);
if (version <= 14) setField(packet, "m", watcher);
return packet;
}
public static Object createPacketRemoveEntities(int squidId, int guardianId) throws ReflectiveOperationException {
Object packet = packetRemove.newInstance();
setField(packet, "a", new int[] { squidId, guardianId });
return packet;
}
public static Object createPacketMoveEntity(Location location, int entityId) throws ReflectiveOperationException {
Object packet = packetTeleport.newInstance();
setField(packet, "a", entityId);
setField(packet, "b", location.getX());
setField(packet, "c", location.getY());
setField(packet, "d", location.getZ());
setField(packet, "e", (byte) (location.getYaw() * 256.0F / 360.0F));
setField(packet, "f", (byte) (location.getPitch() * 256.0F / 360.0F));
setField(packet, "g", true);
return packet;
}
public static Object createPacketTeamAddEntities(UUID squidUUID, UUID guardianUUID) throws ReflectiveOperationException {
Object packet = packetTeam.newInstance();
setField(packet, "a", "noclip");
setField(packet, "i", 3);
Collection<String> players = (Collection<String>) getField(packetTeam, "h", packet);
players.add(squidUUID.toString());
players.add(guardianUUID.toString());
return packet;
}
private static Object createPacketMetadata(int entityId, Object watcher) throws ReflectiveOperationException {
return packetMetadata.getConstructor(int.class, watcher.getClass(), boolean.class).newInstance(entityId, watcher, false);
}
private static void tryWatcherSet(Object watcher, Object watcherObject, Object watcherData) throws ReflectiveOperationException {
try {
watcherSet.invoke(watcher, watcherObject, watcherData);
}catch (InvocationTargetException ex) {
watcherRegister.invoke(watcher, watcherObject, watcherData);
if (version >= 15) watcherDirty.invoke(watcher, watcherObject);
}
}
/* Reflection utils */
private static Method getMethod(Class<?> clazz, String name) {
for (Method m : clazz.getDeclaredMethods()) {
if (m.getName().equals(name)) return m;
}
return null;
}
private static void setField(Object instance, String name, Object value) throws ReflectiveOperationException {
Validate.notNull(instance);
Field field = instance.getClass().getDeclaredField(name);
field.setAccessible(true);
field.set(instance, value);
}
private static Object getField(Class<?> clazz, String name, Object instance) throws ReflectiveOperationException {
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
return field.get(instance);
}
}
}

View file

@ -3,7 +3,6 @@ package nl.sbdeveloper.showapi.utils;
import nl.sbdeveloper.showapi.api.ShowCue;
import nl.sbdeveloper.showapi.api.TriggerTask;
import nl.sbdeveloper.showapi.api.TriggerType;
import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
@ -25,7 +24,7 @@ public class MainUtil {
builder.setName(ChatColor.ITALIC + "TimeCode: " + TimeUtil.makeReadable(point.getTime()));
List<String> lores = new ArrayList<>();
lores.add(ChatColor.GREEN + "Type: " + ChatColor.AQUA + StringUtils.capitalize(point.getTask().getType().name()));
lores.add(ChatColor.GREEN + "Type: " + ChatColor.AQUA + capitalize(point.getTask().getType().name()));
lores.add(ChatColor.GREEN + "Data:");
for (String str : ChatPaginator.paginate(point.getTask().getDataString(), 20).getLines()) {
lores.add(ChatColor.AQUA + ChatColor.stripColor(str));
@ -56,4 +55,8 @@ public class MainUtil {
return null;
}
}
public static String capitalize(String str) {
return str.substring(0, 1).toUpperCase() + str.substring(1);
}
}

View file

@ -1,16 +1,11 @@
package nl.sbdeveloper.showapi.utils;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.NotNull;
public class VersionUtil {
private static final int VERSION = Integer.parseInt(getMajorVersion(Bukkit.getVersion()).substring(2));
@NotNull
private static String getMajorVersion(String version) {
Validate.notEmpty(version, "Cannot get major Minecraft version from null or empty string");
// getVersion()
int index = version.lastIndexOf("MC:");
if (index != -1) {