#help-development

1 messages · Page 454 of 1

remote swallow
#

but with my 2 ratings i have 5 stars

#

so it works out

lost matrix
#

Eyes

glossy venture
#

cant you just use Bukkit.getConsoleSender and fake the logger tag

copper scaffold
#

is there a way to check a doublechest witch side i clicked left or right?
i tried it with.`
1.

Chest chest = e.getClickedBlock();
if(chest.getType().equals(Type.RIGHT){

2.

Chest chest = e.getClickedBlock();
if(chest.getBlockData().equals(Type.RIGHT){
ivory sleet
#

Maven version?

#

I’d say latest

young knoll
#

Lowest you want to support

ivory sleet
#

^^

young knoll
#

Otherwise you risk using methods that don't exist on older versions

ivory sleet
#

One way is to modularize ur project tho morice

lost matrix
ivory sleet
#

Maven multiproject is a thing I think

#

Sth like that

remote swallow
remote swallow
ivory sleet
#

morice you dont need every version tho

#

But just the versions where you encounter breaking changes

remote swallow
#

if its 1.17 plus higher just use teh versions my spigot lib uses

ivory sleet
#

Ah yeah then it might be a bit redundant

remote swallow
#

it has the nms change versions

spare marsh
#

When was the StructureGenerateEvent added to spigot?

copper scaffold
lost matrix
#

BlockData -> cast to Chest

icy beacon
#

I think it's something like block#getData or block#getBlockState

copper scaffold
#

okay thx

lost matrix
#

getBlockData gets the BlockData and getBlockState gets the BlockState
You can imagine which one you need

echo basalt
#

yo discord came back with the pfp outlines

round finch
#

sweet!

#

they should keep it for nitro users

ivory sleet
#

As a nitro user I do concur

round finch
#

having more options to decorate your pf would be neat!

peak depot
#

is it possible to use the ids from heads like when I want to get a from hdb like this {SkullOwner:{Id:[I;-2106185644,754142373,-1110652435,-1241422363] to use it in a plugin

lost matrix
#

Sure, they all need a value and a signature

peak depot
#

yeah but what is it is it a name or an UUID like who do I get the owner of it

lost matrix
#

Name and uuid dont matter. All that matters are the texture value and signature

serene sigil
#

how to damage an entity naturally (meaning that if he has armour on, it deals less damage)

lost matrix
serene sigil
#

wdym?

ivory sleet
#

No

undone axleBOT
ivory sleet
serene sigil
ivory sleet
#

if the player damages the entity pass the player

#

For instance

serene sigil
#

wdym

ivory sleet
#

entity.damage(damage,player)

#

Like you pass the damage dealer

serene sigil
#

yea, but i dont have a player

ivory sleet
#

What do u have

serene sigil
#

only the livingevtity i want to damage

ivory sleet
#

Ah u can skip it then

#

Just damage(damage)

#

Looks good

serene sigil
ivory sleet
#

Doesnt matter

spare marsh
#

Is there a way to check for when a structure is being generated on the server and what type of structure? I need it on 1.14 and spigot only has an event for that in the new 1.19 versions

serene sigil
young knoll
#

By default, yes

smoky scroll
#

Can somebody tell me what happen to ChatColor.translateAlternateColorCodes?

#

How to do it now?

#

Why is it depricated?

young knoll
#

It's not

#

Me thinks you are using the paper API

smoky scroll
young knoll
#

well there is your answer

smoky scroll
#

But you don't know what else to use, do you?

young knoll
#

I do

remote swallow
#

you have to use components

young knoll
#

But this isn't the paper server

#

Spigot does not deprecate that method

remote swallow
#

you most likely would be better to use fabric

#

instead of mcp

#

forge is just mahem

#

you dont need a new launcher with fabric, but with a fabric project you could build directly to mods folder

#

then you just reboot the game

#

like normal

ivory sleet
#

Architectury :)

remote swallow
#

and way more people know fabric and fabric support is so much better than forge

serene sigil
#

fabric 💀

ivory sleet
#

Huh why the skull emoji :(

remote swallow
#

ban therm

river oracle
#

I need help setting this up lol

remote swallow
#

i have pr'd bukkit

#

or craftbukkit

#

i dont rememerb

river oracle
#

is there a way to clone from my fork or do I gotta clone the official one

remote swallow
#

yes

#

one momentos

river oracle
#

ahhh Ic

cedar dagger
#

I’m having an issue where peopel are speed running my survival server any suggestions on how to counter this?

river oracle
#

ban the hackers

remote swallow
#

ban them for a bit or tell them to calm down

river oracle
#

if your just talking about normal vanilla speed I suppose you could make a plugin to remove the speed effect

remote swallow
#

they mean like speed running the game, completeing it in 30 min

serene sigil
#

can i check if the uuid of a livingentity is equal to a player uuid? cuz players are also livingentities

river oracle
ivory sleet
#

What r u comparing roxy

river oracle
#

some people are just good at the game and wanna get to the building part

serene sigil
ivory sleet
#

use equals directly

#

Or well == works even

#

I reckon

serene sigil
#

so does it?

chrome beacon
#

Don't forget that you cannot share any jars you make with MCP

river oracle
ivory sleet
remote swallow
ivory sleet
#

It may not work for complex entities but thats another story

chrome beacon
#

You think Microsoft won't enforce their copyright???

#

No

remote swallow
#

mcp reborn doesnt host the jars

#

you create them

chrome beacon
#

^^

#

MCP is like BuildTools

remote swallow
#

its like the legal loop hole buildtools is using

chrome beacon
#

You cannot share the Spigot jar

#

Since MCP generates a workspace with decompiled classes

#

You cannot share that either

#

You would have to make a runtime injector system like Optifine or just do the sane thing and use Fabric which already handles all of that for you

#

You can make an installer that installs fabric and then your mod

young knoll
#

61 = java 17

river oracle
#

wrong java version

river oracle
chrome beacon
#

You gotta start your server with Java 17

#

Then compile with Java 17

#

and make sure the shade plugin isn't ancient

undone axleBOT
chrome beacon
#

The shade plugin is outdated

#

Update it

terse socket
#

what does "L" stand for in "20L"? (it's in a timer)

chrome beacon
#

long

ivory sleet
#

f also

chrome beacon
#

20.0 - double

#

20F - float

terse socket
#

Okay thank you

summer zodiac
#
        val world = Bukkit.getWorld("world")!!;
        val fallingBlock = world.spawnFallingBlock(sender.location.add(0.0, 20.0, 0.0), Bukkit.createBlockData(Material.POINTED_DRIPSTONE))
        fallingBlock.setHurtEntities(true)
        fallingBlock.fallDistance = 200.0f

i dont get damage why?

remote swallow
#

you can run just craftbukkit if you really want

pine forge
river oracle
pine forge
#

Is there a way to check whether a player is standing inside a structure?
Or an event when a player enters a structure?

#

ah kotlin

chrome beacon
young knoll
#

Well

#

The consumer method is newerish

sage patio
#

can i use switch case for Inventory?

serene sigil
#

how to make it so PlayerInteractEvent only calls when u right click air once

remote swallow
#

?interactevent

undone axleBOT
#

The PlayerInteractEvent may be called once per hand. If you only want code to be executed once, you can check the result of https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/player/PlayerInteractEvent.html#getHand(), then decide functionality.

For example, only executing code if the main hand was used:

@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
    if (event.getHand() != EquipmentSlot.HAND) { // * if the hand used is NOT the main hand:
        return; // do not progress past this point  |
    }
    // provide functionality
}
serene sigil
#

no, it spams it

#

i just want it when u click once

pine forge
#

Is there a way to check whether a player is standing inside a structure (preferrably without nms)?

river oracle
sage patio
#

event.getAction

serene sigil
#

ur mu-

summer zodiac
#

How can I create a FallingBlock in the code?

river oracle
#

a lot of shit

#

like I use them all the time

ivory sleet
#

Higher ordered functions basically

river oracle
#

usually just to provide functions

ivory sleet
#

A function that takes another function as an argument

ivory sleet
#

Then its convenient to pass a lambda

river oracle
#

this won't be backported by spigot so you'll need to replicate the code yourself

spare marsh
river oracle
#

yea

#

you may need to patch the server so

tawdry echo
#

someone have circle on full chat line height?

river oracle
#

you might have to fork spigot

pine forge
#

If hes anywhere inside a specific structure

#

Essentially i want to run code once a player enters an ancient city

river oracle
#

was wondering why CraftBukkit was coming up with errors :( Forgot to run buildtools 😭

terse socket
#

how to make "schedulesyncrepeatingtask" stop after it runs for a time

#

I saw the for loop on the "delayedtask" version but it's just not working

#

it just makes it happen suddenly

river oracle
remote swallow
#

you shouldnt be using that varient

terse socket
remote swallow
terse socket
#

Ok let me check this

#

thank you

river oracle
#

Anyone know why I keep getting method not found after I cloned CraftBukkit. I'm so confused I just ran buildtools too

remote swallow
#

did you run the apply or make patches

river oracle
#

idfk tbh lmao

remote swallow
#

?contributeting

#

?contributing

#

whats the commane

#

?contribute

remote swallow
#

there we go

river oracle
#

ahhh i see

remote swallow
#

in git or whatever do bash applyPatches.sh /path/to/buildtools/decompile-xxxxxxx/

abstract sorrel
#

what is a good way to save a hashmap to a file and load it back in when the server starts

echo basalt
#

such an innocent question

#

so you want a database

abstract sorrel
#

can databases work without having to have access to files outside of the minecraft server folder?

#

like as in if you uploaded the plugin to a server host would it work

echo basalt
#

depends on the database

#

Look up SQLite

abstract sorrel
#

are there any simpler options like can you load a hashmap to a .yml file or something, i tried that and it didn't work

ivory sleet
#

What do u define as good?

abstract sorrel
#

like a way that works well and doesn't bug out etc

opal juniper
#

things do not tend to "bug out" unless you do something stupid

abstract sorrel
#

ok just what methods are there then

opal juniper
#

I mean you arent gonna find something SUPER easy to use with a database unless you use some sort of ORM. Otherwise you are gonna be writing some sort of SQL

remote swallow
#

you would be better doing sqlite, but you could use json or yaml

abstract sorrel
#

do databases require setup outside of the minecraft server or can they work using spigot code and java

remote swallow
#

sqlite, no

#

mysql yes

opal juniper
#

Yeah, if you want a cheap and cheerful simple db, go sqlite

abstract sorrel
#

ok i'll look into sqlite

#

thanks for the help

summer zodiac
#

I don't understand how to create a FallingBlock without spawning it how is that possible so what do I have to do for that?

#

Is that what you mean?
val fallingBlock = FallingBlock

chrome beacon
#

Why are we using nms now

#

There's api for spawning entities

echo basalt
#

same

#

but no it won't spawn instantly

#

you gotta level.addFreshEntity

chrome beacon
#

^

echo basalt
#

and also call setPos before

#

otherwise you'll have some very angry issues

chrome beacon
#

Someone should take the time and write "virtual" entities in to the api ;/

#

It's quite annoying that it's missing

echo basalt
#

I can't bother

chrome beacon
#

same

echo basalt
#

I just do them manually

young knoll
#

There is kind of a PR for that right now

chrome beacon
#

👀

raw crow
#

when I do

Player carrier = ...
Player passenger = ...
carrier.setPassenger(passenger);

the carrier player has an ass at its face and cannot see nothing .-.
that does not happens at old versions like 1.7
is there a way to fix that? like putting the passenger player some distance above

echo basalt
raw crow
chrome beacon
#

Carrier > ArmorStand > Passenger for example

echo basalt
#

given you're calling setPassenger instead of addPassenger

#

something tells me you're in <1.12

raw crow
echo basalt
raw crow
#

i'm at 1.19.3

weak kayak
#

suspicious

raw crow
chrome beacon
#

Yeah

raw crow
#

ok, thanks :>

chrome beacon
#

Delay is the initial time before it starts

#

period is between each run

#

If you only want it to run once don't run a timer

ivory sleet
#

Im gonna be annoying now but there is no such word or shortcut as wan’t, the right word is want without apostrophe

chrome beacon
#

?scheduling

undone axleBOT
tardy delta
#

wasn't

ivory sleet
#

That is fine

tardy delta
#

fuck that word actually exists

ivory sleet
#

Lmao

tardy delta
#

its nearly midnight, forgive me

#

doing pointless stuff

ivory sleet
#

Totally not me <<

golden turret
#

which happens first when the server stops: the players are disconnected | the plugins are disabled

tardy delta
#

players

#

as plugins might handle player disconnect logic

ivory sleet
#

^

golden turret
#

alright thanks

golden turret
ivory sleet
#

Its still true

golden turret
#

hm

young knoll
#

I don't think it's possible for isEnbled to ever be false from inside your plugin

#

Unless async

golden turret
#

should I be doing this?

#

it checks if the server is stopping, if so it will use the CompletableFuture#join() to make the updates

raw crow
ivory sleet
#

Try catch the join

#

It might throw an unchecked exception

#

(To be on the safe side) cuz else database might not close properly in ur case

golden turret
#

I never handle exceptions properly so that is not a problem for me lol (don't blame me pls I am with a short deadline)

ivory sleet
#

Ah alr best of luck in that case

chrome beacon
#

but I guess you'll meet the deadline 🤷‍♂️

young knoll
#

Just wrap the entire plugin in a try catch

golden turret
#

I will improve, I promise!

echo basalt
#

I'd return the future regardless

#

and just join it onDisable

golden turret
echo basalt
#

uhh

#

here's an example of how we do it at work

#

So instead of making my unloadAll method a void

#

I make it return a future

#

that I can then join

tender shard
#

// Plugin shutdown logic

remote swallow
#

we love our mc dev

ivory sleet
#

And then here illusion is very disciplined such that all exceptions are handled inside the future (hopefully)

sullen marlin
#

// Iterate modules

young knoll
#

// Code

tender shard
#

very useful comments

remote swallow
#

// sysout josh should do my asnyc for me

ivory sleet
#

When people even put // to comment why they put curly brackets kek

tender shard
#

IJ annoyed me way too much again today, I think I'll give netbeans another try

ivory sleet
#

What happened

young knoll
#

Shout out to // CraftBukkit

sullen marlin
#

Netbeans 16 and 17 have been great releases

#

Best since the Oracle days

#

Do recommend

quaint mantle
tender shard
#

I still have NB 13 installed lol

ivory sleet
#

// Yatopia :)

young knoll
tender shard
#

yatopia sounds like some isotonic yoghurt

#

Yatopia - for a better gut flora

ivory sleet
#

Lol

young knoll
#

That’s even a nice rhyme

quaint mantle
young knoll
#

Someone go start a yoghurt company

tender shard
#

lol I like yoghurt

quaint mantle
#

Kinda like Bukkit#getVersion but NMS

echo basalt
#

I actually have a class that extends CF and handles exceptions automagically

young knoll
#

Does it just throw them as a runtime exception

ivory sleet
#

Alr I was mainly referring to wizardly

echo basalt
quaint mantle
ivory sleet
#

Since a lot of people use join w/o handling possible exceptions that can actually occur

echo basalt
#

nah CF stands for canned food

quaint mantle
#

Oh

echo basalt
quaint mantle
#

Still makes no sense

sullen marlin
#

Understandable

young knoll
#

Can you just wrap the entire JVM in a

try {

} catch (Exception ignored) {
}```
echo basalt
#

