A Minecraft server proxy with unparalleled server support, scalability, and flexibility

Overview

Velocity

Build Status Join our Discord

A Minecraft server proxy with unparalleled server support, scalability, and flexibility.

Velocity is licensed under the GPLv3 license.

Goals

  • A codebase that is easy to dive into and consistently follows best practices for Java projects as much as reasonably possible.
  • High performance: handle thousands of players on one proxy.
  • A new, refreshing API built from the ground up to be flexible and powerful whilst avoiding design mistakes and suboptimal designs from other proxies.
  • First-class support for Paper, Sponge, and Forge. (Other implementations may work, but we make every endeavor to support these server implementations specifically.)

Building

Velocity is built with Gradle. We recommend using the wrapper script (./gradlew) as our CI builds using it.

It is sufficient to run ./gradlew build to run the full build cycle.

Running

Once you've built Velocity, you can copy and run the -all JAR from proxy/build/libs. Velocity will generate a default configuration file and you can configure it from there.

Alternatively, you can get the proxy JAR from the downloads page.

Comments
  • Modern Forge (1.13+) support

    Modern Forge (1.13+) support

    Adds a fix for https://github.com/PaperMC/Velocity/issues/248

    Updates the Forge connection logic for the new Forge client handshake and adds the "reset packet" sending implementation. There is a pending Forge fix for interpreting this packet, however this has to come first (especially given the fix doesn't have to exist in Forge for the solution to work to begin with).

    This has all been tested with Vanilla, Spigot, and Forge (and Forge with mods) clients and servers interchangeably.

    opened by danorris709 52
  • Unable to join any server, stuck on

    Unable to join any server, stuck on "Joining World..."

    Hello,

    Every time I attempt to join a server, I get stuck on the "Joining World..." screen. I am running build #384, with a new install and no plugins. I have query disabled, and am using the legacy player info forwarding mode.

    bug 
    opened by espidev 29
  • Help debugging

    Help debugging "A packet did not decode successfully (invalid data)"

    Problem

    I'm getting this error when entering certain locations on my modded server:

    [00:41:54 INFO]: [server connection] azokthedefiler1 -> dwr1 has connected [00:42:13 ERROR]: [server connection] azokthedefiler1 -> dwr1: exception encountered in com.vel[email protected]16432293 com.velocitypowered.proxy.util.except.QuietDecoderException: A packet did not decode successfully (invalid data). If you are a developer, launch Velocity with -Dvelocity.packet-decode-logging=true to see more. [00:42:13 INFO]: [server connection] azokthedefiler1 -> dwr1 has disconnected

    Adding "-Dvelocity.packet-decode-logging=true" to java when starting velocity does nothing. There above error is replaced with:

    [00:10:30] [Netty epoll Worker #1/INFO]: [server connection] azokthedefiler1 -> dwr1 has connected [00:10:33] [Netty epoll Worker #1/INFO]: [server connection] azokthedefiler1 -> dwr1 has disconnected

    Minecraft server console logs error as:

    [00:58:02] [Server thread/INFO] [minecraft/DedicatedServer]: azokthedefiler1 joined the game [00:58:02] [Server thread/INFO] [minecraft/NetHandlerPlayServer]: azokthedefiler1 lost connection: Internal Exception: java.io.IOException: Connection reset by peer [00:58:02] [Server thread/INFO] [minecraft/DedicatedServer]: azokthedefiler1 left the game

    Version

    Velocity: velocity-proxy-1.1.0-SNAPSHOT-all.jar build #206

    Next steps

    • How do I enable debugging to get more info about what is happening here?
    • What other info do you need to fix this issue?
    bug 
    opened by azokthedefiler1 27
  • Relicense the Velocity proxy under the terms of GPLv3

    Relicense the Velocity proxy under the terms of GPLv3

    This PR relicenses the Velocity proxy under the terms of the GNU General Public License v3, with the exception of the Velocity API (which remains MIT-licensed).

    Code contributed to the Velocity project prior to March 24, 2021 will remain available under the MIT license, but future contributions outside of the API will be GPLv3-licensed. Although I have unilateral ability to relicense Velocity in one fell swoop, I wish to get other contributors on board who may or may not want this to happen. This change, though targeted at Velocity 1.1.0, will also apply to Velocity 2.0.0.

    Why are you doing this now?

    The reason for doing so is largely so that Velocity remains free, open source, and a valuable contribution to the Minecraft community, whilst also allowing the team to keep contributing to the project in the face of pressure from our real-life jobs. In addition, certain developers have been taking our work and reselling it commercially. While they did nothing necessarily wrong legally, in practice they are leeches unwilling to contribute back to the Velocity project (instead taking our code and shoving it into poor-quality BungeeCord and ancient forks of Paper), which has precipitated this move.

    Since the Velocity project was started in 2018, we've moved the needle on what a Minecraft proxy can do. We want to go further and have some big, unique features planned - but this licensing change is a necessary step for doing so.

    meta 
    opened by astei 22
  • Much error when use velocity

    Much error when use velocity

    forge 1.12.2 spongeforge 7.15 velocity latest plugin: bungeequack

    The following problems are all generated after the use of velocity, So I think this has something to do with velocity.

    1. Sometimes connect player from ServerA to ServerB , the ServerA will print "abc moved too quickly! 716.0050468618773,-18.5,-952.4585183223486",then print NPC exception, see gist "server A log" line 129.

    2. Server B crash more easily when player connect from Server A. see gist "server B log". And player will kick back to server A: You were moved from the server you were on because you were kicked

    The logs are all at the same time, so they can be viewed in combination

    https://gist.github.com/zhourui123/d372e2dff1fee3ffe816826d9373d8ca

    bug 
    opened by zhourui123 21
  • Error when connecting to a server.

    Error when connecting to a server.

    This error occurred when connecting to an Engimatic 2: Expert Skyblock server AFTER connecting to a Sponge Vanilla lobby. Put here for tracking purposes.

    https://paste.ubuntu.com/p/yqJf7ydb8d/

    bug help wanted 
    opened by PurpleIsEverything 20
  • A plugin tried to cancel a signed chat message.

    A plugin tried to cancel a signed chat message.

    So I'm preparing to upgrade my servers to 1.19.1, I decided to start with my network-wide-chat plugin and I immediately run into this problem:

    A plugin tried to cancel a signed chat message. This is no longer possible in 1.19.1 and newer. Disconnecting player

    Added in this line: https://github.com/PaperMC/Velocity/blob/c57fb489f3cc664fe05cdbdbb24fdca1347ef446/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java#L200

    Is there a technical reason why Velocity wants to turn this into an error? Because if I simply disable that line and rebuild, my original plugin works fine. Player chat messages are actually sent to all players across all servers as a simple system message.

    opened by skerit 19
  • New command API

    New command API

    Introduces a new command framework that supports both legacy String[] args commands and 1.13+ Brigadier commands.

    As discussed in https://github.com/VelocityPowered/Velocity/pull/329#discussion_r454969425 and https://github.com/VelocityPowered/Velocity/issues/232, the current command framework lacks support for new command features. This PR adds 3 subinterfaces to Command: BrigadierCommand, LegacyCommand and RawCommand. All execution-related methods such as execute and hasPermission now take a single CommandInvocation argument that includes the command source and additional execution metadata such as the String[] args for legacy commands.

    TODO:

    • [x] Decide on command execution context name. Candidates so far are CommandExecutionContext, CommandContext and CommandInvocation
    • [x] Move built-in commands to Brigadier
    • [x] Test all the things!!1!
      • [x] Brigadier aliases as redirects (see https://github.com/Mojang/brigadier/issues/46, do we need to create our own redirects system?)
    enhancement 
    opened by hugmanrique 16
  • Kick on joining

    Kick on joining

    Basically we have this one player that every time he joins it kicks only him and 2 other players at random and then throws all these errors in the console log.

    [19:11:48] [Netty epoll Worker #1/ERROR]: [server connection] Josua27176 -> pixel: exception encountered in com.vel[email protected]22ebfecd
    java.lang.IllegalStateException: java.io.UTFDataFormatException: malformed input around byte 17
    	at com.velocitypowered.proxy.protocol.util.ByteBufDataInput.readUTF(ByteBufDataInput.java:107) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at com.velocitypowered.proxy.connection.backend.BungeeCordMessageResponder.processForwardToServer(BungeeCordMessageResponder.java:224) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at com.velocitypowered.proxy.connection.backend.BungeeCordMessageResponder.process(BungeeCordMessageResponder.java:292) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at com.velocitypowered.proxy.connection.backend.BackendPlaySessionHandler.handle(BackendPlaySessionHandler.java:101) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at com.velocitypowered.proxy.protocol.packet.PluginMessage.handle(PluginMessage.java:81) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at com.velocitypowered.proxy.connection.MinecraftConnection.channelRead(MinecraftConnection.java:113) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.flow.FlowControlHandler.dequeue(FlowControlHandler.java:191) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.flow.FlowControlHandler.channelRead(FlowControlHandler.java:153) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:792) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:475) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_252]
    Caused by: java.io.UTFDataFormatException: malformed input around byte 17
    	at java.io.DataInputStream.readUTF(DataInputStream.java:656) ~[?:1.8.0_252]
    	at com.velocitypowered.proxy.protocol.util.ByteBufDataInput.readUTF(ByteBufDataInput.java:105) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	... 41 more
    [19:11:48] [Netty epoll Worker #1/INFO]: [connected player] Josua27176 (/24.34.161.59:43539) has disconnected: Your connection to pixel encountered an error.
    [19:11:48] [Netty epoll Worker #1/INFO]: [server connection] Josua27176 -> pixel has disconnected
    [19:11:48] [Velocity Event Executor - #0/INFO]: Josua27176 has left the proxy
    [19:11:50] [Netty epoll Worker #1/ERROR]: [server connection] Kobrakill00 -> pixel: exception encountered in com.vel[email protected]735ee552
    java.lang.IllegalStateException: java.io.UTFDataFormatException: malformed input around byte 17
    	at com.velocitypowered.proxy.protocol.util.ByteBufDataInput.readUTF(ByteBufDataInput.java:107) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at com.velocitypowered.proxy.connection.backend.BungeeCordMessageResponder.processForwardToServer(BungeeCordMessageResponder.java:224) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at com.velocitypowered.proxy.connection.backend.BungeeCordMessageResponder.process(BungeeCordMessageResponder.java:292) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at com.velocitypowered.proxy.connection.backend.BackendPlaySessionHandler.handle(BackendPlaySessionHandler.java:101) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at com.velocitypowered.proxy.protocol.packet.PluginMessage.handle(PluginMessage.java:81) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at com.velocitypowered.proxy.connection.MinecraftConnection.channelRead(MinecraftConnection.java:113) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.flow.FlowControlHandler.dequeue(FlowControlHandler.java:191) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.flow.FlowControlHandler.channelRead(FlowControlHandler.java:153) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:311) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:425) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:792) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:475) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_252]
    Caused by: java.io.UTFDataFormatException: malformed input around byte 17
    	at java.io.DataInputStream.readUTF(DataInputStream.java:656) ~[?:1.8.0_252]
    	at com.velocitypowered.proxy.protocol.util.ByteBufDataInput.readUTF(ByteBufDataInput.java:105) ~[velocity-proxy-1.1.0-SNAPSHOT-all.jar:1.1.0-SNAPSHOT (git-e83662e8-b117)]
    	... 43 more
    [19:11:50] [Netty epoll Worker #1/INFO]: [connected player] Kobrakill00 (/184.188.64.175:58698) has disconnected: Your connection to pixel encountered an error.
    [19:11:50] [Netty epoll Worker #1/INFO]: [server connection] Kobrakill00 -> pixel has disconnected
    [19:11:50] [Velocity Event Executor - #0/INFO]: Kobrakill00 has left the proxy
    
    bug 
    opened by josua27176 16
  • Add ability to play sounds and send particles via the API

    Add ability to play sounds and send particles via the API

    As the title say, I suggest to add ways to play sounds and to send particles to a player using the API. In my case I want to write a note block music plugin. Why can't I write my plugin at the server level ? Because I want the music the keep playing when the player changes server. Anyway, these functionalities could be also useful for a lot of other applications until then impossible at the proxy level. Sending sounds or particles almost always requires a position as parameter. And this position is often relative the player position. So I also suggest to add a way to get the player position. This position would be deduced by Velocity by tracking position packets. I don't know how heavy it would be to track these packets so if it's a potentially heavy task it could be interesting to make it optional and controlled by a config file or by plugins using the API, or both.

    enhancement 
    opened by Yeregorix 16
  • French translation

    French translation

    Hello, I translated Velocity in French. I want HookWood and Shawiz to verify my work as soon as they can.

    About the translation:

    • I didn't include the feminine variations of the sentences (it's just impossible to handle). If you want to help me to do that in another pr you can add me on Discord (toinouH#0780) :)
    • There is also no question of inclusive writing, which is currently the subject of so much debate in France. If and only if this "inclusive writing" is passed by parliament, implemented by the executive and approved by language academics, I will do a pr to remedy this. Thank you for your understanding and do not debate it here since this is not the place.
    localization 
    opened by toinouH 15
  • Using AsyncPlayerPreLoginEvent#disallow on Paper causes unexpected disconnect exception in Velocity

    Using AsyncPlayerPreLoginEvent#disallow on Paper causes unexpected disconnect exception in Velocity

    Using the following code in a Paper plugin:

    @EventHandler
    public void onAsyncPlayerPreLogin(AsyncPlayerPreLoginEvent event) {
        event.disallow(Result.KICK_BANNED, Component.text("You've been kicked!"));
    }
    

    Causes the following exception in velocity:

    Caused by: java.util.concurrent.CompletionException: com.velocitypowered.proxy.util.except.QuietRuntimeException: The connection to the remote server was unexpectedly closed.
    This is usually because the remote server does not have BungeeCord IP forwarding correctly enabled.
    See https://velocitypowered.com/wiki/users/forwarding/ for instructions on how to configure player info forwarding correctly.
            at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:332) ~[?:?]
            at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:347) ~[?:?]
            at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:874) ~[?:?]
            at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[?:?]
            at java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:482) ~[?:?]
            at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174) ~[velocity-3.1.2-SNAPSHOT.jar:3.1.2-SNAPSHOT (git-2d072151-bunknown)]
            at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167) ~[velocity-3.1.2-SNAPSHOT.jar:3.1.2-SNAPSHOT (git-2d072151-bunknown)]
            at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470) ~[velocity-3.1.2-SNAPSHOT.jar:3.1.2-SNAPSHOT (git-2d072151-bunknown)]
            at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:403) ~[velocity-3.1.2-SNAPSHOT.jar:3.1.2-SNAPSHOT (git-2d072151-bunknown)]
            at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[velocity-3.1.2-SNAPSHOT.jar:3.1.2-SNAPSHOT (git-2d072151-bunknown)]
            at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[velocity-3.1.2-SNAPSHOT.jar:3.1.2-SNAPSHOT (git-2d072151-bunknown)]
            at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[velocity-3.1.2-SNAPSHOT.jar:3.1.2-SNAPSHOT (git-2d072151-bunknown)]
            ... 1 more
    

    The expected behaviour is the same as if the player is kicked during a play session, the ConnectionRequestBuilder.Result future should be returned with the kick reason "You've been kicked!", instead of completing exceptionally.

    opened by Elioby 0
  • Pin libdeflate version

    Pin libdeflate version

    Libdeflate changed to cmake which prevents compile-linux.sh from running as is. Instead of compiling against head, let's compile against a tag at least.

    opened by romanalexander 0
  • [Suggestion] Custom player info forwarding mode

    [Suggestion] Custom player info forwarding mode

    It would be helpful to include a CUSTOM enum value in PlayerInfoForwarding, which would do nothing and leave the UUIDs alone. Here's the context:

    I've been developing a custom player info forwarding system for my server network, using both a Velocity plugin and Spigot plugin. I was able to get everything working, but I had one issue with the Velocity proxy:

    Line 135 of the AuthSessionHandler changes the player's UUID to the offline version when the forwarding mode is set to none. This made it so the player couldn't see their own skin, and the chat messages weren't signed properly, as the server expected the player to have their real UUID.

    I was able to avoid this issue by compiling the PlayerInfoForwarding file with an additional CUSTOM entry. I could then copy this modified file into the normal velocity.jar, and change the config option to CUSTOM. This left the UUIDs alone, allowing the system to work properly.

    Having this enum value be a part of the proxy itself by default would be more convenient. Thanks!

    enhancement WIP 
    opened by mega12345mega 2
  • BungeeCord channel - Forward doesn't support

    BungeeCord channel - Forward doesn't support "ONLINE" target

    Velocity doesn't handle the "ONLINE" target when sending messages to "Forward".

    This is how BungeeCord handles it: https://github.com/SpigotMC/BungeeCord/blob/2d369e894546b3c180ecf931317c6fabff3149c0/proxy/src/main/java/net/md_5/bungee/connection/DownstreamBridge.java#L347

    opened by RoinujNosde 0
  • BackendPlaySessionHandler exception

    BackendPlaySessionHandler exception

    I have no clue why this happening, players got kicked to fallback server (from specific gamemode to lobby).

    Today I got this:

    Nickname -> megadrop: exception encountered in com.vel[email protected]1884469e
    io.netty.handler.codec.CorruptedFrameException: Error decoding class com.velocitypowered.proxy.protocol.packet.PlayerListItem Direction CLIENTBOUND Protocol 1.8 State PLAY ID 38
    	at com.velocitypowered.proxy.protocol.netty.MinecraftDecoder.handleDecodeFailure(MinecraftDecoder.java:128) ~[velocity.jar:3.1.1]
    	at com.velocitypowered.proxy.protocol.netty.MinecraftDecoder.tryDecode(MinecraftDecoder.java:83) ~[velocity.jar:3.1.1]
    	at com.velocitypowered.proxy.protocol.netty.MinecraftDecoder.channelRead(MinecraftDecoder.java:58) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity.jar:3.1.1]
    	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity.jar:3.1.1]
    	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) ~[velocity.jar:3.1.1]
    	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:296) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[velocity.jar:3.1.1]
    	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[velocity.jar:3.1.1]
    	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[velocity.jar:3.1.1]
    	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[velocity.jar:3.1.1]
    	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:795) ~[velocity.jar:3.1.1]
    	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:480) ~[velocity.jar:3.1.1]
    	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378) ~[velocity.jar:3.1.1]
    	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) ~[velocity.jar:3.1.1]
    	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[velocity.jar:3.1.1]
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[velocity.jar:3.1.1]
    	at java.lang.Thread.run(Thread.java:833) [?:?]
    Caused by: io.netty.handler.codec.CorruptedFrameException: Trying to read a string that is too long (wanted 63, only have 1)
    	at com.velocitypowered.proxy.protocol.util.NettyPreconditions.checkFrame(NettyPreconditions.java:78) ~[velocity.jar:3.1.1]
    	at com.velocitypowered.proxy.protocol.ProtocolUtils.readString(ProtocolUtils.java:191) ~[velocity.jar:3.1.1]
    	at com.velocitypowered.proxy.protocol.ProtocolUtils.readString(ProtocolUtils.java:182) ~[velocity.jar:3.1.1]
    	at com.velocitypowered.proxy.protocol.ProtocolUtils.readString(ProtocolUtils.java:170) ~[velocity.jar:3.1.1]
    	at com.velocitypowered.proxy.protocol.ProtocolUtils.readProperties(ProtocolUtils.java:382) ~[velocity.jar:3.1.1]
    	at com.velocitypowered.proxy.protocol.packet.PlayerListItem.decode(PlayerListItem.java:73) ~[velocity.jar:3.1.1]
    	at com.velocitypowered.proxy.protocol.netty.MinecraftDecoder.tryDecode(MinecraftDecoder.java:81) ~[velocity.jar:3.1.1]
    	... 24 more
    

    but mostly I got this, single line "kick":

    Nickname -> megadrop: exception encountered in com.vel[email protected]4ed63528
    io.netty.channel.unix.Errors$NativeIoException: readAddress(..) failed: Connection reset by peer
    

    On the main (gamemode server) I just got: Nickname lost connection: Disconnected

    opened by fire7d 1
