#help-development

1 messages · Page 878 of 1

young knoll
#

Lol that staircase

tender shard
#
myPlayer.setGameMode(GameMode.SPECTATOR);
young knoll
#

Thankfully eclipse does not do that

tender shard
#

yeah it'd be really useful if IJ could do it like github

#

e.g. only show it as nested if there's anything else on that level

#

otherwise just show it as one level

young knoll
#

Yeah that’s what eclipse does

quiet ice
young knoll
#

¯_(ツ)_/¯

quiet ice
#

Ah no, I was thinking of something else

young knoll
#

I probably changed it at some point

tender shard
#

hover over "player" and send a screenshot again

quiet ice
#

the default under eclipse looks like this which is utter garbage

young knoll
#

It’s an audience

#

Judging by his earlier screenshot

final wharf
tender shard
#

yeah and the "parsed" part

final wharf
#

yep

tender shard
#

yeah that's just an interface to send messages to

#

it's not an actual player object

#

where did you get the audience from?

final wharf
#

minimessage example lol

tender shard
#

somewhere you must have sth like this in your code

Audience player = ....;
#

show that line

final wharf
#

Audience player = sender;

tender shard
#

where does the sender object come from?

final wharf
#
public class Gamemode {
    @Command(name = "", aliases = {}, desc = "An example command.", usage = "")
    @Require("react.gamemode.creative")
    public void exampleRoot(@Sender CommandSender sender) {
        Audience player = sender;
        MiniMessage mm = MiniMessage.miniMessage();

        Component parsed = mm.deserialize("Your gamemode is now <green>Creative");

        player.sendActionBar(parsed);
        sender.set
    }}```
tender shard
#

which command framework is that?

final wharf
#

drink

young knoll
#

That’s a new one

tender shard
#

well then you'll have to check them how it works

final wharf
#

they havent updated in 4 months

final wharf
#

just not known

tender shard
#

can't you just use Player instead of CommandSender in the method?

young knoll
#

I bet that’s some kind of wrapped command sender

tender shard
#

according to their examples, it isnt

final wharf
young knoll
#

Since bukkits command sender wouldn’t be convertible to audiences

tender shard
#

it imports bukkit CommandSender

tender shard
#

@final wharf you probably imported the wrong commandsender

final wharf
#

wdym?

tender shard
#

check the imports at the top of your file

#

show them

final wharf
#
package lol.irazz.react;

import com.jonahseguin.drink.annotation.Command;
import com.jonahseguin.drink.annotation.Require;
import com.jonahseguin.drink.annotation.Sender;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.entity.Player;

public class Gamemode {
    @Command(name = "", aliases = {}, desc = "An example command.", usage = "")
    @Require("react.gamemode.creative")
    public void exampleRoot(@Sender Player sender) {
        Audience player = sender;
        MiniMessage mm = MiniMessage.miniMessage();

        Component parsed = mm.deserialize("Your gamemode is now <green>Creative");

        player.sendActionBar(parsed);
    }}```
tender shard
#

oh you're using paper

final wharf
#

yea

tender shard
#

your Player object is called "sender"

#

you don't need the additional Audience player = ... part

#

just use the sender. It's already both a player and an audience

final wharf
#

oh

tender shard
#

and remember that your project will not work on spigot if you use adventure like that

young knoll
#

Ah that’s why it’s a valid audience

final wharf
#

yep

#

it works now

#

to set hte gamemode

#

also, WHY CANT I ALT TAB TO intellij

#

its so annoying

tender shard
echo basalt
young knoll
#

Adventure is still 90% useless on Bukkit

tender shard
#

well more or less illusion

#

BukkitAudiences has to be created with a plugin instance

young knoll
#

And this is why I bastardize all my stuff back to legacy strings

#

Kek

tender shard
#
BukkitAudiences audiences = BukkitAudiences.create(myPlugin);
Audience playerAudience = audiences.player(player);
final wharf
remote swallow
#

what about the actual paper discord

final wharf
#

they are slow

young knoll
#

However once choco pr™️ gets merged I can use the bungee serializer instead

remote swallow
final wharf
#

it hurts

#

😭

remote swallow
#

i dont like annotating null

tender shard
remote swallow
#

no

young knoll
#

Have you considered

remote swallow
#

no thankyou

final wharf
echo basalt
remote swallow
#

ive been englightened to use gradle kotlin

#

making plugin is kotlin is no

young knoll
#

I’ll convert my gradle files one day

#

Maybe

remote swallow
#

want me to pr one

#

basically all it is is your forced to use () and "" for stuff

tender shard
young knoll
#

Sure

#

And then make eclipse accept it, kek

echo basalt
#

if it weren't for copilot I'd still use intellij 2017

remote swallow
#

use intellij

#

its better

#

you get intellisense with ij

remote swallow
#

idk what the fuck half of these symbols mean but they exist now

#

alex while ur here

remote swallow
#

what the fuck is this: Jar!, what the fuck does the ! mean

young knoll
#

It’s excited

tender shard
#

It means "You got a Jar object, but it comes from Java, so I don't know if it's not-null (Jar) or nullable (Jar?)"

#

it's called a "platform type"

#

Jar = a Jar object, notnull
Jar? = a Jar object, nullable
Jar! = a Jar object from outside kotlin - may be null or not

#

kotlin auto detects jetbrains (and others) nullable and notnull annotations though

young knoll
#

Okay but does Kotlin let me do

remote swallow
#

okay so ! is null that it doesnt know about

young knoll
#

var string = “hello world”!

#

Where ! Converts the string to uppercase, of course

remote swallow
#

it doesnt like ur quotes

#

but no

young knoll
#

0/10

remote swallow
#

why are your quotes broken

#

tf did you do

young knoll
#

IOS automatically makes them fancy

remote swallow
#

ios moment

young knoll
#

“Wow quotes”

worldly ingot
#

Must be on a French keyboard

remote swallow
#

coll french moment

worldly ingot
#

Oh wait no French uses << and >> for quotes for some reason lol

young knoll
#

Wtf

remote swallow
#

does coll secretly live in quebec

worldly ingot
#

« » more precisely

young knoll
#

<<like this>>

worldly ingot
#

« This is a French quote »

#

because lol

remote swallow
#

i dont have wincompose so i cant type those symbols

#

stop flexin

young knoll
#

I thought that was just a posh quote

#

Smh French

tender shard
#

@remote swallow this explains it ig

young knoll
#

iOS lets you long press for some interesting characters

