#help-development

1 messages · Page 1511 of 1

weak mauve
#

that what a nerd would say

#

you havent heard hypixel

#

?

dire marsh
#

they literally showed statistics on that in their 1.8 removal announcement

narrow vessel
#

this is devolving into a 1.8 bad discussion can you please ask elsewhere about 1.8 questions

quaint mantle
weak mauve
night geyser
#

Download issue: Cannot wget plugins from your website ( Ubuntu server). getting 503 Error. is there a location to get direct download links?

dire marsh
#

yes

dire marsh
#

we are trying to remove idiots

#

ok bye

quaint mantle
#

nah they aren't, its just not updated so why use it (i get people host servers on that version but yeah)

#

just update honestly

#

This is support for the latest spigot usually, so if you are wishing support for an older version go elsewhere

chrome beacon
weak mauve
#

minikloon, one of hypixel greatest developer, he would said that they will modify spigot or bukkit to compatible with newer version, but never removes 1.8

dire marsh
#

the main problem is you're asking about the particle api which is absolute shit to work with in 1.8

lusty cipher
dire marsh
#

????

weak mauve
#

you can use viaversion

dire marsh
#

via version does nothing for 1.8 mechanics

narrow vessel
#

@weak mauve please move this discussion elsewhere this is a development channel not a 1.8vs latest channel

#

or simply shut up

weak mauve
#

no

#

what can you do

dire marsh
#

lol

weak mauve
#

tell admin

#

lol

dire marsh
#

yes you should ping md_5 @weak mauve

weak mauve
#

im not yelling at anyone

narrow vessel
#

sure @dusty herald

weak mauve
#

ye ping him

#

idc

#

what they can do, ban me

narrow vessel
#

Yes.

weak mauve
#

no big deal

hybrid spoke
#

yup, for being rude

weak mauve
#

lol

quaint mantle
hybrid spoke
hybrid spoke
#

there is someone

narrow vessel
#

@ancient plank

hybrid spoke
#

but i cant remember his name

weak mauve
quaint mantle
weak mauve
#

im here cause it's "faster"

quaint mantle
#

still not it

weak mauve
quaint mantle
#

I'm here because it's faster.

ivory sleet
#

Can we just chill out with this non sense

quaint mantle
#

yeah my bad

weak mauve
ivory sleet
#

l6ol you too

weak mauve
#

ok

#

noice

manic dawn
#

Hello, does anyone knows if the material IDs on the bukkitAPI materials class are like random or do they need to be specific?

weak mauve
#

mc community between bedrock and java is chaotic enough

#

not this anymore

hybrid spoke
#

if you mean that

narrow vessel
dire marsh
#

id's aren't used anymore though

ivory sleet
#

Yeah I already warned him

dire marsh
#

speaking of which, really wish they'd remove the legacy prefix stuff from the material enum

hybrid spoke
#

yeah

narrow vessel
#

was more about their entire message history but ok

dire marsh
#

gross

#

internal ids still used, forgot about that

hybrid spoke
#

did you reload your maven/install every dependency/rebuild it?

manic dawn
dire marsh
#

im guessing it's just an identifier...

hybrid spoke
#

did you also shade it in? or is it a plugin which is already on your server?

manic dawn
#

Thank you 🙂

dusty herald
sour rampart
#

How can I save a player's inventory? (It should not reset on server restart)

opal juniper
#

Is this not default 🙃

quaint mantle
#

guys how to set a Red Wool using Location.getBlock().setType(...) ?. For Minecraft 1.8.8

dire marsh
#

setType(Material.RED_WOOL)

#

1.8 not supported

#

use data value thingy

plain quest
#

how can i call an event synchronously from an async thread for example i have a netty thread and i want to call an event when a specific packet is read but when i use Bukkit#getPluginManger#callEvent(new ExampleEvent(playerInjectedToNetty, InfoFromThePacket) the event is async and i can't use the api methods inside it's event handler

opal juniper
#

You need to call it from the main thread

opal juniper
#

Then it will allow you to call it

plain quest
#

would that work Bukkit#getScheduler#runTask(Bukkit#getPluginManger#callEvent(...), plugin)?

opal juniper
#

args the other way around but yes

#

its plugin first and then use a lambda

plain quest
#

ok anyway i got it

#

let me try it and i'll get back if it doesn't work

opal juniper
#

sure

burnt current
#

Hey, quick question:
I am currently programming a villager which, when clicked on with a described book, changes its custom name to the display name of the book. So it should be called exactly like the book.
Here is my code for it:
event.setCancelled(true);
```java
if(player.getItemInHand().getType() == Material.WRITTEN_BOOK) {
if(player.getItemInHand().hasItemMeta()) {
ItemStack Book = player.getItemInHand();
BookMeta bookMeta = (BookMeta) Book.getItemMeta();

                            this.NPC.setCustomName(bookMeta.getDisplayName());

                        } else
                            player.sendMessage("this item has no ItemMeta");
                    } else
                        player.sendMessage("you don't have the right item in your hand");
                break;
            default:
                player.sendMessage("this NPC is not known to us");```

Unfortunately it doesn't work. Because whenever I then click on him with a book, he changes his customname to "Villager".

The console gives the following error message:

        at de.straussfalke.questplugin.commands.NPCHandler.handleNPCRightClick(NPCHandler.java:95) ~[?:?]

in the 95th line I have opened a switch statement that queries the customname from the clicked entity.
Does anyone happen to know how I could solve this problem?
Thanks in advance

jagged badge
#

Is there any way to change the time a particle appears/force the removal of a particle?
I read that the duration of appearance was hard-coded in the game... Is there a way to get around this with packets?

opal juniper
#

we need to see

#

that is what is actually causing the error

fiery inlet
#

So

#

What can i use # for

#

Instead of .

opal juniper
#

That is not actually a thing - it is how you express that something is a method under a class

fiery inlet
#

ohh

#

so if i make a method in a class

#

i do #method

opal juniper
#

Yes - but it won't work when you are coding

#

it is just a way of writing it

fiery inlet
#

hmm

burnt current
opal juniper
#

What class is the NPC - just an entity?

#

it seems that the custom name is null to me

gaunt hatch
#

EntityPlayer

burnt current
#

should i send you my whole class?

opal juniper
#

?paste yeah sure

undone axleBOT
burnt current
#

ok

