#development
1 messages ยท Page 100 of 1
^
Doing World#toString() gives ServerLevel[world],
but I can't access WorldProperties#getLevelName()
you cant sprint while eating something
so if someone eats like an apple or something
they will be slowed down slightly you know. mechanics
you know its pretty helpful
to say which error it is
also the itemstack is probably null
you could prob just put a
if (itemStack == null)
return;
``` above the switch case assuming that's your error
that's yikes
Why not make a map which maps the input itemstack to the output, and just use that, or even better there's probably a much cleaner way of doing that
Not really lol
You're gonna have a shit ton of cases which is gonna look horrible, when you could basically do the repeatable logic in a single line
Does deluxechat have an api?
yes
Where do I find it?
https://repo.extendedclip.com/content/repositories/public/
me.clip:deluxechat:1.14.4
you can also get it directly from the jar
Thanks
How do I modify the entitymetadata without having the Entity itself? I only have the EntityID (because the Entity is clientsided)
I need to make it invisible
you can just do ((Entity) player).isOnGround()
it won't change the outcome, all it does is remove the deprecation stuff
(basically the same thing as @SuppressWarnings)
the warning means that the client is the one that controls the value, not the server, so the client will be able to spoof it (also known as GroundSpoof)
unless the client is modified and affects the isOnGround value, it should work fine though
i mean.. unless you want to add a GroundSpoof check into your plugin and make it part anticheat ๐
how server checking if player is on grounf works? location?
If there is a block under the player i think.
it doesn't - the client does
Thanks.
So using it does the same for example xd
sort of but it's more complicated than just checking the block underneath
i mean how to make it check. how anticheats do it
well anticheats make it so that if the client says they're on the ground but the server detects it's not, they're hacking
this won't work for Jona's case (well depends on why he needs it) because it might not be exact because anticheats only have a client-is-not-on-ground check
yea using Entity#isOnGround should work for that
if the client says they're on the ground but the server detects it's not, they're hacking
thats what im asking how antichets detect that its spoofed
Hello guys, I have a question for a guild plugin, is there any develop api for it.
most, if not all paid anticheats are closed source & obfuscated, so I don't know exactly but it checks
but you also have to consider if the player is on a ladder, and remember shifting lets the player go 0.3 blocks off each side, and more factors
nothing 
I heard some guild plugin on spigot that goes on sale for 10 USD, that if you buy it you sometimes can get the code too.
Not sure tho.
In my opinion, such api should be public, the person who bought this plugin asked me to make a plugin that would check if the placed block is in his guild area.
closed source ๐คฎ
lmao. guilds from glare is fully OS. you pay for the support. that's a good deal
yes. If youre talking about Glare's guilds, then I believe there is an api for it
i didn't buy it
๐
Hi there again,
Question of the day:
Class: Main, Problem: Can't get line 46 to 51 to work. (it needs to do when a player joins the vanished player is still hidden)
Second question
Class: Vanish, Problem: Can't get line 52 to 55 to work. (What it needs to do is. When a player is hidden but the other player has permissions to see him let him see him.)
Main: https://paste.helpch.at/yetovevizo.java
Vanish: https://paste.helpch.at/emobejaboh.java
btw in Main make vanished not static (and you should also make it an ArrayList<UUID> for the same reason we changed the HashMap<Player, Location> to a HashMap<UUID, Location>)
static if not used correctly = bad
and the reason why the join listener doesn't work is because: p.hidePlayer(this, p) you're hiding the player from itself ๐ฅฒ
and for the vanish class, canSee returns a boolean which you can use (ex putting in a variable) to see if a player can see another player
you have to use showPlayer
Imma change everything to UUID then
thanks bro!
forget about it, but could you tell me where da part of registering in plugin.yml is? 
It never registers in the plugin.yml
wait a fucking second
I have been searching for 3 hours in your code for nothing?
fuck off

I mean it registers straight to the command map, why would you want it to register to the plugin.yml?
....
why I didnt know about that
then which class does that?

feels bad man
Matt
Use codeblocks for formatting code or configuration files:
```<language name>
<your code here>
```
For example:
```yaml
test:
- โhiโ
- โthereโ
```
Produces:
test:
- โhiโ
- โthereโ```
Did you complete the rewrite of triumphcmds?
The core is basically done, the jda implementation is usable
ahh
I changed it to:
public ArrayList<UUID> getVanished() { return vanished; }```
It's looking really cool though, lots of awesome features
๐ฎ
noice
Btw it uses reflection now right?
@dusky harness
cant wait to see it shining in github 
Can confirm, is usable and awesome
jk
๐ remember when putting adding a player to a list use .add(player.getUniqueId()) instead of .add(player)
It always did ;o
ahhh
It has always been on github lol
Class generation PR??!!!
Class generation? 
Yasss
You have all thats required for routing at compile time with annotations right? ๐ณ
Probably yeah ;o
Assuming I dont procrasticate a lot again, pr incoming
Noice noice
There is a branches button
Fixed that, but still can't see the player
show code and make sure u did the rest of the other stuff i mentioned
all I need to do is just use <CommandMap>.register("name", plugin, and the command?)
commandMap.register(commandName, plugin.getName(), bukkitCommand)
ok, so now I know how to do so, but how I do instantiate the commandMap thing 
You don't instantiate the commandMap
You should go look at the command manager class
I did lmao, just didnt get it at all
so thats it?
just a method and we done?
Anything hasnt been that easy to me lol
Line 55, 94, 241
ohhh thats what I meant
hmm. in JDA, I use EmbedBuilder to create an embed. how do I add a description to the embed and make part of it be a link redirect? like what you'd do in github markdown for example would be [text] (link)
oh. will try it
It fucked it up
I can't unvanish anymore
show code
Vanish class: https://paste.helpch.at/iborinahem.java
Main class: https://paste.helpch.at/pohatamoba.java
It could be the Main class tbh
wait a minute
in onPlayerJoin
you changed it to Bukkit.getOnlinePlayers()
which would probably hide every player
and dont use deprecated
no
you can keep it as Bukkit.getOnlinePlayers() but check if player's uuid is in getVanished()
this better
p.hidePlayer(getPlugin(null), player);
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/entity/Player.html#hidePlayer(org.bukkit.plugin.Plugin,org.bukkit.entity.Player)
notice how the first parameter is Plugin
that means you need to put your plugin/main class as the parameter
declaration: package: org.bukkit.entity, interface: Player
Alright
Can someone help me setup a redis database?
Ok so I got the point of registering commands, now annotations, for getting the values, should I use a processor or directly getting the values?
I'm talking of tons and tons of commands tho
not here my boy #904591268515029032 or #904591269005770762
or #dev-general
Im sorry
dw
@dusky harness
public void onPlayerJoin(PlayerJoinEvent e) {
Player p = e.getPlayer();
for (Player player : Bukkit.getOnlinePlayers()) {
if (getVanished().contains(p.getUniqueId())) {
p.hidePlayer(this, p);
}
}
}
?
no
Omg

remember - the player variable exists too
yeah but it needs to check if the player is in the list
rn you're checking if p is in the list
and there are only UUID stored in the arraylist right?
then you're hiding p from p
.
so I should use player.getuniqueid
in certain locations, yes
it works
I don't care if it doesn't look nice
;s
now I know how to check if there is a player in the arraylist
learned another thing
๐
๐
how would i make my actionbar take priority over a other actionbar?
Anyone have any ideas how to generate a single chunk at a time? inside a void world
what does that even mean?
So basically what i want to have is a void world where it basically creates similar to skyblock islands in a spiral with like 3x3 chunk areas for each team.
I have the spiral down
I believe johni said you helped him with something similar
Yes Emily its like my Spiral Schematic placement you made for me. but he needs 3x3 chunks and I believe mine was 2x2 or 4x4
Yeah basically
uh I most certainly don't remember any specifics but as far as the actual "generate the chunk" part is concerned this method is about as far as it gets really https://papermc.io/javadocs/paper/1.17/org/bukkit/World.html#loadChunk(int,int)
Ok, Ill look into that
I think the issue is right now since im generating a void world, when i generate that chunk its using the same generator
how can i change the generator>
if(p.hasPermission("flipmc.vanish.see")){
p.showPlayer(plugin, p);
} else {
p.hidePlayer(plugin, p);
}
}```
@dusky harness
I seriously don't know anymore
What are you expecting and what's happening?
to me?
Yes
I am trying to get the player with the permission "flipsmc.vanish.see" to see other vanished players
Is that player in the getVanished list?
Are you looping through players with the permission?
Yes
wdym
I did this with a hotels plugin to stop players from seeing each other, and iirc the way i did it was loop through all players with x permission and show B player to all players with x permission then hid them form all players without x permission
the ! implies NOT i.e the opposite of what returns
so if(!true) would actually be false
Yeah
so if they are not in the list that code will run
Thats not how i did it
You could also loop through all online players and do it from there but then you run into issues with when a player joins
so what should I change
Well if you want to check if the player is in the list, then don't use !
Are you sure that plugin.getVanished() even has anything in it?
From the looks of the code, you also changed it is so that it's checking if they don't have permission
also
on line 51-60 you would want to show the player to the player with permission, when you are hding them from everyone else
again, you're saying show p to p
or hide p to p
and you're also checking p's permission
not player's permission
^
you want to check player's permission and hide player from p
tip: rename player to vanished and p to player
might help remove some confusion
and remove the !
dkim do you have any idea how i could take a void world and generate specific chunks with a seperate generator? So like its a void world but the chunk at 0,0 is like a normal chunk
ok
if (!(sender instanceof Player)) {
sender.sendMessage("[FlipsMC] Only For Players");
return true;
}
Yeah also this for example
//If sender IS a player this will evaluate true in parentheses
//THEN, the ! will make it evaluate False
//So what you're actually checking is
//if(sender NOT Player)
if (!(sender instanceof Player)) {
sender.sendMessage("[FlipsMC] Only For Players");
return true;
}```
Oh I see I kinda goofed myself there, but it does make a good example as to what ! does
๐ฅฒ
Kotlin has spoiled me ๐ฉ
for (Player player : Bukkit.getOnlinePlayers()) {
if (player.hasPermission("flipmc.vanish.see")) {
player.showPlayer(plugin, p);
} else {
player.hidePlayer(plugin, p);
}
}
}```
This?
no
rename player to vanished and p to player
Good night and sleep tight

