Code Monkey home page Code Monkey logo

playerbalancer's Introduction

PlayerBalancer

Overview

Welcome to the PlayerBalancer repo! This resource helps balance players between servers in your network. This resource also has an API which allows for you to take handling to the next level. You can view the resource here and the addon resource here.

Issue Reporting/Support

While you may report issues via the "Issues" tab I recommend putting them on our Discord as it will be a faster response.

Build

  • Clone this repository
  • Build with maven

playerbalancer's People

Contributors

bghddevelopment avatar dependabot[bot] avatar happyareabean avatar jamezrin avatar refrac avatar sgdc3 avatar simonsator avatar yurinann 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

Watchers

 avatar  avatar  avatar  avatar

playerbalancer's Issues

How to express sequence of numbers of servers in sections?

Sorry for my bad English.
i have a list of sequence of number of uhc servers in bungeecord like that, from uhc25, uhc26, uhc27... to uhc47

  uhc25:
    motd: uhc
    address: 192.168.0.1:28025
    restricted: false
....................
.................
  uhca47:
    motd: uhca
    address: 192.168.0.1:280047
    restricted: false

and this is section config on PlayerBalancer

      uhc {
        parent="uhc-lobby"
        provider=RANDOM_FILLER
        servers=[
          "uhc[25-47]"
         ]
        section-server=playuhc
        section-command {
          name=playuhc
          permission=""
          aliases=[]
        }
      }

but when "balancer reload" it always show this error

[15:52:48] [main/INFO] [PlayerBalancer]: Executing stage "Resolving servers"
[15:52:48] [main/ERROR] [PlayerBalancer]: The plugin could not continue loading due to an unexpected exception
[15:52:48] [main/ERROR]: java.util.regex.PatternSyntaxException: Illegal character range near index 8
[15:52:48] [main/ERROR]: uhca[25-47]
[15:52:48] [main/ERROR]:         ^
[15:52:48] [main/ERROR]: 	at java.util.regex.Pattern.error(Pattern.java:1957)
[15:52:48] [main/ERROR]: 	at java.util.regex.Pattern.range(Pattern.java:2657)
[15:52:48] [main/ERROR]: 	at java.util.regex.Pattern.clazz(Pattern.java:2564)
[15:52:48] [main/ERROR]: 	at java.util.regex.Pattern.sequence(Pattern.java:2065)
[15:52:48] [main/ERROR]: 	at java.util.regex.Pattern.expr(Pattern.java:1998)
[15:52:48] [main/ERROR]: 	at java.util.regex.Pattern.compile(Pattern.java:1698)
[15:52:48] [main/ERROR]: 	at java.util.regex.Pattern.<init>(Pattern.java:1351)
[15:52:48] [main/ERROR]: 	at java.util.regex.Pattern.compile(Pattern.java:1028)
[15:52:48] [main/ERROR]: 	at com.jaimemartz.playerbalancer.section.SectionManager.lambda$calculateServers$5(SectionManager.java:261)
[15:52:48] [main/ERROR]: 	at java.util.ArrayList.forEach(ArrayList.java:1257)
[15:52:48] [main/ERROR]: 	at com.jaimemartz.playerbalancer.section.SectionManager.calculateServers(SectionManager.java:260)
[15:52:48] [main/ERROR]: 	at com.jaimemartz.playerbalancer.section.SectionManager$7.execute(SectionManager.java:123)
[15:52:48] [main/ERROR]: 	at com.jaimemartz.playerbalancer.section.SectionManager$SectionStage.lambda$execute$0(SectionManager.java:382)
[15:52:48] [main/ERROR]: 	at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
[15:52:48] [main/ERROR]: 	at com.jaimemartz.playerbalancer.section.SectionManager$SectionStage.execute(SectionManager.java:381)
[15:52:48] [main/ERROR]: 	at com.jaimemartz.playerbalancer.section.SectionManager.lambda$load$0(SectionManager.java:160)
[15:52:48] [main/ERROR]: 	at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684)
[15:52:48] [main/ERROR]: 	at java.util.Collections$SynchronizedMap.forEach(Collections.java:2649)
[15:52:48] [main/ERROR]: 	at com.jaimemartz.playerbalancer.section.SectionManager.load(SectionManager.java:158)
[15:52:48] [main/ERROR]: 	at com.jaimemartz.playerbalancer.PlayerBalancer.execStart(PlayerBalancer.java:133)
[15:52:48] [main/ERROR]: 	at com.jaimemartz.playerbalancer.PlayerBalancer.reloadPlugin(PlayerBalancer.java:264)
[15:52:48] [main/ERROR]: 	at com.jaimemartz.playerbalancer.commands.MainCommand.execute(MainCommand.java:119)
[15:52:48] [main/ERROR]: 	at net.md_5.bungee.api.plugin.PluginManager.dispatchCommand(PluginManager.java:192)
[15:52:48] [main/ERROR]: 	at net.md_5.bungee.api.plugin.PluginManager.dispatchCommand(PluginManager.java:142)
[15:52:48] [main/ERROR]: 	at io.github.waterfallmc.waterfall.console.WaterfallConsole.runCommand(WaterfallConsole.java:30)
[15:52:48] [main/ERROR]: 	at net.minecrell.terminalconsole.SimpleTerminalConsole.processInput(SimpleTerminalConsole.java:87)
[15:52:48] [main/ERROR]: 	at net.minecrell.terminalconsole.SimpleTerminalConsole.readCommands(SimpleTerminalConsole.java:168)
[15:52:48] [main/ERROR]: 	at net.minecrell.terminalconsole.SimpleTerminalConsole.start(SimpleTerminalConsole.java:141)
[15:52:48] [main/ERROR]: 	at net.md_5.bungee.BungeeCordLauncher.main(BungeeCordLauncher.java:67)
[15:52:48] [main/ERROR]: 	at net.md_5.bungee.Bootstrap.main(Bootstrap.java:15)
[15:52:48] [main/INFO]: Something went badly while reloading the plugin
[15:53:00] [main/INFO]: Reloading the configuration, this may take a while...

