An util to create easily Guardians and Ender Crystal Lasers via Packets and Reflection. No ProtocolLib, compatible from Minecraft 1.9 to Minecraft 1.17.1!
Inspired by the plugin GuardianBeamAPI by Jaxon A Brown, which uses ProtocolLib (https://www.spigotmc.org/resources/guardianbeamapi.18329/)
There is a tutorial on SpigotMC
First, copy the Laser.java class to your project.
Then, it's extremely simple:
- Create Location objects of where do you want your laser starts and ends.
- Create a Laser instance:
new GuardianLaser(locationStart, locationEnd, duration, visibleDistance)
- duration is the time (in seconds) when laser will be visible (if you set it to -1, the laser will exist infinitely), and visibleDistance is the amount of blocks where your laser will be visible. You can also usenew CrystalLaser(...)
to create an Ender Crystal laser. - After this, call the method
laser.start(plugin);
- where "plugin" parameter is the instance of your JavaPlugin class. - TA-DAAAM ! Your laser is created and shown to near players !
- You can move the laser with the methods
laser.moveStart(newLocation);
andlaser.moveEnd(newLocation);
- To remove your laser before his end duration, just call
laser.stop();
Here is something I quickly made to show what you can do with this API: a ray-gun.
You can see the system in action on this video, and the class is available here.
The Laser#moveStart(Location location, int ticks, Runnable callback
and Laser#moveEnd(Location location, int ticks, Runnable callback)
methods can be used to make the laser move smoothly from one point to another.
Quick preview of the smooth movement:
If you want to execute some actions when the laser comes to its end, use the Laser#executeEnd(Runnable runnable)
method.
i.e.:
new Laser(start, end, 10, 60).executeEnd(() -> Bukkit.broadcastMessage("Laser ended!")).start(plugin);
This will start a laser for 10 seconds, after that the message "Laser ended!" will be broadcasted to users.
The duration passed into the new Laser(Location start, Location end, int duration, int distance)
constructor is in seconds. If you want it to be in ticks, call Laser#durationInTicks()
.
i.e.:
new Laser(start, end, 10, 60).durationInTicks().start(plugin);
This will start a laser for 10 ticks.
Sometimes, Guardian beams only renders as bubbles, the moving color part is invisible. It is not caused by this util but by a Minecraft bug.
It happens when your world gets too old (when its game time value reaches 2800000).
The only way to fix it is to open the level.dat
file with a NBT editor, and edit manually the Data.Time
field to a lower value. Save the file, and start your server.