#dev-general
1 messages ยท Page 375 of 1
yeah osgi is cool
Yea but they need to be specified when running the application
It does 9+
ah ok
I just remember a project which allowed you to extend String.class
it used an agent which was self initialized iirc
messages
๐ฎ
It is still possible but not simple and good luck getting it to work on different VMs
ah okie
yes
What are you guys up to? I have some experience with hooking into bukkit class loading and manipulating the bytecode and so on
๐ฅฒ
he's trying to make an agnostic plugin system
so one that works with things like bukkit's urlclassloader, and a standalone app's system class loader
Uh, Java 16 seems to have broken my Gradle or smth. That's fun
project I was referring to
Yeah thats when Java 16 enforced encapsulation and caused certain classes to be not be able to be accessed using reflection. It's the same exact error if you try to open URLClassLoader to load jars. (https://cr.openjdk.java.net/~mr/jigsaw/jdk8-packages-denied-by-default)
making something like that agnostic is virtually impossible
hmm
I guess it might still be worth it to look into the topic a bit more before I move into changing bytecode
wait, what do you mean exactly when you say "plugin system"
Not exactly a plugin system
plugin system might not have been an apt description, yugi said it was more like a pdm remake
mhm
and what do you want to do with bytecode?
Wait if Java 16 changes affect things like PDM wouldn't it also affect Bukkit's plugin loading and PAPI's extensions? Or those work differently?
Change "new" invocations on entry class to resolve it through a specific classloader
You can still create new classloaders matt
that is not handled on the bytecode level
do they use reflection to access internal classes tho?
Thats not what I meant john
Ah okay gotcha
that reminds me
PAPI 3 when xD
I wanted to transform something like new Human() to using something from this lib to load it (Human)classProvider.getClass("a.b.c.Human").newInstance()
I'd do some work on it if I knew what I was doing lol
yugi any reference to Human will still resolve the class
because it means I can have placeholders on Krypton without rewriting PAPI xD
you have to use base classes/interfaces or reflection
that just screams xy problem
I guess the only choice is using a different entry point then
you mind showing me around PAPI 3 pig?
That was not a "how" to do that John
well
I wanna see as well
not exactly sure what you want me to do
I was thinking of diff ways I could do what I was trying to do
The actual question is still the earlier one
just take a look around yourself and if something tickles your eyes give me a shout and i'll explain why you feel that tickle
I wanna help get PAPI 3 done this year rather than this decade xD
Before you rewrite pdm or whatever, you should really start by listing what you want to end up with and what currently sucks about pdm
lmao
on an abstract level
Good point
the way I'm using guice shouldn't really need explanation
just don't question where these constructors are actually getting called and you'll be fine
what currently sucks about pdm
Nothing??
just accept that the dependencies are getting supplied
you just don't need to know where from
- multiplatform support is a joke
- URL class loader hacks aren't the way forward
- it's kinda a mess ngl
- relocation?
it is multiplatform
In theory
None of the essential classes depend on spigot at all
multiplatform? what?
Relocation can easily be achieved tho (asm)
so for example, on Velocity and Sponge I believe, you don't need jar-in-jar because it gives you access to add paths to classpath
ah
and that also applies to Krypton
on Bukkit and BungeeCord, we may need a more advanced solution, such as jar-in-jar, so we can remain in control of the class loader
the thing is, bukkit's class loading is uniquely fucked
๐
So is bukkit as a whole
yeah I think we know that
you can also use the method where you just completely override the classloader
and use your own classloader to load the other plugins
and expose the url method
thanks for yesterday's news @lunar cypress xD
bardy idk when i'll be free to work on papi 3
my 2 week holiday starts next week but that's basically reserved for a deluxechat update and hopefully a docdex release
that's why we have loads of people added to the project though amirite
Wait you guys have a 2 week holiday right
I think ours is like split 1 week and 1 week
you don't?
for U.S.
no it's mainly for advice bardy
what's not done yet pig?
frankly I'm a bit iffy about people contributing to beta software because chances are I'll delete their contributions the second I think of a better way
lol
is papi 3 publicly visible?
no
oh
nah, private, to avoid confusion
๐ฅฒ
it's not to avoid confusion
pig will probably add you on request though
it's to avoid me getting annoyed and other people getting annoyed when I delete their contributions
the perfectionist
idm having my contributions deleted lol
and that's why you have access
I'd rather make it work first and make it work well later
that's mainly because that's how I program lol
I just don't make contributions in general. I kind of talk about them
cause im worried about people who are like "You added an extra line here!"
like my main concern is that someone is going to write a big pr adding some new feature, but I can't accept it, because the feature they added is in fact planned, but planned in a much better, and different way. That pr goes down the drain because it's unusable, as it implements it in the wrong way
Are the planned features listed somewhere?
and this isn't just hypothesizing. It's happened before
yeah I was gonna ask the same
if you tell us how you want it implemented, we can implement it like that ๐
if it's not an issue it won't happen
Alrighty ๐
yeah if I get time i'll go through the issues and make a specification
even that's not set in stone though
will go back to my original point, where I said i'll delete it the second I think of a better way
lol
you guys can also try write a spec for a proposed feature
and i'll provide feedback eventually
probably after I get through #role-request
Page not found ๐ฅฒ
piggy don't kill me pls
lol
Only the elitist gamers have access to it
I don't have it either dummy
๐คฉ
oh btw, we should use Retrofit for the eCloud queries ๐
basically, you write an interface with HTTP request methods, and it uses OkHttp to do the calls internally and stuff
ew
A type-safe HTTP client for Android and Java
at least use OkHttp
luckperms maintains a connection to its web interface, no?
and much better to use than Java's built in stuff
yeah
I think
papi doesn't maintain a secure connection like that
still uses OkHttp to query stuff
it doesn't need anything fancy
you know it's just queries back and forth right?
that's all LP does
and it still uses OkHttp
also, OkHttp is only like 800 KB
well
they're on java 8
by the time papi 3 is public java 11 will probably be reaching eol in the mc community
dear god
lol
lol
with that defeatist attitude, yeah
lol
piggy you use @NotNull final instead of final @NotNull right
except for like arrays
he doesn't know what he's talking about
arrays r
yeah he's one of those
also one of those who uses two arguments per line
@NotNull final String @NotNull [] stringsgsgs
yeah that's cursed
2 arguments fits nearly 100% of the time within the margin
it also looks horrible
nah
yes
lol
1 arg per line gang
you are literally the only one here who thinks 2 arguments per line is a good idea
I do 1 arg per line if my arguments are thicc
I do it, unless they're super thicc ^
I don't often have that many constructor params lol
thicc methods
thicc overloading
thicc thicc
๐ณ
Almost as thicc as frcsty
other than https://paste.helpch.at/muxexeyore.cs ofc
Oh god
companion object Default : PlayerMetadata(
MovementFlags(),
300,
Optional(null),
false,
false,
false,
Pose.STANDING,
HandFlags(),
1.0f,
0,
false,
0,
0,
Optional(null),
0.0f,
0,
SkinSettings(false, false, false, false, false, false, false),
MainHand.RIGHT,
CompoundBinaryTag.empty(),
CompoundBinaryTag.empty()
)
why
What in the holy fuck is that shit
ok btw
my 2 per line ONLY applies for the declaration of parameters
if you say use default arguments, that's not possible here
I would never do that
since I use null to represent when we don't want to send the metadata
Oh ic
What do you use for long calls piggy?
I usually just split at an arbitrary number of args per line
depends on the indentation level and my mood
lol
bardy if you're looking at papi
this is probs a good place to start https://github.com/PlaceholderAPI/PlaceholderAPI3/tree/master/common/src/main/java/at/helpch/placeholderapi/api/key/keyable
Welp idk why but* I really prefer doing either one line or 1 arg per line
my linux
What's that HTTP library Matt fangirls for
see, now things like factories, I really don't miss lol
also, what the actual fuck are those generics
Factories are still a thing in kotlin bard
lol
๐ฅฒ
if u dislike factories, get functional
Builder is the obsolete pattern
u nerd
<H, E extends Enum<E> & KeyName, K extends Keyable<H, E>>
love me some generic soup
what the hecking heck is that
is KeyName not an enum? or are we looking for an enum that implements KeyName here
no i'm not
keyname is an interface
Duckkkkk :(
ah I see, yeah
sadge
so basically
the keyable portion of the api is certainly the most cognitively complex part of the codebase
How dare GH have the audacity to assume what I'm looking for!
now a key note is, usage of the keyable api does not require understanding of it's implementation
it's quite simple to use
also, I ain't using your clapped 2 args per line conventions btw
just difficult to understand (imo)
ain't happening lol
just use rust
Someone needs to modify that to "Callum Seabrook"
I'm not even consistent 100% of the time
in cases like this with massive parameters
we can have mixed nums per line
Oh god
un-stonks
-_-
oh btw pig
nice documentation you got there
lol
yes im sure ull find him like u find the year 9s ๐

we need documentation on both the API and common ideally
yea
nonce
json everything
I will find where you live katsumag
but anyway
if we look at an implementation
it's not THAT complicated
implementing krypton shouldn't be too hard
famous last words
is it at the point where I can make an at least semi-functional implementation btw?
yes
instantly forks
I swear if I see some BS that means I gotta use the Gradle wrapper like last time imma lose it
First is better, change my mind
/**
* Checks the User's permission on the provided String.
* @return whether the User has the permission
*/
boolean hasPermission(@NotNull final String permission);
well that was faster than I expected
what was faster?
building
lol
no
wat
lmfao
actually
what monster would do final @NotNull
๐คฃ
@obtuse gale
well I can't stop you from writing it in kotlin
it makes sense since krypton is also in kotlin
clojure reference incoming, brace
but I'm not sure about merging it into the main repo
no but you can stop it from being merged
yeah
I mean, it's not that big of a deal
because I can't maintain kotlin
you know Krypton will likely die if I leave right?
yes
If anything i can maintain the Kotlin portion
you can delete it if I retire it lol
yeah matt we'd probably just get rid of it
yeah if I go you can delete it lol
F
I don't plan to leave any time soon though
I have Krypton to work on and LuckPerms, spark, and what will now be PAPI 3 to maintain
Tbh Bardy get the core thing working first before you implement platforms in those plugin
yeah probably a good idea
lmao
my priorities for Krypton are upside down atm
krypton: players cant move or smth
bardy: atleast papi works on it!
opinions on having the window title "MC Server Creator v1.0.0" vs "MC Server Creator"?
I wish I had more people contributing to Krypton
or "MC Server Creator 1.0.0"
it just mostly seems to be me atm ๐
choose something besides MC Server Creator
too original lol
maybe like Xodus
or something
uh
as your server name
oh btw, Piggy, you should join the Krypton Discord
a d
we have some good fun in there
/s
?
wdym
i was joking to bardy about the ad lol
wdym server name
i was talking about using something like "Xodus" or some other name instead of "MC Server Creator"
cause MC Server Creator sounds too boring and original
I mean, pig likes to join other community projects to do with people in HelpChat
I got like 15 now
someone in the Minestom Discord found the project and someone else linked the Discord
a) i can't think of names
b) this is just a simple javafx project (bc i need something to work on)
ah
also, you mean unoriginal
Yeah i meant that
after ticking btw, what should come next for Krypton?
"Name v1.0.0", "Name", or "Name 1.0.0"?
actually maybe I should ask that in the Krypton Discord
Name
feel free to inv me
no versioning required bud
can't guarantee i'll stay
OoOOF
not an insult
i guess
o
but i havent been working on the modpack
lately
cause of plugins
i feel kinda bad
there are also like 20 other staff members on there
and i havent been really like doing any shit
lol
also, that moment when you realise that you're going to have to write a changelog describing what you changed for the new version and the list of git changes is off your screen
I swear this is like the first time in my life I've actually had something to do lol
https://github.com/dkim19375/MCServerCreator
any suggestions?
- Krypton
- DocDex multi-format support
- LuckPerms platform
- spark platform
- PAPI 3 platform
- Geyser platform
that's my list of projects lol
and yes, I spoke to cam last night and found out that writing a Geyser platform impl is ez
im adding an option to have something like this:https://i.imgur.com/fKR4m8J.png
lets evaluate each others
I don't use the GUI built-in to IntelliJ btw because it doesn't support commit signing
at least, not on Windows
haha
thx
๐
lol what is that programmer art
haha
private Stage primaryStage = null;
private Parent chooseTypeRoot = null;
private Parent chooseVersionRoot = null;
private Parent chooseDirectoryRoot = null;
private Parent installerRoot = null;
private ServerType serverType = null;
private ServerVersion version = null;
private ServerTypeController serverTypeController = null;
private VersionController versionController = null;
private DirectoryController directoryController = null;
private InstallerController installerController = null;
hey im not an artist
i thought i knew programmer art
shouldn't you just leave it blank?
but sheesh
cause they are null by default
just don't even bother to initialise those dkim
no, they are not
yes they are
no they aren't
yes ๐ they ๐ are
they are "uninitialized"
w o t
๐
which evaluates to null at runtime
lol
is this a javafx thing
so they throw error because it's like "this variable might might has not been initialized yet"
oh
null ๐
thats weird lol
since javafx has a start method, not a constructor
an start method
https://github.com/dkim19375/MCServerCreator/blob/master/src/main/java/me/dkim19375/mcservercreator/controller/InstallerController.java
For this class
you should consider using Abstraction
"make a pr" lol
If it worked
i should remove that image
instead of multiple switch statemeents
.
purpose.exe not found
it throws error if i dont have a main class for that for some reason
it apparently cannot extend Application
๐คจ
isn't that normal for stand alone apps?
Should have used tornadofx
^
^
oh nvm
Not like that
TornadoFX lit
tornadofx in java lol
too late now ๐ฆ
never too late
who wants to look at my code
I'll rewrite it xD
since I can't use DI
look at mine
let me rewrite it from scratch lol
lol
Fix your shit and i might pr
Lol
what about it doesn't work
https://github.com/dkim19375/MCServerCreator/blob/master/src/main/java/me/dkim19375/mcservercreator/controller/DirectoryController.java this can be instantiated with DI, no?
What is that image
i couldn't find out how
Did you draw in paint or something?
since JavaFX has its own thread and makes its own instance
paint.net lol
god
i suck at drawing
Everything, your requireNotNull stuff was always null, package issues, fixed like 4 things to get it running and was still throwing NPE with no explanation why, stopped wasn't worth the time
welcome to the club dkim
what tha
just rewrite it in Kotlin using TornadoFX
That's what happens when you don't handle nulls correctly
TornadoFX's DSLs are ๐
this is literally my project files
i added every file
besides .idea
and .gradle
Not talking about project structure lol
i meant that the files are almost same
so i don't get why it doesn't work
are all the fxml files and icon.png in the resources folder?
and you're using gradle run?
๐
dkim
wanna look at my project now after i looked at urs
we can trade bad projects
lol
wait what lmfao
lol
is that in my project?
no
dkims
thats so that they can see the starting message
then it waits 1 second
bc all console logs into there
so its just a little warning
throwError lol
Lmfao
lolll
our BRAVE lea9der
take a guess
Dkim I mean E for effort
CHAD?
the polar opposite of a chad
its not like mc servers where the server can still survive with exceptions
if the program throws exception.. it should halt
being who?
No it depends...
You should be able to recover from exceptions 90% of the times
well
its not even that dkim
dkim what the fuck
there is no need to be sleeping the thread to send a message
Skim lol
Show a crash dialog
how do i delay everything then
uh
and exit on closing the dialog
Instead of pausing thread
good idea
Well thatโs not a reason to make a weird tightly coupled error handling out of it
how do i make a crash dialog? ๐
- adding a shutdown hook with a new thread every time you throw an error is gonna get real expensive real fast
- there is no need to sleep the current thread for 5 seconds when you error
now do u see who it is ๐
its so that the user can see the error
omfg
why does nobody code review my project ๐ฆ
you know the entire purpose of exceptions is that they're expected to be caught right?
Send link Pulse
that's how they differ from errors
Ill review it inbetween my work
an Error should not be caught, and it is generally non-recoverable
its kinda big tho
I see
an Exception should be caught, and is generally recoverable
Ill try my best to cover atleast some parts
what am i supposed to do if the file cannot be downloaded
tyty
attempt to redownload it, yeah
Even worse than CHAD's code
timeout eventually
ill implement it
you could send a failed download dialog to the user
Didn't think that was physically possible
uh
whos chad
or smthing
JDialog
yugi sent link
no just in general
our lord and savior kangarkoo
o ๐ณ
@serene cave
um
you know what deprecation is pulse?

