#help-development

1 messages · Page 896 of 1

foggy cave
#

i tried this but setList isnt a method

chrome beacon
#

I mean just set with a list*

#

set(key, list)

ivory sleet
#

🥲

tall dragon
#

nvm fellas i found out my issue

#

😄

wet breach
#

sweet

#

always good when you find out the issue yourself 🙂

tall dragon
#

yea and its pretty stupid as well

#

forgot i set my items unbreakable clown_pepe

river oracle
#

durability can be used for texturing

#

not sure if this is still true in modern versions

#

basically make sure you or your texture packs aren't abusing durability for textures

tall dragon
river oracle
#

oh I didn't see :P

chrome beacon
#

use custom model data if possible

quaint mantle
#

how do i set noclip state for falling blocks

#

so they can actually go thru blocks

chrome beacon
#

You'd need to override their behavior using NMS as far as I'm aware

#

or just move them yourself

lament maple
#

does someone have the dependency for paper 1.8.8

hazy parrot
#

🧑‍⚖️

rough ibex
#

1.8 augh

wet breach
lament maple
#

and you gotta serach the whole internet just to find this stupid dependency

wet breach
#

and since when did spigot started providing support for things that are not theirs?

lament maple
#

idk just asking ppl

rough ibex
#

1.8.8 is 8+ years old

#

get over it

river oracle
#

?1.8

undone axleBOT
icy beacon
#

7 is an understatement iirc

#

?1.8

undone axleBOT
icy beacon
#

Fucking hell

rough ibex
#

so amended

river oracle
#

L slow

icy beacon
#

Sniped on both

icy beacon
rough ibex
#

regardless

#

stop using 1.8

icy beacon
#

I'll never stop playing on 1.8 🥲

river oracle
#

but you can spam click pepesob

icy beacon
#

But coding against it is pain

river oracle
#

1.9 was the worst update in minecraft history

icy beacon
#

There are like 9 total blocks in 1.8

river oracle
#

not even lying

icy beacon
#

You can't even use like end rods

rough ibex
#

1.9 was a great update

#

you just don't like it because you can't spam click and win pvp

river oracle
icy beacon
#

Eh it's opinionated, maybe we should not entertain this conversation??

#

Or at least not in this channel

rough ibex
#

anyway we won't/can't provide whatever paper 1.8 he wants

icy beacon
#

Yep , good conclusion

#

Good night y'all I'm hitting that bed

lament maple
#

how to bypass 1.8.8 nametag 16 characters limit there has to be a way

rough ibex
#

no

#

you are using a 8 year old version

#

there is no way to bypass it

shadow night
#

Isn't it 9 years old already

rough ibex
#

almost

#

check link above

#

1.8.8 is legacy and deprecated - stop using it

shadow night
#

Pvp is not a reason

river oracle
#

Uhm actually I lied

#

Mod the client

eternal night
#

abuse the log4j exploit if some people still run that 5Head

rough ibex
#

probably won't work since it's patched at the launcher level

river oracle
lament maple
tardy delta
#

hmm in kotlin are you supposed to be calling == or === to compare with null, == would call equals, but whats the point of equals(null)?

rotund ravine
#

Doesn’t matter

tardy delta
#

so the same code gets generated?

rough ibex
#

yes

#

Note that there's no point in optimizing your code when comparing to null explicitly: a == null will be automatically translated to a === null.

tardy delta
#

an optimizing compiler, good

rough drift
#

💯

quiet ice
#

I am not sure whether that can even be treated as an optimization

#

It's no like it calls Objects#equals(...) when comparing with null

minor junco
tardy delta
#

i was talking about javac

#

the point is still that the jit compiler does most of the work

native nexus
#

wtf 1.20.4 doesn't have apache common...

minor junco
#

i mean yeah JIT is crazy in optimizing, but there's also a bunch of CT optimization

wet breach
#

the jit just goes further for during runtime

rough drift
#

I tried making an AOT

#

it is not fun

native nexus
#

Why did they remove apache common from spigot?

tardy delta
#

lemme actually look at some bytecode

minor junco
#

i'd assume so

rotund ravine
#

The JIT also optimizes at some point

rough drift
#

I'd hope so

quiet ice
quiet ice
echo basalt
rough drift
#

Actually yeah @quiet ice is right

#

UNLESS

#

they are pure functions

quiet ice
#

(Yes, for some reason there is a diff between || and |)

echo basalt
#

bitwise OR

rough drift
#

yes, one is a logical OR and the other is a bitwise OR

tardy delta
#

actually dumb example, yes expensiveCalc() might return different values 💀

quiet ice
wet breach
#

no

quiet ice
native nexus
#

If you have done any kind of programming degree you will understand the difference between | and ||

quiet ice
rough drift
#

logical or runs the right only if the left isn't true

quiet ice
#

correct.

rough drift
#

While the bitwise OR literally runs the bitwise OR operation, requiring both expressions to be evaluated

tardy delta
rough ibex
#

for short-circuiting ones, which is generally true

wet breach
quiet ice
#

I'm not sure if <bool> | <bool> even runs a bitwise OR, given that the JVMS does not properly define the values of booleans (only those of booleans in arrays)

wet breach
rotund ravine
#

Fake!

rough drift
#

it doesn't properly define boolean as a data type, booleans are just bytes

wet breach
#

I mean, not sure what you would define with a single bit

rotund ravine
#

It doesn’t even define it as a single bit iirc.

rough drift
#

it's a full 8 byte @wet breach

wet breach
rough drift
#

Yes, but that's the java syntax spec & java std lib, we're talking about the JVM spec

#

the JVM itself doesn't have a boolean data type

wet breach
minor junco
#

booleans are not a single bit

quiet ice
wet breach
tender shard
#

is paper now already marking NMS fields as deprecated or where is this coming from lol

wet breach
#

so, if implementation wise a JVM uses -1 and 1 to distinguish between the values I suppose its fine as long as true and false are returned

#

normally it shouldn't be a concern for a java application to care about implementation detail if it doesn't change the outcome

quiet ice
#

Well in C 0 is false and non-0 is true. In java, 1 is true, 0 is false and everything else is JVM-dependent

tardy delta
#

sounds fun

quiet ice
#

But yeah, javac makes use of IOR for this

#

Furthermore, the JVMS defines the IF<cond> opcodes as tests against 0 - C-style

tardy delta
#

btw geol, would you know some kind of program that translates bytecode mnemonics to actual bytecode?

