#help-development

1 messages · Page 647 of 1

wet breach
#

since technically the main command is just a single command 😛

zenith gate
#

Well yeah, but forget abt that lol.

wet breach
#

lol

young knoll
#

Probably startup

#

Idk how trying to create a world at shutdown would go

#

Probably wouldn’t go

young knoll
#

Generally one per command

#

All the main class has to do is setExecutor

wet breach
zenith gate
#

is it generally better to use color codes rather than ChatColor?

young knoll
#

No

#

ChatColor is meant to abstract magic values

wet breach
#

but magic values are fun 🙂

young knoll
#

&6 means nothing, ChatColor.GOLD means something

zenith gate
#

ohh.

vital ridge
#

I'm not able to get NMS to work. I ran buildtools and copied the exact pom <plugin> and <dependency> the NMS tutorial showed, but when I put the dependency in my pom.xml, it compiles with an error telling me

Unresolved dependency: 'org.spigotmc:spigot:jar:1.12.2-R0.1-SNAPSHOT'
young knoll
#

You ran buildtools for 1.12 I assume?

flint coyote
#

On start can easily be done by a plugin and you can even roll back to a certain state if you saved it (even for the main world)

young knoll
#

Remove the :jar: part

wet breach
#

Lmao

young knoll
#

🫙 moment

zenith gate
#

That seems to be a common issue lol

wet breach
#

I was about to say, we communicating with emojis now?

young knoll
#

With the Mojang remapped version you do use :jar: iirc

#

But no remapped for 1.12 :p

vital ridge
#

It still spits out the same unresolved dependency error

#

I removed the : jar :

#
Unresolved dependency: 'org.spigotmc:spigot:jar:1.12.2-R0.1-SNAPSHOT'
young knoll
#

Show your pom

#

?paste

undone axleBOT
vital ridge
young knoll
#

Yeah you’re trying to use remapped

#

Doesn’t exist for 1.12

#

Remove <classifier>remapped-mojang</classifier>

#

And the entire special source plugin

vital ridge
#

Yeah got rid of it

#

and it works now

young knoll
#

It’s hard to say what you require for X players

#

2 cores isn’t a lot though

zenith gate
#

Yeah most likely. depends on player count as well.

vital ridge
zenith gate
#

i think you'll be fine. you might have some hiccups along the way. mine runs fairly well.

#

less

#

6gb of ram, 2 cores. but I have like 30 people instead. I have my world size capped to help as well.

#

maybe not as many plugins as you, but there are a lot.

young knoll
#

Plugin count doesn’t mean much

#

You could have 100 plugins that do basically nothing

#

Or 5 that are very heavy

#

?

#

Paper/spigot are apis

zenith gate
#

they are APIs

young knoll
#

If you use the paper api you have to use a paper server

#

If you use the spigot api you can use spigot or paper

zenith gate
#

You can also use spigot plugins on paper server.

rain night
#

I tried unloading the gameworld, but its literally just not continuing beyond Bukkit.unloadWorld(worldName, false);

#

There are no players on the world

wet breach
#

did you unload all the chunks?

young knoll
#

^ you should do that first as well

#

Even then I believe unloadWorld may not be instant

#

Not sure

rain night
# wet breach did you unload all the chunks?

Like that?

World world = Bukkit.getWorld(worldName);
            if (world == null) continue;
            for (Chunk chunk : world.getLoadedChunks()) {
                chunk.unload();
            }
            Bukkit.unloadWorld(worldName, false);
rain night
young knoll
#

Check after you call unloadWorld if getWorld returns null

rain night
wet breach
rain night
#

its not returning

wet breach
#

typically wouldn't want to continue if that condition is met, you would want to break out of the loop

#

what is the purpose of the int? lol

#

this code is more better to use btw

#

just not sure of the int there is all

rain night
wet breach
#

well as we stated you can't unload the main worlds

rain night
#

im not

wet breach
#

so you have multiple worlds needing to be unloaded?

#

o.O

#

thought it was just a single world lol

rain night
#

Its actually currently only one world, but could handle multiple

wet breach
#

yeah but if we unloading chunks because we want to unload the world, not sure why we care how many are unloaded?

#

as I said was just curious more then anything lmao

young knoll
#

For stats

#

Everyone loves stats

wet breach
#

just show it briefly

#

if they miss it all well

#

XD

rain night
#

?paste

undone axleBOT
young knoll
#

Actually wait what’s with the two booleans in Chunk.unload

#

Docs only show 1

rain night
wet breach
young knoll
#

Yeah the docs only have a save Boolean

#

There’s no force Boolean

wet breach
lunar wigeon
#

if 1 world is null don't skip entire loop, it should just skip loop for world that is null

wet breach
# lunar wigeon no?

they clarified on it was for multiple worlds, where as I was under the impression for a single world. In which case if the world is null you wouldn't want to continue

lunar wigeon
#

oh ok

undone axleBOT
young knoll
#

I don’t think the async catcher will like that

#

But you can try

rain night
#

Why should i do it async?

#

I get it. But thats not the problem.

#

Then i could also jsut delete the files

flint coyote
#

I think he wants to create a new world without restarting the server

rain night
#

This Bukkit.unloadWorld(worldName, false) doesnt returns. Therefore nothing behind it in the code is getting executed

young knoll
#

I’m curious what it gets stuck on

#

Probably no easy way to find out sadly

rain night
rain night
young knoll
#

You’d have to attach a remote debugger

flint coyote
#

Is restarting the server an option? Or does that take too long?

rain night
#

Im shuting down the server after deleting the world, if the function would return anything

flint coyote
#

Why don't you delete the world on startup?

#

Wouldn't have to deal with unloading then

rain night
#

Thats true...

zenith gate
#

yeah and you can then stop the world from being loaded in the first place then delete it.

young knoll
#

Don’t even need to stop it from being loaded if it’s a custom world

young knoll
#

Just don’t load it

rain night
#

perfect

flint coyote
#

Set the plugin to run before world loading using the plugin.yml

rain night
#

Ill do it right now!

#

WAIT!!!

flint coyote
young knoll
#

Turns out that’s a bit misleading

#

It controls when the plugin enables, not when it loads

rain night
#

Maybe the world is getting unloaded beforehand so there is nothing to unload. Also the unloading of chunks hasnt worked. Is there a way to check if a world is loaded?

