#development
1 messages Β· Page 28 of 1
all g
chatgpt makes me feel like these 2 emotes at the same time: π π
Hey..I have an issue with GSON.... This is a plugin which is developed for another person...
Basically, the issue is with saving an object to JSON with GSON. Its working perfectly fine with in my test server and even my localhosted test server. But when its been used on the clients server GSON is not completing the serialization
Its returning breaking after like this
{"arenaName":"Lush","playerCount":8,"pitPoints":[{"spawnA":{"world":"lobby","x":1.1687046246131196,"y":65.0,"z":0.9998267892427433
while the intended output is something like this https://pastes.dev/n4i3ZhPbHa. Code's relevant to this are
Gson Instance
GSON_INSTANCE = new GsonBuilder()
.registerTypeAdapter(Location.class, new LocationSerializer())
.setPrettyPrinting()
.create();
Saving part
FileWriter writer = null;
try {
writer = new FileWriter(file);
Bootstrap.gsonInstance().toJson(this, GladiatorArena.class, writer);
Bootstrap.instance().getLogger().info("Successfully wrote "+getArenaName()+ " data to "+fileName);
}catch (Exception e){
Bootstrap.instance().getLogger().severe("Failed to save file, Arena - "+getArenaName());
e.printStackTrace();
}finally {
if(writer != null){
try {
writer.flush();
writer.close();
} catch (IOException e) {
Bootstrap.instance().getLogger().severe("Failed to close the file file, Arena - "+getArenaName());
e.printStackTrace();
}
}
Bootstrap.instance().getLogger().info("Save has been completed!");
}
you cant serialize locations with Gson by default
it'll stackoverflow bc Location -> World -> a million other references
make a custom adapter for Location
also please use try-with-resources
oh yeah lol
It was initally used...I changed it as part of debug
This is the console output
show the code for GladiatorArena and LocationSerializer
try(FileWriter writer = new FileWriter(Bootstrap.instance().getDataFolder()+ File.separator+"arenas"+ File.separator+fileName)){
Bootstrap.gsonInstance().toJson(this, GladiatorArena.class, writer);
Bootstrap.instance().getLogger().info("Succesfully wrote "+getArenaName()+ "data to "+fileName);
}catch (Exception e){
``` This was the the original way. It is working for me and it was working for the client when we tested it on his server...But not anymore
Sure..Give me a moment
https://pastes.dev/UAIYLUpZoh -> GladiatorArena
https://pastes.dev/W2HUqHVVF5 -> LocationSerializer
ah
you're using CF
there is almost certainly some exception being thrown that the future is supressing
given that you dont actually need the result, you may as well use the bukkitscheduler instead of CompletableFutures
Let me try...But I changed it to CF today..the client had problems yesterday itself..
Yeah, Seeing the caller method i too sense it
Ig, I did 2 CF's. 1 from the caller method and called saveAsync
CompletableFuture.runAsync(new Runnable() {
@Override
public void run() {
save()
}
});
Something like this, So even if the save method errors out. The runAsync wouldn't throw it out
Let me give it a try
it'll be the same thing even with 1 future
they suppress exceptions by design
save is throwing an exception yes
Yeah, but till the previous version i didn't had the saveAsync method, And forgot about the runAsync and was try to figure out y Gson is not throwing any errors out...
Let me check it out with him
You won π
Another doubt regarding the newly found exception
Caused by: java.lang.NoSuchMethodError: 'com.google.gson.stream.JsonWriter com.google.gson.stream.JsonWriter.value(float)'
Y does this doesn't throw on my test servers and only throws on his server? Version mismatch?
I have relocated it
and shade?
thats what i am checking right now
well if not it's pointless to relocate lol
<relocation>
<pattern>com.google.json</pattern>
<shadedPattern>io.github.alenalex.gladiator.shaded.gson</shadedPattern>
</relocation>
This should do the shading right?
doesn't minecraft include gson already?
Ye it does.
Yes, But that did brought up issues.. So I added the latest version..
to make sure...
Can some one point this out..Whether realocating would really shade it?
Relocating just changes the package it shades under.
and it was freaking typo
instead of gson, i shaded json
π
I hate my life π
Could you explain the difference between both... or prolly link me up a good doc?
Relocation is the same thing as shading, you just shade it under a different package name.
relocating technically doesn't require shading, although there are very little use cases for relocating without shading
shading includes a dependency (such as GSON) inside your JAR
relocating changes that package to a different one to prevent any conflicts if another plugin (or in this case, the server itself) shaded it too since if it's shaded twice, it could cause issues
So, in this case, I did reallocated the gson, but the typo messed up
They're not technically the same thing but you can't relocate without shading
You can shade without relocating though
you can't?
π€
or at least with gradle
Well of course not lol
why?
What is there to relocate if the classes aren't in your jar
like lets say craftbukkit had an internal dependency that it relocated
you could use that dependency by relocating your own code
That's pretty bad though
but im saying that it's probably possible Β―_(γ)_/Β―
idk with maven though
since maven says shadedPattern
which is either a little misleading or shading is required
I prefer the 100 IQ route of just copying and pasting classes from libraries into my own src so I don't need the whole jar.
Won't be possible for large library π
Oh that was a joke, sorry.
I am bad at that..nvm me...Just continue
You really shouldn't need to relocate gson unless you're trying to use a method in a newer version of gson that isn't in the version of gson in the server jar.
you can programmatically detect sarcasm
Yeah...apparently i am using a newer method, and that was actually the problem
π
I did
because it is
"no language or tone that suggests irony or mockery"
dumb bot
yeah dude it's gonna take our jobs!!
i could beat chatgpt in a fight
bare knuckle
Nah man, chatgpt would knock you out in 2 rounds, bet
Another matter, Does anyone know any good packet based library for making a player glow... The bukkit impl won't work.. as I may need to glow them for individual players...
It'd be really cool to be able to fine tune gpt3 or something like that for Minecraft / HelpChat related things that we could integrate into Barry.
They didn't even release a public api for it yet... and they safeguarded the current communication pipeline with Cloudflare... So not anytime soon ig
Tuning GPT3 for minecraft seems like fun... iirc, we can send in our own models to them to train right?
Any idea why gradle cant find any dependencies once I add the java-library plugin and use api()?
Make AI build minecraft buildings for you? No more paying builders π
looks like it wants me to define the repositories to the highest parent project
I was more so thinking we train it ourselves so we don't have to pay them to.
I feel like that'd be very very difficult since you'd have to tell it how minecraft works, how java errors work, how the plugins work, how its configurations work, etc etc etc
if you want to use AI
I mean GPT3 has a very broad understanding of that.
I was more so thinking of training it on how DeluxeMenus works so if people asked a question it could give them config examples, idk.
_ _
Pterodactyl for example basically doesn't need a support team anymore because of its autoresponses (which doesn't use AI - or at least it doesn't need an AI)
also can read images iirc (probably using OCR) which is pretty cool
yeah it's pretty neat
throw an error in the discord server and like 99% chance they've included an autoresponse
super super helpful
I've helped server owners by just copying their error messages and putting it in that server lol
Ahh so probably just a ton of regex checks?
probably even just String#contains would work
"AI" is just a bunch of if statements anyway
I mean Barry does some of that, but it isn't trained on a lot.
@mental cypress it doesn't answer questions
it answers error messages mostly
I think
Ahh
yeah but it must've taken a lot of time to make
π
since it covers like every single issue relating to the panel and wings (wings I think is like the web UI)
at least from what I've seen
We do have a handful of questions that are typically asked a lot
https://i.imgur.com/1MemBIj.png
oh I know Barry has a system similar to this
i hate cors
i was using flask api a while ago and any error fails preflight response with no headers found
but i guess thats a flask problem and not a js problem
I can't say too much since I barely look in #general-plugins / #1007620980627230730 but I feel like ptero has it a lot easier since most of the issues have some sort of error message whereas with deluxemenus (as an example) it's more like "how do I do this"
_ _
I've added a (mostly successful, sort of small though) system in a server where it would remove words like "how", "why", "the", "a", etc and search for keywords
it's been a while so I don't remember exactly what I did
but it seemed to answer a lot of questions without other people having to answer
(And I just got the questions by looking in the chat log and searching for "how", "why", etc)
When we mean βAIβ here, are you talking about Barry just having a bunch of IF statements for if message contains X and Y, send this message?
training implies a DNN
I think Barry just uses if statements
xD really
i think it can do a couple other stuff but i dont remember
See I think when most say βX has AIβ, it makes it seem like itβs got a bunch of complicated stuff. When actually the majority of them are just IFs.
Especially as I thought AI requires a good GPU to train with
oh Glare if you're still here
suggestion - make it detect leaked plugins
π
and alert in like staff chat
unless it already does
probably does
unless staff examine every log
since they've banned people with leaked plugins many times
barry probably detects it
i need help it doesnt load my plugin
the "bot" is just pings all the staff and they race to come up with an immediate response xD
i need help it doesnt load my plugin
how can i send plugin?
well is it a problem with your own plugin or someone elses
my own
whats the error in console, there likely is one
?help
Β» Give the helpers some details
Β» Ask suitable questions
Β» Be polite
Β» Wait
there is no error my plugin is not there
well there's two possibilities
- you didnt put the plugin in the plugins folder
- there is an error, its at the very top
i put it in plugin folder
did you reboot the server
- it's not a jar xD
there is always an error if it's a jar file and it's in the plugins folder
im really just riding the copium that it is a jar
its a jar
Then there's an error at the top of your server if you rebooted it and there's a problem with the plugin
paste the console log?
the drive file is locked access
nice
thank you
someone knowes why that dont work: package listtener;
import Drache.de;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChatEvent;
public class ChatListener implements Listener {
@EventHandler
public void onPlayerChat (PlayerChatEvent event){
Player player = event.getPlayer();
de.INSTANCE.sendtoDiscord(player.getDisplayName() + event.getMessage());
}
}
Use codeblocks for formatting code or configuration files:
```<language name>
<your code here>
```
For example:
```yaml
test:
- βhiβ
- βthereβ
```
Produces:
test:
- βhiβ
- βthereβ```
?paste
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
Send the code of the main class
i forgot to register im so lost
Use codeblocks for formatting code or configuration files:
```<language name>
<your code here>
```
For example:
```yaml
test:
- βhiβ
- βthereβ
```
Produces:
test:
- βhiβ
- βthereβ```
Is there a packet for when player clicks a message?
We have a chat plugin (close sourced), and you can define some parts of the message clickable, which execute a command, suggests a message, etc.
I want to capture the clicked message part and see which part they clicked on.
(There's no API for this, I checked).
no
the handling of clickEvents are done entirely clientside
for chat at least
but
what you can do, is have a different click event for different parts of the message, for example, each letter
then the command will be unique depending on which character was clicked
how to make an embbenge massage with webhock in java plugin
what's embbenge and webhock
embed and webhooks probably
How would I get an event to message a certain perm on luck perms only with the mewssage
would like a little help in reminding me on where I downloaded mvn
like this? @EventHandler
public void onPlayerChat (PlayerChatEvent event){
Player player = event.getPlayer();
if (event.getMessage().equals("test")){
if (player.hasPermission("luckperms.tes.ka")){
player.performCommand("test");
}
}
}
}
yes tysm
no problem
what is the tes.ka
so the role is named tes.ka?
the permission is named luckperms.test.ka
so thats the name of the group?
of the perm
like how would i make it if i wanted the role to be called ref
when player??? has permisson luckperms.test.ka and sends measge test then ...
Huh
@dusky harness is there a way to change the public/priv key of the oracle cloud instance? cause it aint worky anymore
Yea
Idk how
But you can
I did it bc i changed my key to no password a while ago
github actions help
this isnt related to mc plugins, but its still development-ish
im trying to run a command from a directory that needs to have a wild card in it
but it just no work!!!! it say no file exist and idk why :(
https://github.com/srnyx/modpack/actions/runs/3783980343/jobs/6432924931
"cd QOL/1.19.*"
"../../Tools/backend/packwiz.exe modrinth export"
"../../Tools/backend/packwiz.exe curseforge export"
shell: /usr/bin/bash -e {0}
/home/runner/work/_temp/cc4db707-b4e4-4d37-a71c-e73b59948049.sh: line 1: cd QOL/1.19.*: No such file or directory
Error: Process completed with exit code 127.```
according to this: https://stackoverflow.com/questions/58139175
cd should work, but it doesnt (above)
i also tried using working-directory, but it said basically the same thing (https://github.com/srnyx/modpack/actions/runs/3783936374/jobs/6432853619)
alright
in Intellij maven-compiler-plugin and are not loading in maven
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>16</source>
<target>16</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>``` worked before I had to rebuild my OS
figured out what was missing I copied the .m2 folder from old drive
wdym :(
wings is the backend stuff that the panel connects to
oh
π₯²
wait what
mhm
Noo lol
without wings you couldn't like... host any servers
the panel is just a gateway to interact with wings
wings is the file managing API, the console API, etc etc
it manages docker
and is written in GoLang
ohhh did i get it reversed
No, the panel is required too
to like... manage the node
and stuff
and interact with the server
all the good stuff
wait so what does panel do besides provide a web interface
it manages everything
user accounts, servers, nodes, databases, etc etc
it ties everything together
wings stores nothing but the docker container
because you can use one panel with many nodes?
most hosts don't run their panel on a node
they run it in AWS or smth
Yes
Most people refer to "wings" as nodes though
i had it completely mixed up π₯² π₯²
anyone know how to fix this?
try escaping the * with backslash
besides that idk
99% sure that won't work
but
i wanted to reply with an attempt
Ask ChatGPT, that sounds like something it is meant for solving
and it sounds like a fun way to mess with ChatGPT lol
ChatGPT π
HelpChat #development π
the last i experience i had with chatgpt was not great... but ill try
Oh make a new conversation
and you can ask it nicely not to repeat stuff, or say I already did that, any other ideas?
wow it even names the conversation using the ai
it does? wild
Yeah that's a recent change
And you can now go back and continue older conversations
it did something at least
100% better than helpchat #development 
i even asked if it could turn QOL/1.19.* into an input variable and it did, flawlessly 
no more human interaction woohoo!!!!!
D:
omg barry im sorry please forgive me im so sorry barry please π
barry please i will spam in all caps all the time so u can always have something to do please please please
This message is powered by BarryGPT
RIP original barry
I need to make a kits pvp server on minehut with a discod server and a tebex store /buy will give more info need somone who is willing to vc and i will pay 30 dollars when the server is completed i want something similar to kitscrazy.minehut.gg or kitswars.minehut.gg but it will be a little diffrent please dm if ur intrested
what dose tha tmean
It means you need to ask in that channel. To make a formal request.
Make sure you follow the correct format.
omg i literally broke chatgpt:
An error occurred. Either the engine you requested does not exist or there was another issue processing your request. If this issue persists please contact us through our help center at help.openai.com.
bro it literally cant answer my question how did i break it lol
me when chatgpt is literally more helpful and direct than the wiki π
Well, wikis are meant to be more thorough and informative. You look for the answer yourself. When it comes to CGPT, you ask a question, you get an answer
Thatβs just due to high traffic it happens
Very neat AI though
Does Configurate offer an option to retrieve the content of profiles in this example (Preferrably as a own configuration node)?
https://paste.helpch.at/yoxibadubo.yaml
Idk what I could use... Would a getList(ConfigurationNode) already do the trick?
someone should implement chatgpt into their wiki to easily find answers to their questions
Hello, I'm downloading the DeluxeMenus plugin from the Spigotmc page, but when I start the server, the plugin doesn't create a config folder. Am I doing something wrong?
oh sorry thx
i need help my plugin is marked red and send error when i make /pl or use it
thats cause its in a disabled state
what does the console say when its attempting to load the plugin?
the error stack trace
ok
are you going to give the error?
we cant help if we dont know whats wrong
Hey! I've made a font changer for usernames using PlaceholderAPI and everything works but whenever someone has 2 of the same letters (lowercase or uppercase) ex. Ixccyy it returns this: https://gyazo.com/753c466b30018d8326bd6025a32ac6e9
How would I fix this?
Code: https://paste.helpch.at/ihiwebatub.js
id say try using replaceAll instead of replace
tho tbh with you id for loop through the string, use a switch case for each char and then manually set each character of said string
https://gyazo.com/acbc880ffddda2c658d638d6338c60d6 replaceAll doesn't seem to work, it doesn't replace the text.
interesting
is that javascript
it is
replaceAll according to google returns a string
it returns a value, pretty sure
ok, and then also are you sure this function is being called xD
it functions fine to me, no idea whats wrong with their version of it
unless the js engine used for the javascript expansion doesnt allow for replaceAll
what i mean is
im looking at the screenshot there, and it seems like the return value isnt stored or used anywhere
displayname();
thats the correct format for the js expansion
im not sure i understand it
it was working before i told them to try replaceall instead of just replace
also it doesnt solve the issue
Oh is this JS Expansion stuff? My bad I didn't see that, you had the right channel in the first place, but I guess sometimes it never hurts to ask here if you don't get a response after awhile. My apologies Heklo π
yeah wortyhax did
Ope, well apologies to the person who posted it.
I did not sleep last night, a little out of it. I'll be on my way now.
night
doesnt replace() and replaceAll() basically just forloop over the entire thing or something
i remember replaceAll having some quirks, i don't remember though
Idk about js but in Java, replacrall uses regex while replace doesnt
currently if 2 chars of the same type get turned into 1 of the new type
aa,AA,aA,Aa -> α΄ but it should result in α΄α΄
it is the +
If you want each character to be replaced separately, remove the +
ive never used regex before so i was basically useless in this conversation
go back to using replace and remove the + from the regex
I thought that nothing was replacing at all
it did replace with replace() but not with replaceAll()
wait, replaceAll should be used otherwise itll only replace the first instance of it right
No
i thought it would but no
replace() replaces all instances
The names are very misleading
replaceAll() isnt a function and replace() is what id assume replaceAll() did
very weird
or atleast replaceAll() doesnt work with the js expansion
Js has a separate regex "type"
maybe its a web only kinda thing
So it doesn't need replaceAll
hmm
very complicated
js in a whole is just complicated, shit that shouldnt work in any other language does
Think of replaceAll as replaceRegex
Eh
Kotlin does something similar
String#toRegex
Doesn't have a built in type tho

function test()
{
var name = "Hekelo"
.replace("e","3")
return name;
}
produces:
H3kelo
i think it does that only when aa string/char is given
as opposed to what other input
oh i understand
replaceAll() is probably what would work in the case of a string/char and not regex being used as the thing to be replaced with
its the g
god trying to explain this is hard
this should work
that works nice for me
Thank you very much, works! π
Let me introduce you to the string expansion
π
https://github.com/BlitzOffline/StringExpansion
%string_replaceCharacters_<configuration>_<string>%- Replace certain characters in a string as defined in config
Hey guys! Im trying to the the sendBlockChange event which is working fine and only the player who it is sending to can see the change block but is it possible to hide the block for that player as well?
by hide did u mean returning the block back to the original type?
I already have it return to the original block but i need it have the functionality of that block it is changed to but display as air
am bit confused π
atm im using vines to allow a player to climb but i want the vines to be invisible
π₯²
Does gradle not like when multiple projects define a subprojects { } configuration?
I use it on the main build.gradle to pass the version to the other projects and add some repos (maven central, paper, spigot, etc). Then I have two secondary projects which then contain other sub projects. On these secondary projects I have again a subprojects { } configuration to add more dependencies and repositories.
The structure looks like this:
main build.gradle
project A
- sub A.1
- sub A.2
project B
- sub B.1
- sub B.2
For more context, I create some custom enchants for a customer using multiple plugins (projects A and B) and then each sub projects of these two represent an enchantment
You should look into the version catalog and convention plugins, it'll change your life
okay, I will try
player.sendBlockChange(aboveOpp.getLocation(), Material.VINE.createBlockData());
How can i change this to be air with a block tag of climbable
afaik the block tags are client side or they are hardcoded to the material type of the block so it would be impossible to do so
damn :/
any idea how i can add an nbt to the vines so i can remove the texture with a resource pack?
otherwise people wouldve made cool swim through air plugins
like custom_model_data or something
How is it going?
Thats a tomorrow job

I was thinking of allowing a command which the format is /ar set %player_name% 5h to run from console, when I try to run it I get an error. https://paste.helpch.at/oviwatoluz.makefile
ClassCastException, pretty straight forward, you are doing a Player cast without checking the sender type first.
chatgpt gave deprecated methods
what they should do is update the wiki to be simply told like chatgpt does, while replacing the old info with latest info
im working on a 1.17 server plugin and i am trying to trick players game client into seeing another player as if they were in spectator mode (i am doing this so i can remove thier hitbox) ive looked thru protocol lib and only managed to find a game packet that would update a players game mode but not something that could change the player entity data of another player to make them look like a spectator any suggestions on how i can achieve this effect i am intending to use this in pvp zones in combination with scoreboard team visibility to stop bodyblocking
how i give an item an atriobbut that dont work: AttributeModifier AttackSpeed = new AttributeModifier(UUID.randomUUID(), "generic.attackSpeed", 2, AttributeModifier.Operation.ADD_NUMBER); item.getItemMeta().addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED, AttackSpeed);
try listening to all clientbound packets of one player, and on another client go near them and switch to spectator mode
then you can see how the game itself handles that, and replicate it
can use protocollib to help with that
You are trying to add an attribute modifier to an item?
yes
I think this will suit you:
AttributeModifier attackSpeedModifier = new AttributeModifier(UUID.randomUUID(), "generic.attackSpeed", 2, AttributeModifier.Operation.ADD_NUMBER);
ItemMeta meta = item.getItemMeta();
meta.addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED, attackSpeedModifier);
item.setItemMeta(meta);
ok thanks
Let me know if it works!
No problem!
how do i make when the lore of item is Β§4God I than it dont get damge?
Only if the lore of the item contains the string Β§4God?
yes
Want me to do it with the one I gave you above or in a different one?
above
AttributeModifier attackSpeedModifier = new AttributeModifier(UUID.randomUUID(), "generic.attackSpeed", 2, AttributeModifier.Operation.ADD_NUMBER);
ItemMeta meta = item.getItemMeta();
List<String> lore = meta.getLore();
if (lore != null && lore.contains("Β§4God")) {
meta.setUnbreakable(true);
}
meta.addAttributeModifier(Attribute.GENERIC_ATTACK_SPEED, attackSpeedModifier);
item.setItemMeta(meta);
this is not working ItemMeta meta = item.getItemMeta(); List<String> lore = meta.getLore(); if (lore != null && lore.contains("Β§4God IΒ§r")) { if(player.getLevel() > 4){ if (player.isSneaking()){ player.launchProjectile(Fireball.class).setDirection(player.getEyeLocation().getDirection()); player.setLevel(player.getLevel() - 5); } } }
Imported the ItemMeta and Fireball classes?
i have
Any errors at all?
no
You sure the item has the correct lore?
The code you provided checks that the player's level is greater than 4 and that the player is sneaking.
You wanted it this way?
i found mistake i can not have space there : "Β§4God IΒ§r"
Yeah, &r resets the formatting. You can't have a space inbetween.
if (item.getType() == Material.DIAMOND_SWORD) {
ItemMeta meta = item.getItemMeta();
List<String> lore = meta.getLore();
if (lore != null && lore.contains("Β§4GodIΒ§r")) {
if (player.getLevel() > 4) {
if (player.isSneaking()) {
player.launchProjectile(Fireball.class).setDirection(player.getEyeLocation().getDirection());
player.setLevel(player.getLevel() - 5);
} else {
player.sendMessage("You must be sneaking to use this ability!");
}
} else {
player.sendMessage("You don't have enough level to use this ability!");
}
} else {
player.sendMessage("This item does not have the required lore!");
}
} else {
player.sendMessage("This ability can only be used with a diamond sword!");
}
This should work better for you.
ok
oh dear, it's been a while since I seen arrow-style
I mean... easy to read and understand.
yes
I mean... it surely becomes more readable.
But I still prefer arrow.
Vertical scroll better than horizontal scroll bruc
Agreed
why though?
There is no specific reason, I just find it fitting most of the times.
love it
Does anyone know how to control MythicMob skills via code? I need to pass some variables and then use them in config
Explanation?
The skill I want to modify displays a circle of particles, I need to set the range of that circle via code
do you mean without?
it instant stops gliding : ``` @EventHandler
public void Interact (PlayerInteractEvent event){
Player player = event.getPlayer();
ItemStack item = event.getItem();
ItemMeta meta = item.getItemMeta();
List<String> lore = meta.getLore();
if (lore != null && lore.contains("Β§4God")) {
if (!player.isOnGround()){
player.setGliding(true);
}
}
}
try {
for (StructureBlock block : despawnStructure.getBlocks()) {
String sql = "INSERT INTO DespawnStructures(id, time, world, location, block) VALUES('?, ?, ?, ?, ?');";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, despawnStructure.getId());
stmt.setString(2, despawnStructure.getTime().toString());
stmt.setString(3, block.getLocation().getWorld().toString());
stmt.setString(4, block.getLocation().getX() + ", " + block.getLocation().getY() + ", " + block.getLocation().getZ());
stmt.setString(5, block.getType().toString());
stmt.execute();
}
}catch (SQLException exp) {
exp.printStackTrace();
}
}```
why does this not work
it instant stops gliding : can someone help
@EventHandler
public void Interact (PlayerInteractEvent event){
Player player = event.getPlayer();
ItemStack item = event.getItem();
ItemMeta meta = item.getItemMeta();
List<String> lore = meta.getLore();
if (lore != null && lore.contains("Β§4God")) {
if (!player.isOnGround()){
player.setGliding(true);
}
}
}
ok
thanks
public void Interact (PlayerInteractEvent event){
Player player = event.getPlayer();
ItemStack item = event.getItem();
ItemMeta meta = item.getItemMeta();
List<String> lore = meta.getLore();
if (lore != null && lore.contains("Β§4God")) {
player.setGliding(false);
}
}
can someone help me port forward my server every yt vid i see has different settings my carrier is Frontier
Just google your IPS + Your Modem brand and model + Port Forwarding
An this is more of a question from #off-topic
Alright Thank you
Does anyone know how to register custom mythicmobs placeholders that can be used in skills? My mob has a skill that I want to control via code, more specific it spawns some particles in a circle and I need to control its size
%placeholder_<placeholder_name>%
I think this is the right syntax.
I need to know how to register them
Oh, ok.
That's with the classes. You need one that implements the PlaceholderHook interface, if we are talking about a custom one.
there's no PlaceholderHook
No problem, glad to refresh your memory 
hey, I have
build.finalizedBy dependencyCheckAnalyze
dependencyCheckAnalyze is another gradle task from a plugin.
how would I pass parameters to it as if I would run it like
./gradlew dependencyCheckAnalyze --quiet?
oh sorry
that's #placeholder-api
and a quick search in
https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders
would tell you the answer
how do i get particle fly in direction player is facing
with all.spawnParticle
i looked like 2 hours and find only things for 1.13 how?
just ask chatgpt Β―_(γ)_/Β―
ah
thanks
chatgpt is not available in your country
huh
be careful with chatgpt, its super convenient but it really pumps out garbage code sometimes xD
lots of logic errors
this is not working
if youre using an IDE, you can probably just type in player.particle and look for the tab completes
i dont even know the spigot api but i still manage to make plugins by that
yeah the paricle spawn butnot in player lokking diection
M0dii
When i type /papi ecloud download player the %player_name% and he dont show my rank
Wheres the problem
Sorry for bad english
rather then player name its probably something like display name. not sure
chatgpd sends code thats not even exists
%player_displayname%
or %player_list_name%
is it in the papi download list?
you should also do /papi reload
yes, player_name is definitely just the name, without ranks
I know its not working
I need to see ranks
%player_rank%
how do i get particle fly in direction player is facing
I tipe /papi ecloud download player and then /papi reload its not working
it will show how it does in the chat
Really?
What permissions plugin do you use
Or how do you set ranks
wtf is chatgpt sending me
where are the particles spawning
in me
they not fly in derecion i lokking
true, you shouldn't use the code it provides blindly, same for github copilot
if you don't understand what it does then you probably shouldn't use it
because it might lead to more issues and/or more headache
M0dii the code just spawns particle
then make it not just spawn a particle
increase the speed, multiply the vector
you need to multiply it by a magnitude
the particle still go in evrery direction
try this
Location playerLocation = player.getLocation();
Vector direction = playerLocation.getDirection();
double blockLength = 5;
double oX = direction.getX() * blockLength;
double oY = direction.getY() * blockLength;
double oZ = direction.getZ() * blockLength;
// Im using 1.19 so this might still be ParticleEffect for you
Particle particle = Particle.FLAME;
double speed = 0.1;
int count = 100;
player.spawnParticle(particle, playerLocation, count, oX, oY, oZ, speed);
its not working
details?
the partice fly erverywhere only if i look down its working
hmm, and what if you look directly 90 degrees north or something
https://i.badlion.net/Dxg3ukXMY7JxZ8Znd4VNbW.png so it looks when i look down
so when i not https://i.badlion.net/eSmJ3ufswVZdYABkpMJ8yC.png
are there particles on the front side of you too
or just the back
(in the second picture)
ok, and then if my assumption is correct, if you look at an angle it really mucks it up
yeah ok
so the last 3 parameters are actually particle spread
which is really annoying because you cant make a line at an angle then
maybe im dumb, but i think the only solution is to just spawn thin several particle clusters along the direction vector
ok
something like this
Location playerLocation = player.getLocation();
Vector direction = playerLocation.getDirection();
// Im using 1.19 so this might still be ParticleEffect for you
Particle particle = Particle.FLAME;
int count = 10;
double blockLength = 5;
double mag = 0;
double step = 0.5;
double thick = 0.2;
double speed = 0.1;
while(mag < blockLength)
{
double oX = direction.getX() * mag;
double oY = direction.getY() * mag;
double oZ = direction.getZ() * mag;
Location particleLocation = playerLocation.add(oX, oY, oZ);
player.spawnParticle(particle, particleLocation, count, thick, thick, thick, speed);
Collection<Entity> nearbyEntities = particleLocation.getWorld().getNearbyEntities(particleLocation, thick, thick, thick);
if(nearbyEntities.size() > 0) {
Entity damagedEntity = nearbyEntities.stream().findFirst().get();
damagedEntity.setFireTicks(100); // I burned it. Do what you want here.
}
mag += step;
}
what speed
the speed at which the particles spread out, or the speed at which the line is created
speed wich spread out
ok you can add speed parameter to the end (just did)
thats how it works that when other player touches i they get damgee but i dont ge damge
well you could do raycasting, or you could just add an if statement inside the while loop
check if a player is within 0.5 blocks of the particleLocation or something
if so, break out of the while loop and apply damage to that player
this will stop the beam early too (if thats what you want)
how i track if an player is within 0.5blocks range
like this? Player playerouch = (Player) particleLocation.getNearbyPlayers(0.3);
well i dont know if nearbyPlayers is a thing, but nearbyEntities sure
i modified the method here
it was auto correct nerbyPlayers
.
does it work
it seems cool, makes me want to work on a spells plugin or something
how do they spawn
what is the purpose of the wait, so you can only use it every 100 seconds?
its not working
you should not be pausing the thread at all
ok
instead, store the last time a player used it in a hashmap
then when they try to use it again, check if the current time - the last time >= 100
coldown is not working ```Map<Player, Long> cooldowns = new HashMap<>();
int count = 10;
double blockLength = 7;
double mag = 0;
double step = 0.5;
double thick = 0.2;
double speed = 0.006;
if (cooldowns.containsKey(player)) {
long expirationTime = cooldowns.get(player);
if (System.currentTimeMillis() > expirationTime) {
while(mag < blockLength)
{
double oX = direction.getX() * mag;
double oY = direction.getY() * mag;
double oZ = direction.getZ() * mag;
Location particleLocation = playerLocation.add(oX, oY, oZ);
all.spawnParticle(particle, particleLocation, count, thick, thick, thick, speed);
Collection<Entity> nearbyEntities = particleLocation.getWorld().getNearbyEntities(particleLocation, thick, thick, thick);
if(nearbyEntities.size() > 0) {
Entity damagedEntity = nearbyEntities.stream().findFirst().get();
if (!(damagedEntity.getName() == player.getName())){
damagedEntity.setFireTicks(100);
}
// burn
if (damagedEntity instanceof Player){
Player playerdamged = (Player) damagedEntity;
if (!(player.getName() == playerdamged.getName())){
playerdamged.setHealth(playerdamged.getHealth() - 2);
}
}
}
long cooldownDuration = 2; // the duration of the cooldown in seconds
cooldowns.put(player, System.currentTimeMillis() + cooldownDuration * 1000);
mag += step;
}
} else {
}
}```
you're defining the hashmap inside this function
so every time you call the function, it overwrites the data
this should be a global hashmap
ok
and the map should be called something besides cooldowns, the name is misleading
i made it out of the vent metedo but its still not working
i found antother mistake the colldown ime was in the while
long cooldown = 100 * 1000; // 100 seconds
long currentTime = System.currentTimeMillis();
long lastCastTime = lastCastTimes.getOrDefault(player, currentTime - cooldown);
if ( currentTime - lastCastTime >= cooldown) { /* Run the particles */ }
else { player.sendMessage("Still on cooldown"); }
something like this
are you making this for your server btw?
'get(java.lang.Object)' in 'java.util.Map' cannot be applied to '(org.bukkit.entity.Player, long)'
Dont use Player as the identifier of the map, use the players UUID
player.getUniqueID
the uuid is a constant, while the player object is not
youll need to clean it up too, or itl just grow
the colodwn dont work
maybe a better idea is just to store a list of players on cooldown, and add a scheduler task in cooldown time to remove them
then you dont need to store anything longer
the hashmap is the way to go when it comes to storing the cooldown
but after the cooldown time runs up, there is no need to store that data any longer
but more then likely the old value with be written over by the new value when whatever checks for the cooldown adds ot back
the only time you would remove the players value from the map is when the player leaves the server
what i mean is, the hashmap will infinitely grow unless you remove from it
ah
but then you can bypass cooldown by relogging
depends how long the cooldown is
you could create a task to remove the value from the map once the cooldown has expired if the player hasnt relogged by then, if they have cancel the task
why does it matter if theyve relogged, you can just remove the value after the cooldown (with a task)
i would assume its wasteful to do so as it would take more resources to remove the value then to just leave it there till a timenwhere you would actually want to remove it when the player leaves completely
also having a task to remove the player from the map would add more complexity then needed?
lets say you want to add something that reduces the cooldown and its toggleable, ypur method wouldnt work anymore
the hashmap is already infinitly growing cause they are using Player instead of UUID
// GLOBAL
List<UUID> playersOnCooldown = new ArrayList<>();
// IN EVENT
UUID uuid = player.getUniqueId();
if(playersOnCooldown.contains(uuid))
{
player.sendMessage(" ON COOLDOWN ");
}
else
{
playersOnCooldown.add(uuid);
// runLater(playersOnCooldown.remove(uuid), cooldown)
}
something like this
Set<UUID> would fit better then a list
yes thats fine
buti see how your point about something reducing cooldown wouldnt work
then youd need the hashmap, but i'd still have a task remove it after cooldown
that was the original plan, but it'd just keep growing unless you remove it
it's now the current plan too xD
I don't see an issue
you're not going to store more than 1000 values most likely
and it can handle it pretty well
or most of servers can handle that amount of memory
Hey, can someone help me? I need a skript to get the entity a player is looking at... Not only when the player is near the entity... ( I don't know how to use vectors)
the server will be fine, but i'd just rather add a quick task to clean out the player from the hashmap
it's only a couple extra line
Do you know the PlayerInteractEvent class?
I see no point in doing that
ive already said exactly that
Because it is only if a player click on the entity, is it?
only time to remove a player from the cooldown map is if they leave the sserver
Well, it doesn't really matter. I am thinking of getTargetedEntity, so, it returns the entity that the player is looking at, or null if the player is not looking at an entity.
if they leave the server and their cooldown time has already passed
in his example he wanted a 100s cooldown
actually whats the cooldown even for?
some sort of spell casting
Even if the entity is away?
if the player has left but the cooldown hasnt expired then make a task that runs later based on how long the cooldown has left and remove them from the map, if they rejoin just cancel the task
that would prevent a player from resetting the cooldown from relogging
it has the same effect as having a single task, but more convoluted
for 1000 elements you'd be looking (if not mistaken) at around 0.5 megabytes
on newer versions and with this context your more then likely gunna have 100 or less
worst case scenario, let's say, 1-2 megabytes (depends on the object type, set capacity)
since idk many servers where you can fit 100+ players on 1.19.3
It will only return the entity that the player is looking at if the player is looking directly at the entity. If the player is not looking directly at the entity, or if the entity is not within the player's line of sight, the method will return null.
yeah it will be good without that, as long as the server restarts often. but for me is just a preference
lets say you have 100 players, and tehey are all on cooldown, thats 100 tasks which i assume is more resources then just 100 cooldowns in a map and a few tasks for players that have just quit
okay that works nice with your idea of the task after players quit
by creating a task you're putting more load on the server
map is O(1), so all your operations take up a linear amount of time
if your list grows to the same amount (1000, which, well, not really plausible), it does more work removing the element
we have thrown out the list idea i had, in favor of the maps. im in agreement that his idea is best now
map with task after the player quits
Hello, I am getting this error when using this class.
I converted packages to version 1.16 and have no idea why the server is returning a warn. Thank you in advance for your help
https://gist.github.com/jonahseguin/2c21843806b7c03b42ad
I have changed:
import net.minecraft.server.v1_16_R3.PacketPlayOutScoreboardTeam;```
Error: https://paste.md-5.net/curavijivu.md
I think it is the PacketPlayOutScoreboardTeam class.
Consider trying ScoreboardTeam instead.
How can I substitute it?
You can use the ScoreboardTeam class and the PacketPlayOutScoreboardTeam packet.
You could send me a converted class like this, or indicate which things I could swap. Because I still do not understand : /
Sure
Thx!
Thank you, but now there are errors in the code
Yeah, ik, it's only a part of it.
ScoreboardTeam team = new ScoreboardTeam(); -> must have 2 arguments
The name of the team, and the action to take (either 0 to create a new team or 2 to update an existing team).
You can modify the NametagEdit class.
You can modify it in the code, I don't know how to do it.
You can simply replace the old version of the class with the modified version that I provided.
I can't and I don't know how
team.setPrefix("Β§" + color.getChar());
why dont you just add a method to your enum so it returns with Β§, so you don't have to concatenate it here

Good idea 
The code you provided is yours, right?
no, it's from someone else
the gist he provided was by "jonahseguin"
Alright
The code doesn't belong to me, so I don't know how to modify it, and I came here for help. I sent the source of the code in the first message. I've never dealt with packages, so I don't know how to edit it to make it work on newer versions of the
Am I supposed to just edit the code and pass it over or is it not allowed?
The code is public on github, so it is unlikely to have any rights
Em...
Have any rights?
Nope
"You posted this on the internet you lose all rights to it" LMFAO!!!
Dude, everyone can claim that it is his.
I'm new to programming and don't know about copyright. I apologize if I misspelled
If code is unlicensed author reserves all rights.
So it can't be edited to suit your own needs?
That's ok, however, learning to walk before we run is a good thing.
It can, but you can't claim as your own or repost without authors permission.
I cannot provide you the full code, I can help you understand and do it yourself.
Okay, I get it
the most you can do with unlicensed code publicly, on github is hit the fork button
How to fix it?
Check that you are using the correct version of the NametagEdit class.
I use the good version
What about the method signature?
I think it's ok
You should also make sure that the class is on the classpath, as this is required for the runtime to be able to find the class and its methods.
Idk what else to tell you if I don't see the rest of the code or the IDE.
I have a problem only with defining 'team', the rest works
So, you are having trouble creating a ScoreboardTeam object?
We can just add the methods.
How to do?
You will need to define the ScoreboardTeam class in your code.
How do I do it?
private ScoreboardTeam team;
?
You can do this by copying the ScoreboardTeam class definition I will provide.
Okay
You should also create a constructor for the ScoreboardTeam class that takes in a teamName and mode as arguments, and initializes all the properties of the class.
so if 'owner' writes
public static void main(String[] args) {
System.out.println("Hello world");
}
I cannot write this same code? 
Bloody hell π€£
@vivid mango https://pastebin.com/raw/ZHUyb7xY
or if github copilot suggests me to use some code (which was written by someone else), then I'm stealing it or is it copilots responsibility?
Technically, yours.
if I, theoretically, rewrite an entire class (let's not count package name), which matches with someone elses code 1 to 1, without me knowing it, is it stealing the original authors code?
Youβre worrying about nothing π use it and enjoy it
public ScoreboardTeam(String name, int mode) {
handle = new ScoreboardTeam(<where's the name and mode>);
...
I'm not worrying, just wondering there's the line, where you can use code and where does it count as, well, 'stealing'
I suppose, if someone goes to someone's repository and copies the entire file, then you could call it 'stealing', but how do you know if someone did or wrote it themselfves
We are in 1.16, PacketPlayOutScoreboardTeam has
private String b; // displayName
private String c; // prefix
private String d; // suffix
private String e; // nameTagVisibility
private int f; // color
private Collection<String> g; // players
private int h; // action
private int i; // friendlyFire
then
handle = new net.minecraft.server.v1_16_R3.ScoreboardTeam()
?
Oh wait, gotta update em.
since you have two classes with same name
Worry about it when it happens :P
Maybe there is some other way to change the nametag of player X, so that only player X AND Y see it and others don't?
There is ways to detect stealing, no need to worry about it for now. If you arenβt donβt worry the methods are pretty accurate plus for the use case you have copyright likely wonβt become a legal issue anyway
so im making a plugin with an inventory that opens when i right click another player, but whenever it opens it fires an InventoryCloseEvent alongside it. The inventory doesn't close, but an inventorycloseevent is fired
idk how accurate this is, but i read here (https://www.spigotmc.org/threads/inventorycloseevent-firing-when-opening-inventory-after-interacting-with-block.515424/) that right clicking fires two interact events
which (in turn) opens two inventories, closing the first
any solutions on how to not fire twice?
Check the hand on entity interact event
another issue - im clicking on the top row of my own inventory and this if statement still returns true
if (event.getClickedInventory() == event.getView().getTopInventory())
it returns false for the bottom 3 rows, and true for the top inventory
as it should, but it also returns true for the top row of the bottom inventory
Objects are compared with equals() not ==
two different objects that are similar are compared with .equals
these should be the same object, with the same memory location right?
it.. what? can you share a screenshot? or at least how large either inventories are etc
ill gyazo
changing to .equals() produced the same result, clicking on the highlighted slot returns true for that if statement
what kind of goofy name is gyazo lol
idk, its pretty popular though xD
It cant be the first time you see gyazo lol Emily
I know but i never asked that out loud
True
japanese
Gyazo is a word play based on the japanese word for image: gazo ( η»ε ) To translate to English, Gyazo means basically imagey or imagies .
imagies xD
okso
it actually returns true for the first 5 slots of the bottom inventory
but not the last 3. (the slots circled in red return true)

no idea mate, ive also tried some other hacky thing i found which is checking if slot == rawslot
which produces the same weird result that i have in the picture (top inv + first 5 of bottom)
I can't reproduce that at all, it's giving me the right results
server and plugin are both 1.19.3 spigot
let me double check to see if im doing something dumb
@EventHandler
public void onInventoryClick(InventoryClickEvent event)
{
Inventory inventory = event.getInventory();
Player thief = (Player) event.getWhoClicked();
// If pickpocketing and on top slot.
if (event.getView().getTitle().equals(PICK_POCKET_TITLE)
&& event.getClickedInventory().equals(event.getView().getTopInventory()))
{
System.out.println("CLICKED ON TOP INVENTORY. SLOT=" + event.getSlot() + ", RAWSLOT=" + event.getRawSlot());
// ... Do other stuff
}
[17:08:39] [Server thread/INFO]: CLICKED ON TOP INVENTORY. SLOT=40, RAWSLOT=40
[17:08:44] [Server thread/INFO]: CLICKED ON TOP INVENTORY. SLOT=39, RAWSLOT=39
[17:08:45] [Server thread/INFO]: CLICKED ON TOP INVENTORY. SLOT=38, RAWSLOT=38
[17:08:46] [Server thread/INFO]: CLICKED ON TOP INVENTORY. SLOT=37, RAWSLOT=37
[17:08:47] [Server thread/INFO]: CLICKED ON TOP INVENTORY. SLOT=36, RAWSLOT=36
server says the 5 slots are 36-40
hmm, are you using event.getInventory() or event.getClickedInventory() for the comparison to TopInventory?
clicked
logger.info("Slot: {}", event.getSlot());
logger.info("Raw slot: {}", event.getRawSlot());
logger.info("Converted slow: {}", event.getView().convertSlot(event.getRawSlot()));
logger.info("View: {}", event.getView());
logger.info("Clicked inventory: {}", event.getClickedInventory());
logger.info("Inventory from view from raw slot: {}", event.getView().getInventory(event.getRawSlot()));
logger.info("Top inventory: {}", event.getView().getTopInventory());
logger.info("Bottom inventory: {}", event.getView().getBottomInventory());
all as expected
hmm im gonna steal that and see what my results say
those top 5 slots print for CraftInventoryPlayer (as all the other ones from the bottom inventory do) which matches the bottom inventory
tested with a 4-row inventory as well which for its own slots prints CraftInventoryCustom which is correct as well
Why is it a player inventory?
i guess it doesnt need to be
give me minute, im loading up the server
i gotta shut down intellij every time i do or ill run out of memory xD
Do you not create it with Bukkit.createInventory(size, title) or InventoryType.CHEST?
i used createInventory with type PlayerInventory with null owner, but ill change it to chest since there's no purpose for that
that sucks
^ π
#general-plugins / #1007620980627230730 is where you should ask
we know nothing about deluxe menus
this is for plugin development support
.
those are the support channels
[17:29:54] [Server thread/INFO]: Slot: {}39
[17:29:54] [Server thread/INFO]: Raw slot: 39
[17:29:54] [Server thread/INFO]: Converted slow: 39
[17:29:54] [Server thread/INFO]: View: org.bukkit.craftbukkit.v1_19_R2.inventory.CraftContainer$1@7b8c6f79
[17:29:54] [Server thread/INFO]: Clicked inventory: org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryCustom@23478157
[17:29:54] [Server thread/INFO]: Inventory from view from raw slot: org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryCustom@23478157
[17:29:54] [Server thread/INFO]: Top inventory: org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryCustom@23478157
[17:29:54] [Server thread/INFO]: Bottom inventory: org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryPlayer@5419df2
[17:29:54] [Server thread/INFO]: === PASSED CONDITION ===
[17:29:54] [Server thread/INFO]:
Clicking on the top of my bottom inventory, the pointer is the same as the top memory. strange, im guessing it's just a problem because i used PlayerInventory, and im loading up a new version with Chest now
Yeah it treats custom inventories (custom as in created from createInventory) with InventoryType.PLAYER as inventories with 4 rows (36 slots), but for checking the clicked inventory it checks that the number of the raw slot clicked is lower than the size of the top inventory, and since the actual size of a PLAYER inventory is 41 (36 + 5 crafting slots) it yields true for those 5 slots
This is the dumbest shit ever
everything bukkit
Use a library π
my purposes for it were very simple, so i dont need much overhead
just one inv full of glass is all i needed
you dont have to specify an inventory type
yeah i ended up not, because i need 36 slots and when i use PlayerInventory or Chest is just gives me 27
so now i just use size 36
no i think ur wrong, theres no support there
dang
anyone know how helpchat got the nicer looking javadoc website?
spigot has it too apparently
nicer?
oh
tasks.javadoc {
val options = options as StandardJavadocDocletOptions
if (JavaVersion.current().isJava9Compatible) {
options.addBooleanOption("html5", true)
}
}
I'm glad they are improving it
What nicer version?
Looks the same to me
Or do you mean compared to the one like 10 years ago
Dokka is really nice, you can customize everything about it
yup
and it just looks awesome
i would love searching spigot fabric docs with dark mode
Search page, improved search system, dedicated/proper code blocks (code snippets) with a copy button, copy link buttons on methods, fields etc and description sections
Lots of tiny subtle things that make the experience much nicer
The overall design hasn't really changed since like, java 7?
wheres copy button?
except that they added a search thingy in java 9 and make use of html 5 but you don't see that last part
which one
oh wait im looking in outdated docs
wait yeah you said code snippets with copy button
yes
ex https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html#<init>(byte[],int) there's no copy button D:
declaration: module: java.base, package: java.lang, class: String
17
declaration: module: java.base, package: java.lang, class: String
oh lol
that's the old way of showing code
and code snippet is something different
oh looks better
wheres copy button tho
on the right
I really like that you can directly copy a link to methods/fields on the full description to it
before this you had to copy it from the method listing
they still look like dogshit, sorry