quiet ice
#

I do not know what bytecode mnemonics are

tardy delta
#

i mean like imagine typing istore_1 and stuff

quiet ice
#

Like I have heard that word, but I cannot attach anything to it

rough ibex
#

if you want actual bytecode open the file in a hex editor

quiet ice
#

istore_1 is an actual opcode I think

tardy delta
#

uh ye

rough ibex
#

there you have it

#

you can use godbolt for quick java snippets

tardy delta
#

actually my question sounds silly, translating bytecodes in text form to actual ones

dry hazel
tardy delta
#

was looking for something that reads this and compiles it to an actual .class file

quiet ice
#

I have heard of a few assemblers that do have such support, but honestly there is probably little reason to not use an more standard assembler such as https://github.com/jumanji144/Jasm

#

The openJDK team have their own assembler and krakatau is another known assembler

wet breach
tardy delta
#

ye i could just write a quick parser

wet breach
#

and some of the headers etc

tardy delta
#

well ye the constantpool would be an issue lol

quiet ice
tardy delta
#

i mean i wrote a classfile reader so making a writer should be a fun project too \🤓

rotund ravine
#

Do it

tardy delta
#

i actually might

rotund ravine
#

Do it

quiet ice
#

there is no reason to do so.

tardy delta
#

but got enough to work on in the meantime

young knoll
#

Since the TPS can be changed now

quiet ice
#

