#waterfall-dev
1 messages · Page 17 of 1
If you have a custom bungee fork you can probably re-base your changes on waterfall and create a patch from them
Is it possible/okay to run blocking code (up to 100 ms) for a ServerKickEvent?
As I want to make to make it so when someone get kicked, it will grab a fallback server from a remote service, to kick redirect the user towards that server
Should be fine, but I wouldn’t delay it much longer
i'm writing a bungeecord plugin and trying to run it on a waterfall server. it loads properly, but none of the events appear to be working. i'm reasonably certain that i've followed the instructions detailed here accurately
https://www.spigotmc.org/wiki/event-api/
but it still doesn't respond to any events whatsoever.
- I have a class that extends Listener (from the net.md_5.bungee.api.plugin package)
- This class has methods in it that take events as parameters, and have @EventHandler annotations above their method headers
- In the onEnable method in my plugin's main class, i register the listener class mentioned above
i'm really not sure why this isn't working. i've put print statements inside of the onEnable method, and they all show -- so the plugin is getting loaded and its onEnable method is being called. yet none of the events work
please let me know if this is more appropriate for the #waterfall-help channel
I tried to update Waterfall to latest BungeeCord, but i really don't know how to deal with the conflicting natives part 😫
Concerned commits:
https://github.com/SpigotMC/BungeeCord/compare/ad50fc9ad324d934e33dc47255359ef28712ba45...master
Can do in a few
i solved the first one this way, i think it keeps the same behavior
https://p.tomcraft.fr/a7a7f12.png
I'm just going to bump this
You've not really given us anything to go off and I generally don't like tryna drag info out of people or pissing in the wind
I assume importing net.md_5.bungee.connection.InitialHandler, when using the Waterfall API, is disabled for a reason?
it's not API
Understandable, have a great day.
@wide maple, I gave it a try and opened a PR
There is no main thread in BungeeCord
oh god #666
no
this is from the event listener
this is from the main class's onEnable method
the print statements shown in the onEnable method all get printed. none of the event handlers get fired at all, though
i have tried building this with the bungeecord API as well as with the waterfall API. neither works
i understand that you don't like trying to drag information out of people, but if there's any more information that you need, please ask.
use the logger, not system.out
generally looks fine, can't say, try doing a clean build
hasn't changed anything.
logs?
there are no compiling errors and checking the .jar indicates that this class is compiled
just a moment.
upon connecting, the PostLoginEvent handler should have fired and printed something
I have no idea, best I could say is maybe look at it through a decompiler and see if everything is there
i'll give it a shot. thanks
i decompiled it and everything is there. added a constructor in the Events class and put a logger statement there, and it gets printed to the log
so the class is definitely compiling and its constructor gets executed; it's just that waterfall isn't recognizing the event handlers for whatever reason
neither does normal bungeecord, for that matter.
only guess is make sure that you've not somehow thrown bukkit into the classpath and aren't using the wrong annotations or something 🤷♂️
removed bukkit from the classpath and it works. tyvm
is waterfall still built with java 8 or something
iirc it isn't
huh for some reason it just doesn't like it if i do sender instanceof ProxiedPlayer player but is fine with the older ProxiedPlayer player = (ProxiedPlayer) sender 
check your project jdk?
It is
Your project has the lang level set to 8, however, version waterfall is compiled against is irrelevant
odd cuz the project and the module are both set to 16
even forcing the module to be 16 doesn't work 🤔
Check Settings | Build, Execution, Deployment | Compiler | Java Compiler and make sure the project bytecode version and per-module bytecode versions in there are also set to 16.
oh yep for some reason that one module was set to 1.8
Otherwise, check your pom.xml/build.gradle and make sure all of those are set to 16. As well as Settings | Build, Execution, Deployment | Build Tools | Maven | Runner set that JRE to 16 for Maven.
IJ sets that to some default and then when you update Java suddenly it doesn't work
good to know
Should be an option to override that for newly created projects, but I have no idea where that is.
Ah, File | New Project Settings | Settings for New Projects...
Waterfall doesn't seem to wait for all tasks to be complete before shutting down, am I doing something wrong or do I have to wait before using end?
I have a bunch of tasks started using getProxy().getScheduler().runAsync, if I end the server these tasks aren't executed entirely
(it's just a bunch of MySQL queries saving each player logout time, so it's not a big deal but I noticed that most of them are missing when the proxy restarts)
I see, and I should just wait for my executor to complete in onDisable()
yup
#667 merge pls
Who I gotta
for update
How do you merge changes from upstream with a Waterfall fork? I keep running into errors whenever I run ./waterfall p after merging
You need to solve the merge conflicts, the wigglePatches.py in the scripts folder may be helpful, otherwise just perform a manual application of each failing patch and solve the issues while merging.
It’s a bit tricky to set up but SublimeMerge also works well with this, tho I don’t think anyone here is gonna help you setting that up
You should use travertine as a base as then your patches apply over waterfall
hm?
idk, was checking recent bungeecord PRs and found this, made me puzzled
string concat is often fast especially as, iirc, it's boiled down into a string builder where 'efficient' or something iirc
With the Configuration class, if I getStringList for a key that doesnt exist, what happens? does it return an empty list?
or does it just return null
what happens if i ProxyServer.getServerInfo for a server that doesn't exist? does it return null?
yes
is there a way to see a ServerInfo's max players
think there is a ping method which returns the servers ping info
Turd, it takes a callback. Is there a way to do it synchronously?
yes, use a future, basically
Hmm, I've never messed around with concurrency in Java. I hope it functions similarly to how it does in Python since that's where all my experience comes from lol
Could you provide an example?
i mean, really you should use the callback
but, if you need it sync, create a completable future, in the callback, complete that future, (make sure to handle the throwable, completeExceptionally), and then outside of the callback you can join on that future or whatever
CompletableFuture<ServerPing> completableFuture = new CompletableFuture<>();
serverInfo.ping((serverPing, exception) -> {
if (exception != null) {
completableFuture.completeExceptionally(exception);
} else {
completableFuture.complete(serverPing);
}
});
ServerPing serverPing;
try {
serverPing = completableFuture.get();
} catch (Exception ignored) {
continue; // Server didn't respond, or something else went wrong.
}```
I think that should do it
is there a way to see if a player gets kicked from a server they try to connect to
i want to see if a player gets kicked from a server they are trying to connect to
CompletableFuture<Boolean> serverConnectionFuture = new CompletableFuture<>();
player.connect(serverInfo, (status, throwable) -> {
if (throwable != null) {
serverConnectionFuture.completeExceptionally(throwable);
} else {
serverConnectionFuture.complete(status);
}
});
boolean connectionStatus = serverConnectionFuture.get();```
whats wrong with the code here? the callback never returns
the server ping future works but this one doesnt
probs because you deadlock the thread i'd guess
if that happens in the network code, that will break
hence why the callbacks exist
You should probs read up on how to use callbacks and such property
Properly
This feels like you lack the understanding of the concept and are tryna shoot yourself in the foot to avoid it
I mean
I don't touch callback-based concurrent code with a 10 foot pole
So yeah thats about it
futures are nicer anyways 👀
#2 on reasons why i hate node.js
so is there no other way to query a server to see if its connectable
you can wait for it to time out :p
wait for what to time out, the connection? that wont happen because the thread is blocked
i could do it in a spawned process but it does things that arent thread-safe so thats not gonna happen
there's also https://api.mcsrvstat.us/
what if backend servers are configured to reject pings from things that arent the proxy
a ping wont tell me if the server will accept attempted connections
plus configuring an http client is a lot for just pinging a server considering this works fine
@grave fulcrum can you just put the follow-up logic in the callback instead of blocking on a future? your call to .get() at the end will prevent the function from completing, which may stop the connect() call from proceeding as well depending on how it's implemented.
i have another solution now
typically you want like a 'trampoline' model where you do a deferred dispatch to a thread that's built to service a dispatch queue; or else an executor model where you build a threadpool and stick processes into it
For bungeecord, why don't we just use a concurrenthashmap for connectionsByOfflineUUID? Only get/remove/put is called on the map, and using a lock is just tossing performance out the window
Unless I'm missing something...
Or if really need-be, just create a lease system to temporarily lease the object to a task. That way the lock would only be called once for heavy stuff like the TabList rewriter
thread safety
@trail plume All I can foresee is a potential desync problem. But that shouldn't cause any issues?
if something relies on them being consistent, yes
Ah you mean the actual values in UserConnection not being consistent among other threads
I was thinking too shallow
Maybe a single lock for loops then at least
Tbqh, disable entity metadata writing and that stuff is irrelevant
meanwhile has had people wanting him to yeet that thing as it causes nothing but issues
You want to drop the Tablist system?
Theres been people who've wanted that thing disabled because it creates issues for them
There's no winning 
from what I see, it's only relevant for offline mode servers on an otherwise ip forwarded network?
that's offline mode though
But without this system, wouldn't the spigot server then be sending PlayerListItem packets with offline players data?
no
How so? The spigot server is offline mode
ip forwarding
Oh it forwards the UUID too?
Ahhhhh alright that makes sense
spigot picks that up and uses it for the connection
So, that system is basically useless outside of people for some reason not having online mode on their setup
damn
I could literally skip that entire logic if there is a v4 UUID
WHO WANTS TO BREAK SOME SHIT
Another thing I noticed is, we don't need to copy the ByteBuf if EntityRe-write is disabled.
Just a waste
Yea, that's something I've been kinda meaning to look into, just been mostly kinda dead for the past far too long
NO memory leak/issues. Confirmed it today/yesterday
Yea, there won't be as it doesn't modify the packets going through there
biggest issue iirc is that if you slice you can't mutate the data or something
one day I'll get a copy of NIA and read it
What was strange though is on my test server, I also tested with entity-rewrite enabled and a slice. No issues either..
Only 2mb of memory allocated too
Which doesn't make much sense
issue is that it can't resize the buffer
So, if the mutated data ends up being larger than the original it will work
Should plugin messaging channels be full duplex (one channel each for input/output) or is half duplex fine (shared channel)
How can I cancel a player connecting to a server on join? I want the player to connect to a different server.
generally you just replace the reconnect handler thingy
one of the earlier events let you set the server to connect to I think
mind linking?
.jd
Yeah, that. Thanks
I mean, I was getting it, stuff takes time
Sorry then. Does that handler only get fired on reconnect?
Like if a player is connecting to the proxy for the first time, will it still get fired?
yes
Neat
👀
I guess that's still not really a solution to the exploit as it would still be possible regardless. Just a bit harder. Crazy how big these damn packets are getting from Mojang though lol
There should still be the same limit c2s
If a player will be kicked from the network when they are kicked from the server, will ServerKickEvent#getCancelServer be null?
When I change the command name, tab completer works, but now it doesn't work because the same command exists in bukkit. how can i solve this
can i write on it?
@Override
public Iterable<String> onTabComplete(CommandSender sender, String[] args) {
if(args.length == 1){
List<String> playerNames = new ArrayList<>();
for(ProxiedPlayer player: ProxyServer.getInstance().getPlayers()){
if(!sender.getName().equals(player.getName())){
playerNames.add(player.getName());
//don't add if player has ban protection permission
}
}
return playerNames;
}
return null;
}```
All of that is intended behavior on bungeecord and waterfall doesn’t change it
Let's say I asked the question for a bungee plugin. why does the tab completer feature use bukkit tab completer as priority?
because the backend server is usually more important?
the buffer size limit would of just reduced the harm factor by like 4, but, with the packets being larger now potentially, wooo...
but i need bungee command
and tab executor
last I knew, bungee doesn't deal with that stuff all too properly
Issue here iirc is that it won't replace the existing command def but basically just add another one into the list, so, the old command still exists in there, and was the first to define it, the thing will still be executed by the proxy and tab completed (where ask_server) first
there's two events which can easily be used to handle that
For example, I use another bungee plugin and tab complete works fine.
When I use the command in the plugin I made, the result is like this
without knowing your code that's hard to say
one second
@Override
public Iterable<String> onTabComplete(CommandSender sender, String[] args) {
if(args.length == 1){
List<String> playerNames = new ArrayList<>();
for(ProxiedPlayer player: ProxyServer.getInstance().getPlayers()){
if(!sender.getName().equals(player.getName())){
playerNames.add(player.getName());
//don't add if player has ban protection permission
}
}
return playerNames;
}
if (args.length == 2){
List<String> reason = new ArrayList<>();
reason.add("Reason...");
return reason;
}
return null;
}
- not the full code
okey wait
- you are not using the event
3:
.paste
Please paste large logs to a pastebin: https://paste.gg
sorry
onEnable()```java
getProxy().getPluginManager().registerCommand(this, new BanCommand("ban", "ban.use"));
use the event, pretty sure the executor has been borked for years now
In the sources I researched, it was said that it should work when I do it like this.
i am learning new. I thought it would work.
hmm
I didn't quite understand because of the translation. So do I have to cancel the old command first?
so bukkit ban command
just use the event, it's a lot easier ¯_(ツ)_/¯
Not that simple.
The client has the servers command definiation of that command
if you register a command in brig, the old "conflicting" entry is not replaced iirc
I'm confused because you two said different 😄
So, theres now two ban command definitions in there, but, the game doesn't deal with dupes
which is why you replace the completions with your own in the event, yes
what event?
TabCompleteEvent
otherwise you'd need to rip it out of the command def
that's not the command structure
or remove the old with TabCompleteResponseEvent
they don't care about the command structure? they just want the completions gone?
I'm going to try using permission
otherwise ProxyDefineCommandsEvent
Because the ban command in vanilla uses brig components which are done on the client
that event only covers proxy commands
but their code is clearly targetting the command completions, not the command registration
"Called when the proxy intercepts the command packet" no
Can't modify the brig structure without reflection or modifying brig
Yes
There is no removal methods, etc, in brigadier, so we can only prevent adding new defs to it
so you can just remove the backend command...
modifying brig to allow removals was something I was considering but never got around to, was assuming that that was better dealt with on the client anyways
either via the event or proper permission setup
or you just replace the argument suggestions in the tab complete (response) event ¯_(ツ)_/¯
There is is no REQUEST for that
for what?
that's a normal argument tab complete isn't it?
https://paste.gg/p/anonymous/fd39b7c2bd4a410585a9a8280d2f5a14I
added permission check but still same result
why would that not call the event?
That's 100% handled on the client
Mehmet: you need to revoke the permission for the command from the player on the paper side
this works but in the other plugin I was using it was only showing the bungee command even though I was an op.
I guess the permission check didn't work either
how can i do not disable other command
let me try it
that's just how the proxy and brig work together
you'd basically need to hijack the servers command structure and remove the command defined by the server or something
tbh I never had issues with commands that were both on the server and the proxy
if they're just ask_server completions which bukkit itself creates it's basically a non-factor as the proxy can just intercept them
issue there is that the servers built-in ones aren't just an ask_server
ah, I see. so it's basicall just an issue with vanilla/brigadier registered commands
After deoping the paper server, tab complete started working
yes, that's what we have been telling you
There was a situation like EventPriority.highest in bukkit, is there something similar here?
no
I understood this, but I don't understand why other plugins don't have this problem. I wanted to look at the source code of the other plugin but it was too complicated 😄
I need to make the brig structure modifiyable
Or, as I've literally already said, you'd need to find a way to hijack the brig structure
they have the same problem unless they register with brigadier directly
https://www.spigotmc.org/resources/advancedban.8695/
This is the plugin I'm talking about.
I looked at the source code. I think it installed the commands in a similar way to what I did.
finally it returns a list like I did and the commands work fine
Are APIs in BungeeCord thread-safe?
Some yes some no
What about like... pinging a server or sending a plugin message?
Those would be the only APIs I am doing async
They seem to work, just want to make sure I'm not doing anything stupid
yes
good
i now have 4 layers of CompetableFuture#applyAfter
how nice
Is ReconnectListener#getServer fired async?
pretty much every event in the proxy is fired on the network thread, outside of the async ones
If there is an online player with the specified name, if there is no player, I just want to get the name, but it gives a null error in the isconnected part
If the player is active, how can I get only the specified name and not the player object?
ProxiedPlayer is null, add a null check first.
i was trying exactly that 😄
I still have minor errors like this. i couldn't get used to it
Okay
How do I use the modules system? Is it documented?
You don't, basically
It's basically just a bastardised plugin loader for automatically fetched plugins
Ah
I heard "on top of existing source" and thought i may be able to make a change to internals
is the only difference that it updates automatically
That and they load before plugins iirc
hello, i'm looking for something like ProxyDefineCommandsEvent but with spigot/sub server commands (i want do this in bungee plugin), exist something like that in waterfall?
ok, thanks 😄
Is there a way for chunk generation in the overworld to remove all the generators apart from the "bedrock floor generation" that you see at Y0 to Y5
how can i use new line in TextComponent
should be a seperate component
so we can't do it with a single component. understood thanks
I mean, you can
the clients support for that is shaky af
So, like, you probs don't wanna
hmm
so I don't know how many lines of messages the user will write. for that i need to create TextComponent according to that number. How do I send all the components at once? I guess the disconnect method only allows one.
you put it in a component
i find a method for this. ComponentBuilder
ComponentBuilder("asd").append("asd").append("asd").create();```
Hello, has the Waterfall got an update for mysql connector like PaperSpigot?
No, I honestly forgot that the mysql connector was in there
I just try to test a bungee plugin, now i set depend (also used softdepend) before in the plugin/bungee.yml. Still my plugin will be loaded before the plugin it depends on. Is there smth different to spigot/paper plugins I forgot to consider?
oo there is an s, thanks
https://www.spigotmc.org/wiki/bukkit-bungee-plugin-messaging-channel/ What do I have to do diffrent to make Plugin Messagaging Channel with Waterfall
possible?
nothing
But I guess if i register the outging plugin channel i have to use "Waterfall" instead of BungeeCord?
no
How can i set the motd?
on which event is it?
i tried on the ServerPIng event
with #setDescription
that should do it
I receive a IllegalArgumentException with this line: getServer().getMessenger().registerOutgoingPluginChannel(this,"Bungeecord");
Its says that a seperator is requiered?
.g spigot wiki plugin message channel
looks like that's not updated yet
might be BungeeCord:main or something like that
okay I will try
@EventHandler public void onServerPing(ServerPing event) { event.setDescriptionComponent(new TextComponent("")); }
is this okay?
didnt work 😭 and when I tried I received the message that a channel has to be completely lower case
I mean, just follow the code on that page
The bungee channel has been horrifically special cased in the server, so, technically doesn't matter
bungeecord:main is the "correct" channel but the bastardisation for that in the server technically makes that a non issue
The exception is gone but
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);
try{
dataOutputStream.writeUTF("Connect");
dataOutputStream.writeUTF("PvP");
} catch (IOException e){
e.printStackTrace();
}
player.sendPluginMessage(MainWorldMain.instance,"bungeecord:main", byteArrayOutputStream.toByteArray());
Player doesent change the server
god knows
might need to use the literal channel they state to use on the wiki page
I forget all the stupid caveats of the messaging stuff
I mean, if you wanna maintain your own set of patches over bungee, you'd wanna fork waterfall, or, for maintaining patches over waterfall, use travertine
if using our tooling, see our contrib guides
otherwise, search up on how to use git format-patches
8
yes
if you're using waterfalls tooling just use ./waterfall rb, your patches will be in the patches folder
no, you need to commit the changes and then rebuild
yea...
github is irrelevant to git
Well, yes, but, you just apply the patch, fix any merge conflicts, and then rebuild
if you are planning to maintain changes over waterfall, you'd probs be best off forking travertine instead, as that's specifically setup for maintaining patches over waterfall
I want to have a gettype function inside this function. can i do this?
public void isBanned(){
//some code...
if (result.next()) {
if (result.getString("type").equals("ban") ||
result.getString("type").equals("ipban") ||
result.getString("type").equals("tempban")) {
return true;
//public String getType(){
//}
}
return false;
}
}```
What are you trying to do here? This doesnt look possible in java
What are you trying to do here? This doesnt look possible in java
😄
eg: getProxy().getPluginManager().registerListener()
like this
.... that still doesnt explain anything
just assign it to a variable instead of getting it from result each time
but yeah, as Five said, what you said just doesn't make any sense
Hello, i coded an /hub command but when a player executes the command and the server isnt on i want to send him a message but the "Could not connect" message comes too. How can i prevent that?
player.connect(ProxyServer.getInstance().getServerInfo("Citybuild"), new Callback<Boolean>() {
@Override
public void done(Boolean aBoolean, Throwable throwable) {
if(!aBoolean)
player.sendMessage(new TextComponent("§cDer Citybuild Server ist derzeit nicht Online!"));
return;
}
});
not possible in the API
I have a branch with a change for that iirc but not pulled it
make string variable
result.getString("type").contains("ban")
If I want the child notes of an bungee config what are not a list of strings, like a map, there is no method for that already part of the api, am I right? So best thing would be to use either get(path) for a generic object or getSection(path)getKeys() … and build what ever you would expect?
"child notes"
if you mean the keys in a section of the config, yes
the latter is specifically catered towards dealing with the sections and is generally preferred if you know it's gonna be a section
not sure what the correct term might be, like
stuff1: "blabla"
child2: "bloblo"```
I okay, than I go with the section
yea, keys
thanks
ConfigSection is basically a "glorified map" more or less
A okay, thx. Will do it like that than
Hey just wanted to know what is the status of the forge packet spoof for waterfall that Five is working on. (Or smth like that can't remember to be honest)
@CCCFan as stated in the error message: relocate it into your own package
How do I remove unused Configuration keys?
For instance, I have a yml file that has bans in it, when someone gets unbanned, I want to remove all the information associated with their ban (in the yml file). Is there a way to do this that isn't too complex?
Sorry if that made no sense.
set the value to null
Will that actually remove the key? Or will it just be like
section:
foo:
bar:
section2:
foo: ban
bar: info
(Specifically the section part.)
iirc it shouldn't save it when it's saved to the disk
?
basically, it should be gone
Ok.
null values are not saved to the disk
I will have to try this later.
if you want a more concrete soluton, gtf-away from the yaml crap in bungee
Someone know why its always false?
public boolean serverOnline(String name) {
AtomicBoolean bool = new AtomicBoolean(false);
ProxyServer.getInstance().getServerInfo(name).ping((serverPing, throwable) -> {
bool.set(true);
});
return bool.get();
}
because youre not waiting for exit- you already set it to false and didnt wait for anything else
the atomic boolean already has a value
what youre trying to do would result in an infinite deadlock
you'll need to block to make this method possible
or dont and just return a CompletableFuture<Boolean>
Then you can choose later in the program whether you want to block with .join(), or wait for completion asynchronously
also, how do you dynamically add and remove servers from waterfall
because getServers() is deprecated
Its one of the great deprecation warnings thats not pending removal of the method
just warns about concurrent access and it being the live internal map
so its fine to use that?
Yah
what is fastutil?
https://fastutil.di.unimi.it/ sums it up
do i have to include it as a dependency?
In your waterfall plugin?
It comes with fastutil already
> Could not resolve all files for configuration ':compileClasspath'.
> Could not resolve it.unimi.dsi:fastutil:{strictly 8.2.1}.
Required by:
project : > com.sk89q.worldedit:worldedit-core:7.2.5
project : > com.sk89q.worldedit:worldedit-bukkit:7.2.5
> Cannot find a version of 'it.unimi.dsi:fastutil' that satisfies the version constraints:
Dependency path ':BR:unspecified' --> 'io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT' (apiElements) --> 'it.unimi.dsi:fastutil:8.2.2'
Constraint path ':BR:unspecified' --> 'com.sk89q.worldedit:worldedit-bukkit:7.2.5' (apiElements) --> 'it.unimi.dsi:fastutil:{strictly 8.2.1}' because of the following reason: Mojang provides FastUtil
Constraint path ':BR:unspecified' --> 'com.sk89q.worldedit:worldedit-core:7.2.5' (apiElements) --> 'it.unimi.dsi:fastutil:{strictly 8.2.1}' because of the following reason: Mojang provides FastUtil
> Could not resolve it.unimi.dsi:fastutil:8.2.2.
Required by:
project : > io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT:20210726.164944-52
> Cannot find a version of 'it.unimi.dsi:fastutil' that satisfies the version constraints:
Dependency path ':BR:unspecified' --> 'io.papermc.paper:paper-api:1.17.1-R0.1-SNAPSHOT' (apiElements) --> 'it.unimi.dsi:fastutil:8.2.2'
Constraint path ':BR:unspecified' --> 'com.sk89q.worldedit:worldedit-bukkit:7.2.5' (apiElements) --> 'it.unimi.dsi:fastutil:{strictly 8.2.1}' because of the following reason: Mojang provides FastUtil
Constraint path ':BR:unspecified' --> 'com.sk89q.worldedit:worldedit-core:7.2.5' (apiElements) --> 'it.unimi.dsi:fastutil:{strictly 8.2.1}' because of the following reason: Mojang provides FastUtil
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.```
It comes with fastutil already
so why is it saying i need to include it as a dependency
or am i misunderstanding this
Waterfall doesn't provide fastutil
this is a paper plugin (i just realised im in the wrong channel)
But, you have a dependency which demands an older version of fastutil than paper provides.
oh ok
for some reason it fails to resolve it. Even though i copied it from maven central and have included the repo in my config
in fact its failing to resolve even the latest version
if you find the dependency on https://mvnrepository.com/ then it should be on maven central right?
anyone have any idea why it cant find these packages?
I don't really follow why you need fastutil in the paper plugin side
getServers() returns the list you want in Waterfall
Then stonks
If that is paper related, actually use the paper dev channels
Hello, how to create a waterfall fork? I'm newbie here
see travertine as an example
Neither do i (the error literally said that this library is provided by mojang). Including NMS seemed to fix it :/
why tf is a waterfall plugin depending on paper/worldedit
also outdated WE is the issue there, that version doesn't support 1.17 so libs are pinned to older versions
no this is the wrong channel. I just continued the conversation here because i already pasted the error
apologies
its a paper plugin
you know you can delete messages, right?
doesn't matter now
what is the best way to store mini msg in config files?
How unreasonable would it be to PR setting ip-forwarding to true given it's... the defacto setup
Do it
is there an event for when someone disconnects due to a server restart/shutdown? I read that the ServerKickEvent did that, but it's not seeming to work as intended
depends, ServerKickEvent should catch most cases
what would the cause be for a restart/shutdown? I presume Server?
pretty sure it can be any cause
it's kinda random which one gets triggered, "server" is for when the server actually kicks the player
ah okay thanks a lot
it's just that in a case of a shutdown it might not kick the player (at least not in a way noticable for the proxy) which might trigger a connection loss (or maybe even an exception)
best to just listen for all of them and check the kick message tbh
okii will do ^^
How do I get a player's IP address? Player#getAddress is deprecated
This is waterfall dev
Waterfall has no Player class, do you mean ProxiedPlayer? But that has no getAddress()
I meant ProxiedPlayer, and it apparently had a getAddress which is probably gone now
getSocketAddress returns a SocketAddress, which has no methods to get just the IP
That is their IP?
Or cast it to InetSocketAddress if you meant the IP without the port
But the docs outline that
Right because its to be expected that this may be a path (direct IO/native) instead of a InetSocket addr. Do check before casting
How would I go about fixing this console error? It keeps popping up and is very annoying. https://hastebin.com/emomaworey.properties
work out what's borking tab complete
I'm sorry, but is there actually a way to force a player to execute a BungeeCord command from a Bungee plugin
I chat ProxiedPlayer#chat as well as #performCommand, but it attempts to execute it on spigot side, and fails with a message that no such command exist
Pluginmanager#dispatchCommand
Im so stupid, thank you : )
Hello, i coded my own /server command but when i use it i get a time out for any reason.
public Future<Boolean> serverOnline(String name) {
CompletableFuture<Boolean> completableFuture = new CompletableFuture<>();
ProxyServer.getInstance().getServerInfo(name).ping((serverPing, throwable) -> {
if(throwable != null) {
completableFuture.complete(false);
} else {
completableFuture.complete(true);
}
});
return completableFuture;
}
But only when you use it often
like 3 or 4 times
I mean, that gives us 0 context
99% chance that that block right there is 100% unrelated
its related because when i try it the other way it works fine:
public boolean serverOnline(String name, int port) {
bool = false;
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress("**", port), 10);
bool = true;
socket.close();
} catch (IOException e) {
bool = false;
}
return bool;
}
so the problem is the "ping()" method
are there any examples for the ping() method?
I mean, the ping method returns a callback and runs on a different thread
what you're doing there looks fine assuming that you don't join on the future you return
I just dont understand how to use it, any example would help me
It's a callback
just don't block the current thread waiting for a response from it
We don't exactly have examples for every trivial thing and "don't block the thread" is really not great
I for one got no idea how your socket wasn't causing issues given that you're blocking the current thread there too
I guess opening a socket connection is often more cut and dry than waiting for an actual response
public boolean serverOnline(String name, int port) {
CompletableFuture<Boolean> completableFuture = new CompletableFuture<>();
ProxyServer.getInstance().getServerInfo(name).ping((serverPing, throwable) -> {
if(throwable != null) {
completableFuture.complete(false);
} else {
completableFuture.complete(true);
}
});
return completableFuture.join();
}
I tried it this way, still the same
-.-
my friend told me to do that
and I told you not to.
without examples im kinda lost
Don't block the fucking thread
it's not that hard
if you return a future, do NOT use join
where do i block the thread?
By calling join.
and now?
exact same issue
you CANNOT get a result and NOT block for the result
This is not rocket science
if you wanna return a future, sure, but youre gonna need to use the methods to schedule the work to do once the future is completed
sry i never worked with futures
This is a basic programming concept
You can't go do work and return the value of the work before the work is done
I'd suggest getting familiar with actually working with callbacks and futures first as there is many considerations there
so i need to create a schedule and wait till the schedule is done or what?
Please go read up on how to use futures and callbacks
do you have some good websites for that?
no
"is making the thread stop and do nothing but wait blocking the thread"
ok
That example is blocking the completables thread, not the thread you created the future on, entirely different scope
i give up, i wont use this method
where is the water fall.