young knoll
#

getWorld == null

peak storm
#

Minigame Map Rollback

rain night
#

null if if non exists... so unloaded should still return the world..

flint coyote
#

If it's loaded it won't be null

#

otherwise it is

rain night
#

okay

peak storm
#

Do you just create a new thread for help or do you post in here? I assume thread

young knoll
#

You can do either

peak storm
#

So just like this lol

flint coyote
#

Yup that's fine, too

peak storm
#

ok great thanks

flint coyote
#

So what you are saying is that your world still gets saved?

peak storm
#

Yup

#

And its really making me mad because I've been stuck on this all weekend

#

Even changed the bukkit.yml to -1

#

autosave value

flint coyote
#

can you check the logs whether it saves on disable?

#

Since autosave is probably every X minutes

young knoll
#

Chunks save on unload

#

There’s a method to stop that in the unload event

peak storm
peak storm
#

I'd have to add another listener?

young knoll
#

Yes

#

Also it doesn’t work on newly generated chunks

peak storm
#

Then what

young knoll
#

check that javadocs

#

Or use the power of your ide and type e.

flint coyote
rain night
#

Okay

flint coyote
#

if you see those messages something probably gets saved

rain night
#

Nether_portals dosnt work on non main world

young knoll
#

Really?

flint coyote
#

You can delete the main world using the load on startup mechanic

young knoll
#

Huh til portals don’t like custom worlds

flint coyote
#

I also already made a plugin to delete and regenerate or rollback worlds on restart if you don't wanna make it yourself.

rain night
#

So deleting the worlds on startup?

flint coyote
#

Yes

peak storm
rain night
peak storm
#

That I turned autosave off

young knoll
#

I believe that just represents the save on unload

#

So disabling that should work

peak storm
young knoll
#

Yep

peak storm
flint coyote
#

Since you don't wanna rollback it's even simpler

vital ridge
#

I added nbttag to my custom item, but when I print out #getTag of the NMS item, I'm getting only printed out the display and lore of the item

#

I guess they are tags aswell

#

But I can't access my custom tag

rain night
#

Your not unloading, so you delete on "onLoad" instead of enable?

peak storm
young knoll
#

It should

flint coyote
#

So you can just delete the world at that point

peak storm
young knoll
#

You can use onLoad too

#

If you prefer

peak storm
#

Any benefits or no?

quaint mantle
#

I want to check my 2nd argument as a player, how do I do that?

#

in command

flint coyote
#
if(args[1] instanceof Player) {
// is player
}
young knoll
#

Lol

quaint mantle
#

ty

quaint mantle
#

no

young knoll
#

That’s not

#

No

quaint mantle
#

oh

#

oke

#

:DF

young knoll
#

Bukkit.getPlayer(string)

#

If it’s null, it’s not a valid player

flint coyote
#

oh right lmao I kinda thought about some listener xD

#

Turns out sleeping 3 hours a night isn't enough

quaint mantle
#

:S

flint coyote
#

No that does not work. That's what you would do in a listener. Like the EntityDeathEvent

#

You have to do what Coll said

#

getPlayer(args[1]) and then null-check it

quaint mantle
#

btw i got this warning why ?

mighty pine
#

ur array index is out of bounds obv

quaint mantle
#

😄

flint coyote
#

Yes, you are probably size checking the array before and access an index that's larger than the size-1

peak storm
young knoll
#

Weird

quaint mantle
#

alright

young knoll
#

As far as I know auto save and unload are the only times when a chunk is saved

#

Aside from when generated

young knoll
#

Unless the saving at shutdown is something other than the unload save

mighty pine
#

isnt args a String array

young knoll
#

It is

#

Don’t mind him he has been sniffing the glue again

flint coyote
mighty pine
#

(time to get ignored again) whats the package name of the full bungee jar not just the api

peak storm
young knoll
#

No idea sadly

flint coyote
#

Didn't work with bungee either, sry

flint coyote
young knoll
#

Like I said I thought that was just due to them all getting unloaded

#

I guess not

mighty pine
young knoll
#

I don’t think there is one

mighty pine
#

bruh what

#

ugh

flint coyote
#

Dunno if the main world can be unloaded in onDisable but I doubt it

peak storm
unkempt peak
#

Does player#sendBlockChange cause a block update on the cleint?

peak storm
#

You can see the code here

mighty pine
#

make your own world with nms e z

kind hatch
flint coyote
#

Is that unloading and then loading it again?

#

I thought you restarted in between

#

Because in that case the restart save obviously isn't the problem

peak storm
#

Then once the loading is done the map can be played again

flint coyote
#

So no restarts

peak storm
#

nope

flint coyote
#

Alright

peak storm
#

How it works it should work we no server restarts

flint coyote
#

I mean I would know a workaround but there has to be a better way

#

So you tried the listener, too?

peak storm
#

yup

flint coyote
#

Does it fire?

#

Just to make sure it's registered

peak storm
#

I can check

quaint mantle
#

i add my command to pluginyml

#

why i got this ?

#

ah wait

flint coyote
#

This warning does not correlate to your plugin.yml

#

The IDE does not check your plugin.yml in order to fire code-related warnings

young knoll
#

You can just suppress it

#

Or add a requireNonNull

#

To appease the ide overlords

rain night
#

Okay Fabsi...

#

It kinda works

flint coyote
#

Alright, what's not working then?

rain night
#

BUT it takes ages to join the world

quaint mantle
#

i got this why ?

young knoll
#

Yeah making a world isn’t exactly fast

rain night
#

Is there a way to preload a world?

flint coyote
rain night
#

shit

young knoll
#

Not unless you have a copy of the premade world somewhere

flint coyote
#

And can't be done asynchronous either

rain night
#

Oh no

rain night
young knoll
#

Yeah then no

#

You need a server to generate it

flint coyote
#

You could go overkill.
Have another server create the world for you and transfer the files.
You would still have to load it which does cause lag though

rain night
flint coyote
#

Definitly not normal in terms of resources used xD

#

So the current problem is that the world generation takes too long?

rain night
#

But i could await the world loading... Is it the WorldLoadEvent?

rain night
flint coyote
#

Countdown of?

#

Aren't you restarting the server? Your plugin should not load before the world got fully generated and loaded

#

The countdown one I mean

rain night
#

