#help-development

1 messages · Page 763 of 1

devout tartan
#

you're right

hushed spindle
#

you can just do sendMessage on console sender

wet breach
#

but it will clutter your logs afterwards if you go the route of adding color yourself

rotund ravine
devout tartan
#

Does info not color?

hushed spindle
#

i mean you're not using the console as its intended to be used

#

what do you want to do

wet breach
#

no, but warn does if I recall

#

warn should be yellow, severe is red

devout tartan
#

maybe make some ascii art

hushed spindle
#

debug? just use a regular ol logger then

#

dont go using a bunch of fancy colors

devout tartan
#

I want it visible :p

rotund ravine
#

I know some people who will refuse to use your plugin ahaha

#

They don’t want a rainbow in their console

hushed spindle
#

and if you're gonna make ascii art you should allow the plugin user to disable it

#

ascii in logs is just unnecessary clutter

devout tartan
#

Let me just have fun 😭

rotund ravine
#

Denied

hushed spindle
#

no fun allowed

#

and its just advice honestly

rotund ravine
#

Programming is the art of inching close to depression

hushed spindle
#

if you wanna make your console gay by all means go ahead

upper hazel
#

how to get rid of containsAll

hushed spindle
#

wdym

rotund ravine
#

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

eternal oxide
#

Close your eyes when your IDE suggests ContainsAll?!

rotund ravine
#

It’s been a while since I’ve seen people abusing containsAll, i must have been inactive

upper hazel
#

I used containsAll because I'm confused about multivariate checks.

storm crystal
#

How do I use them

lost matrix
rotund ravine
upper hazel
#

what?

wooden hearth
#

Hey what's the best way to parse something like this 2d10m30s into mills

rotund ravine
eternal oxide
#

Screenshots are a nightmare, unless large. I have to click, then open in browser to view

upper hazel
#

a wait not this

rotund ravine
#

Did you not listen?

upper hazel
#

oh ok

#

?paste

undone axleBOT
rotund ravine
#

Thank you

upper hazel
eternal oxide
#

screenshots for syntax/errors. Else codeblocks or paste

wooden hearth
# rotund ravine Google it.

What's the point of having this channel if youre always saying google it, don't you think I have googled it!

upper hazel
eternal oxide
#

your ContainsAll will only be true if ALL of those ProtectedRegions exist

spare hazel
#

If you are using worldguard, then there is a built in feature for that

upper hazel
#

yes

#

this how it shold be

#

oh wait

#

no

#

not

#

bruhh...

rotund ravine
#

This channel is not a google it for you. We’re here to assist, so when we see something that has been asked often enough that a proper google search should show it. Why would we bother spending time explaining it. Obviously some of still do, I am just lazy.

#

Now

#

If you had shown a proper attempt at coverting the string into milis together with code

#

Helping you with modifying your code to work

#

Is 💪🏻💪🏻

hushed spindle
rotund ravine
hushed spindle
#

how so?

rotund ravine
#

It’s more about what and how it does things.

#

What do you think it does?

hushed spindle
#

i would assume it tries to map every value in collection 1 to every value in collection 2

#

false if failed true if yes

lost matrix
# storm crystal 1x1x2
  public Collection<Entity> getFrontEntities(Player player) {
    double distance = 0.55;
    double width = 1.0;
    double height = 2.0;
    Vector viewDirection = player.getEyeLocation().getDirection();
    Location base = player.getLocation().add(viewDirection.multiply(distance));
    Vector lowerCorner = base.toVector().subtract(new Vector(width / 2, 0, width / 2));
    Vector upperCorner = base.toVector().add(new Vector(width / 2, height, width / 2));
    BoundingBox boundingBox = BoundingBox.of(lowerCorner, upperCorner);
    World world = player.getWorld();
    Predicate<Entity> filter = entity -> !player.equals(entity);
    return world.getNearbyEntities(boundingBox, filter);
  }

or

  public Collection<Entity> getFrontEntities(Player player) {
    double distance = 0.5;
    double width = 1.0;
    double height = 2.0;
    Vector viewDirection = player.getEyeLocation().getDirection();
    Location base = player.getLocation().add(viewDirection.multiply(distance)).add(0, height / 2, 0);
    World world = player.getWorld();
    Predicate<Entity> filter = entity -> !player.equals(entity);
    return world.getNearbyEntities(base, width / 2, height / 2, width / 2, filter);
  }

Both work the same way

rotund ravine
#

The String#containsAll is different

hushed spindle
#

oh we're talking about string containsall

#

gotcha

rotund ravine
#

Wait i am dumb

#

It’s called replaceAll and not containsAll

#

Ahahaha

hushed spindle
#

yeah i was thinking like wait what does containsall do again for strings

#

lmao

rotund ravine
#

Thank god they didn’t make two

lost matrix
rotund ravine
#

Depending on the length of your time nominators you might also wanna collect letters until you hit a numeral again.

#

For example if Minutes = mi and month = m

lost matrix
#

Myeah usually you do M for months and m for minutes.
But if you want to support months and minutes for example, then you should probably also parse consecutive letters.

rotund ravine
#

I’ve been so used to passing letters as lowercase cause idiots will type M with big when they meant m so many times ahaha. But yeah that’s a nice idea

storm crystal
#

Giving me ready code wont teach me much

rotund ravine
#

Math teacher smile incoming

lost matrix
# storm crystal I asked how they work

Alright. So a BoundingBox is an Axis aligned Box with corners.
World#getNearbyEntities(BoundingBox, Predicate<Entity>) returns all Entities in that Box, using the Predicate as filter.
The rest is just basic math and java.

lost matrix
rotund ravine
#

Ohh ur not gonna teach him math?

#

Oh well

lost matrix
#

I dont know how to teach vectors through text and im not in the mood to draw right now. Gonna get my coffee first.

rotund ravine
#

I got the perfect idea sec

wet breach
#

teaching via text for vectors requires that the other has some math experience relating to such things XD

#

otherwise its a pain

rotund ravine
#

Ah didn’t pan out

wet breach
#

ah yes show them all the vectors

quaint mantle
#

hi

#

i need help

#

even though the player is checked, I write that he is not

rotund ravine
#

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

quaint mantle
rotund ravine
#

Thanks

storm crystal
wet breach
rotund ravine
#

Where is the issue @quaint mantle i don’t understand that language

quaint mantle
#

most likely the player does not add ed to the list because the command cannot read it

