#help-development
1 messages · Page 1311 of 1
But you can also inline it if there's no point in keeping it separate
@worldly ingot do you need help
?softban @shrewd dome Compromised account
Done. Enough chaos.
idk if that was a comp account or just a very literal child trying to make money
Hi guys! I'm stuck on cancelling particle packets using packetevents. Can I share my code?
sure
ok here is my main class https://pastes.dev/RfZdcM4VOc
and the listener https://pastes.dev/7UizooQKOK
The console doesn't show anything
No error, and no "Large smoke detected"
When I do /pl I can see both packetevents and my plugin, and there are no other plugins installed
try maybe loading packetevents first then registering the class
I've modified your code a little so that it simply gives me a packet dump, and I think the reason it doesn't work is because the smoke particles surrounding the blaze are only being displayed clientside. I'm only seeing particle packets listed in the console when I run the /particle command manually
-# This is just my speculation, I’m not entirely sure if this is 100% accurate
Ok, thank you very much for your help!
Does anyone know how to make any block output a redstone signal?
I have only done some google searching and a few searches in the docs and didn't find much, most was from years ago where it apparently wasn't possible, anyway before I go on and probably end up spending a while trying to figure this out I just wanted to know if anyone here has the answer?
Yes, many particles are spawned clientside, the same applies to many other effects like sounds
how to execute a command as a player BYPASSING their permissions?
(mention me im blind)
You basically need to give them op or a * perm and then remove it again
Keep in mind that is quite risky
it will be too broken
Do use a try with finally block to ensure the perm is removed in case of errors etc
i don't think even luckperms allows for you to do anything smart with it
I need to execute it as player
cause betterjails will send
masiha2ez jailed by CONSOLE
and yeah thats very annoying
smells very xy
So this isn't a development question?
Yeah it is
But a betterjails question on how to get rid of that message
Move to #help-server or their discord if they have one
i have to do one of this :
1.Make console name senders name
2.Execute as player bypassing their perms
They doesnt have API
How to at least do one of this
even if they don't have explicit api, you can build directly against their plugin to call whatever jailing logic they have
giving them op makes plugin unsecure
well, you don't really have any alternative
Now the question is why are you running the command as console in the first place
oh wait Emily made that one ? :D
Just ask her haha
If you want to run it as a player just let the player run it?
She does lurk around here sometimes
Ugh...
I was working a project to interact with betterjails and do some things but I found there was a easier way to do this
Now
does betterjails let me define jail sentences in terms of coal mined rather than time online
i should at least add support for indefinite sentence times rather than requiring a duration, that way at least one could hook up to it and do whatever other releasing requirements
my free time:
my time spent on discord: 💯
MAX_INT + 1 just incase
I mean, it would just give you MIN_VALUE but yeah lol
o.O
Numbers overflow if they run out of bits
What's 0111111111 + 0000000001? (Demonstrative, integers have 32 bits). It's 10000000000
Fixed my explanation. Negative bit is flipped, all other bits are flipped
Wait no I'm stupid
Give up
I know what I want to say
TRUST ME IT WORKS
I'm gonna give it a try
if choco says it works then it works
(it does work)
not just that
hes also an expensive bitch
so you KNOW hes smart
jokes aside i am pretty sure that explanation is infact how it works
Definitely expensive
Integer.MAX_VALUE and Integer.MIN_VALUE
i always use MIN_VALUE as debug when only positive values are possible to be extra dramatic
Which, by the way, in-and-of-itself proves that it's true lol
@Native public static final int MIN_VALUE = 0x80000000;
@Native public static final int MAX_VALUE = 0x7fffffff;
MIN_VALUE is 1 more than MAX_VALUE
i had to deal with an integer overflow very recently because one of our devs (me) was dumb enough to multiply two player-entered numbers without any checks
and that caused people to be debited negative money
-2.14, that's the output o.O
Well, e31 probably, but yes
Which is MIN_VALUE, im guessing?
Correct
man i love bases
mostly due to their amazing uses
GENIUENLY, uni comp classes are so boring
i love competitive programming because those people find the best ways to do stuff
i just love looking into and understanding that stuff and seeing just how unintuitive or intuitive some solutions can be
Apparently, they dont teach you Java until you're 2~3 years in cause it's too "advanced"
sounds a lot like my high school experience
Which means, you'll have JUST 1 year to get completely familiar with it, before placements
😭
thats what LTS 25 is for 
For people that haven't touched a programming language, that makes sense. Python or Lua is usually the starting language
If they're insane, sometimes they start you out with C++
I started with C++
My university's first programming course was C++ lol
And now they're teaching python
nah but in my high school we started python in 11th fuckin grade
and from my high school i mean every single school in the country that follows the same teaching board
c++ makes sense to get you close to the principles programming languages like java already cover
atp, ill be happy if I get placed in mcdonalds 😭
And it's kinda like a scripting language until it's not
back when my brother was in high school it used to be cpp instead of python
It's just the std:: in front of everything that confuses beginners with C++, which is fair. Modern C++ actually has an std::print() now though which helps a bit, but that would also require universities to catch up and teach modern C++
cpp isnt as boring as python
let's be honest
python makes me angry
Python is an interpreted language, which yes you could describe as a "scripting" language
+1
no python no ai
i ignored everything tho and just kinda went my way
iirc I went python -> cpp(started competitive programming stuff) -> java(around the same time as cpp) -> lua
more like no python = ai that doesn't require the power consumption of 25 nuclear plants to operate
it's cool if you know what you're doing
cuz i learnt cpp to do competitive programming and not cpp itself i started out with std/bits so i didn't have to deal with that bs
like i can just be the architect and tell the ai what exactly i need in what way
if the people working on ai didn't have the crutch that is python, someone would've done it in a real programming language instead
we probably would've sequenced the human genome thrice faster as well
The thing of vibe coders is that most of them don't know what they are doing
They just type shi into chatgpt
this
that's the problem - not vibe coders per-se
and all of them think they can conquer the world
THAT part is the actual problem
i really hate the term vibe coders actually
"please develop me an anticheat similar to hypixel" 😭
it's funny how chatgpt interprets action events as uhh
for those
holdon, any anticheat nerds here
does it actually work through action events? or?
packets
i just realised this entire convo was in #help-development and not #general
it depends on the actual anticheat, but almost all of them listen to packets on the protocol layer at least to some extent
most also have at least some bukkit api listeners as well
ACTION.LEFT_CLICK_BLOCK, no right?
back in the days this was the general chat
I'll spend 4 nights tweaking a promp in notepad just for the AI to hallucinate a complete monster instead of learning to code
And you will pay me 4000$ for it
I have $4 in my bank rn
oddly specific - it really depends. most of the times you just read the packets data and feed them into your algorithms
it still is
or as vcs2 said listen to bukkit listeners and interpret that data
most of the time the chat looks dead ngl
nerd 🤓
if there is no item in hand it returns air right
because the item cant be null and the type cant be null so it has to be air right
depends a bit on the specific api method
many inventory api methods will return null for empty slots, many others will return air
you can generally trust the nullability annotations to figure out which is which
#getInventory()#getItemInMainHand()
hi!! sorry, i have no clue where i need to go with this question -- but i'm looking for a dev who's capable of creating custom biomes. my dms are open! sorry if this isnt the right place to say this!!
?services
If you wish to request or offer development/art/building/administration services, please do so at https://www.spigotmc.org/forums/services-recruitment-v2.54/
well plugins can create custom biomes to some extent
if you are explicitly looking for mods then yes, wrong place
nope, plugins or datapacks
plugins = right place
datapacks = still wrong place, sorta... maybe in #help-server ?
thank you so much!! ill check that out
how do you use non spigot plugin libs?
in your plugin?
i saw something about maven shading and ClassLoader too
shade it or add it to libraries field field in plugin.yml
is that the only right way?
unless its provided in the api or from mojang you have to provide it somehow
ideally you dont even reference a dependency from a jar, you should publish it to a repo or maven local and depend on it through your build system
then i build the jar
it just takes the lib source and put it into the plugin?
with shading right?
you should use the maven shade plugin and the right classifier to shade or use the gradle shadow plugin with the right scope
if its your own java lib you publish it to a repo or maven local and then reference it that way
alright
so shading is the way?
up to you, if its on maven central you can use the plugin.yml libraries field
thank you for trying to clearify it
guys i need help ShadowJar doesnt work i dont if i did everything right 😭
https://github.com/ZoneXzzz/BeyonderX/tree/master
i dont see shadow jar or any shaded dependencies on that
or a valid plugin.yml for that matter
group = 'org.example'(build.gradle)
actual package issrc/main/java/com/jake/beyonder
lowercase class name (main.java)
two entry points
no spigot or paper in the build.gradle
massive amounts of code, with imports. That could not be written if no dependencies were given.
i did take a wild guess when i looked at the rest of the code
obviously AI. no human writes that amount of code without having dependencies... Like how the fuck do you have import if you dont even have the dependencies to reference.
what's that 😭
why is there a random empty main class lol
that’s what I mean 😭
It’s lowercase too
And his gradle doesn’t even define the entry point.
I DONT KNOWWWWW IM NEWWW 😭 i dont know whats going on there is so much
it do be like that when Claude generates too much code.
Gradle plugin to create fat/uber JARs, apply file transforms, and relocate packages for applications and libraries
Looks like the ai revolution is thriving.
Does someone know the reason why in bungeecord plugin.getExecutorService is deprecated?
its deprecated since it was added
Probably an internal, you should use the Bungee Scheduler API instead
Sadly its not documented
the scheduler api?
no the getExceutorService method
I see
every other method in the plugin class is
i was thinking about making the executor service a virtual thread executor service, its way better if you on java 21
Ye should use scheduler
do you think we should check the java version an utilize a VirtualThread based ExecutorService for the scheduler if possible, should be much more efficient
No idea
<3
Give me 200 dollars and I'll offer you a free trial of my ai plugin assistant that is totally not deepseek repackaged in a crappy vibe coded ui
I dont think your plugin will even work 😭
The plugin.yml is empty
Nor does your main class implement any of the methods required 😭
Okay wait
Nevermind, your main class isn't "Main" class
oh, epic already said that
@remote swallow ur epic
// Optional: Send message for debugging
// player.sendMessage("§9Sailor Protection: Reduced damage from " +
// originalDamage + " to " + reducedDamage);
}```
HMMM 🧐
yea im kinda lost so im just gonna restart and see if it wil work this time 😭
but what am i supposed to do then??? 😭
// player.sendMessage("§9Sailor Protection: Reduced damage from " +
Does this work without translator?
learn java!
THAT TAKES SO LONNNNNGGGGG
Well you have to
if i edit Player#displayName, i will automatic update Player#getDisplayName?
do you mean .setDisplayName?
Hello
this is the part that makes vibe coders so hated
even some of us use ai, but for boilerplate, not to blindly build the whole thing
ai is a tool, if you dont know how to program, you wont get good with it by just using ai
if you dont know what you are doing, you cant know if the ai is spouting nonsense or saying things that could actually help
Yes also
?whereami
yes, Component displayName()
Yes
No, components are immutable
Or are you talking about Player.displayName(Component)? Yes, calling that setter will change the player's display name, which is what getDisplayName gets
send pics pls
nuhuh
He like 75% was
I don't like the adventure style getters and setters without the get/set prefix because of this
Can’t rmbr their reason for not overloading
You can't really overload getters I suppose
True
i think the same reason spigot doesnt
This
hello everone
can somone code my a plugin
?services
If you wish to request or offer development/art/building/administration services, please do so at https://www.spigotmc.org/forums/services-recruitment-v2.54/
yes
the sheer amount of lowballers i get is insane
over time ive started to just inherently be less nice while saying no
"faurk off"
Hi, I’m having trouble enabling 2FA in my Pterodactyl panel. Whenever I enter the 6-digit code from Google Authenticator, the “Enable 2FA” button stays unclickable and it keeps asking me to enter a 6-digit code. I’ve already tried multiple authenticator apps and cleared my cache, but the problem still persists. Does anyone know how to fix this?
have you tried the pterodactyl discord?
😢 no
oh ok
Try using the QR code
or just switch to pufferpanel
🙏
👍🏻
I am using this code to create a particle sphere that is shot from the player, but the problem i am facing is that there is a large delay, and then all the particles appear at once, instead of there being small delays in between. for (Location loc : locs){ Block b = loc.getBlock(); if (!b.isPassable() && !b.isLiquid() && b.isCollidable() && b.isSolid()) { if (b.getType() == Material.FARMLAND){ Farmland farm = (Farmland) b; farm.setMoisture(farm.getMaximumMoisture()); } break; } List<Location> sphereLocs = ParticleUtils.fibonacciSphere(loc, 0.75, 24); for (Location loc3 : sphereLocs){ loc3.getWorld().spawnParticle(Particle.WATER_DROP, loc3, 10); } for (Entity entity : loc.getNearbyEntities(0.75, 0.75, 0.75)){ if (!entity.isDead() && entity != p){ LivingEntity le = (LivingEntity) entity; double wandPower = NBT.get(wand, nbt -> (Double) nbt.getDouble("power")); le.damage(wandPower * baseDamage); Vector unitVector = entity.getLocation().toVector().subtract(p.getLocation().toVector()).normalize(); entity.setVelocity(unitVector.multiply(1)); } } try { Thread.sleep(50); } catch (InterruptedException e) { throw new RuntimeException(e); } }
You cannot use thread.sleep in a plugin
You need to use the bukkit scheduler (google it)
The problem is you are pausing the server for 50 ms over and over and no packets can be sent
Each loc from locs should be a new task scheduled 1 tick later than the last, or 1 repeating task that steps through locs
ok, thanks
how can i stop the for loop from within the BukkitScheduler? I can't use break, nor can i create a boolean within or edit one within the lambda
nvm,
Hi! Looking for advice on timing/ordering.
Goal
In a specific world, when a player breaks a crop we cancel BlockBreakEvent and send a client-side AIR update for X ticks (via a third-party networking layer, conceptually similar to Player#sendBlockChange). The real block is never changed server-side.
Observed
Immediately after the break is canceled, the client briefly renders the vanilla crop before our AIR takes effect. After that, AIR holds correctly.
What we already tried
- Listener at LOWEST with gating → cancel.
- Sending the client update in the same tick (scheduled on main) and also next tick.
- A short “suppress window” on our side so any immediate paint in the next few ticks should be treated as AIR for that index.
- No
/reload, main-thread only.
Questions
- Is there a Spigot-side pattern to guarantee that the very first render after a canceled left-click break uses our client-side state (AIR), so the vanilla crop isn’t shown first?
- Would you recommend hooking an earlier event than
BlockBreakEvent(e.g.,PlayerInteractEventwithLEFT_CLICK_BLOCK) to push the client update sooner? - Is there any supported way within Spigot to veto/override a same-tick block update the server might send, even though the break is canceled?
Happy to provide a minimal repro if helpful.
Why you cancelling the event then sending air anyway?
Thanks for the quick reply!
In this world we don’t want the block to actually break (no world mutation, no drops/physics, multiple players can “farm” the same crop concurrently). Showing AIR is purely per-player feedback for a short window; later we re-spoof the player’s view back to the crop state. In other words: cancel prevents the real change, AIR is only a visual overlay for the breaking player.
The only wrinkle we’re trying to solve is that right after cancel the client briefly renders the vanilla crop before our client-side AIR takes effect. We already tried sending the client update in the same tick and next tick, listener at LOWEST, and a small suppression window on our side.
Any guidance on hook/priority/timing you’d suggest?
I'm using this repeating task now ``` int i = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(Alkatraz.getInstance(), () -> {
List<Location> locs = ParticleUtils.fibonacciSphere(a.getLocation(), 0.75, 12);
for (Location loc : locs){
loc.getWorld().spawnParticle(Particle.WATER_DROP, loc, 2);
}
for (Entity entity : a.getNearbyEntities(1, 1, 1)){
if (!entity.isDead() && entity != p){
LivingEntity le = (LivingEntity) entity;
double wandPower = NBT.get(wand, nbt -> (Double) nbt.getDouble("power"));
le.damage(wandPower * baseDamage);
Vector unitVector = entity.getLocation().toVector().subtract(p.getLocation().toVector()).normalize();
entity.setVelocity(unitVector.multiply(1));
}
}
}, 0L, 1L);```
but am not sure how to stop the task if the arrow (a) hits the ground, any ideas?
You can try a different event (ie interact like you suggest) or block the packet with a packet library. There's no API way to cancel the event but leave the client in the wrong state
You can cancel task by the task id (i) as for the ground, you can use a projectile event
oh yea, thanks for the quick reply
Appreciate it!
Hi guys , im new to this world...so i was thinking if some incredibly good person would like to help me get into the spigotAPI programing world with minecraft ? ( in vc or dm ) 👉 👈
Do you want someone to hold your hand or do you have specific questions?
Do you know Java first? Probably learn that.
how to hide the applies to: and ingredients: fields?
I believe this is what you're looking for? https://hub.spigotmc.org/javadocs/spigot/org/bukkit/inventory/ItemFlag.html#HIDE_TRIM
I think this one hides the trim from armor
I don't think the lore from Smithinkg Template can be hidden tho
Not in latest atleast
not really, since not so long ago that lore has become hardcoded
what you can do is hide the tooltip entirely but that wont even show the name or lore at all
Is the bungeecord repo dead?
still exists on the public repo not the snapshots repo https://hub.spigotmc.org/nexus/#browse/browse:public:net%2Fmd-5%2Fbungeecord-api%2F1.12-SNAPSHOT
Sonatype Nexus Repository
do you mean something like this?
yes
like when using that /give command it give suggestions like minecrft:diamond, minecraft:iron_ore
That’s possible with brigadier, which spigot doesn’t expose directly, I’d suggest using an external command framework if you want to do that
you can have non colored ones, which would be always blue afaik from the bukkit tab complete methods
oh
unless you want the simple List<String> that onTabComplete provides
Thank you
yeah there is no way to hide it, since like you said its hardcoded in the client, so the only way around it is to set the trim as an item model for another item, especially if your application is for in a menu
so in short, you cant unless you dont use that item directly
but, like I said another item that you give this model to
I got my answers in paperspigot discord
Ty nonetheless
in what
they traveled back 10 years and asked paperspigot
I have a java related question. With lambda expressions, I know you have to declare the parameter(s) if an abstract method requires them, but do you have to use those parameters somewhere in the code block you provide as an implementation of that abstract method?
how to i test my plugin aternos doesnt let me put my plugin in the plugin folder
Local host 
how do u do that?
Just search on youtube, local host minecraft server setup
Very convenient as well
is ther papermc 1.21.5? i can only find 1.21.8
?whereami *sigh*
hehe whoops :>
🤣
really cool to tag me for that, thank you
-# pelase don't...
🤣
yall know how I can make directional particles with the cloud effect
nothing i am nothing is working; i'd them like to move upwards
not all particles support setting a velocity
what have you tried so far
iirc to set the velocity of a particle, you have to spawn them one at a time with count set to either 1 or maybe 0, and then the particle spread parameters are treated as a velocity vector
it would be very nice if it was documented somewhere in the javadocs, but i think the api method has parity with the ingame /particle command so you can check the mc wiki documentation for it
Yeah I've tried setting the offset Y to 1 and everything else is basically 0, speed and count. Also tried changing the speed but it didn't work
The cloud effect direction can be changed since other servers have figured it out somehow
how did damage events work with modifying the final damage again? i want to put a hard cap on damage per attack, but i want it to apply after armor, resistance, and other damage reductions have been applied
What does the javadocs say
i don't know, the papermc javadocs are down
joking aside i can see that there's a getter for the final damage, but i don't see any way to set the final damage, only the raw damage
that is the final damage
setDamage sets the final damage to something. internally it has modifiers that it will go throuhg and reduce the damage
Here is the impl. for 1.8 (probably the same throughout most version)
public void setDamage(double damage) {
double remaining = damage;
double oldRemaining = this.getDamage(EntityDamageEvent.DamageModifier.BASE);
for(DamageModifier modifier : MODIFIERS) {
if (this.isApplicable(modifier)) {
Function<? super Double, Double> modifierFunction = (Function)this.modifierFunctions.get(modifier);
double newVanilla = (Double)modifierFunction.apply(remaining);
double oldVanilla = (Double)modifierFunction.apply(oldRemaining);
double difference = oldVanilla - newVanilla;
double old = this.getDamage(modifier);
if (old > (double)0.0F) {
this.setDamage(modifier, Math.max((double)0.0F, old - difference));
} else {
this.setDamage(modifier, Math.min((double)0.0F, old - difference));
}
remaining += newVanilla;
oldRemaining += oldVanilla;
}
}
this.setDamage(EntityDamageEvent.DamageModifier.BASE, damage);
}
right, i guess that makes some kind of sense, ty
yall know how I can make directional particles with the cloud effect
nothing i am nothing is working; i'd them like to move upwards
does what you tried work with other particles?
if all else fails you can use a network debugger on the client to dump the particle packets that other server you mentioned, and see what values they have
Code?
One second im trying something
ParticleEffect particleEffect = new ParticleEffect(
EnumParticle.CLOUD,
player.getLocation(),
0f,
1.0f,
0f,
0f,
0,
1
);
PlayerUtils.EffectProcedures.sendEffect(player.getWorld(), particleEffect);
i have my own custom class
public ParticleEffect(EnumParticle particle, Location location, float xOffset, float yOffset, float zOffset, float speed, int count, int... data) {
super(new PacketPlayOutWorldParticles(particle,
true,
(float) location.getX(),
(float) location.getY(),
(float) location.getZ(),
xOffset,
yOffset,
zOffset,
speed,
count,
data));
}
the count is 0 and the thread says the extra data is the speed
which is 1
Alright so i managed to fix the speed, but it's colliding with the player
specifically the head
Wdym colliding
So it's going upwards now but when the particle reaches the player's head its going back down
If I run it'll go straight up forever
I think if I just add some xz offsets it will fix
Okay nvm I don't know how the hell this works at all
but setting the y offset to 2 instead of 1 moves it all the way up
i dont think it was colliding i just think it was only going up 1 unit
but 2 makes it go up forever so.
Its fixed atleast
nvm idk what's going on
it has defeated me, i cannot teleport player to desired location somehow,
the location that im trying to teleport player to is good
Location{world=CraftWorld{name=world},x=0.5,y=90.0,z=0.5,pitch=0.0,yaw=180.0}
reverse your guard clause. player is likely out of scope
code after teleport gets executed
normally
there was message after it but i removed it for screenshot
we need more context than this
Thats the problem
ITS THE WHOLE COMMAND
Nothing more
nothing less
just teleports player to spawn
its supposed to teleport player to spawn*
but doesnt do it
change the guard clause.l Its failing on an invalid player field.
no I think that works just fine
Why final
depends on teh IDE
I have had an out of scope field like that with it out of scope
its a simple change to test. So not like he has to jump through hoops to try it
ye, fair
that should be perfectly fine
It "should"
it always does
Eclipse will actually error on teh player field if you attempt that
Eclipse moment
im using intellij
That's fine then
i did it just for you
it sent me a message but didnt teleport me
before you ask
why player is underlined
Why are you teleporting the player to itself?
well yeah, you teleport to the players own location there
wait
wrong
even tho it was wrong and i changed it to this.getSpawnLocation it still didnt teleport me
.
sysout the actual spawn location you are trying to tp to. Before teh teleport happens
does it even matter if new location doesnt work?
funny thing is that in join event it works perfectly fine
even if i do it in task it doesnt work
you fixed your guard clause so there is nothing wrong with any of the code you have shown us
and thats why i came here, somehow it doesnt work
you'll have to show more for us to see
theres nothing more
There is no issue with spigot teleport so the issue is you
also, yeah why is player underlined?
this apparently
yeah
ah IJ being an ass
i always use finals wherever i can
What you can do next is to just remove as much as you can - create minimal plugin where the issue happens
And share all the code
so i cannot overwrite crucial variables
What commnd framework is that
my own, i just create command class and everything is being registered in spigot using reflections
oh-
Does the player have a passenger
nope
Or is the player riding something
nope
Try if it's working with commandexecutor first


Don't tell me that spigot can't TP that...
Why would that be a problem
Spigot teleport doesn’t like passengers
Why is this so outdated
It works fine in vanilla now
This is dumb
thats the passenger of player
Well there’s your problem
I spent WAY too much time on these few lines...
Create your own tp logic by dismounting the passengers, teleporting all of them and mounting again
or call NMS teleport function
or dispatch /teleport
i just had to remove all passengers from player, they automatically respawn
Hey, I’m trying to create something similar to the bar mini-game from the CustomFishing plugin, but I ran into an issue:
my pointer is always being rendered under the bar instead of over it. I’m moving the pointer by adjusting the textures offsets. and I'm using a action bar.
Any ideas for a workaround?
this is what I did...
render the pointer after the bar instead of before
AnvilInventory.setRepairCost is deprecated. what do i use now?
there's a method for that on the anvil inventory view now iirc
ye
Hey so I managed to figure out why it was acting so strangly
after looking in the MCP code
In the onUpdate method in the EntityCloudFX (cloud particle effect) it contains this logic
EntityPlayer entityplayer = this.worldObj.getClosestPlayerToEntity(this, 2.0D);
if (entityplayer != null && this.posY > entityplayer.getEntityBoundingBox().minY)
{
this.posY += (entityplayer.getEntityBoundingBox().minY - this.posY) * 0.2D;
this.motionY += (entityplayer.motionY - this.motionY) * 0.2D;
this.setPosition(this.posX, this.posY, this.posZ);
}
if (this.onGround)
{
this.motionX *= 0.699999988079071D;
this.motionZ *= 0.699999988079071D;
}
thats why when i was jumping the cloud particles were like snapping towards me
downwards
i dont know why thats even a thing
i guess to send smoke signals with campfires...
stand on the campfire to back up the smoke and then step off to release it, or something
This is 1.8
but yeah
I don't understand still why there isn't an option to disable this (there probably is. i just dont know how)
this.posY > entityplayer.getEntityBoundingBox().minY
this is the line that causes me issues
because if the particle is above the feet it just falls back down
so annoying man
[Looking for Developers, Lore Writers & Social Managers]
Hey everyone! 👋
I’m currently working on a new dark fantasy RPG/MMORPG Minecraft server called Shardbound.
The lore is centered around a world consumed by darkness after the Sun shattered, with unique mechanics like The Hollowing, custom bosses, dungeons, and legendary relics. ⚔️🌑
I’m looking for passionate people to join the project:
• 🛠️ Developers (plugins/datapacks/mods)
• 📜 Lore Writers (worldbuilding, quests, item stories)
• 📢 Social Managers (TikTok, Discord, community hype)
If you’re interested in helping shape a unique RPG world from the ground up, send me a dm.
isn't that some nft card trading game
?services
If you wish to request or offer development/art/building/administration services, please do so at https://www.spigotmc.org/forums/services-recruitment-v2.54/
Hey just an update
I finally figured it out; they use the explosion_normal enumparticle to produce the effects similar to clouds
Hello guys ! I'm trying to create circular borders like with custom textures like in that clip, do someone know how to do it ? I did not find anything : https://www.twitch.tv/sowolis/clip/HappyBreakableChickenMoreCowbell-dJ3Jei6t0ikO9CM_
Probably a block/item model inside a block/item display at the center which is then scaled (if the border is resizable)
Do I need to use BlockBench ?
I can do the model etc, I extracted it and tried but I still have rendering error ingame with black and purple block
I canno't find anything on the internet, not a single code anything
It is a circular border, with a custom design
🤣
?
funny name block bench
it is a software
Might be some shader magic
dows not sound like Minecraft name and another thing sounds like a windows program
anyway cya
Item models can’t be circles

Wait is it a circle
it's not a perfect circle
yeah 22.5 angles is what it looks like to me
but true that there is a lot of movement
actually hmm maybe not 🤷♂️
Wait can’t you do any angle from -45 to +45 now
Or -90 to +90, idk something like that
haven't really kept up with that so no idea
it is
Can we make this kind of gui in which gui elements changes using spigot coding if yes then how like which methods or what things to be used to make it
Unless Minecraft has changed a lot in ways I'm unaware, that must be a resource pack
Possibly with villager trades, although that could be a bedrock screenshot
well its a screenshot from origin realms server
i just want to know how does the color of the trades changes according to the balance
Yeah that's doable with custom GUIs
I do this kind of menu at work
Let's say you have a fancy abstraction that involves "layers"
You have 6 layers for the 6 trades, a layer for the up button, a layer for the down button, and a background layer
You can use chat colors to tint the trade layer glyphs and/or hide them when you reach the bottom
and just change the glyph of the up/down layers based on if you can scroll in that direction
I also used that principle to do this kind of stuff
and I used a layer system for these guild uis
Buenas nececito contactar con soporte
The up and down thing I can do that so is it even possible to set the requirements for the change of glyphs like hiding one and make another appear
Do you use any external plugin for it or you coded the plugin for gui
I see so you made a config.yml for it ?
or used a plugin like deluxemenu or Nexo or ItemsAdder
I see got it
TIL that Map.copyOf doesn't copy the order of LinkedHashMaps
spent an hour tryna figure out why things weren't ordered
Damn
It took me literally hours to understand that it's fonts , glyphs and resourcepacks
and chat colors!
or for tinted items it can be anything but usually it's leather horse armor
with the attribute component hidden
Yeh bro that was a pain I was mad why the gui looked dark
It was literally white color code
which made the gui appear as it is
It took me literally 15-20 mins figuring it out
you could in theory take the dummy approach and make like 48 glyphs or whatever
Aaaaa nvm
Will go the smart way rather
There must be a tutorial about this and it will help many developers
I still dont know how the calculation works, i mean everything is at the title. But if my title gets longer the other stuff is moving to other directions, so i need to shift again yk?
if someone was nice enough to make one
otherwise not really
If I guess it correctly then the layers work upon conditions like claim-1% , claim-2% so ig the title changes as per the conditions
that's why it's called title layers
It changes accordingly
That's my guess
Hm right
Welll, there kinda is here but its a little outdated http://resourcepack.wiki/
most of the font stuff still applies tho
I see
qq
was it recommended to use optionals or no?
@nullable it is
what?
What's the bungeecord repo link?
Maven link 😭
bro
xd
<repository>
<id>bungeecord-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/public/</url>
</repository>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.21-R0.4-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
lmao
i am nut sure what bungeecord has to do with minecraft 1.8
Well, this happens whenever I try reloading or building the plugin
net.md-5:bungeecord-chat:jar:1.8-SNAPSHOT was not found in https://hub.spigotmc.org/nexus/content/repositories/snapshots/ during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of spigotmc-repo has elapsed or updates are forced
it no longer exists as a 1.8 binary
I kinda hope it stays dead so ppl are forced to update to modern versions
unsupported
😭
build it yourself
There are alternate maven hosts supporting it. But nothing official
nvm I just updated the plugin to 1.21.5
you'd think some from-scratch rewrite of the entire 1.8 server would've caught on by this point
it's kind of uncanny how they keep it on life support still
People are too busy porting mc to rust to do that
how can i block this warn ?
Method invocation 'setExecutor' may produce 'NullPointerException'
this.getCommand("icon").setExecutor(new IconCommand(this));```
define the "icon" command in plugin.yml
oh wait it's just warning
yep
well either do nullcheck or just have the IDE ignore it
Objects.requireNonNull I think could work too
what need i nullcheck ?
if (this.getCommand("icon") != null) {
this.getCommand("icon").setExecutor(new me.vasir.commands.IconCommand(this));
}```
aah oke
well im still getting warn
show code
maybe i need ignore
Command iconCommand = this.getCommand("icon");
if (iconCommand == null) return;
this.getCommand("icon").setExecutor(new me.vasir.command.IconCommand(this));```
btw
tried var
well you gotta use that variable
wdym for "var"?
Command iconCommand = this.getCommand("icon");
if (iconCommand == null) return;
**iconCommand **.setExecutor(new me.vasir.command.IconCommand(this));
the ide doesn't consider the getter to have a stable return value, so just checking that it didn't return null before isn't enough to assure it won't return null in the future
and don't return, do the if
btw
there is no setExecutor method
after iconCommand
sure there is
what did you do
1m
That's on PluginCommand
oh bru
and yes getCommand does return a PluginCommand
iconManager = new IconManager(getDataFolder());
Command iconCommand = this.getCommand("icon");
if (iconCommand == null) {
getLogger().severe("error");
return;
}
iconCommand.setExecutor(new IconCommand(this));```
is this right?
Command iconCommand -> PluginCommand iconCommand
Also, I suggest learning java
chatgpt helps
I mean the null check is really just to appease the IntelliJ gods
I usually ignore it
chatgpt can be used as an error checker a la 'list all errors you see'
for anything else its a bad idea to use imo
iconManager = new IconManager(getDataFolder());
PluginCommand iconCommand = this.getCommand("icon");
if (iconCommand != null) {
iconCommand.setExecutor(new IconCommand(this));
} else
getLogger().severe("error");
```
i have an obsession
again, do not return in that way
avtually i think do this
w8
PluginCommand iconCommand = this.getCommand("icon");
if (iconCommand == null) return;
iconCommand.setExecutor(new IconCommand(this));```
i'd just wrap it in requireNonNull since it's kind of a compile time/packaging error for that to return null
omg return again
i'm done
bro i really
no action other than exploding should be taken
chatgpt has melted your brain
"don't like else if" wtf man
nobody is telling you to use else if, you're being told not to use return
you'll suffer if you don't like the most basic flow control
then do this
are you getting triggered by a curly bracket
wait till you learn about anonymous constructors and instance initializers
wait till you hear about java syntax
if (something)
doAThing()
else
doOtherThing()
Is also possible
no {}
(works only for one statement)
or god forbid if (something) doAThing(); else doOtherThing();
((Runnable) something ? this::doAThing : this::doOtherThing).run()
Do you know what return does ?
yes
don't return prematurely from the onEnable method
if you do want to abort your onEnable midway, do so by throwing an exception, or disabling the plugin before returning
otherwise the plugin will remain in the enabled state despite being partially or completely nonfunctional
thank you for putting my thoughts into words
it's hard when I'm in a work meeting :D
ookey
:((((((((( sryyy xddd
it returns null if it's not specified on the plugin.yml
I've had it error randomly as well
I usually use Maven to build my projects. Now I cloned a popular plugin, and I was wondering how to turn that plugin into a JAR file.
Does it not have build.gradle or a pom.xml?
Send gh link
gh?
Then when you open the project in an ide it should say importing project
Github
Its a private repo
@vast ledge i can send u the gradle code?
yeah and that's a packaging error, not really a "runtime" error in any real sense
Take a look at this, it's the docs for the Gradle cli
the files are correct, i just wanted to know how to convert it into jar file
Try it
where will be the jar file generated?
It shouldve create a folder called build and a few folders inside that, look in there
Unsure of the direct path
by default in build/libs or something, but it depends on the script
Stacktrace?
but it didnt fail?
There should still be a log
no?
gradle is ass
If not it might just be that the project is large and takes a while to build. On Gradle the first build always takes longer, after the first build it's cached and goes faster
<==-----------> 18% EXECUTING [10m 20s]
:bukkit:compileJava > Resolve files of configuration ':bukkit:compileClasspath' > Mythic-Dist-5.2.0.jar > 5.1 MiB/16.5 MiB downloaded
:bukkit:compileJava > Resolve files of configuration ':bukkit:compileClasspath' > MythicMobs-4.12.0.jar > 3.4 MiB/10.1 MiB downloaded
Just shitty Internet then if it's been downloading 16mb for 7min
i've had it sometimes shit the bed waiting indefinitely on a repo that doesn't answer
xD
knowing how terrible mythicmobs is at making anything work properly, their repo could be doing something fucked
True
its the plugin Quests
sure but it's downloading mythicmobs
Yea, ur Plugin depends on the mythic mobs library
yes
So either ur network is slower then my brain or mythic mobs broke something again
is it really that bad?
genuine question
i mean, if it has to download a dependency to build, it can't just skip it lol
yes, their codebase is dogshit and everything they touch turns into shit
they do zero argument/parameter validation for anything, so things frequently explode with random npe's and undetailed illegal argument exceptions
and when they do, they never fail to swallow the exception message, and sometimes even the stack trace
half of their error messages are completely useless, like [MythicMobs] EntityType {0} does not support resetting AI selectors (they forgot to format it)
I’m new to server hosting and I want to create a Minecraft server hosting setup. Could someone please explain the process to me? Also, I’d like to know how much it typically costs when starting out. Any guidance would be really appreciated!
depends
do u have a spare PC? if yes, $12/year
also, lets move this conversation into #help-server
get a raspberry pi for a small server
heck no
don't get a raspberry pi for your server unless your gonna daisy chain like 12 of them together to make them run as if they are one pi
i mean for a small server
raspberry pi's aren't meant for regular minecraft servers, let alone a spigot or papermc server
works fine for me with up to like 10 people
last time i tried to make a minecraft server one, it won't even get to world creation stage without just shutting off
skill issue
not a skill issue when it was a 8gb raspberry pi 4 using an OS without an interface, just a command terminal, setup with a papermc 1.12 server jar without any plugins, set to 15 players limit and given 5GB of ram
as soon as it tried to generate the overworld, it would go black and i would have to turn it off and back on again to get any response from it
Hi i've seen on a server the death message display only on death screen but not in chat and can't find how they did anyone have an idea ?? (might be packets but idk)
1.21.8 if you wonder
/gamerule showDeathMessages false
didn't work my event is setting the death message but its not displayed on death screen
You can get an used lenevo desktop pc for the same price with x times the performance
Looking for help: eliminating a 1-frame vanilla crop flicker after canceling BlockBreakEvent (Paper 1.21.8 + PacketEvents 2.9.5)
TL;DR
Even after canceling the break, forcing client-side AIR immediately, and filtering/canceling outgoing block state packets, we still see an occasional 1-frame vanilla crop render on the target block. Has anyone fully eliminated this and can explain why that frame still appears?
Environment
- Server: Paper 1.21.8, Java 21
- Network hook: PacketEvents 2.9.5,
PacketSendEventoutbound - Goal: Virtual “farm” → the real world never changes; clients see per-player AIR for a short TTL on the clicked crop.
What we’re doing now (outbound order)
-
Instant Air injection on LEFT_CLICK/BREAK cancel: send
WrapperPlayServerBlockChange(AIR)to the player in the same tick. -
First-Frame Latch (per (player, section, index)): in
PacketSendEventwe do Latch → Cancel/Filter → Overlay → Veto → Mask.- Cancel
BLOCK_CHANGEwhen it targets the latched index. - Filter
MULTI_BLOCK_CHANGE(remove only the target entries; cancel if empty). - Rewrite
CHUNK_DATAper index (never cancel).
- Cancel
-
Catch-up gating: defer
sectionReady/overlay-expire a few ticks; overlay/veto TTLs increased.
Diagnostics (consistent across runs)
On the same (section, index) as the click:
[VF-INJECT] air-now … world=(x,y,z) // same tick as click
[VF-LATCH] consume … index=… // first Netty event on that index
// (only after this) RETINT-PE rewrite … on that index (if any)
We never see a vanilla BLOCK_CHANGE/MULTI_BLOCK_CHANGE landing before the latch; sometimes there’s still a visible frame on the client.
What I’d love to know
- Is there any other server→client packet (besides the three above) that can cause an immediate repaint of the target block on LEFT_CLICK even when break is canceled? (e.g., some client-side effect tied to input, particles/animation, neighbor updates side-effect, or anything in 1.21.x?)
- Is there a known client rendering quirk where the first frame is drawn from client predictions before any outbound packet, making a same-tick server fix insufficient unless we inject AIR even earlier/elsewhere?
- Any proven recipe to guarantee the very first frame is AIR on cancel (Spigot pattern or caveat we’re missing)?
Any deep insight is appreciated!
Doesn’t cancelling the break event send a block change to the client telling it to change the block back to whatever it was
Yeah, if you listen for the packet that tells the server “Hey I broke this block” you can just throw it out
Otherwise cancelling the event is always going to try and correct the client
Hey there! For crops (instant-break blocks), when we cancel BlockBreakEvent the server never sets the block to air so there’s no “revert” ClientboundBlockUpdate/BLOCK_CHANGE emitted by vanilla. In our traces the target block sees:
- our nstant AIR (
sendBlockChange/PacketEventsWrapperPlayServerBlockChange(AIR)) on the same tick, - then the first outbound on that index is our latch consume (we clamp SINGLE/MULTI/CHUNK),
- only after that, any other rewrites.
We never observe a vanilla BLOCK_CHANGE or MULTI_BLOCK_CHANGE landing before the clamp on the target index, and we also don’t see BLOCK_BREAK_ANIMATION on the target (we log it).
Yet a 1-frame vanilla crop sometimes flashes client-side before any outbound is processed.
Questions:
- Is the client doing a left-click prediction that can render one frame on the previous state before it processes the first server packet—even if break is canceled?
- Is there any other server→client packet tied to the click (not state updates) that can force a block redraw on that position?
- Is there a known pattern to guarantee “first frame = AIR” on cancel (e.g., a recommended timing/earlier hook than
BlockBreakEvent, or a specific order forsendBlockChangerelative to Paper’s event lifecycle)?
^ you cannot let it break on the client
I think they want it to break
So they need to not let canceling the event send the “put this back” packet
Ah I see
There’s also the ClientBoundBlockChangeAckowledge packet
Why'd you cancel the event then?
Not entirely sure how that one works
They don’t want it to break on the server
Yeah I saw their second message now
Imo it would be better to intercept the break request from the client and discard it, and then do whatever you need from there
Yeah just handle it on a packet level 🤷♂️
Or rather, acknowledge the request but don’t let the server process it
(I’m guessing if the client doesn’t get the acknowledge packet it’ll revert the block itself? Not sure)
Thanks guys, that clears it up. We’ll try handling it inbound so Bukkit never starts the break path:
Plan (PacketEvents 2.9.5, 1.21.8)
-
Hook
Play.Client.PLAYER_DIGGING. -
If
action == START_DESTROY_BLOCK(and for instant-break crops alsoSTOP_DESTROY_BLOCK?), in our VF world:event.setCancelled(true)(don’t enterBlockBreakEventat all).- Send immediate AIR to that player for the hit
(x,y,z)(client spoof). - Seed our clamp (so any later outbound on that index is still forced to AIR).
Quick questions to sanity-check:
- On 1.21.8, for instant-break blocks do you cancel only
START_DESTROY_BLOCK, or bothSTARTandSTOP(and maybeABORT) to be safe? - Do you send anyting back after dropping the dig? e.g. a resync of the current block state, or
ClientboundBlockChangeAcknowledgewith the expected sequence or is no ACK the right choice so the client simply keeps our spoofed state?
Do you guys use multiple threads often when you make plugins or nah
Yes
Web api calls, databas calls, file io calls, sometimes even to do general work in the background like processing large sets of data
hi beggniner here,
when you register your commands and listeners do you do it in the main onEnable or you put it in a seperate class?
usually just another method in your main class file
Try to limit onEnable to just invoking helper methids
great thanks
so leave it as bare as possible and mainly call other methods?
Yeah, thats how I do it. Tends to be cleaner
initialiseManagers, initialiseCommands, etc etc
great thx
Following up on my earlier question about handling inbound dig packets to prevent Bukkit from starting the break path. Thanks again for the clarifications, that part is working as expected.
Current setup (Spigot 1.21.8, PacketEvents 2.9.5):
- On
Play.Client.PLAYER_DIGGINGfor crops in a specific world, I cancel the event so the server never starts the break logic. - I spoof AIR immediately to the player, seed a clamp, and after
ttl+1ticks I send the original block state back using aMULTI_BLOCK_CHANGE(per-player only). - Outbound, while the clamp is active, I force that index to AIR on SINGLE/MULTI/CHUNK packets.
Problem:
The restore packet is definitely sent (logs confirm correct spoof/vanilla state, sent via MULTI_BLOCK_CHANGE), but the client does not visually update the block until the player interacts with the world (right-clicking a block, placing, etc.). As soon as there’s an interaction, the block instantly appears as expected.
So it looks like the client ignores the update until it gets another trigger.
Has anyone run into this behavior? Is there a known packet or sequence that reliably forces the client to repaint a block in this situation? Would something like a section update, neighbor update, or block update flag be required instead of a plain multi-block change?
Any insights would be super helpful.
could try sending this packet https://minecraft.wiki/w/Java_Edition_protocol/Packets#Chunk_Biomes
but yeah, its an old bug that persists in different ways between versions where you need to do something to cause the visual to update
I was wondering if this could make sense https://javadocs.packetevents.com/com/github/retrooper/packetevents/wrapper/play/server/WrapperPlayServerAcknowledgeBlockChanges.html
in older versions, you needed to send a chunk packet to make the client update the chunk
idk what that does
I don't use that stuff
Why?
most times, I have no need for it and second I don't mess with packets all that often either
The system has to spoof thousands of farm crops per player (entire sections changing rapidly), so spawning and managing the same amount of block/item display entities per player would be too heavy on both server and client. With the current PacketEvents approach I can just mask indices inside section packets, which is lightweight and scales well.
while true, the api you are using just makes use of what is present in the server
and a lot of times I don't need these large api's to do things
its fine if you want to use it, just I have no idea in relation to what you are asking since I don't use it
No worries, appreciate it!
This actually works btw!
I wish I had
Don't repost the same bad question in 3 different channels
it does not belong here
hum, what is the idea
I think that was their idea
good idea
yeah kind of off topic
what is mean by compile Folia to version 1.21.8
Don't understand what you're asking & Folia is not Spigot, you're at the wrong place
what is mean by compile Spigot to version 1.21.8
to use buildtools to create spigot 1.21.8?
good evening I need urgent help I received 1 email that the email address of my spigot account has been changed I do how a lot of plugin buy on this account I have to recover it that can help me I am not English
I'm sorry if this is not the right place for this request but I'm lost
?support
I ask for my problem at this address?
yes
Thx
provide all the info you have
jai everything jai the new dress with ip
jai jai
paper supports this iirc
i don't remember if you can write to it
nevermind it was just for statistics and pdc
modifying raw nbt?
why'd you need to do that?
just use player.getEnderChest() ?
probably for an /invsee for offline player
i assume he wants it for offline players
i guess we'll never know
in fact i'm sure i read him saying he wanted it for offline players but maybe i'm going crazy since i don't see it now
i would maybe uh
depend on OpenInv
it has commands for viewing/editing the inventory and ender chest of offline players, i don't know if it has an api, but even if it doesn't you can probably hook into the internals to do what you need to do
i really would rather avoid trying to homebrew that on your own, there are many ways it can go wrong with e.g. player data being cached in memory even if the player is offline for a short period
there is no safe way of doing it anyways
with enough hooking into nms you can make it safe enough i think, but i'm not sure if openinv does that
basically you'll want to call whatever logic loads the player data into memory normally, subject to whatever cache eviction logic is in place, then edit that and let autosaving deal with it
yeah, well, its enderchest tho, even if the player gets on while you are accessing the data, he wont be rushing to open his enderchest
it's just that once the player logs on the data is duplicated from disk to memory, and that opens an avenue for items themselves to get duplicated
or lost altogether, for that matter
since the ender chest is part of the player data and gets loaded along with their inventory on join
wat does it mean this error
The uploaded file is too large.
uh
Heyo. Sorry to bother. I'm creating a custom item based on a FIREWORK_STAR, and I want to remove the attributes like ball type, color, and other attirbutes in the lore since they're a bit annoying. Does anyone know how to do it in these versions? I couldn’t find anything that actually works
Damn! Yea managed to make it work. Thanks mate, fr
Not sure when this was changed, does anyone know how I can get my Spigot stuff deployed to Maven Central now? 
Upload a new one with a higher version? And then report the resource letting them know of the issue. I haven’t used the resource system enough to know of how to remove one
alright, getting issues with my update checker :
Versions depending link :
https://api.spigotmc.org/legacy/update.php?resource=127633 : v1.0.1
https://api.spigotmc.org/legacy/update.php?resource=127633/ : 1.0.0
https://api.spigotmc.org/legacy/update.php?resource=127633/~ : 1.0.1
My plugin version is 1.0.1, spigotmc actual version 1.0.1, deleted the wrong ones
it still cannot find it
ah, what is the solution then
waiting
Alright thank you
can someone help me my plugin is 1.21.5 is there a way to change to version to the new 1.21.9 without redoing everything?
just change the version in pom and fix compile issues if any exist and test it for bugs
why do you think you'd have to redo everything ?
The point of the API is that old plugins work for as long as possible (I think, it sure looks like it)
where the pom?
I assume you made your plugin with maven so it would be in the root directory of the project
if you used gradle.. I don't know gradle :D
gradle
oh
😔
ok apparently you go to build.gradle and change the dependencies
oh okay tyty
Hey guys just curious, is it wise to use BukkitRunnable to set cooldown for plugins, or is there a "better" way?
?bt
java -jar BuildTools.jar ?
Depends what sort of cool down. A hashmap could do
I correctly merged the Spigot repository into my branch. After that, I built the .jar file using the Gradle command: ./gradlew build -x test. I then placed the resulting .jar into my server folder. However, when I try to start the server, I get the following error: no main manifest attribute, in server.jar.
some one said that i need to have a bundler jar
but why are you doing that manually
Just use BuildTools
I merge changes from another version of spigot from our server patches
Spigot doesn't even use Gradle?
Spigot doesn't use gradle, it uses maven
I do remember them mentioning Folia earlier
but then said Spigot when we said wouldn't give support
.
append a random query parameter! 😺
what if there is a secret query parameter that will give me an easter egg
&thisqueryparamdoesnothing
i need to try them all
like wheatley trying out passcodes for the control pod in portal 2
Iirc it was bunped
bunped
I thought nms version changes any time the protocol version changes
1.21.9 should be R7
it's completely arbitrary
ConsumableComponent.Animation SPEAR is just a draft right?
no its a coin flip
Lets say a cooldown until you get teleported for example
yeah thats good
a hashmap with uuid-timestamp would be your best option
thank you :))
I'm getting "package org.bukkit.craftbukkit.v1_21_R5.entity does not exist" after updating my pom.xml to 1.21.9, did i do something wrong?
do you have spigot or spigot-api as a dependency
spigot
thats your problem, the package changes every 1-2 versions
ty for the warm welcome, i'm definitely new to it haha
good to know ty
spigot
mannequin.setPlayerProfile(player.getPlayerProfile()); didn't texture the mannequin with the player's skin. is this a bug?
Is the player online?
yes
did you resolve the profile?
(.update())
there's a note in the release notes, but probably what needs to happen is that certain methods need to use dynamic rather than static profiles
or maybe profiles with no textures should just default to dynamic, not sure
still didn't work
if by resolving the profile you meant
PlayerProfile playerProfile = player.getPlayerProfile();
playerProfile.update();
mannequin.setPlayerProfile(playerProfile);
It's a future callback, you need a when complete or .then or whatever
And I'm almost certain it works because I tested it
yeah this is working for me sorry i tried this with an already fetched profile, it wont work with a new player
i'll try it again then, thanks
when i run this exactly it just displays the default alex skin for me
Because you're not passing a complete profile with textures
As I said you need to use a callback in the future, it's asynchronous
update().thenAccept(profile -> mannequin.setPlayerProfile(profile))
Or I guess thenAccept(mannequin::setPlayerProfile)
i'll try that choco thanks for explaining
Futures and asynchronousy are hard