Its a little game im doing for friends, we spawn in a new world and can move after 5seconds

flint coyote
#

Yeah then either start the countdown on WorldLoadEvent or even better: PlayerJoinEvent

rain night
#

Nah bro... When i teleport the players to "world" the loading screen is taking ages

flint coyote
# peak storm

Hmm I don't know about more methods of denying save either

flint coyote
#

Preload them

rain night
#

YES

#

I WANT TO DO THAT 🙂

#

But how??

young knoll
#

Well if you know where they are

flint coyote
young knoll
#

^

#

I believe you can also do it from World

flint coyote
#

You should have the location since you are teleporting players there

young knoll
#

We need the console error

quaint mantle
flint coyote
#

There should be more

quaint mantle
#

wanna see my code ?

young knoll
#

That’s not the full error

quaint mantle
#

1m

young knoll
#

Also wtf is that console formatting

quaint mantle
#

i will write to paste

flint coyote
#

Is that the full stacktrace? It's missing the "caused by"

quaint mantle
kind hatch
#

ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1

quaint mantle
#

my code works fine with args

flint coyote
#

You are accessing index 1 when your size is 1

#

Therefore the maximum index you can access is 0

young knoll
#

(Or 0)

flint coyote
#

Oh true, dunno how the error message is implemented

young knoll
#

Ah wait yeah it says the size

#

Ignore me

flint coyote
#

But since it says "for length 1" it should be 1

young knoll
#

Yes a size of 1 does not mean array[1] exists

#

Since array indexes start at 0

quaint mantle
#

alright

#

ty

flint coyote
#

Get used to start counting from 0 for everything

#

Well, except JDBC for some reason

young knoll
#

And then use LUA

#

And cry

#

I’m sure there are other languages LUA is just the one I know

flint coyote
#

Fortran

kind hatch
#

Go

flint coyote
#

cobol

#

don't know more. Although I could google

kind hatch
#

Pascal

flint coyote
young knoll
#

You can’t load chunks async

#

Not with spigot anyway

hybrid pulsar
#

How we delete one of our resources, or can we just report it with requested deletion reason?

young knoll
#

Yes

rain night
flint coyote
hybrid pulsar
flint coyote
#

"Comparison of programming languages":

rain night
#

The '?' is legendary

flint coyote
#

A bunch of them have a ? there

young knoll
#

Including java

flint coyote
#

It's just weird to pretend powershell is a programming language

young knoll
#

Yeah!

#

Where’s minecraft redstone smh

young knoll
#

It’s theoretically Turing complete

flint coyote
#

Suggest a change to the page and demand them adding it since they added powershell

rain night
flint coyote
#

The world loading or the chunk loading?

rain night
#

I think its the chunks....

#

Or can i just preload the chunks with the range of the render distance?

flint coyote
#

Just load them before teleportation. Chunk loading is blocking

rain night
flint coyote
#

Would have to check the docs aswell

#

But you don't have to load all chunks. Just load a 3x3 and then tp

#

the rest will load in those few seconds or until you leave the 3x3

rain night
#

I'll do that

flint coyote
#

Unless it's important to instantly have full view on the map after teleportation

rain night
#

I did 36 Chunks it works perfectly!

#

Love you !

fierce whale
#

Is there a way to check what part of plugin takes how much ram?

simple schooner
#
newPosition < 0: (-1 < 0)
#

whats this error

river oracle
#

is this even java ?

#

also -1 will always be less than 0

#

you could literally just inline true

simple schooner
#

i cant compile my plugin

river oracle
#

yeah I can see why idk wtf that code is

#

I'ma need more context that makes 0 sense on its own

simple schooner
#

also why wont the console show which class the error occured

river oracle
#

are you just not going to elaborate and send more code

#

because right now that could be a trillion things and none of them make sense

simple schooner
#

and plus it's only been like day 2 I'm still learning

#

i'm just messing around lol

river oracle
#

you should probably start with more basic things

simple schooner
#

yeah the things im making are basic

river oracle
#

the code you sent isn't valid java syntax, and you won't provide the code surrounding it

#

so I can literally not help you

simple schooner
river oracle
#

do you not know where that code is at?

simple schooner
#

no

river oracle
#

because its saying that's not valid java code

#

why don't you just use project search

simple schooner
#

i didn't code anyting which includes math

river oracle
#

that's not math

#

that's boolean algebra at most if you'd call it that

#

I guess send the full error your getting on compile then

#

?paste

undone axleBOT
simple schooner
#

okay

simple schooner
#

here

river oracle
#

send your pom

simple schooner
#

okay

simple schooner
# river oracle send your pom
ItemStack ironHelmet = new ItemStack(Material.getMaterial(plugin.getConfig().getItemStack("warrior.helmet")), 1);
            ItemStack ironChestPlate = new ItemStack(Material.getMaterial(plugin.getConfig().getItemStack("warrior.chestplate")), 1);
            ItemStack ironLeggings = new ItemStack(Material.getMaterial(plugin.getConfig().getItemStack("warrior.leggings")), 1);
            ItemStack ironBoots = new ItemStack(Material.getMaterial(plugin.getConfig().getItemStack("warrior.boots")), 1);```
#

could it be because of this?

#
helmet: IRON_HELMET```
#

cuz yk this isn't an itemstack

#

this is a material

river oracle
#

that's not why it won't compile

#

but that's definitely an error bound to happen at runtime

simple schooner
#

yeah but why wont it compile

river oracle
#

not that its relavent but why are you compiling 1.20.1 API with java 16

#

use java17

simple schooner
#

okay

#

yup still wont compile

river oracle
#

not sure why it'd be erroring though your pom looks fine to me, something about your resources though

#

can't help further thuogh becaus I'm not sure about that error tbh

simple schooner
#

okay

#

thank you

mighty pine
simple schooner
#

i dont know

mighty pine
#

what ide are you using

river oracle
#

IDE has nothing to do with it

#

doesn't change the fact that maven compilation failed

mighty pine
simple schooner
mighty pine
simple schooner
#

what

mighty pine
#

with an entry point

simple schooner
#

uhm sorry but I don't know how to do that, it's only been day 2

#

i'm not familiar with java

mighty pine
#

ok im kind of doubting its something wrong with the code

#

how are you compiling it

simple schooner
#

uh it automatically compiles it for me when I press run

river oracle
#

are you using mvn package

