Giter Club home page Giter Club logo

fairy's People

Contributors

aquaticlabs avatar fisher2911 avatar itsblockfighter avatar leegodsrc avatar lulu2002 avatar terminalsin avatar whizyyy avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

fairy's Issues

Custom item effects

Add custom attributes / listening capacity to items without causing a TPS leak:

  • CustomObject extends ItemStack
  • CustomObject listens to custom events (customobjectinteractevent, customobjectholderdamage event etc... only if it's in use-
  • CustomObject initialized when deserialized
  • Stores all the necessary data in NBT

Service Loading problem, Unspecified Modules in Maven

This error has occurred in other Services such as SerializerFactory

[15:54:18 INFO]: [Fairy] Enabling Fairy v0.5b59
[15:54:18 INFO]: ModuleService onPreInitialize
[15:54:18 INFO]: Registering module bukkit-xseries...
[15:54:20 INFO]: Registering module core-command...
[15:54:20 WARN]: java.lang.IllegalStateException: An exception has been thrown while scanning ContainerObject for dev.duaservices.bravo.fairy.command.CommandService
[15:54:20 WARN]:        at io.fairyproject.container.ContainerContext$ClassPathScanner.scan(ContainerContext.java:515)
[15:54:20 WARN]:        at io.fairyproject.module.ModuleService.registerByPath(ModuleService.java:265)
[15:54:20 WARN]:        at io.fairyproject.module.ModuleService.registerByName(ModuleService.java:154)
[15:54:20 WARN]:        at io.fairyproject.module.ModuleService.registerByPath(ModuleService.java:199)
[15:54:20 WARN]:        at io.fairyproject.module.ModuleService.registerByPath(ModuleService.java:166)
[15:54:20 WARN]:        at io.fairyproject.module.ModuleService$1.lambda$null$1(ModuleService.java:78)
[15:54:20 WARN]:        at java.util.ArrayList.forEach(ArrayList.java:1259)
[15:54:20 WARN]:        at io.fairyproject.module.ModuleService$1.lambda$onPluginInitial$2(ModuleService.java:75)
[15:54:20 WARN]:        at io.fairyproject.util.PreProcessBatch.flushQueue(PreProcessBatch.java:43)
[15:54:20 WARN]:        at io.fairyproject.module.ModuleService.onPostInitialize(ModuleService.java:136)
[15:54:20 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[15:54:20 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[15:54:20 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[15:54:20 WARN]:        at java.lang.reflect.Method.invoke(Method.java:498)
[15:54:20 WARN]:        at io.fairyproject.container.object.BaseContainerObject.call(BaseContainerObject.java:225)
[15:54:20 WARN]:        at io.fairyproject.container.object.BaseContainerObject.lifeCycle(BaseContainerObject.java:204)
[15:54:20 WARN]:        at io.fairyproject.container.ContainerContext.lifeCycle(ContainerContext.java:379)
[15:54:20 WARN]:        at io.fairyproject.container.ContainerContext$ClassPathScanner.scan(ContainerContext.java:635)
[15:54:20 WARN]:        at io.fairyproject.container.ContainerContext.init(ContainerContext.java:116)
[15:54:20 WARN]:        at io.fairyproject.FairyPlatform.enable(FairyPlatform.java:77)
[15:54:20 WARN]:        at io.fairyproject.bukkit.FairyBukkitPlatform.enable(FairyBukkitPlatform.java:96)
[15:54:20 WARN]:        at io.fairyproject.bukkit.plugin.FairyInternalPlugin.onEnable(FairyInternalPlugin.java:17)
[15:54:20 WARN]:        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321)
[15:54:20 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:332)
[15:54:20 WARN]:        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:404)
[15:54:20 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:359)
[15:54:20 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:318)
[15:54:20 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.s(MinecraftServer.java:408)
[15:54:20 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.k(MinecraftServer.java:372)
[15:54:20 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.a(MinecraftServer.java:327)
[15:54:20 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.init(DedicatedServer.java:267)
[15:54:20 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:563)
[15:54:20 WARN]:        at java.lang.Thread.run(Thread.java:748)
[15:54:20 WARN]: Caused by: java.lang.NullPointerException: The type dev.duaservices.bravo.fairy.command.CommandService doesn't have @Service annotation! []
[15:54:20 WARN]:        at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:229)
[15:54:20 WARN]:        at io.fairyproject.container.ContainerContext$ClassPathScanner.scan(ContainerContext.java:500)
[15:54:20 WARN]:        ... 32 more
[15:54:20 ERROR]: Unable to find dependency module core-command for bukkit-command

In the Maven Repository, there are some modules that don't have a version (unspecified) and the Framework wants to download them first. core-config

Player states

  • Optional inventory states
  • Metadata states
  • XP, Effects, permission (far fetched idea) states

Allows minigame makers, plugin devs etc to create mod mode, editor modes, etc... with a handful lines of code.

[Critical] Multihreaded classpath scanner still deadlocks

"Container Thread - 0@20350" daemon prio=5 tid=0x48 nid=NA waiting for monitor entry
  java.lang.Thread.State: BLOCKED
	 waiting for Server thread@12064 to release lock on <0x5516> (a org.bukkit.plugin.SimplePluginManager)
	  at org.bukkit.plugin.SimplePluginManager.getPlugin(SimplePluginManager.java:451)
	  at co.aikar.timings.TimingsManager.getCommandTiming(TimingsManager.java:156)
	  at org.bukkit.command.SimpleCommandMap.register(SimpleCommandMap.java:73)
	  at org.bukkit.command.SimpleCommandMap.register(SimpleCommandMap.java:65)
	  at dev.ghast.nftx.apeinvaders.arena.fairy.bukkit.command.BukkitCommandListener.onCommandInitial(BukkitCommandListener.java:39)
"Server thread@12064" prio=7 tid=0x1c nid=NA runnable
  java.lang.Thread.State: RUNNABLE
	 blocks Container Thread - 0@20350
	  at io.fairyproject.util.thread.BlockingThreadAwaitQueue.await(BlockingThreadAwaitQueue.java:57)
	  at io.fairyproject.container.scanner.ThreadedClassPathScanner.scanBlocking(ThreadedClassPathScanner.java:53)
	  at io.fairyproject.container.ContainerContext$1.onPluginEnable(ContainerContext.java:203)
	  at io.fairyproject.plugin.PluginManager.lambda$onPluginEnable$2(PluginManager.java:85)
	  at io.fairyproject.plugin.PluginManager$$Lambda$5367/0x0000000801e8f538.accept(Unknown Source:-1)
	  at java.lang.Iterable.forEach(Iterable.java:75)
	  at io.fairyproject.plugin.PluginManager.onPluginEnable(PluginManager.java:85)
	  - locked <0x5515> (a java.util.TreeSet)

[0.6] Remove Hot Loading and made Fairy work per plugin

Currently fairy uses hot loading to load libraries and modules
And fairy core is an independent core that doesn't rely on any other plugins
Although it sounds fantastic, but in the end it is very promblematic.

Reasons to remove hot loading:

  • Java 16+ by default closes the possibility to access some packages in jvm, which also closed the possibility to access URLClassLoader#addURL(). This is the most critical issue.
  • Due to how hot loading works, whenever you added a dependency that's built with fairy, you are in a risk to saw missing classes. such as the dependency has sidebar as their depended module, you wouldn't be able to access SidebarAdapter. (Even if you manually add sidebar as dependency, since every project relocates module, you still cannot access to it)

Reasons to made fairy work per plugin:

  • Versioning is way to complex at the moment.
    • Fairy platform jar at the moment does not automatically updated and it's independent core, there is currently no workaround to ensure modules version and platform version. if the module uses newer core function, it will break.
    • Even if it's automatically updated, if plugins or modules using outdated functions, it will break.
    • Making workaround to ensure versions work together is way too complex.

Advantages:

  • Java 16+ support.
  • Less plugin conflict.
  • Plugin will be able to specify core version that this plugin should use. Making plugin more maintainable.
  • Shading modules and core into plugin can ensure whenever other plugin depend on this plugin will not having missing classes.

Disadvantage:

  • Uber jar.
  • Multiple plugins development will require more workaround.

Works to do:

  • Work on bootstrap system, library loader system and gradle plugin to made them work with new design.
  • Reduce unnecessary libraries to ensure the final uber jar wouldn't be that huge.
  • Made module memories current core version, reject plugin from using the modules whenever core version is out-dated.

Remove container life cycle usage from fairy itself

There are a lot of places where @Service and @Obj were used internally in fairy framework.
But IMO now it's a bad practice which container life cycle should only be used by plugins.
Using it in framework it self kinda make everything more complex and harder to develop.

Action bar module

  • Updatable action bar like the sidebar component
  • Tickable, destroyable etc...
  • Separate module as opposed to being a single method in NormalImplementation

Improve ItemBuilder

ItemBuilder is an important feature in bukkit item module.
But it currently lack some really quality of life features.

Such as the support of adventure Component to be used in display name and lores.
And an ItemMeta transformation lambda method.

Multiple Subscriber register error

This error occurs when there are multiple @Subscribe for the same event.
Like if you use the Sidebar, Tablist module.

[19:00:20 ERROR]: [io.fairyproject.event.EventBus] An error occurs while subscribing event
java.lang.IllegalArgumentException: The subscriber has already been registered. (class io.fairyproject.mc.event.MCPlayerJoinEvent)
	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:145) ~[guava-31.0.1-jre.jar:?]
	at io.fairyproject.event.Subscribers.register(Subscribers.java:59) ~[bukkit-platform.jar:?]
	at io.fairyproject.event.EventBus.subscribe(EventBus.java:74) ~[bukkit-platform.jar:?]
	at io.fairyproject.event.EventBus.subscribeAll(EventBus.java:62) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.controller.SubscribeEventContainerController.applyContainerObject(SubscribeEventContainerController.java:11) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.ContainerContext$ClassPathScanner.scan(ContainerContext.java:627) ~[bukkit-platform.jar:?]
	at io.fairyproject.module.ModuleService.registerByPath(ModuleService.java:249) ~[bukkit-platform.jar:?]
	at io.fairyproject.module.ModuleService$1.lambda$onPluginInitial$1(ModuleService.java:99) ~[bukkit-platform.jar:?]
	at java.util.ArrayList.forEach(ArrayList.java:1511) ~[?:?]
	at io.fairyproject.module.ModuleService$1.lambda$onPluginInitial$2(ModuleService.java:97) ~[bukkit-platform.jar:?]
	at io.fairyproject.util.PreProcessBatch.flushQueue(PreProcessBatch.java:43) ~[bukkit-platform.jar:?]
	at io.fairyproject.module.ModuleService.onPostInitialize(ModuleService.java:193) ~[bukkit-platform.jar:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
	at io.fairyproject.container.object.BaseContainerObject.call(BaseContainerObject.java:225) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.object.BaseContainerObject.lifeCycle(BaseContainerObject.java:204) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.ContainerContext.lifeCycle(ContainerContext.java:397) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.ContainerContext$ClassPathScanner.scan(ContainerContext.java:653) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.ContainerContext.init(ContainerContext.java:120) ~[bukkit-platform.jar:?]
	at io.fairyproject.FairyPlatform.enable(FairyPlatform.java:77) ~[bukkit-platform.jar:?]
	at io.fairyproject.bukkit.FairyBukkitPlatform.enable(FairyBukkitPlatform.java:99) ~[bukkit-platform.jar:?]
	at io.fairyproject.bukkit.plugin.FairyInternalPlugin.onEnable(FairyInternalPlugin.java:18) ~[bukkit-platform.jar:?]
	at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:500) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugin(CraftServer.java:563) ~[paper-1.18.1.jar:git-Paper-68]
	at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugins(CraftServer.java:477) ~[paper-1.18.1.jar:git-Paper-68]
	at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:727) ~[paper-1.18.1.jar:git-Paper-68]
	at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:503) ~[paper-1.18.1.jar:git-Paper-68]
	at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:313) ~[paper-1.18.1.jar:git-Paper-68]
	at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1202) ~[paper-1.18.1.jar:git-Paper-68]
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:317) ~[paper-1.18.1.jar:git-Paper-68]
	at java.lang.Thread.run(Thread.java:833) ~[?:?]
