#help-development

1 messages · Page 1125 of 1

chrome beacon
#

It's quite literally blockState.copy(location)

#

which is why I said copy it to the locations you want

dapper flower
#

ok didn't saw that alr ty

#

I hope all these create operation won't do more harm than good

chrome beacon
#

Looked at the source it should be fine

#

at least the copy location part

#

Initial setup of the states could probably cached

#

explode

eternal oxide
#

there shoudl be a prime event

timber mason
#

Hi how can i open news GUI without moving my cursor

#

Like hypixel menus profile

#

Cuz every time i open menu my cursor moves

blazing ocean
chrome beacon
#

(Don't call closeInventory)

timber mason
#

New

chrome beacon
#

yes

timber mason
#

Okapy

#

Okay

#

I will try

humble tulip
#

OpenInventory closes the old inventory

#

Sooo that won't work

#

What version are u using @timber mason

#

In older versions it resets ur cursor

#

What u can do is just modify the current inv instead of opening a new one

lost matrix
#

The cursor does not get reset if you simply open a new inventory without manually closing the old one

slender elbow
#

but what about 1.6 clients ???

sullen canyon
#

@lost matrix hey Smile, if I use redisson with an Rmap and access it/modify frequently, I have to do it on another thread, right? I mean if I am trying to make executions on bukkit thread in first place, I have to switch to another one or it's fine

urban escarp
#

am sowy, but any ideas why even debug doesn't work? class is imported in main class


    @EventHandler
    private void onBreak (BlockBreakEvent event) {
        Player player = event.getPlayer();
        player.sendMessage("@"+player.getInventory().getItemInMainHand().getType().name());
        player.sendMessage("dxNX");
eternal oxide
#

you didn;t register the listener

urban escarp
#

I did register it. wrong api version

#

ffs

#

so dum dum mistake

echo basalt
#

dead chat lol

hybrid turret
#

mornin yall

blazing ocean
#

heloo

hybrid turret
#

:cat_happi:

#

wait what

#

why

#

i have nitro

sly topaz
#

is there no way to get the vanilla food component for an ItemStack/Material

hybrid turret
#

sounds like nms but idk tbh

#

sorry

sly topaz
#

I know how to do it using internals, I'm asking if there's an API way to do it

#

I feel like there was a way to get the default item meta for a certain material, but I don't remember what it was

hybrid turret
#

wait what's your plan

#

what are you trying to accomplish?

sly topaz
#

get the nutrition value of a default food in mc, say, an apple

hybrid turret
#

(1.18 but i'm pretty sure that's still the case)

hybrid turret
#

or hacky FoodLevelChangeEvent lol

sly topaz
hybrid turret
#

oh wait, the ItemFactory has createItemStack(String) does that mean i can give the player an item based on input? (basically like /give)

sly topaz
#

yes

quaint mantle
#

Which event is triggered when using a totem of undiying? The EntityDamageEvent?

hybrid turret
#

mhhh EntityPotionEffectEvent if i had to guess?

#

maybe not

#

wait

#

oh yes it is

#

EntityPotionEffectEvent.Cause contains TOTEM

#

so i suppose that's what's applied

quaint mantle
#

ohh okey thanks!

hybrid turret
#

np ^^

#

@quaint mantle apparently i lied lol

quaint mantle
#

1.21

#

let me check

#

Yeah its that event!

#

Thanks again Shioku!

hybrid turret
#

np :)

sly topaz
#

well, I just got confirmation that there's no way to get the vanilla/default food component for a specific Material/ItemStack via API, sucks to suck I guess

hybrid turret
#

interesting, the event is always calle when the player could be resurrected.
It's just cancelled. So if you were to:

@EventHandler
public void onRes(EntityResurrectEvent e) {
  e.setCancelled(false);
}

it would always resurrect. That's kinda cool

hybrid turret
#

?jira

undone axleBOT
sly topaz
#

I'd imagine someone already did, and I am not particularly interested in creating an issue without having detailed a possible implementation for that, so I'll just go for internals

hybrid turret
#

Isnt... the imlpementation the spigot teams issue? :thonk:

#

why tf can i not use those emotes?!

#

i legit have free nitro this month wth

echo basalt
#

gotta boost

hybrid turret
#

do you have to be server booster?

#

oh

blazing ocean
#

boost fr

hybrid turret
#

shit cant remove boosts from other servers right? lmao

echo basalt
#

you can transfer em

hybrid turret
#

"This boost is on cooldown"

#

tf does that mean?

echo basalt
#

you can only transfer it after like a week

hybrid turret
#

ohh

#

yeah 7 days

#

well

#

wait a couple days then i'll boost for the rest of the month ig lmao

sly topaz
#

there I did it for you

hybrid turret
#

heck you

#

lmao

#

damn server needs 14 for level 3 but has over 30

echo basalt
#

and half of them are active members

hybrid turret
#

they should add more levels with more functionality

sly topaz
#

first server I see that takes advantage of the fact you can remove emote permissions

sly topaz
sly topaz
#

I mean, with how many people, or should I say how few, there are working on the software, it's just inevitable

lost matrix
drowsy helm
#

dang, this IJ ui overhaul looks fancy

#

eclipse is crying with it's 2000s ugly ass ui

blazing ocean
#

real

#

netbeans meanwhile:

drowsy helm
#

netbeans devs are too busy at the nursing home to worry about updating ui

safe furnace
#

I still can't figure out how can I make this custom models ^ (its example). available for all versions of mc ie( 1.8-1.20 ex)

hazy parrot
#

While we are at redis, I have question about redis spring. As far as I'm aware redis is KV storage, but in spring we have RedisCache abstraction which seems to have underlying map. Spring also have CacheManager which have list of RedisCache. My question is what RedisCache actually represent ? Is it one redis node or what

drowsy helm
safe furnace
drowsy helm
#

probably a bunch of display entities then

safe furnace
#

maybe have feature that automatically download the server res.. withot even asking

safe furnace
drowsy helm
#

and that server works for 1.8?

safe furnace
#

yeah, its 1.8 - 1.21 i think

drowsy helm
#

i dont see how they could do that wihtout resource packs

#

mind sending the server ip?

safe furnace
#

Isn't there forbidden?

drowsy helm
#

dm

safe furnace
#

If there isn't yeah sure why not.

#

I guess u need to dm me first @drowsy helm

drowsy helm
#

hm i cant

#

just send it here then quickly delete it lol

safe furnace
#

ye ye

#

its cracked, also has and premium server just add ,,premium" before the ip

drowsy helm
#

oh they just use a bunch of heads on armour stands

#

with diff sizes

grave lagoon
#

👋
is there a way to transfer a player with a cookie with more data than just 5120 bytes?

#

im serializing an inventory then sending that data over however some inventories are more than 5120 bytes

drowsy helm
#

cookies can be spoofed

quaint mantle
#

hey any one can help?

drowsy helm
quaint mantle
#

how to send pic

undone axleBOT
#

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

drowsy helm
#

?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 you can use to upload images.
Lightshot: https://prnt.sc
Imgur: https://imgur.com/upload
Flameshot: https://flameshot.org

grave lagoon
#

my goal is to do all of this within the plugin

grave lagoon
drowsy helm
#

encrypt it or something

#

but either way, they can be spoofed

quaint mantle
grave lagoon
#

hm

drowsy helm
#

ideally you want a socket between servers

quaint mantle
#

this is the problem

#

pls

#

help

grave lagoon
drowsy helm
grave lagoon
#

also wrong channel

drowsy helm
#

but I really wouldn't rely on cookies at all

#

like for basically anything

grave lagoon
#

but what should i do instead

#

to send over the serialized inventory data?

#

over the transfer

drowsy helm
#

ideally you would want a middle man like redis

#

which should be managing the two servers together anyway

#

but if not, sockets or some REST api on each end

#

either with some encryption or some sort of auth

floral sphinx
#

erm i need help from someone with authority

#

i bought something of u web and i entered wrong email

undone axleBOT
floral sphinx
#

that i dont have access too

drowsy helm
#

email that address

grave lagoon
#

its worth the $175

#

just gotta

#

pull through

quaint mantle
#

can u guys help no body helping

quaint mantle
#

When a entity (evoker) drops a totem the events is EntityDropItemEvent yeah?

#

when killing him

echo basalt
#

Don't store it in cookies because mfs are gonna figure it out and give themselves every item in the game

nova notch
undone axleBOT
hybrid turret
#

iirc TLauncher died some time ago and it's now malware

#

Use ATLauncher or Prism or sum. I personally like ATL

eternal oxide
#

I use MultiMC as teh default launcher broke years ago

hybrid turret
#

i mean in the end the launchers are preference

#

but TLauncher is a nono

eternal oxide
#

yep

#

He's in the wrong channel but his issue is he's also giving direct connections to each server in his bungee instead of localhost

quaint mantle
#

totems are only dropped via evokers yeah?

hybrid turret
#

yes

quaint mantle
#

thanks!

hybrid turret
#

I guess EntityDropItemEvent is for like villagers actually dropping items

quaint mantle
#

Any entity, I was logging the ItemStack and It was logging EGG

pseudo hazel
#

yeah entities that spawn items without dying

#

like chickens

hybrid turret
#

well that makes sense

#

and then it also made sense to log EGG lmao

pseudo hazel
#

and probably for players too ig

hybrid turret
#

yea

quiet ice
#

Java Web Tart?

rough drift
halcyon hemlock
#

Johnny water tillion

quaint mantle
#

How can I get the totem or itemstack used in the EntityResurrectEvent?

chrome beacon
#

event.getEntity().getEquipment().getItem(event.getHand());

#

Would be my guess from a quick look at the javadoc

quaint mantle
#

event.getHand() is not there in 1.14

chrome beacon
#

1.14 💀

quaint mantle
#

I want to make it compatible with older versions idk

#

I will switch to 1.20 then

young knoll
#

PlayerInteractEvent -> check if right clicking a beacon -> remove beacon and spawn mob

copper trail
#

Spawning a mob but it meant to be custom mob

lost matrix
copper trail
pseudo hazel
#

are you writing the plugin to spawn this mob

green prism
#

Crazy question, but maybe it makes sense. If not relocating a shaded library could cause conflicts with other plug-ins that are also using that library, the following is true, right?

I can create an add-on plug-in and avoid shading that specific library because I can use the one shaded in the main plug-in without relocating. Correct?

chrome beacon
#

First part yes

#

second part got me confused

green prism
# chrome beacon second part got me confused

Since it causes a conflict, it means that both plug-ins can access that library. That also means I can avoid shading the library in the second plug-in and just access it directly from the first one.(<scope>provided</scope>)

#

I cannot test right now

chrome beacon
#

you can do that

#

That's how library plugins work

green prism
#

My bad, I should've included the library inside the first-plugin

chrome beacon
#

yeah you can do that

#

You should still relocate ofc

green prism
#

Amazing!! Thank you

chrome beacon
hybrid spoke
#

having a uber jar for all your dependencies which both plugins hook into

dawn flower
#

How do I make the player swing their arm and hit the target entity

hybrid turret
hybrid turret
#

do funny nms stuff

#

(totally didnt decompile it, well it's java but yea)

stuck oar
#

how do you get custom playerheads in 1.21?

chrome beacon
# stuck oar how do you get custom playerheads in 1.21?

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

safe furnace
#

I have .mpet file for a model. how can i upload in server. which pet plugin i need to use and its free?

brazen badge
#

I'm saving an ItemStack seralizing it

config.set("key", key.serialize());

How can I serialize it without json in the lore or in the display name? like:
lore:
- fff
- ggg

hybrid turret
brazen badge
hybrid turret
#

And right now it is not editable why exactly? and what does this have to do with json?

brazen badge
tardy delta
#

an itemstack is already ConfigurationSerialazable

#

config.set key, item

hybrid turret
#

yeah that's what they're doing

tardy delta
#

they are calling serialize()

brazen badge
hybrid turret
tardy delta
#

yes it is

hybrid turret
#

I doubt you can store lore as a plain string as long as you don't serialize the data manually

slender elbow
#

when deserialized ItemStack will expect the json component

#

because components are json, and lore entries are components

#

you'd have to make your own deserializer

hybrid turret
# tardy delta yes it is

not really. ItemStack#serialize only returns a Map<String, Object> which it can also serialize afaik

paper viper
#

What you could do is create a separate locale that handles the display and lore of the itemstack separately that allows minimessage

hybrid turret
#

(to send to players)

paper viper
#

Wdym by plain color formatted message

hybrid turret
#

bc i recently found out that the logs get funky when sending colored messages to the console and idk rn if messages to/from players are also logged

brazen badge
#

so, from what I understand, do I have to create a class where I create custom serialize and deserialize methods? right?

hybrid turret
paper viper
#

Oh hell nah

#

So legacy formatting

hybrid turret
#

relax i started my plugin llike 7 or 8 years ago

#

what do i know of legacy formatting and components lmao

tardy delta
#

wdym legacy

paper viper
hybrid turret
#

at some point i switched from 1.8 to 1.16 and then to 1.19

#

a lot of stuff has changed lol

paper viper
#

You shouldn’t use the stupid character

hybrid turret
#

So i was right?

#

Use player.spigot().sendMessage() with components?

paper viper
#

Chat has completely changed and that legacy format is something that was written years ago that wasn’t even that great

paper viper
hybrid turret
#

adventure??

paper viper
#

They properly actually like handle the messages

hybrid turret
#

what's adventure

paper viper
#
#

Adventure actually handles and sends the component properly and not use the stupid character

hybrid turret
#

I suppose the correct TextComponents are net.md_5.bungee.api.chat.TextComponent?

paper viper
#

No I don’t recommend using the built in ones

hybrid turret
#

oh

#

I mean it's so much more convenient with the color-char lmao

#

so much shorter than having to type ChatColor.GREEN or sum all the time

paper viper
#

Yeah uh

hybrid turret
#

i was blind btw

#

i didnt see the getting started tab

paper viper
stuck oar
#

        for (ItemStack item : p.getInventory().getContents()) {

            NBTItem nbtItem = new NBTItem(item);
            if (nbtItem.hasKey("pets")) {

                return item;

            } else {
                break;
            }

        }
        
    }```


how do i make it so that it returns multiple items if the player has multiple pets
tawdry echo
#

collection

paper viper
#

Why aren’t you using PDC 😦

#

1.8?

stuck oar
tardy delta
#

?pdc

stuck oar
#

pretty much the same as nbt no?

stuck oar
brazen badge
hybrid turret
#

YOOO you can just use hex numbers for custom colors? that's kinda cool ngl

brazen badge
hybrid turret
#

no idea what minimessage is

stuck oar
hybrid turret
#

i was used to the preset minecraft colors lmao

stuck oar
#

or the other items

hybrid turret
#

is added

stuck oar
#

alr thanks

hybrid turret
#

continue goes to the next iteration if the condition is met

stuck oar
#

the ! was throwing me off

hybrid turret
#

yeah it's basically an early return but in a loop

#

it skips the current loop and goes to the next item without adding it

brazen badge
hybrid turret
#

it's prettier than

if (nptItem.hasKey("pets") {
  contents.add(item)
}
#

otherwise you get this

brazen badge
hybrid turret
#

oh i mean that's still adventure

brazen badge
#

like "<red>this is a red message</red>"

hybrid turret
#

oh wait

#

this is "html" in messages

#

that's kinda cool

#

damn

#

nvm that's REALLY cool

#

thanks

#

i'll take a look

brazen badge
nova notch
#

wait til you find out about gradients

hybrid turret
brazen badge
hybrid turret
#

since when is mc so advanced??? i've been seriously missing out

nova notch
#

you can indeed make gradients

hybrid turret
#

i mean

#

for me text was always simple

#

but DAMN that's actually such a small thing but SO COOL

stuck oar
#

my onDisable is now killing my server

#

/reload takes atleast 60 seconds

brazen badge
#

don't use /reload

hybrid turret
#

Damn

mellow pebble
#

?paste

undone axleBOT
mellow pebble
#

so im facing problem which is really strange to me so i have scoreboard and for each line from the config.yml it formats color adn uses placeholder to check on any placeholders if they are used in line so basically only problem that i have is on %luckperms_prefix% line which is correctly transformed from placeholder but Color formating is not done it just gives out white text for example "&4&lOWNER" (without " " ofc) so does anyone know why could this be and have in mind Color.format() is just function in my class that uses chatcolor translateAlternateColorCodes

https://paste.md-5.net/kugireqihu.cpp

paper viper
#

and so much more

hybrid turret
#

I mean yea

#

Those are included in spigot

paper viper
#

yeah but they were brokenn for a whileeee

#

but shhhh

brazen badge
stuck oar
worldly briar
#

Hey! I think that decorated pots are missing the setCracked method. I found some old posts stating that the property is not saved in the nbt but now it is and it's also used by Minecraft. Is there a way to actually modify it?

brazen badge
brazen badge
stuck oar
#

so its the same as nbt?

night minnow
#

has anyone ever tried to hide the recipe book?
im trying to do that but packets are not working as expected so im just wondering what am i doing wrong lol.

eternal oxide
#

hm, I expected that to be cancellable

pseudo hazel
stuck oar
#
                for (ItemStack pet : pets) {```

anyone know why im getting a null error on this?
pseudo hazel
#

idk

#

pets is null I guess

stuck oar
#

its not

pseudo hazel
#

well what is the error then

stuck oar
#

?paste

undone axleBOT
stuck oar
#

thats error

pseudo hazel
#

what are you doing inside the for

#

its a concurrentmodificationexception

stuck oar
#

wait could that error occur if pets has nothing in it?

pseudo hazel
#

i.e. removing stuff when iterating over the list

#

no

#

it would occur if you modified the list inside of the loop

stuck oar
#

oh

#

ok ill remove that

#

thanks

pseudo hazel
#

you can probably do the thing you want still, but just in a different way

#

hard to tell without code though

stuck oar
#

idk what i was doing tbh

quaint mantle
#

At the PrepareAnvilEvent with just the .setResult() method I can just set the result item i want yeah? But when I click to take to my inventory it doesnt do anything

vast ledge
#

it does do anything isn't a very good description of said problem

quaint mantle
#

Ohh nvm I see i need to put a repair cost to allow that

stuck oar
pseudo hazel
#

sure I guess

#

keep track of each pet type you boosted

#

and the next time you find one , dont bosst it

pure dagger
#

do i actually have to check if meta == null, if im creating item myself with Material not being air.. ?

pseudo hazel
#

no

modest wing
#

could someone tell me why this isnt working as intended? the command is supposed to create a firegem like it did with strength, but only the strength command is working


    @Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage("Only players can use this command");
            return true;
        }
        Player player = (Player) sender;

        if (cmd.getName().equalsIgnoreCase("givegemstrength")) {
            player.getInventory().addItem(StrengthGemItem.StrengthGem);
        } else if (cmd.getName().equalsIgnoreCase("givegemfire")) {
            player.getInventory().addItem(FireGemItem.FireGem);
        }

        return true;
    }
}```
night minnow
#

you should also check if the sender is a player to avoid null errors

#

sorry i meant if the player is null

modest wing
#

i mean sure, yeah but the command isnt showing at all ingame

smoky anchor
#

Show how you're registering the commands

night minnow
#

yeah also that lol

worthy yarrow
#

You also need to include the command in the plugin.yml

modest wing
#

oh shoo

#

that was it

#

thank you, i forgot

night minnow
#

XD

modest wing
#

ive been trying to find a typo for the last 10mins almost went crazy

worthy yarrow
#

@modest wing use a command framework or reflection into the command map registry, instead of having to manually add all those commands to the plugin.yml

modest wing
#

will do, thanks for the suggestion

worthy yarrow
#

Can send some spoonfeed for the command map way if you want, lmk

modest wing
worthy yarrow
#

It's quite simple, you're basically just making an extra command wrapper, but directly register it to the command map so you don't need to define those commands in the .yml

#

I wish I had the link, I forgot where to find it, though I do have some code that uses this so

modest wing
worthy yarrow
#

yeah but extend bukkitCommand rather than command executor

modest wing
#

alr]

#

thankyou

worthy yarrow
#

?paste

undone axleBOT
worthy yarrow
#

The super in the constructor for this method sets the command, aliases, description, and permission, when registering all you have to do is make a new instance of said command and it automatically registers itself

#

ie:


// Main class or wtv


private void initCommands(){

  new TestCommand();
}
modest wing
#

some kind of automation sure is nice

worthy yarrow
#

I have never tried to do this before

pseudo hazel
#

what packets did you try

dapper flower
#

why the reflection for registering a command?

pseudo hazel
#

seems like the recipe book being open is client sided

worthy yarrow
dapper flower
#

why would you need to access the command map? to tab the command?

mellow edge
#

Hello, I was wondering why if I create a class

public class DeathmatchDragon extends EntityEnderDragon {
    public DeathmatchDragon(org.bukkit.World world) {
        super(((CraftWorld) world).getHandle());
    }

and then simply spawn it:

        Entity entity = new DeathmatchDragon(((CraftWorld) world).getHandle());
        ((EntityEnderDragon) entity).prepare(((CraftWorld) world).getHandle().E(new BlockPosition(entity)), (GroupDataEntity) null);
        entity.setLocation(spawnLoc.getX(), spawnLoc.getY(), spawnLoc.getZ(), spawnLoc.getYaw(), spawnLoc.getPitch());
        System.out.println((((CraftWorld) world).getHandle()).addEntity(entity));

spawns an invisible dragon that has everything but is just invisible (if I die by it I get a message slain by unknown), but if I spawn it like that:
Entity entity = new EntityEnderDragon(((CraftWorld) world).getHandle());
it works just fine and it even has the bossbar unlike with mine, but why? this is so weird? I am in spigot 1.8.8

river oracle
#

the plugin.yml is ass

worthy yarrow
#

^

river oracle
#

why not do everything in code when you can with a couple lines of reflection

worthy yarrow
#

You don't have to do all the extra shit

river oracle
#

You should really use PluginCommand

#

it has extra backups for cases of clashing

worthy yarrow
#

ya know I've been using that snippet right there for like almost a year now kek

#

It works and haven't had issues so I just never tried anything else

dapper flower
#

just use acf idk

river oracle
#

acf uses command map :O

worthy yarrow
#

Also I'm pretty sure that snippet came from a stephen king lecture

dapper flower
#

still better than rewriting it over and over again

river oracle
#

are you okay? You don't need to rewrite if you make a wrapper

worthy yarrow
#

^

#

That's all it is

dapper flower
#

i mean for each plugin man

river oracle
#

you know what'd be crazy

#

if a developer had a central library

#

for their plugins

worthy yarrow
#

You write wrappers for stuff anyway... why is it an issue for a command wrapper

dapper flower
#

why would i made a central library to get a single reflection field

#

whatever man have it your way

river oracle
#

you are just stupid kekw

dapper flower
#

in any case it would be convenient just having a getmethod

river oracle
#

Do you really go raw on spigot without any libs?

dapper flower
river oracle
#

I have like a 400kb library of general utilities I use for every plugin

#

because spigot has shit API in some places

#

gotta do it myself 💪

worthy yarrow
#

Isn't it like kinda your job to make spigot api better :p

mellow edge
#

why would you not want to normally register a command, only one time I registered it programmatically was when I had to make a plugin that could create custom commands

dapper flower
pseudo hazel
#

wdym raw on spigot

#

spigot is the opposite of raw

river oracle
pseudo hazel
#

its cooked

river oracle
#

like literally just adding spigot

#

and you go

pseudo hazel
#

thats how I started

#

but then I made the utilities

dapper flower
river oracle
dapper flower
#

as long as it compiles, works and is mantainable

worthy yarrow
#

This is getting subjective

#

utilities are just that, you need them in some places, others you don't

dapper flower
pseudo hazel
#

and there is no difference, like just writing a plugin vs taking longer to write the same plugin but being able to reuse some parts in the next one

worthy yarrow
pseudo hazel
#

by utilities I mean stuff I probably need for all plugins

#

like saving data or menu stuff

#

or things that are similar

dapper flower
#

for funcional stuff and utils it is just too good i am sorry

river oracle
river oracle
#

Why would I not have a centralized way to do my commands or Menus if I use them every time

pseudo hazel
#

yeah exactly

#

redoing it from scratch is kinda weird

river oracle
#

I also use my lib to trial new spigot API

pseudo hazel
#

but I guess its preference

river oracle
#

Spigots new MenuType and InventoryView stuff literally has been derived from my library originally

#

I tweaked it to fit better into spigot but that's where its from

#

MenuType subject to merging still

pseudo hazel
#

what is menutype

#

like what does it replace

river oracle
#

basically InventoryType is really fucking stupid

#

MenuType is going to be its successor

pseudo hazel
#

right so it will be an inventorytype that will work

#

so that I can finally cast my fucking anvil

river oracle
night minnow
river oracle
#

I'm thinking of getting rid of Bukkit#createInventory completely or atleast bringing it in a very different form

pseudo hazel
#

there is no Unlock recipes wth

night minnow
pseudo hazel
#

that link takes me to the top of the page

night minnow
#

huh?

pseudo hazel
#

dont you mean Update Recipe Book?

night minnow
#

yeah that one lmao

pseudo hazel
#

okay and in what way does it not work currently

river oracle
# pseudo hazel what is menutype

anyways for an idea of how it might look given MD merges it in its current state. Which i think is probably likely

val view: AnvilView = MenuType.ANVIL.create(player, "My fun title")
view.setItem(0, ItemStack(Material.PAPER))
player.openInventory(view)
night minnow
#

but i can still click on the recipe book

pseudo hazel
#

and I assume that AnvilView is an InventoryView?

river oracle
pseudo hazel
#

how would you sync it with other players

river oracle
#

views themselves can not be

pseudo hazel
#

so there is no built in way to like have a shared anvil inventory? (if you somehow wanted that)

river oracle
#

I had to do this for legacy support and its ugly and fairly volatile

pseudo hazel
#

I see

#

I guess in like most plugins shared inventory views are like an exception, not the rule

river oracle
#

I added a precondition to HumanEntity#openInventory(InventoryView)

#

it was merged because its a bug fix and not an API regression

pseudo hazel
#

ah right

#

sure

river oracle
#

shared InventoryView's lead to dupelication glitches full inventory desync full item loss and other horrible things

pseudo hazel
#

yikes

river oracle
#

basically its possible to permanently lose items in your inventory if you're lucky you get to keep them otherwise they are gone gone

#

no getting them back

pseudo hazel
#

I guess for most purposes its good enough to just copy over the state of the inventory to other users, esp with like menus that players cant put items into etc

river oracle
#

so its updated globally as far as changes go

pseudo hazel
#

right

river oracle
#

this is why you can have multiple players view 1 chest etc

pseudo hazel
#

I mean like the view

river oracle
pseudo hazel
#

alr

pseudo hazel
#

anyways I gotta get back to my stupid serialization stuff

#

you can make a set for example

#

and save all types in the set that you come across

#

and for the next one check if its in the set

river oracle
#

I sympathize

#

I'll go back to replacing Bukkit ItemStack with something from my own lib because ItemMeta is blegh

pseudo hazel
#

yeah I started on something that just writes byte arrays, but then I found out I basically made nbt to a T, so now im just making an nbt serializing stuff, at first I was trying to make it cross compatible with configuration api, but its really hard since that allows you to put in Objects, and the types are ass to manage, like not all serialization types might have the same datatypes

#

and a bunch of other issues

river oracle
#

fun...

pseudo hazel
#

yeah dealing with the information loss but keeping each serialized version of the data looking like the thing its supposed to serialize into (configuration file vs valid nbt file) is the hardest part

#

so its probably gonna be some type conversion / registry stuff

#

but its gonna be awesome when its done

stuck oar
pseudo hazel
#

kinda depends on how your pet types are stored

#

but just Set<PetType> pets =new HasSet<>();

upper hazel
#

who was use hibernate for plugins? hibenate can use async ?

stuck oar
pseudo hazel
#

then youll have to learn some more basic stuff tbh

#

i.e. look up what a set is and what you can do with it

stuck oar
#

rn im just using PDC on the items but im not checking which they are because its all configs

#

either the pets give multiplier boosts for damage or tokens

#

so no need to check which it is

pseudo hazel
#

you said you only wanted up to one pet of any pet type to get a boost

#

you could probably use a filter on your pet list and see if there are any pet types that give some boost, and if there are, give that boost

stuck oar
#

so list the boosts instead?

pseudo hazel
#

maybe

#

I mean idk what you really want yet

#

but just using the pets themselves seem like it would be good enough to determine what boosts to apply

#

depending on how the boosts get applied, you could just loop through the list normally

stuck oar
#

they get applied by taking the event damage and multiplying it

#

is there a way to run through a loop and remove dupelicate names?

pseudo hazel
#

yes

stuck oar
#

if so ill just do that

pseudo hazel
#

just put them in a set

stuck oar
#

oh alr

#

            Set<ItemStack> petList = new HashSet<>(pets);
            petList.clear();
            petList.addAll(petList);```


