Sometimes there's weird blinking client side due to applying it repeatedly. Might need to improve some of the logic if its not being constantly reapplied.
[08:23:21 ERROR]: Nag author: 'Maxopoly' of 'Finale' about the following: This plugin is not properly shutting down its async tasks when it is being shut down. This task may throw errors during the final shutdown logs and might not complete before process dies.
The durability of every item of every player is being grabbed constantly, whether or not the player has their /config set to display durability. Scoreboard uses 1% of the server, and the vast majority of that is ScoreboardHUD.updateDurabilities(). Could be optimized by only updating durability if the player has it set to display in /config? Could also do it on a timer or something?
Previously that feature lived in Humbug (I think?). I think it's better suited here than in our own CTP fork, because we haven't been maintaining that at all.
Running /ally Hjaltland (maybe come up with a better command name) will use ProtocolLib to turn the chest plate and pants of all players on the group into green dyed armor and all of those not on the group into red dyed armor for the player. Properly respect if players are not wearing those armor pieces at all and tie usage to a permission, because it's effectively a bypass on listing members or member checking someone. Properly reset armor if its turned off.
Fire, cactus and similar will damage on every tick, need to implement custom invulnerability which separates damage from fire etc. from damage from other sources (getting hit, gravity etc.)
[13:46:55] [Protocol Worker #9 - Finale - [recv: BLOCK_DIG[class=PacketPlayInBlockDig, id=27], ARM_ANIMATION[class=PacketPlayInArmAnimation, id=44], USE_ENTITY[class=PacketPlayInUseEntity, id=14], send: ]/ERROR]: [Finale] Unhandled exception occured in onAsyncPacket$
java.lang.IllegalArgumentException: entityID cannot be negative
at org.apache.commons.lang.Validate.isTrue(Validate.java:136) ~[patched_1.16.4.jar:git-Paper-355]
at com.comphenix.protocol.injector.EntityUtilities.getEntityFromID(EntityUtilities.java:205) ~[?:?]
at com.comphenix.protocol.injector.PacketFilterManager.getEntityFromID(PacketFilterManager.java:851) ~[?:?]
at com.comphenix.protocol.wrappers.BukkitConverters$10.getSpecific(BukkitConverters.java:678) ~[?:?]
at com.comphenix.protocol.wrappers.BukkitConverters$10.getSpecific(BukkitConverters.java:663) ~[?:?]
at com.comphenix.protocol.reflect.StructureModifier.readInternal(StructureModifier.java:229) ~[?:?]
at com.comphenix.protocol.reflect.StructureModifier.read(StructureModifier.java:197) ~[?:?]
at com.github.maxopoly.finale.combat.AsyncPacketHandler.onPacketReceiving(AsyncPacketHandler.java:66) ~[?:?]
at com.comphenix.protocol.async.AsyncListenerHandler.processPacket(AsyncListenerHandler.java:642) ~[?:?]
at com.comphenix.protocol.async.AsyncListenerHandler.listenerLoop(AsyncListenerHandler.java:596) ~[?:?]
at com.comphenix.protocol.async.AsyncListenerHandler.access$200(AsyncListenerHandler.java:48) ~[?:?]
at com.comphenix.protocol.async.AsyncListenerHandler$2.run(AsyncListenerHandler.java:229) ~[?:?]
at com.comphenix.protocol.async.AsyncListenerHandler$3.run(AsyncListenerHandler.java:300) ~[?:?]
at org.bukkit.craftbukkit.v1_16_R3.scheduler.CraftTask.run(CraftTask.java:99) ~[patched_1.16.4.jar:git-Paper-355]
at org.bukkit.craftbukkit.v1_16_R3.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:54) ~[patched_1.16.4.jar:git-Paper-355]
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22) ~[patched_1.16.4.jar:git-Paper-355]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
at java.lang.Thread.run(Thread.java:834) [?:?]