#

and the code is in paper and in Polish

rotund ravine
#

?paste

undone axleBOT
lost matrix
# storm crystal What is axis aligned box and predicate filter
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
}

Its just a standard interface from java.
In goes something T, out comes boolean.
It is a so called Functional Interface. They can be used for lambdas.
So

Predicate<Entity> filter = entity -> !entity.equals(player);

Is just short for

    Predicate<Entity> filter = new Predicate<Entity>() {
      @Override
      public boolean test(Entity entity) {
        if(entity.equals(player)) {
          return false;
        } else {
          return true;
        }
      }
    };
quaint mantle
lost matrix
# storm crystal What is axis aligned box and predicate filter

The filter is called for every detected entity.
Honestly you can also just leave the filter away and manually remove the player from the resulting collection.

  public Collection<Entity> getFrontEntities(Player player) {
    double distance = 0.5;
    double width = 1.0;
    double height = 2.0;
    Vector viewDirection = player.getEyeLocation().getDirection();
    Location base = player.getLocation().add(viewDirection.multiply(distance)).add(0, height / 2, 0);
    World world = player.getWorld();
    Collection<Entity> found = world.getNearbyEntities(base, width / 2, height / 2, width / 2);
    found.remove(player);
    return found;
  }

Thats a bit more understandable than the filter

lost matrix
rotund ravine
quaint mantle
#
version: '${project.version}'
main: pl.playgroundhc.survival.Survival
api-version: 1.17
commands:
  kit:
  sprawdz:
  czysty:
  cheaty:
storm crystal
#

Does it have to be that complicated

rotund ravine
#

Why do you have two commands on the same executor @quaint mantle

rotund ravine
quaint mantle
#

becouse i use the same array list

rotund ravine
undone axleBOT
quaint mantle
#

becouse i don't know how to implement mysql to java

lost matrix
rotund ravine
#

Look at the link above

quaint mantle
rotund ravine
#

You might want to, but you do not need to.

storm crystal
quaint mantle
rotund ravine
#

I do not.

storm crystal
quaint mantle
#

yes

lost matrix
lofty badge
#

guys, who can make simple pixel art graphics?

lost matrix
#

I can in theory. What dimensions and how complicated?

rotund ravine
#

?services

undone axleBOT
lofty badge
storm crystal
#

How customizable are banners with plugins?

rotund ravine
#

‘Ish

storm crystal
#

As in, any ingame combination or any pixel combination?

rotund ravine
#

Atleast any ingame combination. But i’ve seen plugins be creative before, maybe you can mess with banners. Though a map is much easier and higher res

mortal hare
#

and that's why i hate eclipse

#

it doesnt even recognize kotlin lmao

twilit patrol
#

I am looking for experienced developers for a big project. We already got all vps and some developers, if you want to join the development team, dm me.

normal fox
mortal hare
#

i hate eclipse

#

but because of this slow pc im forced to use it

undone axleBOT
quiet ice
devout tartan
#

Does anyone know how to make a submodule in gradle?

#

I can do it by hand, but that seems painful

chrome beacon
#

Intellij should have a button for that

chrome beacon
#

💀 kotlin

devout tartan
#

Sorry, should've specified that I want this for Kotlin 😄

dry hazel
#

just make a folder for your submodule with your build file and include it in the settings file (include(":submodule-name"))

devout tartan
#

that's what I did, but then I have to make the directory structure of
src
main
kotlin
resource
test
....
which is what I was trying to avoid

rotund ravine
#

Make a github template and just clone a lot easy easy

dry hazel
#

intellij autocompletes these paths in the directory creation dialog when you include the submodule

devout tartan
dry hazel
#

should work even without, is your submodule directory highlighted in ij?

devout tartan
#

(waiting for indexing to finish, and sending a screenshot)

dry hazel
devout tartan
#

ah, can't send images here..

dry hazel
#

yeah you need to be verified

chrome beacon
#

?img

undone axleBOT
#

Can't send images? That's because you're not verified! Use !verify to complete verification.
Alternatively, you can upload screenshots to any image hosting site and share the link.

Here's some screenshot utilities that can use to upload images.
Lightshot: https://prnt.sc
Imgur: https://imgur.com/upload
Flameshot: https://flameshot.org

devout tartan
dry hazel
#

yes

devout tartan
#

My module gets highlighed after that, and that's it

#

It doesn't get populated, unless you're doing something i'm not 🤔

dry hazel
#

worth to note that you probably need the java plugin applied to create the source sets

devout tartan
#

SkillSprint is the module i just made, but it's empty

dry hazel
#

yeah so just make a new build file in the submodule and apply the java plugin

#

plugins { java }

#

when you include stuff like that, no configuration from the root project is included unless you put it into a allprojects/subprojects block, so you have to configure everything

devout tartan
rough pumice
#

hey, im currently cancelling a BlockBreakEvent and then giving the player the drops from the block. this is the part of my code that handles the drops

                    // Get the drops
                    Block block = e.getBlock();
                    block.getDrops(e.getPlayer().getActiveItem()).forEach(itemStack -> {
                        Bukkit.getScheduler().runTaskLaterAsynchronously(breakManager.getMineManager().getPlugin(), () -> {
                            e.getPlayer().getInventory().addItem(itemStack);
                        }, 1L);
                    });

It seems to be working perfectly fine with something like red wool, but with a diamond and a diamond pickaxe it wont give me any drops in my inventory. If anyone could help it would be greatly appreciated

dry hazel
#

not aware of any tools that do that though

devout tartan
#

fair enough

devout tartan
lost matrix
devout tartan
#

so instead of writing my own tools, i would rather use built in

#

nothing wrong with writing your own, of course :p

dry hazel
#

what does it show when you open the new directory dialog?

devout tartan
#

everything

#

you are a legend

dry hazel
#

lol

devout tartan
#

god

#

thank you

rough pumice
devout tartan
#

Now the question is, do I care about this directory structure, and can I just dump files into the module root directory? I really like that I don't have to mess around with manifest files, and that things in resource directory get included in the jar by default 😄

dry hazel
#

you can have anything in the submodule root, only the src directory is what matters to gradle

devout tartan
dry hazel
#

by the way, you can move common logic (plugin applying, stdlib dependency, repositories, ...) into a build script in the project root and have it be applied to all submodules automatically (i.e. you can remove it from the submodule buildscripts)

plugins {
    kotlin("jvm") version "..." apply false
    java
}