found this online
#

will it work?

slender elbow
#

petList (not a list) will just be empty

#

you are creating it from an existing collection, clearing it, and then.. adding no elements to it lol

#

where did you get that from

young knoll
#

Pretty sure you only need the single new hashset() line

#

No reason to clear it and then add the now empty list to itself

stuck oar
#

            Set<ItemStack> petList = new HashSet<>(pets);
            petList.clear();
            petList.addAll(pets);```
#

this is what i have but it doesnt work

#

it still has dupes

eternal oxide
#

pets will have dupes, petList will not

stuck oar
#

for (ItemStack pet : petList) {

#

but thats my for loop

#

oh

#

i know why

#

its because

eternal oxide
#

you are clearing petList instead of clearing pets

#

then addAll to pets from petList

stuck oar
#

each time i generate a pet i add a random num from 1-10000 so that they arent stackable

can i just add an unstackable feature on them?

#

cause i think thats why

#

it thinks its 2 diff items

eternal oxide
#

it is

stuck oar
#

ik

#

do they have an unstackable featue

eternal oxide
#

why are you making them unstackable?

stuck oar
#

because

#

if they are stackable it might bug out

#

i just dont want them to be

#

either

#

is it not possible

young knoll
#

In 1.21 you can

stuck oar
#

im in 1.21

eternal oxide
#

why? all you are doing is adding a buff if one is present

young knoll
#

Set the max stack size to 1

stuck oar
#

but it does it multiple times for each pet

#

annoyingly

stuck oar
#

yeah trhat works

smoky oak
#

what was that library for having per block PDC again?

pseudo hazel
#

maybe its

blazing ocean
undone axleBOT
pseudo hazel
#

?morepdc

undone axleBOT
pseudo hazel
#

oh

#

close

smoky oak
#

no like

#

someone in here made one to give you pdc for block coordinates

#

oh yea its alex' thread lol

#

? why should i shade stuff?

pseudo hazel
#

so that people dont need to download the deps

smoky oak
#

aint that just 'include file in plugin'?

pseudo hazel
#

yeah

smoky oak
#

uh isnt that a 'included' in the dependency? why is there two ways to do this?

pseudo hazel
#

you are shading the original dependency into your files

#

wdym

smoky oak
#

the thread talks about relocations
im used to doing scope = included or whatever it is

pseudo hazel
#

idk if including is something different

#

yeah i dont know enough about that xD

dapper flower
#

i am making a bukkitRunnable to execute async as i want to do something very resource expensive, but there is a problem, either the code got faster after i closed my eyes for half a second (impossible) or it fails silently and tells me that it is completed, how can i check if a bukkitRunnable is failing silently and why

#

i legit took 10s and almos crashed the server when executed on the main thread and how it executes instantly seems like bs to me

smoky oak
#

you might be able to debug it? i dont recall if that works off-main thread

eternal oxide
#

it does

#

what makes you think its failing?

#

?nocode also

undone axleBOT
#

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

dapper flower
#

code is huge but sure

eternal oxide
#

?paste

undone axleBOT
dapper flower
dapper flower
#

might just as well share the whole class

#

starts at claimCannonsInBox

#

iirc async reading blocks is fine modifying them is not, and i don't remember editing blocks anywhere

eternal oxide
#

you generally can, but its safer to use a chunk snapshot

#

you have a try/catch with an error debug so it can;t be failing if you get no stack trace

#

If it were a Future it could fail silently but not a BukkitRunnable with a try/catch

umbral ridge
dapper flower
#

(it catches nothing btw)

eternal oxide
#

you would need to add debug. check if it actually finds anything

dapper flower
#

yeah lemme enable debug

slender elbow
#

spark by default will only report the server thread

#

the profile command has a flag to monitor all threads

#

not that measure threads from the bukkitscheduler is very helpful, since the names aren't much useful unless you're using your own thread pool or something

safe furnace
#

I have .mpet file for a model. how can i upload in server. which pet plugin i need to use and its free?

dapper flower
slender elbow
#

I think so

#

and the thread name, or in the case of all, just *

slender elbow
dapper flower
#

i think it is doing its job, but is it possible that sends to me the completed message before actually doing the operation lol

dapper flower
quaint mantle
dapper flower
pseudo hazel
#
public class Node<T>
{
    T data;
    Map<String, Node<?>> children;
}
``` if I have this code, does it make sense to store the data like this? like the children is a map of nodes potentially, which are looked up with strings so i can create a similar tree lookup to that spigot api has for configurations (i.e. "branch.branch.variable_name") but idk if it makes sense to add a data field to this class, since this would mean I have to write code that would make sure there can only be data or only be children, not both
#