[19:00:20 ERROR]: [io.fairyproject.event.EventBus] An error occurs while subscribing event
java.lang.IllegalArgumentException: The subscriber has already been registered. (class io.fairyproject.mc.event.MCPlayerQuitEvent)
	at com.google.common.base.Preconditions.checkArgument(Preconditions.java:145) ~[guava-31.0.1-jre.jar:?]
	at io.fairyproject.event.Subscribers.register(Subscribers.java:59) ~[bukkit-platform.jar:?]
	at io.fairyproject.event.EventBus.subscribe(EventBus.java:74) ~[bukkit-platform.jar:?]
	at io.fairyproject.event.EventBus.subscribeAll(EventBus.java:62) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.controller.SubscribeEventContainerController.applyContainerObject(SubscribeEventContainerController.java:11) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.ContainerContext$ClassPathScanner.scan(ContainerContext.java:627) ~[bukkit-platform.jar:?]
	at io.fairyproject.module.ModuleService.registerByPath(ModuleService.java:249) ~[bukkit-platform.jar:?]
	at io.fairyproject.module.ModuleService$1.lambda$onPluginInitial$1(ModuleService.java:99) ~[bukkit-platform.jar:?]
	at java.util.ArrayList.forEach(ArrayList.java:1511) ~[?:?]
	at io.fairyproject.module.ModuleService$1.lambda$onPluginInitial$2(ModuleService.java:97) ~[bukkit-platform.jar:?]
	at io.fairyproject.util.PreProcessBatch.flushQueue(PreProcessBatch.java:43) ~[bukkit-platform.jar:?]
	at io.fairyproject.module.ModuleService.onPostInitialize(ModuleService.java:193) ~[bukkit-platform.jar:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
	at io.fairyproject.container.object.BaseContainerObject.call(BaseContainerObject.java:225) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.object.BaseContainerObject.lifeCycle(BaseContainerObject.java:204) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.ContainerContext.lifeCycle(ContainerContext.java:397) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.ContainerContext$ClassPathScanner.scan(ContainerContext.java:653) ~[bukkit-platform.jar:?]
	at io.fairyproject.container.ContainerContext.init(ContainerContext.java:120) ~[bukkit-platform.jar:?]
	at io.fairyproject.FairyPlatform.enable(FairyPlatform.java:77) ~[bukkit-platform.jar:?]
	at io.fairyproject.bukkit.FairyBukkitPlatform.enable(FairyBukkitPlatform.java:99) ~[bukkit-platform.jar:?]
	at io.fairyproject.bukkit.plugin.FairyInternalPlugin.onEnable(FairyInternalPlugin.java:18) ~[bukkit-platform.jar:?]
	at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:370) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:500) ~[paper-api-1.18.1-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugin(CraftServer.java:563) ~[paper-1.18.1.jar:git-Paper-68]
	at org.bukkit.craftbukkit.v1_18_R1.CraftServer.enablePlugins(CraftServer.java:477) ~[paper-1.18.1.jar:git-Paper-68]
	at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:727) ~[paper-1.18.1.jar:git-Paper-68]
	at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:503) ~[paper-1.18.1.jar:git-Paper-68]
	at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:313) ~[paper-1.18.1.jar:git-Paper-68]
	at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1202) ~[paper-1.18.1.jar:git-Paper-68]
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:317) ~[paper-1.18.1.jar:git-Paper-68]
	at java.lang.Thread.run(Thread.java:833) ~[?:?]