#

or ig the side button that says package

simple schooner
#

Shift + F10

mighty pine
#

can you send a screenshot of that

river oracle
#

than compile again

simple schooner
#

okay

simple schooner
#

it's saying this now

#
incompatible types: missing return value```
mighty pine
#

kek

simple schooner
#

I thought it breaks the code when I dont return anything

#

lol

river oracle
#

if you handle nulls wrong it does

simple schooner
#
if (target == null){
                        p.sendMessage(ChatColor.RED + "Player does not exists!");

                        return;
                    }
mighty pine
#

probably

#

unless your method is void you need to return whatever type is specified

#

otherwise you can just return

simple schooner
#

ain't this called like "early returning"

mighty pine
#

sure

#

but this method always returns the type specified

#

you cant not do that

simple schooner
#

ohhh okay

#

there we go

#

finally

#

thanks ya'll

#

woah it's broken

#

it did compile but the plugin is broken rip

#

wait nvm I know why

#

im dumb, fixed it

unkempt peak
#

Hey so I have been trying to optimize changing large amounts of blocks and have run into alot of trouble. I tried using nms because people have said it's alot faster than setType so I tried using the PacketPlayOutBlockChange to send a block change to the player but it is significantly slower than setType and even overwhelms the cleint after a while forcing the client to time out. After looking through nms code I found PacketPlayOutMultiBlockChange but I have no idea how it works. Could I somehow use that to send an entire batch of block changes at once and would it be faster than the other methods?

#

For context I'm working on a video player project and need to optimize 1.1m block changes per second

#

I also can't seem to figure out how to stop block and lightning updates from happening

chrome beacon
#

Paper has api for the multiblock change and Spigot has API for block change

#

You don't need to touch the packets manually

unkempt peak
#

I know about Player#sendBlockChange but won't that effectively do the same thing?

chrome beacon
#

Yes but without the nms

unkempt peak
#

Ok but the problem is optimization not nms, I can work with nms. Paper has an api for PacketPlayOutMultiBlockChange?

mighty pine
#

or are you trying to send it to the player rn

unkempt peak
#

I need a way to basically just update the block textures without effecting block updates or lighting

mighty pine
#

then just get the nms chunk

#

and write to it directly

#

and dont break anything

unkempt peak
mighty pine
#

not even doing a billion blocks sets in half a second smh

unkempt peak
lean widget
#

@unkempt peak

#

setSectionBlock is for the third method, setChunkBlock for the second

unkempt peak
#

Thanks

#

Lmao love the license for this

sharp kayak
#

How do I cancel the advancement completed broadcast for a specified player?

rare rover
#

how do you set text on text displays?

#

i cant seem to find the method

sharp kayak
#

setText()

rare rover
#

oh im dumb

#

🤦‍♂️

#

how would i set multiple lines?

#

just with \n or?

unkempt peak
#

Hey @lean widget I'm trying to get your code to work but It's throwning an npe "because "mh" is null" (BlockChanger.java:428) Do you know this is refering to?

quaint mantle
#

I just looked at the code and there is nothing called mh

unkempt peak
#

I'm assuming it's something in nms

#

I'm not sure

quaint mantle
#

Not sure

unkempt peak
#

I've verified and the materials are definitly valid

tender shard
#

?paste it pls

undone axleBOT
tender shard
#

Thats easier im on the phone

tender shard
undone axleBOT
unkempt peak
tender shard
#

that can't be the code you used

#

your package name is me.blockchanger and that doesn't even appear in the stacktrace

unkempt peak
#

I changed the package name but everything else is the same

#

I can paste it if you want but it's the same exact class

tender shard
#

the whole class relies on using spigot mappings, or in other words, this won't work on 1.17+

unkempt peak
#

Oh

#

Dang that sucks

tender shard
#

looks like it some got weird patches for versions 1.19 etc but 1.20 definitely won't work

unkempt peak
#

I'm running it on 1.19.2

tender shard
#

it only checks for "19" and doesn't differentiate between 1.19.1, 1.19.2, 1.19.3, or 1.19.4

unkempt peak
#

Hmm ok

#

Maybe I'll try downgrading the plugin to see if I can even get this method working

tender shard
#

it'd be easier to just understand the original code and properly translate it to mojang maps using this:

#

?switchmappings

unkempt peak
#

Yeah, I might just try to rewrite it

tender shard
#

where did you get this blockchanger class from? i don't see it in the linked spigot thread

unkempt peak
#

Idk @lean widget gave me the github

#

they made it

tender shard
#

ah ok. yeah it uses hardcoded "obfuscated" method and field names so it'll only work on one specific 1.19 version. the proper way would be to use mojang maps, then you have the same code for all versions, and then run it through the maven specialsource plugin with the respective mappings for the version you want it to work on

#

basically, these two blog posts are about using mojang maps + how to switch from obfuscated/spigot mappings to mojang maps:

#

?nms

tender shard
#

?switchmappings

unkempt peak
#

Thanks, I'll see what I can do

rare rover
#

How would one make multiple lines with text displays?

#

Just \n or what?

#

Since theres only .setText()

sharp kayak
#

try it out ig

tender shard
#

I'm currently writing a blog post about multi-module maven projects. Does somebody have an example of something easy (just a few lines) that requires NMS in 1.20?

tender shard
#

that can be done through ServerListPingEvent or what's it called

warm mica
#

Nvm they added it

warm mica
tender shard
#

where else would you see the motd

warm mica
#

There are plugins that ping the server's motd using getMotd

tender shard
#

but yeah anyway, NMS isn't needed to change that

#

hm maybe I'll just do getting the TPS

mighty crane
#

Hey there i'm new to java and was wondering how can i get Arrays.toString without the []

simple schooner
#

what

mighty crane
#

in this case i have an Array called "groups" that has the players permission groups

remote swallow
#

what do you want it as

mighty crane
#

i want to have it as just group1, group2, etc...

#

instead of [group1, group2, etc...]

remote swallow
#

so format it

mighty crane
#

how do i do that?

tender shard
#
String.join(", ", myArray);
mighty crane
#

ok ill try that

simple schooner
#

btw how do I get the verified role

remote swallow
#

verify

#

!verify

undone axleBOT
#

Usage: !verify <forums username>

simple schooner
#

I did

remote swallow
#

leave and rejoin

simple schooner
#

ok

#

There we go

mighty crane
#

yes

#

very nice

simple schooner
#

I can't think of any beginner projects anymore bruh

remote swallow
#

you would have to make the url

#

they realease maven info, you would have to convert that maven info into the url to download it

#

sure

robust ginkgo
#

Edited - I don't use noteblocks anymore.
How can I prevent mushroom block textures from changing when a block update happens?

drowsy helm
#

Listen to all the events that change it and cancel it

#

Physics event, interact event

eternal oxide
#

if you use maven you don't ever (almost never) install jars

#

do you have a pom.xml?

#

then you are not using maven

#

no

#

your imports look fine

#

select yoru project and (if Eclipse) press F5

#

else, project menu and clean

#

no

#

you said you were not using maven

#

I'm finished

#

no screen yet

#

good job discord

#

I don;tr do pm

#

just say what your issue is

#

you have an imported essentials, it has the api

#

ok got screen

vital ridge
#

What would be the best way to get a block behind another block? I'm trying to get the block behind a block I've just broken. Currently I think the blockfaces are the best solution, I saved the last clickedblockface on the oninteract event and I'm accessing that from the blockbreak event.

eternal oxide
#

goto the project menu at the top and choose clean

#

yep

#

restart yoru IDE then

remote swallow
eternal oxide
#

Thats good because we are not in verified 😉

remote swallow
#

lol

eternal oxide
#

your Economy import looks bad too

#

hover over it

#

you shoudl get a popup

#

3rd one

#

milkbowl

#

select 3rd option for import, milkbowl

#

any other errors?

#

I see 3 marked lower down

#

press CTRL+SHIFT+O

#

you sure that PayMoneyEvent is in teh version of ess you are using?

#

delete the import

#

then scroll down to the error lines

#

click save so the IDE updates

#

um I'm fairly sure you shoudl not be raising payMoneyEvents yourself if they are essentials events

remote swallow
#

i dont see a PayMoneyEvent in the current github

#

for essx

eternal oxide
#

delete line 125 and 126

#

then hover the other errors and see options

#

actually, you are using vault so you shoudl not even be using ess for money

#

economy.

#

you are using vault, which support many economies

#

you should query the Vault API not essentials

#

Vault/essentials also have an auto format built in

remote swallow
#

that doesnt look like an essentials command

eternal oxide
#

its his plugin

remote swallow
#

so it is an essentials command?

eternal oxide
#

if you add Placeholder API you can easily use formatted balances

#

it does

remote swallow
#

vault

eternal oxide
#

yes, you shoudl be doing everything via vault

#

you have to add the placeholder api and parse it

remote swallow
#

those arent even valid papi placeholders

#

if you want to format essential's messages go and ask in their help channels, see if theres a built in way or pr it

mighty crane
#

Hey there i've got this slashcommand to 'say' the block that you are currently looking at

player.sendMessage(ChatColor.YELLOW + "You are looking at " + block.getType());

but i want instead of block.getType() (that gives the block in all capitals and spaces are _ something like OAK_PLANKS)
that it just gives the displayname of the block. (like Oak Planks)

remote swallow
#

format it

mighty crane
#

how do i do that?

remote swallow
#
    public static String getNiceMaterialName(final Material mat) {
        final StringBuilder builder = new StringBuilder();
        final Iterator<String> iterator = Arrays.stream(mat.name().split("_")).iterator();
        while (iterator.hasNext()) {
            builder.append(upperCaseFirstLetterOnly(iterator.next()));
            if (iterator.hasNext()) builder.append(" ");
        }
        return builder.toString();
    }


    public static String upperCaseFirstLetterOnly(final String word) {
        return upperCaseFirstLetter(word.toLowerCase(Locale.ROOT));
    }


    public static String upperCaseFirstLetter(final String word) {
        if (word.length() < 1) return word;
        if (word.length() == 1) return word.toUpperCase(Locale.ROOT);
        return word.substring(0, 1).toUpperCase(Locale.ROOT) + word.substring(1);
    }
remote swallow
#

i stole it from alex

#

blame him

ivory sleet
#

@tender shard

#

u dodo

flint coyote
#

lmao

ivory sleet
#

stream expensive :c

flint coyote
#

cutest blaming ever

ivory sleet
#

yeah, well speaking of which this looks like one should be using StringJoiner and not StringBuilder

#

yeah

remote swallow
#

ofc

opal juniper
#

One class wonder

quaint mantle
#

hi, how do you set a player completely invisible (not even the username is visible) ? I dont want to use Player#hidePlayer() however, because the player should still be able to interact with other players, eg hitting, etc

simple schooner
#

What eventhandler handles the players input?

#

Like how do I know when they right click

#

Im having difficulties finding it in the wiki

eternal night
flint coyote
quaint mantle
simple schooner
lost matrix
simple schooner
#

I must be blind

eternal night
#

yea, invis does

quaint mantle
#

cool

eternal night
#

problem is the equipment

#

e.g. armour and swords will be visible

mighty crane
#

idk if you can execute command from within a plugin

lost matrix
mighty crane
#

oki

#

xD

flint coyote
#

Run the command using Bukkit.dispatchCommand()

remote swallow
#

why

eternal night
#

i-

remote swallow
#

theres api methods

flint coyote
#

Then smile is happy 😛

eternal night
remote swallow
flint coyote
#

I was joking duke

quaint mantle
#

wjhat does hasIcon() do?

#

in portioneffects

remote swallow
#

return if the effect has an icon

quaint mantle
#

i know, but what does that mena

#

(i looked in the docs)

flint coyote
#

Whether the player sees the icon

quaint mantle
#

what icon?

remote swallow
#

top right

flint coyote
#

The small icon that indicates you have Regeneration or whatever else effect

remote swallow
#

iirc

quaint mantle
#

ohh

#

alright

#

thabks

#

did i do it right?

#
player.addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1, false, false, false));```
#

