#help-development
1 messages ¡ Page 1152 of 1
Because my other plug-in is implemented by sending content in the player chat bar, but because it will push the player's message, I need to capture the message sent by the player and resend it to this player so that he can see the previous message again.
That's just due to how the chat verification system works
You'd have to disable it entierly
If you operate on the information, it will destroy them, but I just save them temporarily. When he stops operating my plug-in, I send him out as he is, without doing any other operations.
enforce-secure-profile in server.properties?enforce-secure-profile?
Yes set it to false
you would rather just avoid making system that depend on chat at all tbh
at some point chat reporting might not even be capable of being disabled, so I wouldn't be surprised if functionality that depends on chat gets more broken than it already is
All messages need to be sent and shown
Yes, I asked the developer I know and he also told me to close it, but it didn't work.
Try removing the validation data from the packet
No, I just store it and send it out at a specific time. It will not destroy the content.
No, if there is only one chat content, it will not appear, but if there are more than two chat contents, it will appear
Messages need to be sent in the right order unmodified
Not sure what you mean by this
No modification is done, only storage and reading
Yes
I know
You can just get around the issue by using api send message methods
They will send as a system message
Rather than a player one
Then how the hell do I run it?
Where am I supposed to use this?
in your projects root dir
I am interested in a coding kit system but I am confused about something, now there are 6 groups in Luckperms
A total of 6 permissions, the kit system I have set up always gives the player the highest weight, Now if a player has the highest weight then the other lower ranks are also visible, what if he chooses another kit despite being the highest weight after he die How do I get him to give me that kit?
huh
:D..
Just track which kit the player has selected??
I have been sleepless for exactly 30 hours.
Yep
For example, if the player has a high rank and has chosen a low rank at that moment, he should automatically be brought down to the lowest rank when the high rank period ends.
what
đ
What's the holdup?
You have a vip rank
You buy mvp for 30 days
And after that you get vip back
are you using luckperms?
There is a kit system, there are 6 kits and each kit has a special permission,
I created 6 Ranks with Luckperms and added a permission to each one, now will I be able to choose the kit I want with a gui?
Yea
Luckperms + my plugin
My plugin is BlocksinKit
so you're having trouble with expiring ranks?
or with actually claiming the kit based on their rank
Manages kits, creates, and manages things like death-drips, self-drops, and respawns.
@north nova Actually I can explain it in more detail, 1 minute.
set a min weight for each kit, if the players rank weight exceeds or equals they can claim the kit
When the player respawns after dying, he chooses the kit of the rank with the highest weight.
I want the ability to select this manually.
Yea
so you want to allow the player to choose the kit?
do you want them to be able to choose which kit they get when respawning?
Yea yea yea
omg get out of my head thats what i said!
Oh that could lag the server quite badly
sorry!
Yep
you should probably cache your kits lol
not load from file every time you give a kit
and
well, make a gui or a command, allow them to set
save somewhere
on load
save which kit
when they die
check if there is a set value
if not
get highest
public void setKit(player, chosenKit)
saveToConfigAndCache(player, chosenKit)
public Kit getPlayerKit(player)
return getKitFromCacheOrConfig(player)
public void OnPlayerDeath(player)
givePlayerKit(player, getPlayerKit)
I have made a much more complicated system now, to summarize it briefly, if you have a kit and you have the permission for that kit, that kit appears in the gui. and when you click on that kit, only the commands work
?paste
not really
ewgh
just have a place to store if they have a chosen kit
Doesn't sound complicated
if they dont
get highest
not that hard
Also you should really break down your methods
instead if letting the give method find the kit make another method to find it
etc
The system here works like this; now there are 2 types of permissions defined, one allows the kits to be seen, the other permission determines which kit will be given after death
XD
so what is your issue exactly?
So recode it to fit your needs?
lol
what
ive told you what to do
1m
Generally, when I create a kit, a special YML is created and installed for each kit without any problems, and a special name + permission is set for each kit. This permission determines which kit will be given to the player after they die. Now, there is only one thing I want to do, there are 6 kits and 6 weight levels. The player with weight 2 should also see the kit at weight 1. All I want is a gui that opens with a command and the chance to easily select kits in the gui
yea
I'm confused xd
Whenever a player sets a specific kit to be chosen on their death, save what kit they want. If they do not have a stored kit give highest kit available otherwise give the kit they saved
So, let's say the player's chosen kit weight is 3, when the player's weight rank of 6 expires, when hes respawn, hes chose 3 again. He will not choose the default kit, what will we do about this?
Check if they have the permission for the kit, if not default to the highest they have and clear their saved kit
It's a bit confusing, but I'm already working on it
Hi everyone,
I've had this bug for a couple of days now, and I just can't seem to solve it.
The bug happens between 2 different versions. The model is the same and the way it is spawned is the same, what changes is the version: one in 1.19.4 and the other in 1.21.1.
https://imgur.com/a/pUTvVAD
The model is mirrored in 1.21.1
I tried running the command â/summon minecraft:item_display ~ ~ {item:{id: âiron_swordâ,Count:1},item_display: âfixedâ}â in singleplayer in both versions and it would appear that the model is swept into a different yaw. I don't understand why Minecraft changed this.
I'm having a weird issue:
@EventHandler
public void onPlayerJoin(PlayerJoinEvent e) {
Hotbar.initializeHotbar(e.getPlayer());
}
If I try using sysout under the onPlayerJoin method, nothing happens, its like the event was never registered (even though it is), but whenever I run my sysout code inside the initializeHotbar function, it successfully prints to the console
that doesn't make sense
that said, you should use your plugin's Logger instance for logging, not sysout
you know, implementing some networking once a print statement added enough delay to solve a race condition
well, not solving but circumventing it, though I can see that happening
ah yeah fair enough my bad
but yeah it was very funny
me and my uncle wrecked our brains figuring it out
data races are hard but at least when working in the JVM, there's a bunch of nice tools that can help you figure them out so it isn't too bad
I do not know of such tools tbf
All of a sudden it started working again
idk what was wrong
Is there any event, that calls when player inventory is cleared(Using Creative clear button or command)?
?mappings
Compare different mappings with this website: https://mappings.cephx.dev
In theory wouldnât nms container clear method be called
You could in theory check if that method is called and if theyâre in creative etc
Wouldnât be reliable though
the server keeps track of players in creative, but the functionality yeah client sided lol
or it may be bukkit that does that idk
player.getGameMode() == (GameMode.CREATIVE)
and the server is like, yeah, you're in creative, there you go
Sure but thatâs not the point
yep
The way it works is
Survival: player picks up item -> item is moved to their cursor âslotâ, player places item -> item is moved from cursor to the new slot
Creative: Player picks up item -> item is destroyed on server, player places item -> item is created on server
Crazy
Anyways for caching data that needs to be the same on every server would yall cache on the proxy or use a redis srv
I know however I donât need to worry bout that
i figured
a bunch of events didn't trigger for me while in creative
Thereâs a reason we often tell people to test in survival
Hey, I'm trying to load my Kotlin Plugins and I get this error:
https://pastes.dev/rwVSVGH7Ra
GCore is not using kotlin-stdlib and GGangs is using kotlin-stdlib
I've tried to relocate kotlin using this:
tasks {
shadowJar {
relocate("kotlin", "me.xii69.kotlin")
}
}
And this happened:
https://pastes.dev/5XfC4XYxhO
Any idea?
no point in shading kotlin, library it
GGangs:
plugins { kotlin("jvm") version "2.0.21" }
dependencies { compileOnly("org.jetbrains.kotlin:kotlin-stdlib:2.0.21") }
GCore:
plugins { kotlin("jvm") version "2.0.21" }
dependencies {}
and i get this:
https://pastes.dev/rwVSVGH7Ra
i'm using kotlin-stdlib because it doesn't shade kotlin anymore and the plugin size in not 2mb
does compileOnly shade it?
no
so why this is happening
compileOnly("org.jetbrains.kotlin:kotlin-stdlib:2.0.21")
You can simplycompileOnly(kotlin("stdlib"))btw
put both of your full build.gradle.kts on a paste
also when i open the .jar file with something like winrar there isn't kotlin
Then you're not shading it
GCore: https://pastes.dev/RofCLaakBx
GGangs: https://pastes.dev/TsAlCAcBsU
that's the whole point, i don't want to
I've Kotlin in GCore
so i just compileOnly(kotlin("stdlib") in my other plugins
it was working till today
run a clean build of both projects and make sure the jars get updated, im not seeing gcore shading kotlin and if gcore provides kotlin somewhere you shouldnt need to compileOnly the std lib
when i have my kotlin plugins i bukkit library the stdlib and it avoids any issues with shading or transitive deps
Solved. After closing the server-side verification, you must also close the client-side verification, and then delete the signature of the package.
i clean builded both before asking in here, if i don't use kotlin-stdlib kotlin will be shaded into my plugin, like how GCore does
wdym by "bukkit library the stdlib"?
package me.inloadings.particles;
import me.inloadings.particles.command.EffectRun;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.Objects;
public final class Particles extends JavaPlugin {
private static Particles instance;
@Override
public void onEnable() {
instance = this;
Objects.requireNonNull(getCommand("EffectRun")).setExecutor(new EffectRun());
}
@Override
public void onDisable() {
// Plugin shutdown logic
}
public static Particles getInstance(){
return instance;
}
}
package me.inloadings.particles.command;
import me.inloadings.particles.effect.SpiralEffect;
import org.bukkit.Effect;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class EffectRun implements CommandExecutor {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) {
if (!(sender instanceof Player player)) {sender.sendMessage("Only players can run this command"); return true;}
if (args.length != 1) return false;
if (args[0].equalsIgnoreCase("spiral")) {
new SpiralEffect(player.getLocation(), Effect.SMOKE);
return true;
}
return false;
}
}
i keep getting this error when using this plugin:
java.lang.NullPointerException: null
at java.base/java.util.Objects.requireNonNull(Objects.java:233) ~[?:?]
at particles-1.0-SNAPSHOT.jar/me.inloadings.particles.Particles.onEnable(Particles.java:16) ~[particles-1.0-SNAPSHOT.jar:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:288) ~[paper-mojangapi-1.21.1-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:202) ~[pufferfish-1.21.1.jar:1.21.1-18-63ce67d]
at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:109) ~[pufferfish-1.21.1.jar:1.21.1-18-63ce67d]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:520) ~[paper-mojangapi-1.21.1-R0.1-SNAPSHOT.jar:?]
at org.bukkit.craftbukkit.CraftServer.enablePlugin(CraftServer.java:640) ~[pufferfish-1.21.1.jar:1.21.1-18-63ce67d]
at org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:589) ~[pufferfish-1.21.1.jar:1.21.1-18-63ce67d]
at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:754) ~[pufferfish-1.21.1.jar:1.21.1-18-63ce67d]
at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:516) ~[pufferfish-1.21.1.jar:1.21.1-18-63ce67d]
at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:331) ~[pufferfish-1.21.1.jar:1.21.1-18-63ce67d]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1215) ~[pufferfish-1.21.1.jar:1.21.1-18-63ce67d]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:330) ~[pufferfish-1.21.1.jar:1.21.1-18-63ce67d]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
[14:35:25 INFO]: [Particles] Disabling Particles v1.0-SNA```
?paste
Create 1 for error and 1 wit code snipets
goofy intellij warnings
did you register the command in the plugin.yml
version: '1.0-SNAPSHOT'
main: me.inloadings.particles.Particles
api-version: '1.21'
commands:
EffectRun:
description: Runs an effect
usage: /effectrun <effect>```
yep.
commands should be all lowercase
if you remove the requireNonNull you'd get a more descript error afaik
make sure you've ran a clean package/build after adding the command to plugin.yml
i think my intellij is just fucked
your build system is probably using an outdated file
made this plugin 2 seconds ago
run a clean package/build anyway
decompile the jar file and check the plugin.yml contains the command
it does
double check your server has an updated jar file
as this is the spigot server, spigot
Does anyone know of a good plugin that manages mobs to spawn across the map without blocks like grass being needed for a cow to be spawned, for example?
This channel is for development. Stay in #help-server and don't crosspost
i'm trying to get Enchantment from Material.POTION, what should i add there?
get potionmeta
i think its a chat message? with a special type?
system message with overlay = true
packet id 0x4C
and action bar is annoying me
Displays a message above the hotbar. Equivalent to System Chat Message with Overlay set to true, except that chat message blocking isn't performed. Used by the Notchian server only to implement the /title command.
Packet ID State Bound To Field Name Field Type Notes
0x4C Play Client Action bar text Text Component
exists too ig
it's S2C right?
yes
found it
is there a way to like, send actionbar in negative position?
to send it like down
i saw a plugin that does that but i don't have the code
fonts
with fonts you mean literally fonts ?
yes
or like unicode chars?
resource packs
aw men đ
Is there a way i can do a event for packets?
Oh wait i know what i can set a packet handler of the packet i wanna listen and call my event
Thatâs basically what PacketEvents/ProtocolLib do
PE > Plib fr
Is this okay to cast NMS itemstack to bukkit itemstack?
net.minecraft.world.item.ItemStack nmsItemStack = clientboundContainerSetSlotPacket.getItemStack();
ItemStack bukkitItemStack = CraftItemStack.asBukkitCopy(nmsItemStack);```
cast no, calling that method yes
should do
probably
okay thanks
It does, yes
thank you god choco
I think just "Choco" is good, but I appreciate the enthusiasm!
Lol
Is choco good at physics? Kek
Iâve been doing so much math for the past 5 days
And I still havenât gotten it right
Math is awesome, is literally the answer to everything
(not literally)
but almost
Math is cool but also fuck math I hate it so much
Yeah bro i was going to say that
or egg
;v
Fuckkkkkkkkkkkk
I just remembered I have to do bouncing physics too
I'm thinking the algo is gonna have to be based on the velocity of the disc at the time of the first detected collision... but how in the hell am I going to figure the actual "bouncing" or "skipping" mechanic of disc golf throws...
no
Well if you toss him out a window he obeys the laws of physics
Does that count as being âgoodâ at it
fine, egg can be the answer to everything
I find that I deny the laws of physics a lot so yeah I guess so
what if he stars floating
500+1902951=egg
how do i check if a player is moving too far from a location?
playerMoveEvent has a from and to method
Just check the to location against whatever location
if they move more than 20 blocks they cant go farther
Yeah, you want a distance check
I take it survivalLocationMap is a map of locations. In which case, event.getTo().distanceSquared(survivalLocationMap.get(event.getPlayer())) >= 400
(400 = 20 squared)
oh
https://i.e-z.host/tvaz0e0i.png we dont talk abt what im trying to make this for but is this good?
Yeah, that looks fine to me
alr thx man
I'd probably do the >=, this means they could move just beyond 20 blocks kek
oooo
cant let that happen fr
Minor thing but yk
fr
How do you ignore the inventory clicks and only listen for chest clicks?
Check if the clicked inventory is the top one and do nothing otherwise
yeah, i forgot which method had the top bottom view
That worked thanks
what do you use for making guis? any libraries or what? because normally its so annoying: itemstacks, item metas, setting the items, detecting properly the clicks etc
?gui
If you want to write your own gui library you can follow this
mkay
Casually promoting your own thread

how do i set the world to day without resetting the day counter?
declaration: package: org.bukkit, interface: World
does that not fuck the day counter?
so if i set it to 0 itll go to the next day
hm, the see alsos are a bit whack in that class
Does anyone know what the hell that could be? https://www.youtube.com/watch?v=d5cTrWsbDHM
idea for u. dont use 1.7
if anything use 1.8
its not as good as new versions but its better than 1.7
The spigot I'm making is for 1.8.9 pvp servers, with support for 1.7.10, but for some reason this happens, to follow an idea that not even older servers like Minemanclub
does anyone know how I could fix the following error: https://mclo.gs/5OpmEzU ?
i'm learning how to create plugins, and am just trying to detect when a player jumps & send them a message; the plugin is in Kotlin, using Maven
?whereami
Even though I've applied everything from scratch, for some reason it happens and I don't know why https://imgur.com/a/5uaHokN
custom kb is wild
https://www.youtube.com/watch?v=awYBYFLB2Kg, Everything was perfect until I discovered the problem, but that's basically how it works, check out this video
W edit
But do you have any idea what that problem is? I've been thinking for a while about how to solve it
i dont make practice servers 24/7
Too old! (Click the link to get the exact time)
how do i drop an item at a location
World#dropItem
thx u
Hey all! Does anyone know why when I call org,bukkit.block.Chest#close(), the chest stays open and doesn't close? But when I use #open() it opens just fine?
Call update on the blockstate afterwards.
chest.close();
chest.update(true);
Tried that, they remain open
guys, i need help with the scoreboard and tablist/nametag prefix.
The scorreboard work, the tablist prefix is set, but the nametag prefix dont work.
does anybody has an idea, what could be wrong?
pretty sure this can only be achieved using teams or NMS packets
i use teams, the player joins and the player team created (like 0000Enty) with prefix etc. The Nametag prefix works, if i disable the scoreboard. But i need both :/
No? You can do teams prefixes with the scoreboard API just fine
that doesn't make sense, what is your code?
https://i.e-z.host/f7r1fvpk.png is it possible to override sleeping like this?
seems ok
modded discord đ
yeah?
player.isSleeping() won't be true at that point
how do i check if they're in the bed
Events are generally fired just before an event actually occurs, but if that event is called, it's gonna happen (unless it's cancelled)
So you can listen on HIGHEST priority and ignore cancelled events, should work fine
alright
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
so event priority does matter
why not monitor
You never edit an event in the monitor priority. It's meant to monitor the result of it. Though you probably want to cancel the event, so highest is where you should be
Event is listened to purely for monitoring the outcome of an event.
No modifications to the event should be made under this priority
oh
Only reason I'm suggesting HIGHEST is so you can ignore other plugins cancelling entering the bed
this is the only plugin
honestly the server should just stop the vm if an event is modifier in monitor priority
Just nuke the whole server
kernel panic
Delete root
More of a best practice thing than anything
You can do it on normal priority if you really want
still no
Then your world doesn't exist (or you didn't remove the isSleeping() call). Though you don't need to get the world by name. You have the player. Get their world
@EventHandler(ignoreCancelled = true)
private void onSleep(PlayerEnterBedEvent event) {
Player player = event.getPlayer();
this.setWorldToMorning(player.getWorld())
Bukkit.broadcastMessage(player.getDisplayName() + "&owent to sleep. Sweet Dreams!");
event.setCancelled(true):
}
That should work fine
If that doesn't work, you haven't registered your listeners
i might just delete the whole machine
ok im just gonna delay the wakeup thing
for run task later is it done in ticks?
Yes
Someone pr a check for that and bomb their device if they do
It would require having every single event override hashCode() and equals()
I absolutely do not want to do that
Miles or coll can
so Player#isSleeping wont work?
i wanna check if they are in bed
In that event, they're going to be in the bed
That's why that event is being called
mmm
Hello, i have a bug in my maven Dependency , i don't understand why it don't import Apache
I need to use Mojang api to get skin signatures, i don't want to use craftBukkit, why simple Libs don't works ?
Bukkit doesn't bundle Apache Commons IO
Eh I guess you have it defined in your pom. I guess just make sure you refresh the project. Artifact looks fine
that property import đ
bytecode generation be like
just make a wrapper class and do something fucky
or inject a proxy method that throws an exception
Yes let's add more ASM hacks into CraftBukkit. It's not nearly slow enough
Okay!
How does everyone do their project icons I legit don't know any good resources to do this shit with, but also I don't want terrible looking icons. Ideally I want to avoid AI because its cringe as fuck
hm how the fuck can I just use every variable like usual without a ()
idk I just paid lax
sounds cringe
bro just plop some assets in photopea
icons are not hard, what kind do you need?
its unfortunate lax isn't around :(
well I'm more interested in tools people use vs actually getting them done, I'm terrible at art, but I've legit just been using gimp which is probably not an ideal tool I feel like I could do better
I mean gimp is probably fine, it gets a lot of crap for its ux; personally anything that isn't gimp is good lol, krita, paintdotnet, paint tool sai, clip art studio, ...
the linux conundrum :<
krita
never heard of krita
chefskiss
i'll check that one out
oh god krita
I tried making a 10000x10000 image and it just tracks it as a bitmap internally
ram go boom
yeah, but I just feel clunky with gimp
I find it hard to navigate and use
photopea!!
sounds like you need to use something else. I have use MS paint before, but I have photoshop CS5
my pfp was made using MS Paint just fyi
yeah I really do I just like don't feel motivated to ever actually open gimp and fuck around with it because I find it annoying to use
I'll prob end up checking out krita and photopea and see how that works
my GF just needs to setup her PC she is actually a talented artist It'd be great to have her throw together something beautiful for my sorry ass
but as others have said, the tool isn't going to make you actually better at doing art though. If anything it will let you make it shinier or some other effects more easily, but not actually creating the image itself depending on what it is.
yeah I'm not adverse to training myself to get better I just want something that feels right to start with
I personally don't like doing art even though I am good at it. I have a pen pad specifically for art in storage somewhere
I generally dislike doing art and I'm particularly bad at it, but its a useful skill to actually hone and become decent at
I always pay someone else to do art for me đ
except for stuff I personally use like my pfp
being a poor college student sucks :P
and my background on my profile I also created
being poor has nothing to do with being good at art
I'm refering to not being able paying someone
Reason I am actually good is due to my mother actually having taken formal art classes in college and teaching me at home and me watching her. So I don't only know how to draw on computer, I can actually draw on paper as well and do shading and the sorts
I'm the only one in my family actually incompitent at art
its kinda rough
lol
granted I'm the only one actually good at math or coding so goes both ways I suppose
sometimes my mom calls me to do math for her đ
if you want to get better just watch some youtube stuff on art
Real art pros use ms paint
I don't recommend using it, it is very limiting. But in a sense I suppose you are right to create something decent, like my pfp for example does take skill to do lmao
I'm so good at ms paint I can basically use it on paper... with colored pencils and markers kek
converting my library to kotlin tonight woohoo pain and agony
nothing but rewriting my buildSrc
again
Better than physics manipulation
why are you doing it like that
because I need () -> Int
and I don't want to make getters or whatever the fuck
or open ()'s because it's cringe
I could open getters but it looks weird
what language is this
kotlin
checks out
it's basically a getter that invokes the function but without the getWhatever function
I'm still trying to decipher the logic behind this
We have "feature flags" which act as glorified () -> T
ok, but couldn't you have just set the type to int?
like what's wrong with
val settings = ZombieSpawnSettingsFactory.generate()
settings.idealZombieCount()
Not how kotlin works
it looks cringe when you're doing math with it
oh kotlin no wonder it was dumb looking
than just assign it to a local the compiler should optimize it
it still looks cringe
I originally had them inlined in the class but we're spicing things up and different maps can have different spawn settings so wtv
tbf this class could be an object
I could also rework it to take the map as a field and inline these
imagine if I could : T by t
or whatever
why do values in lambdas have to be "effectively final"?
They're functions if the variables you pass in aren't effectively final could fuck things up
there are no guarantees the lambdas will be run while the local var still exists
okay
Hi, i'm looking for recommendations for open src plugins to review. I'd like to learn best practices for efficient/high-performance coding and reducing resource consumption. any suggestions ?
Experience is the best teacher
reading also could be helpful
a lot of popular plugins are open source, you can start there
Idk how much knowledge you have but as a beginner it's usually not in the sense of looking at other people's projects, that being said, yes it can be helpful but you'd probably want to read about the concepts rather than raw code
i am not a beginner and yes i want to read about the concepts
The concepts are really just a google search away, this is why I say experience. You'll end up learning more (at least in my plugin dev career) from doing and figuring things out yourself than trying to copy what someone else has done. I like to research topics that are currently relevant to a project I'm working on because then not only did I do some research, I also practiced the application of what I researched which ultimately leads to a better understanding of what you're actually doing, not only that but then you have reusable code
honestly a lot of open source projects have dog shit code
PacketEvents is good https://github.com/retrooper/PacketEvents
also to this point, now you're using two learning styles to retain information which hopefully means you'll learn faster as well
i just wanna know how plugins handle heavy things
yeah thats save my life
buddy asked in paper
that's my entire tech stack for chunk scanning I'd consider it management of a heavy task
fully ideal probably not but hey
For snapshotting I just use a "blockaccess" interface that lets you read blocks at a given xyz
and then my impl manages snapshots and stuff
hi
im trying to serialize
a
HashMap<World, MutableSet<Region>> where Region is a datatype made by me that consists on
String, Cuboid, Boolean, RegionType (enum). But the result in my .json with gson is this:
supposedly where the cursor is there should be my region's contents?
i dont really know why is not serializing even nulls (i got serializeNulls enabled).
What can i do?
is there a way to make arrows instantly disappear after they hit a block
any event ran when an arrow hits a block or something
you need a type adapter for region from what i know
Could probably use the ProjectileHitEvent and remove the entity.
is there a way to make arrows able to go through players that are on the same team as them?
i did it using nms ^
How can I saved animations into files? Im thinking of saving Player Consumers but I dont evem know if I can do it
are you happy to share code?
@fading drift
thank you so much
hope it helps đ
Hi everyone
Does anyone know how to put npc dialog with the shopkeepers plugin
Or any other free plugin
Sounds like a question for #help-server
Oh ok
hi everyone! how do i place a structure while a chunk is generating using ChunkGenerator? can't really find a solution but basically when i'm trying to do structure.place it just freezes the server. the structure is valid (i've checked structure.size() and it is stored in the plugin's resources
You should probably do that in a block populator
/EndlessCityPlugin: https://pastebin.com/jfAALXzV
/CityGenerator: https://pastebin.com/UPgBaWny
/CityCommand: https://pastebin.com/EQLtgEk8
/structures/StructureGenerator: https://pastebin.com/xZnc6CTs
/structures/StructureGeneratorParkSmall: https://pastebin.com/d4wfAq8X
how can i format foreign characters (Ä
) in item names so they wont be bugged out
alright, i'll google that, thanks!
Make sure your plugin is compiled with UTF8 encoding
And any files you may be loading text from are also UTF8
2nd question: how do i get a RegionAccessor or a Location from a LimitedRegion?
LimitedRegion is a RegionAccessor
wait, really?
Yes
thank you!!
question #3: why is there the error "Requested chunk unavailable during world generation"? how am i supposed to place structures while the chunk is generating?
sorry if i'm being too annoying, this is like my third plugin ever
public void populate(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, LimitedRegion limitedRegion) {
Structure structure = getStructureManager().getStructure(structures[random.nextInt(structures.length)]);
structure.place(
limitedRegion,
new BlockVector(0, 16, 0),
false,
StructureRotation.NONE,
Mirror.NONE,
0,
1,
random
);
}
oh ok i changed line 5 to new BlockVector(chunkX * 16, 16, chunkZ * 16) and it seemed to work
yes, it did work! https://imgur.com/a/m5NZEtQ
thank you very much :)
can proxies somehow make the player resend all of their packets?
like when transitioning from one server to another
well you could prob force your proxy to transition the player to the server they're already in or something?
I'm asking for how they do it
internally
Prob just a dimension change
but won't that break a lot of things?
you should prob just read the proxies code ÂŻ_(ă)_/ÂŻ
also, then what is TRANSFER for in the player's handshake?
when a player is transferred from another server
what packet do proxies send to inform about this tho?
the transfer packet, see https://wiki.vg/Protocol#Transfer_.28play.29
there's also a transfer packet for the configuration phase
so this'll make the player resend all of his packets, as if he was joining the server again?
essentially
and this was added in like 1.20.5?
more or less, yeah
kinda sad it wasn't added before
md can probably answer how transfering worked before the packet existed, since they develop both the server and a proxy
I know next to nothing about proxies, but from my understanding, I assume since the player is connected to the proxy, the connection is kept and thus all the proxy has to do is route the packets from one backend to another, and respawn the player or whatever process it must go through to switch out the server
Iâm pretty sure a server switch was just a fancy world change before
At least as far as the client knew
that makes sense
No because all datatypes inside region are basically Strings, Ints, Boolean and an Enum
Has anyone seen any debugging tooling that can allow me to run a debugable spigot server from gradle?
Paper has their userdev plugin
Gives easy access to all you need
Though you should head over to their discord if you plan on using it
It will also make the api be paper instead of Spigot, so extra care is required if you want to keep Spigot compatability
I'm already using it, looking for a solution that I can use to test spigot in the same manner. Doesn't necessarially need to be a decomp env though, just getting the jar and using it will suit
It's useful for knowing if behavior differs between spigot and paper, for submitting bugs
That's kinda the opposite of what I'm looking for, but thanks.
That's an extremely manual, ide specific setup.
I want to have a gradle task, that can setup a spigot server to be more specific.
Hi, does anyone know how to create custom logos or custom achievement categories? I mean when you press the L key and the achievements and their categories are displayed, is this not possible?
you probably have to make a resource pack
I mean, why not just use run-task?
I am, I just don't know how to feed it a spigot server automatically, buildtool, etc
you'd have to create a task that executes BuildTools to get the spigot jar, if not just get it from a defined directory
then just create a RunServer task
this is really really old, but a plugin provided api used to exist on 1.12, i suspect the right answer is resource packs though, https://github.com/Ste3et/AdvancementMessage
wonder if there is a plugin to get a spigot dev bundle
considering spigot tooling is more centered around maven, I guess not
How do I benchmark a Minecraft server?
wdym by benchmark
you can use something like spark for profiling
what would that even achieve
minecraft servers are entire platforms, not just a deterministic algorithm, therefore you got to limit the scope in order to benchmark anything
simulate a server with many people
again, what would that achieve
to see if my server can host that many people
you can bot a minecraft server up to ddosing it, that however isn't going to show anything
instead of worrying whether it can, you have to continously profile your server in order to optimize your settings for your use case
I don't want ddos, I want each bot to do a different action on the server as if it were a player
again, that isn't going to achieve anything
just make sure to profile your server with tools like spark and figure out the appropriate settings you want to go for from there
How not?
so a server with 2 people is the same as 50
it isn't, however you can't worry about players that you don't have
hi i arrive with a general java question, the SpinnerNumberModel's superclass is SpinnerModel but there is no explicit constructor for JSpinner<init>(SpinnerNumberModel)
Is there a way to get that constructor
But I have, but if shit happens again then I won't have any players
show code
what settings are the best for that kind of setup ultimately depends on what you are doing on what the players are doing, and that is ultimately not something you can replicate with bots
Exactly, I would like to make each bot do a different action
again, you're going about this the wrong way
Don't you know any program to put bots?
params is an Object[]
what are you doing bro
working with someone elses data
instead of botting the server, just make sure to setup automatic profiling on heavy load instead, that way you can know what is going wrong at scale
Bots let you do a BS test run before shit hits the fan
ill ignore the weirdness, the constructor youâre calling just doesnât exist
a bot isn't going to build a mob farm
They don't really do much but they might be able to pinpoint any weird memo leaks / exceptions at scale which is ok
just hard code the constructor
idk why ur doing it like that
type in what it is man
but not have mob farm on my server
it is an example, players do things that are not replicable by a bot
exactly
Well, on my server everything the players do can be replicated with a bot.
but if you really don't trust your code like that I think you have bigger issues
Easiest way is to have a stress test day, and invite players to help test
unless you want to routinely do this
only other scenario that bots might be useful on is testing some crazy sharded system
I want to do more of a test on my anti-bot/velocity than the server itself.
like minigame matchmaking or some skyblock network
first google result, don't know how well it works
thanks
@bold plume If you only care about online player count, and chunk gen, this exists: https://github.com/PureGero/minecraft-stress-test
but it probably does fine
Well MineFlayer exists. u can program bots in JavaScript or python
thanks
I've made bots in C# in the past
I'm trying to
public class TestComponent<T extends JComponent> extends T {
which isn't valid java but
years and years ago
what are you doing man
wha
blud wants trait impls in Java
YEA
hell yeah
if you reach to that conclusion, you're doing oop wrong
either that or use kotlin and live in hell like rad
hey i was never doing things right
wtf :(
đ
the only thing that's hell in kotlin is fir

What do you mean other peoples data?
some object stream its not really though, its a group project and this isn't exactly part of it just something im messing around with
kotlin serialization is an actual joke
I made a toml -> "ConfigurationSection" converter
if you're using an interface you need a whole codec for it
fym codec
or to make it sealed with like 12 impls in a single file
i dont use kotlin and i dont plan on it
Java Serialization is basically going to be under review for a total rework like a version 2.0, because of how screwed it is, and the bugs and security nightmares it causes
It's just quite crap but so is java serialization
at least that's the impression that Brian Goetz gives
I'm the kind of guy who likes to use the whole factory-registry pattern for decoding data and kotlin doesn't like it
just use dfu at that point
ah yes me and my P14<A, B, C, D, E, F, G, H, I, J, K, L, M, N>
yessss
I wonder if this wouldn't happen if you used method handles
what the hell
I just googled to see what the maximum was, 254 apparently
my memory thought it was around 23, but maybe that's .net
wtf
I guess it wouldn't since you can do invoke with arguments which doesn't care about exact params
yeah, the dude at mojang writing DFU went on some hard drugs while working on it. Wrote papers on it and everything and it still sucks, it's hilarious
real
What's a "DFU"
it works, however it has huge performance issues
Data ~Fu~Fixer Upper
DataFixerUpper, mojang's tool for migrations of data types in Minecraft
Oh
You can make it lazy, (which they haven't done), but also graalvm training would probably speed it up a ton
datafixerupper is my kind of project name
or I could just use leaf's dataconverter and be happy
hadn't heard of that
https://modrinth.com/mod/lazydfu claims that Mojang have mostly fixed it
don't yell at me for Paper, it used to be just leaf's project before he got in the team
very good yea
It would be even better if app did map captchas
If your server have online mode enabled, you should be fine.
How do I set skin on skulls and if the player's name is a cracked user, it doesn't give me an exception?
offline mode isnt supported afaik
isnt true
This is why I went "Oh God Serialization" https://youtu.be/fbqAyRJoQO0 just realized new vid just dropped
Almost three decades have passed since the creation of Java Serializationâa feature which is widely frowned uponâand application requirements for externalization of objects have changed significantly.
_In this presentation we will explore how a changed set of requirements and constraints, paired with recent enhancements of the Java Language, ...
hell yeah 50 minutes of procrastination
Hey i just have 1 question, you can't set a worldBorder on the PlayerJoinEvent?
?paste
I just finished watching that video
Cause this is my code : https://paste.md-5.net/homifaseza.cs
and when i send the worldBorder center to the player, i got this Location{world=null,x=0.0,y=0.0,z=0.0,pitch=0.0,yaw=0.0}
I'm not all that convinced in the new serialization way, however anything is better than the security nightmare we currently have
haven't checked the code yet, but my guess is that the player is probably not on the world yet when you are doing that
Instead of "world" use player.getWorld
It seems a little light weight. I'm a little concerned the guy speaking said he has little experience with jackson.
You think the people with the biggest opinions on the future of serialization would probably be the library authors of serialization libraries & orms
He's trying to reference the world by a string
the world is still null
and it's incorrect spelling at that
add a delay
The world might be null onPlayerJoin for a short time
well, I still got it right lol
Apparently kek
with a BukkitRunnable?
just put your code inside BukkitScheduler#runTask
okay
is joining completely sync? could it not take a couple of ticks for the player to join?
I like to do runTaskLater so i can give it a bit more of a delay maybe 1 tick isn't enough đ¤ˇ
1 tick must be enough for join
if it is taking any more than that, you're blocking somewhere else which isn't good anyway
should be, login is the part that is async
actually joining the world equates spawning an entity, which means world interaction, so I doubt they'd do anything async
if 1 tick is enough, schedule it for 0 ticks
yep that work with 0
it'll be as soon as the scheduler is checked next
and after some test it work thx đ
I don't like 0 tick tasks
the chance of things being executed mid tick causing funny behavior doesn't sit right with me
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/player/AsyncPlayerPreLoginEvent.html
preLoginEvent is async apparently
it has either got to be at the start or end of the tick
I don't like room for other plugins to make my things inconsistent that I'm changing, whenever a 'schedule for zero tick' thing comes up, it gives me chills.
FWIW, PlayerJoinEvent world is defined for me...
[04:26:56 INFO]: UUID of player ryan_the_leach is 46b22bc4-a356-3973-a850-db441059fb0c
CraftWorld{name=world}
@EventHandler(ignoreCancelled = true)
public void onPlayerJoin(PlayerJoinEvent event) {
event.getPlayer().getWorld();
}
but that was running under paper, so YMMV
it is probably not consistent depending on latency or some bullshit
if join is sync, there shouldn't be any latency bs
Latency issues can always happen can it not?
I'm just going to chalk it down to either paper patches, and they are running raw spigot, or that their world wasn't named "world"
He shoulda capitalized w
nah
it also might be that he was joining before the server was up
like while it was still loading
so there wern't any worlds yet
Paper or Spigot, and had the server been running for a bit before you tried joining?
just curious
Paper and running for like 10/20 min
- a lot of reload
cause i'm lazy (i know this is bad)
If you can reliably reproduce it, and you know 100% it's not your setup, I'd report it as a bug to the paper team
imma try
i'm on 1.20.6 i try on 1.21.1?
that patch is ancient, so i doubt it would make a difference unless there was a bug fix in that time
I wouldn't make a bug report before trying though
i try on 1.21.1 and if it don't work i try on 1.20.6
its not a bug
there are some things you can not do in the same tick when the event is fired
even under paper?
even under paper. Not everything is initialized when a player joins thus when you try to do stuff in the very same tick as the event some things can end up being null or just have wrong data
I mean, if that patch above is worth anything, at the very least the location should be initialized so it shouldn't happen
have no idea its paper
they do a lot of stuff to the internals so who knows
whats the easiest way to do this
however we are in spigot discord
i have no money and i really need it
easiest way to create an anti-cheat?
To build it I would assume
I mean it depends what exactly you are trying to stop or what you actually care about
no the source code is there i just need to compile it
Get a job then
you only need maven then
i am 13 and in egypt
aren't the actual checks not in the source code?
oy that sucks
install git for windows, and get maven. Use git to pull the source code, maven to compile
i know how to compile gradle never touched maven
@tidal kettle lets continue this conversation in the paper discord if you are in it
yep
yeah the actual checks aren't there so you're gonna have an anticheat that does nothing
Tf lol
what so there is no way to actually compile and get it too work
I bet it downloads the checks and patches itself at runtime.
nah, the source code just doesn't include the checks
once you have those two things setup, open git bash and navigate to the directory of source where it has pom.xml. Then simply run mvn package generally should be all you need
that's what the paid binary is for
wait so after all this i will have an anticheat without the anti cheat
can i use another anti cheat's check with spartan's features
I have no clue about these anticheats and what exactly they do or don't do lol but as far as compling a project its virtually the same across them usually
uhmm asking for a friend? is piracy not allowed here, right?
Lol
no, it is not
what did you think the answer would be
also I wouldn't recommend getting it from these infamous piracy plugin repositories, they're infected with malware most of the time
not quite, when you purchase the plugin you are basically buying the checks, which are not OSS
i dont mind infecting the server with malware its not mine at the end of the day
they are integrated in the plugin jar when you buy it however
if it isn't yours then why do you even care about getting an anticheat
just use a free one and you're good
I mean, you can do whatever you want, pirate it if you want to, you just won't receive any support for doing so
idk i like doing stuff
they all ass
nocheat++ is still alright
either using all server resources or just flagging everything
and you think an infected anti-cheat would be better than an ass anti-cheat
ironically aside from the malware, it may very well act as an anticheat to fool the person đ
that's still alive, jesus christ
not really i was looking if there was a way to compile these stuff because that would give me a way to get any paid plugin
yes
Not how that works
? explain
Not all premium plugins are open source
you can only compile stuff you have the source code for
if (e.getPlayer().isCheating()) { /* Kick */ }
The majority of premium plugins are not source available
and even the open source ones might have caveats like this one where it has non-OSS resources which are ultimately required for it to work the way it is marketed
Oraxen does a similar thing I believe
Yeah spartan here gives you the framework
people try to get their hand on premium plugins just because they're paid anyway, often times if you look hard enough you can probably find a decent replacement out of the free ones
You still have to write the check logic yourself
it may just not be as convenient
exactly
Hello, why when i trying to get simple command map with reflection it returns null?
private SimpleCommandMap getCommandMap() {
return (SimpleCommandMap) ReflectionUtil.getFieldValue(Bukkit.getServer(), FIELD_COMMAND_MAP);
}
I prefer the inconvenience of searching free alternatives than pirating plugins from dubious sources any day of the week
public static Object getFieldValue(@NonNull Object source, @NonNull String name) {
try {
Class<?> clazz = source instanceof Class<?> ? (Class<?>) source : source.getClass();
Field field = getField(clazz, name);
if (field == null) return null;
field.setAccessible(true);
return field.get(source);
}
catch (IllegalAccessException exception) {
exception.printStackTrace();
}
return null;
}
Why are you getting the command map at all
Mate what are you doing and why
Why wouldn't you
you can't get the command map without reflection
i need register command
that's reflection tho
you can register commands without reflection
is there a reason you aren't just using the plugin.yml
its boring
I would honestly recommend just using a command framework otherwise
commands are a solved problem, yet people always find it in their hearts to recreate them. Wonders of being young I guess
I use lamp and its great
I do not have the patience or passion to reimplement anything of that level of complexity
i dont like other command implementations
Many plugins release the source for free but support is paid
or additional required resources are paid
many people dont know how to compile
guys, quick question, how can i reconfigure the player for them to get autocompletions for a new enchantment
You really don't want to start the argument about bukkits licensing, in the spigot channel of all places.
spigots stance against piracy has a lot less to do with what's legal, and more with, what's morally right.
bump
bump
Also you mention not caring about malware. common minecraft malware is just OPing hackers, letting them take over the server, or lagging you out while it mines crypto
so you might find you do actually care
Question for the spigot contributors here.
I'm looking at fixing SPIGOT-6967. (An issue with unloading worlds via the api.)
The issue references a paper patch that fixes the issue. So, me being curious, I went and hunted it down to see how they approached it.
The paper patch in question is a simple one-liner that flips one boolean value.
I've already check on stash to see if there has been any previous attempt at fixing this issue and I found nothing.
I know that when contributing, we agree to submit our own code. Although, I'm curious about cases like these where the fixes are simple 1-3 liners.
Would it be fine to contribute this change? Would it be best to give credit to the original author? Am I even allowed to submit the same change? Should I submit a different change?
Where is the line drawn for these small changes? Is it super strict and this one change can't be accepted because it's technically someone else's code or is there room to work in?
Once you break clean room I don't think it's okay anymore
bump
This is why i just don't look at paper even if they send the fixed patch or code it's up to you to figure it out yourself
i mean, you can't really "own" flipping a boolean
?cla
in general modifications like these couldn't be called yours to begin with. The best that can be done is acknowledgement of contribution
anyways, in order to contribute you need to sign the CLA where you give up rights to code contributed so the question is in most cases moot
Frost, I've already read and signed the CLA.
The code in question is from paper which they don't have/need a CLA for.
That being said, the code in question is flipping a boolean for one of the internal minecraft methods.
sure, but did they create the code or simply modified existing code
Modified existing
then its not theirs
you can't claim rights to something you didn't create to begin with. I don't know other countries rules around copyright, however in the US modifications like these you can't claim rights to.
so in terms of US standards you are ok with using it đ
hi
is there any API to generate random nicks?
it's not reasonable to claim that you are stealing any kind of codebase when you just flip a boolean
by that logic if I ever work for a business making videogames as a programmer and I then ever go out and make my own game virtually anything I could ever write would be some kind of theft
used a for loop? you'll be hearing from my lawyer
Lol, you can't sue for api provided from the language in question
that's what you think
Oracle lost that battle in the US supreme court
that's fine I heard the US supreme court is into reverting old judgements these days
if we try hard enough we can get there
besides I don't think portuguese courts ruled on this one
yeah couldn't tell you on that last one
I am not in the habit of watching other countries laws/courts etc
big money
imagine all the money I will get from suing all the 1 and a half game studios in this country
since I have one I'll have to hunt down whoever has half
lol
this code is starting to annoy me
Frost I gotta clip one of the throws I made in game lol
I keep rewriting how it works
somehow it's now reverting 4 million chunks in a couple of minutes and then crashing
which is an interesting choice
oh you know what it's probably overflowing
idk how you have it implemented to do this
wave function collapse but for some reason it's not currently recognizing anything as being a valid border
so it's just basically looping in on itself
not sure if it's the new code for border validation messing up or initialization messing up but I do know I messed up by changing both at the same time making it exponentially harder to test
lol
I would recommend using file memory mapping. Not sure about the border thing
with 1-2GB dedicated to memory mapping you should be able to handle that much
also a nice advantage of memory mapping is that if the application crashes, the OS will take care of closing out the file gracefully
so offloading chunks to a file during runtime?
this is definitely something I was considering doing though I was wondering if I was going to do it via database for faster access, wasn't really sure
there's, uh, a lot of chunks
the small generations are fine but it can quickly get into low millions if people push it
memory mapping works as long as you have extra ram to accommodate it.
yeah problem is that at a scale I'll never have the memory
at a certain point, but ideally you will be removing stuff out of the mapping when you don't need it anymore
it depends. I know with memory mapping with 1-2GB you can handle something like 10-20mil blocks
and a test of that was back around 1.7-1.8. Given the updates to java it should be more efficient
you could even combine a DB and memory mapping too, if you want to have a queue that works over time đ
well ok it's not nothing, really I am not dealing with blocks it's chunks
so 20 mil chunks is actually quite a bit
yeah that's the thing I probably do need to keep the data long term which is why I was considering a db
either that or I need to jank it up with some pdc on chunks or something
which might be possible, not sure
not that far in yet
if I was making what you were, I probably would redefine how large a chunk is
16x16x16 is already a size unit we tested and are going to move forward with, we already started making the content for it
ah
the priority is how well it works for the modular builds, not performance, though it's not the worst for performance either
well, then the other thing you could do is redefine how large a region file is
turns out 16x base is pretty neat
to lessen how many files need to load/unload
currently I think a region file holds 1024 chunks
some of the modules we've been working on
nice, those look great
yeah and they're all base 16 but also modular within themselves
we have multiple different inner modules for them
same modular room, different inner modules
I can't believe this is also all going to be free
I don't know why I keep doing this to myself
Hmm magma I wonder if youâd be able to give me some advice on your random generation stuff, Iâm wanting to do some similar stuff for disc golf course generation
Is there a alternative to OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(targetName) because this seems deprecated
probably the UUID version ?
send
but id need to get their uuid by name
Yeah but he looked at the patch pretty much guarentees a can't fix right there
Then you're doing something wrong probably
You should never save anything by player name
Hey! I'm trying to start up my plugin on a paper server but it doesn't seem to work.
I haven't had this issue with a spigot plugin i made before.
[22:38:40 ERROR] Could not load plugin 'localcrystal.jar' in folder 'plugins'
[22:38:40 INFO] org.bukkit.plugin.InvalidPluginException: Unsupported API version 1.20.1
[22:38:40 INFO] at org.bukkit.craftbukkit.v1_20_R1.util.CraftMagicNumbers.checkSupported(CraftMagicNumbers.java:380) ~[paper-1.20.1.jar:git-Paper-196]
[22:38:40 INFO] at io.papermc.paper.plugin.provider.type.spigot.SpigotPluginProvider.createInstance(SpigotPluginProvider.java:119) ~[paper-1.20.1.jar:git-Paper-196]
[22:38:40 INFO] at io.papermc.paper.plugin.provider.type.spigot.SpigotPluginProvider.createInstance(SpigotPluginProvider.java:35) ~[paper-1.20.1.jar:git-Paper-196]
[22:38:40 INFO] at io.papermc.paper.plugin.entrypoint.strategy.modern.ModernPluginLoadingStrategy.loadProviders(ModernPluginLoadingStrategy.java:116) ~[paper-1.20.1.jar:git-Paper-196]
[22:38:40 INFO] at io.papermc.paper.plugin.storage.SimpleProviderStorage.enter(SimpleProviderStorage.java:39) ~[paper-1.20.1.jar:git-Paper-196]
[22:38:40 INFO] at io.papermc.paper.plugin.entrypoint.LaunchEntryPointHandler.enter(LaunchEntryPointHandler.java:36) ~[paper-1.20.1.jar:git-Paper-196]
[22:38:40 INFO] at org.bukkit.craftbukkit.v1_20_R1.CraftServer.loadPlugins(CraftServer.java:510) ~[paper-1.20.1.jar:git-Paper-196]
[22:38:40 INFO] at net.minecraft.server.dedicated.DedicatedServer.e(DedicatedServer.java:273) ~[paper-1.20.1.jar:git-Paper-196]
[22:38:40 INFO] at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1100) ~[paper-1.20.1.jar:git-Paper-196]
[22:38:40 INFO] at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:317) ~[paper-1.20.1.jar:git-Paper-196]
[22:38:40 INFO] at java.lang.Thread.run(Thread.java:1583) ~[?:?]
Those can change, UUID can't
Try it on Spigot
i do save it as uuid but i have to scan through all the saved files to get offline player uuid. to find alts
I'm not sure when api version started accepting "minor" versions
the only alternative is to look up by querying mojang servers directly.
but I am pretty sure that method does that if it can't find the player locally
so you might just have to set it to 1.20 instead
it is deprecated not because you shouldn't use it, but because it uses a string name which names can change and should just be aware of that
I'll still need to add it to the server and the server is paper
SpigotMC maintains the Spigot server. If you are using a fork of Spigot (such as Paper, Airplane, Purpur, or other derivative works), you should seek support in the appropriate Discord servers.
Plugin is spigot.