nah I log it

quaint mantle
#

Catch Throwable instead

echo basalt
#

dawg you ain't even verified

supple parcel
#

Its what I do when trying to login to state security networks, I ignore the login errors and bypass security

tender shard
#

🧠

quaint mantle
echo basalt
young knoll
#

Developers hate this one simple trick!

ivory sleet
#

Like why use pattern matching when try catch can technically do the work

tawdry echo
#

how cna open inventory in asyncchatevent?

opal juniper
#

don’t

tender shard
#

you schedule a synced task and open it there

echo basalt
tawdry echo
#

thx

tender shard
#
public void onChat(AsyncPlayerChatEvent event) {
  Bukkit.getScheduler().runTask(plugin, () -> {
    event.getPlayer().openInventory(...);
  });
}
ivory sleet
young knoll
#

One day we will be able to run tasks without a plugin instance

sullen marlin
#

How

late sonnet
opal juniper
young knoll
#

It’ll uhh

young knoll
#

Determine the current plugin from stacktrace

echo basalt
#

yeah exactly

young knoll
#

It’ll just pick the first loaded plugin and assign it to them

sullen marlin
young knoll
#

Muh cpu cycles

cinder karma
#

so, cancelling PlayerInteractEvent stops players from putting flowers into flower pots, but doesn't stop them from taking flowers out? How do you stop the latter?

