PlayerBalancer 2.1.6

Distribute your players across multiple servers. Advanced features and very customizable

  1. Jamezrin
    Tested Minecraft Versions:
    • 1.7
    • 1.8
    • 1.9
    • 1.10
    • 1.11
    • 1.12
    Source Code:
    https://github.com/Jamezrin/PlayerBalancer
    OrN21kR.png
    PlayerBalancer is a BungeeCord plugin for setting up a network with multiple lobbies of different types. You can customize nearly everything in this plugin. You have lots of features, including commands to move across sections, kick handler (kick2lobby), server checking, section servers, target assignation, multiple providers and RedisBungee support among other things.

    Note: Don't expect support from me, try asking in the discussion and maybe I will reply, but you're not entitled to me helping you configure the plugin. Try reading the comments in the configuration and trying things out. If there is a bug in the plugin I'll most likely fix it but I don't think I will add any new features.

    Features:
    • Balancer: Balances the load of your players on your sections. When a player connects to a server in other section, the plugin may move the player to another server in that section.
    • Kick Handler: Players that get kicked from a server can get moved to other servers. You can configure it so it only works when they get kicked with a certain message.
    • Fallback Command: Essentially /hub, /lobby. This command allows players to connect to the parent of the section they are currently in, or the principal if not in a section.
    • Server Checking: The plugin makes sure the server the player is going to be connected to is online. You can also make the plugin mark servers as non-accessible when they have a certain motd.
    • Fallback Command: This command allows players to connect to the parent of the section they are connected to currently. You can also pass a number to the command to get connected to a specific server.
    • Section Command: Comparable to Slash Server. This command allows players to connect to a specific section. This section can have one or more servers.
    • Section Server: Creates a fake server on BungeeCord that is used to connect to a section by just connecting to that server, it shows the sum of players of the servers in that section.
    • Spigot Addon: This allows plugins on the spigot servers to access commands from PlayerBalancer (with /spb), it also includes a PlaceholderAPI placeholder (%balancer_playercount_section%) for a total of all the players connected to servers of a section. This is available as a different resource, download it for free here
    • Permission Router: When using this feature, it moves players when connecting to a certain section while having a certain permission, to another section. This is very helpful if you want to make a special lobby section for players with special permissions.
    • Plugin API for developers to get access to data from the plugin, both from the spigot side and from the bungeecord side. This allows the included addon to work.
    • Very configurable, take a look at the configuration, you will see there are a lot of options for you to configure and more to come.
    • Well optimized and tested on many networks, you can take a look at the statistics for this plugin here (old metrics) or here (new metrics)
    Commands:
    • The fallback command, it moves you from your current section to a server of the parent section.
    • The section command, a command you can set to a section and when it is executed you get connected to that section.
    • (/balancer) The plugin command, which allows you to safely reload the plugin and quickly upload the configuration of the plugin to pastebin to quickly get support.
    • (/section) The section management command, which allows you to make a player connect to a section, get info about a section and their servers and a list of sections with click events for enhancing use. This is the shown info when executing /section info.
    Screenshot_8.png
    Note: The administrative commands require you to have the permission "playerbalancer.admin"​

    Configuration:
    Code (Text):

    # 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=false

      # When true, the plugin will reload when you execute /greload
      auto-reload=true

      # When true, the plugin will get player counts from RedisBungee
      redis-bungee=false

      # 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="${project.version}"
    }

    # 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 {
          auth-lobbies {
            provider=RANDOM
            servers=[
              "Auth1",
              "Auth2",
              "Auth3"
            ]
          }

          general-lobbies {
            parent="auth-lobbies"
            alias="General Lobbies"
            servers=[
              "Lobby[1-3]"
            ]
          }

          skywars-lobbies {
            parent="general-lobbies"
            provider=PROGRESSIVE_LOWEST
            servers=[
              "SWLobby1",
              "SWLobby2",
              "SWLobby3"
            ]
          }

          skywars-games {
            parent="skywars-lobbies"
            provider=RANDOM_FILLER
            servers=["SW_A[1-5]", "SW_B[1-5]"]
            section-server=playskywars
            section-command {
              name=skywars
              permission=""
              aliases=[]
            }
          }
        }

        # 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,
            back
          ]
        }

        # 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
          }
        }
      }
    }
     
    Developer API:
    This is the API at the version 2.0.1+
    You can send plugin messages from the spigot server to bungeecord and this plugin will read what you send through the channel "PlayerBalancer"
    You can see more information on how to use this here
    To send a plugin message you can use the following code
    Code (Text):
    ByteArrayDataOutput out = ByteStreams.newDataOutput();
    out.writeUTF("Subchannel");
    out.writeUTF("Argument1");
    out.writeUTF("Argument2");
    out.writeUTF("Argument...");

    // If you don't care about the player
    // Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
    // Else, specify them
    Player player = Bukkit.getPlayerExact("Player");
    player.sendPluginMessage(this, "PlayerBalancer", out.toByteArray());
    Available Subchannels

    Connects a player to a server in the specified section

    Arguments
    String name of the section, just as defined in the config

    Receiver
    The player you want to connect

    Sending Example
    Code (Text):
    out.writeUTF("Connect");
    out.writeUTF("lobbies-section");

    Connects a named player to a server of the specified section

    Arguments
    String name of the player to connect
    String name of the section, just as defined in the config

    Receiver
    Any player

    Sending Example
    Code (Text):
    out.writeUTF("ConnectOther");
    out.writeUTF("Player");
    out.writeUTF("lobbies-section");

    Returns a json object of the section

    Arguments
    String name of the section, just as defined in the config

    Receiver
    Any player

    Sending Example
    Code (Text):
    out.writeUTF("GetSectionByName");
    out.writeUTF("SomeSection");
    Response
    Code (Text):
    String json = in.readUTF();

    Returns a json object of the section

    Arguments
    String name of the server

    Receiver
    Any player

    Sending Example
    Code (Text):
    out.writeUTF("GetSectionByServer");
    out.writeUTF("Server1");
    Response
    Code (Text):
    String json = in.readUTF();

    Returns a json object of the section

    Arguments
    String name of the player

    Receiver
    Any player

    Sending Example
    Code (Text):
    out.writeUTF("GetSectionOfPlayer");
    out.writeUTF("SomePlayer");
    Response
    Code (Text):
    String json = in.readUTF();

    Returns the sum of all the players online on the servers that are in the section provided

    Arguments
    String name of the section

    Receiver
    Any player

    Sending Example
    Code (Text):
    out.writeUTF("GetSectionPlayerCount");
    out.writeUTF("SomeSection");
    Response
    Code (Text):
    int count = in.readInt();


    Statistics:
    This plugin queries information about your server for statistical purposes, all the data is anonymous and you can opt-out by modifying the bStats config, learn more about this here
    You can take a look at the statistics for this plugin here (old metrics) or here (new metrics)
    DeadMaster and BrettPlayMC like this.

Recent Updates

  1. Fixed memory leak

Recent Reviews

  1. MartinGamer_Es
    MartinGamer_Es
    5/5,
    Version: 2.1.5.3
    Excelent plugin!
    xD
  2. Troxx
    Troxx
    5/5,
    Version: 2.1.5.3
    Well, the author decides to give the premium plugin for free. Nice! If you see this author. Can you message me why? TY <3