Improve menu api

Desired traits:

  • Pass the menu reference in onClose and onOpen
  • Improved handling. As of right now it is extremely chunky and can have issues with reopenings etc...

NoSuchFileException error on compiling unit test

Caused by: java.nio.file.NoSuchFileException: /mnt/disk/ideaProjects/_imanity/untitled/build/classes/java/test/MODULE.class
	at io.fairyproject.gradle.FairyTestTask.afterTestClasses(FairyTestTask.java:39)
	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
	... 118 more

platform: APP
modules: discord, command

This error doesn't affect the actual file compiled but unit test is not working

@Cacheable Aspect compile error

Reproduce:

Enable CacheableAspect in core platform
Compile project that uses fairy with CacheableAspect enabled
The error appears and compile failed

Extra Info:

The error only happens after shadowJar, which means the default build jar will not cause the error for some reason??

Current Solution:

Removed @Cacheable

Error:

---- AspectJ Properties ---
AspectJ Compiler 1.9.7 built on Thursday Jun 24, 2021 at 16:14:45 PDT
---- Dump Properties ---
Dump file: ajcore.20220223.153957.254.txt
Dump reason: org.aspectj.weaver.BCException
Dump on exception: true
Dump at exit condition: abort
---- Exception Information ---
---- System Properties ---
java.runtime.name=OpenJDK Runtime Environment
sun.boot.library.path=/usr/lib/jvm/java-8-openjdk/jre/lib/amd64
java.vm.version=25.292-b10
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=:
java.vm.name=OpenJDK 64-Bit Server VM
file.encoding.pkg=sun.io
sun.java.launcher=SUN_STANDARD
user.country=TW
sun.os.patch.level=unknown
java.vm.specification.name=Java Virtual Machine Specification
user.dir=/mnt/disk/ideaProjects/_fairy/main/test-plugin
java.runtime.version=1.8.0_292-b10
java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment
java.endorsed.dirs=/usr/lib/jvm/java-8-openjdk/jre/lib/endorsed
os.arch=amd64
java.io.tmpdir=/tmp
line.separator=