sullen marlin
#

Sounds like a bug

#

Also sounds surprising

#

?paste

undone axleBOT
ivory sleet
late sonnet
ivory sleet
#

Or well T that is

#

T, is that a toilet, a tree or just a type?

late sonnet
#

i use the T thing so little times.. here in a few PR and in a D4J BOT for a interface for handle Interactionns.. not the best thing but works xd

cinder karma
opal juniper
#

reconnect

late sonnet
# cinder karma how would I test that?

a test plugin, and like olije reconnect or move things of inventory (the two things) if its not a client bug then you can report to JIRA, its not a Jukebox issue then Choco can handle :3

cinder karma
ivory sleet
#

Oh yeah, so I was working on this greenfield project, and my friend started using actual names for type parameters, so he had stuff like Registry<Key, Value, DerivativeRegistry extends Registry<Key,Value,DerivativeRegistry>> so holy confusing

late sonnet
#

what parameter?

#

i dont see was removed.

late sonnet
#

The second, and what issue show the IDE?

echo basalt
#

I actually ended up using it a lot on my menu engine

late sonnet
#

eh... looks like the same (ignoring the red)

chrome beacon
#

Different imports?

#

Or IJ caches are messed up

tender shard
#

Invalidate Caches is the button i click most often in IJ lol

echo basalt
#

nah

glossy venture
#

gg invalidate caches and restart

echo basalt
#

fuck tomorrow's easter and everything's closed

tender shard
#

Tomorrow is sunday anyway

ivory sleet
late sonnet
#

netbeans not has this issues but dont remember why i move to IJ years ago...

glossy venture
#

ive had to wait like 20 minutes for intellij to reindex shit

#

when using paper

echo basalt
#

probably worldedit or some other stupid dep that shades stuff

remote swallow
#

you have something else that has bukkit deps

late sonnet
glossy venture
#

yeah windows