#

Like §

remote swallow
#

i also cant type that without wincompose

remote swallow
#

but if it returns a player? why doesnt it just infer send if not null

chrome beacon
young knoll
#

Look at me I’m null safe

#

Nerd language

#

I want a null unsafe language

tender shard
young knoll
#

Only lets you operate on nulls

chrome beacon
#

How would that work?

tender shard
#

like java

young knoll
#

Presumably NPEs

tender shard
#

oh ONLY on nulls

young knoll
#

Oops! All nulls

tender shard
#

kotlin kinda has 3 nulls

#

null, Void? and Nothing

echo basalt
#

wasn't there a Unit or am I tripping

remote swallow
#

§

#

i can type funky and now

lunar mica
#

No it isnt. Is only one time registered

tender shard
#

Unit is absence of return value

#

null is a value

lost matrix
remote swallow
#

i have my shrug face back to

#

i dont need to use /shrug again

lunar mica
echo basalt
#

make a constructor and just log something

#

if it logs twice you're initing the listener twice

lost matrix
#

^

tender shard
#

print out the hashcode of the event

#
System.out.println(e.hashCode())
#

if it's not the same, you registered it twice

lunar mica
#

Alr gimme sec

lost matrix
tender shard
#

no?

#

oh yeah I am stupid

#

ignore me

echo basalt
#

🤔 hmm how can I make entities that don't save without reinventing player tracking

tender shard
#

I am not allowed to sleep so ignore what I said, I'm tired @lost matrix

lost matrix
#

Ah. this.hashCode()

young knoll
#

You would have to print this.hashCode

tender shard
lunar mica
tender shard
#

oh no wait @lost matrix

#

what I said is correct

#

I wanted to check if the event is called twice or just once

#

now we know: the event is correctly only called once

lunar mica
#

But its registered once, I check it now

lost matrix
tender shard
young knoll
#

Hey I spent 4 hours janking it together

#

Now it’s y2ks turn

tender shard
#

yeah now it's ulrich's turn

lunar mica
tender shard
#

paste your whole listener and your whole main class

#

?paste

undone axleBOT
young knoll
#

4 hours of making a janky orm followed by 2 hours of trying to spawn stuff in villages then finding a bug in cb, making a pr for it, and getting in bed

lost matrix
young knoll
#

Inb4 hash collision

#

Real

tender shard
#

"I spent 92751628 billion years debugging this"

lunar mica
#

I just only removed whole JDA and other from main

quiet ice
lost matrix
lunar mica
tender shard
#

well send the full class

lunar mica
#

Whole main?

tender shard
#

yes

#

and the whole listener class

lunar mica
#

I send it.. I only removed JDA bot configuration

#

Also whole Listener class

tender shard
#

send the whole class

lost matrix
lunar mica
tender shard
lost matrix
quiet ice
#

^

tender shard
#

if you keep removing parts of it, we can't find the issue

lunar mica
tender shard
#

btw is there a reason why the PluginClassLoader refuses to load new classes in onDisable? Because this is extremely annoying

fervent robin
#

im so confused. Both 0 and 1 are sent but the inventory isnt opened

player.sendMessage("0");
Inventory inventory = Bukkit.createInventory(player, 9);
player.openInventory(inventory);
player.sendMessage("1");
fervent robin
#

nvm fixed it

#

didnt fully remove part of debugging other code

tender shard
lost matrix
tender shard
#

Yeah why don't they just follow the simple instructions? Either send both classes in whole, or print out both event.hashCode() AND this.hashCode()

lunar mica
tender shard
#

good luck lol

lost matrix
lunar mica
#

Yes 🙂
I was banned on monday on LP discord for that 🙂

lost matrix
lunar mica
final wharf
#

How do i get if arg 1 exists?

#

and to tab complete position 1 to all players on the server

remote swallow
#

check args.length

young knoll
#

You can generally just return null to tab complete player names

tender shard
#

for real isn't there a better solution than to do this?

    /**
     * Fixes NoClassDefFoundError for kotlin.collections.EmptyIterator during onDisable() because Spigot prevents
     * loading new classes in onDisable() ...
     */
    private fun fixSpigotClassLoader() { // This is called in onEnable()
        emptyList<Void?>().iterator()
    }

    /**
     * Can't even use lambdas / anonymous classes in onDisable() so we just set the enabled field to true...
     */
    private val isSuperEnabledField = JavaPlugin::class.java.getDeclaredField("isEnabled")
        .apply { isAccessible = true }

    private fun setSuperEnabled(b: Boolean) { // This is called in onDisable()
        isSuperEnabledField.set(this, b)
    }
lost matrix
#

Wait its just std kotlin.

tender shard
#

"this dependency" is my own plugin

#

one second

lost matrix
#

Try downloading via the plugin.yml instead of shading

quaint mantle
#

What's the best way to listen to armor equip events on 1.8

young knoll
#

Library

#

Same as 1.20.4

tender shard
#

it complains about this lambda for example @lost matrix

quaint mantle
#

yeah I used one I found on spigot forums and there are bugs

young knoll
#

Alex does your armor lib support 1.8?

tender shard
quaint mantle
#

oh let me look at it

tender shard
#

I thought it was on purpsoe

final wharf
#

i get this error in the console [01:20:02 WARN]: Nag author(s): '[iRazvan2745]' of 'React v1.0-SNAPSHOT' about their usage of System.out/err.print. Please use your plugin's logger instead (JavaPlugin#getLogger).

final wharf
#

ohhh

#

yeah

young knoll
#

We’ll get that EntityArmorChangeEvent soon™️

tender shard
#

paper wants you to use the logger instead

final wharf
#

i forgot how paper ones is

#

lol

tender shard
#

just use getLogger() instead of System.out

final wharf
#

yeah

#

found out rn

young knoll
#

Tbf i also want you to use the logger

#

But if ur just debugging then whatever

eternal night
#

A deep personal desire

tender shard
quaint mantle
eternal night
young knoll
#

I was gonna make that joke

#