Directly get the value 
yeah I was thinking of that
Ok, so im still quite confused on how to go about this. This time im trying to add something else. I want to have a void world, and starting at (0,0) create like a 2x2 - 5x5 chunk area. For now well say a 3x3. So at (0,0) i want to generate 9 total chunks in a 3x3 with the chunk at (0,0) being the center. and then move out x blocks and do it again to form something like this http://prntscr.com/1z7qmlh. Now inside each chunk i want to have increased or spawn. I was told to use a block populator but i havent seen any decent examples. Any suggestions on how to go about this?
How would you even do that?
Well that's processing
I was saying a Processor but who cares
how would i add a jar as an import in gradle again?
like implementation(files(...))?
is anybody familiar with MongoDB and how to get it running on Java?
I keep getting class not found errors, even though I have all 3 jars that it requires
in my classpath and build.gradle
are you shading it?
or using some dependency management thing that can load the classes into runtime
ummm, idk
cause it seems that they are present during compile time, but not runtime
I just added the compileOnly 'org.mongodb:mongodb-driver:3.12.10' to my build.gradle and put the other 2 .jars in the classpath
how would I load it into runtime?
You need to either shade it into your final jar
or use something like slimjar to download the dependencies at runtime and load into classjar
to shade it in, using the shadow plugin and set your dependencies to be implementation
do I google that to figure it how to do that?
plugins {
id 'com.github.johnrengelman.shadow' version '7.1.0'
}
to add the plugin
then set your dependency implementation 'org.mongodb:mongodb-driver:3.12.10'
then run gradlew shadowJar
like in a terminal?
run the shadowJar task basically
issue still same issue
ye
Paste Services
When asking for help with a config/menu/code issue please use our paste bin:
(we prefer it over pastebin.com)
โข HelpChat Paste - How To Use
wait
I restarted the server
and now it works
it just filled the console with logs
mhm
are you including netty as dependencies?
maven {
url = 'https://jitpack.io'
}
i wouldnt know then
i have no idea what you are doing whatsoever, but find the dependency you need and add it https://mvnrepository.com/artifact/io.netty
and make sure to have mavenCentral() in your repositories
is https://mvnrepository.com/artifact/io.netty a implementation or a compileonly?
oh implementation i see
no no...
you dont add that as a dependency
visit the site, find the artifact you need
click on it
and it will show how to add it
implementation 'io.netty:netty-all:5.0.0.Alpha2'
its working ty
do you know by any chance what dependency/repo i would need to get these errors gone?
the issue is if you are working on a plugin
netty is already included techincally
so you dont need to shade it in
and also this is NMS
you need to run buildtools or run paperclip
and remove the -api part
what is buildtools?
are you using paper api for spigot api?
spigot
The home of Spigot a high performance, no lag customized CraftBukkit Minecraft server API, and BungeeCord, the cloud server proxy.
https://www.spigotmc.org/wiki/buildtools/
once you ran buildtools:
in build.gradle add mavenLocal() in repositories {}
and in dependencies {} find spigot-api and rename that to spigot @formal crane
The home of Spigot a high performance, no lag customized CraftBukkit Minecraft server API, and BungeeCord, the cloud server proxy.
make sure u did compileOnly
before: gradle repositories { // other stuff } dependencies { compileOnly 'org.spigotmc:spigot-api:VERSION-R0.1-SNAPSHOT' }after:```gradle
repositories {
mavenLocal()
// other stuff
}
dependencies {
compileOnly 'org.spigotmc:spigot:VERSION-R0.1-SNAPSHOT'
}
you didn't read the buildtools wiki page, did you?
yea i already released that wasnt right
rn i used java -jar BuildTools.jar --rev 1.12.2
is it normal to take so long building?
what do i do after building it?

spigot = spigot server which includes both api and nms and craftbukkit
buildtools installs spigot (server, not api which is what is normally exposed) into mavenLocal
you add it in your gradle file
which is why u also need to add mavenLocal()
show build.gradle
compileOnly 'org.bukkit:craftbukkit:v1_12_R1' you don't need this
and make sure u finished buildtools
that was really quick
๐
try reloading gradle again
its working ty
nice
implementation 'com.github.LabyMod:labymod-server-api:Tag'
Tag
yea
Does anyone who has made a fabric mod before know how I would add SQLite?
I'm trying to use it with shadowJar, and I get https://paste.helpch.at/wovufonavu.coffeescript.
When I try remapJar, I get Unsupported class file major version 60.
no shadow
include(modImplementation("..."))
shading is one of the worse solutions for including other jars in the classpath
fabric-loom to the rescue 
so if changeRate is a vector of (1, 0, 1), why does this do nothing?
armorStand.setVelocity(changeRate.normalize());
it's an armorstand that I'm riding with no gravity, but I don't get why it doesn't work
the code definitely runs
a sysout next to it works
read the documentation for Vector::normalize()
no gravity as in potentially irrelevantarmorStand.setGravity(false)?
Is the armor stand set as a marker? setMarker(true)
It worked, thanks so much!
I tried both modImplementation and include individually lol
yes
and it's not invis atm
so that doesn't effect anything
Sorry, last question, how would I access the mods folder?
Just Path.of("mods", "mymod")?
FabricLoader.getInstance().getConfigDir().resolve("my-mod-id");
the mods folder should be exclusive to mod files, and their configs in the provided config folder
Thanks
hm, teleporting also doesn't work
for moving my armor stand
I'm so confused
the armor stand is definitely there (no NPEs)
but
it just
doesn't work?
I presume you're running paper/paper fork and not base spigot?
make sure in the paper config armor stand ticking is set to true
ooh
yeah
forgot about that
yup, set to true
;-;
yeah i'm out of ideas lol
;-;
idk what to do lol
nothing works
System.out.println("yo from the armorstand");
armorStand.setVelocity(new Vector(1, 0, 1));
#1 works
you should be able to teleport things though
Oh yeah
Anyone here experienced with labymod api?
no but from what I remember, seems quite straight forward
for (Player vanished : Bukkit.getOnlinePlayers()) {
if (vanished.hasPermission("flipmc.vanish.see")) {
vanished.showPlayer(plugin, player);
} else {
vanished.hidePlayer(plugin, player);
}
}
}```
Would this work then?
because then i was even to tired to find the problem
I has start to work with events (custom) and it is pretty fun to finally understand how bukkit events works/idea behind it. But I has a issue (the event works but I want to add one extra data in the event).
The problem is it only update next time it run the code, if I shall has option to use cancel. Do I have to set up two events (one like more monitor the task some executed and one some you can cancel the event and do your own stuff with)?
You want your own event to be cancellable?
yes and that part work fine, but the problem is (if I not miss something in my code) are I can not put in boolean if it has moved the item (has to done that check later in the code).
Give you the code so you get what I have done https://paste.helpch.at/uvumomikif.coffeescript
I don't know exactly what you want.
Alright was some testings so that was not right code too 100%. whole method
https://paste.helpch.at/meratulihi.java
Alright first of it try add items to a container (teleport items) and if you cancel you can get the item and location it try add item to, look on HopperTeleportListener class part.
I what to add also if it has add the item or if it are still in the hopper to the event, but seams in that case I has to make a new event.
what I mean if it has successful move the item or if it are still in the hopper
hi i am wondering if someone could help or make me a fairly simple plugin
Trying to set my bot's volume when playing music is throwing this: https://paste.helpch.at/izunepizef.rb
This is my command: https://paste.helpch.at/aveqajaqay.cs
player is my AudioPlayer.
It does seem to set the volume tho but currently playing song stops and sometimes the entire queue gets cleared for some reason.
I use JDA + lavaplayer
Looks like you don't have the right opus library / bindings installed or something
for example the player yaw is 45 and how can I get the location of 2 blocks forward and 1 block left of him
yaw of 45 is northwest
Donโt use yaw/pitch but the direction vector instead
I has always have problem when commit a existing project (code changes). github will take whole class when make a small code change and i see this when i commit the change.
Only way i has go around the issue is to use wordpad, but that are not a good way to fix it.
how would I go ahead and make a Class that takes a Type Parameter of an Enum?
I am doing a AnimationSystem which uses a Ressourcepack to replace Unicode Symbols with Pictures which we then use to make Animations.
there will be one class that will be nearly Identical for every single Animation, this class will handle the actual playing of the Animations aka the scheduler and stuff like that.
in order for that System to work I need a reference to an Enum how would I do that?
aka I need a Type parameter which is an enum
thats not what I mean
and its not really helpful
we are making Animations which all need 1 Class which handles the actual Playing of the Animations
and Instead of making that Class for every single Animations, we wanted to make 1 Class which we just give the Enum and the rest works flawlessly
yes
aka AnimationFrame<GameLoadingFrames> animation = new AnimationFrame<>();
GameLoadingFrames being the enum
and then i can animation.start() and all the other methods
the only downside being I will need reflection to access methods inside the Enum
Is there any way to get an entity by ID?
Not UUID
For the packet PacketType.Play.Server.ENTITY_EQUIPMENT, I need to get the player whose armor is being changed
I'm just looping through online players, packets use entity id's not player uuids
entities still have an uuid
you would have to loop through all the entities till you find id of the player you want to modify
The id is anint in this case
That is what I am doing at the moment
i think you might have to loop through all entities till you find the id
Well I just need players, so I guess that's what I'll stick with
Thanks
Hi, can someone please help me and explain me something step by step?
ยป Give the helpers some details
ยป Ask suitable questions
ยป Be polite
ยป Wait
so, I have int stage in class1 and I need to transfer it to the class 2. I heard about getters, but I dont get it
Is there a way to make these shorter?
Bukkit.getServer().getPluginManager().registerEvents(new DamageListener(), this);
Bukkit.getServer().getPluginManager().registerEvents(new DispenseListener(), this);
Bukkit.getServer().getPluginManager().registerEvents(new EntityExplodeListener(), this);
Bukkit.getServer().getPluginManager().registerEvents(new ExplosionListener(), this);
Bukkit.getServer().getPluginManager().registerEvents(new IgniteListener(), this);
Bukkit.getServer().getPluginManager().registerEvents(new PlayerBreakEvent(), this);
Bukkit.getServer().getPluginManager().registerEvents(new PlayerPlaceEvent(), this);
Bukkit.getServer().getPluginManager().registerEvents(new DeathListener(), this);
Bukkit.getServer().getPluginManager().registerEvents(new AsyncChatEvent(), this);
Bukkit.getServer().getPluginManager().registerEvents(new PlayerConnectEvent(), this);```
Stream.of(events here).forEach(listener -> registerEvents(listener, this))
ty
How do I add depenencies when I building a open source plugin?
maven / gradle, there's nothing special, you just have to avoid dependencies from your local maven repo
Yeah I'm using maven and when I build this comes up, I dont know how to resolve it
https://imgur.com/a/e4srOIv
I think you need all this api inside your pom file (but not compile with the plugin).
Hi, guys, what is easiest way to get data from Java stuff (plugin) in another language?
Basically I want to make user profiles on web
you think about database like mysql?
yes I thought just curious if there are some better methods without saving stuff into db
yy
i think no, you need take the data
for optimization instead of mysql it may be redis
To be more specific:
I want to show current data = save data into DB when HTTP request is sent (user search)
How do you currently store data xdd?
Im assuming the plugin is already half written?
nop, didnt start
user data is like playtime, some data from plugins (saved in mongo/postgre) etc
Easiest method would be through a database, otherwise you'd have to allow the plugin/server to accept incoming http requests which I'd guess most hosts deny unless it's a player although I'm not sure on that
Easiest method would be through a database
What database? Redis?
you'd have to allow the plugin/server to accept incoming http requests which I'd guess most hosts deny
Shouldnt be problem on VPS right
Database type is irrelevant, that's your choice so long as it's accessible by a website. As for your last question, I'd do a few google searches, probably depends on your host
I'm sure you can configure the server & its ports for example. Pretty sure votifier does something like this
okay, ty, I just don't understand why it should be problem when website is just HTTP requests
Well you could always try accepting http requests and see where it gets you but id imagine hosts block that
Hey, i am trying to connect to a database (mysql) but it cant connect and i don't know why, this is the class for the database: https://paste.helpch.at/weredepoza.java and this is the main where i connect to it: https://paste.helpch.at/xayovahuna.java
do you have any errors?
and to all try catchs e.printStackTrace(); and show error
Your base link is wrong
You have to do it like that ?user=user&password=password
here MySQL.classconnection = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database + "?useSSL=false", username, password);
it still says not connected for some reason
give error
same one as before
and show your mysql.class now
bro, you need to replace connection = DriverManager.getConnection("jdbc:mysql://" +
host + ":" + port + "/" + database + "?useSSL=false",
username, password); to ?user=user&password=password
the whole thing?
yes
Your link have only host, port, database and usessl
so how is it supposed to connect
like this?
host + ":" + port + "/" + database + "?useSSL=false",
username=username, password=password);```
DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database + "?user=" + username + "&password=" + password);
Should you post your db password @formal crane ?
I recommend you remove that if it your real one
i was gonna change it afterwards
Anyone got an idea how i get the region where the player is in?
rn i tried:
final RegionManager rgm = worldGuard.getRegionManager(loc.getWorld());
final ApplicableRegionSet ars = rgm.getApplicableRegions(loc);
return ars.getRegions();
}```
and to get: `PlotInfoMenu.openGUi(p, getRegions(p.getLocation()));` but it returns a set not a region
but what if a player is in multiple regions
there is a method to check if a flag is active
he is 100% in one region
then ```java
ProtectedRegion[] regions = ars.getRegions().toArray(new ProtectedRegion[0]);
return regions.length == 0 ? null : regions[0];
whats the err?
is bc the method returns boolean
remember that ternarys are:
boolean ? return this if true : return this if false
you get the point
u there lel?
so the point is
you want a region right?
Yes i want to get the region of the player
yea but that didnt work
i understand that
so then give me a sec
you should do it this way:
ProtectedRegion[] regions = <yourregionskekw>.toArray(new ProtectedRegion[0]);
ProtectedRegion playerRegion = regions.length == 0 ? null : regions[0];
or so
so the point is, you have command, for opening GUi right?
yes
ok
then you get the region using dkim code up
store on variable
like
ProtectedRegion region = getRegions(params)
then for checking if player is in region you do the if thing you have
do ur code and if nothing return false and if good return true
basic damn bukkit commands
get it or I need to do a graphic representation?
So like:
ProtectedRegion b = regions.length == 0 ? null : regions[0];
PlotInfoMenu.openGUi(p, b);```
near
the code that dkim gave u is for getting a especific region
ohhhh wait
I'm dumb
you should be good
lol I got confused af
tysm!
noice
Yo, I'm getting an NPE saying Caused by: java.lang.NullPointerException: Cannot invoke "java.util.Map.put(Object, Object)" because "this.data" is null, which is confusing me, since well... this.data = Map<t, UUID> data = new HashMap<>();
I set it even outside the constructor
lowercase t ๐
make it final 
I'm doing this quickly so I can go to sleep lmao
this is why final whenever possible is good smh
I see it's package private, if it's being modified somewhere else then making it final will yield a compile error
Anyone that knows how to get a player skull?
๐
no compile time errors
what line exactly is the npe happening on?
heres the error https://paste.fredthedoggy.me/vj1GBd.md
A hastebin server for Fredthedoggy
uh
well, it's wierd
look at the error
oh wait
it has a line
I'm
dumb
ignore me ._.
I think you need to get the skull meta of the item or block, then set the owner
i tried:
SkullMeta meta = (SkullMeta) skull.getItemMeta();
meta.setOwner(p.getName());
skull.setItemMeta(meta);``` but got a skeleton head
dont really know tho, I havent touched that yet
what version is this on?
1.12.2
uh
I know in 1.12 you have to set the data (I think it's with the durability?), uuh.. idk how that is exactly
oh awesome
probably another me being tired moment, but why does this code:
for(int i = 0; i < entryList.size(); i++) {
Map.Entry<T, ItemStack> entry = entryList.get(i);
GuiItem guiItem = ItemBuilder.from(Material.RED_STAINED_GLASS_PANE).name(MessageUtils.miniMessage("<red>Not Selected</red>")).asGuiItem();
guiItem.setAction(g -> {
g.setCancelled(true);
onChange.accept(entry.getKey(), true);
});
gui.setItem(2 + 3 * i, 2, guiItem);
}
Throw Slot 37 is not valid for the gui type - CHEST and rows - 4!?
the EntryList (an entryset as list), is only 3 items long
maybe 3 * i, i am not sure
3 * 2 = 6
oh okay
order of operations
@pulsar ferry, this is your library 
any clue why I get me.fredthedoggy.mckingscore.triumph.gui.components.exception.GuiException: Slot 37 is not valid for the gui type - CHEST and rows - 4! when running
gui.setItem(2 + 3, 2, guiItem);
```?
doing setItem(10 + 3, guiItem) works
but not that
Isn't that saying that you're trying to access slot 37 on a gui with 36 slots?
If rows = 4 that's 36 slots
If I wanted to allow chat input to change a GUI, for example player clicks button A and types "Test1" button B's name would be "Test1", would I need to store it in a database or can I use hashmaps or something?
exactly
which is an issue
(since I'm not)
What is the size of your map?
the error is thrown when i = 1 however, not the last which is two
also
GuiItem guiItem = ItemBuilder.from(Material.LIME_STAINED_GLASS_PANE).name(MessageUtils.miniMessage("<green>You Selected This</green>")).asGuiItem();
guiItem.setAction(g -> {
g.setCancelled(true);
onChange.accept(data, false);
});
System.out.println("Lime");
System.out.println(10 + (3 * this.data.get(data)));
gui.updateItem(10 + (3 * this.data.get(data)), 2, guiItem);
prints out lime, and 10, but doesn't update the item
Row, column, you have 4 rows but setting on row 5
Oooh
Wrong order then
I thought it was column row 
But that one I found a fix for, it's the update one that's glitchy
What exactly is supposed to change on that item?
Red to green
And the action
And name
Is the slot correct?
is it possible to register a listener after the plugin is enabled
Why not
Any Admins available for a moment?
One your users here Pengwing2df3 has had their account breached and is sending out mass DM's with ransomware links attached.
This has been dealt with
ty
my ServerConnectEvent event isnt being triggered, it is registered in my onEnable, I dont understand the issue. java @EventHandler public void onPlayerJoin(ServerConnectEvent e) { System.out.println("onPlayerJoin triggered"); String type = CustomConfigFile.getConfig().getString("config.join-type"); ProxiedPlayer pp = LobbySystem.getInstance().getProxy().getPlayer(e.getPlayer().getUniqueId()); // DatabaseUtils.initialJoin((Player) e.getPlayer()); ServerInfo sv; if (type.equals("RANDOM")) { sv = LobbySystem.getInstance().getRandomLobby(); } else { sv = LobbySystem.getInstance().getProxy().getServerInfo("LOBBY2"); } System.out.println(ChatColor.AQUA + "[LobbySystem] >> " + ChatColor.GOLD + "New Player Connected. Sending them lobby " + sv.getName()); e.setTarget(sv); }
getProxy().getPluginManager().registerListener(this, new OnPlayerConnect());
thats how I register it ^^
I have that
public class OnPlayerConnect implements Listener {
@EventHandler
public void onPlayerJoin(ServerConnectEvent e) {
System.out.println("onPlayerJoin triggered");
String type = CustomConfigFile.getConfig().getString("config.join-type");
ProxiedPlayer pp = LobbySystem.getInstance().getProxy().getPlayer(e.getPlayer().getUniqueId());
// DatabaseUtils.initialJoin((Player) e.getPlayer());
ServerInfo sv;
if (type.equals("RANDOM")) {
sv = LobbySystem.getInstance().getRandomLobby();
}
else {
sv = LobbySystem.getInstance().getProxy().getServerInfo("LOBBY2");
}
System.out.println(ChatColor.AQUA + "[LobbySystem] >> " + ChatColor.GOLD + "New Player Connected. Sending them lobby " + sv.getName());
e.setTarget(sv);
}
}```
thats the whole class
also put your plugin in to your bungeecord plugin folder
restarted proxy?
duh, and I see the outputs from my onEnable in the console
is there a relatively easy way of modifying string constants of my own project (during/after compile)? I'd use that to create unique placeholders for my plugin name and version, for example, so I don't have to modify them each time I change the version of my plugin
if you're on gradle you can use ReplaceTokens
I've seen someone using gradle to create a class with constants for versio and shit
does that work for compiled classes, or only for resources?
But from what I know, it is not really suggested to use this type of placeholders on the actual code
oh.
What would be the best version to run my lobby on? Or should i just pick the last version (because some of my gamemodes arent on the latest version)
minestom maybe
never heard of it
I mean use whatever. doesn't matter that much. I'd personally probably run latest + via backwards bcz that way I can get all the new blocks for my lobby map
you either run latest with via backwards or oldest with via version
i think i amma put it on 1.12.2
Just latest + disable everything you dont need
Any good APIs for custom items without lots of janky listeners?
Eg. Register an item with an attack consumer
Hm okay, thanks.
If I find nothing I'll just make my own, since this is for a core plugin for smth else
I think it can be shaded now as well
๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก ๐ก
not entirely sure
yeah I know
I feel the same way lol
.
What about EmilyLib ๐
Ah yeah no that's just for enchantments
i dont care
I mean new items from scratch
ah, yeah I don't know of any for that
Okay.
Ig I'll make my own
yes, you will
I'm done jankily adding them all
lol
This is for smth that can't mess up, so I need a more fool-proof way
(Me being the fool)
I already an using mf-commands for foolproofness, and I gotta say it's very nice
Just wait till the rewrite is done
No can do. We're running a test event in like 12 days lol
And I gotta finish the core and a bunch of custom items
And textures
And I'm like... super busy
How do I setup a build tool (maven or gradle, don't have much experience with gradle though) for a decompiled plugin?
Just make a new project, and paste the decompiled code in
You'll need to manually add all the libraries though, as they are not in the jar file
Was just a saying for "it'll get better"
Alright, thanks
To find the libraries I can just look at imports right?
Lots of new features and improvements
And maybe one day, updates are a pain in the ass
Why?
Cool!
The best part is the included tab competition
That's the real reason I did it
Try it and you'll understand
I'm talking about updating gui
Also, is there a good way to stay up to date when the plugin updates? I'm guessing it might be a little annoying since I have to download jar, decompile, and find changes
Yeah, unfortunately that's the only good way iirc
Alright thanks anyways
https://paste.helpch.at/ayewogabex.bash
(Jetbrains Exposed)
Anyone know how to fix this error? :/
DatabaseManager:74: ```kt
transaction(database) { StaffData.findById(player) }
Other code: ```kt
class StaffData(id: EntityID<UUID>) : UUIDEntity(id) {
companion object : UUIDEntityClass<StaffData>(StaffTable)
// code
}
object StaffTable : UUIDTable("staff", "players") {
// code
}
oh wait
nvm
new issue: ```
Caused by: java.sql.SQLSyntaxErrorException: Table 'testing.table' doesn't exist
how do i create a table?
I tried ```kt
SchemaUtils.createMissingTablesAndColumns(StaffTable)
and i couldn't find anything on google about this
nvm new issue
๐
why isn't it in my jar 
where is kotlin.Any??
I had this before I think
I dont think exposed likes kotlin being relocated or smth
java.lang.ClassNotFoundException: org.jetbrains.exposed.dao.id.EntityID ```๐ค (https://paste.helpch.at/xivuzedire.cs)
it's relocated
but why doesn't exposed know that
uhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
but-
wait exposed has a gradle plugin?
btw sorry for ping @robust flower but how far did you get with this?
i might just not relocate
๐ค
val data = transaction(database) { StaffData.findById(player) }
if (data != null) {
transaction {
data.groupsSet = (groups as? Set<String>) ?: groups.toSet()
}
return
}
transaction(database) {
StaffData.new(player) { // this line
groupsSet = (groups as? Set<String>) ?: groups.toSet()
}
}
```anyone know why the line with the comment throws a "Duplicate entry" error?
even though I check (lines 2 - 7) if it contains in the database
Other code: ```kt
class StaffData(id: EntityID<UUID>) : UUIDEntity(id) {
companion object : UUIDEntityClass<StaffData>(StaffTable)
// code
}
object StaffTable : UUIDTable("staff", "players") {
// code
}
How tf do you get so many issues in the first go
If you check the docs it explains everything
yes the docs are so helpful :D
but that doesn't prevent me from getting issues :(
rn if I don't relocate exposed, it works fine
๐คฉ
fixed this by copying and pasting https://github.com/JetBrains/Exposed/issues/167#issuecomment-828549456
Haha "Null-Safe language"
Minecraft 1,8 api repo?
minecraft itself isn't available in any repo as it doesn't have an api
what api do you mean?
compileOnly 'com.destroystokyo.paper:paper-api:1.12.2-R0.1-SNAPSHOT'
This is Paper 1.12.2 API
I want the 1.8.8 one
simply change 1.12.2 to 1.8.8
np
Relocate does break stuff when using Exposed, rn I can't relocate Kotlin when using exposed, and relocating exposed using their gradle plugin only work for the first time you build, all subsequent builds also break really hard
o
The solution unfortunately is just don't use it for when we need to relocate libs
๐ but-
do u know a good alternative?
I tried to find an alternative, ended up just using low level stuff. In my next projects I might test some other jdbc wrapper libs, if I find them I'll send you the link, but for now I recommend you just remove Exposed from your plugin and go raw (low level) or use some jdbc wrapper lib
๐
๐
do u think not relocating would cause issues? ๐ฅบ
ยฏ_(ใ)_/ยฏ
since atm im relocating kotlin but not relocating exposed
the issue is kotlin
but i can safely relocate kotlin
probably
you relocate for a reason lol
๐ฉ
explain ๐
I'm trying to make an entity rotate but It doesn't work:
Location loc = vehicle.getDriverPlace().getLocation().clone();
loc.setYaw(vehicle.getDriverPlace().getLocation().getYaw()+20);
vehicle.getDriverPlace().teleport(loc);```
also my code reach those lines
and also nothing is equal to null
Is there an event on a bow's loading?
How do i check if an itemstack is a tool?
make a set with materials that are tools ๐คท
does someone know about this ? (btw I'm on 1.17)
ok trying rn
how does placerholderapi works? i mean, how can i change a server-side string in client-side
still not working
It works through plugins
not client side
but isnt it still %some_placeholder% in serverside?
for example to add a placeholder support on your plugin you do Player#sendMessage(PlaceholderAPI.parse(mystring))
it is
np
what is the problem
I'm trying to make an entity rotate but .setYaw or teleport or even nms doesn't work
Yaw is left to right, pitch is up/down
^
you can use the ChatColor#stripColors method to remove the colors from your string and then see the length
Hey!
How can I format a number via Vault like 1T or 10B?
try all the vault eco placeholders till you find the one that works
i know one of them does it
ah nice, I see, thanks
atleast an example of how to format a number like you want
I'm experimenting with Arrow KT, and I wanted to do something like kt // example of expected input for string: "10 -55 99" private fun parseLocation(location: String, dungeonName: String): Location? { val args = location.split(' ', limit = 3) if (args.size != 3) { logger.warning("Invalid location '$location' for dungeon '$dungeonName', skipping this location for now") return null } val x = args[0].toIntOrNull().toOption() val y = args[1].toIntOrNull().toOption() val z = args[2].toIntOrNull().toOption() // use x y and z to create a location } everything is fine up to the last line, how can I combine those three options into something (since Applicative got removed)
WHY
anyway
Monads are applicatives still
maybe there isn't liftA2 (or the equivalent) but you can still use flatMap
what is lift? ๐ค
Applicative f => (a -> b -> c) -> f a -> f b -> f c
i assume it's what you were using before
or
the other one
idk arrow
Cap
so I have access to adventure (I'm depending on paper), and I'm wondering what the best way to use add colors to my placeholders is
should I just let the plugin that reads them parse it?
or what
I don't even know from that method signature what that is suppose to do, and I went offline for 3 hours because my net simply died
I ended up discovering Nullable.zip which worked for that case pretty well
I wouldnโt add colors to placeholders, unless itโs inherently part of the placeholder, then do the color yourself.
(Like team colors, or red if dead vs green if alive, etc)
Like with MiniMessage
I'm not the one parsing them
Wdym?
the plugin that I'm giving them to does not parse placeholders with minimessage
so it won't work with just raw minimessage strings
Iโm assuming your using PAPI?
yes
You can parse the color inside the method that provides the placeholders
wait I can return a Component?
You can use the Serializer
yup
I think I've never said this before, but I love when you answer questions like that using Haswell 'cause the code is clean af
How can i clone a chunk from one world to another, ping me if you can help ๐
you have a few options, like the one wither said, the problem is that in a chunk there is around 60k blocks, so u will need to find a way to optimize it or another way that does not take that much power
Yeah, some management some keep track of time i use.
I use a special class, when run little heavier tasks some limit amount Ms it use.
๐ ๐
Yeah I realise that doesn't explain much lol
What were you using before?
liftA2 takes a binary function, and the first 2 arguments wrapped in an Applicative, and then returns an Applicative of the result
Hello,
so I am trying to material from 1 list, so it can't be placed in {x} radius of another material list
@EventHandler
public void on(BlockPlaceEvent e) {
Player player = e.getPlayer();
if (player.hasPermission("antiraidspawner.bypass"))
return;
List<String> materials = (List<String>)getBlocks(player.getLocation().getBlock(), this.antiRaidSpawner.getConfig().getStringList("Prevent-Block-Placement-Near-Blocks-Placing").getInt("block-radius")).stream().map(Block::getType).map(Enum::toString).collect(Collectors.toList());
e.setCancelled(this.antiRaidSpawner.getConfig().getStringList("Prevent-Block-Placement-Near-Blocks-Placed").stream().anyMatch(string -> materials.contains(string.toUpperCase())));
if (e.isCancelled())
this.antiRaidSpawner.getConfig().getStringList("Message").forEach(player::sendMessage);
}
Now the error here that happens is
"The method getInt(String) is undefined for the type List<String>"
and it happens where ".getInt("block-radius")" is
If i remove ".getStringList("Prevent-Block-Placement-Near-Blocks-Placing")" from that line, this will work, but it won't have ability to check for the material that will be placed from that other list (other than already placed blocks/material)
There isnt a getInt() function for a List
What exactly are you trying to do?
im assume your yaml looks something like this:
Prevent-Block-Placement-Near-Blocks-Placing:
block-radius: int
if so
you can grab that block-radius int like:
this.antiRaidSpawner.getConfig().getInt("Prevent-Block-Placement-Near-Blocks-Placing.block-radius");
it should look like this (it already looks like this but i can't seem to add the "Prevent-Block-Placement-Near-Blocks-Placing" list, i have some other lists)
<...>
Block-Radius: 4
<...>
Prevent-Block-Placement-Near-Blocks-Placing:
- "MOB_SPAWNER"
- "STONE"
- <...>
<...>
yes i know that, the thing is that i am not trying to do that
then what i can use if i want to put number, for block-radius, it can't be anything else than integer, i mean it can be double/float but i assume that too isn't possible for a list?
I have 2 lists, which you can edit in config
Prevent-Block-Placement-Near-Blocks-Placed
``````yml
Prevent-Block-Placement-Near-Blocks-Placing
Everything you put in
"Prevent-Block-Placement-Near-Blocks-Placing",
will be prevented/restricted from placement in
"block-radius" value (of blocks)
but only if you are trying to place a material from that list, near to a block from
"Prevent-Block-Placement-Near-Blocks-Placed" list
Example:
block-radius: 5
Prevent-Block-Placement-Near-Blocks-Placing:
- "PISTON"
Prevent-Block-Placement-Near-Blocks-Placed:
- "MOB_SPAWNER"
So this will make that you can't place PISTON near MOB SPAWNER, in the radius of 5 from MOB SPAWNER
I see, so u want to get blocks in a radius, check if its the specified block then cancel the place event? @floral beacon
yes
both blocks found from different lists
So u want 2 separate String Lists
Not all in 1
then compare when the right conditions are met
List<String> materials = (List<String>)getBlocks(player.getLocation().getBlock(), this.antiRaidSpawner.getConfig().getStringList("Prevent-Block-Placement-Near-Blocks-Placing").getInt("block-radius")).stream().map(Block::getType).map(Enum::toString).collect(Collectors.toList());
I have no clue what you're trying to accomplish with this line thou
Pseudo:
on place
grab placed and placing lists
grab the nearby blocks, check if that list has a block thats in the placed list, if not return
check if the placing block is in the placing list, if not return.
cancel
I might be forgetting something but thats the general idea
what is your getBlocks() function
What i can gather is you give it a block and a radius and it grabs the blocks around?
Given by a string list
(Just gathering information for other people to help as well)
If its getBlocks(Block, int) then you putting getStringList() there doesnt make sense unless you .size(); it
which wont make sense for the thing youre trying to do
separate getBlocks and .getStringList("Prevent-Block-Placement-Near-Blocks-Placing")
then compare the strings in a loop or something
(If im understanding this properly)
If im not please say what im doing wrong lmao
Does the speed potion effect player velocity?
ok sorry i was trying something out
List<String> materials = (List<String>)getBlocks(player.getLocation().getBlock(), this.antiRaidSpawner.getConfig().getStringList("Prevent-Block-Placement-Near-Blocks-Placing").getInt("block-radius")).stream().map(Block::getType).map(Enum::toString).collect(Collectors.toList());I have no clue what you're trying to accomplish with this line thou
A string list that contains all placing blocks
Pseudo:
on place
grab placed and placing lists
grab the nearby blocks, check if that list has a block thats in the placed list, if not return
check if the placing block is in the placing list, if not return.
cancel
-on place
-grab placing block list and block-radius size in which they can't be placed near placed block list
-if a player placed a block from placing block list list in a block-radius of placed block list block, it will cancel
what is your getBlocks() function
below the code i've sent above:
private Set<Block> getBlocks(Block start, int radius) {
if (radius < 0)
return Sets.newHashSetWithExpectedSize(0);
int iterations = radius * 2 + 1;
Set<Block> blocks = Sets.newHashSetWithExpectedSize(iterations * iterations * iterations);
for (int x = -radius; x <= radius; x++) {
for (int y = -radius; y <= radius; y++) {
for (int z = -radius; z <= radius; z++)
blocks.add(start.getRelative(x, y, z));
}
}
return blocks;
}
Alr we can start by removing getStringList("Prevent-Block-Placement-Near-Blocks-Placing") as that with getInt() doesnt make sense
that'll fix the function
the part with getBlocks, ok i know that i can't put getStringList before getInt, but i don't understand how to make it that it checks placing list
now you need to grab the placing blocks from the config
then compare lists
but i don't understand how to make it that it checks placing list
You got to do it manually with a for loop
or idk if lists has a compare function
but you can see the java docs
how do you exactly mean here to compare them
for (String string : placed) {
for (String string2 : placing) {
if (string == string2) // pass
else continue;
}
}
if all continue then return;
if pass then cancel event
You can always try
yes but why comparing if placing list has placed list, i need to check if Prevent-Block-Placement-Near-Blocks-Placing has for example PISTON, if it has, and that piston is placed near Prevent-Block-Placement-Near-Blocks-Placed that has for example STONE, a player won't be able to place piston near the stone
As far as you worded it, thats exactly how you want this to go, just with spawners and things listed
i will, can you explain why?
how to do so
When loading from config
Add objects to an enumset
And such
I'm not here to code for you
?learn-java
Online Courses:
Online courses are also great for learning java. Some websites that offer them are:
- Coursera - Free unless you want a certificate
- PluralSight - Great courses from what I've seen. Mostly Paid
- Udemy - Never used them myself but they seem to all or at least most be paid.
My first ever course was one from Coursera. - I can say it was pretty good at introducing me to the programming world as a whole not just java.
Oracle Docs:
Oracle docs can help a lot at learning and understanding java:
- Start with this,
- Breeze through this (skipping stuff that doesn't seem relevant like bitwise operators),
- Hit this.
They're the first three from this larger thing which you should definitely go through overall. But those three should be enough for slightly better understanding of what is happening here without feeling like a huge time sink.
That one is a small part of this larger site wherein "Essential Java Classes" and "Collections" also have good useful stuff
Other services:
Some other cool services that will help you learn java are:
As you can see there are plenty of good ways to learn as long as you're willing to invest the time. Have fun learning!
Can someone help me with GSON for java?
I have this list of Users
and I want to get all the playernames
[
{
"playerUUID": "00771abe-246a-46b9-80e2-e7232a8e1b96",
"PlayerName": "_D2TZ",
"reason": "Kill Aura",
"proof": "No Proof Added",
"ID": 18114
},
{
"playerUUID": "bbb460c4-bcaf-4444-9a7a-7b7c12c5b941",
"PlayerName": "_DITZ",
"reason": "Kill Aura",
"proof": "No Proof Added",
"ID": 50791
},
{
"playerUUID": "bbb460c4-bcaf-4444-9a7a-7b7c12c5b941",
"PlayerName": "_DITZ",
"reason": "X-Ray",
"proof": "e",
"ID": 44358
}
]
So why donโt you just map your list of users into a string holder
Did you not make this yourself?
I mean have you even tried anything yet?
Tried filtering
But that didnt work
I was using this before, and "something" is because I don't remember the exact method names kt Option.applicative().something(option1, option2, option3).something { o1, o2, o3 -> // enters only is all three Option (Maybe) are Some (Just), else don't do anything }
Get the entire thing, then just get that attribute
Can't remember what the actual methods are called, but I'm sure there's a tutorial somewhere
right so that's basically liftA3 but backwards, in haskell it's the function first
anyway
for a monad you can replicate it with flatMap although it's not quite as elegant
When I print that array out all i get is this
[12:49:13 INFO]: [me.justplugins.ultimatestaff.Modules.Configs.Reports.Reports@38d01e8c, me.justplugins.ultimatestaff.Modules.Configs.Reports.Reports@11b05f1]
I have no clue how to get it
public static void getPlayers() throws IOException {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
File file = new File(plugin.getDataFolder().getAbsolutePath() + "/Reports.json" );
Reader reader = new FileReader(file);
Reports[] n = gson.fromJson(reader, Reports[].class);
System.out.println(Arrays.toString(n));
}
I see, so lift is basically used to use the value of multiple monads only if all of them are not empty, basically?
Lift works on applicatives, not monads but yeah effectively
It's more abstract than that really
but in the context of optional / Maybe, then yeah
It's the same as a.flatMap { a1 -> b.flatMap { b1 -> c.flatMap { c1 -> f(a1, b1, c1) }}}
that looks interesting
Indeed
However this is gross because it's a more specific abstraction for a more general task
Option.applicative().tupled(profileService(), phoneService(), addressService()).fix()
Found that on arrow docs
Actually map is probably better
Option.applicative().map(profileService(), phoneService(), addressService(), { (name, phone, addresses) ->
Profile(name, phone, addresses)
})
Vs liftA3 Profile profileService phoneService addressService
Anyway
Idk what the point of that was
they removed the Option.applicative() entirely with release 1.0