like is there a smarter way?

tardy delta
#

char trie

#

althought a very compressed one

pseudo hazel
#

a wat

#

what does the char part mean

#

right so just looking at what a trie is, mine would be similar, except for the whole alphabet thing

#

so I guess its normal to put both the potential data and potential children in the same class like this

#

but the insertion needs additional logic to clean up data on nodes that get children

#

which I guess isnt too hard to do manually

river oracle
pseudo hazel
#

yes

#

how do I make it look not weird

#

but still keep the things I wanna do

#

like inserting data, inserting nodes and removing both too

river oracle
#

usually Trie's work off the character unless you make a compressed trie to save on memory

pseudo hazel
#

well the point of the tree is to save each key as a whole string word, not a single character

#

unless the character just refers to the string as a whole?

#

I dont really care about the sorted nature or the lookup speed , since im using maps all over the place so its not horrible I think

river oracle
#

A trie inserts data into a tree like this. E.g. if i put in the string
Taco
It inserts Taco$ $ designating the end of the string. So during lookup when you hit the $ you can grab your data

pseudo hazel
#

right

river oracle
#

that way if for some reason you insert Tace it inserts Taces and can re-use the TAC characters or if you insert Tacos it reuses TACO but adds another child to o being s which then has its designated terminator with the data attached $