tender shard
#

1.13 is probably a transitive dependency. Move 1.19 to the top of your dependencies

young knoll
#

1.13 moment

glossy venture
#

too stupid to do anything abt it thouh

tender shard
#

Yes

ivory sleet
#

That’s not supposed to happen unless u have slow internet speed

tender shard
#

No

#

Np*

glossy venture
#

maybe a bit exaggerated but like for a paper project with a shit ton of dependencies and a mediocre internet speed

tender shard
#

You can also exclude the 1.13 dependency from the dependency that declares it as transitive dependency

young knoll
#

Emphasis on the weight

ivory sleet
#

Still shocked it takes so long

#

Like it does cache stuff trur

#

But damn

remote swallow
#

its the first run so it takes a whil

tender shard
raw crow
#
Player carrier = ...
Player passenger = ...
carrier.addPassenger(passenger);

how do i stop passenger from leaving carrier?

onyx fjord
#

Paper likes to brick my pc everytime i start a new project with userdev

weak meteor
#

Is there any way of identifying a seed?

chrome beacon
#

Whenever I have to reload my gradle files when modding I just go do something else

cinder karma
#

so:

if(e.getClickedBlock().getType() == Material.FLOWER_POT) e.setCancelled(true);

should stop PlayerInteractEvent taking flowers from flower pots? Just being thorough.

sullen marlin
#

EntityDismountEvent -> cancel

tender shard
raw crow
young knoll
#

Ever flower pot is a different material now

onyx fjord
#

Md told u

late sonnet
cinder karma
raw crow
#

what event is fired when a player leaves a vehicle?

cinder karma
#

Oh, fabulous, thank you

chrome beacon
sullen marlin
#

Tags are the stupidest concept

sullen marlin
#

What if I use a data pack to put grass in Tags.FLOWER_POTS

#

What you gonna do about it game

#

What you gonna do huh

ivory sleet
young knoll
#

Does that change Bukkits tags?

#

Or are they fixed

sullen marlin
#

It just makes no sense to be data driven for 95% of the tags

ivory sleet
#

but havent had issues regarding speed

sullen marlin
#

It changes then

late sonnet
#

need more whats this xd
i mean allow vanilla change things with tags sounds great i never use...

young knoll
#

Fun

late sonnet
young knoll
#

I see people use new tags a lot in datapacks

onyx fjord
#

Why are datapacks even a thing

young knoll
#

But they never really change existing ones

onyx fjord
#

Who thought modding in JSON is a good idea

young knoll
#

Should have used HTML

late sonnet
#

or lua

glossy venture
#

php

onyx fjord
#

It was a great idea

#

What else u gonna use

glossy venture
#

makes modding easier

onyx fjord
#

Only c++ is an option

young knoll
#

Java is quite accessible

glossy venture
#

and java isnt as slow at ppl think

young knoll
#

But you know what’s more common

glossy venture
#

.net lmao

young knoll
#

C#

onyx fjord
#

Also remember about platforms

onyx fjord
#

So literally java

#

Just modded by Microsoft

glossy venture
#

jvm is superior

young knoll
#

But features

#

Idk how they compare on speed tbh

onyx fjord
#

With graal u can even compile java to native

young knoll
#

Imagine calling it windows 10 edition

chrome beacon
#

You trolling or smth

glossy venture
chrome beacon
#

It runs slower than Java edition and looks aweful

onyx fjord
#

Haha kiss in what

glossy venture
#

or make ur own scripting language for the jvm

#

like im doing

onyx fjord
#

Chef was kissed in the wrong place

glossy venture
#

it feels sloppy as fuck

young knoll
#

Bedrock edition has micro transactions 🫢

glossy venture
#

i got crispier gameplay on java with a shitty laptop

onyx fjord
#

Yeah exploiting children on money!!!

young knoll
#

Bedrock edition graphics just feel off

#

Idk why

#

They don’t feel minecraft

glossy venture
#

pretty sure the lighting is fucked

onyx fjord
#

Why do bedrock animations feel 15 fps

young knoll
#

Bedrock does have a better datapack system though

glossy venture
#

ambient occlusion is very different from java or something

chrome beacon
#

Bedrock is a buggy mess

young knoll
#

Bugrock

onyx fjord
#

On bedrock by placing a chain u could x-ray in lava

young knoll
#

Immersive portals >

onyx fjord
#

And on specific coordinates on bedrock you fall thru ground and die

#

Lol

jovial vigil
#

Hey I need help with a spawner plugin similar to the one on the donut smp where you can right click the spawner and can sell the generated itme

onyx fjord
#

I think they refused to fix it

young knoll
#

I remember a video of someone on bedrock nerd poleing in the nether

#

And then they just died

tawdry echo
#

is any way to remove it from spawner itemstack

chrome beacon
tender shard
#

i'll go to bed now and play bioshock 1, good night everyone

chrome beacon
onyx fjord
#

Math

late sonnet
glossy venture
jagged bobcat
#

