GithubHelp home page GithubHelp logo

papermc / velocity Goto Github PK

View Code? Open in Web Editor NEW
1.6K 51.0 546.0 7.25 MB

The modern, next-generation Minecraft server proxy.

Home Page: https://papermc.io/software/velocity

License: GNU General Public License v3.0

Java 99.49% Shell 0.10% C 0.40% Kotlin 0.01%
minecraft server-proxy minecraft-forge java forge velocity minecraft-server-proxy

velocity's Introduction

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, Fabric 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.

velocity's People

Contributors

4drian3d avatar a248 avatar alexstaeding avatar astei avatar coreyshupe avatar creeper123123321 avatar dualspiral avatar electronicboy avatar frankheijden avatar gabik21 avatar gerrygames avatar hugmanrique avatar james58899 avatar joo200 avatar kashike avatar kennytv avatar leymooo avatar lucko avatar lxgaming avatar matrixtunnel avatar mikroskeem avatar pantera07 avatar powercasgamer avatar purpleiseverything avatar qixils avatar roccodev avatar stephan-gh avatar thomas15v avatar xernium avatar xxdark avatar

Stargazers

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

Watchers

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

velocity's Issues

Reload command

In essence:

  • Reload the velocity.toml in-place as much as reasonably (and safely) possible.
  • Fire a ProxyReloadEvent to allow plugins to reload their own configurations.

Implement fallback connection support

Velocity does not yet currently support attempts to fall back to other servers in the try list. Supporting this would be a very easy project to knock out for a new contributor.

Expose changing of the query map in the config

This is not very high priority, but I'd like to be able to change the hardcoded "Velocity" map in the query response to something else. I think this was planned, looking at the original PR discussion, but was never executed.

Also, even more low priroity - it'd be nice if there is an opt-in option to expose the plugins of the proxy, since there are some voting sites (which are the primary reason query is enabled in the first place) reward with higher rankings if you show your plugins

cough Minecraft-MP cough cough

Plugin messaging support

Velocity plugins should be able to handle incoming/outgoing messages, and gain the ability to send them out to servers as needed. Once this is done, we can port NuVotifier and introduce a degree of backward-compatibility for Bukkit/Sponge plugins expecting to talk to BungeeCord.

1.8 protocol support

Velocity doesn't currently support Minecraft 1.8. This can be a good issue to tackle if you have some familiarity with the Minecraft protocol on a low level.

Links that may help you:

new lines are white

When sending messages to the player the message is after line-breaks white

Add methods to get all players in a server

Currently I can't find such method, I can only find server.getAllPlayers(), but no way to get them for a single server. A player count (like server.getPlayerCount()) for a single server would also be nice :)

Thank you!

I just wanted to thank you for this amazing API!

Thank you!

Start applying Checker Framework and Checkstyle

Checker Framework

Essentially, a very handy tool that aims to catch common mistakes at compile time. IntelliJ and other modern IDEs already do a lot of useful inspections, but Checker Framework is more comprehensive in scope.

Checker Framework will be integrated into the Velocity build process.

  • Add gradle support
  • API compiles with Checker Framework
  • Natives compile with Checker Framework
  • Proxy compiles with Checker Framework

Checkstyle

Says what it is: a code-style checker.

  • Determine code style we want to follow
  • Reformat the codebase to follow that style
  • Integrate into the build process

Error when joining proxy without any server online

Hello fellow developers!
I tried connecting to the proxy without their being any server online or correctly configured.
Of course, it won't work, but there shouldn't be any error if coded well.
The follow error is displayed into the console:

[13:43:53 INFO]: [connected player] StealWonders (/127.0.0.1:6779) has connected[13:43:54 ERROR]: [connected player] StealWonders (/127.0.0.1:6779): unable to connect to server lobby java.util.concurrent.CompletionException: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /127.0.0.1:30066 at java.util.concurrent.CompletableFuture.encodeRelay(Unknown Source) ~[?:1.8.0_102] at java.util.concurrent.CompletableFuture.completeRelay(Unknown Source) ~[?:1.8.0_102] at java.util.concurrent.CompletableFuture.uniRelay(Unknown Source) ~[?:1.8.0_102] at java.util.concurrent.CompletableFuture$UniRelay.tryFire(Unknown Source) ~[?:1.8.0_102] at java.util.concurrent.CompletableFuture.postComplete(Unknown Source) ~[?:1.8.0_102] at java.util.concurrent.CompletableFuture.completeExceptionally(Unknown Source) ~[?:1.8.0_102] at com.velocitypowered.proxy.connection.backend.VelocityServerConnection$1.operationComplete(VelocityServerConnection.java:87) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at com.velocitypowered.proxy.connection.backend.VelocityServerConnection$1.operationComplete(VelocityServerConnection.java:77) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:504) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:483) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:121) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:327) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:343) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:616) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:563) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:442) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at java.lang.Thread.run(Unknown Source) [?:1.8.0_102] Caused by: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /127.0.0.1:30066 at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[?:1.8.0_102] at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source) ~[?:1.8.0_102] at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:327) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:340) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] ... 6 more Caused by: java.net.ConnectException: Connection refused: no further information at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[?:1.8.0_102] at sun.nio.ch.SocketChannelImpl.finishConnect(Unknown Source) ~[?:1.8.0_102] at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:327) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:340) ~[velocity.jar:1.0-SNAPSHOT (git-dc594e69, build 287)] ... 6 more [13:43:54 INFO]: [connected player] StealWonders (/127.0.0.1:6779) has disconnected

Maybe you are also able to make this message a bit clearer for normal users or might connect to the proxy: Image

send titles

Add a Player#sendTitle(title, subtitle, fadeIn, stay, fadeOut) method.

Plans on SQL drivers

Hello!

I was just wondering what kind of direction will you be taking with SQL Drivers - Will you be taking the Sponge route and provide a DataSource, Bungee route of including a driver in the library, or having all plugins shade in their own database drivers?

Sorry if this is the wrong place for this discussion.

Thanks!
Rsl

UUID Spoofing / Swapping?

It's been a long standing goal of mine to be able to swap between 'profiles' for a given online account.

Usecase 1 - Staff Switching

E.g. ryantheleach owns 1 Mojang account, and has authenticated. He is a junior staff member on a server. He is in highschool, so can't afford a second account.

Our server network prefers to audit staff actions, and to make that easier, requires that all staff members have a staff account, that has completely different permissions, and mode of play. Actions taken by staff members are audited for fair play.

Spoofing UUID's of authenticated accounts, would allow junior staff member ryantheleach to play normally on the server, as well as administrating the server, without constantly flagging false positive's in the audit log, as if he had 2 accounts on the server.

Usecase 2 - User Mode Switching

It would also enable interesting gameplay, being able to swap from a "Engineer" on a build server, that builds dungeons for other users, and an "Adventurer" who runs dungeons of other Engineers. without conflating the native in-built statistics of Minecraft.

In order for both of these to work effectively, and present themselves as completely different profiles to plugins, the far 'easiest' solution is just to swap the UUID/profile completely. Custom Plugins that need to be aware of the online owner of the account, could query it via an API.

Usecase 3 - Offline/Legacy UUID's

Instead of migrating a large amount of UUID's or accidentally creating 2 profiles for offline/lan use and Online authentication, first class support for online/offline mapping would allow offline users to connect to their normally online mode server in a LAN scenario, as well as promoting offine/LAN servers back to online mode.

Usecase 4

This would have the unintended side-effect of making mixed mode authentication easier, should auth servers go down, But would not completely allow it. as you could restrict the feature to authenticated accounts only.

I fully understand if you instantly close this ticket, as it's very close to enabling cracked server authentication via the proxy, But my instinct is people will do this anyway so we may as well enable the feature for those that could use it in positive ways, or Libraries that need multiple profiles for shared computers.

Basic permission setting support

Some people genuinely do not need a large, complex permissions plugin such as LuckPerms. Some people may prefer a very basic permissions configuration integrated into Velocity.