subprojects {
    apply {
        plugin("java")
        plugin("org.jetbrains.kotlin.jvm")
    }

    repositories {
        mavenCentral()
    }

    // ...
}
devout tartan
#

i did not know that...

dry hazel
#

it works the way you have it, this is just if you wanted to reduce duplication in the scripts

devout tartan
#

I do!

devout tartan
dry hazel
#

yes

lost matrix
# rough pumice I've tried passing in the player, although it still didn't fix the issue. I have...

This works perfectly fine for me:

  @Override
  public void onEnable() {
    Bukkit.getPluginManager().registerEvents(this, this);
  }

  @EventHandler
  public void onBreak(BlockBreakEvent event) {
    Block block = event.getBlock();
    Player player = event.getPlayer();
    PlayerInventory inventory = player.getInventory();
    ItemStack item = inventory.getItemInMainHand();
    ItemStack[] drops = block.getDrops(item, player).toArray(ItemStack[]::new);
    Bukkit.getScheduler().runTask(this, () -> {
      inventory.addItem(drops).values().forEach(overflow -> {
        player.getWorld().dropItemNaturally(player.getLocation(), overflow);
      });
    });
    event.setDropItems(false);
  }
devout tartan
# dry hazel yes

and remove build.gradle.kts from submodules, or just cut them down?

dry hazel
#

yes

devout tartan
#

god

lost matrix
#

Multi module project with gradle smileybolb

#

Its always like that i feel

rough pumice
devout tartan
#

I need to commit first, then i'm trying this 😄

lost matrix
devout tartan
lost matrix
#

Which one?

#

CMake?

devout tartan
#

Exactly

lost matrix
#

Everything is better than that

rough pumice
devout tartan
#

Exactly, to "which one"

#

the only build system with c++ i use is Make

dry hazel
#

I mean, gradle can also build c(++) projects with its wip plugin

devout tartan
#

I like consistency

#

you're compiling Kotlin, and the build system is written in Kotlin is fine

devout tartan
dry hazel
#

you need to have it in the subprojects block

devout tartan
#

the clean task?

#

I just want the build folder to go wooosh

dry hazel
#

the common logic

devout tartan
#

🤔

#

ah

#

hm, i'm surprised this worked

dry hazel
#

you can copypaste my example, it should work

devout tartan
#

hm, the plugin applying part didn't work, but is there anything wrong with my example?

#

(clean now works, for some odd reason)

upper hazel
#

How can you check if a player flies on elytra?

dry hazel
#

like in my example

devout tartan
# dry hazel like in my example

this is what i have:

plugins {
    kotlin("jvm") version "1.7.10" apply false
    `java-library`
}

subprojects {
    apply {
        kotlin("jvm") version "1.7.10"
        `java-library`
    }

    repositories {
        mavenCentral()
        maven("https://repo.papermc.io/repository/maven-public/")
    }

    dependencies {
        compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT")
    }
}
dry hazel
#

that apply block needs to be just like in my example; you declare the plugins on the top and just apply them via their id in the apply block

devout tartan
#

you're right once again

#

it all works flawlessly...

#

thank you!!!!

dry hazel
#

no problem

devout tartan
#

In programming

dry hazel
#

hobby since 2017 I think

devout tartan
#

Do you do it professionally?

dry hazel
#

no, still a student

devout tartan
#

Any fun topics of interest?

#

(in programming)

dry hazel
#

the jvm

#

xd

deft thistle
#

I am aware this is not the paperspigot discord server, but is there a easy way of connecting a player to another server in a velocity network? Just like in bungee

worldly ingot
#

Velocity supports the BungeeCord plugin channel, so the exact same way

devout tartan
dry hazel
#

probably kotlin

devout tartan
#

Mine is Rust, but making plugins for Minecraft in kotlin is very fun

near mason
deft thistle
#

its so god damn inconsistent

#

🤮

dry hazel
devout tartan
devout tartan
dry hazel
#

when people talk about rust alternatives, it's usually golang

#

or vice-versa

devout tartan
#

Haven't tried GO, but I heard it also has nice tooling

#

By the way, do you know purpose of group and version fields ?

group = "net.myname"
version = "1.0-SNAPSHOT"
#

I noticed that the jar file will have the version in it's name when I build it

dry hazel
#

it's for publishing to maven repos

devout tartan
#

Cheers

#

Any more tips and tricks you're willing to share with me? 😄

dry hazel
#

your project looks fine right now

worldly ingot
storm crystal
#

What is maven and what does it do to plugin

scenic onyx
#

how i can get if player al lokking hitbox of another player?

worldly ingot
#

Gradle is also a build system that accomplishes the same but using a different build file structure

storm crystal
#

Whats dependencies

devout tartan
#

it still produces sinlge Jar files per module in the module build subdirectory

dry hazel
#

it should build them separately

#

wdym that it bundles all of them into a single jar?

devout tartan
#

the root project is called Heroes, i'm guessing HeroesPlugin and SkillSprint get bundled into Heroes.jar

dry hazel
#

if you run the clean task, does that root build folder disappear?

#

wait, never mind, you just need to not apply the java-library plugin at the root: id("java-library") apply false

devout tartan
devout tartan
#

I can't apply false on java-library

#

> Plugin 'org.gradle.java-library' is a core Gradle plugin, which is already on the classpath. Requesting it with the 'apply false' option is a no-op.

dry hazel
#

O_o

#

yeah you probably don't need it at all on the root

#

so just remove that line

#