If i tried uhc[1-47] then "balancer reload" work but "section info uhc" show no servers
Now i temporary fix it by adding servers like this but i have a plan to make hundred servers so this it not good solution.

      uhc {
        parent="uhc-lobby"
        provider=PROGRESSIVE_FILLER
        servers=[
			"uhc25",
			"uhc26",
			"uhc27",
			"uhc28",
			"uhc29",
			"uhc30",
			"uhc31",
			"uhc32",
			"uhc33",
			"uhc34",
			"uhc35",
			"uhc36",
			"uhc37",
			"uhc38",
			"uhc39",
			"uhc40",
			"uhc41",
			"uhc42",
			"uhc43",
			"uhc44",
			"uhc45",
			"uhc46",
			"uhc47"			
		]

other question: can this plugin handle hundreds of mini game server?
i also recommend you change this default setting to more than 5, i tried many time to know that 5 is too low so player sometimes can't get server so change to 30 and everything work perfect.

    # The attempts before giving up on getting a server for a player
    attempts=5

BungeeCord api

Could you add an api to be used by bungeecord plugins (because I can only find your docs on spigot plugins via the channel system)

How to use reiterative option

I can't make it work. Any example on it? I want players to connect to the last server they are online within a section. When the player connect to that section. It will redirect to it.

Issues

Hey!

Running into a few issues so wanted to see if these were known or if something on my end is going wrong.

  1. /balancer paste seems to be returning a 503 error and kicking the player who runs the command for "Timed Out".
    Log/Error: https://pastebin.com/ZpSgjYUg

  2. I also seem to be having an issue while using the API/Messaging Channel on the latest version of the plugin and bungee. During this test, I was using a 1.8.8 BuildTools created spigot base.
    BungeeBuild:
    nTWLc9

Here is the code I was using to send the player:
TYABfD
Registered the outgoing channel in onEnable:
9GlhbF

It just seems to not send the player at all and returns no errors which is very strange. I have used this code in the past about a year back and it seemed to work fine then which makes me think something changed in new bungee builds or something.

I am able to use the /section commands to send myself to the server section using "survival" so it should be working fine via the messaging channel but weirdly does not.

I also tested on a 1.16.5 spigot build and kept getting:
Caused by: java.lang.IllegalArgumentException: Channel must contain : separator (attempted to use PlayerBalancer)

For reference here is my PlayerBlancer config (NOTE: This is my test server setup, I use more than 2 servers for the production setup):
https://pastebin.com/FGD7kGsH

All schemas except RANDOM providers will report an error and cannot be used

The error message is as follows,It's what I'm missing in the affiliation?

20:22:29 [警告] Error dispatching event PluginMessageEvent(super=TargetedEvent(sender=net.md_5.bungee.ServerConnection@650b5f0e, receiver=hanPO), cancelled=false, tag=playerbalancer:main) to listener com.jaimemartz.playerbalancer.listeners.PluginMessageListener@7769d9b6
java.lang.NoClassDefFoundError: com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI
at com.jaimemartz.playerbalancer.helper.NetworkManager.getPlayers(NetworkManager.java:18)
at com.jaimemartz.playerbalancer.connection.provider.types.progressive.ProgressiveFillerProvider.requestTarget(ProgressiveFillerProvider.java:20)
at com.jaimemartz.playerbalancer.connection.ProviderType$7.requestTarget(ProviderType.java:78)
at com.jaimemartz.playerbalancer.connection.ConnectionIntent.fetchServer(ConnectionIntent.java:85)
at com.jaimemartz.playerbalancer.connection.ConnectionIntent.execute(ConnectionIntent.java:52)
at com.jaimemartz.playerbalancer.connection.ConnectionIntent.simple(ConnectionIntent.java:133)
at com.jaimemartz.playerbalancer.listeners.PluginMessageListener.onPluginMessage(PluginMessageListener.java:63)
at jdk.internal.reflect.GeneratedMethodAccessor24.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at net.md_5.bungee.event.EventHandlerMethod.invoke(EventHandlerMethod.java:19)
at net.md_5.bungee.event.EventBus.post(EventBus.java:49)
at net.md_5.bungee.api.plugin.PluginManager.callEvent(PluginManager.java:412)
at net.md_5.bungee.connection.DownstreamBridge.handle(DownstreamBridge.java:264)
at net.md_5.bungee.protocol.packet.PluginMessage.handle(PluginMessage.java:79)
at net.md_5.bungee.netty.HandlerBoss.channelRead(HandlerBoss.java:114)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.ClassNotFoundException: com.imaginarycode.minecraft.redisbungee.RedisBungeeAPI
at net.md_5.bungee.api.plugin.PluginClassloader.loadClass0(PluginClassloader.java:103)
at net.md_5.bungee.api.plugin.PluginClassloader.loadClass(PluginClassloader.java:59)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)