java.vm.specification.vendor=Oracle Corporation
user.variant=
os.name=Linux
sun.jnu.encoding=UTF-8
java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
os.version=5.10.84-1-MANJARO
user.home=/home/lee
user.timezone=Asia/Ho_Chi_Minh
java.awt.printerjob=sun.print.PSPrinterJob
file.encoding=UTF-8
java.specification.version=1.8
java.class.path=/home/lee/.gradle/caches/modules-2/files-2.1/org.aspectj/aspectjtools/1.9.7/1eb5dbd0fe0fcf7b93b149127b0604c482f46aec/aspectjtools-1.9.7.jar
user.name=lee
java.vm.specification.version=1.8
sun.java.command=org.aspectj.tools.ajc.Main -argfile /mnt/disk/ideaProjects/_fairy/main/test-plugin/build/tmp/compileJava/ajc.options
java.home=/usr/lib/jvm/java-8-openjdk/jre
sun.arch.data.model=64
user.language=zh
java.specification.vendor=Oracle Corporation
awt.toolkit=sun.awt.X11.XToolkit
java.vm.info=mixed mode
java.version=1.8.0_292
java.ext.dirs=/usr/lib/jvm/java-8-openjdk/jre/lib/ext:/usr/java/packages/lib/ext
sun.boot.class.path=/usr/lib/jvm/java-8-openjdk/jre/lib/resources.jar:/usr/lib/jvm/java-8-openjdk/jre/lib/rt.jar:/usr/lib/jvm/java-8-openjdk/jre/lib/sunrsasign.jar:/usr/lib/jvm/java-8-openjdk/jre/lib/jsse.jar:/usr/lib/jvm/java-8-openjdk/jre/lib/jce.jar:/usr/lib/jvm/java-8-openjdk/jre/lib/charsets.jar:/usr/lib/jvm/java-8-openjdk/jre/lib/jfr.jar:/usr/lib/jvm/java-8-openjdk/jre/classes
java.vendor=Oracle Corporation
file.separator=/
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.io.unicode.encoding=UnicodeLittle
sun.cpu.endian=little
sun.cpu.isalist=
---- Command Line ---
-argfile
/mnt/disk/ideaProjects/_fairy/main/test-plugin/build/tmp/compileJava/ajc.options
---- Full Classpath ---
Empty
---- Compiler Messages ---
abort ABORT -- (BCException) malformed org.aspectj.weaver.EffectiveSignature attribute (length:27)org.aspectj.weaver.BCException: Bad type signature (Lio/fairyproject/cache/CacheableAspect;)Ljava/lang/Runnable;
when batch building BuildConfig[null] #Files=0 AopXmls=#0

