Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
761707bb20 | ||
|
|
056b57df49 | ||
|
|
2f626413fa | ||
|
|
9c1188c631 | ||
|
|
e3c5d1d93c | ||
|
|
a88d0c4796 | ||
|
|
6ad3927d91 | ||
|
|
5069b9c7ee | ||
|
|
c28eab495c | ||
|
|
1b11a2a6d0 | ||
|
|
d01d698132 | ||
|
|
6f4f838b74 | ||
|
|
232b8e2372 | ||
|
|
818a68da99 | ||
|
|
507623b333 | ||
|
|
5cd2029229 | ||
|
|
f0206c08ae | ||
|
|
c11fc81cff | ||
|
|
23f98240cb | ||
|
|
1f2fa53407 | ||
|
|
4e49afc95c | ||
|
|
6a3b0a1936 | ||
|
|
0500867a59 | ||
|
|
d139d12c42 | ||
|
|
c9e566c002 | ||
|
|
0d37f27953 | ||
|
|
677baed7b1 | ||
|
|
0b0c79b742 | ||
|
|
ddf6950ec5 | ||
|
|
97c9a5772e | ||
|
|
c09acbe6ec | ||
|
|
63abeaf9f7 | ||
|
|
cfd810670e | ||
|
|
5de0804edc | ||
|
|
50e1b8ab50 | ||
|
|
c923e2a4a1 | ||
|
|
9b85dab732 | ||
|
|
9af75eba2d | ||
|
|
cde2fd6e11 | ||
|
|
9d7c7f7dba | ||
|
|
940c4d5969 | ||
|
|
fee64de30e | ||
|
|
d453d036fc | ||
|
|
eab88d1bdf | ||
|
|
aff424c00a | ||
|
|
ace5ca489e | ||
|
|
6bd7bbe929 | ||
|
|
28b6bfa6dc | ||
|
|
185a6065fc | ||
|
|
af432580e8 | ||
|
|
544ec5a0cc | ||
|
|
f86d110312 | ||
|
|
9b72dff649 | ||
|
|
5c377d82c6 | ||
|
|
1484d50eba | ||
|
|
54e02bf6c3 | ||
|
|
2fdd56679a | ||
|
|
9e60edd307 | ||
|
|
204a24a1db | ||
|
|
019818f615 | ||
|
|
2e6f6edf99 | ||
|
|
e10d477a40 | ||
|
|
3dc4a8524c | ||
|
|
9202a8c08f | ||
|
|
19ae50f95d | ||
|
|
6e168bbe08 | ||
|
|
6c8dc900a4 | ||
|
|
1473413d7d | ||
|
|
d94cc09de7 |
No files matched your search
@@ -3,6 +3,7 @@ _site
|
||||
.jekyll-cache
|
||||
.jekyll-metadata
|
||||
vendor
|
||||
yarn.lock
|
||||
|
||||
.idea/
|
||||
|
||||
|
||||
@@ -224,12 +224,12 @@ Geyser initially rolled out a fix that forced these defaults, but has since been
|
||||
These defaults may present an issue to those running a reverse proxy in front of their Geyser instance, particularly those utilizing DDoS mitigation services like TCPShield and CosmicGuard, as to Network it will appear that all connections are originating from the same IP. To make configuration on these services easier, Geyser will disable these rate limits provided proxy protocol is enabled for the bedrock connection, and the Geyser instance is properly configured to only accept connections from the IPs of the proxy. To simplify this configuration, Geyser’s config can now accept a URL to specify proxy server IP ranges. Many DDoS mitigation providers have a static link to an always up to date text file of these.
|
||||
|
||||
```yaml
|
||||
bedrock:
|
||||
advanced.bedrock:
|
||||
# ...
|
||||
enable-proxy-protocol: true
|
||||
proxy-protocol-whitelisted-ips: [ "https://cosmic.global/ips/", "https://tcpshield.com/v4/" ]
|
||||
use-haproxy-protocol: true
|
||||
haproxy-protocol-whitelisted-ips: [ "https://cosmic.global/ips/", "https://tcpshield.com/v4/" ]
|
||||
```
|
||||
*Geyser configuration using a URL pointing a new-line separated text file containing allowed IPs for proxy-protocol usage.*
|
||||
*Geyser configuration using a URL pointing a new-line separated text file containing allowed IPs for haproxy-protocol usage.*
|
||||
|
||||
|
||||
## Long Term Impact
|
||||
|
||||
@@ -0,0 +1,472 @@
|
||||
---
|
||||
title: "Bedrock Early Packet Handling DoS Attack Summary and Response"
|
||||
slug: "early-packet-handling-attack"
|
||||
authors: Kas-tle
|
||||
hide_table_of_contents: false
|
||||
description: "A summary of how we addressed a series of exploits targeting Geyser's early handling of Bedrock game packets"
|
||||
---
|
||||
|
||||
Back in July, we received reports of multiple Geyser instances experiencing targeted Denial of Service (DoS) attacks exhibiting similar characteristics. Out of an abundance of caution, we delayed making this post to ensure that users had adequate time to upgrade. The bugs that allowed for this string of attacks were patched on Geyser builds numbered 897 and later. In the unlikely event you are still running an outdated build of Geyser from many months ago, you should update immediately by downloading the latest build from [https://geysermc.org/download](https://geysermc.org/download). The original [security advisory](https://github.com/GeyserMC/Geyser/security/advisories/GHSA-m2q6-2hwr-643w) for this vulnerability was published on the [GeyserMC/Geyser](https://github.com/GeyserMC/Geyser) repository. This response will detail the timeline, attack vectors, how they were patched, and additional measures we took to prevent future attacks.
|
||||
|
||||
<!-- truncate -->
|
||||
|
||||
## Timeline (UTC)
|
||||
|
||||
- **July 29th, 9:40PM:** Server being attacked privately reports the issue to Geyser and shares logs
|
||||
- **July 29th, 11:45PM:** Preemptive patch is released to limit the number of authenticated connections per address
|
||||
- **July 30th, 5:36PM:** Large servers continue to report attacks with newer builds of Geyser
|
||||
- **July 30th, 6:20PM:** A server being attacked provides us with packet logs, illustrating what Bedrock packets malicious clients are using to carry out the attack
|
||||
- **July 30th, 6:52PM:** Second patch is released to ensure the Bedrock client can only signal complete of resource pack sending once per session
|
||||
- **July 30th, 7:45PM:** Issue regarding connections failing to close out is reported to upstream Bedrock protocol library
|
||||
- **July 30th, 9:35PM:** Upstream Bedrock protocol library publishes patch to ensure connections are properly closed when Bedrock users are disconnected
|
||||
- **July 30th, 10:45PM:** Third patch is released updating the upstream Bedrock protocol library and ensuring Bedrock connections that cause exceptions are closed immediately
|
||||
- **July 31st, 11:24PM:** An @everyone ping is made in the Geyser Discord advising users to update their Geyser instances, and the initial security advisory is published to GitHub.
|
||||
|
||||
## Initial Disclosure
|
||||
|
||||
Use of this attack was first privately reported to us by multiple larger servers using Geyser. We were provided server logs showing a single user appearing to be authenticated multiple times. The logs generally took a form of:
|
||||
|
||||
```log
|
||||
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPleyer
|
||||
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPleyer
|
||||
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPleyer
|
||||
[17:26:09.183 GeyserServerChild-4-1/ERROR] BedrockPleyer is already logged in!
|
||||
[17:26:09.183 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[17:26:09.183 clientNetworkSession-6-3/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
|
||||
[17:26:09.183 clientNetworkSession-6-1/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
|
||||
[17:26:09.183 clientNetworkSession-6-2/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
|
||||
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
|
||||
[17:26:09.184 clientNetworkSession-6-4/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
|
||||
[17:26:09.184 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
|
||||
[17:26:09.184 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
|
||||
[17:26:09.184 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[17:26:09.184 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
|
||||
[17:26:09.185 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[17:26:09.185 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
|
||||
```
|
||||
|
||||
Based on the content of these logs, we initially suspected that packets in the early phase of the Bedrock connection were being exploited. However, we were not yet sure of what specific packets the attacker was sending. Based on these logs, we released a preemptive patch to ensure that the number of authenticated users from a single IP address at any given time was limited. This alone, however, would prove to be insufficient to mitigate the attack.
|
||||
|
||||
## Game Packet and Code Analysis of the First Attack Vector
|
||||
|
||||
Understanding this attack requires a basic understanding of the general Bedrock login process. This is detailed below:
|
||||
|
||||

|
||||
|
||||
In order to fully mitigate this attack, we required packet capture samples from a server being actively exploited. This is somewhat challenging to achieve, as traffic at the Bedrock protocol level is generally encrypted after the player has logged into the server. As a result, a modified build of Geyser is required to capture this traffic. We were fortunate to have the cooperation of a server being targeted with this attack, who installed a build of Geyser we provided to log packets. This was the resulting log, with IP addresses and usernames redacted:
|
||||
|
||||
```log
|
||||
[18:16:37.767 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ClientToServerHandshakePacket
|
||||
[18:16:37.795 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.808 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.808 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.809 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.809 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.809 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.809 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.810 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.810 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.810 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.810 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.810 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.810 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.811 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.811 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.811 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.811 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.811 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.811 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.812 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.812 GeyserServerChild-4-1/INFO] null /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.820 clientNetworkSession-6-2/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
|
||||
[18:16:37.820 clientNetworkSession-6-1/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
|
||||
[18:16:37.820 clientNetworkSession-6-4/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
|
||||
[18:16:37.820 clientNetworkSession-6-3/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
|
||||
[18:16:37.848 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.849 GeyserServerChild-4-1/INFO] BedrockPlayer /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.849 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
|
||||
[18:16:37.849 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.849 GeyserServerChild-4-1/INFO] BedrockPlayer /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.850 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
|
||||
[18:16:37.850 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
[18:16:37.850 GeyserServerChild-4-1/INFO] BedrockPlayer /XXX.XXX.XXX.XXX ResourcePackClientResponsePacket(packIds=[], status=COMPLETED)
|
||||
[18:16:37.850 GeyserServerChild-4-1/ERROR] BedrockPlayer is already logged in!
|
||||
[18:16:37.850 GeyserServerChild-4-1/INFO] Player connected with username BedrockPlayer
|
||||
```
|
||||
|
||||
The above log clearly indicates that the packet being exploited is the [ResourcePackClientResponsePacket](https://mojang.github.io/bedrock-protocol-docs/html/ResourcePackClientResponsePacket.html). This leads to code paths in Geyser being called multiple times a way that is not intended, ultimately leading to increased resource consumption. We can essentially summarize the attack as follows:
|
||||
|
||||

|
||||
|
||||
The initial response to the ResourcePackClientResponsePacket is handled by `UpstreamPacketHandler`:
|
||||
|
||||
```java
|
||||
package org.geysermc.geyser.network;
|
||||
// ...
|
||||
public class UpstreamPacketHandler extends LoggingPacketHandler {
|
||||
// ...
|
||||
public PacketSignal handle(ResourcePackClientResponsePacket packet) {
|
||||
// ...
|
||||
switch (packet.getStatus()) {
|
||||
case COMPLETED -> {
|
||||
if (geyser.getConfig().getRemote().authType() != AuthType.ONLINE) {
|
||||
session.authenticate(session.getAuthData().name());
|
||||
} else if (!couldLoginUserByName(session.getAuthData().name())) {
|
||||
// We must spawn the white world
|
||||
session.connect();
|
||||
}
|
||||
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.connect", session.getAuthData().name()));
|
||||
}
|
||||
// ...
|
||||
}
|
||||
return PacketSignal.HANDLED;
|
||||
}
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
We see in the code above that this will lead to the invocation of `GeyserSession#authenticate` for most connections, as most Geyser instances use `AuthType.FLOODGATE`:
|
||||
|
||||
```java
|
||||
package org.geysermc.geyser.session;
|
||||
// ...
|
||||
public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
||||
// ...
|
||||
public void authenticate(String username) {
|
||||
if (loggedIn) {
|
||||
geyser.getLogger().severe(GeyserLocale.getLocaleStringLog("geyser.auth.already_loggedin", username));
|
||||
return;
|
||||
}
|
||||
|
||||
loggingIn = true;
|
||||
// Always replace spaces with underscores to avoid illegal nicknames, e.g. with GeyserConnect
|
||||
protocol = new MinecraftProtocol(username.replace(' ', '_'));
|
||||
|
||||
try {
|
||||
connectDownstream();
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace();
|
||||
}
|
||||
}
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
This leads to the calling of `GeyserSession#connectDownstream`, which triggers a variety of logic to open a connection to the Java server:
|
||||
|
||||
```java
|
||||
package org.geysermc.geyser.session;
|
||||
// ...
|
||||
public class GeyserSession implements GeyserConnection, GeyserCommandSource {
|
||||
// ...
|
||||
private void connectDownstream() {
|
||||
SessionLoginEvent loginEvent = new SessionLoginEvent(this, remoteServer, new Object2ObjectOpenHashMap<>());
|
||||
GeyserImpl.getInstance().eventBus().fire(loginEvent);
|
||||
if (loginEvent.isCancelled()) {
|
||||
String disconnectReason = loginEvent.disconnectReason() == null ?
|
||||
BedrockDisconnectReasons.DISCONNECTED : loginEvent.disconnectReason();
|
||||
disconnect(disconnectReason);
|
||||
return;
|
||||
}
|
||||
|
||||
this.cookies = loginEvent.cookies();
|
||||
// Don't allow changing the remote server when it's not up to us
|
||||
// Just imagine the chaos of using an integrated world manager for an external server :)
|
||||
this.remoteServer = this.geyser.platformType() == PlatformType.STANDALONE ? loginEvent.remoteServer() : remoteServer;
|
||||
|
||||
// Start ticking
|
||||
tickThread = tickEventLoop.scheduleAtFixedRate(this::tick, nanosecondsPerTick, nanosecondsPerTick, TimeUnit.NANOSECONDS);
|
||||
|
||||
ClientSession downstream;
|
||||
if (geyser.getBootstrap().getSocketAddress() != null) {
|
||||
// We're going to connect through the JVM and not through TCP
|
||||
downstream = new LocalSession(geyser.getBootstrap().getSocketAddress(),
|
||||
upstream.getAddress().getAddress().getHostAddress(),
|
||||
this.protocol, this.tickEventLoop);
|
||||
downstream.setFlag(MinecraftConstants.CLIENT_HOST, this.remoteServer.address());
|
||||
downstream.setFlag(MinecraftConstants.CLIENT_PORT, this.remoteServer.port());
|
||||
this.downstream = new DownstreamSession(downstream);
|
||||
} else {
|
||||
downstream = new ClientNetworkSession(new InetSocketAddress(this.remoteServer.address(), this.remoteServer.port()), this.protocol, tickEventLoop, null, null);
|
||||
this.downstream = new DownstreamSession(downstream);
|
||||
|
||||
boolean resolveSrv = false;
|
||||
try {
|
||||
resolveSrv = this.remoteServer.resolveSrv();
|
||||
} catch (AbstractMethodError | NoSuchMethodError ignored) {
|
||||
// Ignore if the method doesn't exist
|
||||
// This will happen with extensions using old APIs
|
||||
}
|
||||
this.downstream.getSession().setFlag(BuiltinFlags.ATTEMPT_SRV_RESOLVE, resolveSrv);
|
||||
}
|
||||
|
||||
// Disable automatic creation of a new TcpClientSession when transferring - we don't use that functionality.
|
||||
this.downstream.getSession().setFlag(MinecraftConstants.FOLLOW_TRANSFERS, false);
|
||||
|
||||
if (geyser.getConfig().getRemote().isUseProxyProtocol()) {
|
||||
downstream.setFlag(BuiltinFlags.CLIENT_PROXIED_ADDRESS, upstream.getAddress());
|
||||
}
|
||||
if (geyser.getConfig().isForwardPlayerPing()) {
|
||||
// Let Geyser handle sending the keep alive
|
||||
downstream.setFlag(MinecraftConstants.AUTOMATIC_KEEP_ALIVE_MANAGEMENT, false);
|
||||
}
|
||||
// We'll handle this since we have the registry data on hand
|
||||
downstream.setFlag(MinecraftConstants.SEND_BLANK_KNOWN_PACKS_RESPONSE, false);
|
||||
|
||||
// We manually add the default listener to ensure the order of listeners.
|
||||
protocol.setUseDefaultListeners(false);
|
||||
|
||||
// MCPL listener comes first to handle protocol state switching before Geyser translates packets
|
||||
downstream.addListener(new ClientListener(HandshakeIntent.LOGIN));
|
||||
// Geyser adapter second to ensure translating packets in the correct states
|
||||
downstream.addListener(new GeyserSessionAdapter(this));
|
||||
|
||||
downstream.setFlag(BuiltinFlags.CLIENT_TRANSFERRING, loginEvent.transferring());
|
||||
downstream.connect(false);
|
||||
|
||||
if (!daylightCycle) {
|
||||
setDaylightCycle(true);
|
||||
}
|
||||
}
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
Notably, this allows for multiple downstream sessions (representing Geyser's connection to the Java server per player) to be created for a single Bedrock session. This is not intended behavior, as it leads to significantly increased resource consumption. This is especially true on Geyser Standalone, which, as seen in the code above, must open a TCP session to the Java server. The window of time for an attacker to pull this off is relatively short, as once Geyser completes the Java login process on behalf of the Bedrock client, `GeyserSession.loggedIn` is set to true, preventing further calls to `GeyserSession#connectDownstream`. However, this is still enough time for an attacker to create numerous downstream sessions, leading to a DoS attack. We attempted to mitigate this by disconnecting clients that send multiple ResourcePackClientResponsePacket in a single session. The following class diagram summarizes this:
|
||||
|
||||

|
||||
|
||||
## Code Analysis of the Second Attack Vector
|
||||
|
||||
While we thought we had addressed the root issue and provided the affected users with a patch for testing, we quickly received logs that indicated otherwise:
|
||||
|
||||
```log
|
||||
[18:54:29.235 GeyserServerChild-4-3/INFO] Player connected with username BedrockPlayer
|
||||
[18:54:29.237 clientNetworkSession-6-2/INFO] BedrockPlayer (logged in as: BedrockPlayer) has connected to remote java server on address 127.0.0.1
|
||||
[18:54:49.257 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:54:49.259 GeyserServerChild-4-3/INFO] BedrockPlayer has disconnected from remote Java server on address 127.0.0.1 because of An internal error occurred!
|
||||
[18:54:52.836 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:54:55.620 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:54:56.186 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:54:56.872 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:54:59.508 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:02.551 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:03.025 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:03.619 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:04.254 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:04.922 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:05.435 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:07.662 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:08.139 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:08.650 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:11.066 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:13.498 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:14.023 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:14.466 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:15.057 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:15.712 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:16.211 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:18.431 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:18.966 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:19.443 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:21.599 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:23.904 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:24.409 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:24.971 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:25.539 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
[18:55:26.225 GeyserServerChild-4-3/WARN] Exception caught in session of BedrockPlayer: index: 13, length: 25710 (expected: range(0, 27))
|
||||
```
|
||||
|
||||
These exceptions are thrown by Geyser's InvalidPacketHandler, which is designed to quickly disconnect players that send malformed packets or packets that exceed the expected size limits. This is a security measure to prevent potential exploits or crashes caused by invalid data.
|
||||
|
||||
```java
|
||||
package org.geysermc.geyser.network;
|
||||
// ...
|
||||
public class InvalidPacketHandler extends ChannelInboundHandlerAdapter {
|
||||
public static final String NAME = "rak-error-handler";
|
||||
|
||||
private final GeyserSession session;
|
||||
|
||||
@Override
|
||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
||||
Throwable rootCause = Stream.iterate(cause, Throwable::getCause)
|
||||
.filter(element -> element.getCause() == null)
|
||||
.findFirst()
|
||||
.orElse(cause);
|
||||
|
||||
GeyserLogger logger = GeyserImpl.getInstance().getLogger();
|
||||
|
||||
if (!(rootCause instanceof IllegalArgumentException)) {
|
||||
// Kick users that cause exceptions
|
||||
logger.warning("Exception caught in session of " + session.bedrockUsername() + ": " + rootCause.getMessage());
|
||||
session.disconnect("An internal error occurred!");
|
||||
return;
|
||||
}
|
||||
|
||||
// Kick users that try to send illegal packets
|
||||
logger.warning("Illegal packet from " + session.bedrockUsername() + ": " + rootCause.getMessage());
|
||||
if (logger.isDebug()) {
|
||||
cause.printStackTrace();
|
||||
}
|
||||
session.disconnect("Invalid packet received!");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
This makes the aforementioned logs of particular concern, as it should not be possible for any exceptions to be triggered from this handler multiple times. The first exception should be logged and trigger an immediate disconnect, preventing further exceptions from being thrown. Despite this, the log clearly indicates that multiple exceptions are being thrown in quick succession, suggesting that the disconnect is not being handled as intended. This is summarized below:
|
||||
|
||||

|
||||
|
||||
We first followed the chain of `GeyserSession#disconnect`. This invokes Geyser's `UpstreamSession#disconnect`, which contains `BedrockServerSession` and invokes `BedrockServerSession#disconnect`. Beyond this, the disconnect logic is handled by the upstream Bedrock protocol library used by Geyser, [CloudburstMC/Protocol](https://github.com/CloudburstMC/Protocol). The overall logic is summarized below:
|
||||
|
||||

|
||||
|
||||
Upon further investigation, we found that the Bedrock protocol library did not actually close the underlying Netty channel when a disconnect was triggered:
|
||||
|
||||
```java
|
||||
package org.cloudburstmc.protocol.bedrock;
|
||||
// ...
|
||||
public class BedrockServerSession extends BedrockSession {
|
||||
// ...
|
||||
public void disconnect(@Nullable String reason, boolean hideReason) {
|
||||
this.checkForClosed();
|
||||
|
||||
DisconnectPacket packet = new DisconnectPacket();
|
||||
if (reason == null || hideReason) {
|
||||
packet.setMessageSkipped(true);
|
||||
reason = BedrockDisconnectReasons.DISCONNECTED;
|
||||
}
|
||||
packet.setKickMessage(reason);
|
||||
this.sendPacketImmediately(packet);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
This allows an attacker that should have been disconnected to continue to send malicous packets that lead to expensive deserialization logic. The result is another potential denial of service (DoS) attack vector.
|
||||
|
||||
## Patch and Mitigation
|
||||
|
||||
We mitigated the first attack vector by ensuring that the Bedrock client can only signal completion of resource pack sending once per session. This was done by modifying the `UpstreamPacketHandler` to check if the `finishedResourcePackSending` flag is already set before proceeding with authentication logic:
|
||||
|
||||
```java
|
||||
package org.geysermc.geyser.network;
|
||||
// ...
|
||||
public class UpstreamPacketHandler extends LoggingPacketHandler {
|
||||
// ...
|
||||
public PacketSignal handle(ResourcePackClientResponsePacket packet) {
|
||||
// ...
|
||||
// highlight-start
|
||||
if (finishedResourcePackSending) {
|
||||
session.disconnect("Illegal duplicate resource pack response packet received!");
|
||||
return PacketSignal.HANDLED;
|
||||
}
|
||||
// highlight-end
|
||||
// ...
|
||||
switch (packet.getStatus()) {
|
||||
case COMPLETED -> {
|
||||
// highlight-start
|
||||
finishedResourcePackSending = true;
|
||||
// highlight-end
|
||||
if (geyser.getConfig().getRemote().authType() != AuthType.ONLINE) {
|
||||
session.authenticate(session.getAuthData().name());
|
||||
} else if (!couldLoginUserByName(session.getAuthData().name())) {
|
||||
// We must spawn the white world
|
||||
session.connect();
|
||||
}
|
||||
geyser.getLogger().info(GeyserLocale.getLocaleStringLog("geyser.network.connect", session.getAuthData().name()));
|
||||
}
|
||||
// ...
|
||||
}
|
||||
return PacketSignal.HANDLED;
|
||||
}
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
This ensures that any further attempts to send a `ResourcePackClientResponsePacket` after the first one will result in an immediate disconnect, preventing the creation of multiple downstream sessions.
|
||||
|
||||
The second attack vector was mitigated by ensuring that the disconnect logic in the Bedrock protocol library properly closes the underlying Netty channel. This was achieved by modifying the `BedrockServerSession#disconnect` method to schedule a task that closes the session after a timeout, ensuring that the channel is closed after the disconnect packet is sent. Packet serialzation is also stopped immediately for disconnected clients:
|
||||
|
||||
```java
|
||||
package org.cloudburstmc.protocol.bedrock;
|
||||
// ...
|
||||
public class BedrockServerSession extends BedrockSession {
|
||||
private static final int TIMEOUT_SECONDS = SystemPropertyUtil.getInt("org.cloudburstmc.protocol.bedrock.disconnectTimeout", 10);
|
||||
// ...
|
||||
public void disconnect(@Nullable String reason, boolean hideReason) {
|
||||
this.checkForClosed();
|
||||
|
||||
DisconnectPacket packet = new DisconnectPacket();
|
||||
String finalReason;
|
||||
if (reason == null || hideReason) {
|
||||
packet.setMessageSkipped(true);
|
||||
finalReason = BedrockDisconnectReasons.DISCONNECTED;
|
||||
} else {
|
||||
finalReason = reason;
|
||||
}
|
||||
packet.setKickMessage(finalReason);
|
||||
this.sendPacketImmediately(packet);
|
||||
|
||||
// highlight-start
|
||||
if (!this.isSubClient()) {
|
||||
this.getPeer().blackholeInboundPackets();
|
||||
}
|
||||
|
||||
this.getPeer().channel.eventLoop().schedule(() -> {
|
||||
if (this.isConnected()) {
|
||||
this.close(finalReason);
|
||||
}
|
||||
}, TIMEOUT_SECONDS, TimeUnit.SECONDS);
|
||||
// highlight-end
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Logic was also added to Geyser's `InvalidPacketHandler` to ensure that invalid packets result in an immediate closing of the underlying Netty channel:
|
||||
|
||||
```java
|
||||
package org.geysermc.geyser.network;
|
||||
// ...
|
||||
public class InvalidPacketHandler extends ChannelInboundHandlerAdapter {
|
||||
public static final String NAME = "rak-error-handler";
|
||||
|
||||
private final GeyserSession session;
|
||||
|
||||
@Override
|
||||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
||||
Throwable rootCause = Stream.iterate(cause, Throwable::getCause)
|
||||
.filter(element -> element.getCause() == null)
|
||||
.findFirst()
|
||||
.orElse(cause);
|
||||
|
||||
GeyserLogger logger = GeyserImpl.getInstance().getLogger();
|
||||
|
||||
if (!(rootCause instanceof IllegalArgumentException)) {
|
||||
// Kick users that cause exceptions
|
||||
logger.error("Exception caught in session of " + session.bedrockUsername(), cause);
|
||||
session.disconnect("An internal error occurred!");
|
||||
// highlight-start
|
||||
session.forciblyCloseUpstream();
|
||||
// highlight-end
|
||||
return;
|
||||
}
|
||||
|
||||
// Kick users that try to send illegal packets
|
||||
logger.error("Illegal packet from " + session.bedrockUsername(), cause);
|
||||
session.disconnect("Invalid packet received!");
|
||||
// highlight-start
|
||||
session.forciblyCloseUpstream();
|
||||
// highlight-end
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Long Term Impact
|
||||
|
||||
All users of Geyser running outdated builds should update as soon as possible to ensure they are not vulnerable to the attacks described in this post. During the process of investigating this attack, we were made aware of multiple servers being exploited, meaning this is being exploited in the wild. Unlike the previous RakNet amplification attack, this attack is limited in scope to the selected Geyser instance. We expect the number of unpatched instances to decrease over time as Bedrock updates require server owners to update their Geyser instances. As of November 2025, we have not received any recent reports of Geyser instances being targeted by this attack vector, indicating that most instances have been patched.
|
||||
|
||||
## Acknowledgements
|
||||
|
||||
We thank the community for their patience as we addressed this issue, the server owners who responsibly disclosed this issue to us, the developers at Cloudburst and Geyser that worked to mitigate the issue, all donors for their financial support of Geyser, and Cubecraft and Open Collaboration for their continued financial and operational support of the project.
|
||||
@@ -93,6 +93,21 @@ const config: Config = {
|
||||
src: 'img/apple-touch-icon.png',
|
||||
},
|
||||
items: [
|
||||
{
|
||||
type: 'dropdown',
|
||||
label: 'Software',
|
||||
position: 'left',
|
||||
items: [
|
||||
{
|
||||
to: '/software/geyser',
|
||||
label: 'Geyser',
|
||||
},
|
||||
{
|
||||
to: '/software/floodgate',
|
||||
label: 'Floodgate',
|
||||
},
|
||||
]
|
||||
},
|
||||
{
|
||||
type: 'dropdown',
|
||||
label: 'Wiki',
|
||||
@@ -134,11 +149,6 @@ const config: Config = {
|
||||
className: 'header-utilities-link',
|
||||
position: 'left',
|
||||
items: [
|
||||
{
|
||||
|
||||
to: 'utilities/config-editor',
|
||||
label: 'Config Editor',
|
||||
},
|
||||
{
|
||||
|
||||
to: 'utilities/dump-viewer',
|
||||
@@ -152,12 +162,12 @@ const config: Config = {
|
||||
position: 'left',
|
||||
className: 'header-download-link'
|
||||
},
|
||||
{
|
||||
{ // Name on mobile sidebar specified in custom.scss
|
||||
href: 'https://github.com/GeyserMC/Geyser',
|
||||
position: 'right',
|
||||
className: 'header-github-link'
|
||||
},
|
||||
{
|
||||
{ // Name on mobile sidebar specified in custom.scss
|
||||
href: 'https://discord.gg/geysermc',
|
||||
position: 'right',
|
||||
className: 'header-discord-link'
|
||||
@@ -175,6 +185,7 @@ const config: Config = {
|
||||
href: '/',
|
||||
width: 430,
|
||||
},
|
||||
copyright: `Copyright © ${new Date().getFullYear()} GeyserMC. Built with Docusaurus.<br>This website is not an official Minecraft website and is not associated with Mojang Studios or Microsoft. All product and company names are trademarks or registered trademarks of their respective holders. Use of these names does not imply any affiliation or endorsement by them.`,
|
||||
links: [
|
||||
{
|
||||
title: 'Wiki',
|
||||
|
||||
@@ -53,11 +53,14 @@
|
||||
"providers.provider.minehut.description": {
|
||||
"message": "Connect via `bedrock.minehut.com` and do `/join [servername]`, or connect directly via `[servername].bedrock.minehut.gg`."
|
||||
},
|
||||
"providers.provider.omgserv.description": {
|
||||
"message": "Select Geyser in the [Install Menu](https://i.imgur.com/Gewpsrq.png), it will be automatically installed. You can enable floodgate in the [server properties on the dashboard](https://i.imgur.com/jg5mzNj.png)."
|
||||
},
|
||||
"providers.provider.piglinhost.description": {
|
||||
"message": "Order from the [cross-platform servers page](https://piglinhost.com/minecraft-java-hosting.html). Alternatively, contact their support by creating a [support ticket](https://billing.piglinhost.com/submitticket.php?step=2&deptid=5) or via discord for installation and configuration help."
|
||||
},
|
||||
"providers.provider.omgserv.description": {
|
||||
"message": "Select Geyser in the [Install Menu](https://i.imgur.com/Gewpsrq.png), it will be automatically installed. You can enable floodgate in the [server properties on the dashboard](https://i.imgur.com/jg5mzNj.png)."
|
||||
"providers.provider.playhosting.description": {
|
||||
"message": "Tick the 'Enable Bedrock crossplay?' option when changing your server software to automatically install and configure Geyser + Floodgate. For more details, navigate to [help.play.hosting/minecraft/crossplay](https://help.play.hosting/minecraft/crossplay)."
|
||||
},
|
||||
"providers.provider.pufferfish_host.description": {
|
||||
"message": "Geyser is installed and configured on all servers by default."
|
||||
@@ -206,6 +209,15 @@
|
||||
"providers.provider.feather.description": {
|
||||
"message": "Their proxy network does not support UDP. Therefore, Geyser is not supported. As an alternative, set up a paper server with e.g. playit.gg instead of port forwarding."
|
||||
},
|
||||
"providers.provider.freemcserver_net.description": {
|
||||
"message": "Install Geyser from the Plugins tab, then connect to your server using your Java IP and port."
|
||||
},
|
||||
"providers.provider.ultraservers.description": {
|
||||
"message": "Select 'Paper + Geyser' under the Change version tab. You can connect to your server using the same IP and port as you would on Java. Existing servers can use the Plugins/Minecraft mods tab to install Geyser. See [Crossplay](https://docs.ultraservers.com/minecraft/plugins-mods/crossplay-on-java-and-bedrock) for more information."
|
||||
},
|
||||
"providers.provider.bedrockhost.description": {
|
||||
"message": "Easiest solution is: Go to hosting panel > install new engine > Ready-made solutions and select Geyser. This will install Paper & Geyser-Spigot - no setup needed, just connect with your Java IP and port. See [BedrockHost's article](https://bedrockhost.pl/w/geyser-czyli-serwer-minecraft-java-i-bedrock-w-jednym) for more details or for custom setup instructions (available in Polish)."
|
||||
},
|
||||
"pages.main.title": {
|
||||
"message": "Revolutionize Your Minecraft Server"
|
||||
},
|
||||
@@ -236,32 +248,11 @@
|
||||
"pages.download.description.geyserconnect": {
|
||||
"message": "A plugin to allow for Geyser players to connect to your server without needing to use a proxy."
|
||||
},
|
||||
"pages.download.description.geyseroptionalpack": {
|
||||
"message": "An optional Bedrock resource pack to extend Geyser functionality."
|
||||
},
|
||||
"pages.download.description.thirdpartycosmetics": {
|
||||
"message": "An extension that adds support for loading ears and other third party cosmetics on java players"
|
||||
},
|
||||
"pages.configeditor.noconfigselected.heading": {
|
||||
"message": "No config selected."
|
||||
},
|
||||
"pages.configeditor.noconfigselected.subheading": {
|
||||
"message": "Upload a file or get started with the default config!"
|
||||
},
|
||||
"pages.configeditor.button.defaultconfig": {
|
||||
"message": "Default"
|
||||
},
|
||||
"pages.configeditor.button.upload": {
|
||||
"message": "Upload"
|
||||
},
|
||||
"pages.configeditor.button.export": {
|
||||
"message": "Export"
|
||||
},
|
||||
"pages.configeditor.title": {
|
||||
"message": "Config Editor"
|
||||
},
|
||||
"pages.configeditor.subheading": {
|
||||
"message": "Edit your Geyser configuration."
|
||||
"pages.download.description.emoteoffhand": {
|
||||
"message": "An extension that allows Bedrock players to switch their offhand and mainhand item by emoting."
|
||||
},
|
||||
"pages.dumpviewer.title": {
|
||||
"message": "Dump Viewer"
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
{
|
||||
"copyright": {
|
||||
"message": "Copyright © 2024 GeyserMC. Built with Docusaurus.",
|
||||
"description": "The footer copyright"
|
||||
},
|
||||
"link.title.Wiki": {
|
||||
"message": "Wiki",
|
||||
"description": "The title of the footer links column with title=Wiki in the footer"
|
||||
|
||||
@@ -39,10 +39,6 @@
|
||||
"message": "Other",
|
||||
"description": "Navbar item with label Other"
|
||||
},
|
||||
"item.label.Config Editor": {
|
||||
"message": "Config Editor",
|
||||
"description": "Navbar item with label Config Editor"
|
||||
},
|
||||
"item.label.Dump Viewer": {
|
||||
"message": "Dump Viewer",
|
||||
"description": "Navbar item with label Dump Viewer"
|
||||
|
||||
@@ -68,10 +68,6 @@ const sidebars: SidebarsConfig = {
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Configuring Geyser',
|
||||
link: {
|
||||
type: 'doc',
|
||||
id: 'geyser/understanding-the-config',
|
||||
},
|
||||
items: [
|
||||
'geyser/commands',
|
||||
'geyser/translations',
|
||||
@@ -99,6 +95,7 @@ const sidebars: SidebarsConfig = {
|
||||
id: 'geyser/custom-resource-packs'
|
||||
},
|
||||
items: [
|
||||
'geyser/packs',
|
||||
'geyser/custom-items',
|
||||
'geyser/custom-blocks',
|
||||
'geyser/custom-skulls',
|
||||
@@ -135,10 +132,12 @@ const sidebars: SidebarsConfig = {
|
||||
'other/index',
|
||||
'other/geyserconnect',
|
||||
'other/thirdpartycosmetics',
|
||||
'other/geyseroptionalpack',
|
||||
'other/geyserintegratedpack',
|
||||
'other/community-geyser-projects',
|
||||
'other/hurricane',
|
||||
'other/rainbow',
|
||||
'other/hydraulic',
|
||||
'other/thunder',
|
||||
'other/test-server',
|
||||
'other/developer-guide',
|
||||
'other/discord-bot-usage'
|
||||
|
||||
@@ -16,9 +16,10 @@ interface ProjectDownloadProps {
|
||||
[key: string]: { url: string, file: string };
|
||||
};
|
||||
gridColumns?: number;
|
||||
warning?: React.ReactNode;
|
||||
}
|
||||
|
||||
export const ProjectDownload: React.FC<ProjectDownloadProps> = ({ projectId, description, setup, downloadsInfo, additionalDownloads, gridColumns }) => {
|
||||
export const ProjectDownload: React.FC<ProjectDownloadProps> = ({ projectId, description, setup, downloadsInfo, additionalDownloads, gridColumns, warning }) => {
|
||||
const [platformInfo, setPlatformInfo] = useState<Downloads.Builds>({
|
||||
project_id: '',
|
||||
project_name: '',
|
||||
@@ -79,6 +80,11 @@ export const ProjectDownload: React.FC<ProjectDownloadProps> = ({ projectId, des
|
||||
<Column>
|
||||
<h3>Build #{latestBuild.build} · {new Date(latestBuild.time).toLocaleDateString()}:</h3>
|
||||
<Grid elementsPerRow={gridColumns || 2} gap="8px">
|
||||
{ warning &&
|
||||
<div className='warning-box'>
|
||||
{ warning }
|
||||
</div>
|
||||
}
|
||||
{ setup &&
|
||||
<a href={setup} className='no-underline setup-button large-button'>
|
||||
<b><FontAwesomeIcon icon={faBook}/> Setup Instructions</b>
|
||||
|
||||
@@ -14,25 +14,37 @@ export const Provider = ({ type }) => {
|
||||
const hostingProviders: HostingProvider[] = providersData[type as ProviderType]
|
||||
|
||||
return (
|
||||
<div>
|
||||
<ul>{hostingProviders.map((provider: HostingProvider) => (
|
||||
<li>
|
||||
<a href={provider.url}>{provider.name}</a>
|
||||
{provider.description != null ? (
|
||||
<ReactMarkdown children={` ‐ ${provider.description}`} components={{ p: noP }} />
|
||||
) : (
|
||||
''
|
||||
)}
|
||||
</li>
|
||||
))}</ul>
|
||||
</div>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Provider</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{hostingProviders.map((provider: HostingProvider) => (
|
||||
<tr>
|
||||
<td>
|
||||
<a href={provider.url}>{provider.name}</a>
|
||||
</td>
|
||||
<td>
|
||||
{provider.description != null ? (
|
||||
<ReactMarkdown children={` ‐ ${provider.description}`} components={{ p: noP }} />
|
||||
) : (
|
||||
''
|
||||
)}
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
</table>
|
||||
)
|
||||
}
|
||||
|
||||
export const ProviderSelector = () => {
|
||||
const providers: HostingProvider[] = [
|
||||
...Object.values(providersData.built_in),
|
||||
...Object.values(providersData.support),
|
||||
...Object.values(providersData.support),
|
||||
...Object.values(providersData.no_support)
|
||||
].flat().sort((a, b) => a.name.localeCompare(b.name));
|
||||
|
||||
@@ -43,7 +55,7 @@ export const ProviderSelector = () => {
|
||||
message: "If your hosting provider is not listed, try enabling the `clone-remote-port` option in the config. Then, restart the server, and try connecting with the same IP and port as on Java Edition. <br> If this does not work, ask your server hosting provider for a UDP port, and use that. For VPS/KVM servers please follow the self-hosting steps."
|
||||
})
|
||||
} as HostingProvider);
|
||||
|
||||
|
||||
|
||||
const [selectedProvider, setSelectedProvider] = useState(null);
|
||||
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import { PropsWithChildren } from 'react';
|
||||
import styles from "./styles.module.scss";
|
||||
import clsx from 'clsx';
|
||||
|
||||
interface SoftwareFeatureProps {
|
||||
title: string;
|
||||
image?: string;
|
||||
flipped?: boolean;
|
||||
}
|
||||
|
||||
export default function SoftwareFeature({ title, image, flipped, children }: PropsWithChildren<SoftwareFeatureProps>) {
|
||||
return (
|
||||
<div className={clsx(styles.feature, { [styles.flipped]: flipped })}>
|
||||
<div className={clsx(styles.content, "text--left padding-horiz--md")}>
|
||||
<h3 className={styles.title}>{title}</h3>
|
||||
{children}
|
||||
</div>
|
||||
{image && (
|
||||
<div>
|
||||
<img src={image} alt={title} />
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
.feature {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.feature.flipped > *:first-child {
|
||||
order: 2;
|
||||
}
|
||||
|
||||
.feature.flipped > *:last-child {
|
||||
order: 1;
|
||||
}
|
||||
|
||||
.content {
|
||||
margin-top: auto;
|
||||
margin-bottom: auto;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.feature {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.feature > *:first-child {
|
||||
order: 2;
|
||||
}
|
||||
|
||||
.feature > *:last-child {
|
||||
order: 1;
|
||||
}
|
||||
|
||||
.title {
|
||||
margin-top: 15px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
import React from 'react';
|
||||
import styles from './styles.module.scss';
|
||||
|
||||
interface SoftwareHeroProps {
|
||||
icon?: string;
|
||||
software: string;
|
||||
tagline?: string;
|
||||
description: string;
|
||||
downloadsUrl: string;
|
||||
docsUrl: string;
|
||||
}
|
||||
|
||||
const SoftwareHero: React.FC<SoftwareHeroProps> = ({ icon, software, tagline, description, downloadsUrl, docsUrl }) => {
|
||||
return (
|
||||
<div className={styles.heroBanner}>
|
||||
<div className="container">
|
||||
{icon && <img src={icon} className={styles.icon} />}
|
||||
|
||||
<h1 className={styles.software}>{software}</h1>
|
||||
<p className={styles.tagline}>{tagline}</p>
|
||||
<p className={styles.description}>{description}</p>
|
||||
|
||||
<div className={styles.buttons}>
|
||||
<a href={downloadsUrl} className={styles.button}>
|
||||
Downloads
|
||||
</a>
|
||||
<a href={docsUrl} className={styles.button}>
|
||||
Documentation
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default SoftwareHero;
|
||||
@@ -0,0 +1,63 @@
|
||||
.heroBanner {
|
||||
width: 100%;
|
||||
padding: 20px 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.icon {
|
||||
height: 80px;
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
.software {
|
||||
font-size: 60px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.tagline {
|
||||
font-size: 28px;
|
||||
font-weight: 600;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.description {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.buttons {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
|
||||
.button {
|
||||
border: 3px solid var(--ifm-tabs-color-active);
|
||||
border-radius: var(--ifm-global-radius);
|
||||
text-align: center;
|
||||
font-size: 18px;
|
||||
transition: background-color 0.5s ease, color 0.5s ease;
|
||||
padding: 5px 20px;
|
||||
|
||||
&:hover {
|
||||
background-color: var(--ifm-color-primary);
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.software {
|
||||
font-size: 40px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.tagline {
|
||||
font-size: 24px;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.description {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
import React from 'react';
|
||||
import { useColorMode } from '@docusaurus/theme-common';
|
||||
import styles from './styles.module.scss';
|
||||
|
||||
interface SoftwareStatsProps {
|
||||
githubStars: string;
|
||||
githubCommits: string;
|
||||
bstatsServers?: string;
|
||||
bstatsPlayers?: string;
|
||||
}
|
||||
|
||||
const SoftwareStats: React.FC<SoftwareStatsProps> = ({ githubStars, githubCommits, bstatsServers, bstatsPlayers }) => {
|
||||
return (
|
||||
<div className={styles.statsSection}>
|
||||
<div className="container">
|
||||
<div className={styles.flex}>
|
||||
<Stat
|
||||
label="GitHub Stars"
|
||||
value={githubStars}
|
||||
whiteIcon="/img/icons/github-white.svg"
|
||||
darkIcon="/img/icons/github-dark.svg"
|
||||
/>
|
||||
|
||||
<Stat
|
||||
label="Commits"
|
||||
value={githubCommits}
|
||||
whiteIcon="/img/icons/commit-white.svg"
|
||||
darkIcon="/img/icons/commit-dark.svg"
|
||||
/>
|
||||
|
||||
{bstatsServers && (
|
||||
<Stat
|
||||
label="Total Servers"
|
||||
value={bstatsServers}
|
||||
whiteIcon="/img/icons/server-white.svg"
|
||||
darkIcon="/img/icons/server-dark.svg"
|
||||
/>
|
||||
)}
|
||||
|
||||
{bstatsPlayers && (
|
||||
<Stat
|
||||
label="Total Players"
|
||||
value={bstatsPlayers}
|
||||
whiteIcon="/img/icons/user-white.svg"
|
||||
darkIcon="/img/icons/user-dark.svg"
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const Stat = ({ label, whiteIcon, darkIcon, value }) => {
|
||||
const { colorMode } = useColorMode();
|
||||
const icon = colorMode === 'dark' ? whiteIcon : darkIcon;
|
||||
|
||||
return (
|
||||
<div className={styles.stat}>
|
||||
<img src={icon} className={styles.statImage} />
|
||||
<div className={styles.statContent}>
|
||||
<div className={styles.statLabel}>{label}</div>
|
||||
<div className={styles.statValue}>{value}</div>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default SoftwareStats;
|
||||
@@ -0,0 +1,68 @@
|
||||
.statsSection {
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
.flex {
|
||||
display: flex;
|
||||
column-gap: 50px;
|
||||
row-gap: 20px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.stat {
|
||||
display: flex;
|
||||
column-gap: 15px;
|
||||
row-gap: 10px;
|
||||
width: 180px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.statImage {
|
||||
height: 40px;
|
||||
width: 40px;
|
||||
margin-top: auto;
|
||||
margin-bottom: auto;
|
||||
}
|
||||
|
||||
.statContent {
|
||||
margin-top: auto;
|
||||
margin-bottom: auto;
|
||||
}
|
||||
|
||||
.statLabel {
|
||||
font-weight: bold;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.statValue {
|
||||
font-size: 30px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.stat {
|
||||
flex-direction: column;
|
||||
width: auto;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.flex {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.statImage {
|
||||
height: 30px;
|
||||
width: 30px;
|
||||
}
|
||||
|
||||
.statLabel {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.statValue {
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@
|
||||
--ifm-color-primary-light: #33925d;
|
||||
--ifm-color-primary-lighter: #359962;
|
||||
--ifm-color-primary-lightest: #3cad6e;
|
||||
--ifm-color-warning: #e4f126;
|
||||
--ifm-code-font-size: 95%;
|
||||
--ifm-footer-color: rgb(238, 249, 253);
|
||||
--ifm-footer-background-color: #303846;
|
||||
@@ -74,6 +75,7 @@ html[data-theme='dark'] {
|
||||
display: inline-block;
|
||||
background-color: var(--ifm-navbar-link-color);
|
||||
mask-image: $url;
|
||||
mask-repeat: no-repeat;
|
||||
transition: background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default);
|
||||
}
|
||||
|
||||
@@ -87,7 +89,11 @@ html[data-theme='dark'] {
|
||||
}
|
||||
|
||||
.header-discord-link {
|
||||
@include header-link(32px, 26px, url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M524.5 69.8a1.5 1.5 0 0 0 -.8-.7A485.1 485.1 0 0 0 404.1 32a1.8 1.8 0 0 0 -1.9 .9 337.5 337.5 0 0 0 -14.9 30.6 447.8 447.8 0 0 0 -134.4 0 309.5 309.5 0 0 0 -15.1-30.6 1.9 1.9 0 0 0 -1.9-.9A483.7 483.7 0 0 0 116.1 69.1a1.7 1.7 0 0 0 -.8 .7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 0 0 .8 1.4A487.7 487.7 0 0 0 176 479.9a1.9 1.9 0 0 0 2.1-.7A348.2 348.2 0 0 0 208.1 430.4a1.9 1.9 0 0 0 -1-2.6 321.2 321.2 0 0 1 -45.9-21.9 1.9 1.9 0 0 1 -.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8 0 0 1 1.9-.3c96.2 43.9 200.4 43.9 295.5 0a1.8 1.8 0 0 1 1.9 .2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9 0 0 1 -.2 3.1 301.4 301.4 0 0 1 -45.9 21.8 1.9 1.9 0 0 0 -1 2.6 391.1 391.1 0 0 0 30 48.8 1.9 1.9 0 0 0 2.1 .7A486 486 0 0 0 610.7 405.7a1.9 1.9 0 0 0 .8-1.4C623.7 277.6 590.9 167.5 524.5 69.8zM222.5 337.6c-29 0-52.8-26.6-52.8-59.2S193.1 219.1 222.5 219.1c29.7 0 53.3 26.8 52.8 59.2C275.3 311 251.9 337.6 222.5 337.6zm195.4 0c-29 0-52.8-26.6-52.8-59.2S388.4 219.1 417.9 219.1c29.7 0 53.3 26.8 52.8 59.2C470.7 311 447.5 337.6 417.9 337.6z"/></svg>'));
|
||||
@include header-link(24px, 24px, url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M524.5 69.8a1.5 1.5 0 0 0 -.8-.7A485.1 485.1 0 0 0 404.1 32a1.8 1.8 0 0 0 -1.9 .9 337.5 337.5 0 0 0 -14.9 30.6 447.8 447.8 0 0 0 -134.4 0 309.5 309.5 0 0 0 -15.1-30.6 1.9 1.9 0 0 0 -1.9-.9A483.7 483.7 0 0 0 116.1 69.1a1.7 1.7 0 0 0 -.8 .7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 0 0 .8 1.4A487.7 487.7 0 0 0 176 479.9a1.9 1.9 0 0 0 2.1-.7A348.2 348.2 0 0 0 208.1 430.4a1.9 1.9 0 0 0 -1-2.6 321.2 321.2 0 0 1 -45.9-21.9 1.9 1.9 0 0 1 -.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8 0 0 1 1.9-.3c96.2 43.9 200.4 43.9 295.5 0a1.8 1.8 0 0 1 1.9 .2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9 0 0 1 -.2 3.1 301.4 301.4 0 0 1 -45.9 21.8 1.9 1.9 0 0 0 -1 2.6 391.1 391.1 0 0 0 30 48.8 1.9 1.9 0 0 0 2.1 .7A486 486 0 0 0 610.7 405.7a1.9 1.9 0 0 0 .8-1.4C623.7 277.6 590.9 167.5 524.5 69.8zM222.5 337.6c-29 0-52.8-26.6-52.8-59.2S193.1 219.1 222.5 219.1c29.7 0 53.3 26.8 52.8 59.2C275.3 311 251.9 337.6 222.5 337.6zm195.4 0c-29 0-52.8-26.6-52.8-59.2S388.4 219.1 417.9 219.1c29.7 0 53.3 26.8 52.8 59.2C470.7 311 447.5 337.6 417.9 337.6z"/></svg>'));
|
||||
|
||||
&::before { // Fixes the Discord icon being a little shorter than the others causing an offset
|
||||
mask-position: 0 2px;
|
||||
}
|
||||
}
|
||||
|
||||
.header-utilities-link {
|
||||
@@ -106,6 +112,16 @@ html[data-theme='dark'] {
|
||||
@include header-link(22px, 25px, url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path d="M96 0C43 0 0 43 0 96V416c0 53 43 96 96 96H384h32c17.7 0 32-14.3 32-32s-14.3-32-32-32V384c17.7 0 32-14.3 32-32V32c0-17.7-14.3-32-32-32H384 96zm0 384H352v64H96c-17.7 0-32-14.3-32-32s14.3-32 32-32zm32-240c0-8.8 7.2-16 16-16H336c8.8 0 16 7.2 16 16s-7.2 16-16 16H144c-8.8 0-16-7.2-16-16zm16 48H336c8.8 0 16 7.2 16 16s-7.2 16-16 16H144c-8.8 0-16-7.2-16-16s7.2-16 16-16z"/></svg>'));
|
||||
}
|
||||
|
||||
@media screen and (max-width: 996px) { // Magic numbers! This was the value which caused the site to go to mobile navigation
|
||||
.header-discord-link::after {
|
||||
content: 'Discord'
|
||||
}
|
||||
|
||||
.header-github-link::after {
|
||||
content: 'GitHub'
|
||||
}
|
||||
}
|
||||
|
||||
.api-method>.menu__link {
|
||||
align-items: center;
|
||||
justify-content: start;
|
||||
@@ -303,6 +319,16 @@ html[data-theme='dark'] {
|
||||
}
|
||||
}
|
||||
|
||||
.warning-box {
|
||||
width: 100%;
|
||||
border-left: 3px solid var(--ifm-color-warning);
|
||||
text-align: center;
|
||||
font-size: 18px;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.tabs {
|
||||
flex-wrap: wrap;
|
||||
border-bottom-color: var(--ifm-horizontal-line-color);
|
||||
@@ -344,4 +370,9 @@ html[data-theme='dark'] {
|
||||
border-radius: var(--ifm-global-radius);
|
||||
color: #fff
|
||||
}
|
||||
}
|
||||
|
||||
[data-theme='light'] img[src$='#gh-dark-mode-only'],
|
||||
[data-theme='dark'] img[src$='#gh-light-mode-only'] {
|
||||
display: none;
|
||||
}
|
||||
@@ -10,7 +10,7 @@ const descriptionTemplates = {
|
||||
}),
|
||||
ipAndPort: translate({
|
||||
id: 'providers.templates.ip_and_port',
|
||||
message: "Enable `clone-remote-port` (or manually set `bedrock port` to the Java port), uncomment `bedrock address`, and change `0.0.0.0` to your Java server's IP. Connect with the Java IP and port."
|
||||
message: "Enable `clone-remote-port` (or manually set `bedrock port` to the Java port), and change `bedrock address` from `0.0.0.0` to your Java server's IP. Connect with the Java IP and port."
|
||||
}),
|
||||
forwardingOption: translate({
|
||||
id: 'providers.templates.forwarding_option',
|
||||
@@ -18,7 +18,7 @@ const descriptionTemplates = {
|
||||
}),
|
||||
javaIp: translate({
|
||||
id: 'providers.templates.java_ip',
|
||||
message: "Make sure your remote address is 'auto', uncomment `bedrock address`, and change `0.0.0.0` to your Java server's IP."
|
||||
message: "Change `bedrock address` from `0.0.0.0` to your Java server's IP."
|
||||
})
|
||||
}
|
||||
|
||||
@@ -48,6 +48,14 @@ export const providersData: Providers = {
|
||||
message: "Install Geyser in the Aternos plugin list and connect to your server with your Java IP and port. See [Aternos's article](https://support.aternos.org/hc/en-us/articles/360051047631) for more details. Do note: Aternos automatically installs the latest version of the plugin, but does not auto update it. To update Geyser on Aternos, simply reinstall the plugin (no need to uninstall the plugin/deleting the plugin files)."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'BedrockHost',
|
||||
url: 'https://bedrockhost.pl/',
|
||||
description: translate({
|
||||
id: 'providers.provider.bedrockhost.description',
|
||||
message: "Easiest solution is: Go to hosting panel > install new engine > Ready-made solutions and select Geyser. This will install Paper & Geyser-Spigot - no setup needed, just connect with your Java IP and port. See [BedrockHost's article](https://bedrockhost.pl/w/geyser-czyli-serwer-minecraft-java-i-bedrock-w-jednym) for more details or for custom setup instructions (available in Polish)."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'Cloud Nord',
|
||||
url: 'https://cloudnord.net/',
|
||||
@@ -80,6 +88,14 @@ export const providersData: Providers = {
|
||||
message: "Install Geyser in the exaroton plugin list and connect to your server with your Java IP and port. See [exaroton's article](https://support.exaroton.com/hc/en-us/articles/360019857918-Geyser) for more details."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'FreeMcServer.net',
|
||||
url: 'https://freemcserver.net',
|
||||
description: translate({
|
||||
id: 'providers.provider.freemcserver_net.description',
|
||||
message: "Install Geyser from the Plugins tab, then connect to your server using your Java IP and port."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'GGServers',
|
||||
url: 'https://ggservers.com',
|
||||
@@ -96,6 +112,14 @@ export const providersData: Providers = {
|
||||
message: "Tick the 'Enable Bedrock crossplay?' option when changing your server software to automatically install and configure Geyser + Floodgate. For more details, navigate to [lilypad.gg/bedrock](https://lilypad.gg/bedrock)."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'MCServerHost',
|
||||
url: 'https://mcserverhost.com/',
|
||||
description: translate({
|
||||
id: 'providers.provider.mcserverhost.description',
|
||||
message: "Under the server configuration, select 'Crossplay' to automatically install Geyser and Floodgate. Join with the connection address. To update Geyser and Floodgate, replace the plugin jars in the server manager and restart the server."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'Minefort',
|
||||
url: 'https://minefort.com/',
|
||||
@@ -112,6 +136,14 @@ export const providersData: Providers = {
|
||||
message: "Connect via `bedrock.minehut.com` and do `/join [servername]`, or connect directly via `[servername].bedrock.minehut.gg`."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'OMGServ',
|
||||
url: 'https://www.omgserv.com/en/',
|
||||
description: translate({
|
||||
id: 'providers.provider.omgserv.description',
|
||||
message: "Select Geyser in the [Install Menu](https://i.imgur.com/Gewpsrq.png), it will be automatically installed. You can enable floodgate in the [server properties on the dashboard](https://i.imgur.com/jg5mzNj.png)."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'Physgun',
|
||||
url: 'https://physgun.com/',
|
||||
@@ -126,11 +158,11 @@ export const providersData: Providers = {
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'OMGServ',
|
||||
url: 'https://www.omgserv.com/en/',
|
||||
name: 'Play Hosting',
|
||||
url: 'https://play.hosting',
|
||||
description: translate({
|
||||
id: 'providers.provider.omgserv.description',
|
||||
message: "Select Geyser in the [Install Menu](https://i.imgur.com/Gewpsrq.png), it will be automatically installed. You can enable floodgate in the [server properties on the dashboard](https://i.imgur.com/jg5mzNj.png)."
|
||||
id: 'providers.provider.playhosting.description',
|
||||
message: "Tick the 'Enable Bedrock crossplay?' option when changing your server software to automatically install and configure Geyser + Floodgate. For more details, navigate to [help.play.hosting/minecraft/crossplay](https://help.play.hosting/minecraft/crossplay)."
|
||||
})
|
||||
},
|
||||
{
|
||||
@@ -165,6 +197,22 @@ export const providersData: Providers = {
|
||||
message: "You can enable Geyser on the version changer page. Geyser will run on the given port by the host."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'UltraServers',
|
||||
url: 'https://ultraservers.com/',
|
||||
description: translate({
|
||||
id: 'providers.provider.ultraservers.description',
|
||||
message: "Select 'Paper + Geyser' under the Change version tab. You can connect to your server using the same IP and port as you would on Java. Existing servers can use the Plugins/Minecraft mods tab to install Geyser. See [Crossplay](https://docs.ultraservers.com/minecraft/plugins-mods/crossplay-on-java-and-bedrock) for more information."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'VemoxHost',
|
||||
url: 'https://vemoxhost.com/',
|
||||
description: translate({
|
||||
id: 'providers.provider.vemox_hosting.description',
|
||||
message: "Full automatic installation. Go to one of the panel options and select the option to enable GeyserMC. Then, restart and connect to your server using your Java IP and port."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'Virtual Gladiators',
|
||||
url: 'https://virtualgladiators.com/',
|
||||
@@ -217,7 +265,7 @@ export const providersData: Providers = {
|
||||
url: 'https://www.bisecthosting.com/',
|
||||
description: translate({
|
||||
id: 'providers.provider.bisecthosting.description',
|
||||
message: "You must have a plan with a dedicated IP. In Geyser's config, uncomment the `bedrock address` and set it to the public IP of your server (e.g. `address: 51.79.129.18`). Leave the port as `19132`. Under the home tab, select 'Enable UDP Network' and restart the server. See Bisect's [article](https://www.bisecthosting.com/clients/index.php?rp=/knowledgebase/193/How-to-install-Geyser-and-Floodgate-on-a-Minecraft-Java-server.html) for full instructions. If you still cannot connect after following these instructions, contact Bisect Support as they reportedly have UDP disabled on some nodes."
|
||||
message: "Navigate to the Network tab on your server panel to find the available ports. In Geyser's config, uncomment the `bedrock address` and set it to the public IP of your server (e.g. `address: 12.34.56.78`). Set the Bedrock port to one from your Network page, save the file and restart the server. See Bisect's [article](https://www.bisecthosting.com/clients/index.php?rp=/knowledgebase/193/How-to-install-Geyser-and-Floodgate-on-a-Minecraft-Java-server.html) for full instructions. If you still cannot connect after following these instructions, contact Bisect Support as they reportedly have UDP disabled on some nodes."
|
||||
})
|
||||
},
|
||||
{
|
||||
@@ -322,11 +370,6 @@ export const providersData: Providers = {
|
||||
url: 'https://freakhosting.com/',
|
||||
description: descriptionTemplates.default
|
||||
},
|
||||
{
|
||||
name: 'FreeMcServer.net',
|
||||
url: 'https://freemcserver.net',
|
||||
description: descriptionTemplates.default
|
||||
},
|
||||
{
|
||||
name: 'Fusion Hosting',
|
||||
url: 'https://fusionhostingltd.co.uk',
|
||||
@@ -461,6 +504,14 @@ export const providersData: Providers = {
|
||||
url: 'https://www.minecraft-hosting.pro/',
|
||||
description: descriptionTemplates.default
|
||||
},
|
||||
{
|
||||
name: 'Modrinth Servers',
|
||||
url: 'https://modrinth.com/servers',
|
||||
description: translate({
|
||||
id: 'providers.provider.modrinth.description',
|
||||
message: "Check [Modrinth's documentation](https://support.modrinth.com/en/articles/10986613-adding-geyser-to-your-server) for specific instructions."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'Netbela',
|
||||
url: 'https://netbela.nl/store/minecraft',
|
||||
@@ -474,7 +525,7 @@ export const providersData: Providers = {
|
||||
url: 'https://nfoservers.com/',
|
||||
description: translate({
|
||||
id: 'providers.provider.nfoservers.description',
|
||||
message: "Uncomment and set `bedrock address` to the server IP in the Geyser config file. As an alternative, you can run Geyser standalone separately on an Unmanaged VDS."
|
||||
message: "Set `bedrock address` to the server IP in the Geyser config file. As an alternative, you can run Geyser standalone separately on an Unmanaged VDS."
|
||||
})
|
||||
},
|
||||
{
|
||||
@@ -493,6 +544,14 @@ export const providersData: Providers = {
|
||||
message: "Use the default server port and `0.0.0.0` or your server IP as the host address."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'OrionNodes',
|
||||
url: 'https://orionnodes.com',
|
||||
description: translate({
|
||||
id: 'providers.provider.orionnodes.description',
|
||||
message: "Open a port yourself from the network page in the game panel, use that port in the bedrock section of the Geyser config."
|
||||
})
|
||||
},
|
||||
{
|
||||
name: 'PaperNodes',
|
||||
url: 'https://papernodes.com/',
|
||||
@@ -628,7 +687,7 @@ export const providersData: Providers = {
|
||||
url: 'https://vultam.net/',
|
||||
description: translate({
|
||||
id: 'providers.provider.vultam.description',
|
||||
message: "Enable `clone-remote-port` in the Geyser config, and connect with the Java IP and port. Alternatively, allocate an additional port to your server from the Network section of the control panel and set it as the `bedrock.port` in the Geyser config. Use that port to connect from Bedrock. Please contact [Vultam support](https://clients.vultam.net/submitticket.php?step=2&deptid=1) if you need assistance."
|
||||
message: "Enable `clone-remote-port` in the Geyser config, and connect with the Java IP and port. Alternatively, allocate an additional port to your server from the Network section of the control panel and set it as the `bedrock port` in the Geyser config. Use that port to connect from Bedrock. Please contact [Vultam support](https://clients.vultam.net/submitticket.php?step=2&deptid=1) if you need assistance."
|
||||
})
|
||||
},
|
||||
{
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"bedrock": {
|
||||
"supported": "1.21.40-1.21.51",
|
||||
"supported": "1.21.90-1.21.130",
|
||||
"latest": {
|
||||
"id": 766,
|
||||
"name": "1.21.51"
|
||||
"id": 898,
|
||||
"name": "1.21.130"
|
||||
}
|
||||
},
|
||||
"java": {
|
||||
"supported": "1.21.4"
|
||||
"supported": "1.21.9-1.21.10"
|
||||
}
|
||||
}
|
||||
@@ -69,21 +69,6 @@ const DownloadPage: React.FC = () => (
|
||||
</TabItem>
|
||||
<TabItem value="other-projects" label="Other Projects">
|
||||
<Collapsibles>
|
||||
<Collapsible
|
||||
title='GeyserOptionalPack'
|
||||
subtitle={<Translate id='pages.download.description.geyseroptionalpack'>An optional Bedrock resource pack to extend Geyser functionality.</Translate>}
|
||||
id='geyseroptionalpack'
|
||||
inner={
|
||||
<ProjectDownload
|
||||
projectId="geyseroptionalpack"
|
||||
setup='/wiki/other/geyseroptionalpack'
|
||||
downloadsInfo={{
|
||||
geyseroptionalpack: <><FontAwesomeIcon icon={faFileZipper} /> GeyserOptionalPack</>,
|
||||
}}
|
||||
gridColumns={1}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<Collapsible
|
||||
title='ThirdPartyCosmetics'
|
||||
subtitle={<Translate id='pages.download.description.thirdpartycosmetics'>An extension that adds support for loading ears and other third party cosmetics on java players</Translate>}
|
||||
@@ -99,6 +84,20 @@ const DownloadPage: React.FC = () => (
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<Collapsible
|
||||
title='EmoteOffhand'
|
||||
subtitle={<Translate id='pages.download.description.offhandextension'>An extension that allows Bedrock players to switch their offhand and mainhand item by emoting.</Translate>}
|
||||
id='emoteoffhand'
|
||||
inner={
|
||||
<ProjectDownload
|
||||
projectId="emoteoffhand"
|
||||
downloadsInfo={{
|
||||
emoteoffhand: <><FontAwesomeIcon icon={faFileZipper} /> EmoteOffhand</>,
|
||||
}}
|
||||
gridColumns={1}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<Collapsible
|
||||
title='Hurricane'
|
||||
subtitle={<Translate id='pages.download.description.hurricane'>A plugin with various workarounds for Geyser players that modify the server in order to achieve their goal.</Translate>}
|
||||
@@ -129,7 +128,23 @@ const DownloadPage: React.FC = () => (
|
||||
/>
|
||||
}
|
||||
/>
|
||||
{/* <Collapsible
|
||||
<Collapsible
|
||||
title='Rainbow'
|
||||
subtitle={<Translate id='pages.download.description.rainbow'>A Minecraft mod to generate Geyser item mappings and bedrock resourcepacks for use with Geyser's custom item API (v2). </Translate>}
|
||||
id='rainbow'
|
||||
tags={['Beta']}
|
||||
inner={
|
||||
<ProjectDownload
|
||||
projectId="rainbow"
|
||||
setup='/wiki/other/rainbow'
|
||||
downloadsInfo={{
|
||||
rainbow: <PlatformIcon img={FabricIcon} text="Fabric" />,
|
||||
}}
|
||||
gridColumns={1}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<Collapsible
|
||||
title='Hydraulic'
|
||||
subtitle={<Translate id='pages.download.description.hydraulic'>A companion mod to Geyser which allows for Bedrock players to join modded Minecraft: Java Edition servers.</Translate>}
|
||||
id='hydraulic'
|
||||
@@ -143,9 +158,37 @@ const DownloadPage: React.FC = () => (
|
||||
neoforge: <PlatformIcon img={NeoForgeIcon} text="NeoForge" />,
|
||||
}}
|
||||
gridColumns={1}
|
||||
warning={ // Remove when Item API V2 is merged!
|
||||
<>
|
||||
<Translate id='pages.download.warning.hydraulic'>
|
||||
A preview version of Geyser is required to run Hydraulic, you can download the Item API V2 preview below:
|
||||
</Translate>
|
||||
<p>
|
||||
<a href="https://download.geysermc.org/v2/projects/geyserpreview/versions/pr.5189/builds/latest/downloads/fabric">Fabric</a>
|
||||
<span>, </span>
|
||||
<a href="https://download.geysermc.org/v2/projects/geyserpreview/versions/pr.5189/builds/latest/downloads/neoforge">NeoForge</a>
|
||||
</p>
|
||||
</>
|
||||
}
|
||||
/>
|
||||
}
|
||||
/> */}
|
||||
/>
|
||||
<Collapsible
|
||||
title='Thunder'
|
||||
subtitle={<Translate id='pages.download.description.thunder'>A java application to convert simple Java Edition resource packs to Bedrock Edition ones.</Translate>}
|
||||
id='thunder'
|
||||
tags={['Beta']}
|
||||
inner={
|
||||
<ProjectDownload
|
||||
projectId="thunder"
|
||||
setup='/wiki/other/thunder'
|
||||
downloadsInfo={{
|
||||
thunder: <><FontAwesomeIcon icon={faFileZipper} /> Thunder</>,
|
||||
}}
|
||||
gridColumns={1}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
</Collapsibles>
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
import SoftwareFeature from '@site/src/components/SoftwareFeature';
|
||||
import SoftwareHero from '@site/src/components/SoftwareHero';
|
||||
import Crossplatform0Img from '@site/static/img/site/crossplatform_0.png';
|
||||
import Crossplatform1Img from '@site/static/img/site/crossplatform_1.png';
|
||||
import Crossplatform2Img from '@site/static/img/site/crossplatform_2.png';
|
||||
import Layout from '@theme/Layout';
|
||||
import clsx from 'clsx';
|
||||
import styles from "./software.module.css";
|
||||
import SoftwareStats from '@site/src/components/SoftwareStats';
|
||||
|
||||
const FloodgateSoftwarePage: React.FC = () => {
|
||||
return (
|
||||
<>
|
||||
<SoftwareHero
|
||||
software="Floodgate"
|
||||
description="Floodgate is a hybrid mode plugin to allow for connections from Geyser to join online mode servers."
|
||||
downloadsUrl='/download'
|
||||
docsUrl="/wiki/floodgate"
|
||||
/>
|
||||
|
||||
<SoftwareStats
|
||||
githubStars="600+"
|
||||
githubCommits="400+"
|
||||
bstatsPlayers="19k+"
|
||||
bstatsServers="53k"
|
||||
/>
|
||||
|
||||
<div className={clsx(styles.featureSection, "container")}>
|
||||
<SoftwareFeature
|
||||
title="What is Floodgate?"
|
||||
image={Crossplatform2Img}
|
||||
>
|
||||
<p>Floodgate is a server plugin that introduces features such as:</p>
|
||||
<ul>
|
||||
<li>Ability for clients to join Minecraft: Java Edition servers with Minecraft: Bedrock accounts without needing a paid Minecraft: Java Edition account.</li>
|
||||
<li>Ability to see Bedrock player skins on Java edition</li>
|
||||
<li>Ability for plugins to send bedrock forms</li>
|
||||
<li>Allows Bedrock players to link to a Java account</li>
|
||||
</ul>
|
||||
<div>...and more! See the docs for full list.</div>
|
||||
</SoftwareFeature>
|
||||
|
||||
<SoftwareFeature
|
||||
title="How does it work?"
|
||||
image={Crossplatform1Img}
|
||||
flipped
|
||||
>
|
||||
Floodgate sits on the server and enables additional features that are not otherwise possible. TODO
|
||||
</SoftwareFeature>
|
||||
|
||||
<SoftwareFeature
|
||||
title="Global linking"
|
||||
image={Crossplatform0Img}
|
||||
>
|
||||
Global Linking is a central place for servers to see if a Bedrock player has a Java Edition account linked.
|
||||
<br/><br/>
|
||||
TODO
|
||||
</SoftwareFeature>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export default function FloodgateSoftware(): JSX.Element {
|
||||
return (
|
||||
<Layout
|
||||
title={`Floodgate`}
|
||||
description='Hybrid mode plugin to allow for connections from Geyser to join online mode servers.'
|
||||
>
|
||||
<main>
|
||||
<div className='container container--fluid margin-vert--lg'>
|
||||
<FloodgateSoftwarePage />
|
||||
</div>
|
||||
</main>
|
||||
</Layout>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
import SoftwareFeature from '@site/src/components/SoftwareFeature';
|
||||
import SoftwareHero from '@site/src/components/SoftwareHero';
|
||||
import Crossplatform0Img from '@site/static/img/site/crossplatform_0.png';
|
||||
import Crossplatform1Img from '@site/static/img/site/crossplatform_1.png';
|
||||
import Crossplatform2Img from '@site/static/img/site/crossplatform_2.png';
|
||||
import Layout from '@theme/Layout';
|
||||
import clsx from 'clsx';
|
||||
import styles from "./software.module.css";
|
||||
import SoftwareStats from '@site/src/components/SoftwareStats';
|
||||
|
||||
const GeyserSoftwarePage: React.FC = () => {
|
||||
return (
|
||||
<>
|
||||
<SoftwareHero
|
||||
icon="/img/icons/geyser.png"
|
||||
software="Geyser"
|
||||
tagline="Revolutionize your Minecraft server"
|
||||
description="Geyser is a software that enables players from Minecraft Bedrock Edition to join Java Edition servers."
|
||||
downloadsUrl='/download'
|
||||
docsUrl="/wiki/geyser"
|
||||
/>
|
||||
|
||||
<SoftwareStats
|
||||
githubStars="5.4k"
|
||||
githubCommits="4.5k"
|
||||
bstatsPlayers="19k+"
|
||||
bstatsServers="50k"
|
||||
/>
|
||||
|
||||
<div className={clsx(styles.featureSection, "container")}>
|
||||
<SoftwareFeature
|
||||
title="What is Geyser?"
|
||||
image={Crossplatform2Img}
|
||||
>
|
||||
Geyser is a program that allows Minecraft: Bedrock Edition clients to join Minecraft: Java Edition servers, allowing for true crossplay between both editions of the game.
|
||||
<br /><br />
|
||||
The ultimate goal of this project is to allow Minecraft: Bedrock Edition users to join Minecraft: Java Edition servers as seamlessly as possible.
|
||||
</SoftwareFeature>
|
||||
|
||||
<SoftwareFeature
|
||||
title="How does it work?"
|
||||
image={Crossplatform1Img}
|
||||
flipped
|
||||
>
|
||||
Geyser acts as a translator which sits between the Bedrock client and the Java server. It takes data from the Bedrock client and translates it into a format the Java server understands and vice versa. Geyser works with any modern Minecraft version and can be installed either as a plugin or ran as a standalone program.
|
||||
</SoftwareFeature>
|
||||
|
||||
<SoftwareFeature
|
||||
title="Join from anywhere"
|
||||
image={Crossplatform0Img}
|
||||
>
|
||||
Geyser can be joined from Bedrock clients on Windows 10/11, iOS, Android, and even consoles. Geyser works with a wide array of hosting providers, but can also be used as its own standalone proxy to join any Minecraft server!
|
||||
<br /><br />
|
||||
If you are a server owner, you can install our Floodgate plugin which allows Xbox Live authenticated Bedrock users to join without a Java Edition account!
|
||||
</SoftwareFeature>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export default function GeyserSoftware(): JSX.Element {
|
||||
return (
|
||||
<Layout
|
||||
title={`Geyser`}
|
||||
description='A bridge/proxy allowing you to connect to Minecraft: Java Edition servers with Minecraft: Bedrock Edition.'
|
||||
>
|
||||
<main>
|
||||
<div className='container container--fluid margin-vert--lg'>
|
||||
<GeyserSoftwarePage />
|
||||
</div>
|
||||
</main>
|
||||
</Layout>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
.featureSection {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 50px;
|
||||
margin-top: 30px;
|
||||
}
|
||||
@@ -1,362 +0,0 @@
|
||||
import Translate from '@docusaurus/Translate';
|
||||
import HeroBanner from '@site/src/components/HeroBanner';
|
||||
import HeroBackground from '@site/static/img/site/split-background.webp';
|
||||
import Layout from '@theme/Layout';
|
||||
import styles from './utilities.module.scss';
|
||||
import {useRef, useState} from 'react';
|
||||
|
||||
const ConfigEditorPage: React.FC = () => {
|
||||
const [config, setConfig] = useState('');
|
||||
const [parsedConfig, setParsedConfig] = useState<any>({});
|
||||
// match optional key
|
||||
const keyReg = /^#? ?[^:\sA-Z]+:(?!\S)/
|
||||
const editedConfig = useRef<any>({});
|
||||
const uploadRef = useRef<any>(null);
|
||||
|
||||
const loadDefault = async () => {
|
||||
try {
|
||||
const response = await fetch('https://raw.githubusercontent.com/GeyserMC/Geyser/master/core/src/main/resources/config.yml');
|
||||
if (!response.ok) {
|
||||
throw new Error('Network response was not ok');
|
||||
}
|
||||
const text = await response.text();
|
||||
handleConfigLoad(text);
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch default config:', error);
|
||||
}
|
||||
}
|
||||
|
||||
const handleUpload = async (e) => {
|
||||
const fileName = e.target.files[0];
|
||||
|
||||
// Makse sure the file is a .yml file
|
||||
if (!fileName.name.endsWith('.yml')) {
|
||||
alert('Please select a .yml config file!');
|
||||
return;
|
||||
}
|
||||
|
||||
// Read the file
|
||||
const fileReader = new FileReader();
|
||||
fileReader.onload = (e) => {
|
||||
handleConfigLoad(e.target.result as string);
|
||||
}
|
||||
fileReader.readAsText(fileName);
|
||||
}
|
||||
|
||||
const handleConfigLoad = (config: string) => {
|
||||
setConfig(config);
|
||||
setParsedConfig(loadConfig(config));
|
||||
}
|
||||
|
||||
const loadConfig = (config: string) => {
|
||||
const lines = config.split('\n');
|
||||
let currentSection = '';
|
||||
let currentComment = '';
|
||||
|
||||
const newConfig = {"": {}};
|
||||
|
||||
let ignore = false;
|
||||
|
||||
// Parse each line of the config
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
let line = lines[i];
|
||||
// Reset the section if we are no indented
|
||||
if (!line.startsWith(' ')) {
|
||||
currentSection = '';
|
||||
}
|
||||
|
||||
// Ignore any empty lines
|
||||
line = line.trim()
|
||||
if (line === '') {
|
||||
currentComment = '';
|
||||
continue;
|
||||
}
|
||||
|
||||
const commented = line.startsWith('#');
|
||||
|
||||
const match = line.match(keyReg);
|
||||
if (match === null) {
|
||||
// Check if we are in a comment
|
||||
if (commented) {
|
||||
currentComment += line.replace(/^# ?/i, '') + '<br>';
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if we are in a new section
|
||||
if (line.endsWith(':')) {
|
||||
currentSection = line.replace(':', '');
|
||||
|
||||
// Ignore user auths section
|
||||
if (currentSection === 'saved-user-logins') {
|
||||
ignore = true;
|
||||
continue;
|
||||
}
|
||||
ignore = false;
|
||||
if (commented) {
|
||||
currentComment += '<strong>Note: This option is commented out by default. It will be automatically uncommented if modified.</strong>' + '<br>';
|
||||
}
|
||||
|
||||
currentComment = currentComment.replace(URL_REGEX, function ($0) {
|
||||
return '<a href="' + $0 + '">' + $0 + '</a>';
|
||||
})
|
||||
newConfig[currentSection] = {sectionDesc0: currentComment};
|
||||
currentComment = '';
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ignore) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get the key and value
|
||||
const splitLine = line.split(':');
|
||||
splitLine[0] = splitLine[0].trim();
|
||||
let val = '';
|
||||
for (let j = 1; j < splitLine.length; j++) {
|
||||
val += splitLine[j];
|
||||
}
|
||||
val = val.trim();
|
||||
|
||||
if (splitLine[0].includes('proxy-protocol-whitelisted-ips')) {
|
||||
currentComment = '';
|
||||
continue;
|
||||
}
|
||||
|
||||
if (commented) {
|
||||
currentComment += '<strong>Note: This option is commented out by default. It will be automatically uncommented if modified.</strong>' + '<br>';
|
||||
}
|
||||
|
||||
currentComment = currentComment.replace(URL_REGEX, function ($0) {
|
||||
return '<a href="' + $0 + '">' + $0 + '</a>';
|
||||
})
|
||||
|
||||
// Add the config option to the config object
|
||||
newConfig[currentSection][splitLine[0]] = {
|
||||
desc: currentComment,
|
||||
value: val,
|
||||
line: i
|
||||
};
|
||||
|
||||
// Reset the comment
|
||||
currentComment = '';
|
||||
}
|
||||
return newConfig;
|
||||
}
|
||||
|
||||
const generateHTML = (config: any) => {
|
||||
return Object.keys(config).map(configKey => (
|
||||
<div key={configKey} className={styles.card}>
|
||||
<div className={styles.cardHeader}>{configKey === '' ? 'Root' : configKey}</div>
|
||||
<div className={styles.cardBody}>
|
||||
{Object.keys(config[configKey]).map(configOption => {
|
||||
const configOptionInfo = config[configKey][configOption];
|
||||
if (configOption == "sectionDesc0") {
|
||||
if (configOptionInfo === "") {
|
||||
return;
|
||||
}
|
||||
return (
|
||||
<div className={styles.configOption}>
|
||||
<p dangerouslySetInnerHTML={{__html: configOptionInfo}}/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
const configOptionKey = configKey === '' ? configOption : `${configKey}.${configOption}`;
|
||||
const showOptionName = configOption.replace('#', '').trim()
|
||||
return (
|
||||
<div key={configOptionKey} className={styles.configOption}>
|
||||
<h3>{showOptionName}</h3>
|
||||
<p dangerouslySetInnerHTML={{__html: configOptionInfo.desc}}/>
|
||||
{getInput(configOptionKey, configOptionInfo.value)}
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
))
|
||||
}
|
||||
|
||||
const URL_REGEX = /https?:\/\/(([0-9a-z.]+\.[a-z]+)|(([0-9]{1,3}\.){3}[0-9]{1,3}))(:[0-9]+)?(\/[0-9a-z%\/.\-_]*)?(\?[0-9a-z=&%_\-]*)?(#[0-9a-z=&%_\-]*)?/ig;
|
||||
|
||||
const handleExport = () => {
|
||||
let newConfig = config;
|
||||
const lines = newConfig.split('\n');
|
||||
Object.entries(editedConfig.current).forEach(([key, value]) => {
|
||||
const keys = key.split('.');
|
||||
let currentObj = parsedConfig;
|
||||
|
||||
keys.forEach((nestedKey, index) => {
|
||||
if (currentObj.hasOwnProperty(nestedKey)) {
|
||||
if (index === keys.length - 1) {
|
||||
const option = currentObj[nestedKey];
|
||||
const oldValue = option.value;
|
||||
const index = option.line;
|
||||
const newKey = nestedKey.replace('#', '').trim();
|
||||
lines[index] = lines[index].replace(` ${nestedKey}: ${oldValue}`, ` ${newKey}: ${value}`);
|
||||
} else {
|
||||
currentObj = currentObj[nestedKey];
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
newConfig = lines.join('\n');
|
||||
|
||||
// Trigger a download of the final config
|
||||
downloadString(newConfig, 'text/plain', 'config.yml');
|
||||
}
|
||||
|
||||
function getInput(name, value) {
|
||||
const handleChange = (event) => {
|
||||
const {id, value, type, checked} = event.target;
|
||||
|
||||
editedConfig.current = {
|
||||
...editedConfig.current,
|
||||
[id]: type === 'checkbox' ? checked.toString() : value
|
||||
};
|
||||
}
|
||||
|
||||
switch (name) {
|
||||
// Handle all the dropdowns
|
||||
case 'remote.auth-type':
|
||||
return (
|
||||
<select key={name} className={styles.formInput} id={name} defaultValue={value}
|
||||
onChange={handleChange}>
|
||||
<option value='offline'>offline</option>
|
||||
<option value='online'>online</option>
|
||||
<option value='floodgate'>floodgate</option>
|
||||
</select>
|
||||
);
|
||||
case 'show-cooldown':
|
||||
return (
|
||||
<select key={name} className={styles.formInput} id={name} defaultValue={value}
|
||||
onChange={handleChange}>
|
||||
<option value='title'>title</option>
|
||||
<option value='actionbar'>actionbar</option>
|
||||
<option value='false'>false</option>
|
||||
</select>
|
||||
);
|
||||
case 'emote-offhand-workaround':
|
||||
return (
|
||||
<select key={name} className={styles.formInput} id={name} defaultValue={value}
|
||||
onChange={handleChange}>
|
||||
<option value='disabled'>disabled</option>
|
||||
<option value='no-emotes'>no-emotes</option>
|
||||
<option value='emotes-and-offhand'>emotes-and-offhand</option>
|
||||
</select>
|
||||
);
|
||||
case 'config-version':
|
||||
return <input key={name} className={styles.formInput} type='text' disabled
|
||||
defaultValue={value.replace(/"/g, '')}/>;
|
||||
case 'metrics.uuid':
|
||||
return <input key={name} className={styles.formInput} id={name} type='text' disabled
|
||||
defaultValue={value === 'generateduuid' ? crypto.randomUUID() : value}/>;
|
||||
|
||||
default:
|
||||
// Handle all the other inputs
|
||||
if (value.toLowerCase() === 'true' || value.toLowerCase() === 'false') {
|
||||
// Boolean
|
||||
return (
|
||||
<div key={name}>
|
||||
<input className={styles.checkbox} type='checkbox' id={name}
|
||||
defaultChecked={value.toLowerCase() === 'true'} onChange={handleChange}/>
|
||||
<label htmlFor={name} className='switch'></label>
|
||||
</div>
|
||||
);
|
||||
} else if (!isNaN(value)) {
|
||||
// Number
|
||||
return <input key={name} className={styles.formInput} type='number' defaultValue={value}
|
||||
id={name} onChange={handleChange}/>;
|
||||
} else {
|
||||
// String
|
||||
return <input key={name} className={styles.formInput} type='text'
|
||||
defaultValue={value.replace(/"/g, '')} id={name} onChange={handleChange}/>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// From https://gist.github.com/danallison/3ec9d5314788b337b682
|
||||
function downloadString(text, fileType, fileName) {
|
||||
const blob = new Blob([text], {type: fileType})
|
||||
|
||||
const a = document.createElement('a')
|
||||
a.download = fileName
|
||||
a.href = URL.createObjectURL(blob)
|
||||
a.dataset.downloadurl = [fileType, a.download, a.href].join(':')
|
||||
a.style.display = 'none'
|
||||
document.body.appendChild(a)
|
||||
a.click()
|
||||
document.body.removeChild(a)
|
||||
|
||||
setTimeout(() => {
|
||||
URL.revokeObjectURL(a.href)
|
||||
}, 1500)
|
||||
}
|
||||
|
||||
const NoConfigSection = () => (
|
||||
<>
|
||||
<h1><Translate id='pages.configeditor.noconfigselected.heading'>No config selected.</Translate></h1>
|
||||
<h3 className={styles.fontNormal}><Translate id='pages.configeditor.noconfigselected.subheading'>Upload a
|
||||
file or get started with the default config!</Translate></h3>
|
||||
|
||||
<div className={styles.buttonsContainer}>
|
||||
<button className={styles.button} onClick={loadDefault}>
|
||||
<Translate id='pages.configeditor.button.defaultconfig'>Default</Translate>
|
||||
</button>
|
||||
|
||||
<button className={styles.button} onClick={() => uploadRef.current.click()}>
|
||||
<input
|
||||
ref={uploadRef}
|
||||
type='file'
|
||||
className={styles.hidden}
|
||||
accept='.yml'
|
||||
onChange={handleUpload}
|
||||
/>
|
||||
<Translate id='pages.configeditor.button.upload'>Upload</Translate>
|
||||
</button>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
|
||||
const EditorView = () => (
|
||||
<>
|
||||
<div className={styles.buttonsContainer} style={{marginBottom: '30px'}}>
|
||||
<button className={styles.button} onClick={handleExport}>
|
||||
<Translate id='pages.configeditor.button.export'>Export</Translate>
|
||||
</button>
|
||||
</div>
|
||||
{generateHTML(parsedConfig)}
|
||||
</>
|
||||
)
|
||||
|
||||
return (
|
||||
<>
|
||||
<HeroBanner
|
||||
title={<Translate id='pages.configeditor.title'>Config Editor</Translate>}
|
||||
subheading={<Translate id='pages.configeditor.subheading'>Edit your Geyser configuration.</Translate>}
|
||||
backgroundImage={HeroBackground}
|
||||
/>
|
||||
|
||||
<div className='container' style={{marginTop: '30px'}}>
|
||||
{Object.keys(parsedConfig).length === 0 ? <NoConfigSection/> : <EditorView/>}
|
||||
</div>
|
||||
|
||||
|
||||
<section id='config-options'></section>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
export default function ConfigEditor(): JSX.Element {
|
||||
return (
|
||||
<Layout
|
||||
title={`Config Editor`}
|
||||
description='Edit your Geyser configuration.'
|
||||
>
|
||||
<main>
|
||||
<div className='container container--fluid margin-vert--lg'>
|
||||
<ConfigEditorPage/>
|
||||
</div>
|
||||
</main>
|
||||
</Layout>
|
||||
)
|
||||
}
|
||||
@@ -159,7 +159,7 @@ const DumpViewerPage: React.FC = () => {
|
||||
</div>
|
||||
<div>
|
||||
<b><Translate id='pages.dumpviewer.platform.name'>Platform Name</Translate></b><br />
|
||||
<p id='platformName'>{data.bootstrapInfo.platformName ?? capitalizeFirstLetter(data.bootstrapInfo.platform.toLowerCase())}</p>
|
||||
<p id='platformName'>{data.bootstrapInfo.platformName ?? capitalizeFirstLetter(data.bootstrapInfo.platform.platformName.toLowerCase())}</p>
|
||||
</div>
|
||||
<div>
|
||||
<b><Translate id='pages.dumpviewer.platform.version'>Platform Version</Translate></b><br />
|
||||
@@ -211,10 +211,11 @@ const DumpViewerPage: React.FC = () => {
|
||||
</div>
|
||||
<div className={styles.card}>
|
||||
<div className={styles.cardHeader}>
|
||||
<Translate id='pages.dumpviewer.plugins'>Plugins</Translate> ({data.bootstrapInfo.plugins.length})
|
||||
<Translate id='pages.dumpviewer.plugins'>Plugins</Translate> ({data.bootstrapInfo.plugins?.length ?? 0})
|
||||
</div>
|
||||
<div className={styles.cardBody}>
|
||||
{data.bootstrapInfo.plugins.length === 0 ? <p><Translate id='pages.dumpviewer.plugins.noplugins'>No plugins to show.</Translate></p> : (
|
||||
{!data.bootstrapInfo.plugins || data.bootstrapInfo.plugins.length === 0 ? (
|
||||
<p><Translate id='pages.dumpviewer.plugins.noplugins'>No plugins to show.</Translate></p>) : (
|
||||
<>
|
||||
<p><Translate id='pages.dumpviewer.plugins.helptext'>Click on a plugin to view more information.</Translate></p>
|
||||
|
||||
|
||||
@@ -109,41 +109,6 @@
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
/* https://codepen.io/JAGATHISH1123/pen/PvayMB */
|
||||
.switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 40px;
|
||||
height: 20px;
|
||||
background-color: var(--switch-background-color);
|
||||
border-radius: 20px;
|
||||
transition: all 0.3s;
|
||||
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border-radius: 50%;
|
||||
background-color: white;
|
||||
top: 1px;
|
||||
left: 1px;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
}
|
||||
|
||||
.checkbox:checked+.switch::after {
|
||||
left: 20px;
|
||||
}
|
||||
|
||||
.checkbox:checked+.switch {
|
||||
background-color: var(--ifm-color-secondary);
|
||||
}
|
||||
|
||||
.checkbox {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
@@ -199,3 +164,41 @@
|
||||
min-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Modified from https://danklammer.com/articles/simple-css-toggle-switch */
|
||||
.checkbox {
|
||||
appearance: none;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
box-sizing: content-box;
|
||||
width: 4.5em;
|
||||
height: 1.8em;
|
||||
padding: 0.2em;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
border-radius: 1.5em;
|
||||
overflow: hidden;
|
||||
background-color: #707070;
|
||||
transition: background ease 0.3s;
|
||||
|
||||
&:before {
|
||||
content: "";
|
||||
display: block;
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
width: 1.8em;
|
||||
height: 1.8em;
|
||||
background: #fff;
|
||||
color: #fff;
|
||||
border-radius: 1.5em;
|
||||
transition: transform cubic-bezier(0.3, 1.5, 0.7, 1) 0.3s;
|
||||
}
|
||||
|
||||
&:checked {
|
||||
background-color: var(--ifm-color-secondary);
|
||||
}
|
||||
|
||||
&:checked:before {
|
||||
transform: translateX(2.5em);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="classDiagram" style="max-width: 1267.4666748046875px;" viewBox="0 0 1267.4666748046875 673" role="graphics-document document" aria-roledescription="class"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Recursive Variable';
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 300 1000;
|
||||
src: url("data:font/woff2;base64,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 truncated
|
||||
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
|
||||
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><style>#export-svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;fill:#28253D;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:#ffffff;}#export-svg .error-text{fill:#000000;stroke:#000000;}#export-svg .edge-thickness-normal{stroke-width:2px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-svg .edge-pattern-solid{stroke-dasharray:0;}#export-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#export-svg .edge-pattern-dashed{stroke-dasharray:3;}#export-svg .edge-pattern-dotted{stroke-dasharray:2;}#export-svg .marker{fill:#000000;stroke:#000000;}#export-svg .marker.cross{stroke:#000000;}#export-svg svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;}#export-svg p{margin:0;}#export-svg g.classGroup text{fill:#28253D;stroke:none;font-family:"Recursive Variable",arial,sans-serif;font-size:10px;}#export-svg g.classGroup text .title{font-weight:bolder;}#export-svg .nodeLabel,#export-svg .edgeLabel{color:#28253D;}#export-svg .noteLabel .nodeLabel,#export-svg .noteLabel .edgeLabel{color:#28253D;}#export-svg .edgeLabel .label rect{fill:#ffffff;}#export-svg .label text{fill:#28253D;}#export-svg .labelBkg{background:#ffffff;}#export-svg .edgeLabel .label span{background:#ffffff;}#export-svg .classTitle{font-weight:bolder;}#export-svg .node rect,#export-svg .node circle,#export-svg .node ellipse,#export-svg .node polygon,#export-svg .node path{fill:#ffffff;stroke:#28253D;stroke-width:2;}#export-svg .divider{stroke:#28253D;stroke-width:1;}#export-svg g.clickable{cursor:pointer;}#export-svg g.classGroup rect{fill:#ffffff;stroke:#28253D;}#export-svg g.classGroup line{stroke:#28253D;stroke-width:1;}#export-svg .classLabel .box{stroke:none;stroke-width:0;fill:#ffffff;opacity:0.5;}#export-svg .classLabel .label{fill:#28253D;font-size:10px;}#export-svg .relation{stroke:#000000;stroke-width:2;fill:none;}#export-svg .dashed-line{stroke-dasharray:3;}#export-svg .dotted-line{stroke-dasharray:1 2;}#export-svg #compositionStart,#export-svg .composition{fill:#000000!important;stroke:#000000!important;stroke-width:1;}#export-svg #compositionEnd,#export-svg .composition{fill:#000000!important;stroke:#000000!important;stroke-width:1;}#export-svg #dependencyStart,#export-svg .dependency{fill:#000000!important;stroke:#000000!important;stroke-width:1;}#export-svg #dependencyStart,#export-svg .dependency{fill:#000000!important;stroke:#000000!important;stroke-width:1;}#export-svg #extensionStart,#export-svg .extension{fill:transparent!important;stroke:#000000!important;stroke-width:1;}#export-svg #extensionEnd,#export-svg .extension{fill:transparent!important;stroke:#000000!important;stroke-width:1;}#export-svg #aggregationStart,#export-svg .aggregation{fill:transparent!important;stroke:#000000!important;stroke-width:1;}#export-svg #aggregationEnd,#export-svg .aggregation{fill:transparent!important;stroke:#000000!important;stroke-width:1;}#export-svg #lollipopStart,#export-svg .lollipop{fill:#ffffff!important;stroke:#000000!important;stroke-width:1;}#export-svg #lollipopEnd,#export-svg .lollipop{fill:#ffffff!important;stroke:#000000!important;stroke-width:1;}#export-svg .edgeTerminals{font-size:11px;line-height:initial;}#export-svg .classTitleText{text-anchor:middle;font-size:18px;fill:#28253D;}#export-svg .edgeLabel{background-color:hsl(-120, 0%, 80%);text-align:center;}#export-svg .edgeLabel p{background-color:hsl(-120, 0%, 80%);}#export-svg .edgeLabel rect{opacity:0.5;background-color:hsl(-120, 0%, 80%);fill:hsl(-120, 0%, 80%);}#export-svg .cluster rect{fill:#F9F9FB;stroke:#BDBCCC;stroke-width:2px;}#export-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#export-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#export-svg .node .neo-node{stroke:#28253D;}#export-svg [data-look="neo"].node rect,#export-svg [data-look="neo"].cluster rect,#export-svg [data-look="neo"].node polygon{stroke:#28253D;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node path{stroke:#28253D;stroke-width:2;}#export-svg [data-look="neo"].node .outer-path{filter:url(#drop-shadow);}#export-svg [data-look="neo"].node .neo-line path{stroke:#28253D;filter:none;}#export-svg [data-look="neo"].node circle{stroke:#28253D;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node circle .state-start{fill:#000000;}#export-svg [data-look="neo"].statediagram-cluster rect{fill:#F9F9FB;stroke:#28253D;stroke-width:2;}#export-svLine truncated
|
||||
|
After Width: | Height: | Size: 126 KiB |
@@ -0,0 +1,102 @@
|
||||
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="classDiagram" style="max-width: 1267.47px;" viewBox="0 0 1267.4666748046875 673" role="graphics-document document" aria-roledescription="class"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Recursive Variable';
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 300 1000;
|
||||
src: url("data:font/woff2;base64,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 truncated
|
||||
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
|
||||
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><style>#export-svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:hsl(20, 1.5873015873%, 12.3529411765%);}#export-svg .error-text{fill:rgb(222.9999999999, 223.6666666666, 223.9999999999);stroke:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .edge-thickness-normal{stroke-width:2px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-svg .edge-pattern-solid{stroke-dasharray:0;}#export-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#export-svg .edge-pattern-dashed{stroke-dasharray:3;}#export-svg .edge-pattern-dotted{stroke-dasharray:2;}#export-svg .marker{fill:#cccccc;stroke:#cccccc;}#export-svg .marker.cross{stroke:#cccccc;}#export-svg svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;}#export-svg p{margin:0;}#export-svg g.classGroup text{fill:#FFFFFF;stroke:none;font-family:"Recursive Variable",arial,sans-serif;font-size:10px;}#export-svg g.classGroup text .title{font-weight:bolder;}#export-svg .nodeLabel,#export-svg .edgeLabel{color:#ccc;}#export-svg .noteLabel .nodeLabel,#export-svg .noteLabel .edgeLabel{color:#28253D;}#export-svg .edgeLabel .label rect{fill:#111113;}#export-svg .label text{fill:#ccc;}#export-svg .labelBkg{background:#111113;}#export-svg .edgeLabel .label span{background:#111113;}#export-svg .classTitle{font-weight:bolder;}#export-svg .node rect,#export-svg .node circle,#export-svg .node ellipse,#export-svg .node polygon,#export-svg .node path{fill:#111113;stroke:#FFFFFF;stroke-width:2;}#export-svg .divider{stroke:#FFFFFF;stroke-width:1;}#export-svg g.clickable{cursor:pointer;}#export-svg g.classGroup rect{fill:#111113;stroke:#FFFFFF;}#export-svg g.classGroup line{stroke:#FFFFFF;stroke-width:1;}#export-svg .classLabel .box{stroke:none;stroke-width:0;fill:#111113;opacity:0.5;}#export-svg .classLabel .label{fill:#FFFFFF;font-size:10px;}#export-svg .relation{stroke:#cccccc;stroke-width:2;fill:none;}#export-svg .dashed-line{stroke-dasharray:3;}#export-svg .dotted-line{stroke-dasharray:1 2;}#export-svg #compositionStart,#export-svg .composition{fill:#cccccc!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #compositionEnd,#export-svg .composition{fill:#cccccc!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #dependencyStart,#export-svg .dependency{fill:#cccccc!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #dependencyStart,#export-svg .dependency{fill:#cccccc!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #extensionStart,#export-svg .extension{fill:transparent!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #extensionEnd,#export-svg .extension{fill:transparent!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #aggregationStart,#export-svg .aggregation{fill:transparent!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #aggregationEnd,#export-svg .aggregation{fill:transparent!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #lollipopStart,#export-svg .lollipop{fill:#111113!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #lollipopEnd,#export-svg .lollipop{fill:#111113!important;stroke:#cccccc!important;stroke-width:1;}#export-svg .edgeTerminals{font-size:11px;line-height:initial;}#export-svg .classTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#export-svg .edgeLabel{background-color:hsl(180, 1.5873015873%, 28.3529411765%);text-align:center;}#export-svg .edgeLabel p{background-color:hsl(180, 1.5873015873%, 28.3529411765%);}#export-svg .edgeLabel rect{opacity:0.5;background-color:hsl(180, 1.5873015873%, 28.3529411765%);fill:hsl(180, 1.5873015873%, 28.3529411765%);}#export-svg .cluster rect{fill:#1E1A2E;stroke:#BDBCCC;stroke-width:2px;}#export-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#export-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#export-svg .node .neo-node{stroke:#FFFFFF;}#export-svg [data-look="neo"].node rect,#export-svg [data-look="neo"].cluster rect,#export-svg [data-look="neo"].node polygon{stroke:#FFFFFF;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node path{stroke:#FFFFFF;stroke-width:2;}#export-svg [data-look="neo"].node .outer-path{filter:url(#drop-shadow);}#export-svg [data-look="neo"].node .neo-line path{stroke:#FFFFFF;filter:none;}#export-svg [data-look="neo"].node circle{stroke:#FFFFFF;filter:url(#drLine truncated
|
||||
|
After Width: | Height: | Size: 126 KiB |
@@ -0,0 +1,102 @@
|
||||
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 1332px;" viewBox="-50 -10 1332 1090" role="graphics-document document" aria-roledescription="sequence"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Recursive Variable';
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 300 1000;
|
||||
src: url("data:font/woff2;base64,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 truncated
|
||||
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
|
||||
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><rect x="40" y="618" fill="rgb(255, 235, 235)" width="1138" height="249" class="rect"/><rect x="40" y="346" fill="rgb(255, 245, 235)" width="636" height="213" class="rect"/><rect x="40" y="75" fill="rgb(235, 245, 255)" width="636" height="261" class="rect"/><g><rect x="1082" y="974" fill="#eaeaea" stroke="#666" width="150" height="65" name="JavaServer" rx="6" ry="6" class="actor actor-bottom" data-look="neo" style="stroke: rgb(251, 146, 60); fill: rgb(255, 247, 237);" filter="url(#drop-shadow)"/><text x="1157" y="1006.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="1157" dy="0">Java Server</tspan></text></g><g><rect x="566" y="974" fill="#eaeaea" stroke="#666" width="150" height="65" name="Geyser" rx="6" ry="6" class="actor actor-bottom" data-look="neo" style="stroke: rgb(45, 212, 191); fill: rgb(240, 253, 250);" filter="url(#drop-shadow)"/><text x="641" y="1006.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="641" dy="0">Geyser</tspan></text></g><g><rect x="0" y="974" fill="#eaeaea" stroke="#666" width="150" height="65" name="Client" rx="6" ry="6" class="actor actor-bottom" data-look="neo" style="stroke: rgb(232, 121, 249); fill: rgb(253, 244, 255);" filter="url(#drop-shadow)"/><text x="75" y="1006.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="75" dy="0">Client</tspan></text></g><g><line id="actor222" x1="1157" y1="65" x2="1157" y2="974" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="JavaServer" data-et="life-line" data-id="JavaServer"/><g id="root-222" data-look="neo" data-et="participant" data-id="JavaServer"><rect x="1082" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="JavaServer" rx="6" ry="6" class="actor actor-top" data-look="neo" style="stroke: rgb(251, 146, 60); fill: rgb(255, 247, 237);" filter="url(#drop-shadow)"/><defs><filter id="drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><text x="1157" y="32.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="1157" dy="0">Java Server</tspan></text></g></g><g><line id="actor221" x1="641" y1="65" x2="641" y2="974" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Geyser" data-et="life-line" data-id="Geyser"/><g id="root-221" data-look="neo" data-et="participant" data-id="Geyser"><rect x="566" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Geyser" rx="6" ry="6" class="actor actor-top" data-look="neo" style="stroke: rgb(45, 212, 191); fill: rgb(240, 253, 250);" filter="url(#drop-shadow)"/><defs><filter id="drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><text x="641" y="32.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="641" dy="0">Geyser</tspan></text></g></g><g><line id="actor220" x1="75" y1="65" x2="75" y2="974" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Client" data-et="life-line" data-id="Client"/><g id="root-220" data-look="neo" data-et="participant" data-id="Client"><rect x="0" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Client" rx="6" ry="6" class="actor actor-top" data-look="neo" style="stroke: rgb(232, 121, 249); fill: rgb(253, 244, 255);" filter="url(#drop-shadow)"/><defs><filter id="drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><text x="75" y="32.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="75" dy="0">Client</tspan></text></g></g><style>#export-svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;fill:#28253D;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:#ffffff;}#export-svg .error-text{fill:#000000;stroke:#000000;}#export-svg .edge-thickness-normal{stroke-width:2pLine truncated
|
||||
|
After Width: | Height: | Size: 117 KiB |
@@ -0,0 +1,102 @@
|
||||
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 1332px;" viewBox="-50 -10 1332 1090" role="graphics-document document" aria-roledescription="sequence"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Recursive Variable';
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 300 1000;
|
||||
src: url("data:font/woff2;base64,d09GMgABAAAAAPP4ABQAAAACC1AAAPOFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoRTG+58HJRkP01WQVKBEAZgP1NUQVSBYic8AIUuL4EoEQgKgrlQgo1LC4UeADCEmGIBNgIkA4o0BCAFjXYHj1kMB1tP8XFBnDDsYOLjdY5tyxhP1ODemquETQc3Z3pudCVj86rVErZNi3i3Y//2nORI8v//eUljjLWdtR0QKKbl20eS7FRQsiY7ZVRRptH0yqJXr2OtTaO1imIUpLbm1BAmJ01DbFHubzrOejQ6IZzx4KbA1Nb6Uefj6wvCSyqOqh1aZFkSC39rci0YSByiIZTD9Lmpc/ssLQ7lUAp1xX3bL+ReBGUOlM2UwpgsYb4rXVD3N9ygMjLwLTR0RbefbwtNGV09EkQXTH6a43fHVcFbscQThc1CkeLzYWWPfl664n/SvbTyfERbWp/mYTAGF8MMsezJuSqinvr+PL/NP/e+ByIl2jMxhorIGBZzBhYywYlRhYWRMzC3Odbqyrlyrly331X8qHJRMsSf+nePyQv08poU8MCb1Ym/o8vf/AkqOLn14HaoBhZ/VRod9M/bwTtz7tsPM0nnCgYr1+kg7ABNZ9eYNHYxvag3aSoxb6NNzSk1aFEbBYbo5pjYrMjgmcPkYS5sAEW1H2/PvR/WqRgH5FgYQA1AlmWsi3LREYp2eFrO/1+zET/jurOz4tlNsjFSCpSaPzHlTvWratsrr70VBQp18CREB97N6qkxZmfiUD3Rzyf2J6LQVKhiFiAQCAlRIwmmNd+ZticmQ3PpQ0cltlNzGoWdApJ4Yf5PrwCI+XHuc8hCTagjwgLl2lfAhNvmz52UswKF28A71f93uM3WNCUY4UWmz8sPpnUHiMrbUgg7TgwoWxZYFgCbZTuOM19N7atqQIFlyYAJz8wngtNf5Ou/rtWKA0tw37dHQM5wgAwCbKm5AOEF76nYl4eXKzBy8nm5PFw5qZxUVsqRk/DjcA5z1vcqkNiSHQec5pl+ALxMh8tejrufkzR/hCsyDlHCtid1mrNaBQJTALFkxQWA8YGX+SdYCwwBOfrr9LnV/58rNm6ttCk0BIsbIUKMkMYamjadqak8W73av8XGfGtiX0SHoLj07MefPo1DzaKlNZD08WAAPZjVDQdRRN+nTp32af3/71Tv3fg9eyhwrAIalBKAIa6XOHA6d/UYpF/pFw2JQ05lDlIZ/fW//gegUPjju/kfmpN46/igTNSQXVG29ZmYfjkBOJeX9IF4QKxclRyQ8RNKjAB+f/igP4GRuSMuxLw7mrOMOiPuhVGt7dmkjBviTbjEM7MfATzP/9V4MJsLGH58bmXLjlm6LdTJaaE/Uf9/r7Pa6mNwCVxBQGMErq4CU+F/Gdv/Y6jeXnV056qeVDUpdsgr6ekLfQWwEIYSErhAUFUE2yUkcAkJbMDGY1O4QsiuTu5M568vgb+EcH1J4IQ9bXBVB3fVBHdKdqXYIeXd5LCs5cx2diGverYhbzdz9rNejf+fqn4tQP6QcvWbUvbmotyqA+68wQMxGIACRcoiFSk6JclR/oEzoGgQpKI35eqfrUKskuxNud+23abdogyxK7do1/9/XWmrq7sks4KT8B5H54S4NlBTBppm9KVZ7debv1qg2W+i8ZgntGwvnVkDVQEqXaYoPQGEqqOqS5mySlmlD/H405LeaGUpsPN8uHABSzqkXp9Pe09fvjRUm5OOWrvSUgAJwAE8/tdy2tv7vDvS2nhUYiRvUXFolLq2V9mUUlSrNnGAQ7jIYmw6gUaGIQb0/+VPq3pS0zby5xLQD5DJLFbZZlZzxn9izX/PGRnNq/3NzarGkIhKgCAiIrKOiGB3qM3Cm5XGzxUaRESChH/3pI/+0p4d2GXXqFEVFRUVeVF51f3c9xcHkzUpEghgH+yIkd3+Lfe+YUz9/pmA5prR3mpj4sCBDEFEREXh/jRfnK/O32461gAwSC3rkrdCRGt7syqiQCTkudtvgCDwBmBCutEiaGCscSCwBmhBy4a6Lu5unwSp27ihXF4RTFggjL6xMWdV7Dhy5sydkBdfEkvGS6tFSIeKJBdFQSVeigxZshQopVYz1gjRANEE0QLR8Q7RQ4ugT//MoKHxahGs2RHSEUMsxGEilZmM5CoC6aqKUCMfSyyxVLBeEcpGcnugb4BGAgbADngZAot4gL7j6pPl4OP1RAH85v/br9MFUVU7/aO57Pth2Eraz9pVhiqMIuXInUsJNpa8nNZWYGWtDg4Kjjnhm3ZcEimkOLNJFVZSd4H+z14AoAcIHTbifnFeQJAwfpXX0WNxAIq2kKGqEM/Dcmav7WGJuht3u1J6S8/bO/7Gr4OqHoYbT0IaQLzOmctIFbxaKcQsslTwZcRKMsVY3aZwNFnUZzQ9iAvYdB5dxJKwIS68RiegCVRipdyrUOhtJWVl1RNOqkioAiwBeD/dANKmmWACn/kTgY6bInjNtZUJwD5wN40a2JAAgF6PVIDnzpoD9qpVg8Syy8B9Xm63ATMAJHQY/7lAJNHB/1Wr0DDM/4VkY7T85uKRxUrRZ0aT5i8KVwnlAq17h3uSu5PzmrIBuDA08NiLgQ4ewYUEjA/DFwniBp6RANCp617/MoqgnIoNwMfNXqmaMzrpXbKUh0h50wN3wjwgyMvu/IatSIg3KvxzKAOaSnbKe64gmwOO+FAjF9SjIFo+xiRPiupwMRuJmnnNOoqda1EBloMIOslL6DRfTwklqbNx4jLbCT2r/0dk3UMbYu3u6MDmFWexmsOhmOjeOQ1RItmBzWEcsBJEd79r7wpgu/uI5UBG/WpeI1ckCnpqd/IzfwfV1jH+Fh8agy9tBuSaPl/S2LZjjSe71gUTbKPt2bQE7eI0tgYwjYxDEZd1lnWzmTIBituQ6RYvUTsDI09Fqko7dIayzIEPRs3AztEnBbTg/kfOCIstCgxkmX0afxgHnbK9y8CoSygZ52lyqHWRrjc9ALxz3h0x/Lmv9DMiRzQTiXE/ZMcBr2OHMEUqi8dQMzNuwoKopP7zMBE360CYthwnT0opyDnWxxEIA4izAf2Ox9UDTRbumA1P/utnORf9Lt4e7ye1OMAzoi8M3ZgHd5tnpdKKyvYjCzpnEE20QFfQWAqCCfgEeDrBIH7Sr7nk2eNrXupe0peiyXvODexYpqyJESZHaUEKdo1ZE7uaI/TVh6YZN4hlqjh9RLIiW3AQzzBYQ1sfdVPpmxnrTZOINrG736WxCOhMr+AR5IL/B4CUBymQT3y03gtQNKm35jph/ojo1unboTnM0hhF3Jw7tQgtyzzLDKVMyrtjyvphgIDGlOGzZj7m4mClNPP5ek76nhB3fygrJU2OzQNLOAUioJ5JDrrljwhbRiLiM7YYZOu6LMZbI3vyshYgxx/4mG53ceaI2J0uf8R9Ta26hiXblmjR4cW4YvZAu79S5GkdG8jq1nOwLLKnsRWtTpLbaEDt8zWmQKZmrOi2Vmcf5nFJ5rZU4JVB7DaOd1n0VHCwLVSlsjTj7olR+mta8fHMQ6k2heh2/mfBDQefmDNvSwkEKiiHIt0ynio8NzvqpBantxXOZqeLbjC4lZvMKLbZ/d12T7y5uv1Cld1+xkH/V0a98NaYeXo42W8LE1nyg1056GB3/ga59OShvJNCBXcfi1FgwIR3FFiwITDCvI4tQGB5a8+KHdO8c2AIl8Zx7GS3ztwQuIMCH4EHCgJmPNOGkJgR3mnHlx9zEgsswcQfhaUIAhgSxJDgJJCSIYmssZGLglGIQUX1sBWLIy7ZxEuBSMUmrUYnXSYaWfJhCh40CmGK0ChmrCStlapkgJqJKpaq01WNOiY0rNRj05AkjZpgmpNNi1aINnTa5/j50XgFGHQ+OujSjatzYzEgLRxzAotTXJzh7FzdyUWXLHTZNRKuezwe34SM22R8lK5mFRPcJ3hC8JSEZzvBFz5x+EoViS2weNkEZFAirOdvYmuOTl5Z89bhIuWQuu4cbN0uAdZdHVSFTw5OhvBkRVqfZ2lbvbSvDmj6W4GBwZbDJHcOyzxH4JrX8LY9wB6sCj7tqrDB5BuOXVhGZzhAUVECCATbUQhUmQcU4JsPgcCXgtCngkjkFiQqNh+R5JFOPlElMdgk0kBmMwMu3QWBIqkrEoAuR4AGUQQVCaeExStiMlGwHYA2HLErklhEMlkUkUyQAsA3TQW01ZTJmuF2DsDZizKyyS7hgZwtaj+hUhSBGuKE7S3A503wgTKyySaObOKA159WqTSZ8h/iySCdowQqGwIqIGxFNOEsFoy9VhQRRjJZFJEsoI9F0mq/O3oRgAAA3OePgztviUvACRPbwMJ0lJuUs5TDjfdS1lPWUhaO9GGok15zr72GtJo0hRgkuid1osC8aQYWwjSh+ipcW/cSKm6PNxDyfPVmK/jH+K1jjtfiX8AvxW/F2/GY8D1wD+AO4taTVsMybi1uyYWfEM8sAZcQCEEQRUvpp3EN5qbnpNgnXN0Hb96OXYkdwmYfxjUoadkpBtrTNOY7n7sBJTWfLvJX5MNaoJHKI9+o9DORD5AeK2h/NU39V9W5lICuNcylz/uZzEWXoUuj/0YuYOkBRTkDBWFRbYXLhPNUeCMvy/AodAs0b6ne2JaGyEa2sR2JtsR6Y5a3eeQNyz9RZg/38Qi3chvPYI8Vstd6b3wkdx1MF2yQK65Uf4arxzRbrHAdCg+nHBcnZ0+Tc+x8uSAuuuRyueK6Kk5Fij3Ni2le5bwmb1CeilCpSrMWRq1MbPB0IMBq44ScwIMnL958+PLXCepZm9syW/dfmrjz3wx+bR225pprrrnmqm7m/rO5Qil1GN+Pg2xMBJxoZmYiIlJiYmZmZmbe2yykCc4F5ycE4MHNRQCAmbkxgwEAAIBj4Pem3Vjj9Y3aZMKWQSOQTuwT+HFzERHhJucutci2/4PTETsriWkClmLj4OLhf4dcTa2pLine truncated
|
||||
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
|
||||
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><rect x="40" y="618" fill="rgb(1, 50, 50)" width="1138" height="249" class="rect"/><rect x="40" y="346" fill="rgb(1, 25, 50)" width="636" height="213" class="rect"/><rect x="40" y="75" fill="rgb(1, 1, 50)" width="636" height="261" class="rect"/><g><rect x="1082" y="974" fill="#eaeaea" stroke="#666" width="150" height="65" name="JavaServer" rx="6" ry="6" class="actor actor-bottom" data-look="neo" style="stroke: rgb(251, 146, 60);" filter="url(#drop-shadow)"/><text x="1157" y="1006.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="1157" dy="0">Java Server</tspan></text></g><g><rect x="566" y="974" fill="#eaeaea" stroke="#666" width="150" height="65" name="Geyser" rx="6" ry="6" class="actor actor-bottom" data-look="neo" style="stroke: rgb(45, 212, 191);" filter="url(#drop-shadow)"/><text x="641" y="1006.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="641" dy="0">Geyser</tspan></text></g><g><rect x="0" y="974" fill="#eaeaea" stroke="#666" width="150" height="65" name="Client" rx="6" ry="6" class="actor actor-bottom" data-look="neo" style="stroke: rgb(232, 121, 249);" filter="url(#drop-shadow)"/><text x="75" y="1006.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="75" dy="0">Client</tspan></text></g><g><line id="actor5" x1="1157" y1="65" x2="1157" y2="974" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="JavaServer" data-et="life-line" data-id="JavaServer"/><g id="root-5" data-look="neo" data-et="participant" data-id="JavaServer"><rect x="1082" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="JavaServer" rx="6" ry="6" class="actor actor-top" data-look="neo" style="stroke: rgb(251, 146, 60);" filter="url(#drop-shadow)"/><defs><filter id="drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#FFFFFF"/></filter></defs><text x="1157" y="32.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="1157" dy="0">Java Server</tspan></text></g></g><g><line id="actor4" x1="641" y1="65" x2="641" y2="974" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Geyser" data-et="life-line" data-id="Geyser"/><g id="root-4" data-look="neo" data-et="participant" data-id="Geyser"><rect x="566" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Geyser" rx="6" ry="6" class="actor actor-top" data-look="neo" style="stroke: rgb(45, 212, 191);" filter="url(#drop-shadow)"/><defs><filter id="drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#FFFFFF"/></filter></defs><text x="641" y="32.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="641" dy="0">Geyser</tspan></text></g></g><g><line id="actor3" x1="75" y1="65" x2="75" y2="974" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Client" data-et="life-line" data-id="Client"/><g id="root-3" data-look="neo" data-et="participant" data-id="Client"><rect x="0" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Client" rx="6" ry="6" class="actor actor-top" data-look="neo" style="stroke: rgb(232, 121, 249);" filter="url(#drop-shadow)"/><defs><filter id="drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#FFFFFF"/></filter></defs><text x="75" y="32.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="75" dy="0">Client</tspan></text></g></g><style>#export-svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:hsl(20, 1.5873015873%, 12.3529411765%);}#export-svg .error-text{fill:rgb(222.9999999999, 223.6666666666, 223.9999999999);stroke:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .edge-thickness-normal{stroke-width:2px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-Line truncated
|
||||
|
After Width: | Height: | Size: 117 KiB |
@@ -0,0 +1,102 @@
|
||||
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="flowchart" style="max-width: 1814.8438720703125px;" viewBox="308.9886474609375 -207.49822998046875 1814.8438720703125 937.8803100585938" role="graphics-document document" aria-roledescription="flowchart-v2"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Recursive Variable';
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 300 1000;
|
||||
src: url("data:font/woff2;base64,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 truncated
|
||||
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
|
||||
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><style>#export-svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;fill:#28253D;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:#ffffff;}#export-svg .error-text{fill:#000000;stroke:#000000;}#export-svg .edge-thickness-normal{stroke-width:2px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-svg .edge-pattern-solid{stroke-dasharray:0;}#export-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#export-svg .edge-pattern-dashed{stroke-dasharray:3;}#export-svg .edge-pattern-dotted{stroke-dasharray:2;}#export-svg .marker{fill:#000000;stroke:#000000;}#export-svg .marker.cross{stroke:#000000;}#export-svg svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;}#export-svg p{margin:0;}#export-svg .label{font-family:"Recursive Variable",arial,sans-serif;color:#28253D;}#export-svg .cluster-label text{fill:#000000;}#export-svg .cluster-label span{color:#000000;}#export-svg .cluster-label span p{background-color:transparent;}#export-svg .label text,#export-svg span{fill:#28253D;color:#28253D;}#export-svg .node rect,#export-svg .node circle,#export-svg .node ellipse,#export-svg .node polygon,#export-svg .node path{fill:#ffffff;stroke:#28253D;stroke-width:2px;}#export-svg .rough-node .label text,#export-svg .node .label text,#export-svg .image-shape .label,#export-svg .icon-shape .label{text-anchor:middle;}#export-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#export-svg .rough-node .label,#export-svg .node .label,#export-svg .image-shape .label,#export-svg .icon-shape .label{text-align:center;}#export-svg .node.clickable{cursor:pointer;}#export-svg .root .anchor path{fill:#000000!important;stroke-width:0;stroke:#000000;}#export-svg .arrowheadPath{fill:#000000;}#export-svg .edgePath .path{stroke:#000000;stroke-width:2px;}#export-svg .flowchart-link{stroke:#000000;fill:none;}#export-svg .edgeLabel{background-color:hsl(-120, 0%, 80%);text-align:center;}#export-svg .edgeLabel p{background-color:hsl(-120, 0%, 80%);}#export-svg .edgeLabel rect{opacity:0.5;background-color:hsl(-120, 0%, 80%);fill:hsl(-120, 0%, 80%);}#export-svg .labelBkg{background-color:rgba(204, 204, 204, 0.5);}#export-svg .cluster rect{fill:#F9F9FB;stroke:#BDBCCC;stroke-width:2px;}#export-svg .cluster text{fill:#000000;}#export-svg .cluster span{color:#000000;}#export-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"Recursive Variable",arial,sans-serif;font-size:12px;background:#ffffff;border:1px solid hsl(0, 0%, 90%);border-radius:2px;pointer-events:none;z-index:100;}#export-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#28253D;}#export-svg rect.text{fill:none;stroke-width:0;}#export-svg .icon-shape,#export-svg .image-shape{background-color:hsl(-120, 0%, 80%);text-align:center;}#export-svg .icon-shape p,#export-svg .image-shape p{background-color:hsl(-120, 0%, 80%);padding:2px;}#export-svg .icon-shape rect,#export-svg .image-shape rect{opacity:0.5;background-color:hsl(-120, 0%, 80%);fill:hsl(-120, 0%, 80%);}#export-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#export-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#export-svg .node .neo-node{stroke:#28253D;}#export-svg [data-look="neo"].node rect,#export-svg [data-look="neo"].cluster rect,#export-svg [data-look="neo"].node polygon{stroke:#28253D;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node path{stroke:#28253D;stroke-width:2;}#export-svg [data-look="neo"].node .outer-path{filter:url(#drop-shadow);}#export-svg [data-look="neo"].node .neo-line path{stroke:#28253D;filter:none;}#export-svg [data-look="neo"].node circle{stroke:#28253D;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node circle .state-start{fill:#000000;}#export-svg [data-look="neo"].statediagram-cluster rect{fill:#F9F9FB;stroke:#28253D;stroke-width:2;}#export-svg [data-look="neo"].icon-shape .icon{fill:#28253D;filter:url(#drop-shadow);}#export-svg [data-look="neo"].icon-shape .icon-neo path{stroke:#28253D;filter:url(#drop-shadow);}#export-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker id="export-svg_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 11.5 14" refX="7.75" refY="7" markerUnits="userSpaceOnUse" markerWidth="10.5" markerHeight="14" orient="auto"><path d="M 0 0 L 11.5 7 L 0 14 z" class="arrowMarkerPath" style="stroke-width: 0pLine truncated
|
||||
|
After Width: | Height: | Size: 115 KiB |
@@ -0,0 +1,102 @@
|
||||
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="flowchart" style="max-width: 1814.84px;" viewBox="308.9886474609375 -207.49822998046875 1814.8438720703125 937.8803100585938" role="graphics-document document" aria-roledescription="flowchart-v2"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Recursive Variable';
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 300 1000;
|
||||
src: url("data:font/woff2;base64,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 truncated
|
||||
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
|
||||
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><style>#export-svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:hsl(20, 1.5873015873%, 12.3529411765%);}#export-svg .error-text{fill:rgb(222.9999999999, 223.6666666666, 223.9999999999);stroke:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .edge-thickness-normal{stroke-width:2px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-svg .edge-pattern-solid{stroke-dasharray:0;}#export-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#export-svg .edge-pattern-dashed{stroke-dasharray:3;}#export-svg .edge-pattern-dotted{stroke-dasharray:2;}#export-svg .marker{fill:#cccccc;stroke:#cccccc;}#export-svg .marker.cross{stroke:#cccccc;}#export-svg svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;}#export-svg p{margin:0;}#export-svg .label{font-family:"Recursive Variable",arial,sans-serif;color:#e0dfdf;}#export-svg .cluster-label text{fill:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .cluster-label span{color:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .cluster-label span p{background-color:transparent;}#export-svg .label text,#export-svg span{fill:#e0dfdf;color:#e0dfdf;}#export-svg .node rect,#export-svg .node circle,#export-svg .node ellipse,#export-svg .node polygon,#export-svg .node path{fill:#111113;stroke:#FFFFFF;stroke-width:2px;}#export-svg .rough-node .label text,#export-svg .node .label text,#export-svg .image-shape .label,#export-svg .icon-shape .label{text-anchor:middle;}#export-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#export-svg .rough-node .label,#export-svg .node .label,#export-svg .image-shape .label,#export-svg .icon-shape .label{text-align:center;}#export-svg .node.clickable{cursor:pointer;}#export-svg .root .anchor path{fill:#cccccc!important;stroke-width:0;stroke:#cccccc;}#export-svg .arrowheadPath{fill:#cccccc;}#export-svg .edgePath .path{stroke:#cccccc;stroke-width:2px;}#export-svg .flowchart-link{stroke:#cccccc;fill:none;}#export-svg .edgeLabel{background-color:hsl(180, 1.5873015873%, 28.3529411765%);text-align:center;}#export-svg .edgeLabel p{background-color:hsl(180, 1.5873015873%, 28.3529411765%);}#export-svg .edgeLabel rect{opacity:0.5;background-color:hsl(180, 1.5873015873%, 28.3529411765%);fill:hsl(180, 1.5873015873%, 28.3529411765%);}#export-svg .labelBkg{background-color:rgba(71.1523809525, 73.4476190477, 73.4476190477, 0.5);}#export-svg .cluster rect{fill:#1E1A2E;stroke:#BDBCCC;stroke-width:2px;}#export-svg .cluster text{fill:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .cluster span{color:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"Recursive Variable",arial,sans-serif;font-size:12px;background:hsl(20, 1.5873015873%, 12.3529411765%);border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#export-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#export-svg rect.text{fill:none;stroke-width:0;}#export-svg .icon-shape,#export-svg .image-shape{background-color:hsl(180, 1.5873015873%, 28.3529411765%);text-align:center;}#export-svg .icon-shape p,#export-svg .image-shape p{background-color:hsl(180, 1.5873015873%, 28.3529411765%);padding:2px;}#export-svg .icon-shape rect,#export-svg .image-shape rect{opacity:0.5;background-color:hsl(180, 1.5873015873%, 28.3529411765%);fill:hsl(180, 1.5873015873%, 28.3529411765%);}#export-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#export-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#export-svg .node .neo-node{stroke:#FFFFFF;}#export-svg [data-look="neo"].node rect,#export-svg [data-look="neo"].cluster rect,#export-svg [data-look="neo"].node polygon{stroke:#FFFFFF;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node path{stroke:#FFFFFF;stroke-width:2;}#export-svg [data-look="neo"].node .outer-path{filter:url(#drop-shadow);}#export-svg [data-look="neo"].node .neo-line path{stroke:#FFFFFF;filter:none;}#export-svg [data-look="neo"].node circle{stroke:#FFFFFF;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node circle .state-start{fill:#000000;}#export-svg [data-look="neo"].statediagram-cluster rect{fill:#16141F;stroke:#FFFFFF;stroke-width:2;}#export-svg [data-look="nLine truncated
|
||||
|
After Width: | Height: | Size: 116 KiB |
@@ -0,0 +1,102 @@
|
||||
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 816px;" viewBox="-50 -10 816 1062" role="graphics-document document" aria-roledescription="sequence"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Recursive Variable';
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 300 1000;
|
||||
src: url("data:font/woff2;base64,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 truncated
|
||||
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
|
||||
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><rect x="40" y="617" fill="rgb(255, 235, 235)" width="636" height="309" class="rect"/><rect x="40" y="346" fill="rgb(255, 245, 235)" width="636" height="261" class="rect"/><rect x="40" y="75" fill="rgb(235, 245, 255)" width="636" height="261" class="rect"/><g><rect x="566" y="946" fill="#eaeaea" stroke="#666" width="150" height="65" name="Geyser" rx="6" ry="6" class="actor actor-bottom" data-look="neo" style="stroke: rgb(45, 212, 191); fill: rgb(240, 253, 250);" filter="url(#drop-shadow)"/><text x="641" y="978.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="641" dy="0">Geyser</tspan></text></g><g><rect x="0" y="946" fill="#eaeaea" stroke="#666" width="150" height="65" name="Client" rx="6" ry="6" class="actor actor-bottom" data-look="neo" style="stroke: rgb(232, 121, 249); fill: rgb(253, 244, 255);" filter="url(#drop-shadow)"/><text x="75" y="978.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="75" dy="0">Client</tspan></text></g><g><line id="actor447" x1="641" y1="65" x2="641" y2="946" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Geyser" data-et="life-line" data-id="Geyser"/><g id="root-447" data-look="neo" data-et="participant" data-id="Geyser"><rect x="566" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Geyser" rx="6" ry="6" class="actor actor-top" data-look="neo" style="stroke: rgb(45, 212, 191); fill: rgb(240, 253, 250);" filter="url(#drop-shadow)"/><defs><filter id="drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><text x="641" y="32.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="641" dy="0">Geyser</tspan></text></g></g><g><line id="actor446" x1="75" y1="65" x2="75" y2="946" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Client" data-et="life-line" data-id="Client"/><g id="root-446" data-look="neo" data-et="participant" data-id="Client"><rect x="0" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Client" rx="6" ry="6" class="actor actor-top" data-look="neo" style="stroke: rgb(232, 121, 249); fill: rgb(253, 244, 255);" filter="url(#drop-shadow)"/><defs><filter id="drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#000000"/></filter></defs><text x="75" y="32.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="75" dy="0">Client</tspan></text></g></g><style>#export-svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;fill:#28253D;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:#ffffff;}#export-svg .error-text{fill:#000000;stroke:#000000;}#export-svg .edge-thickness-normal{stroke-width:2px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-svg .edge-pattern-solid{stroke-dasharray:0;}#export-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#export-svg .edge-pattern-dashed{stroke-dasharray:3;}#export-svg .edge-pattern-dotted{stroke-dasharray:2;}#export-svg .marker{fill:#000000;stroke:#000000;}#export-svg .marker.cross{stroke:#000000;}#export-svg svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;}#export-svg p{margin:0;}#export-svg .actor{stroke:#28253D;fill:#ffffff;stroke-width:2;}#export-svg rect.actor.outer-path[data-look="neo"]{filter:url(#drop-shadow);}#export-svg rect.note[data-look="neo"]{stroke:#FACC15;fill:#fff5ad;filter:url(#drop-shadow);stroke-width:2;}#export-svg text.actor>tspan{fill:#28253D;stroke:none;}#export-svg .actor-line{stroke:#28253D;}#export-svg .messageLine0{stroke-width:2;stroke-dasharray:none;stroke:#28253D;}#export-svg .messageLine1{stroke-width:2;stroke-dasharray:2,2;stroke:#28253D;}#export-svg #arrowhead path{fill:#28253D;stroke:#28253D;}#export-svg .sequenceNumber{fill:#ffffff;}#export-svg #sequencenumber{fill:#28253D;}#export-svg #crosshead path{fill:#28253D;stroke:#28253D;}#export-svg .messageText{fill:#28253D;stroke:none;}#export-svg .labelBox{stroke:#28253D;fill:#ffffff;filter:url(#drop-shadow);}#export-svg .labelText,#export-svg .labelTexLine truncated
|
||||
|
After Width: | Height: | Size: 116 KiB |
@@ -0,0 +1,102 @@
|
||||
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 816px;" viewBox="-50 -10 816 1062" role="graphics-document document" aria-roledescription="sequence"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Recursive Variable';
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 300 1000;
|
||||
src: url("data:font/woff2;base64,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 truncated
|
||||
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
|
||||
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><rect x="40" y="617" fill="rgb(1, 50, 50)" width="636" height="309" class="rect"/><rect x="40" y="346" fill="rgb(1, 25, 50)" width="636" height="261" class="rect"/><rect x="40" y="75" fill="rgb(1, 1, 50)" width="636" height="261" class="rect"/><g><rect x="566" y="946" fill="#eaeaea" stroke="#666" width="150" height="65" name="Geyser" rx="6" ry="6" class="actor actor-bottom" data-look="neo" style="stroke: rgb(45, 212, 191);" filter="url(#drop-shadow)"/><text x="641" y="978.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="641" dy="0">Geyser</tspan></text></g><g><rect x="0" y="946" fill="#eaeaea" stroke="#666" width="150" height="65" name="Client" rx="6" ry="6" class="actor actor-bottom" data-look="neo" style="stroke: rgb(232, 121, 249);" filter="url(#drop-shadow)"/><text x="75" y="978.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="75" dy="0">Client</tspan></text></g><g><line id="actor473" x1="641" y1="65" x2="641" y2="946" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Geyser" data-et="life-line" data-id="Geyser"/><g id="root-473" data-look="neo" data-et="participant" data-id="Geyser"><rect x="566" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Geyser" rx="6" ry="6" class="actor actor-top" data-look="neo" style="stroke: rgb(45, 212, 191);" filter="url(#drop-shadow)"/><defs><filter id="drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#FFFFFF"/></filter></defs><text x="641" y="32.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="641" dy="0">Geyser</tspan></text></g></g><g><line id="actor472" x1="75" y1="65" x2="75" y2="946" class="actor-line 200" stroke-width="0.5px" stroke="#999" name="Client" data-et="life-line" data-id="Client"/><g id="root-472" data-look="neo" data-et="participant" data-id="Client"><rect x="0" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" name="Client" rx="6" ry="6" class="actor actor-top" data-look="neo" style="stroke: rgb(232, 121, 249);" filter="url(#drop-shadow)"/><defs><filter id="drop-shadow" height="130%" width="130%"><feDropShadow dx="4" dy="4" stdDeviation="0" flood-opacity="0.06" flood-color="#FFFFFF"/></filter></defs><text x="75" y="32.5" style="text-anchor: middle; font-size: 16px; font-weight: 400;" dominant-baseline="central" alignment-baseline="central" class="actor actor-box"><tspan x="75" dy="0">Client</tspan></text></g></g><style>#export-svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:hsl(20, 1.5873015873%, 12.3529411765%);}#export-svg .error-text{fill:rgb(222.9999999999, 223.6666666666, 223.9999999999);stroke:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .edge-thickness-normal{stroke-width:2px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-svg .edge-pattern-solid{stroke-dasharray:0;}#export-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#export-svg .edge-pattern-dashed{stroke-dasharray:3;}#export-svg .edge-pattern-dotted{stroke-dasharray:2;}#export-svg .marker{fill:#cccccc;stroke:#cccccc;}#export-svg .marker.cross{stroke:#cccccc;}#export-svg svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;}#export-svg p{margin:0;}#export-svg .actor{stroke:#FFFFFF;fill:#111113;stroke-width:2;}#export-svg rect.actor.outer-path[data-look="neo"]{filter:url(#drop-shadow);}#export-svg rect.note[data-look="neo"]{stroke:#FACC15;fill:#FEF9C3;filter:url(#drop-shadow);stroke-width:2;}#export-svg text.actor>tspan{fill:#e0dfdf;stroke:none;}#export-svg .actor-line{stroke:#FFFFFF;}#export-svg .messageLine0{stroke-width:2;stroke-dasharray:none;stroke:#FFFFFF;}#export-svg .messageLine1{stroke-width:2;stroke-dasharray:2,2;stroke:#FFFFFF;}#export-svg #arrowhead path{fill:#FFFFFF;stroke:#FFFFFF;}#export-svg .sequenceNumber{fill:#333333;}#export-svg #sequencenumber{fill:#FFFFFF;}#export-svg #crosshead path{fill:#FFFFFF;stroke:#FFFFFF;}#export-svg .messageText{fill:#ccc;stroke:none;}#export-svg .labelBox{stroke:#BDBCCC;fill:#111113;filter:url(#drop-shadow);}#export-svg .labelText,#export-svg .labelText>Line truncated
|
||||
|
After Width: | Height: | Size: 116 KiB |
@@ -0,0 +1,102 @@
|
||||
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="classDiagram" style="max-width: 1155.88330078125px;" viewBox="0 0 1155.88330078125 1208" role="graphics-document document" aria-roledescription="class"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Recursive Variable';
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 300 1000;
|
||||
src: url("data:font/woff2;base64,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 truncated
|
||||
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
|
||||
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><style>#export-svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;fill:#28253D;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:#ffffff;}#export-svg .error-text{fill:#000000;stroke:#000000;}#export-svg .edge-thickness-normal{stroke-width:2px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-svg .edge-pattern-solid{stroke-dasharray:0;}#export-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#export-svg .edge-pattern-dashed{stroke-dasharray:3;}#export-svg .edge-pattern-dotted{stroke-dasharray:2;}#export-svg .marker{fill:#000000;stroke:#000000;}#export-svg .marker.cross{stroke:#000000;}#export-svg svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;}#export-svg p{margin:0;}#export-svg g.classGroup text{fill:#28253D;stroke:none;font-family:"Recursive Variable",arial,sans-serif;font-size:10px;}#export-svg g.classGroup text .title{font-weight:bolder;}#export-svg .nodeLabel,#export-svg .edgeLabel{color:#28253D;}#export-svg .noteLabel .nodeLabel,#export-svg .noteLabel .edgeLabel{color:#28253D;}#export-svg .edgeLabel .label rect{fill:#ffffff;}#export-svg .label text{fill:#28253D;}#export-svg .labelBkg{background:#ffffff;}#export-svg .edgeLabel .label span{background:#ffffff;}#export-svg .classTitle{font-weight:bolder;}#export-svg .node rect,#export-svg .node circle,#export-svg .node ellipse,#export-svg .node polygon,#export-svg .node path{fill:#ffffff;stroke:#28253D;stroke-width:2;}#export-svg .divider{stroke:#28253D;stroke-width:1;}#export-svg g.clickable{cursor:pointer;}#export-svg g.classGroup rect{fill:#ffffff;stroke:#28253D;}#export-svg g.classGroup line{stroke:#28253D;stroke-width:1;}#export-svg .classLabel .box{stroke:none;stroke-width:0;fill:#ffffff;opacity:0.5;}#export-svg .classLabel .label{fill:#28253D;font-size:10px;}#export-svg .relation{stroke:#000000;stroke-width:2;fill:none;}#export-svg .dashed-line{stroke-dasharray:3;}#export-svg .dotted-line{stroke-dasharray:1 2;}#export-svg #compositionStart,#export-svg .composition{fill:#000000!important;stroke:#000000!important;stroke-width:1;}#export-svg #compositionEnd,#export-svg .composition{fill:#000000!important;stroke:#000000!important;stroke-width:1;}#export-svg #dependencyStart,#export-svg .dependency{fill:#000000!important;stroke:#000000!important;stroke-width:1;}#export-svg #dependencyStart,#export-svg .dependency{fill:#000000!important;stroke:#000000!important;stroke-width:1;}#export-svg #extensionStart,#export-svg .extension{fill:transparent!important;stroke:#000000!important;stroke-width:1;}#export-svg #extensionEnd,#export-svg .extension{fill:transparent!important;stroke:#000000!important;stroke-width:1;}#export-svg #aggregationStart,#export-svg .aggregation{fill:transparent!important;stroke:#000000!important;stroke-width:1;}#export-svg #aggregationEnd,#export-svg .aggregation{fill:transparent!important;stroke:#000000!important;stroke-width:1;}#export-svg #lollipopStart,#export-svg .lollipop{fill:#ffffff!important;stroke:#000000!important;stroke-width:1;}#export-svg #lollipopEnd,#export-svg .lollipop{fill:#ffffff!important;stroke:#000000!important;stroke-width:1;}#export-svg .edgeTerminals{font-size:11px;line-height:initial;}#export-svg .classTitleText{text-anchor:middle;font-size:18px;fill:#28253D;}#export-svg .edgeLabel{background-color:hsl(-120, 0%, 80%);text-align:center;}#export-svg .edgeLabel p{background-color:hsl(-120, 0%, 80%);}#export-svg .edgeLabel rect{opacity:0.5;background-color:hsl(-120, 0%, 80%);fill:hsl(-120, 0%, 80%);}#export-svg .cluster rect{fill:#F9F9FB;stroke:#BDBCCC;stroke-width:2px;}#export-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#export-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#export-svg .node .neo-node{stroke:#28253D;}#export-svg [data-look="neo"].node rect,#export-svg [data-look="neo"].cluster rect,#export-svg [data-look="neo"].node polygon{stroke:#28253D;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node path{stroke:#28253D;stroke-width:2;}#export-svg [data-look="neo"].node .outer-path{filter:url(#drop-shadow);}#export-svg [data-look="neo"].node .neo-line path{stroke:#28253D;filter:none;}#export-svg [data-look="neo"].node circle{stroke:#28253D;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node circle .state-start{fill:#000000;}#export-svg [data-look="neo"].statediagram-cluster rect{fill:#F9F9FB;stroke:#28253D;stroke-width:2;}#export-svLine truncated
|
||||
|
After Width: | Height: | Size: 135 KiB |
@@ -0,0 +1,102 @@
|
||||
<svg id="export-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="classDiagram" style="max-width: 1155.88px;" viewBox="0 0 1155.88330078125 1208" role="graphics-document document" aria-roledescription="class"><style xmlns="http://www.w3.org/1999/xhtml">/* Google Inc.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Recursive Variable';
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
font-weight: 300 1000;
|
||||
src: url("data:font/woff2;base64,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 truncated
|
||||
unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;
|
||||
}</style><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css"); p {margin: 0;}</style><style>#export-svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;fill:#ccc;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#export-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#export-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#export-svg .error-icon{fill:hsl(20, 1.5873015873%, 12.3529411765%);}#export-svg .error-text{fill:rgb(222.9999999999, 223.6666666666, 223.9999999999);stroke:rgb(222.9999999999, 223.6666666666, 223.9999999999);}#export-svg .edge-thickness-normal{stroke-width:2px;}#export-svg .edge-thickness-thick{stroke-width:3.5px;}#export-svg .edge-pattern-solid{stroke-dasharray:0;}#export-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#export-svg .edge-pattern-dashed{stroke-dasharray:3;}#export-svg .edge-pattern-dotted{stroke-dasharray:2;}#export-svg .marker{fill:#cccccc;stroke:#cccccc;}#export-svg .marker.cross{stroke:#cccccc;}#export-svg svg{font-family:"Recursive Variable",arial,sans-serif;font-size:14px;}#export-svg p{margin:0;}#export-svg g.classGroup text{fill:#FFFFFF;stroke:none;font-family:"Recursive Variable",arial,sans-serif;font-size:10px;}#export-svg g.classGroup text .title{font-weight:bolder;}#export-svg .nodeLabel,#export-svg .edgeLabel{color:#ccc;}#export-svg .noteLabel .nodeLabel,#export-svg .noteLabel .edgeLabel{color:#28253D;}#export-svg .edgeLabel .label rect{fill:#111113;}#export-svg .label text{fill:#ccc;}#export-svg .labelBkg{background:#111113;}#export-svg .edgeLabel .label span{background:#111113;}#export-svg .classTitle{font-weight:bolder;}#export-svg .node rect,#export-svg .node circle,#export-svg .node ellipse,#export-svg .node polygon,#export-svg .node path{fill:#111113;stroke:#FFFFFF;stroke-width:2;}#export-svg .divider{stroke:#FFFFFF;stroke-width:1;}#export-svg g.clickable{cursor:pointer;}#export-svg g.classGroup rect{fill:#111113;stroke:#FFFFFF;}#export-svg g.classGroup line{stroke:#FFFFFF;stroke-width:1;}#export-svg .classLabel .box{stroke:none;stroke-width:0;fill:#111113;opacity:0.5;}#export-svg .classLabel .label{fill:#FFFFFF;font-size:10px;}#export-svg .relation{stroke:#cccccc;stroke-width:2;fill:none;}#export-svg .dashed-line{stroke-dasharray:3;}#export-svg .dotted-line{stroke-dasharray:1 2;}#export-svg #compositionStart,#export-svg .composition{fill:#cccccc!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #compositionEnd,#export-svg .composition{fill:#cccccc!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #dependencyStart,#export-svg .dependency{fill:#cccccc!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #dependencyStart,#export-svg .dependency{fill:#cccccc!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #extensionStart,#export-svg .extension{fill:transparent!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #extensionEnd,#export-svg .extension{fill:transparent!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #aggregationStart,#export-svg .aggregation{fill:transparent!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #aggregationEnd,#export-svg .aggregation{fill:transparent!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #lollipopStart,#export-svg .lollipop{fill:#111113!important;stroke:#cccccc!important;stroke-width:1;}#export-svg #lollipopEnd,#export-svg .lollipop{fill:#111113!important;stroke:#cccccc!important;stroke-width:1;}#export-svg .edgeTerminals{font-size:11px;line-height:initial;}#export-svg .classTitleText{text-anchor:middle;font-size:18px;fill:#ccc;}#export-svg .edgeLabel{background-color:hsl(180, 1.5873015873%, 28.3529411765%);text-align:center;}#export-svg .edgeLabel p{background-color:hsl(180, 1.5873015873%, 28.3529411765%);}#export-svg .edgeLabel rect{opacity:0.5;background-color:hsl(180, 1.5873015873%, 28.3529411765%);fill:hsl(180, 1.5873015873%, 28.3529411765%);}#export-svg .cluster rect{fill:#1E1A2E;stroke:#BDBCCC;stroke-width:2px;}#export-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#export-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#export-svg .node .neo-node{stroke:#FFFFFF;}#export-svg [data-look="neo"].node rect,#export-svg [data-look="neo"].cluster rect,#export-svg [data-look="neo"].node polygon{stroke:#FFFFFF;filter:url(#drop-shadow);}#export-svg [data-look="neo"].node path{stroke:#FFFFFF;stroke-width:2;}#export-svg [data-look="neo"].node .outer-path{filter:url(#drop-shadow);}#export-svg [data-look="neo"].node .neo-line path{stroke:#FFFFFF;filter:none;}#export-svg [data-look="neo"].node circle{stroke:#FFFFFF;filter:url(#drLine truncated
|
||||
|
After Width: | Height: | Size: 135 KiB |
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
|
||||
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 32 32" id="icon" xmlns="http://www.w3.org/2000/svg">
|
||||
|
||||
<g id="SVGRepo_bgCarrier" stroke-width="0"/>
|
||||
|
||||
<g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
|
||||
<g id="SVGRepo_iconCarrier"> <defs> <style> .cls-1 { fill: none; } </style> </defs> <path d="M30,15H21.91A5.9925,5.9925,0,0,0,10.09,15H2v2h8.09A5.9925,5.9925,0,0,0,21.91,17H30ZM16,20a4,4,0,1,1,4-4A4.0045,4.0045,0,0,1,16,20Z"/> <rect id="_Transparent_Rectangle_" data-name="<Transparent Rectangle>" class="cls-1" width="32" height="32"/> </g>
|
||||
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 783 B |
@@ -0,0 +1,7 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
␍<!-- Uploaded to: SVG Repo, www.svgrepo.com, Transformed by: SVG Repo Mixer Tools -->
|
||||
<svg fill="#ffffff" width="800px" height="800px" viewBox="0 0 32 32" id="icon" xmlns="http://www.w3.org/2000/svg">
|
||||
␍<g id="SVGRepo_bgCarrier" stroke-width="0"/>
|
||||
␍<g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
␍<g id="SVGRepo_iconCarrier"> <defs> <style> .cls-1 { fill: none; } </style> </defs> <path d="M30,15H21.91A5.9925,5.9925,0,0,0,10.09,15H2v2h8.09A5.9925,5.9925,0,0,0,21.91,17H30ZM16,20a4,4,0,1,1,4-4A4.0045,4.0045,0,0,1,16,20Z"/> <rect id="_Transparent_Rectangle_" data-name="<Transparent Rectangle>" class="cls-1" width="32" height="32"/> </g>
|
||||
␍</svg>
|
||||
|
After Width: | Height: | Size: 783 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 499.368"><path fill="#000" fill-rule="nonzero" d="M256.003 0C114.555 0 0 114.555 0 256.003c0 113.286 73.28 208.961 175.038 242.865 12.796 2.247 17.586-5.433 17.586-12.153 0-6.077-.309-26.225-.309-47.686-64.313 11.844-80.941-15.674-86.058-30.055-2.896-7.37-15.359-30.1-26.269-36.177-8.948-4.808-21.752-16.652-.31-16.961 20.168-.309 34.574 18.564 39.382 26.244 23.038 38.732 59.839 27.828 74.555 21.101 2.227-16.627 8.947-27.828 16.318-34.239-56.968-6.386-116.467-28.471-116.467-126.399 0-27.827 9.907-50.866 26.225-68.787-2.562-6.41-11.51-32.655 2.562-67.853 0 0 21.436-6.72 70.409 26.244 20.483-5.767 42.227-8.638 63.998-8.638 21.751 0 43.52 2.896 63.997 8.638 48.973-33.279 70.39-26.244 70.39-26.244 14.09 35.192 5.117 61.443 2.562 67.853 16.318 17.921 26.244 40.625 26.244 68.787 0 98.237-59.84 119.988-116.801 126.399 9.282 8.014 17.277 23.373 17.277 47.371 0 34.238-.309 61.751-.309 70.389 0 6.721 4.808 14.735 17.586 12.179C438.739 464.964 512 368.955 512 256.003 512 114.555 397.445 0 256.003 0z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 499.368"><path fill="#fff" fill-rule="nonzero" d="M256.003 0C114.555 0 0 114.555 0 256.003c0 113.286 73.28 208.961 175.038 242.865 12.796 2.247 17.586-5.433 17.586-12.153 0-6.077-.309-26.225-.309-47.686-64.313 11.844-80.941-15.674-86.058-30.055-2.896-7.37-15.359-30.1-26.269-36.177-8.948-4.808-21.752-16.652-.31-16.961 20.168-.309 34.574 18.564 39.382 26.244 23.038 38.732 59.839 27.828 74.555 21.101 2.227-16.627 8.947-27.828 16.318-34.239-56.968-6.386-116.467-28.471-116.467-126.399 0-27.827 9.907-50.866 26.225-68.787-2.562-6.41-11.51-32.655 2.562-67.853 0 0 21.436-6.72 70.409 26.244 20.483-5.767 42.227-8.638 63.998-8.638 21.751 0 43.52 2.896 63.997 8.638 48.973-33.279 70.39-26.244 70.39-26.244 14.09 35.192 5.117 61.443 2.562 67.853 16.318 17.921 26.244 40.625 26.244 68.787 0 98.237-59.84 119.988-116.801 126.399 9.282 8.014 17.277 23.373 17.277 47.371 0 34.238-.309 61.751-.309 70.389 0 6.721 4.808 14.735 17.586 12.179C438.739 464.964 512 368.955 512 256.003 512 114.555 397.445 0 256.003 0z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1 @@
|
||||
<svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: currentColor;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M852.9 147.8c4.9 0 9.1 4.2 9.1 9.1v167.8c0 4.9-4.2 9.1-9.1 9.1H171.1c-4.9 0-9.1-4.2-9.1-9.1V156.9c0-4.9 4.2-9.1 9.1-9.1h681.8m0-50H171.1c-32.5 0-59.1 26.6-59.1 59.1v167.8c0 32.5 26.6 59.1 59.1 59.1h681.8c32.5 0 59.1-26.6 59.1-59.1V156.9c0-32.5-26.6-59.1-59.1-59.1z" /><path d="M290.5 214h-60v60h60v-60zM393.5 214h-60v60h60v-60zM806 214H591v60h215v-60zM852.9 417.8c4.9 0 9.1 4.2 9.1 9.1v167.8c0 4.9-4.2 9.1-9.1 9.1H171.1c-4.9 0-9.1-4.2-9.1-9.1V426.9c0-4.9 4.2-9.1 9.1-9.1h681.8m0-50H171.1c-32.5 0-59.1 26.6-59.1 59.1v167.8c0 32.5 26.6 59.1 59.1 59.1h681.8c32.5 0 59.1-26.6 59.1-59.1V426.9c0-32.5-26.6-59.1-59.1-59.1z" /><path d="M290.5 484h-60v60h60v-60zM393.5 484h-60v60h60v-60zM806 484H591v60h215v-60zM852.9 687.8c4.9 0 9.1 4.2 9.1 9.1v167.8c0 4.9-4.2 9.1-9.1 9.1H171.1c-4.9 0-9.1-4.2-9.1-9.1V696.9c0-4.9 4.2-9.1 9.1-9.1h681.8m0-50H171.1c-32.5 0-59.1 26.6-59.1 59.1v167.8c0 32.5 26.6 59.1 59.1 59.1h681.8c32.5 0 59.1-26.6 59.1-59.1V696.9c0-32.5-26.6-59.1-59.1-59.1z" /><path d="M290.5 754h-60v60h60v-60zM393.5 754h-60v60h60v-60zM806 754H591v60h215v-60z" /></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1 @@
|
||||
<svg class="svg-icon" style="width: 1em; height: 1em;vertical-align: middle;fill: #fff;overflow: hidden;" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M852.9 147.8c4.9 0 9.1 4.2 9.1 9.1v167.8c0 4.9-4.2 9.1-9.1 9.1H171.1c-4.9 0-9.1-4.2-9.1-9.1V156.9c0-4.9 4.2-9.1 9.1-9.1h681.8m0-50H171.1c-32.5 0-59.1 26.6-59.1 59.1v167.8c0 32.5 26.6 59.1 59.1 59.1h681.8c32.5 0 59.1-26.6 59.1-59.1V156.9c0-32.5-26.6-59.1-59.1-59.1z" /><path d="M290.5 214h-60v60h60v-60zM393.5 214h-60v60h60v-60zM806 214H591v60h215v-60zM852.9 417.8c4.9 0 9.1 4.2 9.1 9.1v167.8c0 4.9-4.2 9.1-9.1 9.1H171.1c-4.9 0-9.1-4.2-9.1-9.1V426.9c0-4.9 4.2-9.1 9.1-9.1h681.8m0-50H171.1c-32.5 0-59.1 26.6-59.1 59.1v167.8c0 32.5 26.6 59.1 59.1 59.1h681.8c32.5 0 59.1-26.6 59.1-59.1V426.9c0-32.5-26.6-59.1-59.1-59.1z" /><path d="M290.5 484h-60v60h60v-60zM393.5 484h-60v60h60v-60zM806 484H591v60h215v-60zM852.9 687.8c4.9 0 9.1 4.2 9.1 9.1v167.8c0 4.9-4.2 9.1-9.1 9.1H171.1c-4.9 0-9.1-4.2-9.1-9.1V696.9c0-4.9 4.2-9.1 9.1-9.1h681.8m0-50H171.1c-32.5 0-59.1 26.6-59.1 59.1v167.8c0 32.5 26.6 59.1 59.1 59.1h681.8c32.5 0 59.1-26.6 59.1-59.1V696.9c0-32.5-26.6-59.1-59.1-59.1z" /><path d="M290.5 754h-60v60h60v-60zM393.5 754h-60v60h60v-60zM806 754H591v60h215v-60z" /></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 488.282"><path fill="#000" fill-rule="nonzero" d="M268.313 8.2l65.464 153.293 166.054 14.902c7.332.632 12.754 7.085 12.118 14.412a13.262 13.262 0 01-4.495 8.87v.006L381.835 309.374l37.159 162.59c1.646 7.181-2.848 14.336-10.03 15.981a13.308 13.308 0 01-10.273-1.84l-142.686-85.309-143.144 85.579c-6.312 3.777-14.492 1.716-18.274-4.602a13.278 13.278 0 01-1.554-9.809l-.016-.006 37.164-162.589L4.551 199.683c-5.536-4.845-6.103-13.263-1.252-18.804a13.281 13.281 0 019.313-4.527l165.611-14.859L243.73 8.119c2.887-6.777 10.722-9.933 17.493-7.052a13.31 13.31 0 017.09 7.133z"/></svg>
|
||||
|
After Width: | Height: | Size: 780 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 488.282"><path fill="#fff" fill-rule="nonzero" d="M268.313 8.2l65.464 153.293 166.054 14.902c7.332.632 12.754 7.085 12.118 14.412a13.262 13.262 0 01-4.495 8.87v.006L381.835 309.374l37.159 162.59c1.646 7.181-2.848 14.336-10.03 15.981a13.308 13.308 0 01-10.273-1.84l-142.686-85.309-143.144 85.579c-6.312 3.777-14.492 1.716-18.274-4.602a13.278 13.278 0 01-1.554-9.809l-.016-.006 37.164-162.589L4.551 199.683c-5.536-4.845-6.103-13.263-1.252-18.804a13.281 13.281 0 019.313-4.527l165.611-14.859L243.73 8.119c2.887-6.777 10.722-9.933 17.493-7.052a13.31 13.31 0 017.09 7.133z"/></svg>
|
||||
|
After Width: | Height: | Size: 780 B |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 512"><path fill="#000" fill-rule="nonzero" d="M256 0c68 0 132.89 26.95 180.96 75.04C485.05 122.99 512 188.11 512 256c0 68-26.95 132.89-75.04 180.96-23.49 23.56-51.72 42.58-83.15 55.6C323.59 505.08 290.54 512 256 512c-34.55 0-67.6-6.92-97.83-19.44l-.07-.03c-31.25-12.93-59.42-31.93-83.02-55.54l-.07-.07C26.9 388.82 0 324.03 0 256 0 116.78 112.74 0 256 0zm-52.73 332.87a67.668 67.668 0 01-5.6-6.74c-10.84-14.83-20.55-31.61-30.32-47.22-7.06-10.41-10.78-19.71-10.78-27.14 0-7.95 4.22-17.23 12.64-19.34-1.11-15.99-1.49-31.77-.74-48.88.37-4.08 1.12-8.17 2.23-12.27 4.84-17.1 16.73-30.86 31.61-40.15 5.2-3.35 10.78-5.94 17.1-8.18 10.78-4.09 5.57-20.45 17.48-20.82 27.88-.74 73.61 23.06 91.46 42.38 10.41 11.16 17.1 26.03 18.22 45.74l-1.12 44.03c5.2 1.49 8.55 4.84 10.04 10.04 1.49 5.95 0 14.13-5.2 25.67 0 .36-.38.36-.38.74-11.47 18.91-23.39 40.77-36.57 58.33-6.63 8.83-12.07 7.26-6.42 15.74 26.88 36.96 79.9 31.82 112.61 56.44 35.73-40.16 55.15-91.48 55.15-145.24 0-58.34-22.8-113.35-64.07-154.61v-.08C369.44 60.1 314.23 37.32 256 37.32 134.4 37.32 37.32 135.83 37.32 256c0 53.85 19.41 105.03 55.15 145.24 32.72-24.62 85.73-19.48 112.61-56.44 4.68-7.01 3.48-6.33-1.81-11.93z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 512"><path fill="#fff" fill-rule="nonzero" d="M256 0c68 0 132.89 26.95 180.96 75.04C485.05 122.99 512 188.11 512 256c0 68-26.95 132.89-75.04 180.96-23.49 23.56-51.72 42.58-83.15 55.6C323.59 505.08 290.54 512 256 512c-34.55 0-67.6-6.92-97.83-19.44l-.07-.03c-31.25-12.93-59.42-31.93-83.02-55.54l-.07-.07C26.9 388.82 0 324.03 0 256 0 116.78 112.74 0 256 0zm-52.73 332.87a67.668 67.668 0 01-5.6-6.74c-10.84-14.83-20.55-31.61-30.32-47.22-7.06-10.41-10.78-19.71-10.78-27.14 0-7.95 4.22-17.23 12.64-19.34-1.11-15.99-1.49-31.77-.74-48.88.37-4.08 1.12-8.17 2.23-12.27 4.84-17.1 16.73-30.86 31.61-40.15 5.2-3.35 10.78-5.94 17.1-8.18 10.78-4.09 5.57-20.45 17.48-20.82 27.88-.74 73.61 23.06 91.46 42.38 10.41 11.16 17.1 26.03 18.22 45.74l-1.12 44.03c5.2 1.49 8.55 4.84 10.04 10.04 1.49 5.95 0 14.13-5.2 25.67 0 .36-.38.36-.38.74-11.47 18.91-23.39 40.77-36.57 58.33-6.63 8.83-12.07 7.26-6.42 15.74 26.88 36.96 79.9 31.82 112.61 56.44 35.73-40.16 55.15-91.48 55.15-145.24 0-58.34-22.8-113.35-64.07-154.61v-.08C369.44 60.1 314.23 37.32 256 37.32 134.4 37.32 37.32 135.83 37.32 256c0 53.85 19.41 105.03 55.15 145.24 32.72-24.62 85.73-19.48 112.61-56.44 4.68-7.01 3.48-6.33-1.81-11.93z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
@@ -6,7 +6,7 @@ description: 'These REST APIs provide web endpoints to query different informati
|
||||
|
||||
import DocCardList from '@theme/DocCardList'
|
||||
|
||||
# Overview of available REST APIs
|
||||
# Overview of available REST APIs \{#overview-of-available-rest-apis}
|
||||
|
||||
Currently, there are two different Rest APIs you can use.
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ description: 'Floodgate is a hybrid mode plugin that allows Minecraft: Bedrock A
|
||||
---
|
||||
|
||||
# Overview
|
||||
Floodgate is a hybrid mode plugin. It introduces new features:
|
||||
- Ability to join Minecraft: Java Edition servers with Minecraft: Bedrock accounts without needing a paid Minecraft: Java Edition account.
|
||||
Floodgate is a hybrid mode server-plugin. It introduces new features:
|
||||
- Ability for clients to join Minecraft: Java Edition servers with Minecraft: Bedrock accounts without needing a paid Minecraft: Java Edition account.
|
||||
- Ability to [see Bedrock player skins on Java edition](/wiki/floodgate/features#what-is-skin-uploading).
|
||||
- Ability for plugins to [send Bedrock forms](/wiki/geyser/forms/).
|
||||
- Ability to query players through the [Global Api](/wiki/api/api.geysermc.org/global-api/),
|
||||
|
||||
@@ -14,7 +14,7 @@ Additionally, it will display Bedrock edition skins properly.
|
||||
3. Change `auth-type` in Geyser's config to `floodgate`.
|
||||
4. Restart the server.
|
||||
|
||||
### Installing Floodgate on servers behind the proxy {#installing-floodgate-on-servers-behind-the-proxy}
|
||||
### Installing Floodgate on servers behind the proxy \{#installing-floodgate-on-servers-behind-the-proxy}
|
||||
|
||||
This is only needed when you want to use the Floodgate API on your backend server(s) behind a proxy.
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ This is a community-compiled list and does not indicate any endorsement from Gey
|
||||
Full Compatibility (Checks Bedrock Players Accurately)
|
||||
|
||||
- [AntiAura](https://www.spigotmc.org/resources/1368/) (Paid) - Last checked on 24th January 2023
|
||||
- [LightAntiCheat](https://modrinth.com/plugin/lightanticheat) - Last checked on 19rd July 2024
|
||||
- [Boar](https://github.com/oryxel1/Boar/) - Last check on 17th June 2025
|
||||
- [Spartan: Bedrock Edition](https://builtbybit.com/resources/12832/) (Paid) - Last checked on 18th July 2024
|
||||
- [Themis](https://www.spigotmc.org/resources/90766/) - Last checked on 11th July 2024
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ The skin package contains some records representing skin data. If you want to ch
|
||||
|
||||
#### [Pack](https://github.com/GeyserMC/Geyser/tree/master/api/src/main/java/org/geysermc/geyser/api/pack) {#pack}
|
||||
The pack package contains classes and interfaces related to resource packs in Geyser. You can create custom resource packs and send them to individual sessions before they log in using the [SessionLoadResourcePacksEvent](https://github.com/GeyserMC/Geyser/blob/master/api/src/main/java/org/geysermc/geyser/api/event/bedrock/SessionLoadResourcePacksEvent.java).
|
||||
If you wish to send a resource pack to all sessions, you can use the [GeyserLoadResourcePacksEvent](https://github.com/GeyserMC/Geyser/blob/master/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserLoadResourcePacksEvent.java).
|
||||
If you wish to send a resource pack to all sessions, you can use the [GeyserDefineResourcePacksEvent](https://github.com/GeyserMC/Geyser/blob/master/api/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineResourcePacksEvent.java).
|
||||
|
||||
Packs can be created using a [PackCodec](https://github.com/GeyserMC/Geyser/blob/master/api/src/main/java/org/geysermc/geyser/api/pack/PackCodec.java), such as the provided [PathPackCodec](https://github.com/GeyserMC/Geyser/blob/master/api/src/main/java/org/geysermc/geyser/api/pack/PathPackCodec.java).
|
||||
This allows you to load a Bedrock resource pack from a file path:
|
||||
|
||||
@@ -31,6 +31,9 @@ on the proxy server to assign permissions to players. Assigning permissions on t
|
||||
| `geyser version` | `geyser.command.version` | Shows the current Geyser version and checks for updates. |
|
||||
| `geyser tooltips` | `geyser.command.tooltips` | Toggle showing Advanced Tooltips (F3 + H on Java) |
|
||||
| `geyser extensions` | `geyser.command.extensions` | Lists all currently loaded extensions. This command is only registered if any extensions are loaded. |
|
||||
| `geyser ping` | `geyser.command.ping` | Shows the ping between the player and the Geyser instance. |
|
||||
| `geyser options` | `geyser.command.options` | Opens the "pause screen additions" dialogue, if sent by the Java server |
|
||||
| `geyser quickactions` | `geyser.command.quickactions` | Opens the "quick actions" dialogue, if sent by the Java server. |
|
||||
|
||||
## Permissions for Geyser extensions {#extension-permissions}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ If you still can't make it work, join [our Discord](https://discord.gg/geysermc)
|
||||
For Floodgate issues see: [Floodgate: Known Issues/Caveats](/wiki/floodgate/issues/).
|
||||
|
||||
# I can't connect! (Either the server doesn't show up in the friends list or I get "Unable to connect to world")
|
||||
* If you don't use a reverse proxy such as TCPShield make sure that `enable-proxy-protocol` is set to false.
|
||||
* If you don't use a reverse proxy such as TCPShield make sure that `advanced.java.use-haproxy-protocol` is set to false.
|
||||
To fix "Unable to connect to world" with no console errors, see [here](/wiki/geyser/fixing-unable-to-connect-to-world/).
|
||||
|
||||
## If the server doesn't show up in the friends list {#if-the-server-doesnt-show-up-in-the-friends-list}
|
||||
@@ -51,7 +51,7 @@ One way to get around this (if you're using an online host) is to shut down your
|
||||
|
||||
You may need to update your Java version. If so, update at [Adoptium.net](https://adoptium.net/).
|
||||
|
||||
Sometimes this happens in poor-network environments. There is an `mtu` option in the Geyser config; lower this number slowly (in batches of 100), restart each time, and re-test joining.
|
||||
Sometimes this happens in poor-network environments. There is an `advanced.bedrock.mtu` option in the Geyser config; lower this number slowly (in batches of 100), restart each time, and re-test joining.
|
||||
|
||||
This option will most likely not help if you are getting "Unable to Connect to World" with no console logs indicating a connection.
|
||||
|
||||
@@ -76,8 +76,6 @@ If you have your configuration set up like this, put simply, it won't work. If a
|
||||
Connection Refused usually means that a Java server could not be found on that port, or the server denied access to the connection on a network level.
|
||||
The latter can happen with anti-DDOS plugins such as TCPShield, but otherwise ensure that the server you're trying to connect to is spelled correctly in the config, is up and is port forwarded correctly.
|
||||
|
||||
If you're updating from an old build of Geyser, set your remote address to `auto` and try again.
|
||||
|
||||
### Floodgate Misconfiguration {#floodgate-misconfiguration}
|
||||
See [this page](/wiki/floodgate/setup/) for more information.
|
||||
|
||||
@@ -109,12 +107,6 @@ The server is too new or Geyser is outdated. Make sure you're on the latest Geys
|
||||
|
||||
Update the server or ask them to install [ViaVersion](https://viaversion.com/). You can also try [VIAaaS](https://github.com/ViaVersion/VIAaaS) (ViaVersion as a Service).
|
||||
|
||||
# Query: Incorrect Magic!
|
||||
|
||||
See here: https://www.spigotmc.org/threads/query-incorrect-magic-and-high-cpu-usage.159386/#post-2709057
|
||||
|
||||
* If you don't use a reverse proxy such as TCPShield make sure that `enable-proxy-protocol` is set to false.
|
||||
|
||||
# Only for BungeeCord with floodgate
|
||||
|
||||
If you use floodgate ensure that it is installed on all of your Spigot backend servers as following:
|
||||
|
||||
@@ -14,7 +14,6 @@ The following things cannot be fixed without changes to Bedrock or the Java prot
|
||||
|
||||
- Clickable links in chat
|
||||
- Glowing effect
|
||||
- Crafting in the 2x2 menu while in creative mode - with the GeyserOptionalPack, this grid is hidden as it does not exist on Java.
|
||||
- Distinguishing between left and right clicks in inventories
|
||||
- Redstone dot blockstates
|
||||
- Potion colors implemented using NBT
|
||||
@@ -23,7 +22,7 @@ The following things cannot be fixed without changes to Bedrock or the Java prot
|
||||
- Unable to see banner layers past 6
|
||||
- Movement issues around bamboo due to offset differences between Java and Bedrock. Use [Hurricane](/wiki/other/hurricane) to work around it.
|
||||
- Custom anvil recipes or custom smithing table ingredients/patterns ([GeyserMC/Geyser#4706](https://github.com/GeyserMC/Geyser/issues/4706))
|
||||
- Heights lower than -64 or higher than 320 in the overworld with extended height enabled, and heights lower than 0 or higher than 256 in other dimensions ([GeyserMC/Geyser#3804](https://github.com/GeyserMC/Geyser/issues/3804))
|
||||
- Heights lower than -512 or higher than 512 in the overworld (and custom dimensions mapped by Geyser to the overworld), and heights lower than 0 or higher than 256 in other dimensions ([GeyserMC/Geyser#3804](https://github.com/GeyserMC/Geyser/issues/3804))
|
||||
- Dolphin's Grace potion effect visuals (effects should still work correctly)
|
||||
- Invisible item frames - however, there are Bedrock edition resource packs making *all* item frames invisible
|
||||
- Blocks (excluding jack-o-lantern) on entity heads (E.G. armor stands, players)
|
||||
@@ -31,14 +30,13 @@ The following things cannot be fixed without changes to Bedrock or the Java prot
|
||||
- Custom beacon base blocks ([GeyserMC/Geyser#2301](https://github.com/GeyserMC/Geyser/issues/2301)) - these are hardcoded on Bedrock edition.
|
||||
- Climbable blocks changed by datapacks ([GeyserMC/Geyser#4051](https://github.com/GeyserMC/Geyser/issues/4051))
|
||||
- Custom enchantments/sweeping edge ([GeyserMC/Geyser#3121](https://github.com/GeyserMC/Geyser/issues/3121))
|
||||
- "Bordure Indented" pattern shape not appearing on the Bedrock side in the loom ([GeyserMC/Geyser#3183](https://github.com/GeyserMC/Geyser/issues/3183))
|
||||
- Gliding without elytras/custom elytras (https://github.com/GeyserMC/Geyser/issues/3255, https://github.com/GeyserMC/Geyser/issues/3299)
|
||||
- Custom furnace cook times ([GeyserMC/Geyser#4104](https://github.com/GeyserMC/Geyser/issues/4104))
|
||||
- Maximum sign length different on Java/Bedrock edition ([GeyserMC/Geyser#4130](https://github.com/GeyserMC/Geyser/issues/4130))
|
||||
|
||||
## Fixable With GeyserOptionalPack {#fixable-with-geyseroptionalpack}
|
||||
## Fixed with the included GeyserIntegratedPack {#fixed-with-geyserintegratedpack}
|
||||
|
||||
The following changes **are supported** with the [GeyserOptionalPack](/wiki/other/geyseroptionalpack/), which is a Bedrock resource pack you can install for additional functionality for features Bedrock does not natively support:
|
||||
The following changes **are supported** with the included GeyserIntegratedPack, which is a Bedrock resource pack to add features Bedrock doesn't natively support:
|
||||
- Custom armor stand poses
|
||||
- Illusioners
|
||||
- Hit particles and other miscellaneous particles not natively in Bedrock
|
||||
|
||||
@@ -9,7 +9,7 @@ It should be noted that blocks and their associated components are not very stab
|
||||
|
||||
## Enabling custom blocks {#enabling-custom-blocks}
|
||||
|
||||
Before beginning, ensure that `add-non-bedrock-items` is set to `true` in your `config.yml` file.
|
||||
Before beginning, ensure that `gameplay.enable-custom-content` is set to `true` in your `config.yml` file.
|
||||
|
||||
```yml
|
||||
# Whether to add any items and blocks which normally does not exist in Bedrock Edition.
|
||||
@@ -17,7 +17,7 @@ Before beginning, ensure that `add-non-bedrock-items` is set to `true` in your `
|
||||
# If this is disabled, furnace minecart items will be mapped to hopper minecart items.
|
||||
# Geyser's block, item, and skull mappings systems will also be disabled.
|
||||
# This option requires a restart of Geyser in order to change its setting.
|
||||
add-non-bedrock-items: true
|
||||
enable-custom-content: true
|
||||
```
|
||||
|
||||
## JSON mappings {#json-mappings}
|
||||
|
||||
@@ -9,7 +9,7 @@ To setup custom skulls in geyser, you have to choose how you are going to regist
|
||||
|
||||
## Enabling custom skulls {#enabling-custom-skulls}
|
||||
|
||||
To enable custom skulls, you must set `add-non-bedrock-items` to `true` in the `config.yml` file. This will enable the generation of the custom resource pack and the translation of custom skulls to custom blocks. You can then add custom skulls to the `custom-skulls.yml` file.
|
||||
To enable custom skulls, you must set `gameplay.enable-custom-content` to `true` in the `config.yml` file. This will enable the generation of the custom resource pack and the translation of custom skulls to custom blocks. You can then add custom skulls to the `custom-skulls.yml` file.
|
||||
|
||||
```yaml
|
||||
# Whether to add any items and blocks which normally does not exist in Bedrock Edition.
|
||||
@@ -17,7 +17,7 @@ To enable custom skulls, you must set `add-non-bedrock-items` to `true` in the `
|
||||
# If this is disabled, furnace minecart items will be mapped to hopper minecart items.
|
||||
# Geyser's block, item, and skull mappings systems will also be disabled.
|
||||
# This option requires a restart of Geyser in order to change its setting.
|
||||
add-non-bedrock-items: true
|
||||
enable-custom-content: true
|
||||
```
|
||||
|
||||
## custom-skulls.yml {#custom-skullsyml}
|
||||
|
||||
@@ -25,11 +25,7 @@ The underlying Geyser API is steadily expanding, creating more and more opportun
|
||||
|
||||
## Which Geyser Extensions exist? {#which-geyser-extensions-exist}
|
||||
|
||||
At the moment, extensions are still a new system, so there is only a small list of known extensions for Geyser.
|
||||
However, new extensions are always being created!
|
||||
|
||||
There is an [official list](https://github.com/GeyserMC/GeyserExtensionList) of available extensions you can check out.
|
||||
If you have an extension you'd like to see on this list, feel free to open a PR!
|
||||
Check out Modrinth's Geyser extensions section under the "plugins" tab!
|
||||
|
||||
## Installing Extensions {#installing-extensions}
|
||||
|
||||
@@ -39,7 +35,7 @@ Then, restart Geyser (or the server Geyser runs on).
|
||||
## Updating Extensions {#updating-extensions}
|
||||
To update extensions, use the `update` folder within the extensions directory as follows:
|
||||
|
||||
1. Copy the updated versions of your extension jars into the `update` folder inside the extensions directory.
|
||||
1. Copy the updated versions of your extension jars into the `update` folder inside the `extensions` directory.
|
||||
2. On the next server or application restart, any extensions in the `update` folder will automatically replace the corresponding extensions in the main extensions directory. If an extension is new, it will be added.
|
||||
3. If an update fails, it will be logged, and the server/application will proceed with loading extensions as usual. You can review the logs to address any issues.
|
||||
|
||||
@@ -54,9 +50,15 @@ Geyser recognizes extensions when they have a file called `extension.yml` in the
|
||||
id: exampleid
|
||||
name: ExampleExtension
|
||||
main: org.geyser.extension.exampleid.ExampleExtension
|
||||
api: 2.4.1
|
||||
api: 2.9.0
|
||||
version: 1.0.0
|
||||
authors: [ExampleAuthor]
|
||||
dependencies: # Optional
|
||||
exampledependency:
|
||||
# When this dependency should be loaded (BEFORE or AFTER your extension)
|
||||
load: BEFORE # Default: BEFORE
|
||||
# This determines whether or not this dependency is required for this extension to load
|
||||
required: true # Default: true
|
||||
```
|
||||
|
||||
Explanations for the individual fields:
|
||||
@@ -65,6 +67,7 @@ Explanations for the individual fields:
|
||||
- main: The main class of your extension.
|
||||
- api: The Geyser API version your extension targets.
|
||||
- authors: The author(s) of the extension. To add more than one entry, separate entries with a comma.
|
||||
- dependencies: The dependencies of the extension. Each dependency has a load order and required property with defaults of `BEFORE` and `true` respectively.
|
||||
|
||||
## Creating the main class {#creating-the-main-class}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ description: Frequently asked questions about Geyser, including how it works, wh
|
||||
import { Questions, Q, A } from "@site/src/components/Questions";
|
||||
import { Versions } from '@site/src/components/Versions'
|
||||
|
||||
### General Questions {#general-questions}
|
||||
### General Questions \{#general-questions}
|
||||
|
||||
Here you can find answers to frequently asked questions about Geyser - if you have a question that isn't answered here, feel free to ask in our [Discord](https://discord.gg/GeyserMC)!
|
||||
|
||||
@@ -150,7 +150,7 @@ Here you can find answers to frequently asked questions about Geyser - if you ha
|
||||
<Q>
|
||||
Sometimes, when I go really far out, the world starts to experience very odd visual bugs...
|
||||
<A>
|
||||
This is a Bedrock client issue caused by Bedrock being 32-bit and Java being 64-bit. For more information read [here](https://minecraft.wiki/w/Bedrock_Edition_distance_effects).
|
||||
This is a Bedrock client issue caused by Bedrock being 32-bit and Java being 64-bit. For more information read [here](https://minecraft.wiki/w/Bedrock_Edition_distance_effects). This can be worked around using an [unofficial Geyser extension](https://github.com/oryxel1/GeyserFloatingPoints) that spoofs the player position.
|
||||
</A>
|
||||
</Q>
|
||||
<Q>
|
||||
@@ -209,7 +209,7 @@ Here you can find answers to frequently asked questions about Geyser - if you ha
|
||||
|
||||
Note: you need to be running DiscordSRV v1.22.0 or newer. Floodgate 2.0 or GeyserSkinRestorer is still required for skins to show up for Java players and for this to work.
|
||||
|
||||
Alternatively, if you cannot get the above AvatarUrl to work with DiscordSRV, or you'd like to use it with another plugin that does not support texture ids, you can use the [TydiumCraft Skin API.](https://tydiumcraft.net/docs/skinapi)
|
||||
Alternatively, if you cannot get the above AvatarUrl to work with DiscordSRV, or you'd like to use it with another plugin that does not support texture ids, you can use the [Starlight Skin API.](https://docs.lunareclipse.studio/)
|
||||
</A>
|
||||
</Q>
|
||||
<Q>
|
||||
@@ -240,7 +240,7 @@ Here you can find answers to frequently asked questions about Geyser - if you ha
|
||||
</Q>
|
||||
</Questions>
|
||||
|
||||
### Additional Questions {#additional-questions}
|
||||
### Additional Questions \{#additional-questions}
|
||||
|
||||
These additional frequently asked questions are not related to Geyser gameplay.
|
||||
|
||||
@@ -257,4 +257,4 @@ These additional frequently asked questions are not related to Geyser gameplay.
|
||||
No. They have their own bedrock server tech you can find out more info about [here](https://www.cubecraft.net/threads/behind-the-cube-1-feelin-lucky.264600/).
|
||||
</A>
|
||||
</Q>
|
||||
</Questions>
|
||||
</Questions>
|
||||
@@ -32,7 +32,7 @@ Add Geyser's API codebase as a dependency:
|
||||
<dependency>
|
||||
<groupId>org.geysermc.geyser</groupId>
|
||||
<artifactId>api</artifactId>
|
||||
<version>2.4.2-SNAPSHOT</version>
|
||||
<version>2.9.0-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
```
|
||||
@@ -40,7 +40,7 @@ Add Geyser's API codebase as a dependency:
|
||||
**Gradle**
|
||||
```groovy
|
||||
dependencies {
|
||||
compileOnly('org.geysermc.geyser:api:2.4.2-SNAPSHOT')
|
||||
compileOnly('org.geysermc.geyser:api:2.9.0-SNAPSHOT')
|
||||
}
|
||||
```
|
||||
|
||||
@@ -66,7 +66,7 @@ Add Floodgate's API as a dependency:
|
||||
<dependency>
|
||||
<groupId>org.geysermc.floodgate</groupId>
|
||||
<artifactId>api</artifactId>
|
||||
<version>2.2.3-SNAPSHOT</version>
|
||||
<version>2.2.4-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
```
|
||||
@@ -74,7 +74,7 @@ Add Floodgate's API as a dependency:
|
||||
**Gradle**
|
||||
```groovy
|
||||
dependencies {
|
||||
compileOnly('org.geysermc.floodgate:api:2.2.3-SNAPSHOT')
|
||||
compileOnly('org.geysermc.floodgate:api:2.2.4-SNAPSHOT')
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -28,6 +28,10 @@ The Geyser specific properties are prioritized over the plugin properties!
|
||||
- ```server``` means to match the bind address of the TCP server
|
||||
- any other string will be used as-is for the bind address.
|
||||
|
||||
- ```-DgeyserBroadcastPort=19132```
|
||||
- This can be used in cases where the port Geyser runs on does not match the port players use to connect to (e.g. due to port forwarding routings).
|
||||
- When not set or set to 0, it defaults to the same port that Geyser runs on
|
||||
|
||||
## Disabling warnings and advanced configuration {#disabling-warnings-and-advanced-configuration}
|
||||
You may disable some warnings that may be printed to the console by using the following command line arguments. The values shown are the defaults used by Geyser, unless otherwise noted.
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import { Versions } from '@site/src/components/Versions'
|
||||
import { useDocById } from '@docusaurus/plugin-content-docs/client'
|
||||
import DocCardList from '@theme/DocCardList'
|
||||
|
||||
# Overview
|
||||
# Overview \{#overview}
|
||||
|
||||
[//]: # ([](LICENSE))
|
||||
[](https://github.com/GeyserMC/Geyser/actions/workflows/build.yml)
|
||||
@@ -23,7 +23,7 @@ Here are a few selected guides that will help you get started with Geyser!
|
||||
<DocCardList items={[
|
||||
'setup',
|
||||
'supported-versions',
|
||||
'understanding-the-config',
|
||||
'commands',
|
||||
'faq',
|
||||
'common-issues',
|
||||
'extensions'
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
---
|
||||
title: Using Resource Packs with Geyser
|
||||
description: This page explains how to use resource packs with Geyser.
|
||||
---
|
||||
|
||||
# Introduction
|
||||
|
||||
Geyser supports sending Bedrock edition resource packs to connecting Bedrock clients.
|
||||
However, Geyser does not convert resource packs from the Java Edition format into the Bedrock edition format.
|
||||
|
||||
Resource packs offer a range of customization options. Just like on Java, they can be used for a wide variety of things:
|
||||
- Texture Modifications: Resource packs can change the look of blocks, items, and entities, providing a unique visual experience.
|
||||
- Sound Changes: Custom sound effects or music tracks can be added to create a more immersive atmosphere.
|
||||
- UI Enhancements: Resource packs can modify the user interface - a popular example would be providing a dark mode UI option.
|
||||
... and much more!
|
||||
|
||||
# Using resource packs
|
||||
|
||||
### Sending local packs
|
||||
The easiest way to send resource packs to Bedrock players is by putting the Bedrock edition resource pack, either as a `.zip` or `.mcpack` file, into Geyser's `packs` folder.
|
||||
|
||||
Location of the 'packs' folder:
|
||||
|
||||
- Fabric/NeoForge: `/config/Geyser-<platform>/packs/`
|
||||
- Geyser Standalone: `/packs/` at the root directory
|
||||
- Other platforms: `/plugins/Geyser-<platform>/packs/`
|
||||
|
||||
After restarting the server (or reloading Geyser), players that connect will receive all packs that are in that folder.
|
||||
|
||||
|
||||
### Remote pack urls (accessible using the Geyser API)
|
||||
As an alternative to sending local packs, you can also send resource packs by sending Bedrock players a link to download the packs from.
|
||||
This works similarly to Java edition's pack downloading. However, there are a few key limitations:
|
||||
|
||||
- The link must be a direct link to the resource pack download (it will follow redirects, but those must result in a file download)
|
||||
- The Content-Length header must specify the exact file size.
|
||||
- The Content-Type application header must be set to `application/zip`.
|
||||
|
||||
Geyser will download your configured remote resource packs once on boot, and warn you if any of these conditions are not met.
|
||||
It is unfortunately not possible to bypass these, as these are restrictions imposed by the Bedrock client.
|
||||
|
||||
To verify headers manually, curl the website and check the values.
|
||||
For example:
|
||||
`curl -I -L https://download.geysermc.org/v2/projects/geyseroptionalpack/versions/1.0.10/builds/11/downloads/geyseroptionalpack` returns the following:
|
||||
- `-I`: This option tells curl to fetch the HTTP response headers in the output.
|
||||
- `-L`: Ensures that curl follows redirects
|
||||
|
||||
The output for this shows the following:
|
||||
```shell
|
||||
HTTP/1.1 200 OK
|
||||
Date: Wed, 03 Jul 2024 23:03:06 GMT
|
||||
Content-Type: application/zip
|
||||
Content-Length: 95400
|
||||
Connection: keep-alive
|
||||
access-control-allow-methods: GET
|
||||
access-control-allow-origin: *
|
||||
Cache-Control: public, s-maxage=1209600
|
||||
content-disposition: attachment; filename="=?UTF-8?Q?GeyserOptionalPack.mcpack?="; filename*=UTF-8''GeyserOptionalPack.mcpack
|
||||
etag: "0258409cde3a2906e1085490fa5b10b77"
|
||||
last-modified: Wed, 03 Jul 2024 08:42:41 GMT
|
||||
CF-Cache-Status: HIT
|
||||
Age: 21500
|
||||
Accept-Ranges: bytes
|
||||
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=DUpNVi9R96y13%2BlJm%2BNTpDLvSt9bw9CFDUh8Qwhpb9SsqjJbuInBGtSM5hiM2dGbSGkUccP4KvSqqD%2FCKrrcQ9ur5at5G0u8FrfooVTKLP%2B4MwGoUl29DwlxeMVg6tX36RjjICmV97M4FlErCZEe%2F3gM%2FA%3D%3D"}],"group":"cf-nel","max_age":604800}
|
||||
NEL: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
|
||||
Server: cloudflare
|
||||
CF-RAY: 89da81ca69c63735-FRA
|
||||
alt-svc: h3=":443"; ma=86400
|
||||
```
|
||||
This shows that the content-length is indeed set correctly, and that the content type indeed is `application/zip`.
|
||||
Further, Geyser will attempt to read the `ETag` to see if the content has changed. To query that, you can use the following:
|
||||
|
||||
`curl -I -L -v https://download.geysermc.org/v2/projects/geyseroptionalpack/versions/1.0.10/builds/11/downloads/geyseroptionalpack 2>&1 | grep ETag`
|
||||
Alternatively, just using the `-v` header will turn on verbose mode that would also display the etag.
|
||||
|
||||
# Common questions
|
||||
|
||||
- **Does Geyser support behavior packs/add-ons?** <br />
|
||||
No. These would require modifications on the Java server side, which isn't possible when Geyser is used on a proxy.
|
||||
However, many things that are possible with add-ons or behavior packs can be done with Geyser's API - such as [custom items](/wiki/geyser/custom-items)
|
||||
or [custom blocks](/wiki/geyser/custom-blocks).
|
||||
|
||||
- **Does Geyser convert Java edition resource packs?** <br />
|
||||
Not currently. For now, you need to manually create a Bedrock edition resource pack equivalent.
|
||||
|
||||
- **Can I allow players to choose resource packs themselves?** <br />
|
||||
On most Bedrock platforms (except consoles), players are able to download and install resource packs on the client.
|
||||
There is also a Geyser extension, [PickPack](https://github.com/onebeastchris/PickPack) that uses the Geyser API to allow all Bedrock players to choose from a set of resource packs.
|
||||
|
||||
- **On proxy setups: Are per-backend-server resource packs possible?** <br />
|
||||
This unfortunately is not possible natively, as Bedrock edition only allows removing and adding packs when connecting initially to the server.
|
||||
However, with the usage of the transfer packet, it is possible to instruct the Bedrock client to re-connect to the server, and to apply changes then.
|
||||
For per-server-packs, you can use the unofficial [GeyserPackSync](https://github.com/onebeastchris/GeyserPackSync) plugin.
|
||||
|
||||
- **Does Geyser have an API to send resource packs?** <br />
|
||||
Yes! See the [Geyser API docs](/wiki/geyser/api/) for more info on that. There is a `SessionLoadResourcePacksEvent` to determine which
|
||||
packs are sent to each connecting player, or the more general `GeyserDefineResourcePacksEvent` that defines the packs all users receive.
|
||||
|
||||
- **Can I use subpacks or specify the load order of resource packs**? <br />
|
||||
You can! However, this feature requires you to use the Geyser API.
|
||||
|
||||
@@ -23,7 +23,11 @@ The playit.gg Minecraft server plugin does not support UDP tunnels. You will nee
|
||||

|
||||
4. Once "Add tunnel" is clicked, it should create a new tunnel, and you are set! Scroll down until you see this:
|
||||

|
||||
If you have Geyser running on a port that is not 19132, update the port there. The "Local Address" does not need to be changed unless you are not running playit.gg and Geyser on the same device.
|
||||
In Geyser config, set the `advanced.bedrock.broadcast-port` to the playit.gg port from the "Allocation" tab. It is necessary for the motd to appear.
|
||||
|
||||
**Please do not change your Geyser port in `config.yml`** unless you have a reason to (e.g. hosting another Geyser server on the same machine), in which case skip to the paragraph below. The bedrock (Geyser) port in `config.yml` and the playit.gg ports are entirely seperate, playit.gg will forward its port to the default Geyser port and should already work. Changing it can cause errors. If you have changed your config port, change the bedrock port back to the default of 19132 and ensure that `clone-remote-port` is `false`.
|
||||
|
||||
If you have Geyser running on a port that is not 19132, update the "Local Port" with your Geyser port on the page shown above. The "Local Address" does not need to be changed unless you are not running playit.gg and Geyser on the same device.
|
||||
5. Connect to your server - use the IP and Port from the "Allocation" tab. In our example - "180.ip.ply.gg" as the IP, and "17019" as the port. Alternatively, use the Domain it gives you instead of the IP.
|
||||
6. If you join successfully, then you are done! Make sure to leave the playit.gg program running as closing it will close the tunnel. You also may want to ratelimit individual connections - use the "Per Connection Rate Limit" option to do so.
|
||||
(If you failed to join, check out the [troubleshooting](#troubleshooting) section of the page.)
|
||||
@@ -32,6 +36,8 @@ The playit.gg Minecraft server plugin does not support UDP tunnels. You will nee
|
||||
|
||||
### I can't connect to my server! {#i-cant-connect-to-my-server}
|
||||
* *Are there errors in your minecraft server console?*
|
||||
* *Make sure to check [here](/wiki/geyser/fixing-unable-to-connect-to-world/) beforehand.*
|
||||
* *If you changed the port that Geyser would bind to, you'll have to tell playit.gg to use that port instead! See step 5 here.*
|
||||
* *(Alternatively: You can try setting the* `bedrock` `port` *in the Geyser configuration to* `19132`.)
|
||||
* *Unless you manually changed the "Local Port" on the playit.gg website, in Geyser config, ensure that the bedrock port is the default of `19132` and that `clone-remote-port` is `false`.*
|
||||
* *If you changed the `bedrock-port` or set `clone-remote-port` to `true` and have a reason for doing so (e.g. hosting another Geyser server on the same machine), you'll have to tell playit.gg to use that port instead! See the last paragraph in step 4.*
|
||||
* *Check that you're joining with playit.gg's IP and port from the "Allocation" tab.*
|
||||
* *Make sure that you have the program agent open while trying to join.*
|
||||
* *See [here](/wiki/geyser/fixing-unable-to-connect-to-world/) for general troubleshooting steps.*
|
||||
@@ -183,8 +183,9 @@ sudo firewall-cmd --reload
|
||||
|
||||
#### Ubuntu {#ubuntu}
|
||||
|
||||
1. Remove/comment out `-A INPUT -j REJECT --reject-with icmp-host-prohibited` in the `/etc/iptables/rules.v4` file.
|
||||
2. Run the following command to fix `ufw`:
|
||||
```bash
|
||||
sudo iptables-restore < /etc/iptables/rules.v4
|
||||
Run the following commands to allow Minecraft and Geyser through the OS firewall:
|
||||
|
||||
```bash
|
||||
sudo ufw allow 25565/tcp
|
||||
sudo ufw allow 19132/udp
|
||||
```
|
||||
@@ -21,17 +21,17 @@ Geyser only works with **server-side** mods. Mods that require a client-side ins
|
||||
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only uncomment and change this if you want to limit what IPs can connect to your server.
|
||||
#address: 0.0.0.0
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only change this if you want to limit what IPs can connect to your server.
|
||||
address: 0.0.0.0
|
||||
|
||||
# The port that will listen for connections. This is the port that Bedrock players will use to connect to your server.
|
||||
port: 19132
|
||||
# The port that will Geyser will listen on for incoming Bedrock connections.
|
||||
# Since Minecraft: Bedrock Edition uses UDP, this port must allow UDP traffic.
|
||||
port: 19132
|
||||
|
||||
# Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock.
|
||||
# This option makes the Bedrock port the same as the Java port every time you start the server.
|
||||
# This option is for the plugin version only.
|
||||
clone-remote-port: false
|
||||
# Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock.
|
||||
# This option makes the Bedrock port the same as the Java port every time you start the server.
|
||||
clone-remote-port: false
|
||||
```
|
||||
The vital part is the port. This is the port that Bedrock players will use to connect to your server.
|
||||
Follow the instructions in the provider selector - change the port, and if necessary, `clone-remote-port` & `address`.
|
||||
|
||||
@@ -16,20 +16,20 @@ See also [this page](/wiki/geyser/supported-versions/) on supported versions.
|
||||
3. Place the Geyser-Spigot.jar in the `plugins` folder, and restart the server.
|
||||
4. Open your Geyser config, located in `/plugins/Geyser-Spigot/config.yml`, and find the following:
|
||||
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only uncomment and change this if you want to limit what IPs can connect to your server.
|
||||
#address: 0.0.0.0
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only change this if you want to limit what IPs can connect to your server.
|
||||
address: 0.0.0.0
|
||||
|
||||
# The port that will listen for connections. This is the port that Bedrock players will use to connect to your server.
|
||||
port: 19132
|
||||
# The port that will Geyser will listen on for incoming Bedrock connections.
|
||||
# Since Minecraft: Bedrock Edition uses UDP, this port must allow UDP traffic.
|
||||
port: 19132
|
||||
|
||||
# Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock.
|
||||
# This option makes the Bedrock port the same as the Java port every time you start the server.
|
||||
# This option is for the plugin version only.
|
||||
clone-remote-port: false
|
||||
```
|
||||
# Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock.
|
||||
# This option makes the Bedrock port the same as the Java port every time you start the server.
|
||||
clone-remote-port: false
|
||||
```
|
||||
The vital part is the port. This is the port that Bedrock players will use to connect to your server.
|
||||
Follow the instructions in the provider selector - change the port, and if necessary, `clone-remote-port` & `address`.
|
||||
If `clone-remote-port` is enabled, the bedrock port will be overwritten with the Java port!
|
||||
|
||||
@@ -17,23 +17,23 @@ import { Versions } from '@site/src/components/Versions'
|
||||
3. Place the Geyser jar in the `plugins` folder, and restart the server.
|
||||
4. Open your Geyser config, located in `/plugins/Geyser-xyz/config.yml`, and find the following:
|
||||
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only uncomment and change this if you want to limit what IPs can connect to your server.
|
||||
#address: 0.0.0.0
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only change this if you want to limit what IPs can connect to your server.
|
||||
address: 0.0.0.0
|
||||
|
||||
# The port that will listen for connections. This is the port that Bedrock players will use to connect to your server.
|
||||
port: 19132
|
||||
# The port that will Geyser will listen on for incoming Bedrock connections.
|
||||
# Since Minecraft: Bedrock Edition uses UDP, this port must allow UDP traffic.
|
||||
port: 19132
|
||||
|
||||
# Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock.
|
||||
# This option makes the Bedrock port the same as the Java port every time you start the server.
|
||||
# This option is for the plugin version only.
|
||||
clone-remote-port: false
|
||||
```
|
||||
The vital part is the port. This is the port that Bedrock players will use to connect to your server.
|
||||
# Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock.
|
||||
# This option makes the Bedrock port the same as the Java port every time you start the server.
|
||||
clone-remote-port: false
|
||||
```
|
||||
The vital part is the port. This is the port that Bedrock players will use to connect to your server.
|
||||
Follow the instructions in the provider selector - change the port, and if necessary, `clone-remote-port` & `address`.
|
||||
If `clone-remote-port` is enabled, the bedrock port will be overwritten with the Java port!
|
||||
If `clone-remote-port` is enabled, the bedrock port will be overwritten with the Java port!
|
||||
**Important**: Other services/plugins that rely on ports with UDP, such as Voice Chats or Query, cannot share the port with Geyser.
|
||||
|
||||
5. Verify whether connections are possible by running `geyser connectiontest <ip> <port>` in the console.
|
||||
|
||||
@@ -20,13 +20,18 @@ Geyser only works with **server-side** mods. Mods that require a client-side ins
|
||||
3. Open your Geyser config, located in `/config/Geyser-Fabric/config.yml` (or `/config/Geyser-NeoForge/config.yml`), and find the following:
|
||||
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only uncomment and change this if you want to limit what IPs can connect to your server.
|
||||
#address: 0.0.0.0
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only change this if you want to limit what IPs can connect to your server.
|
||||
address: 0.0.0.0
|
||||
|
||||
# The port that will listen for connections. This is the port that Bedrock players will use to connect to your server.
|
||||
port: 19132
|
||||
# The port that will Geyser will listen on for incoming Bedrock connections.
|
||||
# Since Minecraft: Bedrock Edition uses UDP, this port must allow UDP traffic.
|
||||
port: 19132
|
||||
|
||||
# Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock.
|
||||
# This option makes the Bedrock port the same as the Java port every time you start the server.
|
||||
clone-remote-port: false
|
||||
```
|
||||
The vital part is the port. This is the port that Bedrock players will use to connect to your server!
|
||||
If you enable `clone-remote-port`, the port will be overridden and the Java port is used.
|
||||
|
||||
@@ -15,13 +15,18 @@ See also [this page](/wiki/geyser/supported-versions/) on supported versions.
|
||||
3. Open your Geyser config, located in `/plugins/Geyser-Spigot/config.yml`, and find the following:
|
||||
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only uncomment and change this if you want to limit what IPs can connect to your server.
|
||||
#address: 0.0.0.0
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only change this if you want to limit what IPs can connect to your server.
|
||||
address: 0.0.0.0
|
||||
|
||||
# The port that will listen for connections. This is the port that Bedrock players will use to connect to your server.
|
||||
port: 19132
|
||||
# The port that will Geyser will listen on for incoming Bedrock connections.
|
||||
# Since Minecraft: Bedrock Edition uses UDP, this port must allow UDP traffic.
|
||||
port: 19132
|
||||
|
||||
# Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock.
|
||||
# This option makes the Bedrock port the same as the Java port every time you start the server.
|
||||
clone-remote-port: false
|
||||
```
|
||||
The vital part is the port. This is the port that Bedrock players will use to connect to your server!
|
||||
If you enable `clone-remote-port`, the port will be overridden and the Java port is used.
|
||||
|
||||
@@ -16,14 +16,19 @@ import { Versions } from '@site/src/components/Versions'
|
||||
2. Place the Geyser jar in the `plugins` folder, and restart the server.
|
||||
3. Open your Geyser config, located in `/plugins/Geyser-xyz/config.yml`, and find the following:
|
||||
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only uncomment and change this if you want to limit what IPs can connect to your server.
|
||||
#address: 0.0.0.0
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only change this if you want to limit what IPs can connect to your server.
|
||||
address: 0.0.0.0
|
||||
|
||||
# The port that will listen for connections. This is the port that Bedrock players will use to connect to your server.
|
||||
port: 19132
|
||||
# The port that will Geyser will listen on for incoming Bedrock connections.
|
||||
# Since Minecraft: Bedrock Edition uses UDP, this port must allow UDP traffic.
|
||||
port: 19132
|
||||
|
||||
# Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock.
|
||||
# This option makes the Bedrock port the same as the Java port every time you start the server.
|
||||
clone-remote-port: false
|
||||
```
|
||||
The vital part is the port. This is the port that Bedrock players will use to connect to your server!
|
||||
If you enable `clone-remote-port`, the port will be overridden and the Java port is used.
|
||||
|
||||
@@ -12,7 +12,7 @@ You need to have Java 17 or higher installed to run Geyser. To run Geyser Standa
|
||||
Geyser-Standalone is NOT a plugin or mod! It is a standalone Java program that you would run separately to your Java Edition server.
|
||||
:::
|
||||
|
||||
### General Setup & Configuration {#general-setup--configuration}
|
||||
#### General Setup & Configuration \{#general-setup--configuration}
|
||||
|
||||
1. Download Geyser Standalone from [here](/download).
|
||||
2. Create a new folder for Geyser, and drop the jar in there.
|
||||
@@ -26,13 +26,15 @@ Geyser-Standalone is NOT a plugin or mod! It is a standalone Java program that y
|
||||
4. Open your Geyser config (`config.yml`), and find the following:
|
||||
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only uncomment and change this if you want to limit what IPs can connect to your server.
|
||||
#address: 0.0.0.0
|
||||
bedrock:
|
||||
# The IP address that Geyser will bind on to listen for incoming Bedrock connections.
|
||||
# Generally, you should only change this if you want to limit what IPs can connect to your server.
|
||||
address: 0.0.0.0
|
||||
|
||||
# The port that will Geyser will listen on for incoming Bedrock connections.
|
||||
# Since Minecraft: Bedrock Edition uses UDP, this port must allow UDP traffic.
|
||||
port: 19132
|
||||
|
||||
# The port that will listen for connections. This is the port that Bedrock players will use to connect to your server.
|
||||
port: 19132
|
||||
```
|
||||
The `port` is the port Bedrock players will enter to connect to the server.
|
||||
Uncommenting and changing `address` here is only needed if you need to limit connections to a specific IP address.
|
||||
@@ -40,18 +42,18 @@ Geyser-Standalone is NOT a plugin or mod! It is a standalone Java program that y
|
||||
|
||||
To configure which Java Edition server Geyser Standalone will send players to, find the remote section:
|
||||
```yaml
|
||||
remote:
|
||||
# The IP address of the remote (Java Edition) server
|
||||
# If it is "auto", for standalone version the remote address will be set to 127.0.0.1.
|
||||
address: auto
|
||||
java:
|
||||
# The IP address of the Java Edition server.
|
||||
address: 127.0.0.1
|
||||
|
||||
# The port of the remote (Java Edition) server
|
||||
port: 25565
|
||||
|
||||
# Authentication type. Can be offline, online, or floodgate (see https://github.com/GeyserMC/Geyser/wiki/Floodgate).
|
||||
auth-type: online
|
||||
# The port of the Java Edition server.
|
||||
port: 25565
|
||||
|
||||
# What type of authentication Bedrock players will be checked against when logging into the Java server.
|
||||
# Can be "floodgate" (see https://wiki.geysermc.org/floodgate/), "online", or "offline".
|
||||
auth-type: online
|
||||
```
|
||||
Here, change `address` to the Java server's address, or to `auto` if the server is on the same machine as Geyser-Standalone.
|
||||
Here, change `address` to the Java server's address, or leave it as-is if the server is on the same machine as Geyser-Standalone.
|
||||
Then, change `port` to the Java server's port. If you have set up Floodgate on the remote Java server, you can set auth-type to "floodgate" - otherwise,
|
||||
set it to either `online` for an online mode server, or `offline` for an offline mode server. To install and set up Floodgate with a Standalone server, see [here](/wiki/floodgate/setup).
|
||||
|
||||
@@ -77,13 +79,13 @@ set it to either `online` for an online mode server, or `offline` for an offline
|
||||
|
||||
6. Verify whether connections from other networks are possible by running `geyser connectiontest <ip> <port>` in the console.
|
||||
|
||||
### Running Geyser-Standalone on Android {#running-geyser-standalone-on-android}
|
||||
#### Running Geyser-Standalone on Android \{#running-geyser-standalone-on-android}
|
||||
|
||||
:::caution
|
||||
Applications such as Termux on Android are capable of running Geyser, but this largely depends on how powerful your Android device is. Please do so at your own risk.
|
||||
:::
|
||||
|
||||
#### Termux (Android) {#termux-android}
|
||||
##### Termux (Android) \{#termux-android}
|
||||
1. Download and install [Termux](https://termux.com/)
|
||||
2. Run `pkg install openjdk-17`
|
||||
3. Run `wget https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/standalone`
|
||||
|
||||
@@ -9,13 +9,18 @@ description: Learn how to set up Geyser with ViaProxy.
|
||||
4. Open your Geyser config, located in `/plugins/Geyser/config.yml`, and find the following:
|
||||
|
||||
```yaml
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only uncomment and change this if you want to limit what IPs can connect to your server.
|
||||
#address: 0.0.0.0
|
||||
bedrock:
|
||||
# The IP address that will listen for connections.
|
||||
# Generally, you should only change this if you want to limit what IPs can connect to your server.
|
||||
address: 0.0.0.0
|
||||
|
||||
# The port that will listen for connections. This is the port that Bedrock players will use to connect to your server.
|
||||
port: 19132
|
||||
# The port that will Geyser will listen on for incoming Bedrock connections.
|
||||
# Since Minecraft: Bedrock Edition uses UDP, this port must allow UDP traffic.
|
||||
port: 19132
|
||||
|
||||
# Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock.
|
||||
# This option makes the Bedrock port the same as the Java port every time you start the server.
|
||||
clone-remote-port: false
|
||||
```
|
||||
The vital part is the port. This is the port that Bedrock players will use to connect to your server!
|
||||
If you enable `clone-remote-port`, the port will be overridden and the ViaProxy port is used.
|
||||
|
||||
@@ -7,12 +7,6 @@ import { Provider } from "@site/src/components/Provider";
|
||||
|
||||
:::caution
|
||||
|
||||
This list is incomplete. Please open a [PR](https://github.com/GeyserMC/GeyserWebsite/pulls) or contact us on [Discord](https://discord.gg/geysermc) if the information is incorrect, or you want to add a new hosting provider!
|
||||
|
||||
:::
|
||||
|
||||
:::caution
|
||||
|
||||
These providers are not verified by the Geyser team, and the server providers below are reported as working by members of the community.
|
||||
|
||||
:::
|
||||
@@ -29,14 +23,22 @@ The below information is for the plugin versions of Geyser unless otherwise spec
|
||||
|
||||
:::
|
||||
|
||||
## Built-in Geyser {#built-in-geyser}
|
||||
<br/>
|
||||
|
||||
:::info PLEASE NOTE
|
||||
|
||||
This list is incomplete. Please open a [PR](https://github.com/GeyserMC/GeyserWebsite/pulls) or contact us on [Discord](https://discord.gg/geysermc) if the information is incorrect, or you want to add a new hosting provider!
|
||||
|
||||
:::
|
||||
|
||||
## Built-in Geyser \{#built-in-geyser}
|
||||
|
||||
<Provider type="built_in" />
|
||||
|
||||
## Support for Geyser {#support-for-geyser}
|
||||
## Support for Geyser \{#support-for-geyser}
|
||||
|
||||
<Provider type="support" />
|
||||
|
||||
## Does not support Geyser {#does-not-support-geyser}
|
||||
## Does not support Geyser \{#does-not-support-geyser}
|
||||
|
||||
<Provider type="no_support" />
|
||||
@@ -52,7 +52,7 @@ These languages are also supported, and are available in the Bedrock client usin
|
||||
| Hindi | hi_in |
|
||||
|
||||
## How can I help translate Geyser? {#how-can-i-help-translate-geyser}
|
||||
We use [Crowdin](https://crowdin.com/project/geyser) to manage our translations.
|
||||
We use [Crowdin](https://translate.geysermc.org/) to manage our translations.
|
||||
We also can add support for more languages, and please request them in the Discord server if you are willing to translate them.
|
||||
(Those can be enabled clientside via [https://www.curseforge.com/minecraft-bedrock/addons/translations-for-minecraft](https://www.curseforge.com/minecraft-bedrock/addons/translations-for-minecraft))
|
||||
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
---
|
||||
title: Understanding the Config
|
||||
description: This page covers basic information about the Geyser config and the function of each option.
|
||||
---
|
||||
|
||||
This page covers basic information about the Geyser config and what each option does. Though they are explained in the configuration itself, this explains what each option does in more detail.
|
||||
|
||||
## Bedrock Section {#bedrock-section}
|
||||
The options for Geyser on the Bedrock-facing end. Mostly contains options for how Bedrock edition will see the server.
|
||||
|
||||
**`address`**: The address of Geyser on the Bedrock end. In most all scenarios, this should not need to be changed, unless you want to limit what IPs can connect to your server. Leave it at 0.0.0.0 (default), unless otherwise instructed in the setup guide.
|
||||
|
||||
**`port`**: The port Geyser will run on. By default, it is 19132 in Bedrock. If you are using a server hosting provider, you may not have this port available to you - in which case, read the setup guide to proceed.
|
||||
|
||||
**`clone-remote-port`**: Some hosting services change your Java port everytime you start the server and require the same port to be used for Bedrock/UDP connections. This option makes the Bedrock port the same as the Java port every time you start the server. This option does not do anything on the Standalone version of Geyser.
|
||||
|
||||
**`motd1`**: The first line of the MOTD for Geyser.
|
||||
|
||||
**`motd2`**: The second line of the MOTD for Geyser. **Please keep in mind, this option will only work if Geyser is shown in the Friends tab!**
|
||||
|
||||
**`server-name`**: The world name that is shown in the top-right area of the pause menu and the settings menu.
|
||||
|
||||
**`compression-level`**: An number value that represents how much to compress outgoing traffic. Can be any number from -1 to 9; any other value will be replaced with the nearest acceptable value. The higher the number, the more CPU processing that is used but with less bandwidth used. Default is 6.
|
||||
|
||||
**`broadcast-port`**: The port to broadcast to Bedrock clients with the MOTD that they should use to connect to the server. DO NOT uncomment and change this unless Geyser runs on a different internal port than the one that is used to connect.
|
||||
|
||||
**`enable-proxy-protocol`**: Whether to enable PROXY protocol or not for clients. You DO NOT WANT this feature unless you run UDP reverse proxy in front of your Geyser instance. You do NOT need this for BungeeCord (and forks), Velocity, or Waterfall.
|
||||
|
||||
**`proxy-protocol-whitelisted-ips`**: Disabled by default, and only enable this if you use "enable-proxy-protocol". A list of allowed PROXY protocol speaking proxy IP addresses/subnets. Should really only be used when you are not able to use a proper firewall (usually true with shared hosting providers etc.). Keeping this list empty means there is no IP address whitelist. IP addresses, subnets, and links to plain text files containing either are supported.
|
||||
|
||||
## Remote Section {#remote-section}
|
||||
Options for the remote (Java) server.
|
||||
|
||||
**`address`**: The address of the Minecraft: Java Edition server you want to join. By default, this value is `auto`. By keeping it as `auto`, the address, port, and Floodgate support will be automatically configured. In standalone, keeping this as `auto` sets the remote address to 127.0.0.1.
|
||||
|
||||
**`port`**: The port of the Minecraft: Java Edition server you specified in the `address` section. For plugin versions, if address has been set to "auto", the port will also follow the server's listening port.
|
||||
|
||||
**`auth-type`**: The authentication type of the Minecraft: Java Edition server. Valid options are `online`, `offline`, and `floodgate`.
|
||||
|
||||
**Please keep in mind, what you specify in the Geyser `auth-type` option MUST be the same as what the remote server has (with the exception of Geyser being in online mode and remote being in offline mode). You simply cannot join an online mode server without a genuine account. If you want to allow Minecraft: Bedrock Edition accounts to join without a Minecraft: Java Edition account, see the [Floodgate](/wiki/floodgate/) wiki page.**
|
||||
|
||||
**`use-proxy-protocol`**: Whether to enable PROXY/HAProxy protocol or not while connecting to the server. This is useful only when:
|
||||
- Your server supports PROXY protocol (it probably doesn't)
|
||||
- You run Velocity or BungeeCord with its respective option enabled.
|
||||
- IF YOU DON'T KNOW WHAT THIS IS, DON'T TOUCH IT!
|
||||
|
||||
**`forward-hostname`**: Forwards the hostname/IP address that the Bedrock client used to connect over to the Java server. This is designed to be used for forced hosts on proxies.
|
||||
|
||||
## General Options {#general-options}
|
||||
General Geyser options that are mostly specific to Geyser itself.
|
||||
|
||||
**`floodgate-key-file`**: Floodgate uses encryption to ensure use from authorised sources. This should point to the public key generated by Floodgate (BungeeCord, Spigot or Velocity). You can ignore this when not using Floodgate. If you're using a plugin version of Floodgate on the same server, the key will automatically be picked up from Floodgate.The key file path for Floodgate. Requires that you have [Floodgate](/wiki/floodgate/) installed and the `auth-type` set to `floodgate`.
|
||||
|
||||
**`saved-user-logins`**: For online mode authentication type only.
|
||||
Stores a list of Bedrock player usernames that should have their Java Edition account saved after login.
|
||||
This saves an auth chain token that can be reused to authenticate the player later. This does not save emails or passwords,
|
||||
but you should still be cautious when adding to this list and giving others access to this Geyser instance's files.
|
||||
Removing a name from this list will delete its cached login information on the next Geyser startup.
|
||||
The file that tokens will be saved in is in the same folder as this config, named `saved-auth-chains.json`.
|
||||
|
||||
Format:
|
||||
|
||||
```yml
|
||||
saved-user-logins:
|
||||
- jeb_
|
||||
- Dinnerbone
|
||||
```
|
||||
|
||||
**`command-suggestions`**: Bedrock clients freeze or crash when opening up the command prompt for the first time with a large amount of command suggestions. This config option disables command suggestions being sent to prevent any freezing. **Since 1.16.100:** command freezing and crashing has been largely reduced; you may no longer need this option disabled.
|
||||
|
||||
**`passthrough-motd`**: If the MOTD should be relayed from the remote server. Causes the `motd1` and `motd2` options in the bedrock section to no longer have a use.
|
||||
|
||||
**`passthrough-player-count`**: If the current and max player counts should be relayed from the remote server.
|
||||
|
||||
**`legacy-ping-passthrough`**: If enabled, manually pings the server by impersonating a Minecraft client instead of using the server's API. **This option should *only* be enabled if your MOTD or player count is not accurate,** as it can cause errors especially on BungeeCord. This option does nothing on Geyser Standalone.
|
||||
|
||||
**`ping-passthrough-interval`**: How often the fake Minecraft client should attempt to ping the remote server to update information, in seconds (a setting of 1 will ping the server every second; a setting of 3 will ping the server every three seconds). Only relevant for standalone and legacy ping passthrough. Increase the number if you're getting timeout or BrokenPipe exceptions.
|
||||
|
||||
**`forward-player-ping`**: Whether to forward player ping to the server. While enabling this will allow Bedrock players to have more accurate ping, it may also cause players to time out more easily.
|
||||
|
||||
**`max-players`**: The maximum amount of players shown when pinging the server. This does not actually cap how many players can join the Geyser instance at this time. The number will visually increase when pinging if the amount of players is greater, as Bedrock clients will not even attempt to join a full server.
|
||||
|
||||
**`debug-mode`**: If debug messages should be printed in console. Useful if you run into an error and need more context. Yes, this will cause more messages, warnings or even errors in console - some packets aren't translated.
|
||||
|
||||
**`allow-third-party-capes`**: If third party (Optifine, 5zig, LabyMod, etc.) capes should be displayed to the bedrock player.
|
||||
|
||||
**`allow-third-party-ears`**: If third party Deadmau5-style ears should be enabled. Currently only supports MinecraftCapes.
|
||||
|
||||
**`show-cooldown`**: Bedrock Edition currently does not have Java Edition 1.9+ combat mechanics. In order to get around this, Geyser sends a fake cooldown by sending a title message. This cooldown should not show if 1.8 combat mechanics are in use. The options available for this setting are `false` (no cooldown is sent), `title`/`true` (a cooldown indication is shown in the title), or `actionbar` (a cooldown indication is shown in the action bar). All other options default to `false`.
|
||||
|
||||
**`show-coordinates`**: Bedrock Edition has an option to show coordinates in the top-left part of your screen. This setting enables or disables this.
|
||||
|
||||
**`disable-bedrock-scaffolding`**: Whether Bedrock players are blocked from performing their scaffolding-style bridging.
|
||||
|
||||
**`emote-offhand-workaround`**: Since Java Edition 1.9, clients have had the ability to switch the item in their mainhand and offhand with a keybind. Bedrock Edition does not have this ability, so this config option makes up for it, If set, when a Bedrock player performs any emote, it will swap the offhand and mainhand items, just like the Java Edition keybind. There are three options this can be set to:
|
||||
- `disabled` - the default/fallback, which doesn't apply this workaround
|
||||
- `no-emotes` - emotes will NOT be sent to other Bedrock clients and offhand will be swapped. This effectively disables all emotes from being seen.
|
||||
- `emotes-and-offhand` - emotes will be sent to Bedrock clients and offhand will be swapped
|
||||
|
||||
**`default-locale`**: The default locale to send to players if their locale could not be found. This option is disabled by default - to enable it, remove the "#" in front of the option.
|
||||
|
||||
**`cache-images`**: Specify how many days images will be cached to disk to save downloading them from the internet. A value of 0 is disabled. (Default: 0)
|
||||
|
||||
**`allow-custom-skulls`**: Allows custom skulls to be displayed when placed. Keeping them enabled may cause a performance decrease on older/weaker devices.
|
||||
|
||||
**`max-visible-custom-skulls`**: The maximum number of custom skulls to be displayed per player. Increasing this may decrease performance on weaker devices. Setting this to -1 will cause all custom skulls to be displayed regardless of distance or number.
|
||||
|
||||
**`custom-skull-render-distance`**: A number value specifying the radius in blocks around the player in which custom skulls are displayed. 32 by default.
|
||||
|
||||
**`add-non-bedrock-items`**: Whether to add (at this time, only) the furnace minecart as a separate item in the game, which normally does not exist in Bedrock Edition. This should only need to be disabled if using a proxy that does not use the "transfer packet" style of server switching. If this is disabled, furnace minecart items will be mapped to hopper minecart items. This option requires a restart of Geyser in order to change its setting.
|
||||
|
||||
**`above-bedrock-nether-building`**: Bedrock prevents building and displaying blocks above Y127 in the Nether - enabling this config option works around that by changing the Nether dimension ID to the End ID. The main downside to this is that the sky will resemble that of the End sky in the Nether, but ultimately it's the only way for this feature to work.
|
||||
|
||||
**`force-resource-packs`**: Force clients to load all resource packs if there are any. If set to false, it allows the user to disconnect from the server if they don't want to download the resource packs.
|
||||
|
||||
**`xbox-achievements-enabled`**: Allows Xbox achievements to be unlocked.
|
||||
|
||||
**`log-player-ip-addresses`**: Whether player IP addresses will be logged by the server.
|
||||
|
||||
**`notify-on-new-bedrock-update`**: Whether to alert the console and operators that a new Geyser version is available that supports a Bedrock version that this Geyser version does not support. It's recommended to keep this option enabled, as many Bedrock platforms auto-update.
|
||||
|
||||
**`unusable-space-block`**: Which item to use to mark unavailable slots in a Bedrock player inventory. Examples of this are the 2x2 crafting grid while in creative, or custom inventory menus with sizes different from the usual 3x9. A barrier block is the default item (minecraft:barrier is therefore the default value). Takes any Minecraft Bedrock item identifier, e.g. `minecraft:apple`. To set this to a custom item, you will need to add the `geyser_custom:` namespace.
|
||||
|
||||
## Metrics {#metrics}
|
||||
|
||||
bStats is a stat tracker that is entirely anonymous and tracks only basic information about Geyser, such as how many people are online, how many servers are using Geyser, what OS is being used, etc. You can learn more about bStats [here](https://bstats.org/). To see Geyser Stats, see [here](https://bstats.org/plugin/server-implementation/GeyserMC/).
|
||||
|
||||
**`enabled`**: If metrics are enabled
|
||||
|
||||
**`uuid`**: UUID of the server, don't change this!
|
||||
|
||||
## Advanced Options {#advanced-options}
|
||||
|
||||
**`scoreboard-packet-threshold`**: Geyser updates the Scoreboard after every Scoreboard packet, but when Geyser tries to handle a lot of scoreboard packets per second can cause serious lag. This option allows you to specify after how many Scoreboard packets per seconds the Scoreboard updates will be then limited to four updates per second.
|
||||
|
||||
**`enable-proxy-connections`**: Allow connections from ProxyPass and Waterdog. See https://www.spigotmc.org/wiki/firewall-guide/ for assistance - use UDP instead of TCP. **This option does not need to be enabled in instances like BungeeCord or Velocity**.
|
||||
|
||||
**`mtu`**: https://en.wikipedia.org/wiki/Maximum_transmission_unit - The internet supports a maximum MTU of 1492 but could cause issues with packet fragmentation. 1400 is the default.
|
||||
|
||||
**`use-direct-connection`**: Whether to connect directly into the Java server without creating a TCP connection. This should only be disabled if a plugin that interfaces with packets or the network does not work correctly with Geyser. If enabled on plugin versions, the remote address and port sections are ignored. If disabled on plugin versions, expect performance decrease and latency increase.
|
||||
|
||||
Default Geyser Config: [config.yml](https://github.com/GeyserMC/Geyser/blob/master/core/src/main/resources/config.yml)
|
||||
@@ -65,12 +65,10 @@ If you have a PC, you can use [Phantom](https://github.com/jhead/phantom).
|
||||
|
||||
### Using an Android Device {#using-an-android-device}
|
||||
If you have an Android device, you have several options:
|
||||
- ~~[Geyser Android app](https://github.com/GeyserMC/GeyserAndroid)~~ (Discontinued)
|
||||
- [BedrockTogether](https://play.google.com/store/apps/details?id=pl.extollite.bedrocktogetherapp)
|
||||
- [MC Lan Proxy (Trial)](https://play.google.com/store/apps/details?id=com.luzenna.mineproxydroidtrial)
|
||||
- [MC Lan Proxy (Paid)](https://play.google.com/store/apps/details?id=com.luzenna.mineproxydroid)
|
||||
- [MC Server Connector](https://play.google.com/store/apps/details?id=com.smokiem.mcserverconnector)
|
||||
- [Tempest](https://play.google.com/store/apps/details?id=net.ahmed.tempest)
|
||||
|
||||
### Using an iOS device {#using-an-ios-device}
|
||||
If you have an iOS 14+ device, you can use [BedrockTogether](https://apps.apple.com/app/bedrocktogether/id1534593376).
|
||||
@@ -6,7 +6,7 @@ description: 'This page provides an overview over all sections of the GeyserMC w
|
||||
|
||||
import DocCardList from '@theme/DocCardList'
|
||||
|
||||
# Overview
|
||||
# Overview \{#overview}
|
||||
|
||||
The GeyserMC wiki offers guides on different projects. Select the one you are interested in below!
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ Creator: [Camotoy](https://github.com/Camotoy)
|
||||
|
||||
## CreeperNation Skin API {#creepernation-skin-api}
|
||||
|
||||
An SkinAPI that displays Java or Bedrock skins based on the UUID or username.
|
||||
A SkinAPI that displays Java or Bedrock skins based on the UUID or username.
|
||||
|
||||
* [Website](https://docs.creepernation.net)
|
||||
|
||||
@@ -82,7 +82,7 @@ Plugin that blocks Java players from joining your Geyser server, so you can have
|
||||
Creator: [Camotoy](https://github.com/Camotoy)
|
||||
|
||||
## GeyserExtras {#geyserextras}
|
||||
A Spigot plugin which attempts to unify features for Bedrock Edition players, including features like a cleaner looking combat cooldown, combat sounds and other helpful features and workarounds.
|
||||
A Geyser extension / plugin which attempts to unify features for Bedrock Edition players, including features like a cleaner looking combat cooldown, combat sounds and other helpful features and workarounds.
|
||||
|
||||
* [Modrinth](https://modrinth.com/plugin/geyserextras)
|
||||
* [Hangar](https://hangar.papermc.io/GeyserExtras/GeyserExtras)
|
||||
@@ -117,8 +117,8 @@ Small application that waits for a player to connect before launching actual min
|
||||
|
||||
Creator: [Vincss](https://github.com/vincss)
|
||||
|
||||
## TydiumCraft Skin API {#tydiumcraft-skin-api}
|
||||
An API makes it easier for your Bedrock skin to be rendered and outputted!
|
||||
* [Website](https://tydiumcraft.net/api)
|
||||
## Starlight Skin API {#starlight-skin-api}
|
||||
An API that makes it easier for Bedrock Skins to be outputted.
|
||||
* [Website](https://lunareclipse.studio/creations/starlight-skinapi)
|
||||
|
||||
Creators: [Tydium](https://github.com/Tydium)
|
||||
Creators: [Bret06](https://www.bret06.net/)
|
||||
@@ -0,0 +1,66 @@
|
||||
---
|
||||
title: GeyserIntegratedPack
|
||||
description: GeyserIntegratedPack is a Bedrock resource pack that fixes parity issues with Geyser to bring Bedrock Edition in line with Java Edition.
|
||||
---
|
||||
|
||||
:::info
|
||||
Geyser includes the GeyserIntegratedPack (previously called "GeyserOptionalPack"), you do not need to add it manually!
|
||||
See the "Migration" section for further details.
|
||||
:::
|
||||
|
||||
GeyserIntegratedPack is a Bedrock resource pack that adds more features to Geyser to bring Bedrock Edition in line with Java Edition.
|
||||
A resource pack allows various features and bug fixes to be implemented in Bedrock, including:
|
||||
|
||||
- Armor base arms/baseplate visibility
|
||||
- Armor stand poses
|
||||
- Illusioners
|
||||
- Missing particles
|
||||
- Offhand animations
|
||||
- Shulker invisibility parity
|
||||
- Spectral arrow entity texture
|
||||
- Bypass for the scoreboard character limit
|
||||
- Hides UI elements that do not exist on Java edition, such as:
|
||||
- Text input field in the cartography table
|
||||
- 2x2 crafting grid while in creative mode
|
||||
- Tick-delay and rename fields in the command block menu
|
||||
- Structure block options that do not exist on Java
|
||||
- Hides the accessibility background on titles for the weapon cooldown
|
||||
|
||||
A more complete list can be found on the integrated pack's [README](https://github.com/GeyserMC/GeyserIntegratedPack/blob/master/README.md).
|
||||
Implementation details for those interested in how features are added can be found [here](https://github.com/GeyserMC/GeyserIntegratedPack/blob/master/developer_documentation.md).
|
||||
|
||||
## Migration from GeyserOptionalPack {#migration}
|
||||
|
||||
Users previously using the GeyserOptionalPack should remove it to allow Geyser to serve the GeyserIntegratedPack instead.
|
||||
This change has one main benefit: automatic updates, and it is a preparation for advanced features that are tied-in to Geyser (such
|
||||
as a proper Java-style attack indicator!).
|
||||
|
||||
You can also disable the GeyserIntegratedPack in Geyser's config if you do not wish to have these changes applied.
|
||||
|
||||
### What changed?
|
||||
- The resource pack uuid and version have been changed
|
||||
- The GeyserIntegratedPack is being sent with a lower priority in the clients resource pack stack (the order in which
|
||||
resource packs are applied), so manual overrides are possible
|
||||
- With Geyser including the pack, you no longer need to worry about updating the pack yourself!
|
||||
|
||||
### How to migrate?
|
||||
|
||||
If you previously downloaded the GeyserOptionalPack from Geyser's download page, you can simply remove it from Geyser's
|
||||
`packs` folder and let Geyser apply the GeyserIntegratedPack - and you're done!
|
||||
|
||||
However, if you were applying modifications to the resource pack, there are more things to be done:
|
||||
- You should separate out your changes into a separate resource pack. The GeyserIntegratedPack has a low priority in the
|
||||
resource pack stack, so your changes in your resource pack will take priority.
|
||||
- If you modify entity definitions that the GeyserIntegratedPack changes, make sure to merge the definitions manually!
|
||||
|
||||
Users utilizing the UrlPackCodec should also serve the GeyserIntegratedPack instead (available [here](https://github.com/GeyserMC/GeyserIntegratedPack)).
|
||||
Geyser will still perform checks to ensure the "manually" included version isn't outdated, so we recommend to regularly poll
|
||||
Geyser's downloads API for pack updates.
|
||||
|
||||
## Resource pack conflicts {#resource-pack-conflicts}
|
||||
|
||||
If your current server resource pack contains any entity definitions that overlap with Geyser's changes (found [here](https://github.com/GeyserMC/GeyserIntegratedPack/tree/master/src/main/resources/integratedpack/entity)
|
||||
and [here](https://github.com/GeyserMC/GeyserIntegratedPack/tree/master/src/main/resources/patches/entity)),
|
||||
you will need to merge the definitions for these entities for the optional pack and your own pack to work correctly.
|
||||
The Bedrock client will prioritize the entity definition based on pack application order - highest wins! This process is best performed manually
|
||||
due to the complexity of entity definition files, though it can also be [scripted](https://gist.github.com/Kas-tle/89c6adc3e7901fbabd1b9f71d902d0a6).
|
||||
@@ -3,28 +3,10 @@ title: GeyserOptionalPack
|
||||
description: GeyserOptionalPack is a Bedrock resource pack that fixes parity issues with Geyser to bring Bedrock Edition in line with Java Edition.
|
||||
---
|
||||
|
||||
## [Download here](/download?project=other-projects&geyseroptionalpack=expanded) {#download-here}
|
||||
# GeyserOptionalPack
|
||||
|
||||
GeyserOptionalPack is a Bedrock resource pack that adds more features to Geyser to bring Bedrock Edition in line with Java Edition. A resource pack allows various features and bug fixes to be implemented in Bedrock, including:
|
||||
|
||||
- Armor base arms/baseplate visibility
|
||||
- Armor stand poses
|
||||
- Illusioners
|
||||
- Missing particles
|
||||
- Offhand animations
|
||||
- Shulker invisibility parity
|
||||
- Spectral arrow entity texture
|
||||
- Bypass for the scoreboard character limit
|
||||
- Hides UI elements that do not exist on Java edition, such as:
|
||||
- Text input field in the cartography table
|
||||
- 2x2 crafting grid while in creative mode
|
||||
- Tick-delay and rename fields in the command block menu
|
||||
- Structure block options that do not exist on Java
|
||||
|
||||
A more complete list can be found on the optional pack's [README](https://github.com/GeyserMC/GeyserOptionalPack/blob/master/README.md). Implementation details for those interested in how features are added can be found [here](https://github.com/GeyserMC/GeyserOptionalPack/blob/master/developer_documentation.md).
|
||||
|
||||
While recommended, it is not required to install the resource pack on the server - clients can install it themselves. Additionally, if you use a proxy like WaterdogPE, you can install the pack on the server without impacting gameplay on other Bedrock servers.
|
||||
|
||||
## Resource pack conflicts {#resource-pack-conflicts}
|
||||
|
||||
If your current server resource pack contains any [entity definitions](https://github.com/GeyserMC/GeyserOptionalPack/tree/master/entity) that overlap with the optional pack, you will need to merge the definitions for these entities for the optional pack and your own pack to work correctly. Otherwise, the prevailing entity definition will be based on pack application order. This process is best performed manually due to the complexity of entity definition files, though it can also be [scripted](https://gist.github.com/Kas-tle/89c6adc3e7901fbabd1b9f71d902d0a6).
|
||||
:::info
|
||||
This page has been [moved](/wiki/other/geyserintegratedpack/).
|
||||
Geyser now includes the GeyserIntegratedPack, so users no longer need to manually add this resource pack as it is natively integrated
|
||||
into Geyser!
|
||||
:::
|
||||
@@ -13,8 +13,8 @@ Issues with each workaround are listed in the Hurricane config. **Please take yo
|
||||
- Bamboo and dripstone collision (by setting them to no server-side collision)
|
||||
|
||||
Supported Versions:
|
||||
- Spigot/Paper: 1.14.x - 1.21.1
|
||||
- Fabric: 1.21/1.21.1
|
||||
- Spigot/Paper: 1.14 - 1.21.8
|
||||
- Fabric: 1.21 - 1.21.4
|
||||
|
||||
## Download {#download}
|
||||
- Spigot/Paper: [GeyserMC downloads page](/download/?project=other-projects&hurricane=expanded)
|
||||
|
||||
@@ -7,7 +7,7 @@ description: 'Other projects or guides not directly referring to Geyser or Flood
|
||||
import DocCardList from '@theme/DocCardList'
|
||||
import { useDocById } from '@docusaurus/plugin-content-docs/client'
|
||||
|
||||
# Overview of Other projects
|
||||
# Overview of Other projects \{#overview-of-other-projects}
|
||||
|
||||
The "other" category provides you with information about different projects that are not Geyser or Floodgate.
|
||||
This includes community projects, but also other projects by the GeyserMC team, such as Hurricane or Hydraulic.
|
||||
@@ -15,7 +15,7 @@ This includes community projects, but also other projects by the GeyserMC team,
|
||||
<DocCardList items={[
|
||||
'community-geyser-projects',
|
||||
'hurricane',
|
||||
'geyseroptionalpack',
|
||||
'thunder',
|
||||
'thirdpartycosmetics',
|
||||
'hydraulic',
|
||||
'geyserconnect',
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: Rainbow
|
||||
description: A Minecraft mod to generate Geyser item mappings and bedrock resourcepacks for use with Geyser's Custom Item API V2.
|
||||
---
|
||||
|
||||
Rainbow is a Fabric client-sided Minecraft mod to generate Geyser item mappings and bedrock resourcepacks for use with Geyser's custom item API (v2) for use on servers.
|
||||
|
||||
## What is Rainbow? {#what-is-rainbow}
|
||||
|
||||
Rainbow is a generator to create Geyser item mappings and Bedrock Edition resource packs, it uses the Geyser Custom Item API V2 format to allow the use of 1.21.4+ Java Edition packs.
|
||||
|
||||
:::caution
|
||||
|
||||
This project is early in development! Any bugs and issues should be reported in our [Discord](https://discord.gg/geysermc).
|
||||
|
||||
:::
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
To use Rainbow:
|
||||
1. You need setup a 1.21.9/.10 Fabric client for Java Edition and ensure the mod is present on the client.
|
||||
2. Join your server of choice to start converting packs and run `/rainbow create <pack name>` with `<pack name>` being the name of your output pack.
|
||||
3. You can map things in a couple of ways:
|
||||
- Hold each item in your hand one by one and run `/rainbow map` while holding the item.
|
||||
- Fill your inventory with the custom items and run `/rainbow mapinventory` to map your entire inventory.
|
||||
- Run `/rainbow auto inventory` and open a UI with the custom content (For example, a chest or command from a plugin to show custom content.). Rainbow will continue mapping all custom items until you stop the process with `/rainbow auto stop`.
|
||||
4. Run `/rainbow finish` to finish your conversion, Rainbow will then output your pack and mappings file to `<instance folder>/rainbow/<pack name>`, optionally, you can click the `Wrote pack to disk` message in chat to open the folder.
|
||||
5. In this folder, you will find 3 files, `pack.zip` which you put in your `packs` folder of your server, `geyser_mappings.json` which you put in your `custom_mappings` folder of your server and finally `report.txt` which you can send in our [Discord](https://discord.gg/geysermc) if you face issues, otherwise, you can ignore this file.
|
||||
|
||||
## Download {#download}
|
||||
|
||||
You can download Rainbow [here](/download/?project=other-projects&rainbow=expanded).
|
||||
|
||||
## Contributing {#contributing}
|
||||
|
||||
Any contributions are appreciated. Please feel free to reach out to us on [Discord](https://discord.gg/geysermc) if
|
||||
you're interested in helping out with Rainbow.
|
||||
@@ -6,6 +6,9 @@ description: Information about joining and using the Geyser test server.
|
||||
### Details {#details}
|
||||
- IP: `test.geysermc.org` (default ports on both Bedrock and Java)
|
||||
- World size: 20k x 20k
|
||||
- Nether and End disabled
|
||||
- After 90 days, any untouched claimed land will be unclaimed
|
||||
- After 30 days, unclaimed land will be regenerated
|
||||
|
||||
### Infomation {#infomation}
|
||||
Geyser has a test server for those who want to test how Java \<-\> Bedrock crossplay works on their device, and to see the limitations and restrictions. You can join from either Bedrock or Java, and the server has [Floodgate](/wiki/floodgate/) installed so you don’t need a Java account to join from Bedrock.
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Thunder
|
||||
description: 'A java application to convert simple Java Edition resource packs to Bedrock Edition ones.'
|
||||
---
|
||||
|
||||
Thunder is a java application to convert simple Java Edition resource packs to Bedrock Edition ones.
|
||||
|
||||
## What is Thunder? {#what-is-thunder}
|
||||
|
||||
Thunder is a converter for simple Java Edition resource packs which can generate Bedrock Edition packs, it currently converts resource packs which modifies existing vanilla assets.
|
||||
|
||||
:::caution
|
||||
|
||||
Not only is this project in early beta, it does **not** convert custom items! Please look towards [Rainbow](/wiki/other/rainbow) for that.
|
||||
|
||||
:::
|
||||
|
||||
## Usage {#usage}
|
||||
|
||||
1. Ensure you have Java 17 or higher installed, if you do you should be able to open the file like a normal program.
|
||||
2. Select the Java edition resource pack using the button on the left. Once you do, if it was successful you should see the icon of the pack.
|
||||
3. Change the output pack name. This is the name shown to the Bedrock client.
|
||||
4. Hit the convert button to start the conversion process. This step may take a while.
|
||||
5. Once completed, the converter Bedrock edition resource pack will be in the same place as where your Java pack was.
|
||||
You can now either use the pack on the Bedrock client, or place it in the `packs` folder in your Geyser server.
|
||||
|
||||
## Download {#download}
|
||||
|
||||
You can download Thunder [here](/download/?project=other-projects&thunder=expanded).
|
||||
|
||||
## Contributing {#contributing}
|
||||
|
||||
Any contributions are appreciated. Please feel free to reach out to us on [Discord](https://discord.gg/geysermc) if
|
||||
you're interested in helping out with Thunder.
|
||||