(i just want the invis, bothing else)

flint coyote
#

Yes looks alright

#

If you apply it to multiple players (e.g. in a loop) you can use the same PotionEffect instance

quaint mantle
#

it still shows the icon

#

crap bro

#

cant send pics

icy 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

quaint mantle
#

also, how can you make it that it doesnt go away after death/drinking milk?

#

do you really have to also listen for those events 😩

lost matrix
simple schooner
#

do armorstands automatically save? or do I have to make a database for it to save

flint coyote
#

Non-packet-based armorstands do save automatically. How else would they be saved on a survival server?

simple schooner
flint coyote
#

Yes. Keep in mind that those are still entities and require more server performance than packet based armorstands.

#

Also on new versions there are display entities

lost matrix
simple schooner
#

ohhh

#

i'm gonna take a look on those

simple schooner
#

cuz I don't know how to make databases yet, It's only been like day 2

sullen marlin
#

Tbh I don't think armour stands (especially if you noai them?) use much performance

quaint mantle
#

does anyone know what happens if the itemstack param in World#dropItem() is null?

lost matrix
quaint mantle
#

alright

lost matrix
#

But your IDE should yell at you if anything that could be null is passed anyways:

quaint mantle
#

what exactly do i have to check in the ItemStack obj?

quaint mantle
lost matrix
#