when batch building BuildConfig[null] #Files=0 AopXmls=#0

malformed org.aspectj.weaver.EffectiveSignature attribute (length:27)org.aspectj.weaver.BCException: Bad type signature (Lio/fairyproject/cache/CacheableAspect;)Ljava/lang/Runnable;
when batch building BuildConfig[null] #Files=0 AopXmls=#0

when batch building BuildConfig[null] #Files=0 AopXmls=#0

org.aspectj.weaver.BCException: malformed org.aspectj.weaver.EffectiveSignature attribute (length:27)org.aspectj.weaver.BCException: Bad type signature (Lio/fairyproject/cache/CacheableAspect;)Ljava/lang/Runnable;
when batch building BuildConfig[null] #Files=0 AopXmls=#0

when batch building BuildConfig[null] #Files=0 AopXmls=#0

	at org.aspectj.weaver.AjAttribute.read(AjAttribute.java:137)
	at org.aspectj.weaver.bcel.Utility.readAjAttributes(Utility.java:102)
	at org.aspectj.weaver.bcel.BcelMethod.unpackAjAttributes(BcelMethod.java:197)
	at org.aspectj.weaver.bcel.BcelMethod.<init>(BcelMethod.java:91)
	at org.aspectj.weaver.bcel.BcelObjectType.getDeclaredMethods(BcelObjectType.java:290)
	at org.aspectj.weaver.ReferenceType.getDeclaredMethods(ReferenceType.java:870)
	at org.aspectj.weaver.ResolvedType.getDeclaredAdvice(ResolvedType.java:1028)
	at org.aspectj.weaver.ResolvedType.getDeclaredShadowMungers(ResolvedType.java:1068)
	at org.aspectj.weaver.ResolvedType.collectShadowMungers(ResolvedType.java:868)
	at org.aspectj.weaver.ResolvedType.collectCrosscuttingMembers(ResolvedType.java:794)
	at org.aspectj.weaver.CrosscuttingMembersSet.addOrReplaceAspect(CrosscuttingMembersSet.java:112)
	at org.aspectj.weaver.CrosscuttingMembersSet.addOrReplaceAspect(CrosscuttingMembersSet.java:67)
	at org.aspectj.weaver.bcel.BcelWeaver.addLibraryJarFile(BcelWeaver.java:241)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.initBcelWorld(AjBuildManager.java:868)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:252)
	at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:188)
	at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:103)
	at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:47)
	at org.aspectj.tools.ajc.Main.run(Main.java:372)
	at org.aspectj.tools.ajc.Main.runMain(Main.java:250)
	at org.aspectj.tools.ajc.Main.main(Main.java:84)

Cleanup static initialized instances

There are places where instances / classes were initialized staticly
Which is a extremely bad practice for a framework that should be reloadable.
We could have a global class that stores all instances and have load() and unload() in it.

Made ComponentRegistry capable of handling multiples

At the moment each component are only being applied with 1 ComponentRegistry
It will restricted because ComponentRegistry handles constructor
But it is so unnecessary and useless, so rather remove it for much better flexibility for current component usage

NPC

Adding back the module for creating NPCs.

Developer Tools

Why