This system would by no means replace more complex permissions plugins, only provide a basic floor of support.

Native forced host support

Basically, add hosts that can direct to a specified set of initial connection servers that can be configured in velocity.toml as follows:

[forced-hosts]
"ftb.example.com" = ["ftb-lobby-1", "ftb-lobby-2"]

Bind IP is duplicated in logs (IPv6 format?)

[17:29:58 INFO]: Using channel type nio
[17:29:58 INFO]: Using Java compression
[17:29:58 INFO]: Using Java cipher
[17:29:58 INFO]: Booting up Velocity...
[17:29:58 INFO]: Listening on /0:0:0:0:0:0:0:0:25577
[17:29:59 INFO]: Closing endpoint /0:0:0:0:0:0:0:0:25577

Ore

Can you ad something like Ore by Spongepowered, to your Website?

About entity rewrite

I read that you want integrate velocity to paper and sponge.

How about to make velocity to handle(generate) players entity ids and sync it across network?

Ex:

  1. Paper reserve from 1 to 50000 entity ids.
  2. Player join to network and velocity generate a player id.
  3. Velocity send a custom packet or handshake with generated player entity id(from 1 to 50000)
  4. Paper send a login(joinGame) packet.
  5. Velocity check if sended entity id is generated by velocity and disable entity rewrite, if not enable entity rewrite.

Is the code right?

In the class VelocityCommandManager exisis this method:

@Override
    public void register(final Command command, final String... aliases) {
        Preconditions.checkNotNull(aliases, "aliases");
        Preconditions.checkNotNull(command, "executor");
        for (int i = 0, length = aliases.length; i < length; i++) {
            final String alias = aliases[i];
            Preconditions.checkNotNull(aliases, "alias at index %s", i);
            this.commands.put(alias.toLowerCase(Locale.ENGLISH), command);
        }
    }

i think Preconditions.checkNotNull(aliases, "alias at index %s", i); this line is not right.
i think this lin must looks like this: Preconditions.checkNotNull(alias, "alias at index %s", i);

Cannot reconnect to proxy

After connecting to the proxy, disconnecting then connecting again, the client is forcibly disconnected with 'You are already on this proxy!' and then follow error then spams the console:

java.lang.NullPointerException: null
	at com.velocitypowered.proxy.connection.backend.BackendPlaySessionHandler.handleUnknown(BackendPlaySessionHandler.java:74) ~[classes/:?]
	at com.velocitypowered.proxy.connection.MinecraftConnection.channelRead(MinecraftConnection.java:86) ~[classes/:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-codec-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-codec-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) [netty-codec-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) [netty-codec-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) [netty-handler-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:808) [netty-transport-native-epoll-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:417) [netty-transport-native-epoll-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:317) [netty-transport-native-epoll-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-common-4.1.28.Final.jar:4.1.28.Final]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_172]
[15:54:28 WARN]: An exception 'java.lang.IllegalStateException: Connection is closed.' [enable DEBUG level for full stacktrace] was thrown by a user handler's exceptionCaught() method while handling the following exception:
java.lang.NullPointerException: null
	at com.velocitypowered.proxy.connection.backend.BackendPlaySessionHandler.handleUnknown(BackendPlaySessionHandler.java:74) ~[classes/:?]
	at com.velocitypowered.proxy.connection.MinecraftConnection.channelRead(MinecraftConnection.java:86) ~[classes/:?]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-codec-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102) [netty-codec-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310) [netty-codec-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284) [netty-codec-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) [netty-handler-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965) [netty-transport-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:808) [netty-transport-native-epoll-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:417) [netty-transport-native-epoll-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:317) [netty-transport-native-epoll-4.1.28.Final.jar:4.1.28.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884) [netty-common-4.1.28.Final.jar:4.1.28.Final]
	at java.lang.Thread.run(Thread.java:748) [?:1.8.0_172]

Console Tab Completions include '/' character

Completions in console contain the '/' prefix as if they were in-game commands. Meaning it tab-completes commands that won't run for you.

Velocity 1.0-SNAPSHOT (git-19956a2e-b320)

example

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.