If its always not null then there is no problem...

quaint mantle
#

no, i mean i cannot do ItemStack!=null

#

in the if

lost matrix
#

Well ItemStack refers to the type. You cant do anything with types on their own.

quaint mantle
#

basically, what i want to do is get the itemstack the player is holding and drop it in the world

lost matrix
#
ItemStack someItemFromSomewhere = ...;
if(someItemFromSomewhere != null) {
  // drop it
}
quaint mantle
#

@lost matrix

lost matrix
quaint mantle
#

what do u mean?

lost matrix
quaint mantle
#

and then do null check?

#

with currentItem?

lost matrix
#

Sure. And if its type is AIR as well

quaint mantle
#

ohhh

#

alright

quaint mantle
#

(the null check)

#

its never null

lost matrix
# quaint mantle its never null

Yes, players cant have null in their main hand. Only in the offhand.
If a player holds nothing then he actually has air in his hand.

quaint mantle
#

so only check air?

lost matrix
#

Yeah

shadow night
quaint mantle
#

like this?

lost matrix
# quaint mantle so only check air?

And while you are at it: Make it a utility method:

public static void dropHandItem(Player player) {

}

And if you want to make this even more useful you can implement it
for everything a player can hold:

public static void dropItem(Player player, EquipmentSlot slot) {

}

Will teach you a bit.

distant wave
#

whats the command for minecraft decompilation

#

@undone axle

#

?nms

distant wave
#

oh

lost matrix
quaint mantle
#

lmao

shadow night
#

He meant nms

#

Lol

icy bone
#

I got another problem and maybe you guys can see it. I created a command called WorldTeleporter and it basicly loops through all worlds on the server, sets it on a menu and the player can click on the items to teleport to the world. For example if i have a world in my server folder called "World_end" it will see the folder, create a grass_block called "world_end" and if the person clicks on it, the plugin will read out the name of the block (in this case "world_end") and teleport the player too it. But for some reason i got 10 worlds and all worlds work correctly except one. This world generates a NULL error and it says

[13:21:33 ERROR]: Could not pass event InventoryClickEvent to VTDPlugin v1.0-SNAPSHOT
java.lang.RuntimeException: java.io.IOException: The process cannot access the file because another process has locked a portion of the file
        at org.bukkit.craftbukkit.v1_20_R1.CraftServer.createWorld(CraftServer.java:1284) ~[paper-1.20.1.jar:git-Paper-68]
        at me.viciousthedark.vtdplugin.listeners.MenuListener.onMenuClick(MenuListener.java:59) ~[VTDPlugin-1.0-SNAPSHOT.jar:?]
#

Does someone know why this specific world doesnt load or cant be reached with #.createWorld() function. I know it says cannot acces the file because another process has locked a portion of the file. but i have no idea where this is happening

lost matrix
icy bone
#

Restarting the machine as in my whole pc or the server?

lost matrix
#

The whole pc/root

icy bone
#

I didnt try that yet, let me try it now

torn shuttle
#

how do I avoid having mobs spawn mounted when spawned via the api?

#

I know there's a way

eternal night
#

randomizeData to false

torn shuttle
#

hm?

eternal night
#

param on the spawn method

torn shuttle
#

oh

#

got it, thanks

icy bone
#

Out of curiousity, i restarted my PC and got this error now:

[STDOUT] [org.bukkit.craftbukkit.v1_20_R1.CraftServer] World lobby_prophunt is a duplicate of another world and has been prevented from loading. Please delete the uid.dat file from lobby_prophunt's world directory if you want to be able to load the duplicate world.

I do know when i created this world i copied it from a void world, is this something i need to stop doing to make sure this doesnt happen again?

#

If you want to know my steps:

  1. created void world with minecraft
  2. did copy paste and renamed the world before i started building it
lost matrix
#

Inside your world folder there is a file which stores the UUID of the world.
If you use a world as template you need to remove this UUID file from it.

shadow night
#

Because two worlds with e same UUID won't work

icy bone
#

Ahh so thats why this specific world does this. Good to know, thank you

shadow night
icy bone
#

And you can just delete the uid.dat and it will generate a new one?

shadow night
#

Well, try it and see

icy bone
#

Ahh yeahh now it works. Thank you so much

#

Dont know how it used to work sometimes but now i understand what the possible problem could have been

sterile breach
quaint mantle
#

i wanna insert data to sql but if this data is exists i don't wanna insert data
and i wanna control with java
can i do this ?

opal juniper
#

well how are your primary keys created

#

no, @quaint mantle

sterile breach
#

sorry

quaint mantle
opal juniper
#

well when you insert data you have a primary key in that table, what is it? You could just check if that primary key exists in the table before inserting