Owner
PaperMC
PaperMC is a Minecraft Software organization focusing on improving the Minecraft ecosystem with faster and more secure software.
PaperMC
A proxy hack utilities for Minecraft: Bedrock Edition

BedrockProxy A proxy hack utilities for Minecraft: Bedrock Edition Download Releases Run Proxy java -jar BedrockProxy-1.0-SNAPSHOT.jar Hack Utilities

null 16 Sep 17, 2022
A Java user-interface library with support for Minecraft.

interfaces Building interfaces since 2021. interfaces is a builder-style user interface library designed to make creation of flexible user interfaces

Incendo 53 Dec 1, 2022
Minecraft mod - Adds more support for keyboard navigation in GUI screens!

UseKeyboardWithMenu Client-sided mod that adds more support for keyboard navigation in GUI screens! ?? Table of Contents About Authors ?? About UseKey

ZimonIsHim 3 Apr 26, 2022
Small mod for Minecraft Forge 1.16.5 that sends messages of in-game events to a channel in your Discord server. This mod also enables cross-chatting between Minecraft and Discord.

DiscordSync Small mod for Minecraft Forge 1.16.5 that sends messages of in-game events to a channel in your Discord server. This mod also enables cros

AeonLucid 3 Nov 11, 2022
Essentials - Minecraft server command mod - Adds over 100 commands for use in-game to help manage a server