Error on 1.20.2 XCord servers

XCord is a fork of BungeeCord
When a player quit the proxy:

[21:23:20] [epollEventLoopGroup-3-7/INFO]: [/61.183.81.131:64480|RenXingYu] -> UpstreamBridge has disconnected
[21:23:20] [epollEventLoopGroup-3-7/WARN]: Error dispatching event ServerKickEvent(cancelled=true, player=RenXingYu, kickedFrom=BungeeServerInfo(name=SkyBattle#2, socketAddress=/127.0.0.1:26003, restricted=false), kickReasonComponent=[TextComponent{text=Proxy lost connection to server., BaseComponent(color=, font=null, bold=null, italic=null, underlined=null, strikethrough=null, obfuscated=null, insertion=null, extra=null, clickEvent=null, hoverEvent=null, reset=true)}], cancelServer=BungeeServerInfo(name=SkyBattleLobby#1, socketAddress=/127.0.0.1:26001, restricted=false), state=CONNECTED, cause=LOST_CONNECTION) to listener com.jaimemartz.playerbalancer.listeners.ServerKickListener@67a0ff25
java.lang.NullPointerException: Cannot invoke "net.md_5.bungee.protocol.MinecraftEncoder.getProtocol()" because the return value of "io.netty.channel.ChannelPipeline.get(java.lang.Class)" is null
at net.md_5.bungee.netty.ChannelWrapper.getEncodeProtocol(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at net.md_5.bungee.UserConnection.sendPacketQueued(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at net.md_5.bungee.UserConnection.sendMessage(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at net.md_5.bungee.UserConnection.sendMessage(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at net.md_5.bungee.UserConnection.sendMessage(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at net.md_5.bungee.UserConnection.sendMessage(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at com.jaimemartz.playerbalancer.utils.MessageUtils.send(MessageUtils.java:13) ~[?:?]
at com.jaimemartz.playerbalancer.utils.MessageUtils.send(MessageUtils.java:22) ~[?:?]
at com.jaimemartz.playerbalancer.listeners.ServerKickListener$1.connect(ServerKickListener.java:74) ~[?:?]
at com.jaimemartz.playerbalancer.connection.ConnectionIntent.execute(ConnectionIntent.java:54) ~[?:?]
at com.jaimemartz.playerbalancer.listeners.ServerKickListener.onKick(ServerKickListener.java:86) ~[?:?]
at jdk.internal.reflect.GeneratedMethodAccessor31.invoke(Unknown Source) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
at net.md_5.bungee.event.EventHandlerMethod.invoke(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at net.md_5.bungee.event.EventBus.post(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at net.md_5.bungee.api.plugin.PluginManager.callEvent(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at net.md_5.bungee.connection.DownstreamBridge.disconnected(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at net.md_5.bungee.netty.HandlerBoss.channelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at q.channelInactive(Unknown Source) ~[XCord.jar:?]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.util.concurrent.AbstractEventExecutor.runTask(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.channel.epoll.EpollEventLoop.run(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.util.internal.ThreadExecutorMap$2.run(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(Unknown Source) ~[XCord.jar:git:Travertine-Bootstrap:1.19-R0.1-SNAPSHOT:1a27fb8:unknown]
at java.lang.Thread.run(Thread.java:833) [?:?]
[21:23:20] [epollEventLoopGroup-3-7/INFO]: [/61.183.81.131:64480|RenXingYu] <-> DownstreamBridge <-> [SkyBattle#2] has disconnected
[21:23:20] [epollEventLoopGroup-3-7/INFO]: [RenXingYu|/61.183.81.131:64480] <-> ServerConnector [SkyBattleLobby#1] has connected
[21:23:20] [epollEventLoopGroup-3-7/WARN]: No client connected for pending server!
[21:23:20] [epollEventLoopGroup-3-7/INFO]: [RenXingYu|/61.183.81.131:64480] <-> ServerConnector [SkyBattleLobby#1] has disconnected

FallBack

hey, when I shut down a lobby it hunts all players and tells them server closed, I don't have any plugins in the bungee and these are my logs, there are 0 errors in the console

PlayerBalancer Configuration (https://www.spigotmc.org/resources/10788/)

Read the comments, they are a very important part of the configuration

To get support send me a private message with a description of the problem and the config file

To easily paste the config file (and other relevant files) use the command /balancer paste

If the plugin has issues loading the configuration, try putting quotes around text

general {

IMPORTANT! Set this to true after configuring the plugin!

enabled=true

When true, the plugin will reload when you execute /greload

auto-reload=true

When true, this plugin will print less messages when loading

silent=false

When true, spigot plugins will be able to contact with this plugin

Do not disable if you are using the addon!

plugin-messaging=true

Do not modify this

version="2.2.2-SNAPSHOT"
}

Effectively remove (i.e comment) a message to disable it

Supported variables are shown in the default messages

messages {

connecting-server="&aConnecting to an {section} ({alias}) server" # this message is disabled by default!

connected-server="&aConnected to {server} (an {alias} server)"
invalid-input="&cThis is an invalid input type for this command"
misc-failure="&cCould not find a server to get connected to"
player-bypass="&cYou have not been moved because you have the playerbalancer.bypass permission"
player-kicked="&cYou have been kicked from &a{from} &cso you are being moved to &a{to}\n&cReason: &a{reason}"
same-section="&cYou are already connected to a server on this section!"
unavailable-server="&cThis command cannot be executed on this server"
unknown-section="&aCould not find a section with that name"
}

features {
balancer {
# Here you have an example of what you can do with the sections
# The best way to understand this is to play around with it
# You can have as many sections as you want, there is no limit here
# If a section does not have a provider it will try to inherit it from the parent
# When connecting to a server on a section while not being on it already, you get distributed
# You can use regex to match a set of servers instead of adding each server individually

# Providers you can use: (you can request more!)
# NONE:                    Returns no server (no one will be able to connect to this section)
# RANDOM:                  Returns a random server, generated by SecureRandom
# RANDOM_LOWEST:           Returns a random server between the ones with the least players online
# RANDOM_FILLER:           Returns a random server between the ones with the most players online that is not full
# PROGRESSIVE:             Returns the first server that is not full
# PROGRESSIVE_LOWEST:      Returns the first server with the least players online
# PROGRESSIVE_FILLER:      Returns the first server with the most players online that is not full
# EXTERNAL:                Returns the server calculated by a provider created by other plugin

sections {
  general-lobbies {
    provider=RANDOM_LOWEST
    servers=[
      "hub1",
      "hub2"
    ]
  }
}

# The principal section is very important for other features
# Normally set this to the section that has your main lobbies
principal-section="general-lobbies"

# When a player is not in any section, the player will go to the principal section
# This affects both the fallback command and kick handler features
default-principal=true

# Dummy sections can have servers from other non-dummy sections
# When a player connects to a dummy section, nothing will happen
dummy-sections=[]

# Reiterative sections remember the server the player connected to previously
# The plugin will keep connecting the player to that server repeatedly
reiterative-sections=[]

# When true, section servers will show the sum of the players on all servers on that section
# Important: This will make some plugins think that your bungeecord has more players than it really does
show-players=true

}

Pings servers to see if they are online or not and if they are accessible

server-checker {
enabled=true

# Use either CUSTOM or GENERIC, the first one generally works the best
tactic=CUSTOM

# The attempts before giving up on getting a server for a player
attempts=5

# The interval between every round of checks (in milliseconds)
interval=10000

# The timeout of a ping, only applied to the CUSTOM tactic
timeout=7000

# When true, the plugin will print useful info when a server gets checked
debug-info=false

# When the description of a server matches these, it will be set as non accessible
# Be aware of colors, it is recommended to use the "contains" rule below or some others
marker-descs=[
  "(?i).*maintenance*", # match if contains (regex)
  "Game in progress" # match if exactly equal
]

}

Connects a player to the parent of current section the player is connected to

fallback-command {
enabled=true

# Leave permission empty for no permission
command {
  name=fallback
  permission=""
  aliases=[
    lobby,
    hub
  ]
}

# Add sections here where you do not want this feature to work
excluded-sections=[]

# When true, players will not be able to get connected to sections that are parents of the principal section
restrictive=true

# When true, players will not be able get connected within servers of the same section
# This does not affect the parametized variant of the command (/command [number])
# This also affects section commands
prevent-same-section=true

# You can override the behavior with rules, overriding the parent section
# This will set the section to go when you come from the section specified
rules {
  section-from=section-to
}

}

Connects a player to other section when kicked

kick-handler {
enabled=true

# When true, the reasons will work as a blacklist instead of a whitelist
# Blacklist: A player must be kicked with a reason that is NOT in the reasons
# Whitelist: A player must be kicked with a reason that is in the reasons
inverted=true

# The reasons that determine if a player is reconnected or not, supports regex
reasons=[]

# When true, players that are kicked while connecting to the proxy will be forced to reconnect to the principal section
force-principal=false

# Add sections here where you do not want this feature to work
excluded-sections=[]

# When true, players will not be able to get connected to sections that are parents of the principal section
restrictive=true

# When true, the plugin will print useful info when a player gets kicked
debug-info=false

# You can override the behavior with rules, overriding the parent section
# When you get kicked from the section on the left, you go to the one on the right
rules {
  section-from=section-to
}

}

Periodically adds servers that weren't there before the plugin loaded

server-refresh {
enabled=false

# The delay to the first refresh (in milliseconds)
delay=2000

# The interval between every refresh (in milliseconds)
interval=5000

}

Redirect players when connecting to a section in case they have a permission, useful for special lobbies

Players will not get redirected if they are connected to a server where they were previously redirected to

permission-router {
enabled=false

rules {
  general-lobbies {
    "special.permission"=other-lobby-section
  }
}

}
}

[error]player left the game

waterfall log:
`[10:49:01 INFO]: [/XXX:13878|Lantiann] -> UpstreamBridge has disconnected
[10:49:01 WARN]: Error dispatching event ServerKickEvent(cancelled=false, player=Lantiann, kickedFrom=BungeeServerInfo(name=lobby, socketAddress=/0.0.0.0:22043, restricted=false), reason=TextComponent{text=Proxy lost connection to server., BaseComponent(color=, font=null, bold=null, italic=null, underlined=null, strikethrough=null, obfuscated=null, insertion=null, extra=null, clickEvent=null, hoverEvent=null, reset=true)}, cancelServer=null, state=CONNECTED, cause=LOST_CONNECTION) to listener com.jaimemartz.playerbalancer.listeners.ServerKickListener@26b3eb48
java.lang.NullPointerException: Cannot invoke "net.md_5.bungee.protocol.MinecraftEncoder.getProtocol()" because the return value of "io.netty.channel.ChannelPipeline.get(java.lang.Class)" is null
at net.md_5.bungee.netty.ChannelWrapper.getEncodeProtocol(ChannelWrapper.java:51) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at net.md_5.bungee.UserConnection.sendPacketQueued(UserConnection.java:195) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at net.md_5.bungee.UserConnection.sendMessage(UserConnection.java:562) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at net.md_5.bungee.UserConnection.sendMessage(UserConnection.java:511) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at net.md_5.bungee.UserConnection.sendMessage(UserConnection.java:499) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at com.jaimemartz.playerbalancer.utils.MessageUtils.send(MessageUtils.java:13) ~[?:?]
at com.jaimemartz.playerbalancer.listeners.ServerKickListener.getSection(ServerKickListener.java:122) ~[?:?]
at com.jaimemartz.playerbalancer.listeners.ServerKickListener.onKick(ServerKickListener.java:63) ~[?:?]
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 net.md_5.bungee.event.EventHandlerMethod.invoke(EventHandlerMethod.java:19) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at net.md_5.bungee.event.EventBus.post(EventBus.java:50) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at net.md_5.bungee.api.plugin.PluginManager.callEvent(PluginManager.java:467) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at net.md_5.bungee.connection.DownstreamBridge.disconnected(DownstreamBridge.java:130) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at net.md_5.bungee.netty.HandlerBoss.channelInactive(HandlerBoss.java:61) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:305) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:274) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:81) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.handler.timeout.IdleStateHandler.channelInactive(IdleStateHandler.java:277) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:303) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:274) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:411) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:376) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:305) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:274) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1405) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:301) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:901) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:813) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:566) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[waterfall-1.20-560.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:e927093:560]
at java.lang.Thread.run(Thread.java:842) [?:?]
[10:49:01 INFO]: [/XXX:13878|Lantiann] <-> DownstreamBridge <-> [lobby] has disconnected
[10:49:02 INFO]: [/XXX:13901] <-> InitialHandler has pinged

`

Spigot=>Waterfall Problem(QWQ)

:)I'm not good at English, so I use English translation

I don't know why my sub server can't call the instructions of this plug-in in Waterfall,
Both the sub server and waterfall have plug-ins installed:
[PlayerBalancerAddon-2.3.1-SNAPSHOT]And[PlayerBalancer-2.3.1-SNAPSHOT]
But, when I use the"/spb connect [bedwars] [Myname]" command, it indicates that the transmission was successful,
but the transmission did not start……
I have experienced this situation on the [authmebungee] plug-in, but as now, it has not been solved.
So can you answer my questions or fix this problem, Please!

In Chinese(My mother tongue):
我不知道为什么我的子服务器不能调用Waterfall里此插件的指令,
子服务器和Waterfall都已经安装了插件:
[PlayerBalancerAddon-2.3.1-SNAPSHOT]和[PlayerBalancer-2.3.1-SNAPSHOT]
但是在我使用"/spb connect [bedwars] [Myname]"指令时,它提示了成功发送,
但是传送并没有开始……
这种情况我在[AuthmeBungee]插件上也经历过,
但是和现在一样,没有得到解决
所以能不能请你为我答疑解或是修复这个问题,求求惹QWQ

Undefined Error

Error:
[22:03:16 ERROR]: Task BungeeTask(sched=net.md_5.bungee.scheduler.BungeeScheduler@783ec989, id=20, owner=com.jaimemartz.playerbalancer.PlayerBalancer@1ddd3478, task=com.jaimemartz.playerbalancer.ping.PingTactic$1$$Lambda$206/0x00007f832438ef20@3267c77d, delay=0, period=0, running=true) encountered an exception
com.google.gson.JsonIOException: Failed making field 'java.awt.Color#value' accessible; either increase its visibility or write a custom TypeAdapter for its declaring type.
at com.google.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:38) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:286) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.getAdapter(Gson.java:556) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:160) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:294) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.getAdapter(Gson.java:556) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:160) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:294) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:130) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.getAdapter(Gson.java:556) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.fromJson(Gson.java:1226) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.fromJson(Gson.java:1329) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.fromJson(Gson.java:1300) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.TreeTypeAdapter$GsonContextImpl.deserialize(TreeTypeAdapter.java:179) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at net.md_5.bungee.chat.BaseComponentSerializer.deserialize(BaseComponentSerializer.java:24) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at net.md_5.bungee.chat.TextComponentSerializer.deserialize(TextComponentSerializer.java:25) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at net.md_5.bungee.chat.TextComponentSerializer.deserialize(TextComponentSerializer.java:13) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:76) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.fromJson(Gson.java:1227) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.fromJson(Gson.java:1329) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.fromJson(Gson.java:1300) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.TreeTypeAdapter$GsonContextImpl.deserialize(TreeTypeAdapter.java:179) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at net.md_5.bungee.chat.ComponentSerializer.deserialize(ComponentSerializer.java:211) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at net.md_5.bungee.chat.ComponentSerializer.deserialize(ComponentSerializer.java:30) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:76) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.readIntoField(ReflectiveTypeAdapterFactory.java:212) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:433) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:393) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.fromJson(Gson.java:1227) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.fromJson(Gson.java:1137) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.fromJson(Gson.java:1047) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.google.gson.Gson.fromJson(Gson.java:982) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at com.jaimemartz.playerbalancer.utils.ServerListPing.ping(ServerListPing.java:113) ~[?:?]
at com.jaimemartz.playerbalancer.ping.PingTactic$1.lambda$ping$0(PingTactic.java:19) ~[?:?]
at net.md_5.bungee.scheduler.BungeeTask.run(BungeeTask.java:66) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
at java.lang.Thread.run(Thread.java:840) [?:?]
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field int java.awt.Color.value accessible: module java.desktop does not "opens java.awt" to unnamed module @665bfb8a
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[?:?]
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[?:?]
at java.lang.reflect.Field.checkCanSetAccessible(Field.java:178) ~[?:?]
at java.lang.reflect.Field.setAccessible(Field.java:172) ~[?:?]
at com.google.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:35) ~[waterfall.jar:git:Waterfall-Bootstrap:1.20-R0.3-SNAPSHOT:e07197d:564]
... 39 more

NPE when switching server

Hello, I have a bug with the latest version of the plugin, and with the latest Waterfall / Bungeecord version.
I got this error everytime a player is switching from servers.

[11:00:48 WARN]: Error dispatching event ServerKickEvent(cancelled=true, player=ExTraZz_, kickedFrom=BungeeServerInfo(name=freebuild, socketAddress=/172.18.0.1:32123, restricted=true), reason=TextComponent{text=Proxy lost connection to server., BaseComponent(color=, font=null, bold=null, italic=null, underlined=null, strikethrough=null, obfuscated=null, insertion=null, extra=null, clickEvent=null, hoverEvent=null, reset=true)}, cancelServer=BungeeServerInfo(name=lobby1, socketAddress=/172.18.0.1:32456, restricted=false), state=CONNECTED, cause=LOST_CONNECTION) to listener com.jaimemartz.playerbalancer.listeners.ServerKickListener@3fe46690 java.lang.NullPointerException: null at net.md_5.bungee.netty.ChannelWrapper.getEncodeProtocol(ChannelWrapper.java:51) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at net.md_5.bungee.UserConnection.sendPacketQueued(UserConnection.java:195) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at net.md_5.bungee.UserConnection.sendMessage(UserConnection.java:565) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at net.md_5.bungee.UserConnection.sendMessage(UserConnection.java:511) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at net.md_5.bungee.UserConnection.sendMessage(UserConnection.java:499) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at com.jaimemartz.playerbalancer.utils.MessageUtils.send(MessageUtils.java:13) ~[?:?] at com.jaimemartz.playerbalancer.utils.MessageUtils.send(MessageUtils.java:22) ~[?:?] at com.jaimemartz.playerbalancer.listeners.ServerKickListener$1.connect(ServerKickListener.java:78) ~[?:?] at com.jaimemartz.playerbalancer.connection.ConnectionIntent.execute(ConnectionIntent.java:54) ~[?:?] at com.jaimemartz.playerbalancer.listeners.ServerKickListener.onKick(ServerKickListener.java:90) ~[?:?] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_312] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_312] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_312] at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_312] at net.md_5.bungee.event.EventHandlerMethod.invoke(EventHandlerMethod.java:19) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at net.md_5.bungee.event.EventBus.post(EventBus.java:50) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at net.md_5.bungee.api.plugin.PluginManager.callEvent(PluginManager.java:467) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at net.md_5.bungee.connection.DownstreamBridge.disconnected(DownstreamBridge.java:129) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at net.md_5.bungee.netty.HandlerBoss.channelInactive(HandlerBoss.java:61) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:305) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:274) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.ChannelInboundHandlerAdapter.channelInactive(ChannelInboundHandlerAdapter.java:81) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.handler.timeout.IdleStateHandler.channelInactive(IdleStateHandler.java:277) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:303) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:274) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:411) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:376) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:305) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:274) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1405) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:301) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:281) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:901) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:813) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:413) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.20-R0.2-SNAPSHOT:13cda1d:unknown] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_312]