simple schooner
#
public void onPlayerChat(AsyncPlayerChatEvent e){
        Player p = e.getPlayer();

        if (plugin.playerCreatingHologram.containsKey(p)){
            String hologramMessage = e.getMessage();
            plugin.hologramText.put(p, hologramMessage);
            plugin.playerDoneCreating.put(p, true);
        }

    }```
#

am I doing it right

eternal oxide
#

INSERT INTO should not replace on MySQL

#

REPLACE INTO does

quaint mantle
opal juniper
#

as ElgarL said, INSERT wont overwrite

fast merlin
#

Hello, ive been trying for a while to find a way to be able to change the name above players heads as id like to add a rank and bounty next to the name but everything ive tried hasnt worked, does anyone know how to do this? even by using protocollib

#

i could use nametagedit but so far my entire server ive coded into 1 plugin and i would like to also make this myself

simple schooner
#

idk it sounds like it'll do the job

quaint mantle
eternal oxide
#

if you want no error use INSERT IGNORE INTO

fast merlin
simple schooner
#

oh damn

quaint mantle
remote swallow
#

friend requests seem something that shouldnt need to persist across restart

eternal oxide
#

send in a message? Not sure what you mean

quaint mantle
#

and see requests from this gui

quaint mantle
#

with sql and java ?

remote swallow
#

yeah

eternal oxide
#

if you already did a SELECT query you already know who are friends, so you know not to try and insert them again

remote swallow
#

why arent you saving the data to a map to start with tho

quaint mantle
#

but if they change server
doesnt accept requests in another server

sterile breach
quaint mantle
eternal oxide
rotund ravine
#

No? It makes sense

fast merlin
fast merlin
#
        armorStand.setCustomNameVisible(true);
        armorStand.setCustomName("test");
        armorStand.setGravity(false);
        armorStand.setVisible(false);
        event.getPlayer().setPassenger(armorStand);```
#

like that?

#

i put it in my asyncplayerchatevent

#

just to test

#

so how do i do a text display

#

dont think textdisplay is a thing in 1.8

#

so how would i do it in 1.8

#

isnt that exactly what i just tried tho

#

it didnt do anything

upper hazel
#

why do you need an instance of the main class, if you can just take it through the constructor of another class

#

who know

#

i mean getter

fast merlin
#

Cannot resolve method 'addPassenger' in 'Player'

#

because thats what my server is

eternal oxide
#

you are on your own with 1.8

fast merlin
#

potpvp servers are 1.7.10 - 1.8

#

sooo

#

Caused by: java.lang.IllegalStateException: Asynchronous entity add!

eternal oxide
#

runTask to add it sync

upbeat fog
#

My plugin uses a lot of resources, when I use this website that tracks the usage of plugins, I can see that my plugin uses 3 tasks and 1 event and only the first task uses up most of the resources. What can I do to optimize it?
(The last 2 tasks are basicly identical copies of the 1st one, with a few changes)

upbeat fog
#

In the code or in the tracker website?

lost matrix
#

What did you profile your plugin with? Spark or timings?

upbeat fog
#

timings

lost matrix
upbeat fog
#

can I send it in dms? I dont wanna send the link in the public chat

upbeat fog
#

I sent it

lost matrix
sterile breach
lost matrix
upbeat fog
lost matrix
#

The second one

upbeat fog
#
public void spawnHellMobs(int size, int mobCap, int spawnTime) {
        CustomHellMob[] mobTypes = CustomHellMob.values();
        task = new BukkitRunnable() {
            Set<Entity> spawned = hellEntities.keySet();
            List<Entity> removal = new ArrayList<>();
            @Override
            public void run() {
                for (Entity entity : spawned) {
                    if (!entity.isValid() || entity.isDead()) removal.add(entity);
                }
                spawned.removeAll(removal);

                // Spawning Algorithm
                int diff = mobCap - hellEntities.size();
                if (diff <= 0) return;
                int spawnAmount = (int) (Math.random() * (diff + 1)), count = 0;
                while (count <= spawnAmount) {
                    count++;
                    int ranX = getRandomWithNeg(size), ranZ = getRandomWithNeg(size);
                    Block block = world.getBlockAt(-233,52,-4);
                    double xOffset = getRandomOffset(), zOffset = getRandomOffset();
                    Location loc = block.getLocation().clone().add(xOffset, 1, zOffset);
                    if (!isSpawnable(loc)) continue;
                    double random = Math.random() * 101, previous = 0;
                    CustomHellMob typeToSpawn = mobTypes[0];
                    for (CustomHellMob type : mobTypes) {
                        previous += type.getSpawnChance();
                        if (random <= previous) {
                            typeToSpawn = type;
                            break;
                        }
                    }
                    hellEntities.put(typeToSpawn.spawn(loc), typeToSpawn);
                }
            }
        }.runTaskTimer(this, 0L, spawnTime);
    }
#

The tasks are basicly identical, the only thing I changed was the mobs to spawn and the location.

lost matrix
#

I see the problem. You are probably not checking if the chunk you are trying to spawn an entity in is loaded.
If you try to spawn an entity at an unloaded position then the chunk gets loaded first. This can be very expensive.

#

Wait i see a lot more issues...

upbeat fog
#

I copy pasted this from a video to replace the old custom mob/spawning system so I would apriciate some help.

lost matrix
#
Block block = world.getBlockAt(-233,52,-4);

This one could cause some lag if the chunk there is not loaded.

hellEntities.put(typeToSpawn.spawn(loc), typeToSpawn);

And this one will create a ton of lag.

#

Yes

sterile breach
upbeat fog
lost matrix
lost matrix
upbeat fog
#

and they are basicly indentical except for the mobs,location and the spawn time

lost matrix
#

I looked at the average, not the worst case

upbeat fog
#

Could it be that the spawn time causes the issue?

lost matrix
#

Send the first task as well. I see it being very heavy as well

#

Completely missed the 22ms per tick. Holy, that plugin is just a lag machine.

upbeat fog
#
    public void spawnWaterMobs(int size, int mobCap, int spawnTime) {
        CustomWaterMob[] mobTypes = CustomWaterMob.values();
        task = new BukkitRunnable() {
            Set<Entity> spawned = waterEntities.keySet();
            List<Entity> removal = new ArrayList<>();
            @Override
            public void run() {
                for (Entity entity : spawned) {
                    if (!entity.isValid() || entity.isDead()) removal.add(entity);
                }
                spawned.removeAll(removal);

                // Spawning Algorithm
                int diff = mobCap - waterEntities.size();
                if (diff <= 0) return;
                int spawnAmount = (int) (Math.random() * (diff + 1)), count = 0;
                while (count <= spawnAmount) {
                    count++;
                    int ranX = getRandomWithNeg(size), ranZ = getRandomWithNeg(size);
                    Block block = world.getBlockAt(-358,58,-122);
                    double xOffset = getRandomOffset(), zOffset = getRandomOffset();
                    Location loc = block.getLocation().clone().add(xOffset, 1, zOffset);
                    if (!isSpawnable(loc)) continue;
                    double random = Math.random() * 101, previous = 0;
                    CustomWaterMob typeToSpawn = mobTypes[0];
                    for (CustomWaterMob type : mobTypes) {
                        previous += type.getSpawnChance();
                        if (random <= previous) {
                            typeToSpawn = type;
                            break;
                        }
                    }
                    waterEntities.put(typeToSpawn.spawn(loc), typeToSpawn);
                }
            }
        }.runTaskTimer(this, 0L, spawnTime);
    }
