#dev-general
1 messages · Page 220 of 1
I should have all the required modules though
¯\_(ツ)_/¯
shut up
lol
it WoRkS
something is actually wrong with me
i've been debugging why WE RandomPattern was only producing the same block when I added the same block twice...

big brain
@prisma wave slow
nah
Can paste, scan and load a 50x50x30 region in about 1.5 seconds with very few optimisations
actually more than that
91 x 16 x 91 to be precise
132000 blocks
Would be curious if you could do that faster
Yeah
but fpm should only add a tiny bit onto that
fpm?
Fucking pizza maker
fancy private mines :))
ah
Close enough
my brain isnt working today
BM, ditch fawe do it yourself
That could make it faster
Also cache anything that can be cached
cache the cache 
Fuck fawe
I'll do some benchmarks soon to see how long is spent on each bit
yeah
Make fancy patterns tho BM
non cubic regions
For the loading, so you can delay it, meaning speed won't be an issue
Wdym fancy patterns
Like placing layers by layers, and then more fanciness
the animation of how the blocks are regenerated?
The benefit of using FAWE is I don't have to deal with that
You can also cache the calculations then, ez claps
And fawe probably has better optimisations
You can also cache the calculations then, ez claps
That's exactly what I'm doing rn
Good good
cache the cache that calculates the cache of the cache
On an initial paste, it calculates all the locations and then stores them relative to the schematic origin so they don't need to be recalculated
Yus yus
Found free location in 11ms
Pasted plugins/FancyPrivateMines/schematics/paste1.schematic in 4664ms
Scanned region in 1ms
Filled mineable area in 26ms
so yeah fawe is taking up like 99% of the time
which is strange considering it pastes instantly with //paste
I'm telling you, ditch fawe
Worth it tho
I mean if you go for the "animations" then don't bother, otherwise do bother
and buggy 😦
not on 1.8 
If you can't achieve maximum speed on 1.8 you're weak
Define maximum speed
Server go brrr
ye why not?
2 seconds that will be enough to crash it and just break the paste. half pasted half not and no way to do /undo anymore
its the best when that happens.
make it a requirement that the server has 16 GB RAM for the plugin to work xD
time to find out if this "mf-gui" is worth all of the hype
It is
i will be the judge of that
However not being able to construct a menu directly from a file is a flaw
As in having already built stuff for it
Lazy
that's unfortunate
No u Matt
Yeah me, i am lazy
Elara, have you finished going over the relocation PR?
Just do it smh.
How quick was elara 
Fast as fuck boi
As slow as the developer that does PDM PR reviews.
☹️
Yikes
You think I can add "PDM Relocation Support" to the December giveaway?
I'll set it for Dec 1st
Going to do big changes to the gui lib, i'll make the paginated gui be aware of it's pages, instead of calculating every time it opens
Will also return the added slot, I think Frosty wanted this to be a thing
And maybe i'll add the load from file xD
Ooo
How bout you integrate an xml property file which determines the format for the file somehow
I can try
Was thinking about doing it with yml instead
XML is really ass
Also finally separated it into modules so i don't forget to remove my commands framework before publishing 
Yea I mean yml for the actual file for it, but xml or something to define how it get's parsed/the files format
PlayerVaults 3.0, powered by MF-GUI.
If that makes sense
Ooo okay, i can look into that
Being renamed to triumph-gui now too ;p
Finally organizing my stuff
Cause like why be confined to a single format/style when you can let the user change it
I still need gh folders to be able to organize my shit
loook its TriumphDev himself
Hell yeah
Wanted it to be just Triumph but already existed on gh
How about writing a plugin in readably english?
ye
but
it'll not do what it says
that will kick the player instead
of opening a gui
👍
Yas!
pog
We should try doing that thing again, where we have a repo, and have to pr anything to it with a limited amount of lines to make a random plugin
Also trying to open the Material enum
I hate that it's started that.
happend to me twice today
Matt that was a failure. It's not worth it
That's because the channel was hidden and stuff, could be made more public
yea that could be fun to try again
weird question everyone, I am looking for sites that always present the user with a captcha, I am having some fun with ML and my model needs training material
hope this is not against chat rules btw
What does this ML do? this sounds kinda malicious ngl lol
well it is somewhat but I could not think of something else to make something for
😐
if u got a suggestion please lemme know
what does ML stand for/mean
Machine Learning
np
does anyone know of any good command APIs out there for spigot?
Cloud ❤️
any links for it i cant seem to find it?
gg that's quite the social media preview City has lol
thanks
I do agree with that.
I feel it could be overkill / scare away people with smaller plugins.
mf commands 
rpf 
yeah Cloud is definitely more complex than most command frameworks
Especially with registering all the different parts
oh I always used MFC never even looked at other command frameworks
ACF is still my favourite
anyways. Can you guys recommend an "actions" library?
ye