(also put that version property into an allprojects block so it's applied to everything)

lost matrix
devout tartan
dry hazel
#

show me what you got in the root build file now

ivory sleet
#

Ye

devout tartan
#

hm

ivory sleet
#

You need to apply at least the java to plugin to it

#

else dependencyresolverhandler or whatever its called isnt bundled w said module

devout tartan
#
allprojects {
    version = "1.0-SNAPSHOT"
}

plugins {
    kotlin("jvm") version "1.7.10" apply false
}

subprojects {
    apply {
        plugin("java-library")
        plugin("org.jetbrains.kotlin.jvm")
    }

    repositories {
        mavenCentral()
        maven("https://repo.papermc.io/repository/maven-public/")
    }

    dependencies {
        compileOnly("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT")
    }
}
#

If i put java in plugins, it will be bundled into a single lib

#

(god i need to learn what those plugins are)

#

if it's not painfully obvious, this is my second day with gradle

dry hazel
#

I ignore the root project build myself 😂

ivory sleet
#

I mean

devout tartan
#

i mean, i guess i can consume those by just specifying the artifacts in the submmodules

ivory sleet
#

One way is to just fkn yeet the compileOnly dependency in the root module

devout tartan
#

(that's how my build is consuming them)

#

and just ignore the root project build

ivory sleet
#

Does your rootproject have actual code?

devout tartan
#

no

dry hazel
devout tartan
#

Root project just has submodules

ivory sleet
#

Then why do u have a compileOnly dependency there lmao

dry hazel
#

applied to the submodules

ivory sleet
#

yeah then no need for java nor javalibrary plugin

#

Oh I see

#

Yeah looks to be fine then?

devout tartan
dry hazel
#

it is

ivory sleet
#

Yeah it should

dry hazel
#

you can just ignore the build/libs output of the root project, it's not gonna have an impact on anything

devout tartan
#

yeah, that's what i'm leaning towards too

#

I don't want to get stuck in this, but i do like when things are clean and tidy 😄

ivory sleet
#

well the root module ought only to build if you call the task for it

#

I mean one otherway is to override the rootprojets build task and nullify it

devout tartan
#

anyways

dry hazel
#

yeah that calls all of the build tasks, root project and submodules

ivory sleet
#

You can make it so that gradle thinks build or w/e subtask like compileJava or sth already thinks it was built so it won’t build (goofy hackaround but yeah)

dry hazel
#

yeah

ivory sleet
#

just saw it now :,)

smoky oak
#

can someone help me with github? It's not spigot related but its really annoying

#

i have a software that i wanted a certain gltich to occur in the save file, and now i have two branches. How can i essentially completely overwrite all files that are different between them?

lost matrix
#

git stash | git reset --hard | git fetch | git pull

lost matrix
ivory sleet
#

If they change the exact same line into different things then you need to resolve the conflict between the 2 branches before you can merge or rebase

smoky oak
#

its binary files

#

essentially, i want all binary files different between the branches to be changed to the test files

#

merging would corrupt them

#

like i have main and test as branches

#

i want to make main equal to the test branch

lost matrix
#

Then... just set your test branch as the main branch and discard/rename the old main branch

smoky oak
#

oh that worked thanks

lost matrix
#

If you are on the local test branch then you can push on your master branch like this btw
git push origin +test:master

#

Wait "master" is no longer PC, right? -.-

#

So +test:main or whatever

smoky oak
#

renaming it switched em around

lost matrix
#

Ah ok

spare hazel
#

how can i send the player an actionbar

#

1.17.1

#

btw it asks for a BaseComponent

#

what is that

#

Bukkit.getPlayer(player.getUuid()).spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent().setText(ChatColor.RED + "TEST"););

worldly ingot
#

Avoid legacy colour codes in components

#

But also wow 😅