pseudo hazel
#

idc about the reuse of single characters

#

that wasnt really the point of my structure

#

I just care about how the data itself is stored and if its fine to do that alongside the potential children

river oracle
river oracle
pseudo hazel
#

instead of some oop style variant where there are branch nodes and data nodes

#

how does adding a node for every character reduce look up time

#

I guess this is for big tries

river oracle
#

you just are also able to attach data if you need

pseudo hazel
#

right

#

I just care about the dual nature of a node having data or children

#

but I guess ill keep it like it is now

#

thanks for the explanation

river oracle
#

which attaches functions to each node

#

well not functions but that's what i use it for technically you could use it to attach arbitrary data

blazing ocean
#

pineapple 🗣️

river oracle
pseudo hazel
#

right, im just unsure what you would do with the data already attached to a node when you want to change the children

river oracle
#

now your attached data is gone, but you still can host the children

pseudo hazel
#

e.g. you have some data like one.two = v, and then you wanna add children to one.two, like one.two.three, like is the data at one.two still valid?

river oracle
#

if you use terminators yes its valid

pseudo hazel
#

in my case I need it to not be valid

#

for context im making some sort of config style tree

river oracle
#

then you'd need to write a walker for the tree to kill a terminator child

pseudo hazel
#

like you set a string path to a value