Is there any examples for PersistentDataContainer because I am trying to store string in container, but it gets deleted after one method. (Doesn't save to next method in the line)

onyx fjord
#

.net is such a stupid name

undone axleBOT
jagged bobcat
tender shard
jagged bobcat
#

Oh true

chrome beacon
#

Get item meta returns a copy

tender shard
#
ItemMeta meta = myItemStack.getItemMeta();
meta.getPersistentDataContainer().set(...);
myItemStack.setItemMeta(meta);

this should fix it

young knoll
jagged bobcat
#

I had that issue like year ago on itemmeta should have known

tawdry echo
#

hide attributes not work

#

other hasnt sense

young knoll
#

Then it’s client side

#

Should only appear in creative anyway

tawdry echo
#

how can set type of mob in spawner?

#

maybe itwill work

jagged bobcat
#

Pretty sure minecraft doesn't have flag to hide creative tags

glossy venture
#

tf java is the nr 5 fastest

young knoll
#

Is the title in order?

onyx fjord
#

Every benchmark will have a different winner @glossy venture

#

You can easily manipulate it to your liking

glossy venture
#

only has one benchmark in the vid right

frosty relic
#

Hi someone does know where i can find the replace of this class in 1.19.2

young knoll
#

ItemStacks have BlockStateMeta

glossy venture
#

he didnt have anything to do with it

#

except management

young knoll
#

The most impartial way would be to average a bunch of different use cases

onyx fjord
#

I can probably find a benchmark that shows python being faster than java

young knoll
#

Since some languages handle certain things better than others

onyx fjord
#

Bruh

young knoll
#

Lol

onyx fjord
#

Can't you just trust my word

tawdry echo
#

u know how do it??

tender shard
#

If you want to get a text component, use Component.literal(String)

tawdry echo
#

so?

jagged bobcat
#

got the enchant thingy to work ty

undone axleBOT
#

Spoonfeed a newbie for a day and they'll come back with more questions. Teach them to find their own answers and you'll both be better off: you won't get stuck answering the easy questions and they'll be much more productive than before.

glossy venture
# onyx fjord Bruh

maybe regex as i think python might outsource it to C but java implements it in java like a chad

chrome beacon
#

It's not lore

#

Not that either

#

It's hardcoded in to the client

glossy venture
chrome beacon
#

Maybe one of the item flags can get rid of it like mentioned earlier

tender shard
#

nope

#

it's POTION_EFFECTS

#

in 1.19.4 it's potion effects, I just looped over all flags

young knoll
#

Potion effects is badly named

#

It should really be called other

#

Or misc or whatnot

chrome beacon
#

For the placed on tag

young knoll
#

The NBT data canPlaceOn

#

It’s for adventure mode

chrome beacon
#

^^

late sonnet
young knoll
#

You know I’ve not actually tried

#

Can an enum constant be deprecated

late sonnet
young knoll
#

Oh true

#

So spigot could deprecate and replace that flag

late sonnet
#

Yep

#

A more generic flag

young knoll
#

I think Mojang just calls it hide other internally

#

Something like that

tender shard
#

mojang's name is ItemStack.HideFlags.ADDITIONAL

young knoll
#

Ah

tender shard
#

at least I think it's that one

young knoll
#

Yeah

tawdry echo
#

thx bro

raw crow
#

is there a way of check if an item is type of a specific tool live an axe without checking for over the all 6 types of axe?

young knoll
#

EnchantmentTarget.AXE.something

#

Includes maybe?

#

Oh that’s a tag now? Cool

sage patio
#

@young knoll i have a basic search system, when you search a player he cannot move (putting it into a List and canceling move event) but i don't know when and how remove him from the List while the searching is done.

young knoll
#

Ideally you would store their uuid

#

And then you can just list.remove(uuid)

sage patio
#

yea i know that part

#

but how i can find out the search is done

#

its a simple player.openInventory(target.getInventory);

pseudo hazel
#

what are your players searching for

raw crow
#

i can't find those tags, i am using 1.19.3

sage patio
#

by using a stick and right clicking on them

young knoll
#

1.19.4 exclusive feature moment

#

:p

pseudo hazel
#

i see, well the search would be done when the controlling player closes the menu right?

young knoll
#

Well it’s linked to vanilla tags

#

Idk when vanilla added those tags

#

Tags being modifiable is good for modders

#

But it’s kinda weird with just datapacks

remote swallow
#

private static final Set<Material> ITEM_TOOLS = EnumSet.of(Material.STOOF)

young knoll
#

Yes but you have to update that

river oracle
#

Material.STOOF

young knoll
#

Also you shouldn’t use EnumSet anymore

remote swallow
#

new material just dropped

remote swallow
#

ill update when the enum gets removed

young knoll
#

Currently there is a method to transform EnumSets in the PR

#

But it’s being debated

remote swallow
#

im voting to add it

#

backwards compat babyyyyyyyyyyyyyyyyyy

young knoll
#

Performance concerns

pseudo hazel
#

use the InventoryCloseEvent

sage patio
#

that does not work ig

#

because the open one didn't

barren peak
pseudo hazel
#

are you listening to the events correctly?

sage patio
#

tried before several times

#

^

#

also chatgpt ^

#

very helpful

ivory sleet
#

Insightful as always lol

young knoll
#

To be fair I’ve only had one question I asked it that it could not handle

#

And to be fair I’m not sure anyone really has a good answer to it so it’s fair

pseudo hazel
#

iirc you cant really open a player inventory on someone else

#

or can you

sage patio
#

i can

#

also gets modified real time

pseudo hazel
#

oh I see

#

hmm

sage patio
#

no it does not, i fixed that too

young knoll
#

Wait really?

sage patio
#

players used that bug to duplicate items

young knoll
#

I didn’t know you could open another players inv directly

#

Neat

sage patio
young knoll
#

I thought they just synced a dummy copy

#

At least invsee++ does

#

Because it has a custom layout to show offhand and armor slots

pseudo hazel
#

okay well if the events arent fired in that case I have no idea

sage patio
#

i got this idea rn, player searches some one with right clicking on them, so i add a left click with the same stick for them to stop searching

#

this is the only way ig

#

i have the players being searched in a list already

#

so i remove them while the searcher left clicks on them

#

and it can be a HashMap instead of a List
Map<Player (who searches), Player (Target)>

#

thanks all guys for help and ideas

#

does that matter?

#

hmm, make sense

tall dragon
#

yea server will create a new player object when a player rejoins

young knoll
#

Yeah keeping the player instance around is technically a memory leak

sage patio
#

btw i remove the player from the list while he leaves, but ok i change it into UUID

tall dragon
#

if you take good care to manage it correctly, by cleaning up on leave and stuff u can do it but still not really recommended

sage patio
#

yea fine

#

but one thing, is there any event or something for "left clicking on a player"?

#

ow it works for both right and left click

young knoll
#

Left clicking on a player is the damage event

#

Since yknow, that’s how you attack

#

I don’t remember if it calls the interact one too

sage patio
#

what if the player does not take damage (creative)

#

how i can find out its Right / Left click?

#

i can't understand

#

hand is hand at all

undone axleBOT
#

The PlayerInteractEvent may be called once per hand. If you only want code to be executed once, you can check the result of https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/player/PlayerInteractEvent.html#getHand(), then decide functionality.

For example, only executing code if the main hand was used:

@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
    if (event.getHand() != EquipmentSlot.HAND) { // * if the hand used is NOT the main hand:
        return; // do not progress past this point  |
    }
    // provide functionality
}
sage patio
young knoll
#

That tells you which hand triggered the event

#

Nothing to do with left vs right click

sage patio
#

hmm

#