spare hazel
worldly ingot
#
Player player = // ...
BaseComponent[] message = new ComponentBuilder("TEST").color(ChatColor.RED).create(); // Note: net.md_5 ChatColor, not org.bukkit
player.spigot().sendMessage(ChatMessageType.ACTION_BAR, message);```
#

Because component messages are the replacement for legacy colour codes. Behaviour is undefined

river oracle
worldly ingot
#

Oh, right, I suppose it's not in yet, I shouldn't be using it as an example lol

river oracle
#

Isn't it harmless to just bump bungeechat version?

worldly ingot
#

It'll get merged once I get the component API merged, which... y'know... hopefully soon? :p

spare hazel
#

im looking to recreate this

worldly ingot
#

tbqh it might get bumped in 1.20.3 because of Mojang's NBT serialization over the network now

#

We're really phasing out arrays entirely

river oracle
worldly ingot
#

No it's already up to date locally I just haven't pushed yet because I'm waiting for 1.20.3

#

I have some pending changes in BungeeChat

river oracle
#

Ah

#

I finished my inventory pr mostly uwu

worldly ingot
#

It's on master now though tbh I could probably just use it

#

Still want to wait for 1.20.3

river oracle
#

Fair

young knoll
#

:c

river oracle
#

I'm hoping we have components and registirss by 1.21

worldly ingot
#

I'm hoping components should be in API by 1.21, yeah

river oracle
#

Then maybe I nventori3s soon after

young knoll
#

Every version that passes without it a puppy gets sad

quaint mantle
spare hazel
#

Cannot resolve method 'build()'

worldly ingot
#

Yeah see my snippet again, I edited it

#

build() hasn't made it in quite yet

#

Type is an array, use create() instead

spare hazel
#

Cannot resolve method 'create()'

worldly ingot
# quaint mantle ?

Honestly don't know what it's complaining about lol. This seems like an "IJ is being weird" moment

#

Did you change BaseComponent to BaseComponent[]?

spare hazel
#

im using textcomponent

worldly ingot
#

Also import ChatColor from the right place. You don't want a Bukkit ChatColor, you want a Bungee one

#

Yeah you need a BaseComponent[]

young knoll
#

Bukkit ChatColor stinky

worldly ingot
#

create() : TextComponent[] does not exist, create() : BaseComponent[] does

solar mortar
#

so I'm struggling to understand databases. I'm having issues understanding how to store and access said items in database? Can someone give me a brief overview on that classes needed to store and access a database?

quaint mantle
#

am i buggin

worldly ingot
#

No, looks fine, I'm convinced it's an IJ issue

#

Rebuild caches or something

river oracle
#

Prob need to invalidate caches

quaint mantle
#

ye doing it rn

young knoll
#

Said methods would contain all the SQL code

quaint mantle
#

nah

solar mortar
#

So like Class to connect to database > Class to access database > Class to store into database?

quaint mantle
#

stil has an error

#

wtf

young knoll
#

I have a class that handles the connections

#

And then a class that handles insert/update/read/delete

quaint mantle
#

I FORGOT THE @

worldly ingot
#

Huh... didn't even notice that

#

IJ coloured it like an annotation

quaint mantle
#

I was like wtf

solar mortar
#

like if I wanted to store a clan created, I would want to store the user who created the clan, and then another table for that clan being created.

#

So I would need my database connection class (to connect to the database) and then a class that stores said clan info into database, and then another class to update and delete? Or should all one class handle the insert/update/read/delete methods?

young knoll
#

I use one for all insert/update/read/delete

solar mortar
#

So for all the question, I'm new to plugin development, and i just started using databases

worldly ingot
#

Have you at least made a successful connection to a database?

#

Made a query?

solar mortar
#

Yeah, I can connect to the database, connects fine, even pooling iwth hikaricp, but i'm just trying to get a better understanding of the classes I need

worldly ingot
#

The way it's usually recommended to structure things is to have an interface (or class, depends on how you want to design this tbh) for each concept. You can operate on multiple tables in a single class, that's fine, but for something like a clan you may want some sort of ClanDatabase type. This should expose methods like saveClan(Clan), or updateClanName(Clan, String), deleteClan(Clan), or really any sort of operation you want to perform that pertains to a clan object

#

You want to be able to hide the fact that these are operating on SQL. You're abstracting it away so that the caller of that interface or class doesn't know exactly what's happening, just what it's going to do

#

As an example, instead of selectAllClansInDatabase() you could call it getClans(). No reference to "select" which is an SQL concept

#

Alternatively, changeRelationship(Clan, Clan, RelationshipStatus) which would edit the two clans' ally or enemy status. Implementation would perform all the SQL operations necessary but to the caller it doesn't care how it does that, as long as it's done

quaint mantle
#

Is there a way to implement await without looping when the future is in 'running' state?

worldly ingot
#

CompletableFutures have whenComplete(), or thenAccept(), or thenRun() methods that invoke callbacks when they've completed

#

Or if you don't care about blocking the thread for a result, .get()

solar mortar
#

Okay, so for clan related storing such as
Who created clan, clan created info, clan war status, allies, enemy's, members, should all be in one class, like (ClanDatabase) And then for clan stats, like player deaths, kills etc, all in another class (ClansStatsDatabase), that performance the same way as the other class. and so forth and so forth?

But I should still have a third class that connects to the database separate from my classes that would interact with the database

worldly ingot
#

I would say so, yes, but you could hide those behind implementation. Ideally the caller wouldn't have to worry about creating the connection themselves, the behaviour classes would be doing that

#

Even just a simple class that wraps and lets you more easily manage a Hikari connection pool

solar mortar
#

By any chance could you give me a simple example of what you mean, or a link to something i can read to understand that better

worldly ingot
#

I don't have any articles or guides off hand, but I do have a plugin that sort of takes this generic approach, albeit not with a connection pool (because I don't perform nearly enough database queries for it to be worth that lol)

#

Also somewhat of a simple architecture given I only have save() and load() methods, but I really don't need more than that. You could absolutely add more methods to your interfaces or classes as you see fit

#

How you separate these objects into interfaces or classes is entirely up to you. If you really wanted, there's nothing inherently wrong about throwing it all into a single jumbo class that interacts with the database

lilac dagger
worldly ingot
#

Correct

solar mortar
#

For readability and future development if someone wants to come along and work on my clan plugin, I rather not jumble everything together , so I like the segregation

worldly ingot
#

Yeah, it's up to you how you separate things

worldly ingot
lilac dagger
#

i see

solar mortar
#

Question, for my package name. Is this fine or should I change it to something different?
me.cmriddles.riddlesclan.RiddlesClan it seems weird compared to other peoples package name

river oracle
#

nothing seems wrong with that main class path

#

if RiddlesClan is part of the package just move everything out of that package and delete it

#

most people just use their domain if you don't have one its fairly standard to use me.username

solar mortar
#

when I created it asked for a I guess a file name, but then asked for a plugin name, and the plugin name autofilled from the file name when I created the project, so i wasn't sure if this was okay or not

river oracle
#

generally most people follow the package format

com.example.projectname
#

though some weirdos use just com.example

solar mortar
#

com.cmriddles.riddlesclan

#

thats better then huh?

river oracle
#

yep

#

weoo

#

you can use me

#

you should only use something else if you own the domain

mortal hare
river oracle
#

more correct though it sucks

#

so no one uses it

river oracle
lost matrix
mortal hare
#

me.dovias:dycommand
me.dovias:dycommand-api
vs
me.dovias.dycommand:dycommand
me.dovias.dycommand:dycommand-api

river oracle
solar mortar
#

I got you, I wasn't aware I could change the main class upon creating the project

river oracle
solar mortar
#

So when its created, it comes out like this me.cmriddles.riddlesclan.RiddlesClan
one is file name, the other is plugin name. I don't need the plugin name in my main class, so it can just be me.cmriddles.riddlesclan

mortal hare
#

hey, ho, lets go, where's gradle's native java 21 support

#

its been a month

river oracle
compact crane
#

Hello I have since the latest version the error that I get an error in the following code:

        GameProfile profile = new GameProfile(UUID.randomUUID(), "");
        profile.getProperties().put("textures", new Property("textures", value));
        Field profileField;
        try {
            profileField = meta.getClass().getDeclaredField("profile");
            profileField.setAccessible(true);
            profileField.set(meta, profile);
        } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
            e.printStackTrace();
        }
    }

Caused by: java.lang.NullPointerException: Cannot invoke "org.bukkit.profile.PlayerProfile.getTextures()" because "ownerProfile" is null

Does anyone know where the error is?

mortal hare
#

i do that too also RiddlesClanPlugin since it extends JavaPlugin and sometimes i create new class named like plugin to provide some sort of api class

solar mortar
#

Alright cool, I appreciate everyone being patient with and kind with me as I learn my way around plugin development

river oracle
#

or somethings I just have an object named the same as the project name

ivory sleet
#

the latter is much more scalable long term

#

so thats why its preferred, at least at companies or organizations

river oracle
#

day one I started using me.y2k.projectname

#

that's just how my friend taught me

#

so I stuck with it

ivory sleet
#

that looks good?

#

no

river oracle
#

yeah its fine

#

just stating my preference

ivory sleet
#

domain.reverse.projectname:module-name:version

shadow night
ivory sleet
#

thats how u should do it in principle

mortal hare
compact crane
ivory sleet
#

thats irrelevant

#

I mean easisest is to just have the artifact being quite literally the project name

#

or maybe append -core or sth

#

but my point is, the subdomain ought to be project related and should def be included in the group id

glad prawn
# compact crane Yes base64

Spigot 1.18.1 added the new PlayerProfiles class, which finally allows us to use custom heads without needing any reflection! You can obtain them as normal items, or actually place them down into the world. I’ll show you how both works: Creating a new PlayerProfile First, we gotta create a new PlayerProfile object. To do so,...

compact crane
glad prawn
#

Nvm

hushed spindle
#

is there any way to figure out which of the LootTables enum is present in something like a chest

#

because Lootable#getLootTable() returns a LootTable and not a LootTables value

#

and LootTable doesn't have like a getType() method

#

loop through all of those loot tables and compare class names? 💀

chrome beacon
#

LootTables.<whatever>.getType

#

Also you can compare they key

#

Depends on what the goal is

hushed spindle
#

no, from a chest that has a loot table

#

i suppose a loot table does have a getKey method so i can use that

#

nevermind that, thanks!

scenic onyx
#

?paste

undone axleBOT
scenic onyx
#

dont give error

#

but retun always null

quaint mantle
#

Cuz target entity?

scenic onyx
quaint mantle
#

Wait why are you making raytrace by urself

scenic onyx
quaint mantle
#

Thats

scenic onyx
#

this

#

@quaint mantle ??? right?

grim hound
#

is there

#

like a static method

#

to get the Channel from a Player using ProtocolLib?

rotund ravine
#

Why

grim hound
#

reasons

rotund ravine
#

Then I am not answering

grim hound
#

I know that additional info usually helps

#

in solving the issue

#

but this is the 1%

#

where it does not

rotund ravine
#

I don’t trust that

grim hound
#

but if you really wanna know

#

I add a custom channel handler

#

but getting it from a map is usually faster

#

so I utilize packet libraries when they're present

#

for PacketEvents I just had to ask

#

but ProtocolLib does not have it's own discord server

ivory sleet
#

?

grim hound
ivory sleet
#

iirc yeah, but I might b lying

lean linden
#

Hello, I am new to spigot development & coding tbh. Where do i start?

rotund ravine
grim hound
ivory sleet
#

Think u can find it by just navigating javadocs for plib

grim hound
#

m asking how I could do that

ivory sleet
#

JanTuck 🙏

rotund ravine
#

Does that work?

ivory sleet
grim hound
ivory sleet
#

If you like spigot dev, try to learn java with spigot, altho that can be complicated it may prove more indulging than learning raw java

grim hound
ivory sleet
#

Myea, but its problematic when people advice newcomers to just learn java without practically applying it somewhere

grim hound
#

that is true

lean linden
#

Do I have to watch the 10 hour video on youtube that teaches java 💀

ivory sleet
#

No

rotund ravine
#

It’s not that good

#

You can if you want

lean linden
#

I think I'll just experiment & learn

slender elbow
#

why do you need a packet library to get the channel from a player?

#

you could just.. get it from the player

grim hound
#

but isn't a Map#get faster?

#

this is what I do with PacketEvents

slender elbow
#

I mean, not necessarily

grim hound
#

I goped that I could do a similar thing with ProtocolLib

slender elbow
#

so long as those Methods/Fields in your ReflectionUtil are static final then it's fine

#

the jvm will be able to inline the calls

grim hound
#

they are

#

hmm

#

okay then

#

another question

#

How can I register a Font in a hge?

dry hazel
slender elbow
#

it has its own special treatment for reflection as well

dry hazel
#

I forgot that reflection is also implemented with mh in newer jdks

grim hound
#

if you didn't get what I meant

smoky oak
#

given a pair of (double, object) how can i store and sort them by the double value efficiently in ascending order of the double value?

#

the doubles may be equal for some pairs, the objects are all disjunct

peak depot
#
    @Override
    public List<String> onTabComplete(CommandSender sender, Command command, String s, String[] args) {
        List<String> result = new ArrayList<>();
        if(args.length == 0) {
            result.add("setWaitingLobby");
            result.add("addMap");
            result.add("setTeamSize");
            result.add("addTeam");
            result.add("addSpawner");
            result.add("removeTeam");
            result.add("removeSpawner");
            result.add("finishMap");
            return result;
        } else if(args.length == 1) {
            if(args[0].equalsIgnoreCase("addTeam")
                    ||args[0].equalsIgnoreCase("setTeamSize")
                    ||args[0].equalsIgnoreCase("addSpawner")
                    ||args[0].equalsIgnoreCase("removeTeam")
                    ||args[0].equalsIgnoreCase("removeSpawner")
                    ||args[0].equalsIgnoreCase("finishMap")) {
                for (GameMap map : Main.getInstance().getGameManager().getMapManager().getMaps()) {
                    result.add(map.getNiceName());
                }
                return result;
            }
        } else if(args.length == 2) {
            if(args[0].equalsIgnoreCase("addSpawner")) {
                result.add("Bronze");
                result.add("Iron");
                result.add("Gold");
                result.add("---[1.16]---");
                result.add("Diamond");
                result.add("Emerald");
                return result;
            }
        }
        return result;
    }
``` why does this not show me my Tab Completion when I register it as this: ```java
        getCommand("setup").setExecutor(new SetupCommand());
        getCommand("setup").setExecutor(new SetupCommand());
river oracle
#

how do you exclude a certain package set from a dependency with maven

#

I tried

                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <excludes>
                                    <exclude>sh.miles.raven.provider.mongodb</exclude>
                                    <exclude>sh.miles.ironpipe.impl.v1_19_4</exclude>
                                </excludes>
                            </artifactSet>
                        </configuration>
                    </execution>
                </executions>
``` but it didn't seem to work properly
#