#

Just like I said, this only differs in the location and the mob

#
        spawnWaterMobs(27, 15, 5 * 20);
        spawnHellMobs(27, 10, 10 * 20);
        spawnEndMobs(27, 10, 15 * 20);
lost matrix
#

Wait this is literally just copy pasted from the other task...

upbeat fog
#

Yes I know

lost matrix
#

Well... dont do that

upbeat fog
lost matrix
#

If you see yourself copy/pasting code then its time to take a step back and write something that can be
applied to all 3 cases with just one method.
Otherwise you going to have to fix the same code 3 times if you see a problem or want to make a change.

#

Anyways all of those tasks produce lag in the same way i described.

#

All 3 produce lag

upbeat fog
#

I'll fix them first and maybe increse the spawn time and lower the mob cap

lost matrix
#

How about you dont spawn mobs in unloaded chunks?

upbeat fog
lost matrix
#

Youll figure it out. Spawning mobs is a pretty hard task to get right.
And keeping track of mobs is as well.

upbeat fog
#

Yes I've noticed that. Before this one I was using an armor stand to spawn the mobs, and used an int to keep track of them 💀

lost matrix
#

Using a scheduler is also a very questionable approach

upbeat fog
#

What would you use to spawn custom mobs and keep track of them?

lost matrix
#

Events to keep track and scheduling to spawn

tame wolf
#

You could use NBT data to keep track of them no?

upbeat fog
lost matrix
chrome beacon
#

ah yes manual method obfuscation 💀

#

Your method names are a b and c

#

That's not how you're supposed to name things

#

Also when spawning an entity and you'd like to modify it you should use the spawn method that takes a consumer

#

This will ensure the entity is modified before it's spawned

ancient plank
#

I do love me some block displays

sterile breach
lost matrix
# sterile breach But if i need to keep the old instance ?

A gui is just a view of data. You should be able to view this data with a new instance without any problems.
So there is no need to keep an instance. But you can design a system to keep track of nested guis if you want.
There is an endless amount of approaches to this.

sterile breach
lost matrix
#

This way you dont have to open a new inventory. Simply use the same inventory and update the icons.

sterile breach
#

The index is in the old instance

echo basalt
#

are you opening a new gui for each page?

lost matrix
#

I dont know what you are doing... pass the index to the "new" instance then?
Why do you need multiple instances for pagination?

#

Just use one Inventory and re-decorate it.

sterile breach
echo basalt
#

little by little

#

hah

sterile breach
#

yes, but when I click on a new page, I open a new inventory.

echo basalt
#

What will happen in reality is that your cursor keeps resetting to the middle and the screen flashes for each page

#

which is very annoying

sterile breach
#

its true

echo basalt
#

If you're really concerned about items refreshing little by little just populate the item array instead

sterile breach
#

you have reason

echo basalt
#

But you shouldn't need to because bukkit doesn't send a packet for each setItem call iirc, just marks it as dirty and updates it at the end of the tick

sterile breach
#

okay, i try it

#

thanks

opal juniper
#

personally a fan of nesting the nms impls inside of another module

torn shuttle
#

spigot pls

#

I gave you my 2fa

#

I really don't have much time to update my resources

sterile breach
echo basalt
#

Inventory#getContents / setContents

sterile breach
#

ah set contents and give array?

opal juniper
#

yes

torn shuttle
#

spigot pls, I have to go in 1h20

eternal oxide
#

yeah I hate 2fa

torn shuttle
#

I am going to have a conniption

quaint mantle
#

i got this warnings in maven

#

bungeecord project btw

#

why ?

lost matrix
#

Because it provides transitive vulnerabilities...

#

Next question

quaint mantle
#

am i need fix ?

#

if i don't fix what happens ?

chrome beacon
#

Not much you can do to fix that. It's up to md and Bungee contributors to update dependencies

lost matrix
#

Keep your project up to date with the latest dependencies. Not much more you can do.

quaint mantle
#

well i see some versions of bungeecord in my minecraft project plugin

#

is this bungeecord versions or minecraft versions ?=

lost matrix
#

Hm maybe getting a newer version of the transitive dependencies and relocating? Let me think if that makes sense.

sterile breach
#

i'm having a problem with maven to add another plugin of mine in dependency of my plugin. can i ask my question here? or is it inappropriate?

lost matrix
sterile breach
#

well

lost matrix
#

Never add jars to your maven project.
Are you trying to do that?

sterile breach
#

yeah

#

    <repositories>
        <repository>
            <id>ServerCore</id>
            <url>C:\Users\Aser\Desktop\maven</url>
        </repository>
        <repository>
            <id>spigotmc-repo</id>
            <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
        </repository>
        <repository>
            <id>sonatype</id>
            <url>https://oss.sonatype.org/content/groups/public/</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>fr.dylors</groupId>
            <artifactId>ServerCore</artifactId>
            <version>1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.spigotmc</groupId>
            <artifactId>spigot-api</artifactId>
            <version>1.19.2-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

I'm trying to add the local ServerCore dependency located in C:\Users\Aser\Desktop\maven
ServerCore-1.0.jar

maven returns this error
Impossible to transfer the artifact fr.dylors:ServerCore:pom:1.0 from/to ServerCore:pom (C:\NUsers\NAser\NDesktop\Nmaven) : Impossible to access C:\NUsers\NAser\NDesktop\Nmaven with type default using available connector factories : BasicRepositoryConnectorFactory

lost matrix
#

Just run mvn install on your other project.
This way its installed in your local maven repo and you can use
the dependency in your other maven poms.

sterile breach
#

in inteleji, is the install mvn available in the maven menu? (the comand path mvn is not implemented on my system).

#

ok that's work

#

after i just add dependecy and he finds it all by himself?

#

thats work

#

thanks

quaint mantle
tender shard
#

^

quaint mantle
#

oh

#

this is good

#

ty

sterile breach