#

that value is either just like a number or its a sub tree

river oracle
#

as you walk down to add a node you can kill terminators on the way

#

tho personally I think I'd throw an exception because you're trying to add a value to a non section or vise versa

pseudo hazel
#

so a lookup for a string path only has 1 proper value it returns, either a child node or the data

#

but writing this out makes me question my idea..

#

like how do I even return either a node or data xD

sly topaz
#

how would I go about making a sendBlockUpdate to a Sign persistent, I want to make per-player sign placeholders and I assume the block update gets invalidated once the player goes in and out of the chunk

#

I could do it on chunk enter but that sounds janky tbh

tender shard
river oracle
sly topaz
#

would rather not resort to packets

pseudo hazel
#

a what now xD

sly topaz
#

oh that is a paper event

#

I never realize until I look at the package lol

tender shard
river oracle
# pseudo hazel a what now xD

Either<Left, Right>
either.left() either.right()

when(either) {
  is Right -> either.doSomething
  is Left -> either.doSomething
}```
```java
if (either instanceof Right<Right> right) {
  right.doSomething()
} else {
  ((Left<Left) either).doSomething()
}
sly topaz
#

ig I'd also have to cancel the physics event for the sign, yeah

pseudo hazel
#

hmm

#

now I have something to think about haha

tender shard
#