:(

sullen marlin
eternal night
young knoll
#

I should update my pr for that

#

I think MD wanted the parent deps to be logged even if the verbose flag isn’t set

tender shard
#

Maybe there should be isDisabling that replaces current !isEabled, and a real isDisabled for the classloader

tender shard
#

No repo needed

quaint mantle
#

Like on github

#

lol

tender shard
#

Mb lol

final wharf
#

its probably me being stupid anyways

tender shard
#

What doesnt work?

#

Check the line directly above or below „do not use system.out“

final wharf
final wharf
tender shard
#

In your plugin main

final wharf
#

yeah

tender shard
#

Without arguments

grim hound
tender shard
#

It returnd a logger object

final wharf
#

yeah, but how do i make it say stuff

tender shard
#

getLogger().info(„asd“);

final wharf
#

ohh

#

yes

#

thanks

young knoll
#

I should say top level not parent

#

But yeah

remote swallow
#

josh

#

whats item pedestals

young knoll
#

Pedestals to display items

#

Unfinished of course

#

Kekw

remote swallow
#

is gateway to adventure finished

tender shard
#

I don't use softdepend on purpose because paper decided to refuse loading plugins that softdepend on each other

tender shard
tender shard
#

in spigot?

remote swallow
#

nah its colls plugin

tender shard
#

oh I thought spigot'd get adventure

young knoll
#

Are any of my plugins finished

#

Lul

remote swallow
#

minetweaks was

young knoll
#

True

tender shard
#

huh

young knoll
#

But no, gateway to adventure is not

tender shard
#

i thought minetweaks was from this sachin dude

remote swallow
#

no thats the other one

tender shard
#

hmm

young knoll
#

Tweakin

tender shard
#

ah yes

#

right, his plugins are always 'n

#

lootin

#

tweakin

#

cosmin

#

and his name too lol

fathom jay
#

hey one question, if I'm trynna do like a mana system, how can I save the max Mana and the actual mana of the player? I'm still learning plugin development so I'm kinda curious on that

#

because I know I can use a file to save the max Mana

tender shard
# fathom jay hey one question, if I'm trynna do like a mana system, how can I save the max Ma...

or: Why you should NEVER use NBT tags again! Spigot 1.14.1 added the biggest improvement that (in my opinion) ever made it into the Bukkit API: The Persistent Data Container (PDC). It can be used to store custom data on Entities, TileEntities, and ItemStacks. Using a bit of math, it can also be used to...

fathom jay
#

hmmmm ok ok ty

tender shard
#

PDC allows you to store custom data in players (and elsewhere)

fathom jay
#

thats actually cool wtf

tender shard
#
public final NamespacedKey MANA_KEY = new NamespacedKey(myPlugin, "currentMana");
public final NamespacedKey MAX_MANA_KEY = new NamespacedKey(myPlugin, "maxMana");

// ...
double playersMana = player.getPersistentDataContainer().get(MANA_KEY, PersistentDataType.DOUBLE);

example. ^

quaint mantle
#

@tender shard

#

if(newArmorType.equals(ArmorType.HELMET) && (equipping ? isEmpty(event.getWhoClicked().getInventory().getHelmet()) : !isEmpty(event.getWhoClicked().getInventory().getHelmet())) || newArmorType.equals(ArmorType.CHESTPLATE) && (equipping ? isEmpty(event.getWhoClicked().getInventory().getChestplate()) : !isEmpty(event.getWhoClicked().getInventory().getChestplate())) || newArmorType.equals(ArmorType.LEGGINGS) && (equipping ? isEmpty(event.getWhoClicked().getInventory().getLeggings()) : !isEmpty(event.getWhoClicked().getInventory().getLeggings())) || newArmorType.equals(ArmorType.BOOTS) && (equipping ? isEmpty(event.getWhoClicked().getInventory().getBoots()) : !isEmpty(event.getWhoClicked().getInventory().getBoots()))){

Wtf

fathom jay
#

yeah yeah i was reading it... seems way simpler than what i thougth

quaint mantle
#

That's all in one line LOL

tender shard
#

what

quaint mantle
#

mb

fathom jay
#

my eyes cannot support that

tender shard
#

oh yeah that's from the original author

#

I only forked it and updated it and uploaded it to maven central

quaint mantle
#

Oh alr

tender shard
#

blame Arnuh for that 🥲

young knoll
# tender shard tweakin

This is also why it never came up when I was looking for similar ones before making mine :p

tender shard
#

I didnt change stuff that wasnt broken haha

fathom jay
tender shard
#

PersistentDataContainer 🙂

fathom jay
#

ik ik

#

just wanted to make sure

young knoll
#

Pdc on players persists as long as their player file does

fathom jay
#

if there was a way to lose it

fathom jay
#

ty

tender shard
#

there isnt, unless you remove it on purpose

fathom jay
#

okie dokie, ty kind ppl

tender shard
#

(or if you delete the playerdata file but then the inventory etc is obv gone too etc)

#

for non-persistent data there's also the Metadata API but I guess you don't need / want that

real palm
#

Good evening (better said good night haha) - Walking through the Spigot Javadocs I've seen World#getWorldType is deprecated - since I want to avoid deprecated methods, how can I determine whether a world is overworld/nether/the end (without guessing it on the name) - or is there no other possibility than guessing it from the name?

buoyant viper
#

getEnvironment ?

#

iirc

#

?jd-s

undone axleBOT
real palm
#

there is no such method "getEnvironment"

tender shard
buoyant viper
#

dam

#

what version of api are u using ?

tender shard
#

World extends WorldInfo though so can be used on the world object directly

buoyant viper
#

^

real palm
#

I was looking directly in org.bukkit.World 😛

#

well, time to change to WorldInfo then 🤣

buoyant viper
#

if u dont see the method maybe ur api version is too old?

#

idk when getEnvironment was added tho, cant be TOO new

real palm
#

I use 1.20.4 🫣

young knoll
#

Yeah it’s definitely there

#

Source: I’m the world environment

real palm
#

Yeah, just found it.

#

It's 1am in here, also my day were kinda harsh 😅 also I'm new to the 1.20 version - my last proper plugin was on 1.12 🤣

young knoll
#

Woo new api to have fun with tho

remote swallow
#

what the fuck is a jojo

young knoll
#

Animes

tender shard
#

hm I again checked bukkit's classloading code and I don't see any reference to Plugin#isEnabled there. Maybe this is just a paper issue? Or does CB / Spigot apply patches to Bukkit's plugin loading / class loading code?

young knoll
#

Spigot might

#

Cb shouldn’t

#

Paper has completely redone plugin loading

tender shard
#

plugin loading yes, but class loading?

#

well probably kek

young knoll
#

Does it occur on spigot

#

:p

tender shard
#

well the thing is, it even only happens on paper like 1 in 20 times

#

I supposed I could run a bash script that restarts the server 50 times, then come back in half an hour lol

young knoll
#

Brute force yay

#

Sounds like some kind of threading issue

tender shard
#

yeah I am indeed scheduling async stuff with CompletableFutures.runAsync() but I also call get() on them in onDisable()

echo basalt
#

join

#

it does the same as get but no trycatch

tender shard
#

what's the difference though? In both cases onDisable() will have to wait until the future is "done" and only then should the classloader be rekd

echo basalt
#

one has no ugly trycatch

young knoll
#

Doesn’t solve the issue tho :p

tender shard
#

how would join() be better

#

and this is the shutdown() method, in case this helps

echo basalt
#

lol wtf is that

#

Pro tip

#

YOu can just return that future

#

and pass a timeout in the get method

#

instead of making a new executor

tender shard
#

and how does this solve the class loading issue

echo basalt
#

it doesnt

#

paper bad

tender shard
#

also I don't use a timeout in get(...) because the future itself must have a timeout

fervent robin
#

Is there a way to have a command where the name can be set through config.yml (other than listening for commands ran and manually calling it)

tender shard
river oracle
young knoll
#

Or a library

#

Or that pr gets merged one day :p

tender shard
#

just gotta cast it

#

oh my bad, it isn't. I confused it with PluginManager <> SimplePluginManager

river oracle
#

^ general IDEA

young knoll
#

Alternatively use aliases

#

I think you can edit those at runtime without anything wacky

river oracle
young knoll
#

Yeah but it does abuse dirty smelly rotten reflection

#

Kek

river oracle
slender elbow
#

I mean, it's in the api module anyway

#

odd choice

tender shard
#

what's better? that these are my real mysql credentials or that the 500ms is the default setting for io delay

young knoll
#

There’s an open pr for it

#

I think it’s either waiting for rebase or just idle

fervent robin
young knoll
#

Yeah but that won’t tab complete properly

fervent robin
#

true

river oracle
#

It's like what a couple lines of reflection

#

If you need help I can walk you through it

#
public final class CommandHelper {

    private final Plugin plugin;
    private final CommandMap commandMap;
    private final MethodHandle constructor;

    /**
     * Creates a new CommandRegistry
     *
     * @param plugin the plugin used
     */
    public CommandHelper(@NotNull final Plugin plugin) {
        this.plugin = plugin;
        this.commandMap = ReflectionUtils.getField(Bukkit.getPluginManager(), "commandMap", CommandMap.class);
        this.constructor = ReflectionUtils.getConstructor(PluginCommand.class, new Class[]{String.class, Plugin.class});
    }

    public Command createCommand(@NotNull final String name) {
        final PluginCommand pluginCommand = (PluginCommand) ReflectionUtils.safeInvoke(this.constructor, label.getName(), plugin);
        if (pluginCommand == null) {
            throw new IllegalStateException("Creation of PluginCommand failed");
        }
        if (!commandMap.register(plugin.getName(), pluginCommand)) {
            throw new IllegalStateException("Command with the name " + pluginCommand.getName() + " already exists");
        }
        return pluginCommand
    }
}```
#

this functions the same way as getCommand(String) but it actually just dynamically created the command for you

young knoll
#

Why reflection to make the command too

river oracle
#

PluginCommand isn't a public class

#

you could extend BukkitCommand or whatever it is, but then you need to add implementation yourself

young knoll
#

Wait wtf

#

I swear plugin command wasn’t final before

#

Wack

river oracle
#

you still can't extend / implement or ccreate instances of a non visible class without reflection

young knoll
#

It’s not protected though

#

It’s public final

river oracle
#

when did that change

young knoll
#

Idk

river oracle
#

it was protected for the longest time i stgh

young knoll
#

The constructor is protected

#

But if it wasn’t final you could just extend it with a public one

river oracle
#

oh its the constructor

#

that's what I meant yeah

slender elbow
#

extend Command, implement PluginIdentifiableCommand, call it a day

tender shard
#

what's the purpose of extending PluginCommand anyway? It basically just combined the interface from Command with a TabCompleter and CommandExecutor and logs exceptions if it goes wrong

slender elbow
#

runs

young knoll
#

That must have been what I did in the past

#

Idk but I know I only reflected the command map

slender elbow
#

yeah cuz no getters are exposed

#

angry

young knoll
#

Seems the choco pr still had some issues

#

And he hasn’t replied to it smh my head

river oracle
# young knoll And he hasn’t replied to it smh my head

How does registering commands after the normal registration period behave? Do they automatically get sent to conencted clients?
As expected I'm not 100% sure on internals, but it may also require you to update the players commandList

young knoll
#

I imagine so

#

That should be addressed by the pr though :p

slender elbow
#

if you register commands after onEnable, you need to call CraftServer#uhhh i forgot

#

if you just register on enable that's enough then

young knoll
#

I love the uhh method

slender elbow
#

thanks

#

i made that up

#

by myself

river oracle
#

wow its a real CraftBukkit method

remote swallow
#

favourite method

young knoll
#

I wouldn’t be surprised tbh

slender elbow
#

syncCommands i think it is

echo basalt
#

yuh

#

syncCommands is gangsta

young knoll
#

Does that essentially just do Bukkit.getOnlinePlayers.forEach(Player::updateCommands)

echo basalt
#

no

#

updateCommands just sends a brigadier packet

slender elbow
#

syncCommands builds the brigadier tree

#

updateCommands sends it

young knoll
#

Ah

river oracle
#

I'm going to build your biradier tree Coll

young knoll
#

Thanks?

river oracle
#

np

young knoll
#

Is that a threat? Idk

remote swallow
#

imagine if mojang hard coded commands

river oracle
#

💃

remote swallow
#

like commands were enabled client side

#

couldnt make them server side

echo basalt
#

ah yes let the client hallucinate shit

river oracle
#

or was Ig

#

prior to / commands

young knoll
#

You mean still is

#

?xy

undone axleBOT
remote swallow
#

who are you xying

young knoll
#

I was exampling

remote swallow
#

o

young knoll
#

Ye olde commands still aren’t dead

#

Time to remake redbot in jda

#

Call it bluebot

remote swallow
#

why not collbot

young knoll
#

Ah yes JishBot

remote swallow
#

make it for populus if it ever gets finished

young knoll
#

Do I ever finish anything

remote swallow
#

i mean

#

if theres a server for it maybe

#

as long as me and scarlet remind you

quaint mantle
#

h

#

Is there no PlayerBanEvent like PlayerKickEvent?

wintry lynx
#

Also there is a PlayerKickEvent but idk if there is a ban event

#

Idk what you are trying to do though so i cant say whats best to use imo

quaint mantle
#
public void h(PlayerQuitEvent event) {
   if (event.getPlayer().isBanned()) {
   }```
worth a shot
robust helm
quaint mantle
#

If you using 3rd party punishment system you should use their apis

wet breach
#

@quaint mantle

#

to answer both in that regard

valid burrow
rotund ravine
valid burrow
rotund ravine
#

I mean it could be handled by a plugin and therefore isn’t “defined”

valid burrow
#

well i was talking about how minecraft itself does it

rotund ravine
#

Unsure how minecraft itself handles it

#

But it wouldn’t be good to rely on mcs implementation if it usually gets implemented by other plugins too

valid burrow
#

well all plugins i know implement it this way too

#

and i wouldnt see a reason not zo

#

to

rotund ravine
#

Just because you can’t see a reason to implement smth a different way doesn’t mean someone else didn’t

#

Spigot is full of shitty plugins so don’t be too surprised

#

Essentials bans and then kicks btw

#

Some plugins even handle their own banlists

#

And if they’re in a database a kick and then an async operation might mean that the ban actually gets added to the database after they were kicked instead of beforr

wet breach
rotund ravine
#

Instead of relying on an uncertain implementation look towards the plugins which your server runs

wet breach
rotund ravine
#

Again

#

I am just saying it can be uncertain

wet breach
#

Sure, some plugins are dumb and do things out of order

#

but personally I never cared about such things myself XD

rotund ravine
#

True

#

I probably wouldn’t either

valid burrow
halcyon hemlock
worthy yarrow
#

Anyone experienced with towny/siegewar/squaremap api and wanting to help me with an addon of sorts basically when a siege starts create a new icon for squaremap that displays at the sieged town's spawn location, and on siege end, if there is an icon at that town on squaremap, remove it.

#

I think I have it in a working order currently, but this is like my second time ever working with towny/siegewar api so i am not sure if I'm doing this correctly

wet breach
#

not sure what you are requesting

#

?nocode

undone axleBOT
#

It’s hard to answer a programming question without code
Oh no! You ran into a problem. But no worries, people are willing to help, but first they need to see your code. This is because otherwise, they would be providing help based on guesses instead of concrete knowledge. Whether it be a compile error, runtime error, or an unexpected output, I'm sure that if you were to provide code, you'd receive a quick solution.

worthy yarrow
wet breach
#

trying to make these icons in game?

#

if so then no

worthy yarrow
#

Not like in game, on the squaremap... the web map or whatever

#

The function is to create a new icon on the map at the spawn location of a newly sieged town and remove it once the siege is over

wet breach
#

not entirely sure as I am not very familiar with that api

worthy yarrow
#

Same here haha

rotund ravine
halcyon hemlock
#

i was concerned

hushed spindle
#

is there any way to apply a potion effect to a player asynchronously

drowsy helm
#

needs to be on main thread

#

why do you need todo it async anyway

hushed spindle
#

got a custom block breaking system and it works fine and all, but the packet listener is async and to stop players from breaking blocks normally i gotta give em mining fatigue. i do that when i receive the "start breaking" packet, but giving them fatigue on the main thread requires a task that takes a tick to run. as a result if players can instant break a block they're not supposed to, they can anyway

#

if its not possible ill just have to cancel the break event if the player hasnt been given fatigue yet, though that'll look weird

drowsy helm
#

sounds like a flawed design. not really any need for the packet listener to be async

#

just makes more headaches

#

also the whole block breaking system can be done without packets now

hushed spindle
#

how so

drowsy helm
#

Block Damage event, set mining fatigue, player.sendBlockDamage

hushed spindle
#

what about when the player stops mining

#

how do you know when to remove that fatigue

drowsy helm
#

BlockDAmageAbortEvent

hushed spindle
#

oh thats a thing too

drowsy helm
#

yeah you can avoid packets all together

hushed spindle
#

sounds good then

#

ty

hybrid turret
#

idrk where else to ask this and i fsr can't quite manage to find the right words to google it so i'll just ask here:

Is it possible to create objects from classes using a string?
What I mean by this is something like this:

getCommand(commandName).setExecutor(new commandName + "Command()");

for using this in a for-loop?

hushed spindle
#

ah though one thing, i want to support 1.19+ because a significant part of my userbase still uses it. any resources i can look up for a sync packet listener (no netty channel)?

hybrid turret
smoky anchor
eternal oxide
#

Its just a CommandExecutor so dependency injection, but I see no point

#

just pass a Consumer if you want to do it like that

hybrid turret
hybrid turret
#

oops, i pinged twice, brain shut off, mb

eternal oxide
#

unless their code is identical you can;t

#

unless you name the command identical to teh Class

hybrid turret
#

I just didn't want like 100 lines of registering commands

hybrid turret
eternal oxide
#

100 commands?

hybrid turret
#

wait, lemme count

#

About 65

eternal oxide
#

if your commands are named the same as your classes you can just instance trhem

hybrid turret
#

But how would I pass constructor parameters?

eternal oxide
#

depends what you are needing to pass

hybrid turret
#

depends on the command

#

sometimes i need maps and the main instance, sometimes only the main instance

eternal oxide
#

Then how are you going to know what args you need, just from its name?

hybrid turret
#

i.... don't?

#

idk, that's why i ask

eternal oxide
#

newInstance() is a varArgs method but you still need some idea what you are going to pass. Its not magic

hybrid turret
#

obviously it's not magic, yeah lol

#

i mean i know what is passed for each command

eternal oxide
#

how is the code to know in a for loop?

hybrid turret
#

i could get around passing this but not the maps :/

hybrid turret
#

The only way I could pass different args would be, by checking the name but that would defeat the purpose

#

Can I check if a constructor has args?

eternal oxide
#

you can search the constructors but you only get types

hybrid turret
#

hmm

chrome beacon
#

You're going to end up writing more code

#

than just registering things normally

hybrid turret
#

what does #getParameters return when there are no Parameters?

eternal oxide
#
Class<?> clazz = Class.forName("mypackage.MyClass");
CommandExecutor cmd = clazz.newInstance(this);```
#

ignoring casting of course, but thats the basics

hybrid turret
#
CommandExecutor cmd = (CommandExecutor) Class.forName("<package name>" + commandName + "Command").getDeclaredConstructor().newInstance();
commandManager.registerCommand(cmd);

Yeah, this is what I currently have

slate tinsel
#

Can I use nms to set velocity on a block display?

eternal oxide
#

you can getConstructor(JavaPlugin.class) but newInstance is varArgs

hybrid turret
smoky anchor
eternal oxide
#

or just have all your command classes accept a JavaPlugin instance, even if they don;t need it

chrome beacon
smoky anchor
hybrid turret
#

Also: I have commands that accept more than just JavaPlugin

slate tinsel
slate tinsel
smoky anchor
#

Depends on what exactly you're doing, but yes
(If you're trying to do like a structure, you can make them ride one armor stand and set different translations for the displays)

slate tinsel
tender shard
smoky anchor
hybrid turret
eternal oxide
#

it sound slike you have too many commands

hybrid turret
#

it's just for prettyness ig

hybrid turret
smoky anchor
#

Personally I think hacking in instances with reflections is not pretty

hybrid turret
#

not in a plugin that will eventually basically be the new "essentials"

shadow night
#

Maybe you should have a main command with lots of subcommands or something

eternal oxide
#

even essentials has a base command

shadow night
#

And generally a good practice

eternal oxide
#

all commands run off a root

hybrid turret
#

ummmmmmmmmm, yeah if I know knew how to use subcommands, that would be pretty cool ig

slate tinsel
shadow night
#

Sounds like you want annotation commands

hybrid turret
#

but doesn't subcommands mean something like

/command subcommand args?

hybrid turret
#

I just can't wrap my head around what annotations do exactly

floral drum
#

metadata

smoky anchor
#

or, I don't really get what you're asking

hybrid turret
#

anyway, maybe i'll just use my helper method to register commands so that i at least don't have to write the getCommand(<commandname) part over and over, lol

smoky anchor
#

You know... copy pasting exists

hybrid turret
#

yeah

#

i'm the type of guy that wants to automate everything so that he doesn't even have to press ctrl+c and ctrl+v lmao

hazy parrot
hybrid turret
hazy parrot
#

basically anything xd

eternal oxide
#

no

#

Never jump to packets because an answer was no

#

There is almost always a better alternative

hybrid turret
#

lol

eternal oxide
#

very unlikely

#

why the heck would you be wanting to cancel login?

floral drum
#

you need keepalive!

smoky anchor
#

Just spawn player in void or something
Then you don't care what player does

hybrid turret
#

may i ask why?

eternal oxide
#

why would anyone want the player be able to chat if they have not logged in?

hybrid turret
#

does the logon take so long that you have to do that? I don't get it

eternal oxide
#

they shoudl have nothing until they are logged in. they are unknown, they could be anyone

floral drum
#

lol

eternal oxide
#

unless of course you are talking about offline so you have no actual player login

hybrid turret
#

oh-

eternal oxide
#

that ends my interest then.

hybrid turret
#

now it makes more sense

hybrid turret
#

lmao

#

why are people still actively developing for game cracks?

eternal oxide
#

only pirates need an auth plugin

echo basalt
#

Yarr

eternal oxide
#

for development, not theft

echo basalt
#

what do you consider "optimized"

hybrid turret
#

Sure people "need" this, but why would you support piracy?

echo basalt
#

if you consider "optimized", "yours" then please go take a walk

floral drum
echo basalt
hybrid turret
#

You know, I get piracy for triple a games costing 70 bucks... but NOT for minecraft.

eternal oxide
#

Not real pirate, no peg leg

echo basalt
#

:(

hybrid turret
#

cut the cat

echo basalt
#

cut the crap

#

✂️

echo basalt
#

cmarco proves the haters wrong!! fuck haters we pirating swagcircle

hybrid turret
#

So what you're saying is:
"I don't give a shit about people robbing the devs of the game I'm making addons for and actively spend my time on as long as I get money for a plugin which basically already exists"?

echo basalt
#

the kick is he ain't getting money

#

he's just getting more people shitting on him

hybrid turret
#

LOL

#

feel free

eternal oxide
#

I did pirate a game around 15 years ago. Early access, I wanted to see if it was worth buying. It was and I did.

echo basalt
#

Marco changes topic when people start shitting on him, a timeless classic

hybrid turret
#

I only pirated sims and the old version of Dark Souls PTDE

#

sims because sims and dark souls because i never got the chance of buying it

echo basalt
#

I pirated minecraft when I was like 5

hybrid turret
#

felt

echo basalt
#

bought 3 accounts since

hybrid turret
#

same, but 2

echo basalt
#

I did give one to a friend

#

so yeah I own 2

hybrid turret
#

lmao same

eternal oxide
#

yeah, I bought MC years ago. two accounts

#

I think I bought a 3rd but can;t find it, so its gone

hybrid turret
#

my one account got banned on my fav server eventually (so i bought a new one, duh) and i gave my other account to a friend that had an email-address linked to his mojang account, that got shut down. So it was never possible to change the e-mail and since mojang accounts don't exist anymore that account is GONE

eternal oxide
#

I bought an account for my wife but she's not a gamer and I can;t convince herr to play 😦

hybrid turret
#

Sadge

echo basalt
#

elgar flexing on us poor devs that he has a wife

floral drum
echo basalt
#

stalker

floral drum
#

nu

hybrid turret
#

LMAO

eternal oxide
#

You wouldn;t want my wife, she's totally crazy 😛

echo basalt
#

avg old man shitting on wife

#

timeless classic

eternal oxide
#

lol

#

her in doors

hybrid turret
floral drum
#

my wife is crazy too

echo basalt
#

I mean

#

There's this chick that likes me

hybrid turret
#

i'm fine with my gf rn, been together almost 5 years but kinda too young to merry

#

(bc money lol)

echo basalt
#

but I'd be a fake if I were to get a gf

#

Fuck relationships we making plugins

hybrid turret
#

a fake dev?

#

lmao

echo basalt
#

Why handicap myself

hybrid turret
#

wife == distraction

#

so no wife

#

makes sense

echo basalt
#

ah yes

#

a memory reference to distraction

hybrid turret
#

(did i just accidentally reference something?)

floral drum
#

a wife is like a memory leak (not mine tho)

echo basalt
#

purple's going through that foggy love phase

floral drum
#

what

echo basalt
#

Where your chick's perfect and flawless and the best thing in your life :p

floral drum
#

real

echo basalt
#

hm m

#

Should I go work rn

floral drum
#

maybe

echo basalt
#

and by go work I mean fuck around with code in vc and pray someone joins

astral scroll
#

true

sand spire
#

Should I save data to a config file every time new data is available, every x minutes or everytime the server closes/crashes?

echo basalt
#

Hmm

sullen marlin
#

2 and 3, maybe 1 depending how often

sand spire
#

So 1 to save for example ranks and settings, and 2 and 3 for everything else like stats that increase frequently?

hybrid turret
#

I save inventories to files for example. I do this with a scheduler and onDisable obviously.
the interval for the schedular is changable in the config.yml and i wrote a recommendation as a comment. Then the server-owners can decide themself when to write to files basically

#

otherwise: what md_5 says

sand spire
#

I see, thank you

quaint mantle
#

You can compare hashcodes if craftbukkit inventory have hashcode method

sand spire
hybrid turret
#
## Configure the interval for saving the vaults in minutes. The lesser the number the more the server will lag when it gets bigger. (Minimum is 5)

This is the comment I added to the config.yml

#

The minimum can obviously be set to whatever you want

#

I just thought 5 is a nice number and when the server is big, i feel like the lag would be BAD BAD

#

i went for the method of creating 1 file per saved inventory instead of a big file so that it's at least somewhat fast.

Eventually I'll save the inventories in a sqlite database anyway

sand spire
#

Thank you 🤝

hybrid turret
#

no problem :)

#

glad to help

hushed spindle
#

anyone got any resources for a sync packet listener (no netty channels)?

proper cosmos
#

Guys, I have weird issue, I have inventory GUI canceling InventoryClickEvent if it's my Inventory, but player's are able to take items using SHIFT

hushed spindle
#

show code

proper cosmos
#
@EventHandler
    public void invClickEvent(InventoryClickEvent event){
        Game game = games.stream().filter(_game -> _game.getGUI() == event.getClickedInventory()).findAny().orElse(null);
        if(game == null) return;

        event.setCancelled(true);
    }```
hushed spindle
#

shouldnt compare objects with ==

#

use .equals() instead

hybrid turret
#

with null it's okay, no?

proper cosmos
hybrid turret
#

i had this discussion once on this server

#

exactly

#

oh

#

in the filter

proper cosmos
#

like you could but it's nonsense

onyx fjord
#

is there a way to check if player has a permission but ignore the fact player is OP?

hybrid turret
#

You would have to use Objects.equals(obj, null)

hushed spindle
#

you cant do null.equals() no but you can do Object.equals(null)

#

i think anyway

hybrid turret
hushed spindle
#

in any case dont use ==, your game found is obviously null so the event isnt being cancelled

hybrid turret
#

equals can't compare to null

proper cosmos
#

because when i just click it

hushed spindle
#

it is? huh

proper cosmos
#

it canncels

#

but with SHIFT i can take out item

#

can't do anything with it (ghost) but when i leave server and go again it becomes normal blcok

hybrid turret
#

ahhhh

#

yeah that's just a visual bug

hazy parrot
hushed spindle
#

you could try to update the players inventory ig

proper cosmos
onyx fjord
proper cosmos
#

I thought that there is better way of doing it

hushed spindle
#

did you check if the event is being cancelled with shift clicking yet

#

that maybe elsewhere its being uncancelled

hybrid turret
proper cosmos
hushed spindle
#

wait nvm its just visual

#

forgor

proper cosmos
#

I guess all i can do is just udpdate inventory

hushed spindle
#

may depend on what you do after the fact that makes it more prone to visual bugs

hybrid turret
#

idk how pretty that is tho

hushed spindle
#

if you make the permission default to false it will not be available to opped players by default

#

assuming the permission is yours to do that with

hybrid turret
#

oh right, that's a thing

hushed spindle
#

if its not your permission then you could also maybe change it on startup

onyx fjord
#

i think i got it

#

PermissionDefault is probably what i need

#

yup it works

agile hollow
#

why it's not making a new line when i'm using \n
kits.setItem(15, getItem(new ItemStack(Material.OBSIDIAN, 16), "&eOssidiana", Utils.color("&7Left-Click: &c375$ &f1x" + "\n" + "&7Right-Click: &c6000$ &fx16")));

smoky anchor
#

Each lore line is it's own entry in an array
\n doesn't make new line

agile hollow
smoky anchor
#

show code of "getItem"

agile hollow
# smoky anchor show code of "getItem"
        ItemMeta meta = item.getItemMeta();
        meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', name));

        List<String> lores = new ArrayList<>();
        for (String s : lore) {
            lores.add(ChatColor.translateAlternateColorCodes('&', s));
        }
        meta.setLore(lores);

        item.setItemMeta(meta);
        return item;
    }
smoky anchor
agile hollow
#

oh ok thx <3

smoky anchor
#

You literally wrote your code to support that....

agile hollow
#

ye xd i just figued out

hybrid turret
final wharf
#

is anyone here experienced with drink command lib?

smoky anchor
#

?ask

undone axleBOT
#

If you have a question, please just ask it. Don't look for staff or topic experts. Don't ask to ask or ask if people are awake or available. Just ask the question to the channel straight out, and wait patiently for a reply. Make sure you use the right channel regarding the topic of your question. Create a thread in case the channel is already in use!

final wharf
#

im not asking to ask

#

there arent many using drink

#

made a simple /gmc command using drink but i get this error

#
import com.jonahseguin.drink.annotation.Command;
import com.jonahseguin.drink.annotation.OptArg;
import com.jonahseguin.drink.annotation.Require;
import com.jonahseguin.drink.annotation.Sender;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.GameMode;
import org.bukkit.entity.Player;

public class GamemodeC {
    @Command(name = "", aliases = {}, desc = "", usage = "")
    @Require("react.gamemode.creative")
    public void gmc(@Sender Player sender, @OptArg("1") Player t) {

        if (t != null) {

            MiniMessage mm = MiniMessage.miniMessage();
            Component parsed = mm.deserialize("Your gamemode is now <green>Creative");
            t.sendActionBar(parsed);
            t.sendMessage(parsed);
            t.setGameMode(GameMode.CREATIVE);

        } else if (t == null) {

            MiniMessage mm = MiniMessage.miniMessage();
            Component parsed = mm.deserialize("Your gamemode is now <green>Creative");
            sender.sendActionBar(parsed);
            sender.sendMessage(parsed);
            sender.setGameMode(GameMode.CREATIVE);

        }
    }
}```
#

here is the whole class

remote swallow
#

the optional arg is meant to be the default value it seems

smoky anchor
#

It tries to find a Player with name "1"

final wharf
#

yeah

#

thanks

smoky anchor
cosmic loom
#

Can anyone hop into a call with me to help me with a quick fix

smoky anchor
#

If it's quick why not just ask here

cosmic loom
#

becuz its hard to exaplin when typing

#

for myu situation

#

my

final wharf
#

how am i supposed to set flyspeed and walkspeed?

vocal cloud
#

what is the error?

final wharf
#

at all

#

well, it doesnt build

vocal cloud
#

Your IDE is underlining it with an error. What is the error?

slender elbow
#

hover your cursor over the red underline

final wharf
vocal cloud
#

You can't set the walk speed to a string lol

#

"How fast would you like the player to go? Yes"

#

?learnjava

undone axleBOT
young knoll
#

Can I set my walk speed to

The FitnessGram™ Pacer Test is a multistage aerobic capacity test that progressively gets more difficult as it continues. The 20 meter pacer test will begin in 30 seconds. Line up at the start. The running speed starts slowly, but gets faster each minute after you hear this signal. [beep] A single lap should be completed each time you hear this sound. [ding] Remember to run in a straight line, and run as long as possible. The second time you fail to complete a lap before the sound, your test is over. The test will begin on the word start. On your mark, get ready, start.

final wharf
#

lol

#

so i just do this?

#
public class Speed {
    @Command(name = "", aliases = {}, desc = "", usage = "")
    @Require("react.speed")
    public void speed(@Sender Player sender, int s) {

        sender.setWalkSpeed(s);
        sender.setFlySpeed(s);
        MiniMessage mm = MiniMessage.miniMessage();
        Component parsed = mm.deserialize("Your speed is now <green>" + s);
        sender.sendActionBar(parsed);
        sender.sendMessage(parsed);

    }
}```
vocal cloud
#

Well ideally you'd want to learn java. Yes, that would work, although I'd rather cast it directly than parse

rotund ravine
#

?whereami

final wharf
#

i litterally dont have any other choice other than spigotmc

rotund ravine
#

Sucks to suck 🤪

vocal cloud
#

Did you get banned from Paper?

#

Do they ban people for not knowing java?

rotund ravine
#

He might just be using an outdated version or smth

final wharf
#

im not THAT stupid

final wharf
#

im on 1.20.4

#

with java 21

#

XD i cant ask in paper tho

#

im using pufferfish as the server jar

rotund ravine
#

Ask on pufferfish then

#

Or use purpur and ask there

final wharf
#

f purpur

#

spigotmc is just more helpful tho

rotund ravine
#

?fork

undone axleBOT
#

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.

rotund ravine
#

We can be less useful 🤪

hybrid turret
# final wharf with java 21

Java 21? Isn't even the current minecraft/spigot version supporting Java 17? I mean yeah Java 21 works, but it's recommended to use 17, no?

final wharf
rotund ravine
#

Yes

hybrid turret
final wharf
#

Yeah, no, thanks tho

hybrid turret
#

what's wrong with using spigot?

final wharf
hybrid turret
#

oh alright, i get that

#

i wouldn't want to switch to paper, lol

#

as of that exact reason

final wharf
#

Paper is spigot with better optimization

#

And ability to have Velocity modern forwarding

peak depot
#

is there a way to send a plugin message with no one on the server?

young knoll
#

No

hybrid turret
young knoll
#

Plugin messaging is a spigot mechanic to communicate between servers/the proxy

#

But it requires a player

hybrid turret
#

How exactly does the logger work? For funsies, I tried logging a message of each level and anything that is not Level.SEVERE, LEVEL.WARNING or LEVEL.INFO isn't even logging.

#

Are those just the only allowed Levels?

young knoll
#

Yeah the logger is weird

#

It’s locked to only log into and above

hybrid turret
#

huh

#

is it good practice to use it?

young knoll
#

Better than sysout

hybrid turret
#

Better than Bukkit.getConsoleSender().sendMessage()?

#

Wait, can it even use colors?

river oracle
#

No iirc

tardy delta
#

logger cant, console sender can

hybrid turret
#

no

#

okay

#

then i'll stick with ConsoleSender

river oracle
#

But logs aren't really meant to be beautiful generally it's useful info like my plugij started config values loaded database connected etc

tardy delta
#

i tend to only log things which are absolutely neccesary, everything else clutters up

river oracle
#

I'd consider the use of ConsoleSender vs a logger in places where you aren't directly interacting with a console e.g. a command an abuse of the ConsoleSender

hybrid turret
#

but if i do have to use it, i'd rather have it have colors. easier to read

#

(at least imo)

#

it's kinda like that method of printing certain parts of words fat that makes you read faster

#

not really, but kinda

river oracle
#

Sure but a logger isn't meant to be pretty It's meant to print information that's potentially useful

hybrid turret
#

tbh the logger levels are supposed to indicate severity. what indicates severity better? a red word or "ERROR" written at the beginning?

river oracle
river oracle
#

Debug??

hybrid turret
#

that's what i was saying with my message

hybrid turret
river oracle
#

I mean are any of those important?

hybrid turret
#
public static final Level OFF = new Level("OFF", Integer.MAX_VALUE, "sun.util.logging.resources.logging");
public static final Level SEVERE = new Level("SEVERE", 1000, "sun.util.logging.resources.logging");
public static final Level WARNING = new Level("WARNING", 900, "sun.util.logging.resources.logging");
public static final Level INFO = new Level("INFO", 800, "sun.util.logging.resources.logging");
public static final Level CONFIG = new Level("CONFIG", 700, "sun.util.logging.resources.logging");
public static final Level FINE = new Level("FINE", 500, "sun.util.logging.resources.logging");
public static final Level FINER = new Level("FINER", 400, "sun.util.logging.resources.logging");
public static final Level FINEST = new Level("FINEST", 300, "sun.util.logging.resources.logging");
public static final Level ALL = new Level("ALL", Integer.MIN_VALUE, "sun.util.logging.resources.logging");
#

These are the levels

river oracle
#

If you for some reason think you need those other levels make a jira report

#

?jira

undone axleBOT
hybrid turret
#

naah, i was just wondering

remote swallow
river oracle
#

I'm sure MD would respond

hybrid turret
#

why they didn't print anything

slender elbow
#

because log4j is configured to ignore those

remote swallow
#

why though

slender elbow
#

ask mojang

remote swallow
#

those levels could be useful

river oracle
#

Mojank

remote swallow
#

fr

river oracle
#

Really though those levels aren't that important :P