why tonight things just get more difficult

young knoll
#

Interact entity is only called for right click

#

According to the docs

sage patio
#

no i can understand that part

young knoll
#

So you’ll need the damage event instead

sage patio
#

i mean so what i should do to find out its Right or LEft click

sage patio
pseudo hazel
#

doesnt matter

young knoll
#

I think it’s still called

pseudo hazel
#

it still makes a hit sound iirc

#

try it out

#

anyways

sage patio
#

yea lemme tryandsee

young knoll
#

Good old tas

pseudo hazel
#

you use the damage for left click and interact for right click

late swallow
#

Sorry to interrupt but I have a really quick question. When including an external library, is it considered better practice to shade the jar right into your plugin or to include it as a library in plugin.yml?

remote swallow
#

shade if its small, libraries feature only works for maven central

late swallow
#

aight thanks

pseudo hazel
#

I mean all this talk about creative is fine, but who cares about your player inventory if you are in creative

remote swallow
young knoll
#

I assume it’s hikariCP

remote swallow
#

correct

young knoll
#

Yes

#

For MySQL it will actually make a pool

remote swallow
#

yeah

#

sqlite no pool so i just made 1 connection for it all

#

okay so you know how i needed to do stuff asnyc

#

theres only 1 method that actually is required to do sql

#

and its the increment method

#

the rest i can cache

young knoll
#

You can use hikariCP for both

remote swallow
#

i am

young knoll
#

It’ll handle SQLite fine

young knoll
#

Alright well, if only one method needs to interact with the db

remote swallow
#

you wanna know the funny part

young knoll
#

Then you can only have it be a future

remote swallow
#

its a void method

#

i dont even have to change stuff

#

i was complaining over nothing

young knoll
#

How do you load the data

remote swallow
#

do it on startup

young knoll
#

For every player?

remote swallow
#

i should make that asnyc shouldnt i

young knoll
#

Why not load it when the player joins

remote swallow
#

true

young knoll
#

You even have an event you can use for that

remote swallow
#

i did actually think about that

#

my only issue is this method

#

for the leaderboard

young knoll
#

Cache it

remote swallow
#

thats what i do

young knoll
#

And refresh it every X minutes

remote swallow
#

i load it all on startup

#

so everyone can be checked

#

im gonna make my load data async

cinder karma
#

what event is fired when a player tries to take equipment from an ArmorStand?

young knoll
#

PlayerArmorStandManipulateEvent

cinder karma
#

there's an event for everything...lol

lost matrix
remote swallow
#

7smile why are you awake

young knoll
#

Hey if you have suggestions :p

lost matrix
young knoll
#

We need an EventEvent

#

Called whenever an event is called, obviously

lost matrix
#

Good thing we have no lectures for a few days

lost matrix
young knoll
#

Shhh

#

Details

remote swallow
#

oh it turns out i only actually needed 1 method to do all my sql

#

and its a void

young knoll
#

Ur a void

remote swallow
#

i was complaning i would have to recode everything over nothing

lost matrix
#

Make sure your modified collections are thread safe if you do it like that

echo basalt
#

gotta love waking up at like 2am

lost matrix
#

How do i get those flowers

remote swallow
#

yeah

echo basalt
#

oo you wanna be a pwetty boy too

#

appearance

young knoll
#

Oh yeah the profile borders

#

They don’t show on iOS

lost matrix
#

Yes, i want to have... drip or whatever

young knoll
#

💀

echo basalt
#

more graphs yay

#

ram usage is probably broken

remote swallow
#

tis is profile settings 7smile

echo basalt
#

but I can't bother learning how to do stuff

lost matrix
#

I am frog

remote swallow
#

im also frog

lost matrix
#

layeth your eyes on my indignant frog, originating from all that devilment we have to deal with on this unholy server

echo basalt
#

I'm a princess

remote swallow
#

i have utf set

#

oh thats nice

#

i have no intellisense

#

time to invalidate cahces

young knoll
#

IntelliJ tax

raw crow
#

how do i reduce a damage from an item?

    @EventHandler
    public void onCrafting(CraftItemEvent event) {
        Recipe recipe = event.getRecipe();
        ItemStack item = recipe.getResult();
        double damageReduction = switch(item.getType()) {
            case WOODEN_AXE -> 4;
            case GOLDEN_AXE -> 4;
            case STONE_AXE -> 5;
            case IRON_AXE -> 4;
            case DIAMOND_AXE -> 3;
            case NETHERITE_AXE -> 3;
            default -> 0;
        };
        // I don't know what to do now
    }
echo basalt
#

ayy I fixed it

young knoll
lost matrix
young knoll
#

Ah wait

#

Damage as in attack damage or durability

raw crow
#

damage attack

raw crow
lost matrix
#

Find out the default values for damage and attackspeed (wiki)
Create AttributeModifiers for those.
Apply them to the ItemMeta.

young knoll
#

Aha

#

There is a method for that :p

sullen marlin
young knoll
#

Material#getDefaultAttributes

#

You just need an event handler

sullen marlin
#

We need EventEventEvent

young knoll
#

Don’t worry that it will cause recursion, it’s fine

lost matrix
young knoll
#

You mean the one that does use ASM

#

Smh terrible

echo basalt
#

@EventEventHandler maybe

lost matrix
raw crow
#

@lost matrix

    @EventHandler
    public void onCrafting(CraftItemEvent event) {
        Recipe recipe = event.getRecipe();
        ItemStack item = recipe.getResult();
        double damageReduction = switch(item.getType()) {
            case WOODEN_AXE -> 4;
            case GOLDEN_AXE -> 4;
            case STONE_AXE -> 5;
            case IRON_AXE -> 4;
            case DIAMOND_AXE -> 3;
            case NETHERITE_AXE -> 3;
            default -> 0;
        };
        ItemMeta meta = item.getItemMeta();
        Collection<AttributeModifier> attrs = meta.getAttributeModifiers(Attribute.GENERIC_ATTACK_DAMAGE);
        // now what? :s
    }
#

simply add a new attributemodifier to the collection?

lost matrix
young knoll
#

The default attributes won’t be on the meta

#

Because minecraft is kinda weird