ASM is more than great. If ASM is too high-level (e.g. due to obfuscation or if you need direct access to the constant pool), cafedude (https://github.com/Col-E/CAFED00D) should be used

tardy delta
#

classfile writer?

#

looks like it

quiet ice
#

Yes, that is the library used by recaf to transform heavily obfuscated classes to comply by ASM's standards

tardy delta
#

oeh nice to know

quiet ice
#

It's only shortcoming is that it isn't great when you need to compute stackmaps, given that it lacks the built-in support for it and doing it yourself is more than eternal pain

tardy delta
#

you seem to be a transformer enthusiast

#

i even forgot what stackmaps were used for again

quiet ice
#

They are required for Java 7+ bytecode for the verifier. That is pretty much it - I believe the JVM doesn't even use it

quiet ice
tardy delta
#

ahh here they are, once wrote a definition for them

quiet ice
#

Is that rust?

tardy delta
#

// Each stack map frame specifies (either explicitly or implicitly) a bytecode offset,
// the verification types for the local variables, and the verification types for the operand stack.

#

odin, you wont know the language

rough drift
quiet ice
#

yep, never heard of it

tardy delta
#

another one of those system languages that tries to gain popularity

rough ibex
tardy delta
#

?

rough ibex
#

"general-purpose programming language with distinct typing built for high performance, modern systems and data-oriented programming. "

quiet ice
#

Especially in combination with bugs you made outside of stackmap writing code (such as https://github.com/Col-E/CAFED00D/issues/24 which bit me last time I tried this heh) computing the stackmap offsets is fun for the whole family and mainly consists out of trial-by-error

tardy delta
#

looking forwards to a lot of bugs

quiet ice
#

oh, and depending on what kind of classes you want to read you'd also need to write your own low-level zip reader

tardy delta
#

hmm?

quiet ice
#

though chances are you do not want/need to

quiet ice
# tardy delta hmm?

Java supports jars that aren't exactly conforming to standard zip principles

tardy delta
#

oh dunno, im still waiting for a pr that adds zip files reading to the lang lol

quiet ice
#

oh wow, that much be an incredibly immature language then

tardy delta
#

i mean it has a lot of things but not everything

#

could always generate a c binding

#

still community driven

rough ibex
#

what's exactly the point of using this lang specifically

tardy delta
#

its a nice c alternative

#

and it has a bit of go's semantics

quiet ice
#

Hm, the main advantage of go that interests me is that unlike java, the unsafe is actually supported over there

wet breach
quiet ice
#

But I have never used go (nor most other languages) so I cannot comment too much on it

wet breach
#

go is pretty interesting

#

I used it for a proxy way back when and it was actually pretty decent

quiet ice
#

The problem with a lot of programming languages is that they are remarkably difficult to use in a multi-platform environment

tardy delta
#

especially low level languages yes

quiet ice
#

Main reason I am not at all interested at C# even though it should be a better java according to some

tardy delta
#

one might call it less bloat, but at that point just use kotlin

#

im gonna get a lot of criticism on this one

quiet ice
#

Kotlin is a remarkably bloaty solution

slender elbow
#

Oak is the perfect programming language

quiet ice
#

I've been debating for a while now whether to use kotlin scripting or XML/HOCON for my build tool and given kotlin's size the latter might be the better option

tardy delta
#

id even call it cleaner the moment you start to use it

#

started converting some of my java projects to kotlin cuz its less bloat and has some cool semantics

quiet ice
tardy delta
quiet ice
#

For all intents and purposes it is a solid configuration language

spare mason
#

where i can find a good git ignore template?

tardy delta
#

github has a repo full of gitignores

quiet ice
#

.* - done

spare mason
tardy delta
rotund ravine
spare mason
quiet ice
#

although target and build probably should get excluded too

spare mason
#

i just want to have the src there xd

quiet ice
tardy delta
rough ibex
#

then use that

#

you can type gitignore yourself

#

but likely a good idea to use one for java generally

rotund ravine
spare mason
rough ibex
#

Good chance to learn

spare mason
#

do i really have to learn git ignore?

quiet ice
tardy delta
#

lets say data types

quiet ice
#

Gitignores are trivial in nature

spare mason
#

there's no method to just exclude everything but src?

tardy delta
quiet ice
#

data types as in ints versus floats versus doubles or wha?

quiet ice
tardy delta
spare mason
rough ibex
#

just learn git

tardy delta
#

to be able to build the project from source

rough ibex
#

Gitignore is just a list of files to not be added

tardy delta
rough ibex
#

Rather, to keep untracked

tardy delta
#

but thats just my opinion

quiet ice
#

You can use something like follows:

*
!src/
!pom.xml
!build.gradle
!gradlew
!gradlew.bat
!settings.gradle
!gradle/wrapper/
!README.*
!.gitignore
#

(You'd also need to include the license file but given that there are a bazillion paths for those I choose to not add it here)

quiet ice
quiet ice
tardy delta
quiet ice
#

Yeah, but wouldn't yaml, toml, hocon or anything else for that matter suffer from the same drawbacks?

tardy delta
#

i'm currently using a yml based build system 🥲

rough ibex
#

then use JSON

tardy delta
rough ibex
#

or json5 if you're cool

quiet ice
#

I knowingly did not include JSON because even I can state that it is complete bullshit for configuration files

river oracle
#

Json is nice

quiet ice
#

Yeah, but the lack of comment support doesn't make it attractive to me

rough ibex
#

which is why I use JSON5

tardy delta
#

just do "__comment1": "hello there" lol

rough ibex
#

and then use a JSON5 parser -> JSON -> parse that

river oracle
#

Or just enable comments

rough ibex
#

easily integrate into existing json environments

quiet ice
#

So if I ever need a JSON-like language with comments I use HOCON, whose only drawback is the fact that it doesn't have many implementing libraries

river oracle
#

Maybe I'm just hallucinating

rough ibex
#

this?

#

doesn't seem like it went anywhere

quiet ice
#

And well given that I use configurate to implement my configuration files in these cases I can easily switch/support different config languages if I want to

river oracle
rough ibex
#

youre AI

quiet ice
#

I am pretty sure that gson supports comments, at least in it's lenient mode

rough ibex
#

lenient just makes it swallow exceptions and try to read anyway

#

JSON does not allow comments in the spec

quiet ice
#

Well, looks like comment support to me anyways

rough ibex
#

still, I use JSON5 generally anyway

#

just better

quiet ice
#

is there a decent enough json5 lib for java even?

rough ibex
#

all you need is something that spits out valid JSON

quiet ice
rough ibex
#

and then use whatever JSON lib you want

#

I like using jankson but I know there are others

quiet ice
#

Pretty much a must-have if you want to distribute your code online, as by default it is ARR (all rights reserved) which makes the act of publishing the code pretty much useless

rough ibex
#

LBPDT license /s

near barn
#

com.sk89q.worldguard:worldguard-bukkit🫙6.1.3 was not found in https://papermc.io/repo/repository/maven-public/ during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of papermc-repo has elapsed or updates are forced

Try to run Maven import with -U flag (force update snapshots)

When trying to load maven changes I get this error 😦 somebody that knows why

quiet ice
spare mason
rough ibex
#

you can check the index yourself.

river oracle
tardy delta
quiet ice
#

Though CC-0 is the more professional approach for that ;)

dry hazel
#

or the unlicense

tardy delta
#

instead of teaching us about licenses in college they teach us a bunch of ethics

river oracle
#

Who tf cares about ethics CH_KekLaugh

tardy delta
#

nobody, we are doing cs

river oracle
#

Teach me my licenses so I know who I can sue

spare mason
#

what is cs?

river oracle
#

Compsci

tardy delta
#

computer science

spare mason
#

ooooohhhh

#

why licenses? isn't coding community like we all have the code that some dude made years ago

near barn
#

Where do I find the worldguard repo?

rough ibex
rough ibex
#

and it is up to you for how you want others to use it

#

you own your works

river oracle
#

Licensing is nice becuaase having no specified license is much less freeing to other devs than something like gplv3 or MIT

quiet ice
#

oh god not the GPL

river oracle
#

GPL INFECTION!!!!

quiet ice
#

You give me nightmares with these three letters

tardy delta
#

woo fun

river oracle
#

It's not that bad stay mad

spare mason
#

is gpl a cancer?

quiet ice
#

(especially once you put the letter "A" in front of them)

tardy delta
#

a very well spreading one

river oracle
#

It being cancerous is what makes it a nice license tho

tardy delta
#

bet youve been using chatgpt all other times

#

isnt that the bukkit logger

river oracle
#

Yeah not much you can do about it

#

Unless you do some asm patching type shit

tardy delta
#

i believe even vanilla has that

river oracle
#

Actually you might beable to edit the log4j file to not log

quiet ice
#

Yep

river oracle
#

But that stoll requires a patch

quiet ice
#

log4j probably has one or the other hidden features where you can add log filters

#

And you can easily specify custom log4j configs via system properties

dry hazel
#

you can even reconfigure on runtime

quaint mantle
#

How does bukkit know what plugin uses System.out

#

Do they analyze the stack

eternal night
#

Yes

quaint mantle
#

All that just to display "Nag the authors..."?

eternal night
#

indeed

quaint mantle
#

lmao

remote swallow
#

that is paper

#

not bukkit

tender shard
#

was about to say

remote swallow
#

@eternal night you should know that smh

river oracle
tardy delta
#

System.setOut ig

remote swallow
slender elbow
#

I prefer writing to new FileOutputStream(FileDescriptor.out) myself

remote swallow
#

did you commit something to chunky

slender elbow
#

uh i think

remote swallow
#

i got pinged by chunky and i thought i saw you on it

slender elbow
#

yeah i'm in the chunky channel

#

oh

#

i see

#

pop is saying he pinged me directly because i contributed lmao

remote swallow
#

yup

golden turret
#

how do i specifically disable those kind of warnings in the javadoc?

remote swallow
#

gradle?

golden turret
#

yes

remote swallow
#

kotlin or groovy

river oracle
#

Groovy

remote swallow
#

javadoc.options.addStringOption("Xdoclint:none", "-quiet")

#

it should be that anyway

golden turret
#

yes, i tried that

slender elbow
#

i didn't mean to super react

golden turret
#

but it also disables another kinds of warnings

river oracle
#

@slender elbow I've ascended I use gradle.kts now

golden turret
#

i just want to disable to that specific warning

river oracle
slender elbow
#

not paying a cent

strong forge
remote swallow
slender elbow
#

omg look it's nanahira

remote swallow
#

omg its the chunky guy

tender shard
#

@river oracle you know what

river oracle
#

What do I know?????

#

😭

remote swallow
#

what do you know

river oracle
remote swallow
#

wait a mother frickin minute

#

where the fiuck is reobfJar coming from

#

thats not in patrick choes remapper

tender shard
#

it's paperweight so that people won't have to run buildtools for 12 versions

remote swallow
#

smh

slender elbow
#

oh no

remote swallow
#

just use the totally legal codemc nms repo

quiet ice
#

didn't it get nuked?

remote swallow
#

not that i know of

quiet ice
#

meh, I am too lazy to see for myself

remote swallow
inner mulch
#

are java methods atomic?

#

if not, how i make them atomic?

rough ibex
#

You can syncronize

minor junco
#

In computer science, mutual exclusion is a property of concurrency control, which is instituted for the purpose of preventing race conditions. It is the requirement that one thread of execution never enters a critical section while a concurrent thread of execution is already accessing said critical section, which refers to an interval of time du...

#

synchronized can lock on an object

#

so it locks on the object and unlocks as soon as the synchronized block goes out of scope

#

in other programming languages you may have to manually unlock or if you use other kind of locks

ivory sleet
#

atomicity regards to an operation being indivisible, that is, either it did take action, or it did not, we cant observe the progress/the middle of the operation

#

the keyword volatile is not enough alone to guarantee atomicity, you will need something stronger that either ensures mutual exclusion to one thread at a time, or something that calls a low level arch instruction that can atomically swap the value if a variable if that value is equal to some other expected value

#

for instance AtomicReference is nice since it has an getAndUpdate which does it atomically

#

however if you have multiple state variables that share invariants to one another you’d probably need to use an intrinsic lock (java synchronized), or some other mechanism like semaphore, reentrantlock or stampedlock

polar pulsar
#

Hi, I'm trying to detect when the player has broken an elytra

@EventHandler
public void onPlayerItemDamageEvent(PlayerItemDamageEvent event) {
    if (event.getItem().getType() != Material.ELYTRA) return;
    Damageable damageable = (Damageable) event.getItem().getItemMeta();
    if ((damageable.getHealth() - event.getDamage()) > 1) return;
    DbHelper.setTrackedMissionEligibilityToTrue(event.getPlayer().getUniqueId(), "BreakElytraMission");
}

however it wont cast the item metadata to damagable when the item takes damage

[16:33:02 ERROR]: Could not pass event PlayerItemDamageEvent to NebulaSurvivalRanks v1.0-SNAPSHOT
java.lang.ClassCastException: class org.bukkit.craftbukkit.v1_20_R3.inventory.CraftMetaItem cannot be cast to class org.bukkit.entity.Damageable (org.bukkit.craftbukkit.v1_20_R3.inventory.CraftMetaItem and org.bukkit.entity.Damageable are in unnamed module of loader java.net.URLClassLoader @61e717c2)
young knoll
#

Wrong damagable import

#

Notice the org.bukkit.entity.Damagable

polar pulsar
#

ahhh

ivory sleet
#

classic one :,)

young knoll
#

At least it isn’t structure

#

You’re lucky I didn’t call the new structure class Structure as well :p

ivory sleet
young knoll
#

It was tempting

ivory sleet
#

lmao

slender elbow
#

most field type writes are atomic excepting for longs and doubles (which are not guaranteed but jvm implementors are encouraged to make them atomic anyway lmao)

#

volatile just makes that change immediately visible to other threads

#

"just"

ivory sleet
#

yeah true, but its kinda needed if you want to optimistically write without heavy locking (like try to CAS and if it fails, try again)

slender elbow
#

oh apparently writes to non-volatile longs and doubles are not guaranteed to be atomic (but encouraged to be)

ivory sleet
#

talking about a read modify write op

slender elbow
#

writes to volatile longs and doubles are atomic

#

5head

ivory sleet
#

:^)