wouldnt it be easier to have a common superinterface for child node or data?

river oracle
#

I think it'd be easiest to just attatch a pointer to the Node object and check for null

tender shard
#

i think oliver stinks

river oracle
#

oh?

#

Oliver catching strays

tender shard
river oracle
#

nah

#

I'm too far from the UK to smellhim

pseudo hazel
#

my first iteration has a Node which has a map of datanodes, and a datanode is either a node, or data (wrapped in some other node type),

#

which would essentially be that

#

also Either reminds me of a C union

eternal skiff
blazing ocean
#

and he told me to go play deadlock

#

but it's just the valve logo screen

#

oh it's frozen

#

fun

oak orchid
#

How much is known about 1.16.5 world generation? I'm trying to make a blacklist of biomes that wont generate in a world.

wraith delta
#

How do you run code after you place a item into a custom gui? When i place my item in the gui nothing happens, when i take it away from the gui the function runs, this is reversed. the code should be checking my item when i place it in

brazen badge
#

I've upgraded the jdk version in my project and now I have this issue: Unsupported class file major version 66
Anyone?

hasty hamlet
#

Who has their own project?

brazen badge
wraith delta
brazen badge
#

same thing

hasty hamlet
#

Who has their own project?

brazen badge
brazen badge
wraith delta
wraith delta
brazen badge
#