Or Gaby's is called ItemActionLib afaik
That's katsu's?
oh wait
doesn't gian have one?
I'm pretty sure I saw one last time I saw his gh let me check
Everyone has one
Oh nvm IAL is for something else I think
Mine is best tho
Obviously
Well mine has delays and chances as well
bring back FrozenJoin
And it's made in kotlin 
However I don't think it'll work with java tho
yep gian has an actionutil as well
it's no [other JVM language that may or may not exist yet]
Gian's is ew tho, cause it doesn't properly sort the actions
soo
xD
oh yours looks good Frosty. I think I'll use it
oh centered messages
as well
xD
Should I start becoming a narcissist dev and name all my plugins BlitzPluginName ? xD
it's better than DeluxeProUltraSuperPluginNamePlus
😳
Just name them like you would kids.
and an
MUST HAVE 
Advanced
Darrel, Johnathon, etc.
oh
lol Glare
or name them UUID.randomUUID()
The supported versions list is just every version of minecraft, 1.0 - 1.16
MUST HAVE
DeluxeProUltraSuperBlitzPluginNamePlusSupreme
MUST HAVE 
MUST HAVE
James!
Does the dishes! 
and the description: doesn't actually do the dishes
Under that add large bold red text
and abov
e so they don't see it
also make a + version that will be the same thing just has a + in the name and costs like 20$ xD
Garbage Collection Collection?
- Better handling of GC:
Program will delete itself on boot.
Real GCs delete themselves before the game even starts
What about be the best way to do above head names in 1.16+? Using Packets or ??
yes
Thought so, never touched packets before... Guess it's time to learn how to do it 😛
If anyone has used Hibernate in the past here, do I still need to handle db creation, table creation and all that jazz, or will it do it for me once I save an object?
yes
Ah okay
Given up on hibernate, cause I don't think it makes sense to use it here
The language I use is Python, with the discord.py API. This language consumes less resources than JavaScript or even Java.
I'm not sure about that one
Go vouch for my offer service, thanks
Add clojuremoon reaction please
you are welcome frocsty
I’m trash at coding java but anyways this dude called Frosty is actually pro god Gucci elite
monkas
"Gucci elite"
Yes
pog
Frosty's offer services
Someone ban Sellinq please
vouch
i cant put reactions in #772310219056349214 🙁
it’s helpful rank
I can't either
The only person who could do it is piggy
Because he has perms, nitro and is in elara discord
Is there a way to initialise an array that's dynamic?
so I don't have to set a size, and I can free add new values to it
Why not use a list?
teach me
wdym, just yeet array away, make a new List and voila profit
cheers
probably 80+% of that is the command prompt itself lol
Yeah Lua is super fast
omw to make one in assembly
🥲
Is Lua dynamically typed?
That's actually pretty nice
Compared to most of the Lua I've seen
It's like python without the gimmicks
oo lua
i made it look nice, 🙂 learned java due to Fivem 😄
its really easy to make something in lua be easily expandable.
I used to make discord bots in lua
which api did you use?
with discord4j
ah i use discordia
environment I used allowed me to use java apis in lua
interesting
worked very well too
JNI?
Ah nice
I THINK
i'm not 100% sure on that
with Luvit.
i like how easy it is to setup commands any way you want them XD
XD
@prisma wave fun fact lua is right up there with c on terms of speed if you use luajit
according to a quora post I just skimmed through
Wow
lua god
.,.,
and undoubtedly slower
haha
I think Julia is actually faster than C in some cases
oof
just imagine how great the world would be if lua focused on being a scripting language
instead of purely embedded
eh
i mean its op for storage stuff you dont need to predefine stuff just ha
member = {
name = "ababa",
level = 0,
xp = 0,
-- maybe add more stuff?
}
-- add more stuff any time
member.owner = true
OP!
So it's dynamic
● Allows static and dynamic typing in the same code
● Provides optional type annotations
● Uses local type inference
● Does not influence run-time semantics
● Unannotated Typed Lua code is Lua code
● Aims to be sound
● Rich enough to preserve some Lua idioms```
ye i love how you dont need to change variable type 🙂
ok frankly I don't know if this is a proposal or a description of lua's type system
Piggy, u got any advanced db storage shit on your gh
just rpf
I need inspiration
I mean how many models we talking about
gotta try make music player in lua hbahaha
Lemmo, not worth to go with ORM for this cause it's like barely any
omg there is lavalink for lua wtf.
I just need some guidance to do it "properly" cause right now whenever I do stuff with dbs it's a mess
all my os gh projects are shit so i got nothing for you
but It isn't too hard
just come up with a design on paper
@frail glade not sure if you still use taskchain but this was posted earlier in paper today, and people say it's nicer to use than taskchain https://github.com/rest-faucet/task
sync/async changing is neat
I don't even understand how that works
No finals, ew
it runs a timer every tick lol
is that how it works or are you just commenting that?
just commenting but that's also how a part of it works
why does it keep finished tasks in memory
That's pretty impressive speeds then
So noone got any good examples? 
wat ta frik
who added this
omg
yes
give me replyes
It pings, so heck out
Fianly something good! REPLYES!
yes here you go a random ping
...
NO
btw you can remove the ping if you click here: https://i.imgur.com/rB1vdUj.png when replayuing to someone
it is not a global toggle tho so you have to disable it each time
where is that?
wtf so each time you reply to someone you have to disable ping?
wouldn't it be better the other way?
what way?
no
it'll be better
to be able to toggle it
and stay the way you want it
or that ye
ye
Wait you can reply to yourself?
Yes
how
wdym how
easily?
ooooo
yes
So noone kind enough to supply me with some inspiration for properly doing DB stuff
Do it
:c
Does anybody know any good web-developers that they can vouch for?
I am going to do a #772310219590074398 but i was just going to ask here first as you may have some ideas
Oink oink probably
who is oink oink
@half harness @quiet depot
xD
There haha
good one
Good news everyone... Andrey Breslav has "stepped down"... Now hopefully we can see some innovation and prosperity in the kotlin language...
What?
no idea who that is but ok I guess
former Lead Language Designer for Kotlin
k
looks like karma for removing Tuples is finally catching up to him...!
Roman said in an interview with CNN, "I like rust, a great language, great syntax you know. I can really see that syntax making it's way into Kotlin.
good to see!
some really great, maybe even the greatest developments coming for Kotlin!
The Department of Transport, declined to comment of Roman's statement.
The Department for Environment, Food & Rural Affairs, on Monday, said it "disappointed" with the announcement.
This is gonna be fun
Probably because they have been bribing Andrey for years... Big Rural Affairs has been controlling the kotlin language... Time to wake up!
So I was gonna use a loading cache, but I think I'm gonna just use a map and have the data for that specific player loaded when he joins, and cleared when he leaves
ConfigurationSection already loaded wholly in memory. Caching is stupid.
Well
You're a 4head Niall
I look forward to seeing how Roman handles the ConfigurationSection problem that plagues many developers
Hopefully some sort of language feature
In Kotlin is better
async {
}
or just use asyncprelogin..?
Lol.... static class to dispatch your task. WHO sets the plugin instance? I cant think of anything worse and more problematic
Tasks {
static Plugin plugin;
} 🤢
what have the WHO got to do with Minecraft..?
World How-To Organisation
You need a plugin instance to schedule a task
Go work on Kiteboard weeb instead of making 0 sense
Makes perfect sense
@prisma wave get triggered
😐
Niall
val PLUGIN = JavaPlugin.getProvidedSomething(Task::class.java)
What is the issue?
the CHAD would finally be able to use his sleeps
static instance
And what is the issue with that? (For this usecase)
yes thats right my NEW ZERO CPU solution- we make use of ADVANCED, STATE OF THE ART. technology(scheduleAsync) so there is ZERO LOAD on your server.!!!
Also so Roman Elizarov is now the main guy on Kotlin, nice, he seems like a nice dude
Fine
There isn't any issue with that
Yes, good to see
BM seems to think there is ;C
Glad Andrey has finally been punished for his crimes
I disapprove of static in general
But I am aware that it's necessary
This new reply feature is quite Nice
Agree
nein
If only you could perma toggle tagging
Yesterday the toggle wasn't resetting so i am assuming it'd a bug
Wait what
Also, this reply design is so.... weird
😂
damn
It would, but DI is preferable
Which thing?
That uses reflection and bunch of other stuff, it's not that great to keep using
DI is not that hard
Use Kotlin 
DI = Way better for testing and stuff
public class Class {
private final Plugin plugin;
public Class(final Plugin plugin) {
this.plugin = plugin;
}
}
class Class(private val plugin: Plugin)
Not defending it by any means, but the amount of reflection is fairly low, arguably none
All it does is obtains a classloader and casts
Doesn't matter, fugly
Indeed
lol
The chad man, he knows things we don't
We all love CHAD don't we
You don't know what your saying
😠
Foundation is a TRIED and TESTED framework
Css framework? Lol
Kangarko
Oh. Is it good?
Obviously
It features a clean codebase with no flaws whatsoever
ZERO anti-patterns, ZERO bad practices, ZERO potential bugs
JUST util classes!
@heady birch What's your rainbow expansion
🤨 I dont have a rainbow specific one, there is animations but is deprecated
I want some people contribute perhaps
No but come on, rainbow is so easy, depends on which rainbow you want
Niall doesn't do OS 😞
new requirement for dev role is OS so imma remove your role Niall....
It's gotta be a placeholder since tab
lmao
lmao
Lol
Just saw the message, kek
Which rainbow? Can you make your own placeholder? I'll just give you the code
@frigid badge Remember you said about making an animations expansion (before I did) all those years ago? What was your approach on it? perhaps you would want to do it? Or not if your busy
yeah ik I wanted to but scrapped it since it depends on the plugin requesting the placeholder
Where's Glare today 👀
the plugin requesting the placeholder needs to update a certain amount for it to be a good looking animation
but it would be easy to make just only applicable to certain plugins
Yeah, the interval is set by the plugins
And sometimes people expect it to work in plugins where the interval cant be changed
@hot hull Which rainbow where you looking at?
Aight i need some opinions
I am working on this chat plugin and I want to have a system similar to PAPI's extensions
Where you can add custom chat placeholders like for example {item} or {inventory}
The idea for the extensions is pretty simple, my question is:
I want to have default extensions like the item and inventory ones, should I have the jar inside the resources and copy it to the folder on first run or have it be in the code? 
Idk what system would be better for users, i know that adding the jar would be more JARring (sorry for the pun)
I quite like B
Generate if its a new install, they can remove the included modules if they dont want them
So add the jar to the folder on first run, if they delete then it'll be disabled?
Could also add a regen defaults command
Hmm i guess i'll do that
Ah yes config devs
Lmao paper
Lol
lol what 🤣
Making a mod?
I know this seems quite useless, but i think it's awesome
Reading from the config, if the entry has "%message%" in it then it'll map into a MessageComponent if not then it'll map into BaseComponent
Fairly neat
Option A: A phat fuck you to IJ
Option B: rename method to doesntHasHaveNoPermission
Choose option for me, thanks
A, ignore
Understandable
stole this meme :) https://streamable.com/qvmvct
🤣
weak. imagine only having 104758mb of memory
This gives rust programmers the opportunity to shame C developers lol. "Let's say, hypothetically, you were to develop the equivalent computer program algorithm in the Rust programming language, the situation demonstrated in the above "meme" would not have occurred in the first place"
oof why is it so hard for this to just work
yeah seems fine
getName is inherited from HumanEntity, not CommandSender
ah
i thought it is
it's not
player is a commandsender, and a humanentity
but humanentity is not a commandsender
yes
webscraping i see
I know why it's not working, I've just got no clue how to fix it
because technically the program isn't wrong
the thing i hate most cuz its sooooo annoying
technically the javadoc is wrong
nice pig
i cant just get how people have the time to make a webscraping program and debug it lol
just like you do with any other program
@quiet depot OS? 😮
ofc
have u tried it?
so there was no problem?
nah I was just being a bit special
that's hot pig
this shit is so complicated
and memory hungry
with only classes indexed, for javadocs 1.7.10 - 1.16.4, I hit 1.7gb
I wonder how big methods will make it
can't test right now though because I've only implemented methods for the new javadoc type, the html looks different on old javadocs
why not save them in memory for a period of time instead?
aight big boy
yep
I might implement a hard file format for it though
because it takes quite a while for these indexes to actually generate
Spring
i have 16gb ram that windows likes to eat and never give me back when i want it
niall spring can go fuck itself
I can make a setup just as good as spring can, without spring
Such profane language
Ofcourse, in a 25x larger time
with 25x more fun
if only i understood OOP more
Piggy has announced he is taking over Ecloud2 development 🙂
niall how long do you think it'd take you to make this project with spring?
What does it do
scrapes through a javadoc and generates an index on everything
google for javadocs
then provides a json web api
I dont know, spring would handle all the http stuff, json api
Couple hours to implement the actual business logic
docdex > spring
O.o
how are you so good smh
gaby i'm sure you could make something just like this if you put your mind to it
But seriously we need discussions on ecloud 2 because I dont see it going anywhere
?
Was hoping you would back me up using Spring in a project lol 🙂
tbh most of the times the way the project is structured is what confuses me the most @quiet depot
like, the code can be something basic but with all these names and such is difficult xd
which names do you struggle with?
Do you prefer by feature or layer?
I do both
what's bootstrap?
Since nov 18th, and I'm like 30-45% done
How many LoC 🙂
that and other 200 other stuff
gaby better is subjective
I didn't go out of my way to learn how to structure
it just evolved over time
Agree ^
you'll see the same sort of structuring concepts in my projects from years ago
i used a html serialiser package in javascript, AND I HATE IT, it made <p> have a child called text and that contained what i wanted 🤦♂️
took me hours to debug and find out that is the cause of me getting null lol
I'm not finding debugging too bad, my main issue is with the complexity behind the indexing and searching mechanisms
okie dokie
anyone got any suggestions for a better algorithm than levenshtein?
Piggy's algorithm better
cuz with levenshtein, the top one is winning
might just try a ratio instead of a weighted ratio
yeah that works way better
holograms created using HD api are temporarily, right?
yeah
Lmao
it's not even a never ending recursion stackoverflow
there's just too much happening
got another way of implementing this method indexing though that should involve a few less recursions, so hopefully that fixes it
get gud nub
u git gud
Can't, I think I've already fucked this whole project structure again
good on ya
nice
Not really good, but mk
we are just being a supportive community frosty ... smh
haha big nerd
yes
Gaby, :C
Jk bud xd
Did I mention this was the third iterration of the project
third iterration?
Irritation
I love irritations
Ah
no idea
Idk i just use -Syu
¯_(ツ)_/¯
-Sy could get you partial upgrades
yeah -Sy seems to update check too
i just go safe and do -Syu
and i run a dualboot between manjaro cuz i need windows for school :(
what programs do you need it for?
I usually use yay as a wrapper
microsoft office
i could do all this stuff in linux, but what if my teacher says lets use this and i will have to reboot or boot up a windows vm and do it in there
like libreoffice exists but it also messes up converting to ms word format, i once submitted an assignment in linux and i got it back with the checkmark images in the wrong places and stuff
i use manjaro package manager and pamac :)
wine sucks
I would 100% install a virtualization platform instead of use WINE. 100% no doubt
I just docker it all
Good one, lemmo!
hey, i have a core i need made for my server, spending 500+ the code comes with a few other plugins made- anyone intrested?
how do I check if a Material.matchMaterial(STRING) is invalid? (the string)
it'll return null
because .equals() dereferences a null pointer
hence npe
just do a normal null check?
i.e ==
Gotcha
null.equals(obj)
is this some sort of joke
elara.equals("real?")
yes
What if that didn't return a boolean response? :o
It returns a perhaps
Yes
qubit
So this if statement: https://hastebin.com/etipeyilus.kotlin is giving off an NPE
What options.decoration is seeing decorations: []. How can I check if it's value is indeed []?
what
isEmpty...?
@prisma wave what are you using for making the mines? is it just normal changing of blocks or like worldedit api or something
FAWE api to fill a region, it just generates a WE RandomPattern from the different fractions
nice
That's a chocolate
nah limit it to stone, coal and coal block only

File#rename or smtng exist
What

Not what I’m aware of
Or maybe by reflection
But you could just create your own file instance, change the name
Big pp
That's what she said
no it isn't
That’s what she said
Who this aimed at
me
if (pp.size() == Size.SMALL) op.setSize(Size.BIG);
Paper lib be like:
Lol
isSpigotApiGood() { while(true){}return false;}
Pretty simple way to detect if it's paper or not, might just copy this and remove paperlib, since i don't use anything else on this plugin
This is decompiled code from paperlib Frosty
You saw nothing

wrong channel?
Hole shit
Oh god mein eyes
This has made my life so much easier 🥺
Still wish i could add pdm to it
Perhaps
I will donate good code
Has one "downside" though, unless you are using my plugin.yml generation it'll not let you build
I can change this later, but right now it's required
how come?
Wait is this a gradle plugin?
Yeah
Because the way i made it, it'll warn you if you have or not the Main class for it to detect
Not that great, i'll definitely change that later
If you want to try it though id "me.mattstudios.triumph" version "0.1.4"
Needs it to generate the plugin.yml
So can we choose how to add it to the classpath like compileOnly, implementation etc?
Right now it's hardcoded, if it's spigot/paper it'll be compileOnly, if it's libs it'll be implementation
BM wanna see something dumb?
absolutely
Check the description 
I copied your publish stuff and forgot to edit that part before publishing the first version, now it'll be there forever since i can't change it anymore
https://plugins.gradle.org/plugin/me.mattstudios.triumph
ahahahahaha
LmaoI
beautiful
lmfao
wait you cant change it at all?
I don't think so, probably would need to ask for an admin to do it
Lazy
Might ask them on slack
This is valid gradle syntax right?
spigot = "1.16.4", "implementation"
probably
It'd be the same as spigot("1.16.4", "implementation")
Might try doing that then
Could try that too
This dude has been glorifying Lombok countless times now
Yea
@steel heart This works, but .. warning for some reason
hmm
also maybe add like a fast way with
test "1.16.4:implementation"
and if version is undefined use latest, if scope is undefined use implementation
warning for some reason
Literally everything in Gradle
Ikr
Another way could be:
triumph {
implementation {
core = "1.0.9"
cmds = "1.4"
}
compileOnly {
spigot = "1.16.4"
nms = "1.16.4"
}
}
Not a fan of that
Yeah too crowded
That means you have to specify the configuration by default, when it should only be necessary in specific circumstances
Convention over configuration as they say
is gradle better than maven /
yes
Why is everything in gradle a warning 😩
u cant have 2 instances of the same javaplugin

for example if you want to support PAPI placeholders, you need to use PlaceholderAPI's placeholder method.
if you want to support some anticheat you need to figure out conflicts with your plugin and resolve them
etc
😎
me too
i was giving an example
is this its javaplugin class?
he probably used skills later on in the class to prevent conflicts with his plugin
Then it's Skills.getSkills()
?
That class is actually really weird
you can't just instantiate a class and expect your plugin to now provide support for that other plugin. you need to find where the two conflict then fix the conflict
lol yeah matt
its got public (static) properties with getters and apparently he made an instance of the class
Static block
Just... A strange use
it gets called when the class is first loaded
Like a static constructor
@steel heart @prisma wave Fixed, the problem is with kotlin, having the fun spigot and having the property spigot
I wonder why it's not blue 
Yeah
I don't like that one too much
is it also going to have like a paper option if you wanna use the paper jar
Yeah
why would you ever need a scope for the spigot/paper api
shouldn't it always be compileOnly
could be api
Should i keep it like this then?
I do
sure
wait u guys dont relocate spigot?
SOON™️
Aight might go with this
I wonder how i can make it blue, like the relocate fun from shadowJar 
How does World generator work?
Not the generator itself, but how to change the generator when loading a world?
I cannot found anything about it on spigot javadocs :/
true tho
@steel heart Works perfectly now
Just need to remove the required task
oo nice
Changed that too, works fine now noice
Aight, it's published if you wanna use it id "me.mattstudios.triumph" version "0.1.5"
luv u
what's that?
A gradle plugin that makes it easier to get spigot and my libs, plus it has a feature to create plugin.yml for you
oh nice
Hmm that wasn't really the plan, it was supposed to be just my libs, hence the name, i can though i guess
Ah my bad
add cloud pls
and commodore
and minimsg
and the lp api
and papi
and paper mojang api
and paperlib
and bungee api
pornhub api