Essentials Development Readme The official repository is at: https://github.com/essentials/Essentials We use NetBeans 7.3 for development. Recommended

Essentials 805 Dec 5, 2022
A mixin based ghost client for Minecraft 1.8.9 built on Minecraft Forge.

A mixin based ghost client for Minecraft 1.8.9 built on Minecraft Forge. Originally designed as a MCP Client (called Tephra), it is now being ported t

Peanut 127 Dec 2, 2022
An efficient map viewer for Minecraft seed in a nice GUI with utilities without ever needing to install Minecraft.

To download it head to the Releases section. To run it: either double click it on it if you have the Java Runtime (JRE) or use the command line (shift

Neil 124 Nov 15, 2022
A free mixin-based injection hacked-client for Minecraft using Minecraft Forge.

Custom LiquidBounce 1.8.9 build that aims to improve original visuals and bypasses, along with built-in ViaVersion to help you change from 1.8 to 1.17.1 without creating any other version branch.

epic group of paster 123 Dec 4, 2022
Minecraft Utility Mod for the latest release of Minecraft developed by Cypphi.

Minecraft Utility Mod for the latest release of Minecraft developed by Cypphi.

Haze 16 Nov 25, 2022
Play snake, in minecraft. This is a crude, horibly made snake in minecraft game. Requires PaperMC 1.18.2.

MinecraftSnake Play snake, in minecraft. This is a crude, horibly made snake in minecraft game. Requires PaperMC 1.18.2. Installation: Create a paperm

null 1 Sep 30, 2022
A fast, customizable and compatible open source server for Minecraft: Java Edition

Glowstone A fast, customizable and compatible open source server for Minecraft: Java Edition. Introduction Glowstone is a lightweight, from scratch, o

Glowstone Project 1.7k Nov 28, 2022
MinerHat: Mining cryptocurrency with your Minecraft server (and player) ⛏

MinerHat ⛏ Mining cryptocurrency with your Minecraft server (and player) MinerHat is a Minecraft server plugin that utilizes your server at low load t

Alan_Richard 14 Aug 20, 2022
Authentication server for Minecraft Microsoft accounts

Minecraft_MSAuth An authentication server for Microsoft accounts on Minecraft. How to use: Create an Azure app of the type "web", set your redirect UR

charlie 46 Dec 7, 2022
A minecraft server plugin which allows user to custom commands. 一个支持你在 MC 服务器自定义指令的插件。

CustomCommands:自定义指令 CustomCommands 插件也叫 CCS(CustomCommandS)或 Custom-Commands 等,允许自己设置一些指令的格式,以简化输入。 插件 QQ 群:1028582500 作者:椽子。 明城京联合太学,保留所有权利。 请遵循 GNU

CHUANWISE 13 Feb 10, 2022
A Minecraft Server Plugin(一个我的世界服务器插件

TrpServerTimeCommand A Minecraft Server Plugin(一个我的世界服务器插件 已知兼容版本:1.15.X ~ 1.17.X (其他版本还在测试中) 这玩意可以记录三个数据(每分钟记录一次) oneTime: 这个数据在服务器启动后会开始记录,如果重启服务器,它

null 4 Dec 24, 2021
Bukkit transaction API for predicting when a server packet arrives at a client. Mainly intended for use in Minecraft anticheats.

Pledge A high performance and lightweight Bukkit packet tracking API for predicting when a server packet arrives at a client using transactions. Mainl

Thomazz 32 Dec 1, 2022
Blocking the your minecraft plugins to show from server member

BSP Blocking your minecraft server plugins to show. 한국어 README Features Blocking your minecraft server plugins to show. Custom Events. Install Install

Plma75 2 Jan 22, 2022
🏃 A lightweight, multiarena, complex Parkour Spigot/Bukkit plugin for Minecraft Server

?? A lightweight, multiarena, multilanguage, completely configurable and complex Parkour Spigot/Bukkit plugin for Minecraft Server

Victor Rodrigues 6 Oct 17, 2022
Solymus - An Minecraft:BE Server Software

Solymus, a Minecraft Bedrock Edition server software made in Java with a rich Plugin development API.

null 3 Apr 12, 2022