young knoll
lost matrix
raw crow
# lost matrix Always assume that you are working with immutables or copies when the original c...
    @EventHandler
    public void onCrafting(CraftItemEvent event) {
        Recipe recipe = event.getRecipe();
        ItemStack item = recipe.getResult();
        double damageReduction = switch(item.getType()) {
            case WOODEN_AXE -> 4;
            case GOLDEN_AXE -> 4;
            case STONE_AXE -> 5;
            case IRON_AXE -> 4;
            case DIAMOND_AXE -> 3;
            case NETHERITE_AXE -> 3;
            default -> 0;
        };
        ItemMeta meta = item.getItemMeta();
        AttributeModifier attr = new AttributeModifier("GENERIC_ATTACK_DAMAGE", -damageReduction, Operation.ADD_NUMBER);
        meta.addAttributeModifier(Attribute.GENERIC_ATTACK_DAMAGE, attr);
        item.setItemMeta(meta);
    }

i don't know if i did it right now, but seems correct ._.

lost matrix
#

Adding mods will remove the default ones.
So you will have negative attack damage and no attack speed now.

raw crow
#

.-.

#

well, i don't know, there are just that method and other one which is setAttributeModifiers, which requires a multimap, but i only want to change one of them, so if i use that other method i must do something to preserve other attributes? this is turning much complicated for a simple task

lost matrix
raw crow
#

hmmm ok

young knoll
#

Or

#

Use the method

river oracle
#