I also tried adding exclude to the Dependency but that didn't seem to work either

river oracle
#

you never register the tab completer

#
final PluginCommand setup = getCommand("setup");
final TabExecutor executor = new SetupCommand();
setup.setExecutor(executor);
setup.setTabCompleter(executor); // this might be wrong method but its close to this atleast

Also make sure you add the plugin to your plugin.yml like so

... blah blah other information
commands:
  setup:
    usage: "/setup"
    description: "the ultimate setup command"
tall dragon
compact haven
#

cant u just run #sort on a collection of pairs with a custom getter function

river oracle
#

oh true ^

smoky oak
#

like im aware sorting exists

#

idk how to structure the data

pseudo hazel
#

as a list of pairs

compact haven
#

just a list of pair Double Object or a custom object

river oracle
#

currently I just use dist modules

tall dragon
#

well you can easily exclude modules

smoky oak
peak depot
river oracle
#

its redundant

tall dragon
#

using <exclude>groupid:artifactId*</exclude>

#

in the way u were using it alrdy

smoky oak
river oracle
#

let me try that

peak depot
smoky oak
#

feels like you messed something up

smoky oak
#

so i need a custom data type then gotcha

river oracle
compact haven
#

then Comparator.comparing((pair) -> pair.getFirst()) probably