#

please do not be alarmed at chat output i make the plugin in german

plain quest
opal juniper
plain quest
#

sure... wait

opal juniper
#

idrk why that wouldn't work

#

probably something stupid

plain quest
#

ye same error

quaint mantle
#

is there a gradle version of the specialsource maven plugin (for mojang mappings)

plain quest
opal juniper
#

🤷

#

i can only think it is something to do with the super cause it does sys out

burnt current
tame coral
#

Hi, i'm having trouble while trying to modify a packet to send with ProtocolLib, I can't figure out how to modify the packet for each player with different data each time

plain quest
plain quest
#

ok anyway thnx

tame coral
#

I'm trying to make an armor stand have a custom name depending on the player (for now i'm using the player's name)

opal juniper
fiery inlet
#

So how

tame coral
#

I've tried sending another EntityMetadata packet but i think this just end up in recursion as the event is called when i send the packet

fiery inlet
#

how do you make something happen every timespan

opal juniper
fiery inlet
#

yeah

#

sure

opal juniper
#

Use a runnable

#

The scheduler *

tame coral
#
Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () -> {
            something();
        }, after_x_ticks, every_x_ticks);```
opal juniper
#

yep ^^

north osprey
#

Hi guys, i wanna ask someone familiar with internals. For some reason when i try to use setBoundingBox to player, the player starts to burn. Could anybody explain why is this happening

fiery inlet
#

difference?

tame coral
#

I spent like 5 whole hours on google yesterday

opal juniper
#

the first is an initial delay

tame coral
opal juniper
#

before it runs the first iteration

#

yep

fiery inlet
#

so every 20 ticks, wait 1 tick and do x

#

ok

#

how would i do something like that for a player

#

just use that in a while player is online and use a scheduler?

tame coral
#

No need for a while here, as the scheduleSyncRepeatingTask() method already provides a loop

#

just put an if inside

fiery inlet
#

so

onJoinEvent(Playerconnectthing event){
  Bukkit.getScheduler().scheduleSyncRepeatingTask(this, () -> {
            if(event.getPlayer().isOnline()){
        doSomething()
        }
        }, after_x_ticks, every_x_ticks);
}
#

something like that

tame coral
#

Yes, but don't forget to unregister the task when the player goes offline, else it will add another task everytime the player reconnects

fiery inlet
#

so an else if for a break statement

young knoll
#

Just do else { cancel(); }

tame coral
#

No, just unregister the task

tame coral
fiery inlet
#

which is same as cancel?

#

ok ty

tame coral
#

np

fiery inlet
#

and how do you suggest saving a variable, such as a variable keeping a minute salary

tame coral
#

Inside the event class I guess

fiery inlet
#

but what if i want to do a command like
/salary set %player% %int%

#

in its own class

tame coral
#

You can and you should use a class with both a command and an event

fiery inlet
#

so i just make a public variable

tame coral
#

Yeah

#

I think so

tame coral
fiery inlet
#

but how does that save the variable

tame coral
#

No the example is for the event + commandexecutor class

fiery inlet
#

but how do you suppose i make player variables

tame coral
#

Oh

#

uhh

young knoll
#

Map

tame coral
#

I don't know, i'm not really fluent in java

fiery inlet
#

hashmap?

tame coral
#

They're probably speaking about this

young knoll
#

Map<UUID, WhatEver>

tame coral
#

It's like Javascript objects but in java i guess

fiery inlet
#

ok ty

tame coral
#

Modifying the entity just end up in changing the name for everyone

#

I'm trying to modify the outgoing packet

#

But i can figure out

young knoll
#

You can get the player from the packet event

tame coral
#

Yes i know

#

event.getPlayer()

young knoll
#

You should be modifying the packet you have, not sending another one

tame coral
#

Yeah but i don't know how to modify it

#

That's my problem

young knoll
#

Look up a guide for protocollib

tame coral
#

Already did

#

Tried to follow like 10 different tutorials, all either outdated or not what i was looking for

young knoll
#

I think it’s event.setPacketContainer

#

Or something like that

tame coral
#

oooooh

#

It's setPacket()

#

i'll try it, thanks !

#

Hmmmm

#

Tell the server owners to download the library themselves ?

chrome beacon
#

^^ or use maven and minifyJar

#

Or if you need even smaller use ProGuard to minify

ornate hollow
#

I would really like to use spring data jpa in spigot, can somone point out what should i look for while doing so, is it just putting in the jpa dependecy from maven? Thank you (i know that i will probably require to create reposiotry implementation classes singleton myself but hey its much ezier for making queris)

quaint mantle
#

Hi, anyone knows why Block.setType(Material.WOOL) isn't placing the blocks? I'm on Minecraft 1.8 and i'm not getting any errors

fiery inlet
#

so i went over to persistent data container, how would i check if a variable is set in the on join event with that, and then set it

sour rampart
opal juniper
#

Which versions Is the Libraries feature available in

wraith prawn
#

Hello. I have an issue. I update player's skin at LoginEvent, with the methods that allows that event. It works good, but for Premiun Players. I mean, they can see its skins and others (only premiums). But for people are not, they see (no-premium), TLauncher's skins.

Anyone knows how to resolve that? I had to use that custom way to set skin because I have a offline server and if you are in that, you can not set skins to others by packets or those things. I mean, they cannot see others' skins.

I need help with that.

eternal night
#

1.16.5 latest has library features

#

that is the first version of get that feature

mortal hare
#

nice hotkey on intellij which i recently found out

#

if you press CTRL

chrome beacon
mortal hare
#

and minus sign

#

it would minify the code

#

inside the brackets

wraith prawn
mortal hare
opal juniper
#

thanks

chrome beacon
#

We do not support piracy

fiery inlet
#

how do i get a player in an argument

mortal hare
#

profit

#

server hardware doesnt grow on trees

#

i do not support piracy, but that's how it is

wraith prawn
wraith prawn
wraith prawn
mortal hare
#

As far as i know there's no way to render premium skins on tlauncher clients

#

because they use some kind of rerouting or game modification to

proud basin
#

I remember reading something about TLauncher shutting down soon or something lemme see if I can find it

mortal hare
#

route the skin requests to their own servers

#

that way client doesnt even know that premium player is legit

#

since there's no data on tlauncher side

wraith prawn
mortal hare
#

that's my hypothesis

#

i don't know if that's true but it should be i think

#

never tried looking inside auth libraries of mojang

wraith prawn
mortal hare
#

on skin system

#

but if it worked

#

try creating bungeecord plugin then

#

idk

wraith prawn
wraith prawn
mortal hare
#

well actually

#

bungeecord is offline moded

#

so it should be the cause

#

you basically need bungee version of skinsrestorer

fiery inlet
#

erm

#

Caused by: java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "org.bukkit.persistence.PersistentDataContainer.get(org.bukkit.NamespacedKey, org.bukkit.persistence.PersistentDataType)" is null

#

what to do about this lol

broken lava
#

is anyone else experiencing issues with mobs being counted as players?

chrome beacon
#

No?

chrome beacon
fiery inlet
#

exactly

chrome beacon
#

Maybe do something about it 👀

fiery inlet
#

but i dont know how to fix it

#

wat

quaint mantle
#

Im new to java, how do i shrink something like this?

        if (Blockname.equalsIgnoreCase("Barrel")) {
          if (blockState instanceof Barrel) {
            Barrel block = (Barrel)blockState;
            block.getInventory().clear();
          } 
        }
        else if (Blockname.equalsIgnoreCase("Chest")) {
          if (blockState instanceof Chest) {
            Chest block = (Chest)blockState;
            block.getInventory().clear();
          } 
        }
        else if (Blockname.equalsIgnoreCase("BlastFurnace")) {
          if (blockState instanceof BlastFurnace) {
            BlastFurnace block = (BlastFurnace)blockState;
            block.getInventory().clear();
          } 
        }
chrome beacon
sage swift
#

or use getOrDefault

chrome beacon
sage swift
#

🤔

quaint mantle
chrome beacon
#

Do you know what casting is?

quaint mantle
#

nah mate

#

ill look it up

chrome beacon
quaint mantle
#

but i barely know anything

chrome beacon
#

?learnjava Highly recommend 🙂

undone axleBOT
gaunt hatch
#

anyone know a better way then to use getNearbyEntities()

chrome beacon
#

Better way for what

gaunt hatch
#

To get the list of entity in a radius

#

Can't async a thread with that method anymore

chrome beacon
#

You shouldn't async thread what you're trying to do anyway

#

Bukkit API should be avoided off thread

gaunt hatch
#

Yes and No if you build it right

#

Just wondering if there is a better way to get the entities in a set location raduis

#

I can change my task to do a call back to the main thread with a SynchronousOperation on the async task

#

Just dont like what getNearbyEntities does

ivory sleet
#

SynchronousOperation is still not a thing

gaunt hatch
#

hmm yes it is

ivory sleet
#

Link me it

#

I would be happy if you can show me it

gaunt hatch
ivory sleet
#

That’s not in spigot api nor java std lib

gaunt hatch
#

the idea is the same

#

just in .net vs java

ivory sleet
#

You call it like it is a class

#

Well Java isn’t .NET

gaunt hatch
#

But the idea of a threading practice is the same

#

Everything is a class the function of what you are doing to the thread is SynchronousOperation on aysnc thread to do a call back to the main thread and await a respond to keep going on the async thread from the main thread

ivory sleet
#

That doesn’t mean the name SynchronousOperation makes sense in Java

gaunt hatch
#

Its advance threading.

ivory sleet
#

?

#

No it’s a non existent class in Java

gaunt hatch
#

...

#

not everything has to be a class in java for it to be a idea

ivory sleet
#

Sure I get what you mean but that idea isn’t called SynchronousOperation, I am pretty sure that’s just a class in C# or smtng isn’t it?

gaunt hatch
#

la sigh...

ivory sleet
#

Anyways the term async task or just sync task will make more sense to people here

gaunt hatch
#

15 years coding for a living make me think different, I guess lol

ivory sleet
#

Well, just concerning most people here only develop in Java and haven’t tried .NET so talking about something like SynchronousOperation especially when you use it with the UpperCamelCase people here might get the wrong idea of that being some sort of class and what not. Anyways I guess the name is still self explanatory PES2_Shrug

gaunt hatch
#

Like a task is a thread, and threads work the same in .net or java or anywhere, you hook into the main app pool or move it out side of the pool. Its all the same

#

And threading has way more option then async and sync when you start to get hit the advance stuff

#

Bukkit/Spigot is pretty limit on the threading

ivory sleet
#

I mean a thread is a thread, a task is necessarily not a thread

gaunt hatch
#

Its just a fancy work for a thread

ivory sleet
#

Uh well I disagree but anyways that’s besides the point

gaunt hatch
#

So in a nut shell I wont get much help here then that is what your saying lol

ivory sleet
#

And also spigot being single threaded is quite advantageous since we don’t have to synchronize stuff all the time and use some sort of lock mechanism.

gaunt hatch
#

its not though

#

you can go out of that thread

#

the game it self is yes, but you can code outside and find a new thread

ivory sleet
#

Of course you can but if we are working in a multi threaded environment we still need to make sure everything which might be called async is thread safe

tame coral
ivory sleet
#

That often requires the use of volatile variables and locking stuff in order to avoid certain issues which may be encountered in a non thread safe multithreaded environment

gaunt hatch
#

Taskchain sound like the native features build into .net but for java

ivory sleet
#

In kotlin we got courotines or whatever it’s called which is also quite neat

hardy swan
#

anyways what's wrong with creating a nested bukkitrunnable in an async thread and runTask it lol

gaunt hatch
#

cause the task is running free while the async is still running

#

you are not waiting for the action to return and can cause a desync in the async task and data and cause issues

#

when you do that in a multi thread env you want to call back to the main thread from a async thread and wait for the respone so the async thread can keep moving based on what was changed

hardy swan
#

oh you want input from the main thread on your async thread

#

ok

gaunt hatch
#

doing the bukkit way is not very safe when you start to code thinking multi threading its very limited

hardy swan
#

but that's prob one of the only ways you can callback to the main server thread

#

other than taskchain

gaunt hatch
#

there are lots of ways if you code it

opal juniper
#

Is there an easy way to check if a class is available @ runtime

ivory sleet
#

Class::forName

gaunt hatch
#

And when you want to do heavy math but also what to check entitys you can aysnc that thread and just call back to get the entity list and then go back to aysnc with a wait clause on the call back

ivory sleet
#

Oh yeah that might include a lot of thread hopping

hardy swan
#

how heavy must the math be to resort to that

gaunt hatch
#

vector math gets there lol

quiet ice
#

It is rare that it is done to this extent

gaunt hatch
#

tbh anything that can cause a delay should be there, but like before i got crap for trying to save millseconds on a for loop tryign to explain it all adds up and optimiztion is key when it cames to this kind of stuff.

#

But what do I know right lol

jade perch
#

more threads = more power 🤮

gaunt hatch
#

not if you build them right

quiet ice
#

The issue I have with async is that often async means "run it later but not now"

gaunt hatch
#

1 thread to do all the work not call 1 thread for each work

#

that is not right

hardy swan
gaunt hatch
#

async means outside of the main thread

#

there is a delay option built into bukkit but you can do 0L and have it run right away

quiet ice
gaunt hatch
#

yes it is, supried someone knows that tbh

quiet ice
#

The definition of async is that you have no fucking idea when it runs

gaunt hatch
#

its pooled or queued yea

hardy swan
#

concurrency also means you have no idea how it runs

quiet ice
#

Well, depending on your architecture that is

hardy swan
#

in accordance to each other

gaunt hatch
#

well you can override the poll and prioptoze it in the thread pool.

#

And have it run run right away

#

Some of my threads do that with sync locks so its controlled outside of the thread pool

quiet ice
#

got me

gaunt hatch
#

So i control when it runs not java

mystic tartan
#

how can you get the person who lit some tnt and which event would you use?

quiet ice
#

You could check in the PlayerInteractEvent

chrome beacon
#

BlockIgniteEvent

#

;/

mystic tartan
#

ah, ty

hardy swan
#

I almost want to say EntitySpawnEvent

quiet ice
hardy swan
#

wat other blocks are ignitable

ivory sleet
#

That’s like the only block isn’t it

hardy swan
#

ohh wait, doesn't the use of flint and steel on any block call it then

ivory sleet
#

Yeah true

hardy swan
#

does the use of fireball call it?

chrome beacon
#

Anything that creates fire

hardy swan
#

wat if lightning strikes the tnt, it will just detonate

chrome beacon
#

Yeah

#

It will be primed then explode

spiral hare
#

Hi guys! I have problem with 1.17 and skript.

 Can't understand this condition/effect: set action bar of player to "&bPozostalo &4%{nethertime.%player%}% &bsekund/y przepustki" (przepustka-new.sk, line 286: set action bar of player to "&bPozostalo &4%{nethertime.%player%}% &bsekund/y przepustki"')

Can't use actionbar for anything. Someone know why and how to fix it?

hardy swan
chrome beacon
hardy swan
#

like sth that caused fire

#

oh

chrome beacon
lean gull
shadow gazelle
#

Items with them were working before, but now they just do nothing.

quiet ice
shadow gazelle
#

This is what get printed when I print the data from the pickaxe used to break a block. As you can see, it doesn't show an enchant. But that same item, has an enchant according to NBTExplorer.

ItemStack{NETHERITE_PICKAXE x 1, UNSPECIFIC_META:{meta-type=UNSPECIFIC, lore=[{"extra":[{"bold":false,"italic":false,"underlined":false,"strikethrough":false,"obfuscated":false,"color":"gray","text":"Telekinesis"}],"text":""}], Damage=21}}
#

NBTExplorer ss

mystic tartan
gaunt hatch
mystic tartan
#

how would I get the player igniting it?

chrome beacon
#

That would be called when it's about to explode

gaunt hatch
#

check the event

#

objects should in there

tame coral
#

PlayerInteractEvent should be good i guess, as you can check which item has the player in hand

#

Check if it's a flint and steel or a Fire charge and you're good

gaunt hatch
#

you can do the same with ExplosionPrimeEvent and that is only when something is primied not on every time the player does something

tame coral
#

True

gaunt hatch
#

always avoid PlayerInteractEvent unless you really really needed 🙂

tame coral
#

You can't get the player with ExplosionPrimeEvent though

gaunt hatch
#

hmm

tame coral
mystic tartan
#

for primed tnt getSource does it return a player?

gaunt hatch
#

not everything will have getplayer

#

you have to play and see what you can get

tame coral
#

Yeah debug is the best thing to do i guess

gaunt hatch
#

event.getEntity() ?

tame coral
#

Will probably return the TNT itself

gaunt hatch
#

no harm in trying it

tame coral
#

Indeed

gaunt hatch
#
    {
        Bukkit.broadcastMessage(event.getEntity().toString());
    }
#

easy test

#

See what returns

tame coral
#

^

mystic tartan
tame coral
#

Nice

flat kite
#

Hey guys does spigot support tnt duplicators?

tame coral
mystic tartan
tame coral
#

Oh i see

gaunt hatch
#

there you go 🙂

chrome beacon
tame coral
#

TNTPrimed actually has methods

mystic tartan
#

indeed

gaunt hatch
#

yea i would do a instance check before the player set

tame coral
#

if (primedTNT.getSource() instanceof Player) {} ?

#

I guess that would be this

gaunt hatch
#

correct

marble granite
#

can i create a recipe with custom items? i create a custom itemstack from a config every time the server starts, but it doesnt stack with the last server restarts items. this item is gathered by crafting

tame coral
#

Hmmm

#

Datapacks ?

gaunt hatch
#

yes

#

is the item from crafting and the custom item the same item?

torn shuttle
#

is there still no way to increase max durability on items?

marble granite
#

i have this to register the recipe:

        recipe.shape("*", "*", "#").setIngredient('*', new RecipeChoice.ExactChoice(Items.COMPACTED_DIAMOND_BLOCK.getItem())).
                setIngredient('#', new RecipeChoice.ExactChoice(new ItemStack(Material.EMERALD)));

and the itemStack is created every time:

ItemStack is = ItemLoadUtils.getItemFromConfig(Items.COMPACTED_DIAMOND_SWORD.getname());
gaunt hatch
#

So it might be due to the nbt data being diffrent

torn shuttle
#

this has to be one of the weirder restrictions of the game

gaunt hatch
tame coral
torn shuttle
#

the fuck

marble granite
torn shuttle
#

why did I get 3 back to back reviews

tame coral
#

Hmmmm

#

Bots ?

#

Friends reviewing together ?

gaunt hatch
marble granite
#

so i'm gonna have to do without NBT tags?

gaunt hatch
#

try looking into PrepareItemCraftEvent

marble granite
#

i will then

gaunt hatch
#

You can check the recipe matchs your custom one and then overrdie the results with your custom item

torn shuttle
#

well all 3 reviews couldn't be more different from each other so I am guessing not friends nor bots, just weird

#

holy shit it finally happened and I didn't even realize it

torn shuttle
#

spigot changed the way stars are calculated

#

on reviews

#

they now actually average out so it's possible to have 5 stars again lol

#

aw sick 5 stars

tame coral
#

Nice

torn shuttle
#

feels good

tame coral
#

what plug-ins have you made ?

torn shuttle
#

elitemobs

#

ok so how do I add durability to an item without increasing max dura

#

obviously unbreaking, how well does that scale?

chrome beacon
#

PDC and cancel durability event maybe ;/

gaunt hatch
#

oh hey i have decomplied that (elitemobs) to see how you did something years ago lol

tame coral
torn shuttle
gaunt hatch
#

I see that now, i think at the time i never thought to look for that stuff.

quaint mantle
unreal sandal
#

Hello, I would like that the player sees an amount of one item for an item, is it possible ?

torn shuttle
#

how is damage calculated though

#

if it passes

chrome beacon
torn shuttle
#

man I gotta go dig up my original implementation of this

tame coral
torn shuttle
#

the feature

gaunt hatch
#

hmm

#

i think you can change max durability

#

but the current problem it is a final field and a short

unreal sandal
#

@tame coral Ah okay 😉 Me too I'm french. When you have 2 apples, you have the number 2 on the item, so i would like that the player sees the number one of the item but I don't know if it is possible.

gaunt hatch
#

so you can only get it to 32767

#

but i think its possible

torn shuttle
#

you can't change max dura

gaunt hatch
#

i think you can

#

i have changed maxStack before and durability is in the same place and looking the same idea

tame coral
quaint mantle
#

I think I will apply the mappings manually

torn shuttle
#

on est les plus forts

#

🇫🇷

tame coral
#

Wait what

#

You're French as well ?

torn shuttle
#

yep

gaunt hatch
#

i need to figure out how to edit a final object in java 16, that is the problem for this atm

tame coral
#

Damn

quaint mantle
#

I'm french too

torn shuttle
#

camarades c'est le moment d'envahir spigot

tame coral
#

Nobody expects the Spanish French Inquisition

unreal sandal
#

@torn shuttle 😄

quaint mantle
#

how i can to create custom light? 1.17

tame coral
#

Custom light sources ?

gaunt hatch
#

you dont need to

#

its build into minecraft now

tame coral
#

Ah yes

#

lightbulbs

gaunt hatch
#

^ Yup

tame coral
quaint mantle
#

ah

#

i can't place it in other blocks

#

i think to use it

#

but carpets and other passable blocks...

#

i can't replace it

tame coral
#

I see

gaunt hatch
#

you can put it anywhere and it set the light soruce at 15 and works out like a torch and adjust the level

tame coral
#

And invisible

gaunt hatch
#

y?

quaint mantle
#

because it can replace block

tame coral
#

check if there's a block at the position right before i guess

gaunt hatch
#

and move it up yea

quaint mantle
tame coral
#

Oh

quaint mantle
#

torch has the 14 level of light

#

;P

#

How do i add the placeholder api as a library?? o.o

gaunt hatch
#

if you punch it it goes down in the level

quaint mantle
gaunt hatch
#

right click i think

quaint mantle
quaint mantle
#

won't it be bad for the server from checking blocks around when a block is placed/destroyed/changed?

quaint mantle
quaint mantle
quaint mantle
tame coral
#

Hmmm

#

Probably i guess, depends on how many players there is

quaint mantle
tame coral
#

And how powerful the machine is

gaunt hatch
#

should be fine if you are not doing crazy math check in the method

dusty herald
#

I mean it depends on how many blocks you're checking too

quaint mantle
tame coral
#

You'll probably need a bit more of ram

gaunt hatch
#

4gb is fine

hybrid spoke
#

20*70mb + plugins & spigot

quaint mantle
#

that's all

tame coral
#

Because if all 20 players go mining at the same time it'll probably get laggy

gaunt hatch
#

just dont do crazy amounts of distacnce check

dusty herald
#

yeah 4gb is fine

tame coral
#

I see

dusty herald
#

but you might need more so keep an eye out 😂

#

you never know

quaint mantle
sour rampart
#

how can I access a public void while not in a main class?

quaint mantle
quaint mantle
dusty herald
#

or dependency inject

chrome beacon
quaint mantle
sour rampart
quaint mantle
hybrid spoke
sour rampart
gaunt hatch
#

y?

quaint mantle
#

create your own saver

gaunt hatch
#

why not use minecraft player saving

quaint mantle
#

and do not use one file for all player's

quaint mantle
sour rampart
#

how should I do it then?

gaunt hatch
#

minecraft savs players data when they logout

hybrid spoke
dusty herald
#

I think that they want to save it to memory to add it back in the future

gaunt hatch
#

y?

dusty herald
#

like remove previous inventory, add some items and then add their previous items back

gaunt hatch
#

like i can see if you are saving to a db

sour rampart
#

no im saving to a config

dusty herald
#

they just said that's what they want to do

quaint mantle
#

ah, i think you are talking about minecraft saving

dusty herald
#

I mean you could just save the inventory temporarily inside of a hashmap if you don't care about it being destroyed each time the server restarts

hybrid spoke
#

why do you question his idea?
do you have a code example of how you want to access your public void var? @sour rampart

sour rampart
#

What I'm trying to do: Creating a hub command that when a player does /hub from another multiverse dimension, their inventory is saved and then cleared in the hub. When they come back into that dimension, they get their inv back

hybrid spoke
#

or more like where you want to access it

sour rampart
#

sure

#

ill send the code

quaint mantle
dusty herald
#

You need to modify it to fit your classes

#

or xml

sour rampart
hybrid spoke
#

oh god

#

okay

dusty herald
#

question, why is this removing OP? 🤔

chrome beacon
hybrid spoke
#

and what var do you want to access where?

sour rampart
chrome beacon
sour rampart
hybrid spoke
hybrid spoke
# sour rampart wdym?

you said you want to access a public void anywhere. which one and where? what are you trying to do? or did your problem changed?

sour rampart
hybrid spoke
#

ah. why dont you just do plugin#saveinvtoconfig

sour rampart
#

wait thats a thing?

hybrid spoke
#

you have there an instance to your main class

#
    private Main plugin;

    public HubCommand(Main plugin) {
        this.plugin = plugin; // <-- referring to the in the parameter given Main class

        plugin.getCommand("hub").setExecutor(this);
    }
#

so you can access your method with your variable called plugin

sour rampart
#

oh

quaint mantle
#

ah shit. for light i need to check 15x15 territory

#

that's so big column

lean gull
quaint mantle
#

?paste

undone axleBOT
lean gull
#

wdym

hybrid spoke
lean gull
#

look at the image in the link i sent

dusty herald
#

?jd

dusty herald
#

🤷 spawn a bee at the player's location, set the anger to max and then set the target as the player 😂

dusty herald
#

I mean it works

#

can't set the exact location of the stinger mark but idk how to do

chrome beacon
hybrid spoke
#

not sure if there is a method to add a bee sting

dusty herald
#

i checked javadocs nothing exists

hybrid spoke
#

same

quaint mantle
hybrid spoke
lean gull
#

i wanted to make a spikey boi

hybrid spoke
#

otherwise just do what @dusty herald said, spawn an invisible bee which is angry af and has the player as his target. as soon as the bee stungs, remove it

#

or you can try to use packets/nms

chrome beacon
lean gull
#

what's nms and idk how to use packets

quaint mantle
chrome beacon
quaint mantle
#

Lol idk how to do that

chrome beacon
#

...

hybrid spoke
#
dependencies {
  // dep 1
  // dep 2
}

//delete this shit and move 3 and 4 to the above section
dependencies {
  //dep 3
  //dep 4
}
chrome beacon
#

Remove one of them and put the contents of it in the other one

lean gull
sage swift
#

m&ms are a candy

#

they are stored in (candy) packets

hybrid spoke
#

what about skittles?

sage swift
#

skittle api is very limited

#

sometimes you have to use m&ms

past maple
#

In 1.17, to set the id with NBTTagCompound (used for heads), it necessary to give a 4 int in a int[], but I don't know how to convert a UUID generated by UUID#randomUUID in an array of 4 integers

sage swift
#

String#split

eternal oxide
#

no

sage swift
#

ok towny man how would you do it

lean gull
#

skittle api lmfao

eternal oxide
#

Use getLeastSignificantBits() and getMostSignificantBits()

past maple
#

Yes, but it give only 2 integer

#

not 4

eternal oxide
#

no, it gives you 2 longs

#

you convert those to 2 ints

past maple
#

ah getLeastSignificantBits() return a long of 20 characters, so I can split in 2 ?

quiet ice
#

new ByteBuffer(new ByteBuffer(16).putLong(a).putLong(b).getArray()) and then you can invoke .getInt on it

#

Efficency 200

#

(or just use bit shifting, but that is boring)

sage swift
#

bit shitting

quaint mantle
#

You can just place it in the nbt as “most”, mostsSig

quaint mantle
#

And then least

#

Then you can call a new uuid with those two longs

past maple
#

Thanks,

slim kernel
#

Do you have an Idea on how I could make this:
I want to make a path from one player to another. What I mean is replacing all the Blocks to make a path.
I tried making a vector and replacing them like this but it didn't really work...
Can somebody help me?

quaint mantle
#

I want to cut my code and i need to call method using its name. That method returns ItemStack. How i can use it correctly?
My current code:

Method method;
            try {
                method = getClass().getMethod("ru.zacustoms.materials.Items." + getCBT(b).toUpperCase() + ".getItem()");
            } catch (SecurityException | NoSuchMethodException ex) {
                ex.printStackTrace();
            }
chrome beacon
#

Is that your class or another plugin?

quaint mantle
chrome beacon
#

Then there isn't a good reason for reflection here

quaint mantle
#

How i can use it correctly?

#

There are any prefer alternatives?

chrome beacon
#

You can store all of your items in a map

#

And get them by name from there

quaint mantle
#

i have an enum

chrome beacon
#

Then valueOF?

quaint mantle
#

ah

#

that can help me, yea?

chrome beacon
#

Yeah

#

Enum.valueOf(name of your entry).getItem()

#

Now make sure it exists before you call getItem on it

quaint mantle
#
Enum.valueOf(Items.class, getCBT(b)).getItem();
#

you are my safer

#

tysm

#

i'll try

chrome beacon
#

I mean not exactly what I intended but uh maybe probably that works

quaint mantle
#

I'll check and tell you.

slim kernel
#

Do you have an Idea on how I could make this:
I want to make a path from one player to another. What I mean is replacing all the Blocks to make a path.
I tried making a vector and replacing them like this but it didn't really work...
Can somebody help me?

chrome beacon
#

Could you show what you tried

lean gull
ebon siren
#

how would i check how a player died, for example if they burned to death or were killed by an arrow something unique would happen

chrome beacon
ebon siren
#

yes i know but

#

how would i check if they died because they drowned

#

or maybe died to an explosion

chrome beacon
#

getEntity().getLastDamageCause()

#

Do your "magic" after that ;/

ebon siren
#

thanks

#

👍

slim kernel
eternal oxide
chrome beacon
#

Also damn that's risky to call

scenic zenith
#

Is there a velocity plugin (like SkinRestorer) that does not have any commands or other functions and just gives all players skins even in offline mode?

chrome beacon
#

Add a cap or something

chrome beacon
slim kernel
scenic zenith
quaint mantle
#

@chrome beacon, that works. TYSM!

chrome beacon
eternal oxide
#

You would be better taking the start location direction (Vector) to the destination then loop over adding it each time to get each block until you reach the end

chrome beacon
slim kernel
#

oh okay 🙂

lusty cipher
lusty cipher
#

And honestly people who don't own minecraft after all this time I really don't understand

quaint mantle
#

Who doesent even have staff trying to enforce discord rules. That’s hilarious

chrome beacon
#

Don't have time to argue with another one of you

slim kernel
quaint mantle
#

Js he’s one of those kids be warned cause that shits sad that he cares that much

#

how i can to contain BlockData if i haven't current block?

rancid agate
#

Hello I have a problems i am posting my plugin on spigot.org but i don't understand "Link to the source code for this resource."

young knoll
#

Do you have the source hosted anywhere

slim kernel
rancid agate
#

@young knoll no it's important?

chrome beacon
#

So it just does the same thing over and over again

young knoll
rancid agate
#

okay thank you

slim kernel
eager sapphire
#

So.. I have an embarrassingly basic Java question
If I'm building against remapped 1.17 Spigot, I have to use Java 16 to build
Is there any way to do that but still make my plugin target Java 1.8 so people don't have to update Java to run it (assuming they're not on 1.17 Spigot)?

quiet ice
#

maven or gradle?

#

If gradle it is sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '11' if maven it is something like that but a bit different but I am too lazy to look it up rn

sacred vector
#

how can i get my custom recipes in the recipe book?

eager sapphire
#

I did try to target 1.8 though, let me try with 11 real quick instead

quiet ice
#

that is not true

eternal oxide
#

for maven its xml <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>

quiet ice
#

You can do that, not entirely sure why maven would tell that

#

Or

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>

if you already have the maven-compiler-plugin specified

eager sapphire
#

I was trying to make them different, like source=16 and target=1.8 .. I thought I needed source=16 but apparently not?

quiet ice
#

no

#

Not entirely sure what source and target do tbh

#

I think source is the bytecode version and target specifies what methods you can use? could be wrong there

chrome beacon
#

^^

eager sapphire
#

Yeah seems fine 1.8/1.8 🤷‍♂️
I guess I must've changed it to 16 while trying to get the build to work and thought it was part of the solution 😦

#

Well that's great news though, thank you!

#

Yeah all working great, brilliant, thanks so much!
Glad I wasn't afraid to ask a dumb question 😂

slim kernel
chrome beacon
granite stirrup
slim kernel
#

sry but I still dont get what you mean

shadow gazelle
undone axleBOT
next zinc
#

Simple question, but I've looked at this several times and see no issues yet I get an error when trying to give myself this item.

public ItemStack babyTear() {
        ItemStack babyTear = new ItemStack(Material.GHAST_TEAR);
        ItemMeta meta = babyTear.getItemMeta();
        meta.setDisplayName(ChatColor.DARK_GREEN + "Baby Tear");
        meta.addEnchant(Enchantment.DURABILITY, 1, false);
        meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
        List<String> lore = new ArrayList<>();
        lore.add(ChatColor.GRAY + "To view recipe" + ChatColor.YELLOW + " right click" + ChatColor.GRAY + "!");
        lore.add("");
        lore.add(ChatColor.DARK_GREEN + "Common Drop");
        meta.setLore(lore);
        babyTear.setItemMeta(meta);
        return babyTear();
    }
next zinc
#

mk

#

?paste

undone axleBOT
next zinc
quiet ice
#

is the stacktrace cropped?

slim kernel
next zinc
#

wym cropped

quiet ice
#

SOE usually produces a lot larger stacktraces

#

The full stacktrace is required to know where it performs the recursion

stone sinew
#

In 1.16.5 how can I check if a mushroom_stem is from a brown or a red mushroom?

young knoll
#

Check surrounding blocks

next zinc
#

it says that the issue is on line 186

#

which is just

return babyTear();
#

WAIT

#

bruh

#

im smart

stone sinew
next zinc
#

yep

#

I fixed it

#

I added ()

#

lmao

young knoll
#

Both mushrooms use the same stem block

#

So

next zinc
#

ty for the help

stone sinew
young knoll
#

Why would there be

#

They are identical

quiet ice
#

it certainly isn't bukkit API in either version

stone sinew
#

Need to know if the mushroom should be brown or red. Atleast with the nether blocks it says crimson or warped stem

quiet ice
#

it isn't something that is needed by the vanilla system so bukkit cannot infer it at all

#

Unless there is a difference in the data byte, but that one shouldve been removed by now

young knoll
#

It has

#

Big mushrooms don't grow on their own, so replanting isn't super necessary

dusty herald
#

damn they don't?

stone sinew
young knoll
#

That's not growing, it's world gen

stone sinew
#

🤦

young knoll
#

If you plant a small mushroom it will own grow into a big one when bonemealed

quiet ice
#

and it is growing like a sapling

stone sinew
#

"<saplings> don't grow on their own, so replanting isn't super necessary"

quiet ice
#

The same discussion can be made with swamp trees

stone sinew
quiet ice
#

Well, swamp trees are extra different because they have no sapling

young knoll
#

Saplings grown on their own

stone sinew
#

You can get the tree type from a log/leaves and get a sapling from it

atomic garden
quiet ice
#

But vanilla does not require to know the type of the stem to determine the type of the sapling

stone sinew
wraith rapids
#

what are we arguing about

stone sinew
chrome beacon
#

They are different blocks

#

You can check that

stone sinew
wraith rapids
#

i'm not sure if they are

quiet ice
wraith rapids
#

check the mushroom block blockdata

#

if there's no way there, there is no difference between a red and a brown stem

quiet ice
#

The distinction is no longer made at all starting from 1.13, and bukkit cannot recover that information

sonic dirge
#

^

#

Differentiating data literally does not exist any more. If you really need to know, you'll have to add and track metadata yourself.

quiet ice
#

even metadata will not help

stone sinew
wraith rapids
#

what is the use case exactly

atomic garden
wraith rapids
#

why are there 60k mushroom blocks on top of one another

#

and also how

quiet ice
#

well, not on top of another

#

But they could be spread out across the world

wraith rapids
#

what is he doing

quiet ice
#

Replanting it appears so

sonic dirge
#

I'm assuming something that uses mushroom stems as saplings?

#

i.e. grow the type of mushroom it came from.

stone sinew
wraith rapids
#

what

stone sinew
atomic garden
#

I mean this isn't the kind of thing that would be built into spigot

quiet ice
#

we already established that

wraith rapids
#

no, I am asking what are you doing

#

not what are you trying to

young knoll
#

They want to replace small mushrooms when a big one is chopped down

stone sinew
quiet ice
#

It is useless data, so why store it?

wraith rapids
#

surely you don't have to check 60k mushroom blocks all at once when someone chops down a mushroom

wraith rapids
#

someone is not going to have a fucking 60k block tall mushroom

stone sinew
wraith rapids
#

why do you care about adjacent stems

stone sinew
#

The build height is only 255 lol

sonic dirge
#

Now I kinda want to make a generator for a 60k mushroom lol.

stone sinew
wraith rapids
#

then there are only up to 255 blocks to check

quiet ice
#

I feel like a bit of optimisation can be done

wraith rapids
#

why are you checking multiple stems at the same time

#

a player can only break one stem at a time

quiet ice
#

Such as skipping every second block

stone sinew
wraith rapids
#

a mushroom can only be of one type at a time

#

only the type of the stem that is broken is relevant

stone sinew
wraith rapids
#

type of the stem as in the block above that stem

#

adjacent stems are irrelevant

#

blocks on top of adjacent stems are irrelevant

#

stem width is irrelevant

stone sinew
# wraith rapids adjacent stems are irrelevant

sigh it checks every block in the radius...if its a stem block with mycel/dirt underneath it checks every block above untill it finds a brown or red mushroom block.. then replaces it with a red or brown mushroom.

wraith rapids
#

why are you checking every block in a radius

stone sinew
wraith rapids
#

you are doing something redundant

wraith rapids
#

that is not an answer

stone sinew
#

That is an answer

wraith rapids
#

it is not an answer that has any value

#

does your lumberjack minion kill all trees in a 20 block range

wraith rapids
#

if so, that's entirely your fault for having to check so many blocks to begin with

stone sinew
wraith rapids
#

it's not an answer

#

it's the truth

#

if you need to destroy all mushrooms in a 20 block range, then you need to first find all mushroom blocks in a 20 block range

#

it has nothing to do with stems

stone sinew
wraith rapids
#

even if you could check the type of a stem directly, you'd end up doing the exact same amount of work

stone sinew
#

re read the whole convo please

wraith rapids
#

no

#

read what I'm saying

stone sinew
wraith rapids
#

you are locating mushrooms and then A*'ing them to cut them down

#

this process involves traversing up the stem to the blocks above to begin with

quaint mantle
#

What about Inventory#getTitle() for InventoryCloseEvent in 1.17?

wraith rapids
#

even if you could check the type of a stem directly, you would still have to do that

quaint mantle
#

how i can get title of closed inventory?

wraith rapids
#

that you have to check 60k blocks is just because you are finding 60k blocks, not because you are finding stem types

stone sinew
wraith rapids
#

you are cutting down an entire mushroom, yes?

#

not just the 1 lowermost block, yes?

stone sinew
#

Take this picture for example... Which stem is a red mushroom or a brown mushroom?

wraith rapids
#

those aren't huge mushrooms

stone sinew
wraith rapids
#

why didn't it remove the stems

sage swift
sonic dirge
#

Well that seems like the lumberjack's problem?

sage swift
#

but please don't use the name of the inventory to find your FUCKING custom inventory

stone sinew
quiet ice
#

instance comparision!

wraith rapids
#

you can, yes

stone sinew
wraith rapids
#

you can

stone sinew
#

You have to check the blocks above the stem

wraith rapids
#

by plugging it into the A* you use for actually cutting down the mushroom blocks themselves

#

you do, yes

#

but you're already doing that

quiet ice
#

That is kindof useless since they are already doing that either way with the lumberjack algo

stone sinew
sonic dirge
#

Ok, convo done. ^

quaint mantle
wispy fossil
#

lol

stone sinew
sage swift
wispy fossil
#

he's right 1.13 did break alot
but it's still doable

wraith rapids
#

consider using a y keyed treemap

#

and finding the next highest key

marble granite
#

i have a custom item (a "compacted diamond") that i can use to craft other custom stuff. now, when i restart the server, those cant be stacked with newly created ones, nor be used to create another custom item
https://pastebin.com/cYCf56Vt
(you just put in a configuration section and you get the item the section represents)
how can i fix that?

#

is it the NBT tags?

wispy fossil
stone sinew
wraith rapids
#

fine, do it as redundantly as you will

#

i tried

quiet ice
#

Aren't treemaps inefficent for that?

wraith rapids
#

depends on what you're doing

#

for purely random access yes, they're slower

#

but the advantage is that they're sorted

#

that is, you can get the nearest block B above block A in logarithmic time

#

there are several other ways as well that can be used but that is the first one that comes to mind

#

if only one mushroom is processed at a time, just a x/z map will suffice

stone sinew
#
for(int b = 1; b<=10; b++) {
    Location check = new Location(remove.getWorld(), remove.getLocation().getBlockX(), remove.getLocation().getBlockY()+b, remove.getLocation().getBlockZ());
    check.add(0,b,0);
    Material checkType = check.getBlock().getType();
    if(checkType == Material.getMaterial(pl.getItemMethods().materialFromVersion("RED_MUSHROOM_BLOCK", (short)0)) 
        || checkType.name().contains("HUGE_MUSHROOM_2") || checkType.name().contains("RED_MUSHROOM")) {
        remove.setType(Material.getMaterial(pl.getItemMethods().materialFromVersion("RED_MUSHROOM", (short)0))); replaced = true; break;
    }else if(checkType == Material.getMaterial(pl.getItemMethods().materialFromVersion("BROWN_MUSHROOM_BLOCK", (short)0)) 
        || checkType.name().contains("HUGE_MUSHROOM_1") || checkType.name().contains("BROWN_MUSHROOM")) {
        remove.setType(Material.getMaterial(pl.getItemMethods().materialFromVersion("BROWN_MUSHROOM", (short)0))); replaced = true; break;
    }
}
``` I have to run this on every stem thats on top of mycel or dirt so if there is 60k stems.... times it by a max of 10
This is the code I'm replacing its over 4 years old.
wraith rapids
#

again, no you don't

#

or, well, you do, but that work is already done anyway by virtue of the mushroom being A*'d to find the blocks to destroy

#

so there is no increase in the amount of computation required

stone sinew
#

1.13 removed the ability to check which mushroom a stem is from. I asked if 1.13+ had a new way to check. It doesn't... Convo ended. You brought it back up. I explained everything over again. You are now just repeating exactly what I already do. Convo done.

wraith rapids
#

i'm telling you there is a less fucking retarded way of doing it that tracing each mushroom back up for every individual stem block

quiet ice
stone sinew
#

Thats why its being recoded lol

wraith rapids
#

then maybe take heed of my suggestion to improve it instead of convo-done'ing it without even trying