In-game testing in Fairy has been a bit of a hassle on the Bukkit platform. The best you could do previously was using a Gradle plugin like RunDev to automate the process of compiling and dragging the JAR around. There are some design flaws and lacks of tools that result in this:

  1. The ability to reload is not guaranteed.
  2. It assumes users always relocate fairy (which you can't when in hotswap environment).
  3. The only way to "restart the container" is to reload or reboot the server.
  4. RunDev doesn't work with hotswap.

The end goal should be easy accessibility to hotswap, multiple kinds of reloading, and fewer plugins to simply test your plugin. Obviously, this proposal is for in-game tests, unit tests will be another topic.


Solution

To achieve this goal, I propose a few framework changes and introduce developer tools (highly inspired by Spring Boot).

Framework Changes

  • Add the ability to customize the Fairy class path in the plugin (for more flexibility and so it doesn't assume you always relocated it).
  • Make sure Bukkit reload works in most cases.

Developer Tools

  • Ability to single line Restarter.restart(plugin) which restarts the plugin's lifecycle. (CORE)
  • A source file watcher that will hot reload the plugin whenever it detects changes from source file (aka Build in IDE). (CORE)
  • Built-in one-click in-game test environment (just like run-paper but better support with hotswapping). (BUKKIT)
  • When triggering a hot reload on a bukkit plugin, it should unload the plugin completely from bukkit and load it back. (BUKKIT)
  • DCEVM hotswap agent should have an option to enable/disable hot reload on source file change detected. (since some hotswap changes may not necessary require a full hot reload.) (CORE)
  • In game command to hot reload the plugin. (BUKKIT)
  • All of the above should be built with multi-module projects in mind so you can hotswap your different modules with the same test environment. (CORE)

Others

These changes should dramatically improve the flow of in-game testing with Fairy.

RedisService problem

When I turn on Redis I get the following error:

[21:15:20 WARN]: java.lang.reflect.InvocationTargetException
[21:15:20 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[21:15:20 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[21:15:20 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[21:15:20 WARN]:        at java.lang.reflect.Method.invoke(Method.java:498)
[21:15:20 WARN]:        at org.fairy.bean.details.GenericBeanDetails.call(GenericBeanDetails.java:210)
[21:15:20 WARN]:        at org.fairy.bean.BeanContext.call(BeanContext.java:551)
[21:15:20 WARN]:        at org.fairy.bean.BeanContext.scanClasses(BeanContext.java:507)
[21:15:20 WARN]:        at org.fairy.bean.BeanContext.init(BeanContext.java:97)
[21:15:20 WARN]:        at org.fairy.FairyBootstrap.enable(FairyBootstrap.java:81)
[21:15:20 WARN]:        at org.fairy.bukkit.FairyBukkitPlatform.onEnable(FairyBukkitPlatform.java:80)
[21:15:20 WARN]:        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321)
[21:15:20 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:332)
[21:15:20 WARN]:        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:404)
[21:15:20 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:359)
[21:15:20 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:318)
[21:15:20 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.init(DedicatedServer.java:203)
[21:15:20 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:563)
[21:15:20 WARN]:        at java.lang.Thread.run(Thread.java:748)
[21:15:20 WARN]: Caused by: java.lang.NoSuchMethodError: org.redisson.codec.JsonJacksonCodec.<init>(Lcom/fasterxml/jackson/databind/ObjectMapper;)V
[21:15:20 WARN]:        at org.fairy.redis.RedisService.preInit(RedisService.java:64)
[21:15:20 WARN]:        ... 18 more
[21:15:21 WARN]: java.lang.NullPointerException
[21:15:21 WARN]:        at org.fairy.redis.RedisService.getKeys(RedisService.java:85)
[21:15:21 WARN]:        at org.fairy.redis.server.thread.FetchThread.fetch(FetchThread.java:64)
[21:15:21 WARN]:        at org.fairy.redis.server.thread.FetchThread.run(FetchThread.java:50)
[21:15:21 WARN]: java.lang.reflect.InvocationTargetException
[21:15:21 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[21:15:21 WARN]:        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[21:15:21 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[21:15:21 WARN]:        at java.lang.reflect.Method.invoke(Method.java:498)
[21:15:21 WARN]:        at org.fairy.bean.details.GenericBeanDetails.call(GenericBeanDetails.java:210)
[21:15:21 WARN]:        at org.fairy.bean.BeanContext.call(BeanContext.java:551)
[21:15:21 WARN]:        at org.fairy.bean.BeanContext.scanClasses(BeanContext.java:543)
[21:15:21 WARN]:        at org.fairy.bean.BeanContext.init(BeanContext.java:97)
[21:15:21 WARN]:        at org.fairy.FairyBootstrap.enable(FairyBootstrap.java:81)
[21:15:21 WARN]:        at org.fairy.bukkit.FairyBukkitPlatform.onEnable(FairyBukkitPlatform.java:80)
[21:15:21 WARN]:        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321)
[21:15:21 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:332)
[21:15:21 WARN]:        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:404)
[21:15:21 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:359)
[21:15:21 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:318)
[21:15:21 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.init(DedicatedServer.java:203)
[21:15:21 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:563)
[21:15:21 WARN]:        at java.lang.Thread.run(Thread.java:748)
[21:15:21 WARN]: Caused by: java.lang.NullPointerException
[21:15:21 WARN]:        at org.fairy.redis.subscription.RedisPubSub.<init>(RedisPubSub.java:42)
[21:15:21 WARN]:        at org.fairy.redis.message.MessageService.init(MessageService.java:77)
[21:15:21 WARN]:        ... 18 more
[21:15:21 WARN]: java.lang.NullPointerException
[21:15:21 WARN]:        at org.fairy.redis.RedisService.getMap(RedisService.java:81)
[21:15:21 WARN]:        at org.fairy.redis.server.thread.PushThread.push(PushThread.java:75)
[21:15:21 WARN]:        at org.fairy.redis.server.thread.PushThread.run(PushThread.java:49)

TimerService loop broken when any of the timer throws exception

    @Command("launch-failed-timer")
    fun launchFailedTimer(ctx: BukkitCommandContext) {
        FailedTimer().start()
    }

    class FailedTimer : ServerTimer(1000) {

        override fun onStart() {
            Bukkit.broadcastMessage("Starting failed timer")
        }

        override fun onElapsed() {
            Bukkit.broadcastMessage("Elapsed failed timer")
            throw RuntimeException("Failed timer")
        }
    }

This is the sample code of how to make server timer broken, and it also not throw any exception so server owner will not notice at all

[10:43:24 INFO]: Starting failed timer
<no any error message being printed>
[10:43:25 INFO]: Elapsed failed timer

Maven suggestion

Hello,
Is it possible to add in the future the ability to user Maven ?

Thanks for reading me

Fix Java 22 Support

[19:47:48] [Server thread/ERROR]: Error occurred while enabling fairy-lib-plugin v0.7.4b1-SNAPSHOT (Is it up to date?)
java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: Could not initialize class io.fairyproject.reflect.Reflect
	at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:396) ~[?:?]
	at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:2073) ~[?:?]
	at io.fairyproject.util.exceptionally.ThrowingRunnable.lambda$sneaky$1(ThrowingRunnable.java:39) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.node.loader.ContainerNodeLoader.load(ContainerNodeLoader.java:85) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.ContainerContext.loadContainerNode(ContainerContext.java:140) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.RootNodeLoader.loadNode(RootNodeLoader.java:55) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.RootNodeLoader.load(RootNodeLoader.java:49) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.ContainerContext.init(ContainerContext.java:98) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.FairyPlatform.enable(FairyPlatform.java:85) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.bukkit.FairyBukkitPlatform.enable(FairyBukkitPlatform.java:98) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.library.bootstrap.platform.AbstractPlatformBootstrap.enable(AbstractPlatformBootstrap.java:74) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.library.bootstrap.bukkit.BukkitPlugin.onEnable(BukkitPlugin.java:89) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:281) ~[paper-api-1.20.4-R0.1-SNAPSHOT.jar:?]
	at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:190) ~[paper-1.20.4.jar:git-Paper-399]
	at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:104) ~[paper-1.20.4.jar:git-Paper-399]
	at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:507) ~[paper-api-1.20.4-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.craftbukkit.v1_20_R3.CraftServer.enablePlugin(CraftServer.java:637) ~[paper-1.20.4.jar:git-Paper-399]
	at org.bukkit.craftbukkit.v1_20_R3.CraftServer.enablePlugins(CraftServer.java:548) ~[paper-1.20.4.jar:git-Paper-399]
	at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:671) ~[paper-1.20.4.jar:git-Paper-399]
	at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:431) ~[paper-1.20.4.jar:git-Paper-399]
	at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:308) ~[paper-1.20.4.jar:git-Paper-399]
	at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1130) ~[paper-1.20.4.jar:git-Paper-399]
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:319) ~[paper-1.20.4.jar:git-Paper-399]
	at java.lang.Thread.run(Thread.java:1570) ~[?:?]