slender elbow
#

inter thread will certainly need volatile at the most basic level

#

without it your program is flawed

ivory sleet
#

yup yup

umbral ridge
#

hey

#

whats the enum for last damage cause

#

cant find it

#

in other words, what are all possible death causes for a player

young knoll
#

Get the cause from the event

umbral ridge
#

what is getCause()

#

i mean that doesnt even exist

slender elbow
#

it does

#

in the event

umbral ridge
#

what does it return

slender elbow
#

damagecause or smth

umbral ridge
#

yes

#

finally

#

thanks!

slender elbow
#

are you writing code on notepad or something

umbral ridge
#

no im just guessing right now since im gonna do this project tomorrow

young knoll
#

There’s also the new damage api if you are on the absolute latest version

umbral ridge
#

yea i am

#

whats it called?

umbral ridge
slender elbow
#

I'm not?

#

lol

young knoll
#

DamageSource and DamageType

slender elbow
#

discord

young knoll
#

Mhm

umbral ridge
#

just reorganized? were there any code changes

young knoll
#

But damage type is registry backed

umbral ridge
#

ahh

#

yeah sure why not ill use it

#

it's also named better

#

enums are named better

young knoll
#

Well it’s not an enum

#

Cuz yk, registry backed

umbral ridge
#

right Keyed

#

xD

young knoll
#

Death to the enums

ivory sleet
#

poor enums

umbral ridge
#

Keyed will take over the entire spigot

ivory sleet
#

Lol yeah

umbral ridge
#

every enum will become Keyed

ivory sleet
#

Well mojang sided, more stuff gets registrified for each version so having that transparent in the api might be a huge W

umbral ridge
#

Imagine if spigot was rewritten from scratch

#

how much work would paper have to do xD

#

and all forks

ivory sleet
#

Would fix a lot of mistakes that were made ages ago

umbral ridge
#

yeah

#

you could rewrite it Conclube

#

I believe in you

ivory sleet
#

Oh Im not a 10x dev

#

but hmm, maybe once I finish my uni

young knoll
#

If spigot is so good why isn’t there spigot2

ivory sleet
#

Its just… a lot of work

umbral ridge
#

it would be a lot of work and

#

time

ivory sleet
young knoll
#

Well technically

ivory sleet
young knoll
#

There was the April fools snapshot

ivory sleet
#

walmart minecraft2

#

Spexx I also don’t know if I know the mojang codebase good enough

umbral ridge
#

xD

#

noone knows

#

noone knows their secrets

young knoll
#

Something something just slap a codec on it

remote swallow
#

Illusion does

ivory sleet
#

Like, I know it better than most people probably lol, but you’d need a couple of big brain devs to cover the entire codebase

umbral ridge
#

yeah

#

I dont know how much I know about it.. I know some things.. but the more you know.. the less you think you know

ivory sleet
#

Also like, caring about thread safety whilst keeping transparency in a proxy like api can be hard

umbral ridge
#

lol

#

xD

#

you never know maybe there will be spigot2 in a few years some dude on github who you've never seen before will present its own version and get popular and the cycle repeats.. eh

young knoll
#

I think that’s just

#

Insert fork here

ivory sleet
#

I think the biggest pivot point towards an entire rewrite would mainly be to upgrade the transparency that the api holds between mojangs source/impl and bukkit api itself

#

but like, there is a certain fork that I wont name, which does try to do this within the bounds of the legacy api remnants