already changed in project structure

#

and in build.gradle

torn badge
#

Are you using gradle shadow plugin?

torn badge
smoky oak
#

whats the difference between relocation and <scope>included</scope> ?

chrome beacon
#

?

#

in maven?

smoky oak
#

ye

chrome beacon
# smoky oak ye

relocation has to do with shading and it's used to change the package that an included library uses. The included scope does not exist

#

I assume you mean provided and that just means that you will provide it on your own at runtime

gray merlin
#

Hey there peeps

#

Has anyone been approached by Surf Hosting before? Does anyone have any experiences with them?

#

Since this is a developer's chat, I'm just looking for any personal experiences with them in your plugins
I've been approached recently and I wanna make sure it's not dodgy

wraith delta
# torn badge Check the InventoryAction and current item
        if (event.getAction() == InventoryAction.PLACE_ALL && slot == 11) {
            if (isTool(clickedItem)) {
                ItemStack upgradedTool = upgradeToolEnchantments(clickedItem);
                clickedInventory.setItem(15, upgradedTool);
            }
        }
```Thanks for that idea! Which event would work for placing a pickaxe in the slot? this one does not
chrome beacon
#

Go for a more trustworthy host like bloom or get yourself a cheap dedi from Hetzner

#

depending on your needs

gray merlin
#

You misunderstand

#

I'm just asking if you have any experiences with them partnering up with you, I'm not looking for any hosting solutions

#

I self-host everything in my setup 😛

chrome beacon
#

From what I've seen I wouldn't

#

They don't really have the best rep

gray merlin
#

Oh is that so?

chrome beacon
#

but again how much that matters is up to you

gray merlin
#

Is there anything in particular that they have done?

smoky oak
torn badge
smoky oak
#

yea that'd do it
but again shade isnt relocation, so how does it differ?

torn badge
#

You define the relocations in the plugin configuration

tawdry shoal
#

hi, how do I check if a player's body has touched a certain block? 1.20.1

chrome beacon
chrome beacon
#

There's a little bit more than that you should take a look at trustpilot for a more detailed write up

smoky oak
gray merlin
#

Looking at it now, thanks!

novel kite
#

their appeal system is also completely broken, so you get your reviews removed and then no way of restoring them

chrome beacon
#

yeah I've seen that happen

#

infact the main review I was mentioning was disputed that way

#

It appears to be back now so I guess it didn't work out

smoky oak
#

i just got a random ass client join my server say 'hey this minecraft server is exposed' which kind of was the whole point and leave
lol

tardy delta
#

💀

#

you now got his ip

smoky oak
#

ye

#

pinging 4B ips isnt that difficult if u have a decently sized botnet

chrome beacon
#

Don't really need a botnet

smoky oak
#

well it certainly will take ages on a single 1600 line lol

chrome beacon
#

true but time really isn't much of an issue

smoky oak
#

also true

hasty hamlet
#

Who needs a Minecraft-style fashion designer - write

smoky oak
#

f do u mean fashion in minecraft??

strange falcon
#

Hi, i'm trying to send a HTTP request within my Minecraft plugin, using Okhttp3 from the maven repo, i added it to pom.xml, built the plugin, everything is fine, but i get ClassNotFound error, saying the OkHttpClient class couldnt be found

smoky oak
#

sounds like the library youre using is missing

chrome beacon
#

Yeah code that doesn't exist cannot run so you need to include it in to your plugin or tell Spigot to download it

#

with the libraries section of the plugin.yml

smoky oak
#

how

#

ah i see

#

i thought that was still in development

chrome beacon
#

It's been in Spigot since 1.17.1

smoky oak
#

i havent beeen here in a hot minute apparantly

strange falcon
#

adding it to pom.xml ain't enough?

chrome beacon
#

no

strange falcon
#

Okay

eternal oxide
#

yes, if the scope is correct

chrome beacon
#

You need the shade plugin

#

and then the correct scope

#

or as mentioned the libraries section of the plugin.yml

smoky oak
#

btw olivio those libs stay downloaded, right?

strange falcon
#

how to add the lib

chrome beacon
#

yes

chrome beacon
strange falcon
#

Found online already

river oracle
#

its actually tweaked now to where it isn't a naive implementation anymore I just need someone who actually properly understands this area to look over it

young knoll
#

does it work

river oracle
#

Yeah I can't really test version upgrades

#

But the data fixer should do it's job and doesn't error on same version builds

young knoll
river oracle
#

So I can enter phase 2 of MenuType PR

young knoll
#

ooh fancy

eternal night
#

ship it

young knoll
#

Multiple phases

eternal night
#

import static org.bukkit.craftbukkit.inventory.util.CraftMenuBuilder.*;

river oracle
#

It's peak java code

eternal night
#

btw, any reason this isn't a ReferenceObjec2ObjectMap or something

#

those ifs sound rather annoying

river oracle
#

Can you explain pls

eternal night
#

I mean, just a map

#

Just saying that creating a STONECUTTER has like 12 ifs

river oracle
#

Yeah true

#

I should prob switch over to a map but what's the benefit of the ReferenceObject2ObjectMap

eternal night
#

it avoid equals calls

young knoll
#

Gosh

orchid gazelle
#

that's why you use Forge 1.12.2

river oracle
orchid gazelle
#

best version

river oracle
#

Does it use == instead

eternal night
#

Yea

river oracle
#

Stupid question ofc it does

#

Literally in the name

young knoll
#

Nah it uses isSimilar

river oracle
#

@eternal night I remember why its if statements now

#

if I reference MenuType it'll stack overflow lol

#

I'll just use mojangs and hope for best :3

eternal night
#

nah

#

can just stick to that then

#

if is fast enough

#

faster for the chest ones

river oracle
#

I could make it even faster if we really needed by using else

#

but yk I cbf

#

it looks beautiful

river oracle
#

everything is an object if you're brave enough

orchid gazelle
#

@river oracle you are an Objectg

river oracle
#

I want to say something but I'm affraid it would far extend beyond the PG-13 limit of this server

#

so for that reason you'll get a smiley face instead

#

🙂

young knoll
#

(Class<List<T>>) (Object) List.class

eternal night
river oracle
#

get in shape bucko

#

I've got like 20 PRs in queue

eternal night
young knoll
#

So can we just detect player input now

#

With latest snapshot

river oracle
#

just their movement 💪

young knoll
#

Well yeah

#

WASD sneak jump

eternal night
#

And jump sadly only if they have space bar pressed

#

Not if they just jumped

ivory sleet
#

miles bday? :o

young knoll
#

Just check every tick

#

I guess

ivory sleet
#

for their bday?

young knoll
#

Yes

ivory sleet
#

oh wait nvm

remote swallow
#

its still today for him

#

i think ur an hour ahead of me anyway

ivory sleet
#

1:30 for me rn :P

remote swallow
#

yeah an hour ahead

#

do you have anything nice to tell me about the future

ivory sleet
#

lol well let me come up w something

young knoll
#

He’s 16 now

#

(Real)

ivory sleet
remote swallow
#

wow

#

i thought he was like 19 or smth now

ivory sleet
#

:^)

river oracle
autumn sedge
#

Is it possible with an api to retrieve list of customers? trying to make a bot to sync customer role with customers upon verification and i don't like the idea of using paypal to do so

iron rivet
#

Anyone know ihow i can access the instance of Netty Runnign on a minecraft server I need access to it for my plugin

river oracle
#

fear not

ivory sleet
#

happy bday in any regard ^^

young knoll
#

I was close

#

6 is just an upside down 9

tender shard
#

a math formula or a fixed list of XP required for each level to levelup
and then some sort of storage to store how much XP a player has, e.g. PDC or mysql or a file or whatever.

stuck oar
#

does anyone know why my intellij is having errors importing bukkit?

#

Cannot resolve symbol: bukkit

sullen marlin
#

?nocode

undone axleBOT
#

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

stuck oar
#

?paste

undone axleBOT
stuck oar
#

thats my pom

#

import org.bukkit.plugin.java.JavaPlugin;

public final class PlayerSkillLeveling extends JavaPlugin {

    @Override
    public void onEnable() {
        // Plugin startup logic

    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
    }
}

thats code

#

its fresh code

sullen marlin
#

Looks fine, post your maven log

stuck oar
#

doesnt give errors

wicked sinew
#

did you already try the classic; close and re-open IntelliJ?

wicked sinew
sullen marlin
#

I think intellij you often have to reload the maven project too

smoky oak
#

only if you change it in my experience

#

you kinda sorta have to reload maven anyway when you add something so it can resolve/download deps

carmine mica
#

@river oracle I was thinking about inventories, and how people want to create them to share between people. The only inventories that can be shared, are ones that are backed by some tile entity, like a chest or a furnace. What should be encouraged then, is creating a blank TileState for the block type, and using that inventory to share between people. Instead of just trying to create an inventory via InventoryType

#

so like

Chest chest = (Chest) ItemType.CHEST.createBlockData().createBlockState();
Inventory inv = chest.getBlockInventory();
players.forEach(p -> p.openInventory(inv));
// inv is now a shared inventory between the players
#

There should be no way to create an instance of AnvilInventory or EnchantmentInventory as a standalone thing, those inventories/nms containers only exist in the context of a full view (AnvilView or EnchantmentView)

#

pretty sure this, plus MenuType then completely replaces all functionality of InventoryType. So that enum and associated methods could just be deprecated in their entirety

river oracle
# carmine mica <@318887270415466496> I was thinking about inventories, and how people want to c...

Also been thinking about something similar, I really struggle to see how AnvilInventory etc can fit into the model properly. And it really just can't as you said. As stands with the large PR that you reviewed I actually made it possible for the inventories that really shouldn't work for multiple players, but I don't really think that is a good longterm solution. As you proposed here seems much more intelligent of a solution instead of continuing to duck tape things together and praying they don't break

sly topaz
#

does this mean Bukkit#createInventory would be deprecated in favor of this?

river oracle
#

Bukkit#createInventory's days are numbered regardless of what we go with

sly topaz
#

the case where an API user wants an inventory to be shareable is rarer anyway so I wouldn't personally mind it

river oracle
#

that trash system needs to die