RedisBungee Support

Add support for RedisBungee to assist with better balancing on multi-proxy setups.

Unexpected packet received during server login process after disconnecting

Tras desconectar del servidor por completo (salir desde el menú), playerbalancer interpreta que he sido kickeado y me envía al lobby (estando desconectado) y bungeecord detecta un paquete inválido (supongo que por estar el usuario desconectado).

Adjunto momento de lo que ocurre:

[23:26:20] [Netty Worker IO Thread #16/INFO]: »» AlexReq (bot): chao!

[23:26:20] [Netty Worker IO Thread #16/INFO]: [/|AlexReq] -> UpstreamBridge has disconnected

[23:26:20] [Netty Worker IO Thread #16/INFO]: [/|AlexReq] <-> DownstreamBridge <-> [murder] has disconnected

[23:26:20] [Netty Worker IO Thread #16/INFO]: [AlexReq|/] <-> ServerConnector [lobby3] has connected
[23:26:20] [Netty Worker IO Thread #16/WARN]: No client connected for pending server!

[23:26:20] [Netty Worker IO Thread #16/ERROR]: [AlexReq|/] <-> ServerConnector [lobby3] - encountered exception: net.md_5.bungee.util.QuietException: Unexpected packet received during server login process!
4100

[23:26:20] [Netty Worker IO Thread #16/INFO]: [AlexReq|/] <-> ServerConnector [lobby3] has disconnected

Tras el mensaje "chao!" me desconecto del servidor, pero playerbalancer me envía al lobby por el kick handler, desactivando este no ocurre. Esto causa que los jugadores se queden conectados en el lobby y redis los detecte en línea no estándolo, además de los sistemas que utilizan redis como el de amigos.

Utilizo la última versión de waterfall y de playerbalancer,

JsonIOException in PlayerBalancer Plugin on Waterfall 1.20-562 with JDK 21

Issue Description

I encountered a JsonIOException while using the PlayerBalancer plugin on the Waterfall server version 1.20-562. This issue occurred on a system running Windows 10 with JDK 21.

Steps to Reproduce

  1. Use Waterfall 1.20-562 on Windows 10 and JDK 21.
  2. Make sure using PlayerBalancer-2.3.5.
  3. Also install BungeeGuard1.3.3, PartyandFriendsAddon-2.3.5 and partyandfriends1.0.240-E plugin.
  4. Start the Waterfall server.
  5. Make sure your backend server is on and reachable.
  6. Observe the error in the server console/logs.

Expected Behavior

The PlayerBalancer plugin should function without any serialization/deserialization issues.

Actual Behavior

The server logs show a JsonIOException related to the Gson library's handling of a private field in the java.awt.Color class. Here is the detailed error message:

[04:17:27 ERROR]: Task BungeeTask(sched=net.md_5.bungee.scheduler.BungeeScheduler@5633dafd, id=59818, owner=com.jaimemartz.playerbalancer.PlayerBalancer@3d9f0a5, task=com.jaimemartz.playerbalancer.ping.PingTactic$1$$Lambda/0x000002044744a960@6c5558a6, delay=0, period=0, running=true) encountered an exception
com.google.gson.JsonIOException: Failed making field 'java.awt.Color#value' accessible; either increase its visibility or write a custom TypeAdapter for its declaring type.
        ...
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field int java.awt.Color.value accessible: module java.desktop does not "opens java.awt" to unnamed module @33cb5951
        ...

Environment

  • Server Software: Waterfall version 1.20-562
  • Operating System: Windows 10
  • Java Version: JDK 21

Additional Context

I ask ChatGPT4 for help with the log, and it tells me that this issue seems to be related to Java's module system introduced in Java 9, which enforces strong encapsulation. Gson appears to be unable to access a private field in a core Java class due to these module system rules.
I will attach the full log and the conf of PlayerBalance.
latest.log.txt
plugin.conf.txt

GPT4's answer

GPT4_s answer.png

Problem with server-checker

I don't want people to join to specific motds. For this reason i set it up like that:

      "(?i).*BAŞLADI*",
	  "(?i).*ÖLÜM OYUNU*",
	  "(?i).*YENİLENİYOR*",
	  "(?i).*BAŞLADI*"
    ]

If players quit a match from these motds and tries to join same group again he still join to ingame server. After 2-3 tries it joins to empty match.

Random error on joining

Every time someone joins, bungee give some errors, they are appearing 1 time per join, and using any version of minecraft. However, no disconnections occurs.
Using PlayerBalancer 2.3.0, Waterfall #448 and Java 16.

[03:41:50 WARN]: Error dispatching event ServerConnectEvent(player=test, target=BungeeServerInfo(name=auth, socketAddress=localhost/127.0.0.1:20000, restricted=false), reason=JOIN_PROXY, request=net.md_5.bungee.api.ServerConnectRequest@6ac3cf8d, cancelled=false) to listener com.jaimemartz.playerbalancer.listeners.ServerConnectListener@d3b0397
java.lang.NullPointerException: Cannot invoke "com.jaimemartz.playerbalancer.connection.ProviderType.requestTarget(com.jaimemartz.playerbalancer.PlayerBalancer, com.jaimemartz.playerbalancer.section.ServerSection, java.util.List, net.md_5.bungee.api.connection.ProxiedPlayer)" because "provider" is null
at com.jaimemartz.playerbalancer.connection.ConnectionIntent.fetchServer(ConnectionIntent.java:85) ~[?:?]
at com.jaimemartz.playerbalancer.connection.ConnectionIntent.execute(ConnectionIntent.java:52) ~[?:?]
at com.jaimemartz.playerbalancer.listeners.ServerConnectListener.onConnect(ServerConnectListener.java:52) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) ~[?:?]
at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
at java.lang.reflect.Method.invoke(Method.java:567) ~[?:?]
at net.md_5.bungee.event.EventHandlerMethod.invoke(EventHandlerMethod.java:19) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at net.md_5.bungee.event.EventBus.post(EventBus.java:48) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at net.md_5.bungee.api.plugin.PluginManager.callEvent(PluginManager.java:466) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at net.md_5.bungee.UserConnection.connect(UserConnection.java:304) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at net.md_5.bungee.UserConnection.connect(UserConnection.java:294) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at net.md_5.bungee.UserConnection.connect(UserConnection.java:268) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at net.md_5.bungee.connection.InitialHandler$6$1.run(InitialHandler.java:563) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:500) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[bungeecord.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at java.lang.Thread.run(Thread.java:831) [?:?]

Server status checker works wrongly with plugin ajQueue

When PlayerBalance works together with ajQueue(a plugin hold queue for player to join servers under bungeecord, to some extent like yours), PB can't check a server is online or not correctly.
In the config of PB in bungee server(I use Waterfall 1.20-562), when server-checker - tactic=CUSTOM, PB can find a backend server online correctly if the backend server is online when tactic is set to CUSTOM. But if the backend server gets offline and after a few seconds gets online again when tactic has been set to CUSTOM, PB will say that server is still offline.
And if you set server-checker - tactic=GENERIC, PB seems simply not checking the status of the backend server: If a server in a group is offline, it is possible that PB send you to the actually offline server in that group if you use a command like /spb connect bedwars-4v4v4v4 Starlight

OS: Ubuntu
Java 21 for the Bungee server
Software:Waterfall 1.20-562
PlayerBalancer version: 2.3.5
ajQueue version: 2.6.0

I report an issue here as ajQueue functions normally, but PB generates some exceptions.

How are you using Reasons for fallback ?

Hello Jamezrin,

I tried setting the fallback reasons to reasons=[/Sanction/, /Raison/] but it's still not working.
My exact reason is:

§6§lExotic§e§lFight §8§m §r §c§lSanction
§7
§6§l§r§cExclusion
§cRaison §8» §7t
§7

It contains both strings, and the mode is set to blacklist.
Can you help me setting this ? It could help others too.

EDIT: Fixed it by using reasons=["*Sanction*"]

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.