young knoll
#

hmm

#

📄 🤔

ivory sleet
#

cant confirm nor deny

young knoll
#

Ah yes of course the default emoji isn’t :paper:

ivory sleet
#

lmao

#

sheet?

young knoll
#

It’s page_facing_up

ivory sleet
young knoll
#

The enum PR will help make things much more cohesive with Mojangs stuffs

#

Eventually™️

ivory sleet
#

lol

#

enum pr, by that u mean deprecating and removing them riiiight?

young knoll
#

Yes

#

Well, some get deprecated some get the ASM treatment

ivory sleet
#

Ah yes

#

ofc ofc, hit them with brig like stuff

young knoll
#

It’s not toooo bad from what I’ve seen

ivory sleet
#

W

young knoll
#

It’s mostly just turning invokeVirtual into invokeInterface afaik

ivory sleet
#

ah yea, makes sense

golden turret
#

why is that happening?

#

just invalided the caches butt it is still happening

ivory sleet
#

is that valid syntax?

#

thought y’d had to to sth like
implementation(project("blh"))

#

For each one

golden turret
#

you can use multiple

ivory sleet
#

thought that meant like "group”, “artifact”, “version” lol

#

as a means to separate the different operands

#

instead of :

#

In that case

#

You got nested modules right?

golden turret
#

yes

#

but i think i found the issue

#

that dependency is compiled with java 21

#

while the project is on java 16

ivory sleet
#

Oh

#

That could be it lol

golden turret
#

but 1.20.4 is built with another version too and it works fine 🤔

ivory sleet
#

Ugh, I’m not keen with gradle anymore, but java versioning both for gradle and for the build pipeline itself can be painful

orchid brook
#

Hi i want to have multi module for nms multiple version, i have a module v1_20_R2 with this build.gradle:

    compileOnly 'org.spigotmc:spigot-api:1.20.2-R0.1-SNAPSHOT'
    compileOnly 'org.spigotmc:spigot:1.20.2:remapped-mojang'
    compileOnly 'com.github.Mojang:DataFixerUpper:e843dac1eb'
}

I just want to make sure if it's good, in case anyone knows

ivory sleet
#

looks completely fine

#

:)

young knoll
#

I don’t think you need DFU separately

#

You also don’t need spigot-api if you are using spigot

ivory sleet
orchid brook
ivory sleet
#

What do u need dfu for

young knoll
#

DFU should be already part of spigot

#

Since it’s part of the vanilla server

ivory sleet
#

And its quite rare to use it explicitly nours

orchid brook
#

Yep i will remove api and dfu so and just keep the spigot:1.20.2 remapped

ivory sleet
#

i doubt u rely on dfu classes right?

golden turret
#

but how are you going to obfuscate the spigot again when building?

young knoll
#

Hopefully they have one of the unofficially remappers :p

orchid brook
#

Do I have to use remapped?

#

I can just do that right ? :

    compileOnly 'org.spigotmc:spigot:1.20.2-R0.1-SNAPSHOT'
}

young knoll
#

No but it’s way nicer to work with

#

You can, if you want

ivory sleet
#

its highly recommended , as in (do it for ur own sanity) to use a remapper

golden turret
#

and you need to obfuscate it when building

orchid brook
young knoll
#

But I love Level.a().h().c();

golden turret
#

yes

orchid brook
#

hmm i don't know how to do that, i will use without remapped so

ivory sleet
#

rip

#

good luck then :>

golden turret
#

even though this is the spigot server, you can use the paperDevBundle, which gives you the remapped version and take care of the obfucation part

#

idk if it works with multiple versions

young knoll
#

There are gradle versions of specialsource

#

I just don’t know how well they work

orchid brook
ivory sleet
#

:,)

orchid brook
#

and someone tell me that if i use paper dev bundle, my plugin will not work on spigot server

golden turret
#

all clients i had and have use a paper based server

#

unless you use paper specific things, you wont have problems

young knoll
#

Your plugin can still run on spigot provided you don’t use any paper specific code

golden turret
#

like , if you use the adventure api which only is available in the paper server

young knoll
#

Which can get a bit annoying with NMS because who knows if the method is from paper or not

orchid brook
#

ohh i understand, paperdevbundle add more stuff, and until i don't use this, the plugin will still work on spigot ?

golden turret
#

likely

#

but i think most people uses paper based software

ivory sleet
young knoll
#

75% give or take

#

But that’s not 100%

ivory sleet
#

Yup

orchid brook
#

So, do you recommend that I use the Paper Dev Bundle?

ivory sleet
#

Well I always use it, buut as coll said, maybe there are special source gradle plugins

#

might be worth looking at

young knoll
#

There’s

#

No idea how well it works though

orchid brook
#

i will use paper dev bundle and try to not use paper stuff

torn shuttle
#

huh is yt experiencing an outage?

orchid brook
orchid brook
young knoll
#

Yes

orchid brook
#

Thx u all 🙂

river oracle
#

It works great

#

And doesn't require you to depend on legacy paper methods

orchid brook
river oracle
#

Expound because I can verify it works

young knoll
#

Okay but make a better one

#

:D

echo basalt
#

think3d Should I use packets or should I make some hardcore listeners for cosmetics

#

Think I'll go the packet route

river oracle
#

Ping him

young knoll
#

Don’t worry he already got a DM

river oracle
#

I do believe he was making good progress tho

#

He's doing it in kotlin iirc so it'll take longer since not java

orchid brook
#

@river oracle Can i pm u ?

river oracle
quaint mantle
#

Hey guys I am wondering how I can use the latest spigot version and still have access to NMS, currently my server is running 1.20.4 and i need to use this in my project. I've had trouble attempting before so I ask for help.

https://paste.md-5.net/omiwituyeq.bash (my build.gradle)

kind hatch
#

You should be able to run BuildTools for the latest version and use the local maven repos.

repositories {
    mavenLocal()
    otherMavenRepos()
    etc
}
orchid brook
shadow night
#

Because legal

orchid brook
#

thx

torn shuttle
#

you guys don't get it, I REALLY want to make sure the spectators are gone

shadow night
#

Lol

ivory sleet
torn shuttle
#

hmmm

#

you're right, I'll assign spectators to be null on top of that

ivory sleet
#

lol, sounds solid 👍

torn shuttle
#

you know what's kinda annoying, extending match types but having them be event-based

#