ah right
why not just delete teh class lmao
well i saved it for later purposes perhaps
๐ค
@ocean quartz
So I think we can go 2 routes with how we inject* dependencies
- Provide an Entry point class which should be extended by the user to run their application
- Enforce a Interface-Implementation pattern wherever user wants to use the "shaded" dependencies
Whats you opinion on which path we should follow?
@steel heart you too
I think one because we would essentially be able to enforce a base structure etc
Hmm
But that is if one is needed
#1 sounds easier
True
Maybe all annots based 
Yeah well I vote for 1 anyways
Alrighty
So 2 votes for #1 rn
the poll doesnt have one for options does it
welp
I guess +1 = 1 , -1 = 2
What are you making?
How would the second option work?
Something like
AnInterface a = slimJar.create("com.a.b.MyClassImplementingTheInterface")
ig
Also @hot hull sorry I still don't understand how you want the actions on mf-cmd, can you give me an example?
Isn't it possible already?
Oh okay, hmm i think 1 sounds better ;o
Alrighty
What u think yugi?
runtime dependency downloading & injecting
U rewriting pdm or smth
Ah ok
Ill send you invite link for hasklash tonight
Nice, cheers
Does Gradle support Java 16 yet?
Only reason I wanted to use 2 is where I already extend another class and just want to implement the functionality of it but that would rarely be the case if weโre following srp
the newest RC supports it too if you want it now
I'll wait until it's officially released I guess
@ocean quartz, any suggestions as to how I should approach removing the mf-gui nbt tag when a user takes an item out of a gui?
Did setting it to null not work?
Haven't tried yet, issue is there's a shit ton of actions that would result in an item being taken out of the gui
Yeah, if only there was a inventoryevent that would trigger on every action right Bukkit
Event
Deobfuscated NMS is sooo different holly shit
yeah
decompiler
It's normally added by the decompiler
you know Paper has an obligation to use Spigot's mappings btw right?
so they can't really do much
It's weird though, net.minecraft.server.v1_16_R3.NavigationAbstract doesn't exist on the vanilla server (without version ofc) 
^
Okey SOrry
This are all the files on net.minecraft.server
You changed something today earlier bard
yeah I still can't get suggestions working
oh btw, if I call a function in a lambda, that function will be called when that lambda is invoked right?
Yeah
because suggest never gets called for whatever reason
uh why do .java files have the .exe icon
^
๐ฌ
dispatcher.getCompletionSuggestions(dispatcher.parse(command, sender))
anything wrong there?
Nop
That's the "unknown" icon, no?
oh it is?
thats the icon for any executable im pretty sure
for unknown it is just blank
icon
val commandNode = buildRawArgumentsLiteral(
command.name,
{ execute(command, it) },
{ context, builder -> suggest(command, context, builder) }
)
```registration of the command
This is the .exe icon
private fun buildRawArgumentsLiteral(
alias: String,
brigadierCommand: com.mojang.brigadier.Command<Sender>,
suggestionProvider: SuggestionProvider<Sender>
) = literal<Sender>(alias.toLowerCase(Locale.ENGLISH))
.then(argument<Sender, String>("arguments", greedyString())
.suggests(suggestionProvider)
.executes(brigadierCommand))
.executes(brigadierCommand)
.build()
thats msi
Thats msi matt
^
lol
Msi and exe
Lmao
No matt
msi is the disc
defualt for exe is that other icon
exe is the window thingy
Fefo is there anything wrong with my registration logic?
then suggest btw is ```kotlin
private fun suggest(
command: Command,
context: CommandContext<Sender>,
builder: SuggestionsBuilder
): CompletableFuture<Suggestions> {
val args = context.input.split(" ").drop(1)
val hasPermission = command.permission?.let(context.source::hasPermission) ?: true
if (hasPermission) return builder.buildFuture()
command.suggest(context.source, args).forEach { builder.suggest(it) }
return builder.buildFuture()
}
pretty much mirrored Velocity with all of this
idk what I'm doing wrong
Well that's the default icon Windows assign when there is no default for the type, if I open it with any program it'll change, I've never opened a .java file directly
Blank is for no extensions
Registration looks good ig, can't give a super detailed look at it rn
open .java files with IJ by default ๐
ur icons are weird 
^^
Unknown extension != known extension with no executable attached to it
No idea, doesn't really matter, it's just an icon lol
could probably put money on this issue being something really stupid that I'm just missing lol
Matt you don't live in Windows
Hello,
Can I have a sonor notification when my name is mentioned in the chat (put the nickname in colors and have a little sound of noteblock with deluxechat ?
Bardy
yes Fefo?
Bardy
What? Lol
lol
if (hasPermission) return builder.buildFuture()
Wouldn't that not call the actual command suggestion thing?
- that's what Velocity has
- that should be fine
- I set a break point on
argsand that was never called, so that's not the issue here
it's not calling suggest at all
Ah
im stuck between
a) coding
b) playing hypixel
c) watching youtube
๐ซ
๐ณ
strange isn't it Fefo
wasn't talking to you xD
dkim I can see what you delete lol
โ
would u like to explain urself bardy
its against tos but in reality its meh
it's cool, you'll get told off for it if someone reports you, but Discord doesn't really give a fuck anyway
lol true
wdym get told off?
๐ฎ what does it look like?
Wtf the path is the same but the classes in them are completely different 
I guess Bukkit adds a lot to nms
you can get custom themes for it
no i mean what does the warning look like
wait nms only has 2 classes 
no, it has many more
5 if u count the subclass things
but-
In that specific path
just the server code isn't all in net.minecraft.server in actual Mojang code lol
ic
I'm a bit confused, but when does $ get added for java bytecode? Is it like subclasses
i was imagining like 100k line classes lol
yes
i think
then you have net.minecraft.world, net.minecraft.util, etc.
The issue is that Mojang server has no AbstractNavigation
subclasses and lambdas
i thought it was all net.minecraft.server.world etc
I think
ic
anonymous classes
nope
yeah because that's a deobfuscated name
Bukkit mappings != Mojang mappings
I'm assuming Bukkit's equivalent of PathNavigation
md5 switched to Mojang mappings for package names (for dev environment, not the final jar)
you talking about NavigationAbstract Matt?
Yeah
how can i print out exceptions... but not in console?
about time md_5 did something useful for once lol
you can print stuff to print streams
e.getStackTrace()
._.
Yeah, seems to be it
that doesn't return String[]
d; Exception#getStackTrace
public StackTraceElement[] getStackTrace()```
Provides programmatic access to the stack trace information printed by printStackTrace(). Returns an array of stack trace elements, each representing one stack frame. The zeroth element of the array (assuming the array's length is non-zero) represents the top of the stack, which is the last method invocation in the sequence. Typically, this is the point at which this throwable was created and thrown. The last element of the array (assuming the array's length is non-zero) represents the bottom of the stack, which is the first method invocation in the sequence.
Some virtual machines may, under some circumstances, omit one or more stack frames from the stack trace. In the extreme case, a virtual machine that has no stack trace information concerning this throwable is permitted to return a zero-length array from this method. Generally speaking, the array returned by this method will contain one element for every...
This description has been shortened as it was too long.
an array of stack trace elements representing the stack trace pertaining to this throwable.
look at the print stack trace method
I've tried doing Exception#printStackTrace(PrintWriter) and PrintWriter#write(char[]) which worked... sorta (it had some extra stuff such as an extra ) at the end of each line
into a string
Arrays.stream(exception.getStackTrace()).map(element -> element.toString()).collect(Collectors.joining("\n")) lol
it uses like a billion private variables and methods
String::valueOf ๐
Yea setting the nbt to null didn't work
Hmm, i'll try it out Frosty
big brain
Arrays.stream(exception.getStackTrace()).map(String::valueOf).collect(Collectors.joining("\n"));
Yeah navigation is a bit more complicated than lazy me can handle today ๐ซ
what should i use as my "error occurred, should reattempt"?
a) a popup/separate window
b) a button under the console output
c) a button above console output
d) crash the app
navigation?
like entity AI?
oh dear
popup
I hope I'm not gonna die inside when I have to put that into Krypton lol
you can if you want
because i dont want to make a whole JavaFX stuff for it lol
JavaFX is good, but imo not for small things like error popups
Yeah the part for navigation
I want to make a coroutines implementation of navigation
That actually walks through things like rails and shit
But my brain is too slow today
Collectors.joining(System.getProperty("line.separator")) ๐
lol
The line separator string is defined by the system property line.separator, and is not necessarily a single newline ('\n') character.
a.k.a on Windows it'll use \r\n and on literally every other operating system it'll use \n
Well I meant the method
Yeah that's epic
But Idk why 7 is the one that comes first whenever I google smtng java related
Maybe
oh btw, Fefo, could the parse result's nodes field being empty have anything to do with completion suggestions not working?
I have the Java 11 API bookmarked lmao
Hi stupid I'm Fefo
Server ID 164280494874165248
Shard [3442 / 10240]
Pod r1-pod-229
Node node-6
Server Region US East
:o
OMFG
guess what it was
private fun handleTabComplete(session: Session, packet: PacketInTabComplete) {
server.commandManager.suggest(session.player, packet.text).thenAccept {
session.sendPacket(PacketOutTabComplete(packet.id, it))
}
}
look at that
now, what would text be if we type in a command?
I saw what you edited out lmfao
lol
But yeah
lol
Brigadier tries to parse a literal with name "/command", can't find one with that exact name, and returns no parse results
It sends the entire chat buffer
I literally fucking called it
I said "I bet it's gonna be something really stupid"
so if I have something like this: should it close the program if the user presses 'no'?
dont question my drawing skills
nice drawing
nice drawing
nice drawing
-_-
๐ฅฒ
but seriously
make it so they literally can't exit the program