peak depot
smoky oak
#

?

tall dragon
smoky oak
#

how the f

tall dragon
#

see if its doing just 1

compact haven
#

broski

#
List<Pair<Double, Object>> items = new ArrayList<>();
items.add(new Pair(0.5, "Hello"));
items.add(new Pair(0.2, "Test"));

items.sort(Comparator.comparing((pair) -> pair.getFirst()));
smoky oak
#

oh im stupid

#

thanks man

river oracle
compact haven
#

ofc

tall dragon
#

yea i just do it with transitive dependnecies

#

so u only relocate in ur final jar

river oracle
#

what I do currently is shade everything within the core module

#

then depend on that

tall dragon
#

you could mark the dependencies as compile but remove the shade plugin

#

in core

river oracle
#

what does that do

tall dragon
#

pretty sure it should shade them in whatever project ur using it in

river oracle
#

ahhh

#

let's see here

rough pumice
#

does anyone know if its possible to set a WitherSkull's texture to the player's head?

river oracle
#

@tall dragon yeah that did it thank you

rough pumice
#

dammn alr, ty for ur help

lilac dagger
#

treemap is amazing for this

grim hound
#

It automatically sorts it with it's saving method

smoky oak
#

!

#

im listening

#

btw

grim hound
#

If you want the opposite you can just reverse it

smoky oak
#

treemap can output a sorted list correct?

#

i wont

#

this is for particles

lilac dagger
#

yes

grim hound
#

As map.values();

lilac dagger
#

by entryset

grim hound
#

Or whatever

grim hound
smoky oak
#

i dont think thats how hashmaps work

grim hound
#

Well it uses hash code

#

I was also surprised

lilac dagger
#

in a hashmap it's in the order of the hashes

#

or at least attempts to

grim hound
#

Try it out

smoky oak
#

considering what i know about how hashmap works, id rather not

#

whats guaranteeing the hash is numerically ordered

grim hound
#

Last I can remember is that numbers and strings are automatically sorted

smoky oak
#

actually

lilac dagger
smoky oak
#

wouldnt it be better to do this in a list where i insert it at the proper position?

grim hound
smoky oak
#

i calculate those values in order, so the list would always be ordered

lilac dagger
#

because of elements % size

grim hound
#

Especially in a Key Value situation

#

Anyway

#

Make a simple test

#

Check whether I'm wrong

#

I only remember saving stuff and it automatically sorting itself

smoky oak
#

let me put it this way
do all these work in less than 500 (how the f do u type mu) s?

grim hound
#

When using a Map

smoky oak
#

given a set of <= 100k entries

grim hound
smoky oak
#

millis

#

i cant type the millis symbol

#

for some reason

grim hound
#

You mean

smoky oak
#

its on the key my m is on

grim hound
#

Computational time?

smoky oak
#

yea

grim hound
#

Yeaaa

#

Most code does

#

And what's great about maps

#

Is that no matter their size

#

Operations made will always have similar computational time

#

0.015 ms was the average

#

For hash maps

#

On my computer

#

For modifications

smoky oak
#

yea my budget for the code total is like 3 ms

#

but theres other parts

grim hound
rough pumice
#

Does anyone know how would I go about opening the Advancement menu to the player?

grim hound
#

A tick is only 50 ms

smoky oak
#

not if u do world modifications

grim hound
smoky oak
#

I need to both read in a significant amout of blocks and modify a subset of them

grim hound
#

Depending on that

smoky oak
#

lmc

smoky oak
#

70² * 20

grim hound
smoky oak
#

no, calculation need to finish in the same tick

#

u cant bring async data back onto main in the same tick afaik

#

correct me if im wrong please

grim hound
#

Explain your situation

#

I'll try to help you

grim hound
smoky oak
#

actually

grim hound
#

Wait no

#

All cases

smoky oak
#

atomic reference

#

make it a bool for if it finished and another for the calculation data :kekw:

grim hound
#

Uh

#

Can you

#

Elaborate?

smoky oak
#

arent atomic references able to carry async data onto main? i thought they could

grim hound
#

What

#

Are you

#

Talking about?

#

I'm confused

lilac dagger
#

AtomicObject

grim hound
#

I get that

#

But

#

What "main"

#

Main thread?

lilac dagger
#

AtomicReference

#

actually

grim hound
#

Normal variables can also do that

lost matrix
smoky oak
rough pumice
smoky oak
lost matrix
#

What are we discussing? 😄

grim hound
#

I made a custom sync scheduler after all

grim hound
smoky oak
#

potentially computing intensive calculation offload onto async

grim hound
#

Depends

lost matrix
smoky oak
grim hound
grim hound
#

But why do you need it to complete in a single tick?

smoky oak
#

it's for an ability for which i need to scan the terrain if it is flat enough to execute it on (which i still havent found a good way of doing) and then start it as fast as possible to reduce both real and percieved lag

lost matrix
grim hound
#

I did that

#

Make an async task

smoky oak
#

yea i have just one problem with doing it async

#

that would guarantee a 2 tick delay

grim hound
#

I used a custom ForkJoinPool config

#

But you can use CompletableFuture.supplyAsync

#

Since it uses ForkJoinPool

smoky oak
#

hm

grim hound
lost matrix
grim hound
#

Not really that noticeable if you ask me

lost matrix
grim hound
#

A yes

#

0.1s

smoky oak
#

like i said, scanning around 5k blocks area of terrain for how even it is. potentially takes a long time, im not sure how long it takes to check such an area

grim hound
smoky oak
#

btw

#

does spigot have a 'main thread idle' flag or smth

grim hound
smoky oak
#

like, 'im not doing anything, are there any outstanding calculations'

grim hound
#

What

lost matrix
quaint mantle
#

cant you use parallel stream

grim hound
smoky oak
lost matrix
smoky oak
#

in my experience I/O is slow

quaint mantle
lost matrix
smoky oak
#

ah yea thatd help lol

#

it only happens in a 4 chunk radius around a player

grim hound
#

That's how ac devs do it to avoid overhead

lost matrix
smoky oak
#

why is using a chunk reference a problem here?

smoky oak
hazy parrot
grim hound
smoky oak
#

nah fam he just on mobile

hazy parrot
#

its pc

smoky oak
#

huh

lost matrix
smoky oak
#