Caused by: java.lang.NoClassDefFoundError: Could not initialize class io.fairyproject.reflect.Reflect
	at io.fairyproject.container.processor.injection.AutowiredAnnotationProcessor.lambda$injectAutowiredField$2(AutowiredAnnotationProcessor.java:114) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:757) ~[?:?]
	at java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:735) ~[?:?]
	at java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:2214) ~[?:?]
	at io.fairyproject.container.processor.injection.AutowiredAnnotationProcessor.injectAutowiredField(AutowiredAnnotationProcessor.java:111) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.processor.injection.AutowiredAnnotationProcessor.processPreInitialization(AutowiredAnnotationProcessor.java:79) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.node.loader.ContainerNodeLoader.lambda$callPreInitProcessors$0(ContainerNodeLoader.java:134) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.node.loader.ContainerNodeLoader.callPreInitProcessors(ContainerNodeLoader.java:136) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.node.loader.ContainerNodeLoader.lambda$directlyCompose$10(ContainerNodeLoader.java:275) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150) ~[?:?]
	at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:[482](https://mclo.gs/chL4jyS#L482)) ~[?:?]
	at io.fairyproject.util.thread.BlockingThreadAwaitQueue.await(BlockingThreadAwaitQueue.java:46) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.node.loader.ContainerNodeLoader.load(ContainerNodeLoader.java:84) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	... 20 more
Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.IllegalStateException: Unsafe not found [in thread "Server thread"]
	at io.fairyproject.reflect.Reflect.<clinit>(Reflect.java:58) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.processor.injection.AutowiredAnnotationProcessor.lambda$injectAutowiredField$2(AutowiredAnnotationProcessor.java:114) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at java.util.concurrent.CompletableFuture.uniAcceptNow(CompletableFuture.java:757) ~[?:?]
	at java.util.concurrent.CompletableFuture.uniAcceptStage(CompletableFuture.java:735) ~[?:?]
	at java.util.concurrent.CompletableFuture.thenAccept(CompletableFuture.java:2214) ~[?:?]
	at io.fairyproject.container.processor.injection.AutowiredAnnotationProcessor.injectAutowiredField(AutowiredAnnotationProcessor.java:111) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.processor.injection.AutowiredAnnotationProcessor$NodeContext.injectStaticFields(AutowiredAnnotationProcessor.java:131) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.processor.injection.AutowiredAnnotationProcessor.processNodePreInitialization(AutowiredAnnotationProcessor.java:103) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at io.fairyproject.container.node.loader.ContainerNodeLoader.callNodePreInitProcessors(ContainerNodeLoader.java:91) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	at java.util.concurrent.CompletableFuture.uniRunNow(CompletableFuture.java:819) ~[?:?]
	at java.util.concurrent.CompletableFuture.uniRunStage(CompletableFuture.java:803) ~[?:?]
	at java.util.concurrent.CompletableFuture.thenRun(CompletableFuture.java:2227) ~[?:?]
	at io.fairyproject.container.node.loader.ContainerNodeLoader.load(ContainerNodeLoader.java:78) ~[fairy-lib-plugin-0.7.4b1-SNAPSHOT-all.jar:?]
	... 20 more

sub-command help display error on multiple alias

There is a bug in command system where help display the same arg on help when you have 2 alias in the same sub-command

Image

    @Command({"list", "all"})
    public void list(BukkitCommandContext context) {
        new ArenaListMenu().open(context.getPlayer());
    }

    @Command({"create", "setup"})
    public void create(BukkitCommandContext context, @Arg("name") String name) {

    }

Move entire MC-Protocol to MC-Platform

any feature related to packets were originally moved into an independent module called MC-Protocol because it shades packetevents
And I wanted to try reduce the overall size of the core platforms.
But then I realized how commonly it is used and it doesn't make sense to separate the logic of sending and handling packets.
It would make more sense to have them directly in core platforms.

BukkitTestingBase supports tear down for each test

Currently, we got BukkitTestingBase for init tests, but since it uses "@BeforeAll" for setting up, this means the data previous testing uses, might leaking to next one and cause testing fails.

It's good to have an option for reload plugins, making clean environment for testing.

image

Storage module with mongo leads to collision

Stack trace;

[04:57:53 INFO]: [Fairy] Enabling Fairy v0.5.1b12
[04:57:54 INFO]: Loaded Library mariadb-java-client v2.7.0
[04:57:54 INFO]: Loaded Library h2 v1.4.199
[04:57:54 INFO]: Loaded Library HikariCP v3.4.5
[04:57:54 INFO]: Loaded Library postgresql v9.4.1212
[04:57:54 INFO]: Loaded Library mysql-connector-java v8.0.22
[04:57:54 INFO]: Loaded Library byte-buddy v1.10.9
[04:57:54 INFO]: Loaded Library mysql-connector-java v8.0.22
[04:57:54 INFO]: Loaded Library mariadb-java-client v2.7.0
[04:57:54 INFO]: Loaded Library HikariCP v3.4.5
[04:57:54 INFO]: Loaded Library postgresql v9.4.1212
[04:57:54 INFO]: Loaded Library h2 v1.4.199
[04:57:54 INFO]: Loaded Library byte-buddy v1.10.9
[04:57:54 ERROR]: Something wrong will scanning component for dev.ghast.nftx.apeinvaders.arena.fairy.mysql.pojo.impl.UUIDObjectSerializer
java.lang.IllegalArgumentException: The Serializer for java.util.UUID already exists!
        at io.fairyproject.container.SerializerFactory$1.newInstance(SerializerFactory.java:72) ~[?:?]
        at io.fairyproject.container.ComponentRegistry.scanComponents(ComponentRegistry.java:87) ~[?:?]
        at io.fairyproject.container.scanner.ThreadedClassPathScanner.scanComponentAndInjection(ThreadedClassPathScanner.java:63) ~[?:?]
        at io.fairyproject.container.scanner.ThreadedClassPathScanner.lambda$directlyCompose$9(ThreadedClassPathScanner.java:126) ~[?:?]
        at java.util.concurrent.CompletableFuture.uniCompose(CompletableFuture.java:966) [?:1.8.0_282]
        at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:940) [?:1.8.0_282]
        at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:488) [?:1.8.0_282]
        at java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1646) [?:1.8.0_282]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_282]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_282]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_282]