@worldly ingot not sure if you are around, but what is the significance of this title field being final?

    static class MinecraftInventory implements IInventory {
        ... Collapsed Above
        private final String title; 
        ... Collapsed Below
worldly ingot
#

Because changing it doesn't do anything at all

river oracle
#

I've been looking into the inventory setTitle PR rn and honestly the easiest way I found to do it without he packet hackery is removing this final field and adding a setTitle seems easiest

river oracle
worldly ingot
#

Right, so the field has never needed to be changed

#

Hence, final

young knoll
#

I mean, is the packet hackery not a valid solution

remote swallow
#

chatgpt at its finest

young knoll
#

I guess it’s liable to break but so is most of minecraft

river oracle
young knoll
#

Someone go ask John Mojang if they intend to keep it

river oracle
#

loll

#

if I were to do it with the client quirk instead of actually adding anything I was thinking I'd add like a sendTitlePacket or something instead of setTitle

#

because sendTitlePacket is more describing of whats actually being done

#

or sendTitle

#

whatever is usually done when sending packets I'd follow that naming

young knoll
#

Yeah packets are never mentioned

#

It’s usually just sendX

river oracle
#

how about like sendTitleChange or something

young knoll
#

sendBlockChange for example

#

Yeah that seems logical

river oracle
#

should I just put it in inventory view you think or is that stuff organized somewhere else

young knoll
#

Hmm

remote swallow
#

chat gpt is fuckin struggling with this rn

young knoll
#

It’s per player right

river oracle
#

hmm should I add it to humanentity

young knoll
#

It may actually belong in player then, or human entity

river oracle
#

HumanEntity probably since that is where a lot of the inventory related things are

young knoll
#

You could include a convenience method in inventory view that just calls the method for each viewer

wary mauve
#

@young knoll You know when you told me how to use the vanilla generator to make the generated sections and the rest void? I'm both pissed off and happy that it was that easy.

young knoll
#

Those methods are new, so thank whoever added them

wary mauve
#

Does world generation automatically write to the file, or should I save the world?

young knoll
#

Minecraft will handle saving

tribal quarry
#

i want to add a folder to my jar file (with path), how can i do it using jar command? or any other way in cli?

#

for example i am going to add libraries folder to eg.jar, but i need to add them to eg.jar/META-INF

#

nvm, used zip cmd, works same as jar

lone jacinth
#

Add load: STARTUP to the plugin.yml

river oracle
#

@young knoll curious on your thoughts this is what i got

    @Override
    public void sendInventoryTitleChange(String title) {
        if (!(getHandle() instanceof EntityPlayer)) return;
        if (((EntityPlayer) getHandle()).connection == null) return;
        if (getOpenInventory() == null) return; // Only send if the player is viewing the inventory

        // No need to send InventoryCloseEvent, as the inventory won't be closed technically
        EntityPlayer player = (EntityPlayer) getHandle();
        Container currentContainer = player.containerMenu;
        Containers<?> windowType = CraftContainer.getNotchInventoryType(view.getTopInventory());
        // Opens window with new title and same id as current window
        player.connection.send(new PacketPlayOutOpenWindow(currentContainer.containerId, windowType, CraftChatMessage.fromString(title)[0]));
    }

I also added a method to InventoryView called sendTitleChange that just calls this method

lost matrix
#

I have tried this in the past

river oracle
#

hm really

young knoll
#

Instead of returning spigot normally uses exceptions

#

I forgot is the standard now is Preconditions or Validate

river oracle
#

I'll tinker with it

livid dove
#

This my friends, is a java app that takes a world file and finds every single instance of an item stored in a container (uncluding shulkers within containers).

900 regions scanned in 1 minute and 50 seconds.

The beginings of a bloody phenomenal anti duping app

young knoll
#

Preconditions is what spigot uses now

#

It seems

river oracle
young knoll
#

Yeah I’ve done it

#

I can grab the code real quick

river oracle
#

I had some on hand I just forgot where

young knoll
#

?paste

undone axleBOT
lilac nimbus
#

Coll

river oracle
#

fellow vscoder

lilac nimbus
#

I compiled my plugin with maven, still error saying that the plugin didn't load

young knoll
#

Ignore the paper adventure, you see nothing

young knoll
river oracle
young knoll
#

Is it just compile with maven, put on server

tepid turret
#

Hey! I'm struggling with writing data and saving it in ymls

#

could I get some help?

lilac nimbus
#

I've compiled it 2 times now.

tepid turret
#

I have an events listener, main class and playermemory, playerutility that im going to send

lilac nimbus
#

I have it in my plugins folder.

young knoll
#

I’m not sure why you’d have an invalid zip header

#

Unless you are manually messing with the jar or something

sullen marlin
tepid turret
#

Main (ForgingSystem.java)

package me.assailent.forgingsystem;

import me.assailent.forgingsystem.events.GeneralEvents;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;

import java.io.File;

import static org.bukkit.Bukkit.getLogger;

public final class ForgingSystem extends JavaPlugin implements Listener {

    private Plugin plugin = this;

    public File playersFolder = new File( plugin.getDataFolder().getAbsolutePath() + "/players/");

    @Override
    public void onEnable() {
        // Plugin startup logic
        Bukkit.getPluginManager().registerEvents(new GeneralEvents(), this);
        getLogger().info("Plugin has now been enabled!");
        if (!plugin.getDataFolder().exists()) {
            getLogger().warning("No Plugin Folder (If this is the first time running you can ignore this, or if you wiped the plugin data.)");
            plugin.getDataFolder().mkdir();
            getLogger().info("Made a Plugin Data Folder!");
        }
        File playerFolder = new File(plugin.getDataFolder(), "players");
        if (!playerFolder.exists()) {
            playerFolder.mkdirs();
            getLogger().info("Made a Player Data folder inside the Plugin Data Folder");
        }
    }

    @Override
    public void onDisable() {
        // Plugin shutdown logic
        getLogger().info("Plugin has now been disabled!");
    }
}
subtle kite
#

Is there a way with CreatureSpawnEvent or another one that I can remove mob spawn conditions from spawners,

tepid turret
#

Event Listener (GeneralEvents.java)

package me.assailent.forgingsystem.events;

import me.assailent.forgingsystem.utility.PlayerUtility;
import me.assailent.forgingsystem.data.PlayerMemory;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;

import java.io.File;
import java.io.IOException;

public class GeneralEvents implements Listener {

    private FileConfiguration cfg;
    @EventHandler
    private void onJoin(PlayerJoinEvent event) {
        PlayerMemory memory = new PlayerMemory();
        File f = new File(PlayerUtility.getFolderPath(event.getPlayer()) + "/general.yml");
        if(f.exists()){
            FileConfiguration cfg = YamlConfiguration.loadConfiguration(f);
            memory.setForgeLEVEL(cfg.getInt("stats.forgeLEVEL"));
            memory.setForgeXP(cfg.getInt("stats.forgeXP"));
        } else {
            memory.setForgeXP(0);
            memory.setForgeLEVEL(1);
        }

        PlayerUtility.setPlayerMemory(event.getPlayer(), memory);
    }

    @EventHandler
    private void onQuit(PlayerQuitEvent event){
        PlayerMemory memory = PlayerUtility.getPlayerMemory(event.getPlayer());
        File f = new File (PlayerUtility.getFolderPath(event.getPlayer()) + "/general.yml");
        if(!f.exists()){
            try { f.createNewFile(); } catch (IOException ex) { ex.printStackTrace();}
        }
        this.cfg = YamlConfiguration.loadConfiguration(f);

        savePlayerData(f);
    }

    public void savePlayerData(File file) {
        try { cfg.save(file); } catch (IOException ex) { ex.printStackTrace(); }
    }
}
young knoll
#

What conditions

#

In recent versions spawners have a setting for light level limits

#

I’m not sure we have an api for it though

tepid turret
river oracle
livid dove
#

The MvP isnt public yet (we just got it working tonight and its held together with duct tape and dreams lmao)

moment it is a repo link will be yeeted

lilac nimbus
#
Could not load 'plugins/visc-1.0-SNAPSHOT.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: Cannot find main class `com.visc.visc.Plugin'```
lost matrix
lilac nimbus
young knoll
#

The main entry in your plugin.yml does not match your code

lilac nimbus
#

oh, got it

#

after compiling it should work?

young knoll
#

Did you fix it to point to the right class?

tepid turret
#

someone

#

please oh please

#

explain how i save stuff to a .yml file

eternal oxide
#

?configs

undone axleBOT
tepid turret
#

thats different. It is only for .config

#

sorry

#

config.yml*

#

when i want to save it per player

eternal oxide
#

read it properly

livid dove
#

A fuckin ball ache. Thats how. We spent a month on this xD

#

But scanning 900 regions in 1 minute and 30 seconds?

Yeah was worth every second lmao

spare marsh
#

Is it just me or the ocean ruins structures generated are offset from what the API tells you? I get the boundingBox lowest and highest corners and they're very very offset from where the structure actually is. Like ~50 blocks below it.

young knoll
#

Might just be a quirk with how they are spawned

#

I think they snap to the ocean floor

lilac nimbus
#

sorry bout that, im new in plugin development. And I don't know much Java

#
name: visc
main: com.visc.main.Plugin
version: 1.0-SNAPSHOT
api-version: 1.15```

java/com/visc/main> Plugin.java
#
Could not load 'plugins/visc-1.0-SNAPSHOT.jar' in folder 'plugins'
org.bukkit.plugin.InvalidPluginException: Cannot find main class `com.visc.visc.Plugin'```

Even after compiling it..
river oracle
young knoll
#

Is it com.visc or com.visc.visc

lilac nimbus
#

yes

#

done it's loaded

lilac nimbus
#

idk how but it loaded...

#

maybe cuz the .jar wasn't being updated..

river oracle
#

^

#

cuz it wasn't be ing updated

lilac nimbus
#

yea, ig

#

cuz the error was old.

#

I changed the main.

undone axleBOT
sullen marlin
#

You cut off the stack trace

#
  1. Not spigot
#
  1. @worldly ingot you broke it
#

Open a bug report (with Spigot)

#

Maybe?

#

Try with spigot and see

young knoll
#

MD can someone smell when it’s not spigot

#

I haven’t spotted it yet

#

Ope I see it now

lost matrix
#

uhm...

young knoll
#

Shh

#

It’s late

lost matrix
#

No. Its early

sullen marlin
#

?

#

Yes

#

What's your point

#

It is a bug in the server

#

If it is a spigot bug (ie happens on spigot) then open a spigot bug report

#

You are not currently running Spigot

weak meteor
#

Hello There, i was investigating about obfuscation for protecting my plugins of being decompiled.

#

Does this work for the plugins?

#

Any type of effect appears on them?

#

Or they just keep equal.

lost matrix
#

Also: If they want to decompile it then they will decompile it. Nothing you can really do about that.

weak meteor
#

But ive seen examples

#

Literally impossible to read

lost matrix
weak meteor
#

Better to just be safe

lost matrix
lost matrix
weak meteor
#

Well, idk

#

Gotta investigate more.

lost matrix
#

Latest i suppose

river oracle
eternal oxide
#

Don't worry about shitty code, everyone writes it.