aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTrumeet <yuuta@yuuta.moe>2022-07-26 19:06:11 -0700
committerTrumeet <yuuta@yuuta.moe>2022-07-26 19:06:11 -0700
commitd8fe269327a1a51f2588a3573a4764613da16388 (patch)
tree97bd20983700bb13eba7f7d524d3c6d529303b46
parent31a5d2990ba666ce5ef4a1f79f7999a9bdfaac2a (diff)
downloadacron-d8fe269327a1a51f2588a3573a4764613da16388.tar
acron-d8fe269327a1a51f2588a3573a4764613da16388.tar.gz
acron-d8fe269327a1a51f2588a3573a4764613da16388.tar.bz2
acron-d8fe269327a1a51f2588a3573a4764613da16388.zip
Move the mod to mod/
-rw-r--r--README.md404
-rw-r--r--mod/README.md403
-rw-r--r--mod/acron.json (renamed from acron.json)0
-rw-r--r--mod/build.gradle (renamed from build.gradle)0
-rw-r--r--mod/gradle.properties (renamed from gradle.properties)0
-rw-r--r--mod/settings.gradle (renamed from settings.gradle)0
-rw-r--r--mod/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java (renamed from src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/Acron.java (renamed from src/main/java/moe/ymc/acron/Acron.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/MinecraftServerHolder.java (renamed from src/main/java/moe/ymc/acron/MinecraftServerHolder.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/auth/Action.java (renamed from src/main/java/moe/ymc/acron/auth/Action.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/auth/Client.java (renamed from src/main/java/moe/ymc/acron/auth/Client.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/auth/PolicyChecker.java (renamed from src/main/java/moe/ymc/acron/auth/PolicyChecker.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/auth/Rule.java (renamed from src/main/java/moe/ymc/acron/auth/Rule.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/c2s/ReqCmd.java (renamed from src/main/java/moe/ymc/acron/c2s/ReqCmd.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/c2s/ReqSetConfig.java (renamed from src/main/java/moe/ymc/acron/c2s/ReqSetConfig.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/c2s/Request.java (renamed from src/main/java/moe/ymc/acron/c2s/Request.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/cmd/CmdOut.java (renamed from src/main/java/moe/ymc/acron/cmd/CmdOut.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/cmd/CmdQueue.java (renamed from src/main/java/moe/ymc/acron/cmd/CmdQueue.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/cmd/CmdResConsumer.java (renamed from src/main/java/moe/ymc/acron/cmd/CmdResConsumer.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/cmd/CmdSrc.java (renamed from src/main/java/moe/ymc/acron/cmd/CmdSrc.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/common/Vec2f.java (renamed from src/main/java/moe/ymc/acron/common/Vec2f.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/common/Vec3d.java (renamed from src/main/java/moe/ymc/acron/common/Vec3d.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/common/WorldKey.java (renamed from src/main/java/moe/ymc/acron/common/WorldKey.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/config/Config.java (renamed from src/main/java/moe/ymc/acron/config/Config.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/config/ConfigReloadCmd.java (renamed from src/main/java/moe/ymc/acron/config/ConfigReloadCmd.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/config/json/Client.java (renamed from src/main/java/moe/ymc/acron/config/json/Client.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/config/json/Config.java (renamed from src/main/java/moe/ymc/acron/config/json/Config.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/config/json/ConfigDeserializationException.java (renamed from src/main/java/moe/ymc/acron/config/json/ConfigDeserializationException.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/config/json/ConfigDeserializer.java (renamed from src/main/java/moe/ymc/acron/config/json/ConfigDeserializer.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/config/json/ConfigJsonObject.java (renamed from src/main/java/moe/ymc/acron/config/json/ConfigJsonObject.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/config/json/Rule.java (renamed from src/main/java/moe/ymc/acron/config/json/Rule.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/jvav/Pair.java (renamed from src/main/java/moe/ymc/acron/jvav/Pair.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/mixin/CommandManagerMixin.java (renamed from src/main/java/moe/ymc/acron/mixin/CommandManagerMixin.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/mixin/LivingEntityMixin.java (renamed from src/main/java/moe/ymc/acron/mixin/LivingEntityMixin.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/mixin/MinecraftDedicatedServerMixin.java (renamed from src/main/java/moe/ymc/acron/mixin/MinecraftDedicatedServerMixin.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/mixin/MinecraftServerMixin.java (renamed from src/main/java/moe/ymc/acron/mixin/MinecraftServerMixin.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/mixin/ServerLoginNetworkHandlerMixin.java (renamed from src/main/java/moe/ymc/acron/mixin/ServerLoginNetworkHandlerMixin.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java (renamed from src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/mixin/ServerPlayNetworkHandlerMixin.java (renamed from src/main/java/moe/ymc/acron/mixin/ServerPlayNetworkHandlerMixin.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/mixin/ServerPlayerEntityMixin.java (renamed from src/main/java/moe/ymc/acron/mixin/ServerPlayerEntityMixin.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/net/AcronInitializer.java (renamed from src/main/java/moe/ymc/acron/net/AcronInitializer.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/net/Attributes.java (renamed from src/main/java/moe/ymc/acron/net/Attributes.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/net/AuthHandler.java (renamed from src/main/java/moe/ymc/acron/net/AuthHandler.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/net/ClientConfiguration.java (renamed from src/main/java/moe/ymc/acron/net/ClientConfiguration.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/net/ClientIdentification.java (renamed from src/main/java/moe/ymc/acron/net/ClientIdentification.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/net/HandshakeComplete.java (renamed from src/main/java/moe/ymc/acron/net/HandshakeComplete.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/net/WSFrameHandler.java (renamed from src/main/java/moe/ymc/acron/net/WSFrameHandler.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/Entity.java (renamed from src/main/java/moe/ymc/acron/s2c/Entity.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/Event.java (renamed from src/main/java/moe/ymc/acron/s2c/Event.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/EventQueue.java (renamed from src/main/java/moe/ymc/acron/s2c/EventQueue.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/event/EventDisconnected.java (renamed from src/main/java/moe/ymc/acron/s2c/event/EventDisconnected.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/event/EventEntityDeath.java (renamed from src/main/java/moe/ymc/acron/s2c/event/EventEntityDeath.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/event/EventLagging.java (renamed from src/main/java/moe/ymc/acron/s2c/event/EventLagging.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/event/EventPlayerJoined.java (renamed from src/main/java/moe/ymc/acron/s2c/event/EventPlayerJoined.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/event/EventPlayerMessage.java (renamed from src/main/java/moe/ymc/acron/s2c/event/EventPlayerMessage.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/response/EventCmdOut.java (renamed from src/main/java/moe/ymc/acron/s2c/response/EventCmdOut.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/response/EventCmdRes.java (renamed from src/main/java/moe/ymc/acron/s2c/response/EventCmdRes.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/response/EventError.java (renamed from src/main/java/moe/ymc/acron/s2c/response/EventError.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/s2c/response/EventOk.java (renamed from src/main/java/moe/ymc/acron/s2c/response/EventOk.java)0
-rw-r--r--mod/src/main/java/moe/ymc/acron/serialization/Serializer.java (renamed from src/main/java/moe/ymc/acron/serialization/Serializer.java)0
-rw-r--r--mod/src/main/resources/acron.mixins.json (renamed from src/main/resources/acron.mixins.json)0
-rw-r--r--mod/src/main/resources/fabric.mod.json (renamed from src/main/resources/fabric.mod.json)0
62 files changed, 410 insertions, 397 deletions
diff --git a/README.md b/README.md
index aa7f24f..a82b37b 100644
--- a/README.md
+++ b/README.md
@@ -46,9 +46,9 @@ For each response JSON parameter, the format is:
`(JSON path)` (type, limit, always present or conditions): Description.
-## Installation
+## Installing the mod
-To build this mod, you need to run `gradle build`, and the output JAR will be at `build/libs/acron-x.x.jar`.
+To build this mod, you need to run `gradle build` inside `mod/`, and the output JAR will be at `build/libs/acron-x.x.jar`.
Then, copy it to the `mods/` folder in your Minecraft server working directory.
@@ -164,402 +164,12 @@ Note, listen port and address cannot be changed during runtime.
> it will print a warning and skip the whole new configuration file until the
> error is fixed.
-## Client API
+## Using the client
-Acron uses polymorphic JSONs when communicating with clients. Therefore, each JSON
-has to contain a valid `type` parameter indicating its type:
+As Acron has an open protocol, it is easy to implement the client-side service on your own. However, Acron officially
+has [libacron](client/libacron), a client library written in C.
-```json
-{
- "type": "cmd",
- "id": 1,
- "cmd": "list"
-}
-```
-
-### Request ordering
-
-To work in a full-duplex environment, each command can specify a `id` parameter. Acron will
-return any results or errors with the same ID.
-
-Sample request:
-
-```json
-{
- "type": "cmd",
- "id": 1,
- "cmd": "list"
-}
-```
-
-The parameter `id` can be any integer, but it is the client developer's responsibility to
-make it a unique value, so he or she can identify it.
-
-Parameter `id` defaults to -1.
-
-In response, any non-server-push responses (i. e. messages) will include the same `id` parameter:
-
-```json
-{
- "type": "cmd_result",
- "id": 1,
- "result": 0,
- "success": true
-}
-```
-
-If the server fails to parse the request and returns an error, it will report the default ID `-2`.
-
-### Error Handling
-
-Error handling: Besides from the handshake request, which will send errors using HTTP status
-codes, all faulty WebSocket requests will receive error in the following format:
-
-```json
-{
- "type": "error",
- "id": 1,
- "code": 500,
- "message": "Error message. Not machine-readable."
-}
-```
-
-Parameters:
-
-* `.code` (int, HTTP status codes, always present): The machine-readable error code (e. g. 400 for Bad Request).
-* `.message` (string, any, always present): The human-readable error message.
-
-Global error codes:
-
-* 400: The request is invalid.
-* 500: The server encountered an unknown error.
-
-**`.type` and `.id` are included in every request / response, except for further noticed. Thus,
-this document excludes them from the parameter lists.**
-
-### Handshaking
-
-Clients need to use the following connection string when connecting to the Acron server:
-
-```
-ws://host:port/ws?id=client_id&token=client_token&version=0
-```
-
-*A better approach for specifying the authentication parameters is using HTTP headers,
-but the JavaScript client does not allow so. To extend compatibility, Acron forces
-all users to use HTTP query parameters to supply information.*
-
-Parameters:
-
-* `id` (required): Client ID set by the administrator.
-* `token` (required): Client token set by the administrator.
-* `version` (default: 0): API version. Only 0 is accepted at this time.
-
-Responses:
-
-* HTTP 400 (Bad Request): If either `id` or `token` is missing, or `version` is not 0.
-* HTTP 401 (Unauthorized): If either `id` is not found or `token` does not match the record.
-* HTTP 101 (Switching Protocols): The handshake is complete, and the server is upgrading to
-WebSocket.
-
-### Setting Configuration
-
-This allows clients to set a per-connection default configuration to execute commands.
-
-Clients can override the configuration temporarily when executing commands.
-
-Request:
-```json
-{
- "type": "set_config",
- "id": 1,
- "world": "overworld",
- "pos": {
- "x": 0.0,
- "y": 0.0,
- "z": 0.0
- },
- "rot": {
- "x": 0.0,
- "y": 0.0
- },
- "name": ""
-}
-```
-
-Parameters:
-
-* `.world` (enum, overworld / nether / end, overworld): The world to run commands in.
-* `.pos` (vec3d, *see below*, spawn point of `.world`): The position to run commands at.
- * `.x` (double, any within border limit, 0.0): X
- * `.y` (double, any within border limit, 0.0): Y
- * `.z` (double, any within border limit, 0.0): Z
-* `.rot` (vec2f, *see below*, `0.0 0.0`): Rotation.
- * `.x` (float, ?, 0.0): X
- * `.z` (float, ?, 0.0): Z
-* `.name` (string, any, random): Name when running commands.
-
-When the client connects, Acron will set the configuration to default values.
-
-Successful response:
-
-```json
-{
- "type": "ok"
-}
-```
-
-This shows that the configuration update is successful.
-
-### Executing Commands
-
-The main goal of Acron is to allow clients to run commands. A client can send
-any commands, and Acron will schedule them in the background.
-
-Request:
-
-```json
-{
- "type": "cmd",
- "id": 1,
- "cmd": "list",
- "config": {
-
- }
-}
-```
-
-Parameters:
-
-* `.cmd` (string, any valid command, required): The command to execute. It may or may not begin with `/`.
-* `.config` (set_config, *see above*, current connection default configuration): Temporary configuration
-when running this command. It is the same `set_config` object in the above section, but `type` and `id`
-must not be supplied.
-
-Successful response:
-
-```json
-{
- "type": "ok"
-}
-```
-
-This shows that the command is scheduled.
-
-If the connection breaks before it is done, it is still executed without any output to the connection.
-
-Possible failures:
-
-* 403: This client is not allowed to execute this command. (Configured by rules)
-
-**Command output:**
-
-When the command prints a line, Acron will send the following response:
-
-```json
-{
- "type": "cmd_out",
- "id": 1,
- "sender": "UUID",
- "out": "..."
-}
-```
-
-Parameters:
-
-* `.sender` (UUID, any UUID, always present): Sender UUID.
-* `.out` (string, any, always present): Output.
-
-**Command result:**
-
-When the command finishes without issues (?), Acron will send the following response:
-
-```json
-{
- "type": "cmd_result",
- "id": 1,
- "result": 0,
- "success": true
-}
-```
-
-All parameters always present.
-
-> **Note**
->
-> The result completely depends on Minecraft server's response.
-> It may not be reliable, and the values of `.result` and `.success` are
-> undocumented.
-
-### Receiving Messages
-
-Another major part of Acron is to allow clients receive events from the server.
-
-Every event will have a pre-defined `type` with other custom parameters. Parameter `id` will not
-present in events.
-
-> **Contributor Guide**
->
-> Internally, all message Acron sends to clients are called events, including
-> command results.
-
-#### Player joined
-
-Response:
-
-```json
-{
- "type": "join",
- "player": {
- "name": "",
- "uuid": "",
- "pos": {
- "x": 0.0,
- "y": 0.0,
- "z": 0.0
- },
- "world": "end"
- }
-}
-```
-
-Parameters:
-
-* `.player` (entity, see below, always present): The player.
- * `.name` (string, any valid Minecraft username, always present): Username.
- * `.uuid` (uuid, UUID, always present): UUID.
- * `.pos` (vec3d, see below, always present): The position he or she joins.
- * `.x` (double, any within border limit, 0.0): X
- * `.y` (double, any within border limit, 0.0): Y
- * `.z` (double, any within border limit, 0.0): Z
- * `.world` (enum, overworld / nether / end, not present if Acron cannot determine the world): The dimension
-he or she joins.
-
-#### Player Disconnected
-
-Response:
-
-```json
-{
- "type": "disconnect",
- "player": {
- "name": "",
- "uuid": "",
- "pos": {
- "x": 0.0,
- "y": 0.0,
- "z": 0.0
- },
- "world": "end"
- },
- "reason": ""
-}
-```
-
-Parameters:
-
-* `.player` (entity, see below, null only when the server cannot verify the user): The player.
- * `.name` (string, any valid Minecraft username, always present): Username.
- * `.uuid` (uuid, UUID, always present): UUID.
- * `.pos` (vec3d, see below, always present): The position he or she leaves.
- * `.x` (double, any within border limit, 0.0): X
- * `.y` (double, any within border limit, 0.0): Y
- * `.z` (double, any within border limit, 0.0): Z
- * `.world` (enum, overworld / nether / end, not present if Acron cannot determine the world): The dimension
- he or she leaves.
-* `.reason` (string, any valid disconnect reason, always present): Disconnect reason.
-
-#### Player Message
-
-Response:
-
-```json
-{
- "type": "message",
- "player": {
- "name": "",
- "uuid": "",
- "pos": {
- "x": 0.0,
- "y": 0.0,
- "z": 0.0
- },
- "world": "end"
- },
- "text": ""
-}
-```
-
-Parameters:
-
-* `.player` (entity, see below, always present): The player.
- * `.name` (string, any valid Minecraft username, always present): Username.
- * `.uuid` (uuid, UUID, always present): UUID.
- * `.pos` (vec3d, see below, always present): The position he or she sends the message.
- * `.x` (double, any within border limit, 0.0): X
- * `.y` (double, any within border limit, 0.0): Y
- * `.z` (double, any within border limit, 0.0): Z
- * `.world` (enum, overworld / nether / end, not present if Acron cannot determine the world): The dimension
-he or she sends the message.
-* `.text` (string, any valid Minecraft message, always present): The message.
-
-#### Entity Death
-
-Response:
-
-```json
-{
- "type": "death",
- "entity": {
- "name": "",
- "uuid": "",
- "pos": {
- "x": 0.0,
- "y": 0.0,
- "z": 0.0
- },
- "world": "end"
- },
- "message": ""
-}
-```
-
-Parameters:
-
-* `.entity` (entity, see below, always present): The entity.
- * `.name` (string, any, always present): Default name or custom name of the entity.
- * `.uuid` (uuid, UUID, always present): UUID.
- * `.pos` (vec3d, see below, always present): The position of the entity when died.
- * `.x` (double, any within border limit, 0.0): X
- * `.y` (double, any within border limit, 0.0): Y
- * `.z` (double, any within border limit, 0.0): Z
- * `.world` (enum, overworld / nether / end, not present if Acron cannot determine the world): The dimension
-of the entity when died.
-* `.message` (string, any valid death message, always present): The user-readable death message.
-
-> **Roadmap**
->
-> Parsing the death message and sending a more machine-readable message is on the roadmap.
-
-#### Server Lagging
-
-Acron will send this event when the server prints
-`Can't keep up! Is the server overloaded? Running 4313ms or 86 ticks behind` to the standard output.
-
-Response:
-
-```json
-{
- "type": "lagging",
- "ms": 100,
- "ticks": 1000
-}
-```
-
-Parameters:
-
-* `.ms` (long, >= 0, always present): Running {}ms behind.
-* `.ticks` (long, >= 0, always present): Running {} ticks behind.
+Acron also provides a cli tool: [acronc(1)](client/acronc) for administrators.
## Contributing
@@ -569,4 +179,4 @@ the email subject. If you are sending a patch, please include `[PATCH]` in the s
## License
-Acron is licensed under GPL-2.0-only except libac is licensed under LGPL-2.1-only.
+Acron is licensed under GPL-2.0-only except [libacron](client/libacron) is licensed under LGPL-2.1-only.
diff --git a/mod/README.md b/mod/README.md
new file mode 100644
index 0000000..d84a718
--- /dev/null
+++ b/mod/README.md
@@ -0,0 +1,403 @@
+# Acron Server-Side Mod
+
+## Installation and Configuration
+
+See [README.md](../README.md).
+
+## Client API
+
+Acron uses polymorphic JSONs when communicating with clients. Therefore, each JSON
+has to contain a valid `type` parameter indicating its type:
+
+```json
+{
+ "type": "cmd",
+ "id": 1,
+ "cmd": "list"
+}
+```
+
+### Request ordering
+
+To work in a full-duplex environment, each command can specify a `id` parameter. Acron will
+return any results or errors with the same ID.
+
+Sample request:
+
+```json
+{
+ "type": "cmd",
+ "id": 1,
+ "cmd": "list"
+}
+```
+
+The parameter `id` can be any integer, but it is the client developer's responsibility to
+make it a unique value, so he or she can identify it.
+
+Parameter `id` defaults to -1.
+
+In response, any non-server-push responses (i. e. messages) will include the same `id` parameter:
+
+```json
+{
+ "type": "cmd_result",
+ "id": 1,
+ "result": 0,
+ "success": true
+}
+```
+
+If the server fails to parse the request and returns an error, it will report the default ID `-2`.
+
+### Error Handling
+
+Error handling: Besides from the handshake request, which will send errors using HTTP status
+codes, all faulty WebSocket requests will receive error in the following format:
+
+```json
+{
+ "type": "error",
+ "id": 1,
+ "code": 500,
+ "message": "Error message. Not machine-readable."
+}
+```
+
+Parameters:
+
+* `.code` (int, HTTP status codes, always present): The machine-readable error code (e. g. 400 for Bad Request).
+* `.message` (string, any, always present): The human-readable error message.
+
+Global error codes:
+
+* 400: The request is invalid.
+* 500: The server encountered an unknown error.
+
+**`.type` and `.id` are included in every request / response, except for further noticed. Thus,
+this document excludes them from the parameter lists.**
+
+### Handshaking
+
+Clients need to use the following connection string when connecting to the Acron server:
+
+```
+ws://host:port/ws?id=client_id&token=client_token&version=0
+```
+
+*A better approach for specifying the authentication parameters is using HTTP headers,
+but the JavaScript client does not allow so. To extend compatibility, Acron forces
+all users to use HTTP query parameters to supply information.*
+
+Parameters:
+
+* `id` (required): Client ID set by the administrator.
+* `token` (required): Client token set by the administrator.
+* `version` (default: 0): API version. Only 0 is accepted at this time.
+
+Responses:
+
+* HTTP 400 (Bad Request): If either `id` or `token` is missing, or `version` is not 0.
+* HTTP 401 (Unauthorized): If either `id` is not found or `token` does not match the record.
+* HTTP 101 (Switching Protocols): The handshake is complete, and the server is upgrading to
+WebSocket.
+
+### Setting Configuration
+
+This allows clients to set a per-connection default configuration to execute commands.
+
+Clients can override the configuration temporarily when executing commands.
+
+Request:
+```json
+{
+ "type": "set_config",
+ "id": 1,
+ "world": "overworld",
+ "pos": {
+ "x": 0.0,
+ "y": 0.0,
+ "z": 0.0
+ },
+ "rot": {
+ "x": 0.0,
+ "y": 0.0
+ },
+ "name": ""
+}
+```
+
+Parameters:
+
+* `.world` (enum, overworld / nether / end, overworld): The world to run commands in.
+* `.pos` (vec3d, *see below*, spawn point of `.world`): The position to run commands at.
+ * `.x` (double, any within border limit, 0.0): X
+ * `.y` (double, any within border limit, 0.0): Y
+ * `.z` (double, any within border limit, 0.0): Z
+* `.rot` (vec2f, *see below*, `0.0 0.0`): Rotation.
+ * `.x` (float, ?, 0.0): X
+ * `.z` (float, ?, 0.0): Z
+* `.name` (string, any, random): Name when running commands.
+
+When the client connects, Acron will set the configuration to default values.
+
+Successful response:
+
+```json
+{
+ "type": "ok"
+}
+```
+
+This shows that the configuration update is successful.
+
+### Executing Commands
+
+The main goal of Acron is to allow clients to run commands. A client can send
+any commands, and Acron will schedule them in the background.
+
+Request:
+
+```json
+{
+ "type": "cmd",
+ "id": 1,
+ "cmd": "list",
+ "config": {
+
+ }
+}
+```
+
+Parameters:
+
+* `.cmd` (string, any valid command, required): The command to execute. It may or may not begin with `/`.
+* `.config` (set_config, *see above*, current connection default configuration): Temporary configuration
+when running this command. It is the same `set_config` object in the above section, but `type` and `id`
+must not be supplied.
+
+Successful response:
+
+```json
+{
+ "type": "ok"
+}
+```
+
+This shows that the command is scheduled.
+
+If the connection breaks before it is done, it is still executed without any output to the connection.
+
+Possible failures:
+
+* 403: This client is not allowed to execute this command. (Configured by rules)
+
+**Command output:**
+
+When the command prints a line, Acron will send the following response:
+
+```json
+{
+ "type": "cmd_out",
+ "id": 1,
+ "sender": "UUID",
+ "out": "..."
+}
+```
+
+Parameters:
+
+* `.sender` (UUID, any UUID, always present): Sender UUID.
+* `.out` (string, any, always present): Output.
+
+**Command result:**
+
+When the command finishes without issues (?), Acron will send the following response:
+
+```json
+{
+ "type": "cmd_result",
+ "id": 1,
+ "result": 0,
+ "success": true
+}
+```
+
+All parameters always present.
+
+> **Note**
+>
+> The result completely depends on Minecraft server's response.
+> It may not be reliable, and the values of `.result` and `.success` are
+> undocumented.
+
+### Receiving Messages
+
+Another major part of Acron is to allow clients receive events from the server.
+
+Every event will have a pre-defined `type` with other custom parameters. Parameter `id` will not
+present in events.
+
+> **Contributor Guide**
+>
+> Internally, all message Acron sends to clients are called events, including
+> command results.
+
+#### Player joined
+
+Response:
+
+```json
+{
+ "type": "join",
+ "player": {
+ "name": "",
+ "uuid": "",
+ "pos": {
+ "x": 0.0,
+ "y": 0.0,
+ "z": 0.0
+ },
+ "world": "end"
+ }
+}
+```
+
+Parameters:
+
+* `.player` (entity, see below, always present): The player.
+ * `.name` (string, any valid Minecraft username, always present): Username.
+ * `.uuid` (uuid, UUID, always present): UUID.
+ * `.pos` (vec3d, see below, always present): The position he or she joins.
+ * `.x` (double, any within border limit, 0.0): X
+ * `.y` (double, any within border limit, 0.0): Y
+ * `.z` (double, any within border limit, 0.0): Z
+ * `.world` (enum, overworld / nether / end, not present if Acron cannot determine the world): The dimension
+he or she joins.
+
+#### Player Disconnected
+
+Response:
+
+```json
+{
+ "type": "disconnect",
+ "player": {
+ "name": "",
+ "uuid": "",
+ "pos": {
+ "x": 0.0,
+ "y": 0.0,
+ "z": 0.0
+ },
+ "world": "end"
+ },
+ "reason": ""
+}
+```
+
+Parameters:
+
+* `.player` (entity, see below, null only when the server cannot verify the user): The player.
+ * `.name` (string, any valid Minecraft username, always present): Username.
+ * `.uuid` (uuid, UUID, always present): UUID.
+ * `.pos` (vec3d, see below, always present): The position he or she leaves.
+ * `.x` (double, any within border limit, 0.0): X
+ * `.y` (double, any within border limit, 0.0): Y
+ * `.z` (double, any within border limit, 0.0): Z
+ * `.world` (enum, overworld / nether / end, not present if Acron cannot determine the world): The dimension
+ he or she leaves.
+* `.reason` (string, any valid disconnect reason, always present): Disconnect reason.
+
+#### Player Message
+
+Response:
+
+```json
+{
+ "type": "message",
+ "player": {
+ "name": "",
+ "uuid": "",
+ "pos": {
+ "x": 0.0,
+ "y": 0.0,
+ "z": 0.0
+ },
+ "world": "end"
+ },
+ "text": ""
+}
+```
+
+Parameters:
+
+* `.player` (entity, see below, always present): The player.
+ * `.name` (string, any valid Minecraft username, always present): Username.
+ * `.uuid` (uuid, UUID, always present): UUID.
+ * `.pos` (vec3d, see below, always present): The position he or she sends the message.
+ * `.x` (double, any within border limit, 0.0): X
+ * `.y` (double, any within border limit, 0.0): Y
+ * `.z` (double, any within border limit, 0.0): Z
+ * `.world` (enum, overworld / nether / end, not present if Acron cannot determine the world): The dimension
+he or she sends the message.
+* `.text` (string, any valid Minecraft message, always present): The message.
+
+#### Entity Death
+
+Response:
+
+```json
+{
+ "type": "death",
+ "entity": {
+ "name": "",
+ "uuid": "",
+ "pos": {
+ "x": 0.0,
+ "y": 0.0,
+ "z": 0.0
+ },
+ "world": "end"
+ },
+ "message": ""
+}
+```
+
+Parameters:
+
+* `.entity` (entity, see below, always present): The entity.
+ * `.name` (string, any, always present): Default name or custom name of the entity.
+ * `.uuid` (uuid, UUID, always present): UUID.
+ * `.pos` (vec3d, see below, always present): The position of the entity when died.
+ * `.x` (double, any within border limit, 0.0): X
+ * `.y` (double, any within border limit, 0.0): Y
+ * `.z` (double, any within border limit, 0.0): Z
+ * `.world` (enum, overworld / nether / end, not present if Acron cannot determine the world): The dimension
+of the entity when died.
+* `.message` (string, any valid death message, always present): The user-readable death message.
+
+> **Roadmap**
+>
+> Parsing the death message and sending a more machine-readable message is on the roadmap.
+
+#### Server Lagging
+
+Acron will send this event when the server prints
+`Can't keep up! Is the server overloaded? Running 4313ms or 86 ticks behind` to the standard output.
+
+Response:
+
+```json
+{
+ "type": "lagging",
+ "ms": 100,
+ "ticks": 1000
+}
+```
+
+Parameters:
+
+* `.ms` (long, >= 0, always present): Running {}ms behind.
+* `.ticks` (long, >= 0, always present): Running {} ticks behind.
+
diff --git a/acron.json b/mod/acron.json
index 83edef5..83edef5 100644
--- a/acron.json
+++ b/mod/acron.json
diff --git a/build.gradle b/mod/build.gradle
index 4ea402e..4ea402e 100644
--- a/build.gradle
+++ b/mod/build.gradle
diff --git a/gradle.properties b/mod/gradle.properties
index 85e12c2..85e12c2 100644
--- a/gradle.properties
+++ b/mod/gradle.properties
diff --git a/settings.gradle b/mod/settings.gradle
index f91a4fe..f91a4fe 100644
--- a/settings.gradle
+++ b/mod/settings.gradle
diff --git a/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java b/mod/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java
index 51f05ff..51f05ff 100644
--- a/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java
+++ b/mod/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java
diff --git a/src/main/java/moe/ymc/acron/Acron.java b/mod/src/main/java/moe/ymc/acron/Acron.java
index d6f6214..d6f6214 100644
--- a/src/main/java/moe/ymc/acron/Acron.java
+++ b/mod/src/main/java/moe/ymc/acron/Acron.java
diff --git a/src/main/java/moe/ymc/acron/MinecraftServerHolder.java b/mod/src/main/java/moe/ymc/acron/MinecraftServerHolder.java
index f522884..f522884 100644
--- a/src/main/java/moe/ymc/acron/MinecraftServerHolder.java
+++ b/mod/src/main/java/moe/ymc/acron/MinecraftServerHolder.java
diff --git a/src/main/java/moe/ymc/acron/auth/Action.java b/mod/src/main/java/moe/ymc/acron/auth/Action.java
index 17d29a3..17d29a3 100644
--- a/src/main/java/moe/ymc/acron/auth/Action.java
+++ b/mod/src/main/java/moe/ymc/acron/auth/Action.java
diff --git a/src/main/java/moe/ymc/acron/auth/Client.java b/mod/src/main/java/moe/ymc/acron/auth/Client.java
index 2124ad4..2124ad4 100644
--- a/src/main/java/moe/ymc/acron/auth/Client.java
+++ b/mod/src/main/java/moe/ymc/acron/auth/Client.java
diff --git a/src/main/java/moe/ymc/acron/auth/PolicyChecker.java b/mod/src/main/java/moe/ymc/acron/auth/PolicyChecker.java
index 2ab7b97..2ab7b97 100644
--- a/src/main/java/moe/ymc/acron/auth/PolicyChecker.java
+++ b/mod/src/main/java/moe/ymc/acron/auth/PolicyChecker.java
diff --git a/src/main/java/moe/ymc/acron/auth/Rule.java b/mod/src/main/java/moe/ymc/acron/auth/Rule.java
index 55ad0d7..55ad0d7 100644
--- a/src/main/java/moe/ymc/acron/auth/Rule.java
+++ b/mod/src/main/java/moe/ymc/acron/auth/Rule.java
diff --git a/src/main/java/moe/ymc/acron/c2s/ReqCmd.java b/mod/src/main/java/moe/ymc/acron/c2s/ReqCmd.java
index 6f34b07..6f34b07 100644
--- a/src/main/java/moe/ymc/acron/c2s/ReqCmd.java
+++ b/mod/src/main/java/moe/ymc/acron/c2s/ReqCmd.java
diff --git a/src/main/java/moe/ymc/acron/c2s/ReqSetConfig.java b/mod/src/main/java/moe/ymc/acron/c2s/ReqSetConfig.java
index fcddf35..fcddf35 100644
--- a/src/main/java/moe/ymc/acron/c2s/ReqSetConfig.java
+++ b/mod/src/main/java/moe/ymc/acron/c2s/ReqSetConfig.java
diff --git a/src/main/java/moe/ymc/acron/c2s/Request.java b/mod/src/main/java/moe/ymc/acron/c2s/Request.java
index af81705..af81705 100644
--- a/src/main/java/moe/ymc/acron/c2s/Request.java
+++ b/mod/src/main/java/moe/ymc/acron/c2s/Request.java
diff --git a/src/main/java/moe/ymc/acron/cmd/CmdOut.java b/mod/src/main/java/moe/ymc/acron/cmd/CmdOut.java
index 55eadf1..55eadf1 100644
--- a/src/main/java/moe/ymc/acron/cmd/CmdOut.java
+++ b/mod/src/main/java/moe/ymc/acron/cmd/CmdOut.java
diff --git a/src/main/java/moe/ymc/acron/cmd/CmdQueue.java b/mod/src/main/java/moe/ymc/acron/cmd/CmdQueue.java
index 3c49143..3c49143 100644
--- a/src/main/java/moe/ymc/acron/cmd/CmdQueue.java
+++ b/mod/src/main/java/moe/ymc/acron/cmd/CmdQueue.java
diff --git a/src/main/java/moe/ymc/acron/cmd/CmdResConsumer.java b/mod/src/main/java/moe/ymc/acron/cmd/CmdResConsumer.java
index d22b77e..d22b77e 100644
--- a/src/main/java/moe/ymc/acron/cmd/CmdResConsumer.java
+++ b/mod/src/main/java/moe/ymc/acron/cmd/CmdResConsumer.java
diff --git a/src/main/java/moe/ymc/acron/cmd/CmdSrc.java b/mod/src/main/java/moe/ymc/acron/cmd/CmdSrc.java
index 983b4ed..983b4ed 100644
--- a/src/main/java/moe/ymc/acron/cmd/CmdSrc.java
+++ b/mod/src/main/java/moe/ymc/acron/cmd/CmdSrc.java
diff --git a/src/main/java/moe/ymc/acron/common/Vec2f.java b/mod/src/main/java/moe/ymc/acron/common/Vec2f.java
index 5ab3dfd..5ab3dfd 100644
--- a/src/main/java/moe/ymc/acron/common/Vec2f.java
+++ b/mod/src/main/java/moe/ymc/acron/common/Vec2f.java
diff --git a/src/main/java/moe/ymc/acron/common/Vec3d.java b/mod/src/main/java/moe/ymc/acron/common/Vec3d.java
index 593019f..593019f 100644
--- a/src/main/java/moe/ymc/acron/common/Vec3d.java
+++ b/mod/src/main/java/moe/ymc/acron/common/Vec3d.java
diff --git a/src/main/java/moe/ymc/acron/common/WorldKey.java b/mod/src/main/java/moe/ymc/acron/common/WorldKey.java
index fa10d54..fa10d54 100644
--- a/src/main/java/moe/ymc/acron/common/WorldKey.java
+++ b/mod/src/main/java/moe/ymc/acron/common/WorldKey.java
diff --git a/src/main/java/moe/ymc/acron/config/Config.java b/mod/src/main/java/moe/ymc/acron/config/Config.java
index 3749c25..3749c25 100644
--- a/src/main/java/moe/ymc/acron/config/Config.java
+++ b/mod/src/main/java/moe/ymc/acron/config/Config.java
diff --git a/src/main/java/moe/ymc/acron/config/ConfigReloadCmd.java b/mod/src/main/java/moe/ymc/acron/config/ConfigReloadCmd.java
index 2774c4d..2774c4d 100644
--- a/src/main/java/moe/ymc/acron/config/ConfigReloadCmd.java
+++ b/mod/src/main/java/moe/ymc/acron/config/ConfigReloadCmd.java
diff --git a/src/main/java/moe/ymc/acron/config/json/Client.java b/mod/src/main/java/moe/ymc/acron/config/json/Client.java
index 4d31308..4d31308 100644
--- a/src/main/java/moe/ymc/acron/config/json/Client.java
+++ b/mod/src/main/java/moe/ymc/acron/config/json/Client.java
diff --git a/src/main/java/moe/ymc/acron/config/json/Config.java b/mod/src/main/java/moe/ymc/acron/config/json/Config.java
index e8c5a83..e8c5a83 100644
--- a/src/main/java/moe/ymc/acron/config/json/Config.java
+++ b/mod/src/main/java/moe/ymc/acron/config/json/Config.java
diff --git a/src/main/java/moe/ymc/acron/config/json/ConfigDeserializationException.java b/mod/src/main/java/moe/ymc/acron/config/json/ConfigDeserializationException.java
index baf5b35..baf5b35 100644
--- a/src/main/java/moe/ymc/acron/config/json/ConfigDeserializationException.java
+++ b/mod/src/main/java/moe/ymc/acron/config/json/ConfigDeserializationException.java
diff --git a/src/main/java/moe/ymc/acron/config/json/ConfigDeserializer.java b/mod/src/main/java/moe/ymc/acron/config/json/ConfigDeserializer.java
index e91b355..e91b355 100644
--- a/src/main/java/moe/ymc/acron/config/json/ConfigDeserializer.java
+++ b/mod/src/main/java/moe/ymc/acron/config/json/ConfigDeserializer.java
diff --git a/src/main/java/moe/ymc/acron/config/json/ConfigJsonObject.java b/mod/src/main/java/moe/ymc/acron/config/json/ConfigJsonObject.java
index 0efd9a9..0efd9a9 100644
--- a/src/main/java/moe/ymc/acron/config/json/ConfigJsonObject.java
+++ b/mod/src/main/java/moe/ymc/acron/config/json/ConfigJsonObject.java
diff --git a/src/main/java/moe/ymc/acron/config/json/Rule.java b/mod/src/main/java/moe/ymc/acron/config/json/Rule.java
index 114e17d..114e17d 100644
--- a/src/main/java/moe/ymc/acron/config/json/Rule.java
+++ b/mod/src/main/java/moe/ymc/acron/config/json/Rule.java
diff --git a/src/main/java/moe/ymc/acron/jvav/Pair.java b/mod/src/main/java/moe/ymc/acron/jvav/Pair.java
index 29b83dc..29b83dc 100644
--- a/src/main/java/moe/ymc/acron/jvav/Pair.java
+++ b/mod/src/main/java/moe/ymc/acron/jvav/Pair.java
diff --git a/src/main/java/moe/ymc/acron/mixin/CommandManagerMixin.java b/mod/src/main/java/moe/ymc/acron/mixin/CommandManagerMixin.java
index 9aaed2e..9aaed2e 100644
--- a/src/main/java/moe/ymc/acron/mixin/CommandManagerMixin.java
+++ b/mod/src/main/java/moe/ymc/acron/mixin/CommandManagerMixin.java
diff --git a/src/main/java/moe/ymc/acron/mixin/LivingEntityMixin.java b/mod/src/main/java/moe/ymc/acron/mixin/LivingEntityMixin.java
index 9e16569..9e16569 100644
--- a/src/main/java/moe/ymc/acron/mixin/LivingEntityMixin.java
+++ b/mod/src/main/java/moe/ymc/acron/mixin/LivingEntityMixin.java
diff --git a/src/main/java/moe/ymc/acron/mixin/MinecraftDedicatedServerMixin.java b/mod/src/main/java/moe/ymc/acron/mixin/MinecraftDedicatedServerMixin.java
index 32d2fbf..32d2fbf 100644
--- a/src/main/java/moe/ymc/acron/mixin/MinecraftDedicatedServerMixin.java
+++ b/mod/src/main/java/moe/ymc/acron/mixin/MinecraftDedicatedServerMixin.java
diff --git a/src/main/java/moe/ymc/acron/mixin/MinecraftServerMixin.java b/mod/src/main/java/moe/ymc/acron/mixin/MinecraftServerMixin.java
index cb813b4..cb813b4 100644
--- a/src/main/java/moe/ymc/acron/mixin/MinecraftServerMixin.java
+++ b/mod/src/main/java/moe/ymc/acron/mixin/MinecraftServerMixin.java
diff --git a/src/main/java/moe/ymc/acron/mixin/ServerLoginNetworkHandlerMixin.java b/mod/src/main/java/moe/ymc/acron/mixin/ServerLoginNetworkHandlerMixin.java
index 94a48b5..94a48b5 100644
--- a/src/main/java/moe/ymc/acron/mixin/ServerLoginNetworkHandlerMixin.java
+++ b/mod/src/main/java/moe/ymc/acron/mixin/ServerLoginNetworkHandlerMixin.java
diff --git a/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java b/mod/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java
index f49914e..f49914e 100644
--- a/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java
+++ b/mod/src/main/java/moe/ymc/acron/mixin/ServerNetworkIoMixin.java
diff --git a/src/main/java/moe/ymc/acron/mixin/ServerPlayNetworkHandlerMixin.java b/mod/src/main/java/moe/ymc/acron/mixin/ServerPlayNetworkHandlerMixin.java
index 58bef78..58bef78 100644
--- a/src/main/java/moe/ymc/acron/mixin/ServerPlayNetworkHandlerMixin.java
+++ b/mod/src/main/java/moe/ymc/acron/mixin/ServerPlayNetworkHandlerMixin.java
diff --git a/src/main/java/moe/ymc/acron/mixin/ServerPlayerEntityMixin.java b/mod/src/main/java/moe/ymc/acron/mixin/ServerPlayerEntityMixin.java
index 4c6758b..4c6758b 100644
--- a/src/main/java/moe/ymc/acron/mixin/ServerPlayerEntityMixin.java
+++ b/mod/src/main/java/moe/ymc/acron/mixin/ServerPlayerEntityMixin.java
diff --git a/src/main/java/moe/ymc/acron/net/AcronInitializer.java b/mod/src/main/java/moe/ymc/acron/net/AcronInitializer.java
index c9953e3..c9953e3 100644
--- a/src/main/java/moe/ymc/acron/net/AcronInitializer.java
+++ b/mod/src/main/java/moe/ymc/acron/net/AcronInitializer.java
diff --git a/src/main/java/moe/ymc/acron/net/Attributes.java b/mod/src/main/java/moe/ymc/acron/net/Attributes.java
index ddb0f5c..ddb0f5c 100644
--- a/src/main/java/moe/ymc/acron/net/Attributes.java
+++ b/mod/src/main/java/moe/ymc/acron/net/Attributes.java
diff --git a/src/main/java/moe/ymc/acron/net/AuthHandler.java b/mod/src/main/java/moe/ymc/acron/net/AuthHandler.java
index 3e42e14..3e42e14 100644
--- a/src/main/java/moe/ymc/acron/net/AuthHandler.java
+++ b/mod/src/main/java/moe/ymc/acron/net/AuthHandler.java
diff --git a/src/main/java/moe/ymc/acron/net/ClientConfiguration.java b/mod/src/main/java/moe/ymc/acron/net/ClientConfiguration.java
index 450ccd4..450ccd4 100644
--- a/src/main/java/moe/ymc/acron/net/ClientConfiguration.java
+++ b/mod/src/main/java/moe/ymc/acron/net/ClientConfiguration.java
diff --git a/src/main/java/moe/ymc/acron/net/ClientIdentification.java b/mod/src/main/java/moe/ymc/acron/net/ClientIdentification.java
index 1cb4375..1cb4375 100644
--- a/src/main/java/moe/ymc/acron/net/ClientIdentification.java
+++ b/mod/src/main/java/moe/ymc/acron/net/ClientIdentification.java
diff --git a/src/main/java/moe/ymc/acron/net/HandshakeComplete.java b/mod/src/main/java/moe/ymc/acron/net/HandshakeComplete.java
index 348b5e2..348b5e2 100644
--- a/src/main/java/moe/ymc/acron/net/HandshakeComplete.java
+++ b/mod/src/main/java/moe/ymc/acron/net/HandshakeComplete.java
diff --git a/src/main/java/moe/ymc/acron/net/WSFrameHandler.java b/mod/src/main/java/moe/ymc/acron/net/WSFrameHandler.java
index 912e73a..912e73a 100644
--- a/src/main/java/moe/ymc/acron/net/WSFrameHandler.java
+++ b/mod/src/main/java/moe/ymc/acron/net/WSFrameHandler.java
diff --git a/src/main/java/moe/ymc/acron/s2c/Entity.java b/mod/src/main/java/moe/ymc/acron/s2c/Entity.java
index 3e0add1..3e0add1 100644
--- a/src/main/java/moe/ymc/acron/s2c/Entity.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/Entity.java
diff --git a/src/main/java/moe/ymc/acron/s2c/Event.java b/mod/src/main/java/moe/ymc/acron/s2c/Event.java
index 1abc35c..1abc35c 100644
--- a/src/main/java/moe/ymc/acron/s2c/Event.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/Event.java
diff --git a/src/main/java/moe/ymc/acron/s2c/EventQueue.java b/mod/src/main/java/moe/ymc/acron/s2c/EventQueue.java
index 8c470a1..8c470a1 100644
--- a/src/main/java/moe/ymc/acron/s2c/EventQueue.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/EventQueue.java
diff --git a/src/main/java/moe/ymc/acron/s2c/event/EventDisconnected.java b/mod/src/main/java/moe/ymc/acron/s2c/event/EventDisconnected.java
index 610fc58..610fc58 100644
--- a/src/main/java/moe/ymc/acron/s2c/event/EventDisconnected.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/event/EventDisconnected.java
diff --git a/src/main/java/moe/ymc/acron/s2c/event/EventEntityDeath.java b/mod/src/main/java/moe/ymc/acron/s2c/event/EventEntityDeath.java
index 4735241..4735241 100644
--- a/src/main/java/moe/ymc/acron/s2c/event/EventEntityDeath.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/event/EventEntityDeath.java
diff --git a/src/main/java/moe/ymc/acron/s2c/event/EventLagging.java b/mod/src/main/java/moe/ymc/acron/s2c/event/EventLagging.java
index 30974df..30974df 100644
--- a/src/main/java/moe/ymc/acron/s2c/event/EventLagging.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/event/EventLagging.java
diff --git a/src/main/java/moe/ymc/acron/s2c/event/EventPlayerJoined.java b/mod/src/main/java/moe/ymc/acron/s2c/event/EventPlayerJoined.java
index 408680b..408680b 100644
--- a/src/main/java/moe/ymc/acron/s2c/event/EventPlayerJoined.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/event/EventPlayerJoined.java
diff --git a/src/main/java/moe/ymc/acron/s2c/event/EventPlayerMessage.java b/mod/src/main/java/moe/ymc/acron/s2c/event/EventPlayerMessage.java
index 2769493..2769493 100644
--- a/src/main/java/moe/ymc/acron/s2c/event/EventPlayerMessage.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/event/EventPlayerMessage.java
diff --git a/src/main/java/moe/ymc/acron/s2c/response/EventCmdOut.java b/mod/src/main/java/moe/ymc/acron/s2c/response/EventCmdOut.java
index a4cb798..a4cb798 100644
--- a/src/main/java/moe/ymc/acron/s2c/response/EventCmdOut.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/response/EventCmdOut.java
diff --git a/src/main/java/moe/ymc/acron/s2c/response/EventCmdRes.java b/mod/src/main/java/moe/ymc/acron/s2c/response/EventCmdRes.java
index 8c1b6a9..8c1b6a9 100644
--- a/src/main/java/moe/ymc/acron/s2c/response/EventCmdRes.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/response/EventCmdRes.java
diff --git a/src/main/java/moe/ymc/acron/s2c/response/EventError.java b/mod/src/main/java/moe/ymc/acron/s2c/response/EventError.java
index 370e8f3..370e8f3 100644
--- a/src/main/java/moe/ymc/acron/s2c/response/EventError.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/response/EventError.java
diff --git a/src/main/java/moe/ymc/acron/s2c/response/EventOk.java b/mod/src/main/java/moe/ymc/acron/s2c/response/EventOk.java
index eb8c82d..eb8c82d 100644
--- a/src/main/java/moe/ymc/acron/s2c/response/EventOk.java
+++ b/mod/src/main/java/moe/ymc/acron/s2c/response/EventOk.java
diff --git a/src/main/java/moe/ymc/acron/serialization/Serializer.java b/mod/src/main/java/moe/ymc/acron/serialization/Serializer.java
index 8091c25..8091c25 100644
--- a/src/main/java/moe/ymc/acron/serialization/Serializer.java
+++ b/mod/src/main/java/moe/ymc/acron/serialization/Serializer.java
diff --git a/src/main/resources/acron.mixins.json b/mod/src/main/resources/acron.mixins.json
index 5d0911f..5d0911f 100644
--- a/src/main/resources/acron.mixins.json
+++ b/mod/src/main/resources/acron.mixins.json
diff --git a/src/main/resources/fabric.mod.json b/mod/src/main/resources/fabric.mod.json
index 999aeeb..999aeeb 100644
--- a/src/main/resources/fabric.mod.json
+++ b/mod/src/main/resources/fabric.mod.json