Should be pretty self-explanatory

[Docs] Documentation Todo

  • Add documentation for the Discord module
  • Add documentation for the Config module
  • Detail more the MySQL storage component
  • Work on some good examples

I'll try helping out as much as possible,
Much love,

  • Ghast

Maven

Is it possible to add maven to the project?

Fix deprecated aikar timings warning

[11:23:57 WARN]: Plugin 'plugin' is creating timing 'dev.ghast.bossraid.fairy.bukkit.listener.events.EventSubscribeBuilder$$Lambda$5601/0x0000000802134bc0' - this is deprecated behavior, please report it to the authors: 
[11:23:57 WARN]: Plugin 'plugin' is creating timing 'Task: java.util.concurrent.CompletableFuture.AsyncSupply (Single)' - this is deprecated behavior, please report it to the authors: 
[11:23:57 WARN]: Plugin 'plugin' is creating timing 'dev.ghast.bossraid.fairy.bukkit.listener.events.EventSubscribeBuilder$$Lambda$5601/0x0000000802134bc0' - this is deprecated behavior, please report it to the authors: 
[11:23:57 WARN]: Plugin 'plugin' is creating timing 'Task: java.util.concurrent.CompletableFuture.AsyncSupply (Single)' - this is deprecated behavior, please report it to the authors: 

Maven repository for FAWE is down, replace by uploading artifact to Imanity git

Could not download fawe-api-latest.jar (com.boydti:fawe-api:latest)
Could not get resource 'https://ci.athion.net/job/FastAsyncWorldEdit/ws/mvn/com/boydti/fawe-api/latest/fawe-api-latest.jar'.
Could not HEAD 'https://ci.athion.net/job/FastAsyncWorldEdit/ws/mvn/com/boydti/fawe-api/latest/fawe-api-latest.jar'. Received status code 403 from server: Forbidden

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html

Yay...

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.