I already figured out a 1/2 working way of doing this. I can send you some code for you to look at when I get home.
Okay thank you 😄
Does it tire the server to check the data in a map every second and act on them?
wrong channel?
I mean, general gist is that "doing stuff takes time", interacting with a Map takes time, but, probs not enough to care, but, depends on the size of the map, how expensive your checks are, etc; nobody can make an accurate statement on what you've asked
I'm assuming a server with an average of 200 active players.
literally gives 0 info
as I said, it depends on the size of the map and what you're doing with the data
I will take the timestamps of the objects in the map and check
Map<Punishment>
if(punishment.isExpired)
like this
why?
just check it on login or use a task to remove it once expired (or just use an expiring cache directly although that might not cleanup instantly on expiration depending on the type you use)
I have to do a few actions on them when they expire.
like delete from database or send message
There are already collections which aid with that, considering how little you're probs gonna be inserting/removing, a sorted collection or something would also probs be ideal
I mean, doing stuff like that off the main thread if you know what you're doing would be trivial
what is the mean "prob"
probably
Punishment(String playerName, String uuid, String ip, PunishType punishType, String reason, String operator, long start, long end) This is the object I'm talking about. I want to check whether they expire one by one in a map with 100 of these objects in every second.
I don't know, but I think it's overworking the server.
I mean, doing that on the main thread would be moronic
and we've already highlighted ways to do it more efficently
really doesn't make sense to check them if you can just check that on player join/server switch but if you really need to check them then just schedule a task for when the next entry expires
heck, doing that stuff in a database would be cheaper
eg: i need send message to player
So do I need to use a repeating task for this?
i.e. i know how to add and remove data and check
so, do a select for expired entries
for each one, do whatever, e.g. message people
then, do another transaction which deletes the entries you selected
make sure you have a sane primary key
playername and uuid
yes i know
that's not a sane primary key if you have multiple entries
you generally want some auto incremental number of something
Does this apply to offline servers?
offline players can use any name they want
offline uuids are based on the username
(unless on bungee ^)
an auto incrementing id
i mean offline bungee server
is it possibile to change a player's displayed name in the tablist?
Possible yes, but may have side-effects on versions older than 1.13
I’m not sure if you can do it with API though
Hi
when i try to connect to the waterfall server i'm getting "disconnected" and this errror:
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
at net.md_5.bungee.UserConnection.addGroups(UserConnection.java:565) ~[Waterfall.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at net.md_5.bungee.UserConnection.init(UserConnection.java:172) ~[Waterfall.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at net.md_5.bungee.connection.InitialHandler$6$1.run(InitialHandler.java:543) ~[Waterfall.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) ~[Waterfall.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) ~[Waterfall.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:384) ~[Waterfall.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[Waterfall.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[Waterfall.jar:git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_252]```
sounds more like a help thing, bad config?
If I change the target server at ServerConnectEvent does it override the default server?
Hi everyone,
I’m currently using Bungeecord, and I would like to replace it with Waterfall for new functionnalities and stuff. But I have my own fork of Bungee with custom functionnalities.
So I would like my fork of bungeecord to become a fork of Waterfall, but I’m not familiar with forks that uses pathes in their repositories, instead of using commit and branches, as I do currently with my fork of Bungee.
I there any tutorial or else that can explain how to deal with patch based fork ? I couldn’t find anything online, except some other examples of patch based projects. I tried reading the contributing file of PaperMC/Waterfall repository but it looks like the explanations are for contributing to the current project, not creating a new fork with a new set of patches
can use travertine as a base
it's not longer maintained but it is a patch-based waterfall fork
Gonna check that, thanks 🙂
Hello, it won't let me enter my network, I don't know why, it seems that it is starting up and it stays there
Head to #waterfall-help
there is another method, instanceof to INet address or whatever it was cast
InetSocketAddress or something iirc
(read the deprecation notes, pretty sure it's covered in there what method to use)
Is there a way to make a paper plugin that tells a waterfall plugin that a player is apart of a LuckPerms team? I'm pretty sure it is able via some sort of plugin messaging right?
what? why?
Why do I want to do this?
Yes
I see no valid reason to do so
I mean, you can use plugin messaging channels to send whatever data you want to the proxy and back and forth
But, at least specifically for LP, you can just query that data from LP?
I am adding a chatting system to my plugin, where when you talk in chat it sends it to the server. I did this because it is a lot easier to mess with the message on the proxy end rather than making a plugin specifically for each server.
The problem lies when I am wanting to send a chat message to a server that that player has a different rank on than the rest of the network.
Is there a simple way to set up LP to do a sort of database that only allows certain "ranks" to be updated. i.e. if a player has an Iron rank and I only want them to have that rank on one server, but not on others.
I can ask in the LP discord if you don't know. And I'm not asking for an explanation on how to do so (although, one would be helpful).
Well, yes, you can construct whatever query you want against LPs context system
oh
beyond that, if you wanted to send messages to the proxy, you can just do that using the plugin messaging system
ok
It would be something like this, right? https://pastebin.com/fm2cZnEW
btw. I figured it out.
How to capture and modify set slot or window items packet?
from waterfall? you'd either need to hook into the networking stuff manually and register your own packets or use a library like protocolize (but, never used it)
How to hook to it?
if you have to ask, you probs just wanna use a library
If a player had a permission on the bungeecord and this permission is removed he can still tab complete it until the reconnect. How can I remove it? Permissions are checked at the PermissionCheckEvent the same is when a player gets a permission he cannot tab complete but use it.
the server would need to resend the commands to the client
how can i do it?
You'd need to create a server plugin which can resend the commands
is that in paper PlayerCommandSendEvent? player.updateCommands()?
update
thank you btw couldn't write because I had to go to work. love u
What's the reason why servers that are connected via bungeecord/waterfall need to be set to offline mode?
because unless you have a way to bypass mojangs authentication mechanism, you can't just jump between servers
Hi, I have a little issue with the ProxiedPlayer.getLocale() Methode return null.
@Override
public Locale getLocale(CommandSender sender) {
if (sender instanceof ProxiedPlayer) {
var p = (ProxiedPlayer)sender;
var locale = p.getLocale();
if (locale == null) {
locale = Locale.getDefault();
try {
throw new NullPointerException("Player hat no Language: " + sender.getName());
} catch (NullPointerException e) {
getLogger().log(Level.SEVERE, e.getMessage(), e);
}
}
return locale;
} else {
return Locale.getDefault();
}
}
StackTrace indicates that the issue are in the PostLoginEvent.. (9 out of 10 joins have a NullPointerException)
So I rewrote that logic: Player joins a Server, Server (Paper) PlayerJoinEvent send a PluginMessage to Proxy... 1 out of 20 Joins NullPointerException
Any Idea at what time it is save to "ask" the ProxiedPlayer.getLocale() Methode?
there is no specific time where it's safe
it's just sent to the server "at some point" during the initial join
That is not what I want to read 😛
Before I test it, is SettingsChangedEvent fired in that initial join time?
should be
Thanks for the fast response.. (And back to coding)
And another issue with the Player joins a Server, Server (Paper) PlayerJoinEvent send a PluginMessage to Proxy
1 out of 50 times the PluginMessage don't reach the Proxy any Idea why?
Code is not that complex..
@EventHandler
public void onJoin(PlayerJoinEvent event) {
var player = event.getPlayer();
var out = ByteStreams.newDataOutput();
out.writeUTF(PluginSubChannel); // Sub-Channel
out.writeUTF(player.getUniqueId().toString());
player.sendPluginMessage(plugin, PluginChannelName, out.toByteArray());
}
PJE has always been kinda weird as it's around where the state of the protocol is changed
Is there a tool for forking waterfall like paperweight? 🙂
basically, use the travertine repo as it has all the scripts and such
The description says with 1.7 support. Does 1.17.1 work correctly without any problems? 🙂
Well, if you're maintaining a fork you'll wanna update it
Thank you 😄
After building the Waterfall fork, where is the right jar for the proxy? 😄
i didnt ping
Waterfall-Proxy/bootstrap/target/
reply pings by default
Ahhh thank you guys 😄
Travertine would put it in Travertine-Proxy/bootstrap/target
okay thank you a lot 😄
can i get CommandSender with name
what?
if you mean a player, yes, pretty sure there is a method on ProxyServer or whatever it was called for that
I learned that commandsender can be a ProxiedPlayer. thanks
plugin.getproxy.getplayer
Hey guys, I want to dynamically add servers to the waterfall proxy and the way I used before was to do config = proxyServer.getConfig(); and then config.addServer() or directly adding the servers to proxyServer.getServers(). But both methods got deprecated in Waterfall, what do I need to use, since using deprecated methods is not really an option. Thanks in in advance.
Pretty sure that there was a more frontline method for adding servers
Oh, so, basically
addServer is technically not deprecated outside of fucking lombok being a complete ass
wooo...
The Problem with the first approach is that ProxyConfig class is deprecated. At least according to Intellij
See the deprecation reason...
Ah well, thanks for the help so I will keep using that and keep an eye out for changes.
Is there a way to getproxyServer.getConfig().addServer() to properly sync back to proxyServer.getServers(). Because using the first one doesn't work whilest the second one does work properly but is deprecated.
!ban @bleak current steam scam
:raised_hands: Banned BobLeeNigma#8215 (steam scam) [1 total infraction] -- electronicboy#8869.
hey, i'm trying to teleport a player to a location in a server when they run a spawn command, is there any way to do that?
You'd need a plugin on the server to do that which can recieve the location and tp them
how would i do that?
plugin messages
ah, thanks!
if you need more help, I literally just programmed this into my plugin. So hmu. ;)
I would like to use rgb (currently only in motd), I also know how to do that.
But somehow it doesn't work.
Already with "§x§a§a§b§b§c§c", IridiumColorAPI (https://github.com/Iridium-Development/IridiumColorAPI) or other plugins don't work with rgb.
should work fine in many cases afaik assuming the client is the correct version
My Client is 1.16.5 and i use the lastest waterfall.
On Waterfall are the ViaVersion and the ViaBackwards plugin.
But when i delete that, that not work.
At chat work that, only in MOTD not
Does the WaterfallAPI also have an adventure implementation like Paper?
no
okay thanks.
it's basically on the list of 200 things I may get to one day
😂
not sure if this ist he right place for this question, apoologies if it's not. can a waterfall plugin prevent a player chat message from going through even if the chat is not handled by bungeecord plugins?
okay I didnt think it would prevent the chat message going through
good, ill give it a go then thanks
Hi, Do I still need a player to send a Bungee Message?
Even for things like Server list?
Does anyone have any ideas why this doesn't work?
Waterfall just passes the json through, I don't really see how waterfall on its own would break that
@EventHandler
public void onMOTD(ProxyPingEvent event) {
ServerPing serverPing = event.getResponse();
TextComponent textComponent = new TextComponent();
textComponent.setText("Text");
serverPing.setDescriptionComponent(textComponent);
event.setResponse(serverPing);
}
Isn't that right?
pretty sure proxy ping is the legacy shit
i need help with then server(paper1.8)(is conecting to waterfall)
latest.log by @versed egret: https://p.sulu.me/eegM2c
- wrong channel, 2. update minecraft or downgrade java. 1.8 won't support modern java versions with native epoll
i start the server and wenn i start bungee it crash the 1.8 server
yes, as I said downgrade java or update minecraft
in bungee i have this
[18:22:15 INFO]: Using mbed TLS based native cipher.
[18:22:15 INFO]: Using zlib based native compressor.
[18:22:15 INFO]: Enabled Waterfall version git:Waterfall-Bootstrap:1.17-R0.1-SNAPSHOT:93773f9:448
[18:22:15 INFO]: Not on Windows, attempting to use enhanced EpollEventLoop
[18:22:15 INFO]: Epoll is working, utilising it!
[18:22:15 INFO]: Discovered module: ModuleSpec(name=cmd_alert, file=modules/cmd_alert.jar, provider=JenkinsModuleSource())
[18:22:15 INFO]: Discovered module: ModuleSpec(name=cmd_find, file=modules/cmd_find.jar, provider=JenkinsModuleSource())
[18:22:15 INFO]: Discovered module: ModuleSpec(name=cmd_list, file=modules/cmd_list.jar, provider=JenkinsModuleSource())
[18:22:15 INFO]: Discovered module: ModuleSpec(name=cmd_send, file=modules/cmd_send.jar, provider=JenkinsModuleSource())
[18:22:15 INFO]: Discovered module: ModuleSpec(name=cmd_server, file=modules/cmd_server.jar, provider=JenkinsModuleSource())
[18:22:15 INFO]: Discovered module: ModuleSpec(name=reconnect_yaml, file=modules/reconnect_yaml.jar, provider=JenkinsModuleSource())
[18:22:15 INFO]: Loaded plugin reconnect_yaml version git:reconnect_yaml:1.17-R0.1-SNAPSHOT:93773f9:448 by WaterfallMC
[18:22:15 INFO]: Loaded plugin cmd_find version git:cmd_find:1.17-R0.1-SNAPSHOT:93773f9:448 by WaterfallMC
[18:22:15 INFO]: Loaded plugin cmd_server version git:cmd_server:1.17-R0.1-SNAPSHOT:93773f9:448 by WaterfallMC
[18:22:15 INFO]: Loaded plugin cmd_alert version git:cmd_alert:1.17-R0.1-SNAPSHOT:93773f9:448 by WaterfallMC
[18:22:15 INFO]: Loaded plugin cmd_send version git:cmd_send:1.17-R0.1-SNAPSHOT:93773f9:448 by WaterfallMC
[18:22:15 INFO]: Loaded plugin cmd_list version git:cmd_list:1.17-R0.1-SNAPSHOT:93773f9:448 by WaterfallMC
[18:22:15 ERROR]: Exception in thread "main" java.lang.IllegalArgumentException: Server lobby (priority 0) is not defined
[18:22:15 ERROR]: at com.google.common.base.Preconditions.checkArgument(Preconditions.java:359)
[18:22:15 ERROR]: at net.md_5.bungee.conf.Configuration.load(Configuration.java:160)
[18:22:15 ERROR]: at io.github.waterfallmc.waterfall.conf.WaterfallConfiguration.load(WaterfallConfiguration.java:50)
[18:22:15 ERROR]: at net.md_5.bungee.BungeeCord.start(BungeeCord.java:279)
[18:22:15 ERROR]: at net.md_5.bungee.BungeeCordLauncher.main(BungeeCordLauncher.java:67)
[18:22:15 ERROR]: at net.md_5.bungee.Bootstrap.main(Bootstrap.java:15)
1.8 isn't supported here, especially not in the waterfall-dev channel, and hasn't been updated in over 5 years
that's completely unrelated
I was always curious on how you change this text, would anyone know how you would obtain that? just out of curiosity
You have to send a minecraft:brand custom payload packet
I see, but we will keep it as waterfall then, dont really want to add an extra plugin just for that purpose, thanks anyway!
if you have a bungeecord plugin you can edit it with a simple listener
<@&748618676189528155> ^
Could someone briefly explain to me how Waterfall stores its Scoreboard and Team data? I'm getting an error saying that "Team <teamName> already exists in this scoreboard". I have ran through my plugin code numerous times to check for any duplicate team creations that might be taking place. I even go as far checking if the team exists on a scoreboard each time I am trying to access a team using:
boolean hasTeam = scoreboard.getTeam(teamName) == null ? scoreboard.registerNewTeam(teamName) : scoreboard.getTeam(teamName);
it doesn't store anything
that error simply means that some other server behind the proxy already registered that team
(and I'm pretty sure that fact isn't accessible via API)
Ok, is there anyway to get waterfall to print out the servers in question?
unless you register a custom packet handler I don't think so
kk
Wait, I may have a flawed understanding of scoreboards in the first place. If I create 2 scoreboards (board1 & board2), can each scoreboard have a team with the same name?
For example:
Board1 has teams: Team1, Team2, Team3
Board2 has teams: Team1, Team2, Team3
Or do team names have to be unique across all scoreboard instances
what do you mean by "create two scoreboards"?
So lets say you have the main scoreboard
And then you create another by calling Bukkit.getScoreboardManager().getNewScoreboard();
Effectively i'd have 2 instances of a Scoreboard object right?
that's not part of the proxy?
the proxy doesn't know which scoreboard you are referencing, Minecraft only has a single scoreboard
and yes, I'm pretty sure it would break when using Bukkit's per-player scoreboard hacks but using the same team names
just use unique names (or open a PR to spigot/paper do that automatically)
waterfall stores some info about teams on its side given that it has to remove them manually, as well as the API
But, multiple scoreboards are basically a bukkit concept, using a 2nd scoreboard basically just "hacks" out the MC one more or less and just deattaches them from the avanilla one
pretty sure it only caches until the next restart 👀
Yeah, that makes much more sense now. I was under the impression that you could have multiple in vanilla
bungee/WF basically store the team data on the player
it's why server switching across servers with dupe team names causes issues is because of what is more or less a race condition there \o/
I guess the Vanilla client just silently ignores duplicate team registrations?
it shouts about it in the logs, but, yea
I see
Thanks for all the info, that was super insightful 😄
oof, team names are limited to 16 chars :S I thought one could just automatically add a scoreboard ID or something
I have some ideas for a fix
It's just do I wanna eat more memory during server switches or break API
Yo electronic could u fix this waterfall exploit
exploit ?
Yeah
How is that an exploit?
Well actually when i trow a attack kills the proxy with that msg.
something opened a connection to it
It's literally the sole job of the proxy to process connections
Well happens when i attack
there is very little we can do
load balance and configure your firewall to rate limit connections, etc
Well that's obvuisly
At the end of the day, it's the job of the software to accept connections
I know that with firewall that it's easy fixed but without it they're some exploits
There is no magical fix here, the proxy seems to be doing what it's supposed to be doing
True^^
Well, yes, but, what do we do?
The proxy is processing connections as was intended, there is no magical way to determine that they're malicious until they start actually doing stuff
Well, u could check BotFilter.
There are plugins for that
Use plugins for antibot oof
Our inclination to build plugin wide solutions for stuff like that is basically 0, we have enough to maintain as-is
plugins can do it just as efficently as we could if they use the correct events, etc
Well currently antibots sucks
It's far too wide of a scope for us to deal with
And that's part of the entire issue
+1
These tools all rely on 3rd parties for data, we can't magically fix that one
Yeah, it's hard to fix it
Ah and it's worth remove scoreboard packets (Actually tried on waterfall)
was something I was kinda aiming to do at some point along with the option to disable entity metadata crap, afaik, with that system we shouldn't even need the scopreboard crap we have
Yeah, it's ugly
The only problem it's that doesn't handle good to remove them
on spigot
Yeah
When u switch server if u remove scoreboard/bossbar packets brokes the board.
I mean, everyone should use at least an decent firewall 
me when shared host

Then just ask your hoster 
Why tho?
no idea
but im pretty sure that i can handle your attack without any iptables 
U know
well, you can try if you want to
no idea what n-u-ll means
wow that's really hard
XD
You are also using cloudflare spectrum 
but doesn't stop any bot attack or similar
🤷♂️
Epic AntiDDoS
TCPShield exists and thwarts a good chunk of stuff, but, the free plan ain't exactly a ton of bandwidth last I recall
TCPShield got bypassed i saw it with my eyes some days ago
And how u said, it's easy to f-off TCPShield on free plan
Is it possible to create a gui with a bungee plugin
no, but, technically yes
there was some plugin somewhere which exposed an API for that
Can you tell me the name of that plugin?
you can use bungee plugins to send info to other servers using plugin channels and catch those on the server to show gui's but thats the only way
No, it can only be done with the bungee plugin with the packages. Instead of using a separate plugin for subservers, I wanted to do it all in one plugin.
Uhm, hi. I'm currently trying to build BungeeCord but have this issue now: https://i.imgur.com/IsfEDgs.png I deleted the project and get from VCS again and still the same mistake. Tried multiple times "Download Sources and Documentation".
1-2 days ago, it did work. Do you guys know why this mistake could happen?
make sure you're running build in the correct folder, i.e. not in one of the BungeeCord- folders or whatever
I think I'm in the correct folder and building the correct version of it or what would you say?
run it on the parent
Alright, it works now. Thanks for the help. I got "bootstrap" letting work too by "mvn install" all of the modules (and submodules) of bungeecord-proxy too.
bootstrap will just give you the .jar
Hello, is possible to check if other, not depend, plugin is enabled? (not on enable)
I think you can get it via the plugin manager?
https://papermc.io/javadocs/waterfall/1.16/net/md_5/bungee/api/plugin/PluginManager.html
nothing what can help me :/
The plugin manager is pretty rudimentary
maybe dead plugins won't be in there, but, it's not designed to care if stuff is enabled or not
dead plugins is listed in get plugins
maybe it's exposed somewhere in the plugin classloader stuff, but, otherwise 🤷♂️
bungee doesn't have the concept of plugins disabling/enabling at runtime
i need only information if is working but i haven't any idea how make that check universal for any plugin
as I said, such a mechanism probs doesn't exist
ok, thanks 😄
Will there be support for forge 1.16 and higher ?
Or does anyone know a bungee fork or waterfall fork that supports the forge 1.16 ?
Does velocity support forge 1.16? Not a fork but an alternative
FML1(~1.12) has packets that can reset the Handshake state, but this packet does not exist from FML2(1.13~).
Waterfall doesn't support Forge above 1.13
Even if there is a proxy or fork that supports this, client modifications are required.
LightFall is the fork that comes in my mind jut you want get any support it here and it requires a client-side mod in order to connect.
is it the same as waterfall to setup ?
Should, it's a classic waterfall fork after all
alrighty
Is it required to use the client side mod if you wanna join a paper server?
When the paper server is in the lightfall network
No, Paper doesn't support Forge Handshake, so it is not required.
nice
do u know where i can download it? can only find the github repo
I've never used it, so I'm not sure if it's right.
You can get the artifacts here.
do i just drop it in the waterfall server ?
when i start the server with the lightfall i get this error when im trying to join the forge server.
Take fork support into their appropriate spot of communication
what do u mean?
That you should not clog this channel up with third party stuff
where can i get help with this ?
Not here, this channel is for waterfall, not fork or third party support.
@torpid agate On Archlight discord afaik
But as I said too, you won't get support here
👌🏽
Is it normal for ServerConnectEvent to return the same server twice?
As if I was logging into the server twice at the same time...
It is printing twice the name of the same server when I enter
doesn't it normally announce it? and the 2nd one is because you just told it to do it again?
if a server doesn't have /server permission how else can you see a list of servers connected to a proxy?
/glist
that doesn't have default permission
i.e default bungeecord config users don't have permissions for it so 99% of servers don't have it
well usually people grant the permission if they want players access to that list
what do you need the list for?
to see everyone that is online
Your question makes 0 sense in the context of the dev channel
you know how when you join a bungee server you can't see everyone on the tablist unless they have a global one?
Which still makes literally 0 sense in the context of the dev channel
a bungeecord server
you want to ping that server?
if you're actually a dev and running a plugin on the bungee server, you can literally get that info from the API
query the server instead if you're so inclined?
If the server doesn't expose that info publically, you can't get it, it's as simple as that
^
only about 13% are accessible
the query protocol is often enabled which exposes that info
as well as literally pinging the heck out of it where the small list exists
query is likely even rarer, it took me ages to find a server that works with it
outside of that, the info doesn't exist publically
Which means that you're not dealing with waterfall dev, you're dealing with client dev
then modify the tab list to do that? You're in the dev channel
there isn't really a more suitable channel
and, within the scope of the client, if that info isn't sent to you, and you don't have perms to the commands to get that info, you don't got that data
this sounds to me like you're trying to build a server scraper
the problem is essentially idk how to move between those servers
if only glist was enabled by default 🥲
?? That makes even less sense
what are you even trying to do
you move between servers by using /server while connected through the bungeecord
yea Waterfall is not suited to do that without heavy modification
/server isn't enabled by default so most servers don't have permission for laypeople
then you're fucked
😦
Unless you're gonna work on a bot capable of actually fuaxing using a server, you're screwed, as we keep saying
its gonna be painful to make a universal way
There is no magical backdoor in our software for exposing information which server owners have hidden
ig most servers use compasses etc
and well, online mode and things
There is no universal way
you'd have to mod that in if you needed it
That's the entire fucking thing here...
ok
just run a VM with the client and simulate mouse clicks/run a mod 
@midnight sparrow @tawdry narwhal pls remove
!ban 472411758443626506 nitro scam
:raised_hands: Banned acirrox33#1923 (nitro scam) [1 total infraction] -- Larry#6086.
ty five
Heyy are there any way to get raid of this message, and change it for a custom?
not without digging into proxy internals
Heyo! Bit of a strange error someone reported and I'm not sure where to proceed from here. There's only been one report of it, but we recently started using all Google libraries from the proxy jar instead of our own, so it may be related.
Error:
message.txt by @flat arrow: https://paste.gg/31b74220a9124ec5b080c6d74afecdf7
have you tried explicitely loading the class before?
also might want to test on BungeCord, it might just be a bug in the bungee plugin class loader
Thanks for commenting.
have you tried explicitely loading the class before?
I'd be fine with doing that, but I'd like to know why it happens first.
I'm sure I can get them on Discord if need be. Hopefully it's just an older Java build though.
Hi how can I detect when a server close and is sending players to the fallback server, but detect which type of server the player is coming from, and if its 'X' type of server, then cancell that fallback connection and send him to the specific lobby for that 'X' type of servers
I know how to do this, all I need to know is where can I catch that information
which event
there's a kick event
Im going to look into this today, it's probably going to be some jank reflection but those messages are very ugly 😩
ur my favorite bot
ye be careful with reflection tho, done poorly makes u vulnerable to le malware
That's just dumb use of reflection, not reflection itself
@bleak current thanks, you wont be killed in the ai acapolypse :)
I'll piss on your PSU
Anyone know why its not transfering the player to the hub?
@EventHandler
fun playerJoin(event: PostLoginEvent){
val player = event.player
val hub = main.serverHandler.getHub()
player.connect(hub)
}
the ServerInfo is valid
Because the proxy does its own "deciding where they go" after that
What you generally wanna do is implement the ReconnectHandler or find what the relevant event was
how do i implement the reconnect handler
oh shoot sorry for pinging you forgot to turn it off on the reply
it's an interface
there is a method somewhere to set it to be the one the proxy uses
oh
ic
would it be in the ProxyServer class
ah its just ProxyServer#setReconnectHandler
If I have no server to send the player to can I just return null?
Yes, will just use the default list
But, do note that replacing that will prevent people from rejoining the server they logged out from on relog
I actually prefer that
So right now I have this code:
class SandboxReconnectHandler(val main:SandboxServerManager) : ReconnectHandler {
init {
ProxyServer.getInstance().reconnectHandler = this
}
override fun getServer(player: ProxiedPlayer): ServerInfo? {
val server = main.serverHandler.getHub()!!
println("Player ${player.displayName} is being sent to hub: ${server.name}")
return main.serverHandler.getHub()
}
override fun setServer(p0: ProxiedPlayer?) {
}
override fun save() {
}
override fun close() {
}
}
And this is the console output:
[03:58:37 INFO]: Player PrinceOfToxicity is being sent to hub: sandbox_hub_1
[03:58:37 INFO]: [PrinceOfToxicity|/REDACTED] <-> ServerConnector [sandbox_hub_2] has connected
[03:58:37 INFO]: [PrinceOfToxicity|/REDACTED] <-> ServerConnector [sandbox_hub_2] has disconnected
But I'm just getting a ReadTimeoutException:
^ Server wasn't configured correctly
override fun getServer(player: ProxiedPlayer): ServerInfo? {
if(onlinePlayers.containsKey(player.uniqueId)) return onlinePlayers[player.uniqueId]!!
if(!player.isStaff()){
player.disconnect(ComponentBuilder(ChatHelper.format("&cServer is in maintanence mode!")).currentComponent)
return null
}
if(main.serverHandler.hubs.isEmpty()){
player.disconnect(ComponentBuilder(ChatHelper.format("&cNo hubs online!")).currentComponent)
return null
}
val server = main.serverHandler.getHub()!!
onlinePlayers[player.uniqueId] = server
println("Player ${player.displayName} is being sent to hub: ${server.name}")
return server
}
Does anyone know the right way to do this? Because I'm getting a NullPointerException and the player isnt getting kicked.
ok
Like, there are sometimes valid use-cases for !!, but, Kotlin offers much better tooling around nullability and you should take proper advantage of it rather than relying on "forcing" it
I thought it was ok since i used containskey
I mean, more lower down than that
But, that's basically a double get too, just get once and check if it's null or not
override fun getServer(player: ProxiedPlayer): ServerInfo? {
if(!player.isStaff()){
player.disconnect(ComponentBuilder(ChatHelper.format("&cServer is in maintanence mode!")).currentComponent)
return null
}
val server = main.serverHandler.getHub()
if(server==null){
player.disconnect(ComponentBuilder(ChatHelper.format("&cNo hubs online!")).currentComponent)
return null
}
onlinePlayers[player.uniqueId] = server
println("Player ${player.displayName} is being sent to hub: ${server.name}")
return server
}
like that?
that's better
Is it possible to do a global tab in bungee or should i just make individual ones for each of my servers?
you'd need a plugin or something
it's possible with plugins, yes
Yeah I was planning on implementing it into the plugin im working on currently