so when you're extending methods they might be cancelled by the super and the state needs to be checked downstream

#

someone call mr java and tell them to make this less annoying

ivory sleet
#

Yea, that’s why implementation inheritance in general is annoying

#

You get these really tight parent child class relationships

shadow night
#

Well, parents and children lol

ivory sleet
#

yea

zealous osprey
torn shuttle
#

books have a hard limit of 50 pages right? or did I dream that?

#

hm I'm reading 100 in reddit posts

shadow night
#

Weren't they increased to 100 before

upper hazel
#

I had this situation. I load config data into special objects that store data about their sections. I have 2 files and their objects depend on each other. I will not be able to upload 1 file without the data of another and also vice versa what to do?

#

the only thing that comes to mind is to create a 3 object that stores everything in string or number values

ivory sleet
#

two objects have references to each other?

upper hazel
#

almost

#

more precisely, the files have unique ids and 2 files use each other’s id, but in order to use them you need to collect the object of these files, but in order to collect the object you need to get the Id of another object that has not yet been collected

ivory sleet
#

well one thing to consider is to make your concrete classes depend on interfaces (possible abstract classes) instead

another concept is ownership, that is that one of them owns the other, essentially making one of the classes responsible for referencing each other

the ugly way to do it is obviously lately use a setter to get the job done

upper hazel
#

i think i will use 2 option

ivory sleet
#

yeah, then its likely to see similar semantics to
new Other(this)
in one of ur classes

upper hazel
#

As I understand it, this happens to everyone when they try to use objects that do not exist at compile time but only at process time

umbral ridge
ivory sleet
#

Data fixer upper

#

Its a mojang lib that uses mathematical concepts to conveniently express transformations between data format versions sorta

#

like merging different data transformations, or optimizing them, or incrementally building them etc

ivory sleet
#

tho I wouldn’t worry too much about that

ivory sleet
#

yup

#

Well, its kinda neat but somewhat overly mathematical

ivory sleet
#

🥲

buoyant viper
rough drift
quaint mantle
#

how to set noclipstate for falling blocks

lost matrix
quaint mantle
#

no

#

in 1.16.5 nms you could set a entity to have no clipstate

#

so it can go through ground

#

but now i cant seem to find it

#

the falling block just falls and sets on ground but i want it to go thru the ground

lost matrix
#

Def need nms for that. Let me check if i can find something.

quaint mantle
#

alright

#

just so you know my server version is 1.19.4

lost matrix
quaint mantle
#

ugh

sullen canyon
#

yo is anyone online who could help me figure out some things regarding building the architecture of my project? Working of a minigame network at moment and have questions how to improve what I've got so far and what practices I might use

In case you have some spare time to help me im in the voice chat

icy beacon
#

?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!

sullen canyon
icy beacon
#

Gotcha, np

quaint mantle
tender shard
#

Wouldnt it be easier to use a BlockDisplay and let it fall manually?

quaint mantle
#

let me look into blockdisplay

#

i have never used or seen them

quaint mantle
quaint mantle
#

thanks

#

can i just ask 1 more help

#

it becomes dark like this

#

bro got sunburned

tender shard
quaint mantle
#

o alr

quaint mantle
#

int blockLight, int skyLight whats skylight

#

oh ok the second one

tender shard
#

idk I have only set block light to 15 and it worked

inner mulch
#

Does somebody know what the Bukkit.getOfflinePlayer method does internally? Is it expensive?

tender shard
#

which one? String or UUID?

fallow gyro
#

Under https://www.spigotmc.org/wiki/the-chat-component-api/#events, the code:
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Visit the Spigot website!").create()));

Is listed as the method for setting hover text of a text component. When I use this code in my IDE however, it seems to be saying that the method is depreciated. What would be the newer way of implementing some hover text for a text component?

Thanks.

fallow gyro
drowsy helm
#

And the imported api on your ide is spigot?

inner mulch
fallow gyro
drowsy helm
#

Is it the setHoverEvent method thats deprecated

#

Or the hoverevent constructor

fallow gyro
#

I'm not sure if maybe that method has been depreciated, but the wiki page is outdated

#

Let me double check, hold on

tender shard
# inner mulch Both

the UUID one shouldn't be a problem - the String one checks the cached player data and makes a web request to get the UUID if not found locally

fallow gyro
#

Yes, it seems like it is. It seems that I'm able to pass three different data types into the method, so I'm fairly certain it's only the data type that ComponentBuilder().create() is returning.

'HoverEvent(net.md_5.bungee.api.chat.HoverEvent.Action, net.md_5.bungee.api.chat.BaseComponent[])' is deprecated

tender shard
quaint mantle
tender shard
#
new HoverEent(action, new Text(myBaseComponentArray));
fallow gyro
# tender shard

Sorry, would you mind linking that for me? I can't seem to find HoverEvent in the spigot docs, so I'm guessing it's somewhere else?

tender shard
fallow gyro
#

Also, would I be able to edit the wiki page for this method, or should I request that someone else does that for me? Thanks

tender shard
#

If you see the Edit button on the page, you can edit it

fallow gyro
#

Oh never mind, I was logged out for some reason. Thanks for the help! I'll edit the page now.

icy beacon
#

Is there anything in this code that could cause an unhealthy amount of connections? I have just experienced a "too many connections" error after having ran the api for 24 hours
https://paste.md-5.net/erecepuwoz.cpp

eternal night
#

if only there were connection pools

#

like hikaricp

icy beacon
#

Yeah I know those exist but I never took the time to actually try to understand how to use them

quaint mantle
#

so is there any other way to make falling blocks

icy beacon
fallow gyro
#

To be honest, you don't really need to worry too much about how it works under the hood at all once it's set up

icy beacon
icy beacon
#

Admittedly, this does feel much cleaner, especially the block in query that I added

short raptor
#

What's the method to do coloured dust nowadays? I can't find any recent thread

#

I've gotten here

                attacker.getWorld().spawnParticle(Particle.DUST_COLOR_TRANSITION, attacker.getLocation().add(0, 1, 0), 100, 5, 1, 5, data);