pvp relevant soooo.... instant kinda required

#

like i mentioned above, the real and percieved lag should be as minimal as possible

grim hound
#

That it would take less than 0.5s

#

Which is a very insignificant difference

#

And since doing it sync will most likely lag

#

Doing it slower async is a better option

smoky oak
#

hm question

#

how fast is system.getNanos, while (value < other value), and if(x) ... else ...

grim hound
#

System.getNanos

#

Is extremely fast

#

As fast

smoky oak
#

i could just give myself a budget and if it doesnt finish in a given time like say 5 ms push it onto async

grim hound
#

Like

#

Just returning a long

#

Maybe a little slower

lost matrix
#

Its more precise for deltas than millis but less accurate for unix

smoky oak
#

'less accurate for unix'?

#

oh is there a system.micros ?

lost matrix
#

Means the time since 1970 is less accurate

grim hound
#

No

#

Also

#

You only need millis

shadow night
grim hound
#

Why nanos?

smoky oak
#

force of habit, im used to using nanos for timing

lost matrix
#

Ive got a guide where you can specify how many millis a runnable is allowed to take each tick if you are interested

smoky oak
#

yea i can just adapt that

grim hound
#

Bruh

smoky oak
#

is on-thread runnable still on a 1 tick delay?

grim hound
#

Then I've got a question

lost matrix
grim hound
#

How can I register a Font in a headless graphic environment?

smoky oak
#

oh ive seen that one

#

my idea's to just do that on main until a certain threshold is reached, and if it aint finished push it onto async

lost matrix
lost matrix
smoky oak
#

wouldnt it just be the same timing code just elsewhere?

grim hound
lost matrix
smoky oak
#

noted

grim hound
#

Font.registerFont and every other method I've seen uses FontManager which searches for the SunGraphicEnvironment class using reflections

#

And a hge does not have that class and throws an error

grim hound
#

But I can't just implement my own since I might as well code the entire 3d rendering

#

I need for the map captcha rendering

#

Since it's the only way to show an image to a player

#

And the image can't be fixed (constant)

#

Since it's a captcha

grim hound
#

I wonder

#

How FastAsyncWorldEdit

#

Handles this stuff

lost matrix
#

Pretty much like that

remote swallow
#

jankily

grim hound
#

Since I once tasked it to replace certain blocks on a 200 million block area

#

And after using 100% of the cpu on a crappy server it was done in 45 ms

#

So it did lag

shadow night
shadow night
#

Well, replacing

grim hound
#

Only about 100k blocks were replaced

grim hound
shadow night
#

You still gotta check each of them

grim hound
#

To split it to not lag

shadow night
#

Handling it on a remote server

grim hound
#

No

#

Creating more splittable tasks

smoky oak
#

if a item has no Meta, how do i create one?

shadow night
#

I'm pretty sure the only item with no meta is air

worldly ingot
#

Correct

#

in any other case, getItemMeta() will create it for you automatically

smoky oak
#

kthx

#

also

#

if(!(player.getInventory().getItemInMainHand() item item.getType() != Material.AIR))

#

is there something similar to this just that it works?

#

im assuming you can create variables in if clauses in other ways than instanceof checks

glad prawn
#

why

smoky oak
#

im just curious if its possible

#

also does anyone know why my autocomplete is suddenly gone? I'm in plugin.yml

hazy parrot
#
ItemStack item;
if ((item = player.getInventory().getItemInMainHand()).getType() != Air) {
}
#

if u want it

#

but i see no reason to do it here

smoky oak
#

never had, worked before

#

like this is seriously weird hitting enter and not getting the autocomplete lol

#

like i do have the spigot stuff in maven or i doubt it'd build and work but

#

like why

remote swallow
#

that was from mcdev adding a schema

smoky oak
#

?

remote swallow
#

tab complete in plugin.yml

#

it was from mcdev

smoky oak
#

i mean the default IJ thing

#

on all other stuff i did it was like 'this is a minecraft plugin heres your autocomplete'

#

but now its like 'this is yml idk what u want from me'

remote swallow
#

yeah that was from mcdev

#

not intellij

dry hazel
#

schemastore has a bukkit plugin schema by default

smoky oak
#

epic i never installed any plugins for IJ

#

i still had autocomplete

gray saddle
#

hi how would i get the color of a string?

#

say for ex i have " &eTest "

dry hazel
remote swallow
dry hazel
#

it literally is

#

the json-schema store has a bukkit plugin.yml schema and ij pulls from that

smoky oak
lost matrix
#

Dont bother obfuscating

echo basalt
#

Run an obfuscator

#

That's as far as we'll go

smoky oak
#

thats where it is not how to put it into intellij lol

lost matrix
#

By using an obfuscator. But you 99.9% dont have any code that is worth obfuscating.

dry hazel
lost matrix
dry hazel
#

either try to find it there or import it

smoky oak
#

thats already saying bukkit-plugin.json

#

so where is my auto complete

gray saddle
dry hazel
lilac dagger
#

proguard should work

smoky oak
#

I changed it to 'Bukkit plugin.yml', no autocomplete

lilac dagger
#

it's free

smoky oak
#

i checked the edit thingy, its pointing to the link u sent

#

wtf IJ

lost matrix
worldly ingot
#

I saw that

#

Don't think I didn't see it

lost matrix
smoky oak
#

ah select AND restart, average IT experience

#

bleh

dry hazel
#

they literally have maven and gradle plugins

lilac dagger
#

or via maven/gradle

remote swallow
lilac dagger
#

nothing wrong with it

shadow night
#

Ms snipping tool?

#

Or whatever it's called these days

lilac dagger
#

yup

random wren
#

Hello, do you know why when i make a player ride an entity, and after i try to teleport the entity, it doesn't work ? Im working on 1.20.1. Thanks ! 😄

#

if anyone can help me that can be amazing 🙂

pseudo hazel
#

dismount them first

lilac dagger
#

there's configuration that you have to do

#

prevent libs from shrinking

random wren
timid berry
#

I have the correct version but I cant compile paper

#

Im trying to compile that

shadow night
#

I remember you from somewhere

timid berry
slate tinsel
#

Hi! How do you create an explosion with falling blocks, so it's kind of easiest to make an explosion but make sure that no blocks are damaged or how do you usually do it? 🙂

shadow night
lost matrix
timid berry
#

but class 61 is java 17

lost matrix
dry hazel
#

and it's not supported