``` I'm not sure what data to put
orchid brook
#
public int countBlockInChunk(Chunk chunk) {
    LevelChunk nmsChunk = (LevelChunk) ((CraftChunk) chunk).getHandle(ChunkStatus.FULL);
    LevelChunkSection[] chunkSections = nmsChunk.getSections();
    int count = 0;
  
    for (LevelChunkSection chunkSection : chunkSections) {
        if (chunkSection != null) {
            PalettedContainer<BlockState> allState = chunkSection.getStates();

            for (int i = 0; i < allState.getSerializedSize(); i++) {
                BlockState blockState = allState.get(i);

                // Check if the block state is not AIR
                if (blockState != Blocks.AIR.defaultBlockState()) {
                    count++;
                }
            }
        }
    }
    return count;
}

Hi back I'm exploring ways to optimize a block counting function in a chunk, and I'm seeking advice on potential improvements for better efficiency. The current function iterates through chunk sections, accesses a PalettedContainer to obtain block states, and counts non-air blocks.

The goal is to make this function as fast as possible. If you have any alternative approaches, optimizations, or best practices for counting blocks within a chunk, I would greatly appreciate your insights

minor junco
#

This doesn't really answer your question, but It might be more efficient to iterate using simple for x,y,z loops than creating unnecessary memory overhead to iterate through sections, unless you do it asynchronously

#

Since the size is known, you could also cut the iteration in half

orchid brook
#

But what do u mean by cut iteration in half ?

minor junco
#

Instead of iterating 16x16 you can iterate 8x8 and subtract from the 16th block. So you essentially do your air check twice in the most inner for loop

#

But if that really gives you any boost, only god knows

orchid brook
#

But I understood that using blockpalette was faster than iterate over all block someone explained this to me a little while ago

minor junco
#

It might be, I don't know the underlying specifics of get block anymlre

#

U might want to have a look in Bukkit's source

tender shard
#

anyone know how to disable a specific check in gradle's ktlint plugin?

tardy delta
icy beacon
#

Truee

#

One sec

tardy delta
#

and you could replace .use { rs -> block(rs) } with .use(block) if you really wanted

tender shard
# eternal night ?

doesnt that require me to declare all the rules I want to use in a file?

#

I want to use the default settings and only disable one specific check

icy beacon
#

Or maybe there's a default file somewhere

tardy delta
icy beacon
tender shard
rare rover
eternal night
#

See the rest of their wiki 😅

tender shard
#

I don't see any wiki? there's only a readme

#

and the readme doesnt mention anything about .editorconfig except that using an "additional one" is "not supported"

eternal night
#

your wiki abilities are as impressive as ever kekwhyper

tender shard
#

yeah well where is it?

eternal night
tender shard
#

oh I only checked the gradle plugin on github, not that one

upper hazel
#

what happens if 3 different codes work in 1 event one after another?

#

like code process 1 -> code procees 2 -> code process 3 -> end event

young knoll
#

then... they run in that order?

#

I don't understand the question

upper hazel
#

in the event there will be 3 methods working with it, which method will work and which will not, will this cause errors?

eternal night
#

all work

rough drift
#

no

#

they'll run in sequence

upper hazel
#

then what the effect will be

eternal night
#

depends on the code ? xD

#

"what is the effect of three different pieces of random code running after one another"

upper hazel
#

Will the effect of method 3 cancel out the effect of method 2?

eternal night
#

depends on method 2 ??

#

if method 2 sends a message to all players

#

but method 3 doesn't

#

that doesn't magically not send the message

young knoll
#

The state of the event at the end is what matters

eternal night
#

if method 1 mutates the event instance but method 2 mutates it again

#

them methods 2 mutation to (e.g.) cancelled state will take "priority" because well

#

its run after

upper hazel
#

let's say method 1 makes a broken block air and cancels it after method 2 drops the block via dropNaturally

eternal night
#

you can literally just think of it as the code of the two joined

#

with methods 2 code running directly after method 1

upper hazel
#

so 2 method cancel 1 method?

#

and drop block?

rough drift
#

okay so

#

if method 1 cancels it

#

and method 2 uncancels it

#

the event will not be cancelled

#

if method 1 cancels it

#

and method 2 does some other stuff

#

the event will be cancelled and method 2 will still run

upper hazel
#

so that means the subsequent effect of the code can cancel the previous one, as I understand it

rough drift
#

it can't cancel code that's already run

#

i.e.

lean pumice
#

in legacy version wath is the oak planks?

ivory sleet
#

its like you put your stuffed teddy bear into the trash bin, then your mom comes and take it out from the trash bin which basically undoes whatever you did thus ur mom has a higher priority in what course of action was operated

rough drift
#

if you send a message in method1, method2 can't stop that

#

i.e. only reversible actions can be reversed

#

like setting a method as cancelled

upper hazel
upper hazel
#

block.setType to air -> block.dropNaturally idk

rough drift
#

i.e. method2 will still be able to drop the BlockState, but the actual block will be AIR

upper hazel
#

oh ok

icy beacon
tender shard
#

is ItemMeta#getAsString() supposed to be valid SNBT?

ivory sleet
#

yea

#

i believe so

tender shard
#

hmmm

#

WTF

#

when was all of this added?!

#

I never knew bamboo planks were a thing?!

river oracle
worldly ingot
#

You can pass it as an NBT suffix for items in a /give command

quiet ice
young knoll
#

Choco said he was going to use all his free time to give us an SNBT abstraction API

quiet ice
#

Using the hypickel money?

river oracle
worldly ingot
river oracle
#

Where would we be without you

undone moon
#

Does this event exist? player receives message

river oracle
worldly ingot
#

Yeah that's just the chat event. You can check the recipients list

river oracle
#

Or actually maybe could use CommandPreProcessEvent

undone moon
#

how to use

river oracle
#

?jd-s

undone axleBOT
worldly ingot
#

Well, what do you mean with "receives message"

#

What kind of message? A private message via /w? Or a chat message?

river oracle
young knoll
#

Does this mean I have to do the SNBT abstraction API

ivory sleet
#

yes

#

:D

tender shard
# worldly ingot It's SNBT, yes

thx, yeah I thought it was bugged because somehow it weirdly escaped the item name with additional quotes but turned out it was just me printing it wrong kek

shadow night
#

can I somehow keep comments and javadoc when I compile my jar so whenever I lose the source I still understand wtf is going on

#

or even better, put the sources into the same jar

worldly ingot
#

No, both get stripped at compile time because they're not necessary in bytecode

#

You can compile a sources and javadocs jar, though I don't imagine the latter will be particularly useful

shadow night
#

I constantly lose the source code of some small plugins I make and then when I need to change a little thing I gotta decompile

worldly ingot
#

👀 git, my friend

#

Even if it's a small plugin, a private repo would be fine

shadow night
#

hmm

#

right

#

but I'm so lazy lol

tender shard
#

it takes like 30 seconds to upload it to github 🥲

shadow night
#

but I gotta make a repo and shit

#

and then I'll have to commit constantly

worldly ingot
#

I mean your alternative is to compile and save a sources jar each time you make a change as well

#

Arguably more annoying

shadow night
#

oh I know

#

I'll write a gradle script that'll just put my source code into the jar lol

#

jk

#

I'll go with github

quaint mantle
#

Particles are thread safe right

rough drift
#

yes

river oracle
umbral ridge
#

what is that

#

cant run my local server

#

I built the latest jar with buildtools

young knoll
#

What is the jar size

#

Seems some things are missing

chrome beacon
#

also which jar did you use from BuildTools

river oracle
#

You should just use the jar it puts in the directory you ran bt in

umbral ridge
#

spigot-1.20.4-R0.1-SNAPSHOT

#

it's about 17 MB

#

also what is original-spigot

shadow night
#

A good spigot jar is 50-60mb

wet breach
#

bootstrap jar is the one you want

#

?bootstrap

undone axleBOT
#

Bootstrap Jar
The main spigot-1.18.jar is now a bootstrap jar which contains all libraries. You cannot directly depend on this jar. You should depend on Spigot/Spigot-API/target/spigot-api-1.18-R0.1-SNAPSHOT-shaded.jar, or the entire contents of the bundler directory from your server, or use a dependency manager such as Maven or Gradle to handle this automatically.

Please read the release notes for further information: https://www.spigotmc.org/threads/9-years-of-spigotmc-spigot-bungeecord-1-18-1-18-1-release.534760/#post-4305163

chrome beacon
#

Use the one generated in the folder where BuildTools was ran

ivory sleet
#

@inner mulch

chrome beacon
#

don't open any of the sub folders

wet breach
#

which is the bootstrap jar

umbral ridge
#

what are jar files in folders then?

#

what are they for

#

there's like 4 or 5

chrome beacon
#

Those are jars from different steps of the build process

umbral ridge
#

ah

wet breach
#

spigot first applies patches to bukkit and craftbukkit, and then builds those. It then clones those repos and turns them into spigot-server and spigot-api. does more patching, then builds them. Here is where the final jar is produced, it is then copied to the root directory and renamed.

#

so you can if you wanted pull the jar from the build directory that is the right one and use that

umbral ridge
#

thanks frostalf

river oracle
#

you can send packets asynchronously

quaint mantle
#

Nah just wondering if that will be my reaction

river oracle
#

oh yeah it will be

#

you'll be wowed

tardy delta
#

whats going on in call btw?

#

didnt even know this server had voice channels

quiet ice
#

oh, the voice channels are frequently used. I never looked into them so I cannot tell what is going on

icy beacon
#

What do we call a spigot developer gathering

#

Like, a bunch of crows is called a murder for exapmle

tender shard
#

different people all dealing with a spigot? A plumbing company I'd say

icy beacon
#

That's a good one

tender shard
#

I'm praying that this is working - multi-word arguments

tardy delta
#

looks like some live coding

ivory sleet
#

Yea usually live coding/coaching

young knoll
#

Nerd Herd

tardy delta
#

do something crazy and start streaming kotlin

young knoll
#

Insane

eternal night
#

suicidal to some degree

proud badge
#

YES they updated holographicdisplays to 1.20.4, I dont have to recode any of my plugins which use its api

ivory sleet
#

A fix

#

To it

young knoll
#

A fix to you being nerds?

ivory sleet
#

yeaa

#

Repair us coll

#

we need it

young knoll
#

🤔

ivory sleet
tender shard
# tardy delta do something crazy and start streaming kotlin

look at my fancy /tp command

class BasicsTpModule(context: ModuleInstantiationContext) : AbstractBasicsModule(context) {
    private val permission = permissionManager.createSimplePermission("basics.tp", "Allows teleporting")
    override fun onEnable() {
        commandFactory.parsedCommandBuilder("tp", permission).mapContext {
            usage = "<x y z>"
            path {
                playerOnly()
                arguments {
                    named("coords", XYZCoordsArg("Target Coordinates"))
                }
            }
            executor(TeleportCommand(this@BasicsTpModule))
        }.register()
    }
}

class TeleportCommand(module: BasicsTpModule) : CommandContextExecutor<MapContext> {
    override fun execute(sender: CommandSender, context: MapContext) {
        val player = context.getOrDefault("player", sender) as Player
        val coords = context["coords"] as XYZCoords
        val location = coords.toLocation(player.world)
        player.teleport(location)
    }
}
solemn meteor
#

Is there a way to differentiate between a code made inventory and a renamed chest? Itll be thru an event as well, is there a smart way of doing it

young knoll
#

?gui

eternal night
#

usually to i-

#

lets see

solemn meteor
#

yep

eternal night
#

NODDERS good smile post

solemn meteor
#

Ill report back if I'm dumb as fuck and can't fix it

ivory sleet
eternal night
#

no xD

slender elbow
#

||not on spigot||

eternal night
ivory sleet
dry hazel
#

💥

quaint mantle
#

is there any way to teleport vehicle without unseating the player?

#

oh i could just tp the player

tender shard
#

parsedCommandBuilder returns a ParsedCommandBuilderFactory
mapContext returns a MapContextParsedCommandBuilder
path is a MapArgumentPathBuilder
arguments is an ArgumentBuilder
🥲

tardy delta
#

ah makes sense

#

would you mind if i do some cleanup on the basics repo?

tender shard
#

go ahead

floral drum
#

I don't like kotlin :(

#

if basics wasn't kotlin I'd contribute >:)

tender shard
#

you can write modules in java

#

run gradlew createModule, then enter java, then the module-name, and then you have a template for java

floral drum
#

oh sick okay

#

I would have thought it would be weird to have both kotlin and java in the basics thing

tender shard
#

I'm not sure how well the kotlin-java interop works though, e.g. registering commands using the ParsedCommandBuilder will probably be a bit nasty lol. But unparsed commands should definitely work fine

floral drum
#

ah right

tardy delta
#

praise alex for writing the kotlin code java compatible

tender shard
floral drum
tardy delta
#

no

#

oh god

floral drum
#

wtf

remote swallow
#

alex

ivory sleet
remote swallow
#

what the fruck

remote swallow
#

blames on top

ivory sleet
#

alex

#

git blame on u