#development

1 messages ยท Page 70 of 1

dusty frost
#

then just have a Spring server that reads the redis data and returns it

#

though at that point, I don't really see why you would need a whole Spring server, you could just use Redis as a nice cache

river solstice
#

yup

#

not sure, maybe I'll just stick with Javalin for now

dusty frost
#

what are you using this data for?

hoary scarab
#

I got it to work...
profile = profile.update().getNow(profile);

river solstice
dusty frost
#

oh yeah I would totally leverage Redis in this case

#

since the data should be cached anyways

river solstice
#

Not the most ideal setup, but that's what I'm currently using

dusty frost
#

then you don't need to get it on demand and the servers themselves can just lazy update whenever stuff changes

river solstice
#

Yeah but I usually need the data as-is

#

don't really want to deal with updating it

#

and haven't really used Redis

flint kernel
#

How would you reliably update information like online player numbers

#

Decrement on player leave, increment on player join?

dusty frost
#

update whenever player joins or leaves

river solstice
#

and refactoring all of this would be (probably) pain

dusty frost
#

yea

#

that's literally the easiest thing to store lol

river solstice
#

yeah it's not just online players

#

a lot of data is going through

dusty frost
#

two spigot event handlers, they're basically just jedis.incr("online_players") and jedis.decr("online_players")

#

what kind of data

#

surely you should be caching this anyways

#

might as well put it in a shared memory storage that can just be checked by everything whenever for basically no cost

flint kernel
#

i've never touched redis and even i can see there's probably some use for it here

dusty frost
#

I've come to heavily rely on Redis for stuff like this, it's just so useful as a separate memory storage sytsem

#

we use it for stuff that should persist past server restarts, logs so that they can be lazily collected, etc.

flint kernel
#

admittedly i've never really understood how redis works for more complicated data like that, my interpretation was it's mostly k-v, and when I think of k-v i always think primitive variables n shit

river solstice
#

Player data (playtimes, balances, bank balances, other server-related data, statistics), punishment information (bans, kicks, mutes, etc.).
Server data (TPS, online staff, players)
Some methods are used just for QOL, such as broadcasting, changing player ranks, balances, etc.

That's obviously not everything that's going on.

dusty frost
#

msot of that sounds like stuff that should just be in the database

#

which you can just then connect to from your website or whatever needs it

river solstice
#

Some of it is stored in memory until server restart

dusty frost
#

then that stuff you should store in redis

#

and the other stuff is already in the database

dusty frost
#

how do you mean?

flint kernel
#

queues etc

river solstice
#

Redis is just a Map<Object>

dusty frost
#

redis has queues natively

#

you can push and pop and everything

flint kernel
#

oh you meant that type of queue

river solstice
flint kernel
#

for some reason i had in my mind some sort of messaging system

dusty frost
#

uh not as reliable inherently, but yes this basically can be used like that

#

you just lpush whenever you have new stuff, and rpop whenever you want to get it

#

you usually just have a loop constantly waiting for rpop to return a result basically, then you have realtime communication

#

can also do stacks with the same thing ๐Ÿ˜Œ

river solstice
#

anyways, I guess I'll refactor it someday โ„ข๏ธ

#

to the backlog it goes

dusty frost
#

anyways yeah

#

i have centralized most of my external data just already in a separate website, so stuff like punishments and ranks and balances and stuff is already on a separate website

#

then the rest I use redis as a communication/caching layer between

flint kernel
#

how would you store like unique player data in redis tho

river solstice
#

uuids?

flint kernel
#

i'm imaginging some sort of nosql uuid -> json document kinda vibe, but redis doesn't have separate like databases n shit right? so how do 'scoped' keys work

dusty frost
#

set player-stats:d40ded56-881d-4317-9615-b221a96ff8e5 {"joins": 15, "deaths": 20}, etc.

#

you just make it part of the key

flint kernel
#

interesting

dusty frost
#

or, even better, you could have a player-stats hashmap

#

then have the key be the uuid and the value be the json

flint kernel
#

and what would that look like

river solstice
#

redis is just a big json object

#

kek

dusty frost
#

hset player-stats d40ded56-881d-4317-9615-b221a96ff8e5 {"joins": 15, "deaths": 20}

#

hget player-stats d40ded56-881d-4317-9615-b221a96ff8e5

flint kernel
#

ok yeah that style makes a lot more sense in my brain

#

so the hset/get is basically a nosql/mongo kinda vibe then

dusty frost
#

yeah the hashes have some limitations, so sometimes you have to do the first style

#

i mean not really

#

it's basically a hashmap kinda vibe

flint kernel
#

yeah but isn't mongo, with it's key -> json thing basically just the same thing, with a hell of a lot of extra steps?

dusty frost
#

i guess kinda

flint kernel
#

i've never really used mongo/any nosql system if that wasn't clear

dusty frost
#

it's just better to think about it as a Java HashMap just in a different memory heap basically lol

dusty frost
#

can't do timeouts is the one that impacts me the most

#

if you do a set, you can have it just delete after a certain time

flint kernel
#

when would you want that

dusty frost
#

expirations is more what I mean

#

when you want to cache stuff

flint kernel
#

yeah no i got you

dusty frost
#

you usually want to set a TTL on caches

#

so they get refreshed after a while

flint kernel
#

first thought that came to mind was expiring map/cache kinda vibe xD

#

can redis so it's own data pulling? I assumed it was push only

dusty frost
#

I mean not really, the point is that you push to it from your application

#

and the cache persists and is centralized

#

so if you have 5 instances of your website, they don't each cache some expensive operation, they all just share the same one

#

and when it expires, the first one to check it refreshes it

flint kernel
#

ah so lazy loading- i was imagining a timer-based thing

#

ok that makes a bit more sense

#

you mentioned rabbitmq earlier, i've heard of that, isn't that one kinda like the MC ecosystems plugin messaging channels?

dusty frost
#

it's a completely separate message queue

river solstice
#

rabbitmq, kafka, pulsar

#

all kinda do the same thing

flint kernel
#

ik they're separate, i'm just trying to grasp concepts

dusty frost
#

it's super overkill for minecraft servers basically, the point is to have millions of events that are guaranteed to be processed once and only once

flint kernel
river solstice
#

We use Pulsar where I work

#

the principle is pretty simple, you have listeners/clients and publishers

#

you publish a message to a topic, the clients listen to the topic and consume/acknowledge the message, removing it from the queue

flint kernel
#

I was about to ask if it was a pub-sub / bukkit event system kinda model (that's how i kinda understand it in my head anyway) or more something you had to constantly poll

river solstice
#

I suppose there is a similarity

flint kernel
#

constantly polling always feels messy to me

#

in any context

river solstice
#

Plugin manager calls X event -> publisher creates a message in X topic
EventHandler listens to X event -> listener/client listens to X topic

flint kernel
#

different words but yeah that's how i sorta interpreted it

river solstice
#

though once the message is consumed (successfully) it will be removed, unlike how the Event is passed to other listeners

flint kernel
#

ig if we didn't have plugin messaging systems in MC proxies, something like this is probably what we'd be using, huh?

river solstice
#

possibly, though there might be some better solutions, cant tell really

flint kernel
#

or i mean to put it another way, the plugin messaging system is just a rudimentary version of something like this

dense drift
#

PMS is so annoying ๐Ÿ˜ฆ

sterile hinge
#

plugin messages where originally intended for communication between server and client

river solstice
#

as Star said, using Pulsar/Kafka would probably be overkill

flint kernel
dusty frost
#

yeah Redis queues are generally a good in-between for being external queues but not being crazy complicated and resource-intensive

river solstice
#

I'd probably try using Redis if not the limitations of where we host our website

sterile hinge
river solstice
dusty frost
flint kernel
#

Also star you mentioned before with the expiring cache that the next site that tried to access the expired data would load it, would that be: specific site loads the data then pushes it to the cache?

dusty frost
#

yea

river solstice
#

been telling him that we should move the forums

#

though that's a lot of work

dusty frost
#

you literally just have like python data = redis.get_data("data") if data == None: new_data = generate_new_data() redis.put_data("data", new_data) return new_data return data

flint kernel
#

yeah that's what i figured, just wasn't certain

#

isn't there a small risk of overwrites tho, if 2 websites access and load it at the same time?

#

like, if you're working with data that could change in the (milli)seconds between the two

dusty frost
#

who cares

#

the whole point of a cache is that it's a snapshot of a moment in time

#

it doesn't really matter if that moment in time is a few ms later

flint kernel
#

ig

#

so, reddis for caching data accessed by external services and which isn't available from another external service like a database?

#

as like the primary reason to use it

dusty frost
#

i mean it's a shared heap basically

flint kernel
#

man i didn't do computer science i don't fully grasp those terms

dusty frost
#

memory that multiple things can access

flint kernel
#

throughout the years of reading diff forums n discords I've seen references to using reddis as a cache in front of SQL (I think you or someone else here has even suggested that for me in one or two cases)?

How does storing relational data work for a mostly non-relational thing? Ig you'd have to convert it to json or smth?

dusty frost
#

it's a per basis, usually you only want certain parts of the data, so you just fetch, for instance, a User entity and their relationships that you care about and then yeah serialize to JSON and store it

#

then the other end can deserialize it and have all the things it needs

flint kernel
#

for some reason i just got this image in my head of a service running next to redis which takes the requests and converts the data, essentially using redis as its local cache

#

is that like a thing that people do or am i just tripping hard

dusty frost
#

uh that just seems wasteful lol

#

either the service requesting or the service providing can just directly use it

#

depends on how you need the data to be refreshed

flint kernel
#

like this hypothetical service would probably be responsible for loading data into the cache too

#

like a caffeine/guava loading cache wrapped around redis basically

dusty frost
#

I mean you wouldn't use a different service for that

#

just whatever needs the caching would do it, I'm sure there's a framework like that for Java and stuff, and like you can cache web requests generically in certain cases

#

but like, that pattern is so easy to implement, it's not really worth trying to have a whole separate thing for yk

flint kernel
#

i get what u mean, for some reason it just seems like something that ur multiple website examples would want to use to ensure consistent data across all, if that's important to them

dusty frost
#

the whole point is that redis is the consistent data

flint kernel
#

yeah but i'm saying for the loading part

dusty frost
#

if you really want to be specific about it, you could have a cronjob or something that requests a load from just one of them every set interval

#

but like 95% of stuff it doesn't matter if it's a few milliseconds early or late or whatever

#

the race condition doesn't affect anything

flint kernel
#

what sort of expiration times are we talking about, cus i'm probably imaginging different things

dusty frost
#

5 minutes, could be hours depending

#

it all depends on what you're caching and how often it updates

#

sessions are a good example, usually those last days and don't change often, so just whichever website instance the person happens to log into just stores the session data

#

like, if you need realtime updates and to have the latest data, then you just don't use a cache

#

you just have it actually fetch the data every time lol

flint kernel
#

yeah that's true, i'm conflating two different ideas in my head

#

on the one hand i'm imagining the cache in-front of a database, and on the other i'm imagining it as the only data source accessible by external services (like MC server player count data etc)

dusty frost
#

"in front of" is not a good way of putting that

flint kernel
#

wot would be a better way

dusty frost
#

idk like, to the side of? lol

#

like you just check it and if it's not there, you go fetch the data and update it

flint kernel
#

in front of works if we pretend it has contextual transparency xD

#

but no i get ur point

dusty frost
#

yeah there's a difference between an internal cache and an external cache

#

one you use in your own app just to save time and one you store data for others to consume

flint kernel
#

i suppose the idea that the thing storing the data somehow doesn't also retrieve the data is throwing me off

dusty frost
#

yeah that would not be the same scenario as the python code I showed

#

that would just be one server updates a value whenever it changes, and another unrelated server reads it whenever it needs it

#

so in that case you wouldn't use expiration timers

#

cause you just always want something there

flint kernel
#

right that's what i was kinda thinking too

#

but yeah the main use-case i'm imagining I could maybe ever use Redis for is stuff like server info for consumption by discord or websites

i feel like if i was storing stats or other things accessed from discord etc i'd also cache it in redis, just so it's always available to them in an easily accessible format (json or whatever)

dusty frost
#

yeah that's a common usecase, then the website/discord can just always use that as the source of truth

#

and it's like 1000x faster than a relational database for instance

flint kernel
#

ig for the stats example, which is already being stored in the database too, i'd just have the plugin/whatever push the data to redis at the same time as the db?

dusty frost
#

yea

#

probably want an expiration on that kind of stuff though

#

or well, it depends

#

if it's a lot of stats, you don't want to store too much in redis, so just caching it for a few hours could be good if there's a lot of repeat visits

#

basically you have to understand your viewer patterns

#

for instance, if it's the kind of thing you check once in a while and only once, then you don't really want to cache it

#

if it's a thing where lots of people want to check it, then it makes sense to cache it for a while

#

and if it's something small like online player count or something, then yeah you can just store that only in redis just all the time cause it takes up a few bytes

flint kernel
#

mentally i just really struggle with the idea of services pushing to or pulling from two data sources at the same time

#

like, the expiration meaning the website etc would have to manually pull the data from the db directly

dusty frost
#

yea

#

that's probably what it should do anyways

#

you want to start with the simple stuff, then add caching on top of it

flint kernel
#

if i'm using something like redis as the "source of truth", i would've thought i'd want it to be, the source of truth

dusty frost
#

you wouldn't use it as the source of truth for data that you're caching lol

flint kernel
#

true

dusty frost
#

that's the whole point, it's a cache

#

you just can use it as a shared memory pool for other stuff, like the online player counts

flint kernel
#

i suppose it's kinda moot since i doubt i'd ever have stuff big enough to where accessing the data directly from the db is undesirable

dusty frost
#

I mean it's just about latency and stuff right

#

like for instance, I use Redis on one of my websites to cache a relatively expensive SQL query that does some data calculation, so it caches it for an hour whenever someone runs it just to reduce the number of times it could possibly be run in a day to 24

#

which is like, basically nothing right

#

a lot of the times, yeah you just want to get it directly from a database

#

but like, for instance sessions on a website, you read that on every single HTTP request, so it makes sense to cache it

#

and they can also be ephemeral, so it doesn't matter if redis crashes and deletes all the sessions, you can just have people log in again

flint kernel
#

hm yeah

#

that reminds me, for the 'source of truth' data like player count, how would you deal with server shutting down? cus the player leave event doesn't always get called does it?

river solstice
#

on shutdown set it to 0

dusty frost
#

^

river solstice
#

unless it somehow crashes without calling onDisable

flint kernel
#

on shutdown, or on startup, or both? cus what about crashes that don't safely shutdown

dusty frost
#

then you probably have bigger problems

#

and it'll fix itself when it restarts anyways

wheat carbon
#

๐Ÿ‘€

robust crow
#

๐Ÿ‘€

flint kernel
#

it's a cube and a piglet

river solstice
#

shush

dusty frost
#

damn too bad there wasn't an xp multiplier

#

i been yappin

river solstice
#

make me tier 5 i dare yall

flint kernel
dusty frost
#

i mean yeah, it probably doesn't really matter that much if it's wrong anyways

#

just a visual issue

river solstice
#

really depends on the actual scenario

dusty frost
#

yeah case by case basis for basically everything lol

flint kernel
#

well i'm just imaginging that if you don't reset it on startup and your server has crashed without resetting the count to 0, when each player rejoins you're adding to the number that was on before

river solstice
#

cache, well, is always gonna be a cache, meaning it's not always up-to-date data

dusty frost
#

redis is just a super useful tool

#

yeah I mean you would definitely reset on startup lol

river solstice
#

yeah, that just sounds like a bad impl if not

dusty frost
#

it would probably be even smarter to just set the number to whatever the actual playercount is on any event, rather than separately incrementing and decrementing it

#

that way it couldn't be out of sync if it tried

flint kernel
#

so = rather than ++

dusty frost
#

yes

river solstice
#

again, depends

flint kernel
dusty frost
#

if the value is hard to get

#

playercount, for instance, is literally just an int you can request from the server and it's already in memory at any point

#

it has basically no cost to get, so you might as well just set it every time

hoary scarab
dusty frost
#

but if you have to calculate something for instance, or if you're keeping a running total, you don't want to recalculate the whole thing every time

#

so you just increment it as you go

river solstice
#

or, if it's maintained by multiple clients (atomic counting)

flint kernel
#

right so like block placements for example (for some reason that's the idea that just came to mind)

dusty frost
#

uh, not really

#

cause block placements are also something that you can easily get

flint kernel
#

no like the count of blocks ever placed for example

dusty frost
#

oh sure yeah

flint kernel
#

again random ass thing you'd probably never store but you get the idea

dusty frost
#

cause you don't want to get everyone's and add them together, you can just add them as they come

vivid halo
#

Hello, i need help with Deluxemenus requirments, can any1 help me please?

flint kernel
#

yeah ok that makes sense

flint kernel
#

they made their own snowflake service that calculates snowflakes or something for messages i think

#

idk it was on some blog post they made

dusty frost
#

yeah that kind of stuff is different

#

once you get to super high concurrency stuff like that, you need some new tricks that shared state would just make too slow

flint kernel
#

i think that's where i got the idea for the service wrapping reddis

#

their snowflake service kinda served a similar role iirc

#

except not around the cache, obviously

#

i wish i could have more converastions like this

#

where i actually learn shit

river solstice
flint kernel
#

yeah in an environment where concurrency is at play like that i could see its usefulness

dusty frost
flint kernel
#

could do cap then decrement

#

i'd probably do that, but then you need to worry about if you change the rate limit ig?

dusty frost
#

yeah that doesn't really matter

#

the nice part of incrementing is just that you can define the cap in code and it changes instantly if the code changes

flint kernel
#

true

dusty frost
#

but if you had something more long term and changed the code with it decrementing, the value would still be the same for the people before the update

flint kernel
#

which i suppose could be good or bad

#

depending on just how long term it is and whether the new cap is lower or higher

#

and potentially the reason for the change

flint kernel
#

anyway thanks for the explainer, you've given me a bit to think about

tame bear
#

Hey good people, so i am in the beggining of minecraft plugin develpement. I have already made a spawn plugin, and now i am trying to make a home plugin. I've got it good so far, with gui, teleporting when clicking a bed.

My problem is that when clicking a TNT block in the home gui, you would get a new gui with home deleting. I have not managed to solve the problem, i made the code, but when clicking nothing shows up. Nothing in console, no command at all. I want the TNT_BLOCK to execute /delhomes. Can anyone help me with this problem, i already tried in a few days, but I ended up asking for help this time around, thanks. The Main Class Code:
https://pastecode.dev/s/FG8IuyXI

river solstice
#

didnt you ask this yesterday

tame bear
#

no one could help and wrong channel ๐Ÿ™‚

tame bear
river solstice
#

anyone knows how to replace this message in 1.20.2?

#

used to work fine in 1.19 with packets, stopped working fsr.

hoary scarab
#

Isn't it Bukkit help message or something?

stuck canopy
#

can I read or modify Entity PersistentDataContainer in EntityDeathEvent?

warm steppe
#

try

river solstice
hoary scarab
#
public void onPreCommand(PlayerCommandPreprocessEvent event) {
    if (!event.isCancelled() && (ht = Bukkit.getHelpMap().getHelpTopic(event.getMessage().split(" ")[0])) == null) {
        player.sendMessage(ChatColor.translateAlternateColorCodes('&', this.wat.getConfig().getString("UnknownCommandMessage")));
        event.setCancelled(true);
    }
}
```Is what I've used in the past.
river solstice
#

tf is this ht = Bukkit.getHelpMap().getHelpTopic(event.getMessage().split(" ")[0])) == null

#

why not just Bukkit.getHelpMap().getHelpTopic(event.getMessage().split(" ")[0])) == null

hoary scarab
#

Its super old code lol. It was meant as a cache.

dusky harness
#

Brigadier I think?

#

Idk why packets wouldn't work tho

river solstice
#

idk I tried system chat

#

doesnt detect it anymore

sonic nebula
#

spigot too

#

just refl

#

and set everything to ""

dark garnet
#

what r the benefits to using PDC instead of file (json) storage?

icy shadow
#

easier

dark garnet
#

thats it? just easier to use?

icy shadow
#

pretty much

#

takes care of all the messy stuff for you

dark garnet
#

cause im using PDC right now but i need to switch to JSON so just wanna know what ill lose

icy shadow
#

Well

#

If you use gson or something, probably nothing

icy shadow
#

you just have to do a bit of effort loading and saving files

dark garnet
dense drift
#

the pdc is saved in the data file of the player under world folder

#

now ... it depends on what you use PDC for shrug it can't entirely replace a DB

worn jasper
dark garnet
worn jasper
dark garnet
dense drift
#

MongoDB is one

dark garnet
dense drift
#

storing data in a flat file is not any better, especially if you plan to store A LOT of data

icy shadow
#

it depends how you define "better"

dense drift
#

anyways, have fun with this

dark garnet
#

its just not convenient for ppl to have to use mongo

#

๐Ÿฅฒ

icy shadow
#

just use json files

sonic nebula
icy shadow
#

u'll be fine

dense drift
#

most shared hosts offer databases, usually MySQL, and for those that self host their server, it should not be a problem

worn jasper
#

well its your choice to not use SQL xd

icy shadow
#

doesnt matter unless u have a bazillion entries

sonic nebula
#

then use flatfile

#

something local

worn jasper
#

SQL you can easily support SQLite and MySql

dense drift
worn jasper
icy shadow
sonic nebula
#

idk no reason then

#

sql is really easy

worn jasper
#

yeah

sonic nebula
#

mongo just allow u to store objecs

#

maybe instead sarlizie them to string

#

and backwards each time

dense drift
icy shadow
#

separate files solve most problems

sonic nebula
#

mongo allow u store object as object

icy shadow
worn jasper
sonic nebula
#

brister u never dealed with 1gb of data lol

#

its better to request each time

worn jasper
#

SQL is just good cause you can request just what you need

dark garnet
#

is it possible to put the sql statements behind a library?

worn jasper
#

and not a whole god damn object

sonic nebula
#

yeah i never async all the data

#

i request

worn jasper
#

that you then have to deserialize

sonic nebula
#

even if its 300 requests a second

#

i prefer

worn jasper
#

and get whatever you need

sonic nebula
#

then use memory

dense drift
worn jasper
#

yeah there are several

icy shadow
#

you shouldnt have any files that big in the first place

worn jasper
#

hibernate and JOOQ are some options of java ORMs

sonic nebula
#

i used to sperate players data by A B C (as first letter in name)

#

ended up with 1 gb of A

dense drift
dark garnet
worn jasper
sonic nebula
#

performance to dogshit

sonic nebula
#

it was when i started coding couple of years ago

#

i was thinking its a easy way to split

#

to many files

worn jasper
sonic nebula
#

Afonso i got a question do u use a library for settings player names (display over head)

#

if not what do u do scoreboard? packet manipulation?

dense drift
worn jasper
sonic nebula
#

only display name

#

not actual name

#

if u modify actual name it will mess up with many other things

worn jasper
#

actually, the library I used once, allows that without issues

#

or at least, I didn't see any

sonic nebula
#

u remember its name?

#

i want to take a look at how it was made

worn jasper
#

1s

sonic nebula
#

i dont want to use scoreboards anymore to add prefix for users... i think instead to manipulate with packet to players side only

worn jasper
sonic nebula
#

ill check it rn i hope it doesnt depend on ProLib

worn jasper
#

it doesn't

sonic nebula
#

seems promoisng thanks alot!

#

i dont know why i hate protocolLib so much

#

like maybe beacuse its dependecy

worn jasper
#

I hate it too lol

#

I hate it because of the huge amount of performance issue I already had to deal because of it

#

lol

icy shadow
#

also just saying, even if you had a comically large file, the performance wouldn't be that bad (take these numbers with a large amount of salt though)

worn jasper
#

and the funny part is usually you can't find out which plugin is doing it easily since Spark profile trigger ProtocolLib instead of the plugin using it xD

worn jasper
#

imagine loading that file for 100 players at the same time

#

lmao

icy shadow
#

sure, but consider why the file would be that big in the first place - that's presumably all the data you'd ever need

#

if you have 1gb of data per player you're doing something very wrong

#

1gb for 100 players isn't too bad though

worn jasper
#

trust me, I have seen worse

#

lmao

icy shadow
#

a database query could take close to that just from network overhead

#

have you?

#

what?

worn jasper
#

I once worked for a server that somehow had 262gb of data

#

just in player data

#

lol

icy shadow
#

๐Ÿ’€

worn jasper
#

(it was a one commission thing)

sonic nebula
#

clear cache?

#

lmao

icy shadow
#

that sounds more like they have an infinite loop somewhere

sonic nebula
#

they should clear old users data or move to different file

worn jasper
#

at least their main dev says they don't xD

worn jasper
#

lol

#

I have no idea what th they are storing

#

unless they are like tracking EVERYTHING a player does

#

or smt

#

idk

dark garnet
#

biggest data file ive worked with was 2.5 GB in yml

worn jasper
#

god

dark garnet
#

server did not have a fun time (if players spammed modifications it'd lag a ton)

proud pebble
#

i dont use protocollib to send packets anymore, legit only used it to modify packets that the server sent that i wanted to modify before hand

#

like chunk data packets,

dark garnet
proud pebble
sonic nebula
sonic nebula
#

it must be long af lines or something

dark garnet
#

shit

#

๐Ÿคช

sonic nebula
#

its small

#

i had couple of million lines

#

on my file which was 1gb

#

anyway also if we mention big files here

dark garnet
#

ok yeah sorry i misconverted somehow

sonic nebula
#

i got on my computer a flatfile with 470 million lines

#

guess how heavy this is

dark garnet
sonic nebula
#

235gb

#

and its 470 million lines lol

#

its eu db

dark garnet
sonic nebula
#

yeah alot of data

dark garnet
#

of what tho????

sonic nebula
#

lol

dark garnet
#

i love that error!!!!!

sonic nebula
#

the encryption tho

#

haha

dark garnet
#

๐Ÿ’€

sonic nebula
#

but the software which reads the file

#

was written so well

#

math tricks are amazing behind it

river solstice
#

cool

#

dont remember asking about yer flatfile

#

๐Ÿซข

sonic nebula
#

haha

#

i love using flatfiles for small things

#

like settings and etc] in my personal projects tho

worn jasper
#

that's what flatfiles SHOULD be used for lol

#

who th uses a db for some settings

#

xd

#

I mean, in some cases yeah, useful, but most...

sonic nebula
#

average user data be like

#

its way longer yeah

#

now my encryption have a seed i take from host property so if someone try load files via other server he wont get data and wont be able to reverse without trial and error for hours

#

to get the data inside (even tought thats just user data not important data)

worn jasper
#

I am so confused on why you need this

#

xd

sonic nebula
#

no real reason

torpid raft
#

yeah not sure what the benefit of this is

#

if someone gets access to the files to be able to load them somewhere else, surely they can also get the host property at the same time

sonic nebula
#

main benefit i know if someone steals my resource without decompiling and reversing it he wont be able to use the plugin

#

nah u wont be able to even load plugin on different IP from what it was compiled for

#

petrotactyl does not allow me to allow , to block people from downloading an spesfic file

#

and i allow many people to accses server panel

#

yes java is open source sort of

#

but at least it wont be so easy for someone once i feel i had enough with it ill publish it but for now i want to stay unique with my plugin lol

#

think about it whats make some rocks like diamond so valuable , that they are rare/unique... if the server plugin will get leaked many pirate copies of the server will appear and it wont be special anymoe like it is now

sonic nebula
#

sec ill shortly explain with a picture from the code

spiral prairie
#

then just encrypt it on the same machin?

sonic nebula
#

decrypt u mean

spiral prairie
#

yes

proud pebble
#

ig atleast with the player data being encrypted a rogue admin couldnt modify the data secretly without pain

#

like changing their currency amount value or smth

dense drift
#

What happens if you have to fix something?

proud pebble
#

you die ig

torpid raft
#

but maybe there are some very niche benefits still idk

worn jasper
#

it makes it harder for that to easily happen yes, but anyone can just copy your features themselves

#

either by paying another dev to do it

#

or coding it themselves

spiral prairie
#

its actually not dumb logic

#

dunno why you cant see the difference between many hours of work or many working hours' money spent and git clone

dusky harness
#

Also not everyone has the resources to copy it effectively

sonic nebula
#

and also finding the tricks that were used to create some illusions and etc

#

i dont care if someone recode it he is more then welcome

sonic nebula
dense drift
#

Idk is just dumb to encrypt data of a public plugin, idc what you want to do with plugins you make for your own server pepe_kek

sonic nebula
#

its not public... and if its public there nothing bad in it if devoloper doesnt want the plugin users to modify different data begin saved on the flatfile manually

dense drift
#

I would not install a plugin who's data I can't edit LOL

proud pebble
dense drift
#

You said that you use something from the host as a seed, what happens if the user changes the server (e.g. for an upgrade, better price)?

worn jasper
#

its not a public plugin though

dense drift
#

it doesn't make a difference, you can also change the server ๐Ÿ™‚

worn jasper
#

yeah but at that point you have access to the code and you just change it

#

and compile it again

dense drift
#

what even is the idea behind encrypting the data?

worn jasper
#

no idea

#

paranoia apparently

dense drift
#

if you don't trust those that have access to your server files, perhaps don't give them access in the first place kek
is not possible to set user read access per directory?

worn jasper
#

not in ptero

dense drift
icy shadow
#

if you're encrypting the data where exacty are you storing the private key?

torpid raft
#

from what I understood the private key is derived from client specific metadata like IP etc.

#

average dkim comment deletion

dusky harness
#

well bc u already sent-

torpid raft
#

smhmhmhmhmh

icy shadow
torpid raft
#

yeah

dusky harness
#

because there really isn't a place to put a private key

#

unless you manually enter it on server boot

torpid raft
#

yeah there really isn't a great way to do it

dusky harness
#

hola

#

!

torpid raft
#

since you're basically trying to protect the user from themselves

sonic nebula
#

i cache data

#

and rewrite files on save

sonic nebula
#

inside the plugin i dropped different checks some are even in events not on plugin launch and executed in delay

sonic nebula
#

i tested it

#

i dropped around 30 checks

#

different ones to see if it should not run on the other machine

#

if someone gonna be able to decompile reverse it and etc he should be able to rewrite is own resource too

#

suddenly there no much u can do , but at least making it harder..

#

so im not worried if someone will just download the plugin and think to publish it as a revenge or something , since once it will happen my server will be worthless , same as imagine someone get his hands on hypixel skyblock server

#

pretty sure ton of replicas that will offer different shit will appear and it will damage hypixel playerbase

lyric gyro
#

And good luck to anyone trying to decompile into something

#

I mean, they still will be able to edit the bytecode, but you knowโ€ฆ good luck with that thinksmart

turbid plank
#

Is Kotlin harder to decompile?

slim vortex
#

I hate coroutines and IR

#

So much extra work decompiling android apps

slim vortex
lyric gyro
#

You will have a hard time doing that

#

The best you will get some broken Java code

#

With a lot of garbage

turbid plank
#

oh, interesting

lyric gyro
#

I had a client coming up with an old plug-in I have made for them, which I had no source code for at that point, so I literally just edited the byte code in the place of function which caused a bug kekw

#

It was a lot of fun

slim vortex
#

How did you deal with dependencies when you were recompiling?

#

Were they all shaded?

lyric gyro
#

When you edit bytecode, you do not recompile

#

You just edit the class file

slim vortex
#

Right, I use JBE

#

But it's really not ideal

lyric gyro
#

Yea

slim vortex
#

I'm imagining it was a pretty complex plugin

lyric gyro
#

With coroutines kekw

slim vortex
#

What kind of code did you inject into it?

lyric gyro
#

I was playing around for an hour until figured out how to not break the coroutine the code was inside of

lyric gyro
slim vortex
#

I see

lyric gyro
#

But due to Kotlin stuff it was much harder than should have been

slim vortex
#

Sounds interesting

#

I haven't been presented with that kind of situation

lyric gyro
#

Good for you ๐Ÿ˜‚

#

I wouldnโ€™t want to be in that situation either

#

But had no choice

slim vortex
#

๐Ÿ˜ฏ

river solstice
#

someone give me maths how much data would it be if I'd track player movements every 3-5 seconds and save it to the database with 150~ players online

dense drift
#

Like a scheduler that gets the location every 3s?

sterile hinge
#

depends on what data you actually save

river solstice
#

basically

#

X Y Z World Uuid

turbid plank
#

Near to nothing

dense drift
#

Sounds like smth very easy to handle shrug

torpid raft
#

?

river solstice
#

I don't need yaw pitch

#

just general location

#

easy - yeah, will I flood my database? questionable

sterile hinge
#

doesn't sound like that much

dense drift
#

Clear records older than x days if you don't need them

river solstice
#

yeah I'd probably keep the week worth of it

#

if my calculations are correct it would probably be like ~250k bytes/hour

dense drift
#

with 150 online players, on a 3s interval you get 180,000 entries per hour

torpid raft
river solstice
#

oh, forgot about timestamp

torpid raft
river solstice
#

i guess it's kinda doable

torpid raft
#

which is 184 138mb of data per day (again before db overheads)

river solstice
#

hm, so it'd be like ~1.5gb for a week worth of data

torpid raft
#

thats a lotta data

#

but probably not unmanageable

sterile hinge
#

databases can probably also compact that data

turbid plank
#

Definitely more data than I estimated at first, thanks for doing the maths dude...

sterile hinge
#

alternatively, you could store deltas, might make sense especially for timestamps, but that depends on what you want to do with that data afterwards

river solstice
#

ever heard about watson mod?

#

basically uses data from CoreProtect/LogBlock and displays it in the world itself

#

I have an idea to make it be able to display player movements aswell

turbid plank
#

Saving World UUID in each entry seems a little bit expensive, instead you could create a table that associates each world uuid with an int (TINYINT if SQL), and then use that integer to identify the world, then you can save some bytes

torpid raft
#

i was assuming the world would be stored as an enum

turbid plank
#

That makes sense

river solstice
#

not world uuid

#

world name

#

but yeah, another table with worlds would make sense too

sonic nebula
#

It will be real light weight

#

I store way more data

#

Per second without problems

#

About 600 objects a second

#

Just use a db they will do all the math tricks for u

#

To save data

#

And add some performance checks like if user didnโ€™t move donโ€™t update

#

It wonโ€™t be heavy anyway if itโ€™s the question

#

I would suggest u if itโ€™s something to save disk space and u donโ€™t mind to execute expensive disk , cpu tasks

#

Compress older files

#

To save memory on disk

#

If u think problem is within something else make bulked updates to sql after reaching X requests

spiral prairie
#

jesus

#

the question is if its gonna be too much data

sonic nebula
#

Thatโ€™s the solution if itโ€™s too much

#

It will be a lot of data if he doesnโ€™t do much about it

#

Idk Iโ€™m just overthinking sorry

#

Dumb Tony

dense drift
river solstice
dense drift
#

@sonic nebula as usual, slow down with the spam smh

tight junco
#

spam more

spiral prairie
#

but yeah, dumping the week of data in a very efficient byte format and compressing it with xzip or whatever thats called at the highest compression should give you fairily good recoverability

sonic nebula
#

so i saw an cool API

#

but

#

i will better manually implement his entire resource then using a sperate jar

#

and yes its opensource if anyone wonders

merry knoll
#

doing only one is bad practice regardless

livid yarrow
#

can anybody understand timings report? Our server has some massive TPS issues.

sonic nebula
#

then 3 sperate jars

#

thanks ill try and see what the results

#

^^

#

but not sure if its gonna work since its probably not gonna run the main class

#

since its like a sperate jar like protocolLib

#

ew ew

sonic nebula
#

lightweight model languages? with API

sonic nebula
sonic nebula
sonic nebula
#

Chat gpt charges cash lol

river solstice
#

classic tony falk shizo rants

sonic nebula
#

no no real

#

why shyzo

#

shizo

gilded imp
#

schizo

hazy nimbus
graceful hedge
# sonic nebula i prefer a fat jar ngl

You lose independent and dynamic redeployment if you bundle everything into one obese jar, not that it matters if you code a little spigot plugin but Aki has a point to some extent.

torpid raft
#

morbidly obese jar ๐Ÿ˜”

#

hit the gym jar

spiral prairie
#

wheres the difference between obese jars and shade & relocate

graceful hedge
#

shading is just making a fat / obese jar no? And then relocate is just if it happens to be the case where some classes are already used and loaded up in the jvm so you avoid chaos by changing the fully qualified name (i think its called this right?) of those classes, since your jar would load them up a second time. Although iirc there is sone classloader hackery to make it work w/o relocating (to some degree)

spiral prairie
#

thats exactly what i thought

#

But tony made it seems like those are different things

graceful hedge
#

I believe the usecase of relocation is highly specific, donโ€™t think its used a lot outside of for instance mc dev.

#

i donโ€™t know, toni is toni

lavish sluice
#

Someone able to help me fix this?

java.lang.NullPointerException: Cannot invoke "me.clip.placeholderapi.PlaceholderAPIPlugin.getLocalExpansionManager()" because the return value of "me.clip.placeholderapi.expansion.PlaceholderExpansion.getPlaceholderAPI()" is null

I'm using gradle. compileOnly 'me.clip:placeholderapi:2.11.5'.

I check the plugin is loaded before registering. I have it as a depend also.

Latest PAPI + Java 17.

lavish sluice
worn jasper
lavish sluice
#

I've looked at other people's issues. Shading was their concern.

dense drift
#

Yeah that is the most common problem.

lavish sluice
neat pierBOT
worn jasper
#

Shading and not depending on it are the most common issues but I would assume you already tried that

lavish sluice
#

Yes ofc.

dense drift
#

Try to add papi as (soft) depend

lavish sluice
#

I'll give it a go

worn jasper
#

actually can you show the code you use to register? Or did I misunderstand and you are trying to do something else?

#

Also, are you using Paper plugin system by any chance?

lavish sluice
#

I am using paper 1.20.2

worn jasper
#

not what I asked

lavish sluice
#

Errors on the #register

worn jasper
#

hmmm

#

plugin.yml?

lavish sluice
#
name: ServerOnlineStatusSpigot
version: '1.0.0-Beta'
main: me.sean0402.serveronlinestatusspigot.ServerOnlineStatusSpigot
api-version: '1.20'
author: "Sean0402"
softdepend:  [PlaceholderAPI]```
#

Tried depend. with & without.

dense drift
#

Double check that your jar doesnt contain papi

worn jasper
#

^^

lavish sluice
#

Ok

worn jasper
#

so it shouldn't

lavish sluice
#

Oh

#

It does? ๐Ÿ‘€

worn jasper
#

uh?

lavish sluice
#

Would ShadowJar override compileOnly?

worn jasper
#

shouldn't since you aren't implementing it

#

if I am not mistaken

dense drift
#

do gradle clean shadowjar

worn jasper
#

could this be caused by not matching papi version in the server?

#

just random thought

#

although I would assume not much would change between versions

#

yeah ignore that

lavish sluice
#

So the shadowJar only contains my classes. No libs.

#

But for some reason it's building with all :/

dense drift
#

Send your built config

worn jasper
#

send build.gradle

#

(question is... groovy or kotlin dsl)

dense drift
#

Not like they are very different, especially for basic configs.

worn jasper
#

true

#

kotlin dsl still better though

#

although kotlin itself still sucks

#

xd

neat pierBOT
#
FAQ Answer:

Paste Services
When asking for help with a config/menu/code issue please use our paste bin:
(we prefer it over pastebin.com)
โ€ข HelpChat Paste - How To Use

dense drift
#

idk why you have all these options in shadowjar and dependsOn etc.

lavish sluice
#

I removed a lot of my personal stuff

#

dw though

#

I got another way I can do it.

sonic nebula
#

we dont tcae

#

u need help no?

#

then provoide us what we ask for...

dense drift
#

Does anyone have any resources for how to write a simple (I hope this gets clasified as simple ๐Ÿคฃ ) parser in java?
I need to turn a string like Result: {#math}5+5{math#} into [LiteralStringElement(value: "Result: "), MathElement(value: "5+5")] (string representation of List<Element>)
It gets more complex, as tags should allow attributes as well, basically XML tags with different symbols for opening/closing. {#math precision=3}100/3{math#}

sonic nebula
#

since u have { } u basically can loop

#

and get the context and do a switch case of the input

#

if i understand u correctly

#

open switch case close and thing to do with context between

dense drift
#

how is that useful

dusky harness
#

I agree with tony

#

loop chars, once you detect a { and } you can use switch case to know what to do and stuff (ex #math = run parseMath())

#

should have a method like readTextUntilBracket, etc

#

idk how to explain well without just writing the code

#

but that's like how I made a json parser - lemme see if i can find

#

it's in kotlin but should be readable

#

https://i.imgur.com/UwcRFJI.png
json uses { and [ to identify between types of inputs, but it is the same concept with #math and whatever else (when in kotlin is based off of java's switch)

#

although i feel like you might just be able to use an xml parser somehow

#

also this is very very very similar to minimessage

#

just saying

#

ยฏ_(ใƒ„)_/ยฏ

fading stag
dense drift
#

Using MM for this sounds like a bad idea if that's what you mean dkim, an idea I had pepe_kek
Plus the arguments syntax (<click:_action_:_value_> for example) is different from what I would want

dense drift
dusky harness
#

o

dense drift
#

Although I think I have an idea... after {#math} I just read everything as a raw string until the closing tag {math#} and then I parse the string separately

dusky harness
sonic nebula
#

no reason.

dusky harness
#

well idk if thats realistic depending on your tags but

fading stag
dense drift
dusky harness
#

nvm I didn't see that the ending tag has hashtag at the end

fading stag
sonic nebula
#

just use string builder

dense drift
#

Yeah I will do some testing tomorrow

sonic nebula
#

and make a method to return a xml

#

string

dense drift
dusky harness
#

both should work fine

fading stag
dusky harness
#

lemme see if i can find performance comparison

#

unfortunately it lost every time :(

dense drift
#

Jackson cool_parrot

fading stag
sonic nebula
#

vs thing to create GUI's with that has a gui

#

its like copy paste buttons and shit

#

and u can put pics as background how its called?

dusky harness
sonic nebula
#

5-6 years ago i used something in visual studio that allows really easy interface design

#

like for android apps

#

i need to design nice UI for my chat bot

#

also i found out how to make a language model + -

#

i assume it is , also ended up with ton statements lmao

#

and doing good design with JavaFX is hell

dusky harness
#

if that's what you meant

sonic nebula
#

yeah but its not android studio

#

i just givd it as an example

#

its for windows

#

hmmm dunno

#

i hate xml hate hate hate

dusky harness
#

u said its for android apps

#

or at least that part

sonic nebula
#

dkim nah its 5am i guess im no tin 100% state yeah i read it now nah i meant it simillar to android studio

#

nah i work only night shifts haha its all gucci

dusky harness
#

nocturnal tony

sonic nebula
#

tbh i have no friends ;[

#

all always sleep

#

once i wake up i appear again at wok

#

work

#

and loop

dusky harness
#

yeah I feel like having a night job is kinda tough

#

but anyways

sonic nebula
#

12h shifts

dusky harness
#

what is this designer thing for?

sonic nebula
#

i made a chat bot

dusky harness
#

like what do you want to use it for

#

mhm

sonic nebula
#

like langauge model

#

and i want nice interface because mf's eat with their eyes firstt

#

its not like gpt level or something

#

but for its goal it works pretty well

dusky harness
#

because if it's just for a website, then you can just use figma to design the site or just dive right into writing the html stuff

sonic nebula
#

nah i will later on convert it into tg/whatsapp support

dusky harness
#

but I don't think theres a javafx/android studio-like thing to auto convert it to html

sonic nebula
#

nah there wont be interface later on its just for now

#

maybe ill put font for textt

dusky harness
#

beautiful

sonic nebula
#

and color the frames

#

still will be ugly nah?

#

i just think to use some background

dusky harness
#

add some margin/padding and color
and a font

#

idk

sonic nebula
#

ig

#

r u american?

#

or aussie?

dusky harness
#

american

#

๐Ÿ‡บ๐Ÿ‡ธ

#

๐ŸŒญ

sonic nebula
#

๐Ÿฆ…

dusky harness
#

i love how those are the only two options though

sonic nebula
#

eh i remember i used to have an american friend i used to stay awake till late just to call her haha

sonic nebula
#

k getting better

#

i guess

#

some how

#

also added back send button

#

to capture space

#

instead of listening to key

torpid raft
#

sex?

sonic nebula
#

it says se

#

oh yes

#

sexy

#

ill make app crash if it doesnt have WiFi since ill load all pics from web thonking

#

i dont keep tthat heart background

#

ill put cat with whiskey instead i think this is painful for eyes

#

i dont get sponsored by whiskey but i think its like belongs to the app

#

i mean client will like it

#

i wont send any updates due server rules since its against the policy o rwhat ever

marble heart
#

what java version do you guys use for development

sterile hinge
#

depends on the software

worn jasper
marble heart
#

ye i just found out that 21 didnt work for minecraft :/

minor summit
#

I mean, it does

#

MC runs just fine on 21

marble heart
#

OKK idk it drops me an error

dense drift
#

Upgrade gradle

flint kernel
#

Gradle 8.5+ supports Java 21

marble heart
#

OKK ooof thats why i dont mess w coding stuff

#

i just now pushed to my old pr a deluxemenus fix

dense drift
#

You just need to change the version in .gradle/something.properties iirc and then reload gradle

marble heart
#

yeah i m trying rn

sonic nebula
#

the jar file

#

anyway nvm

#

i use java 7/8/16

#

it really depends on the project

marble heart
#

ye i think that i cant work w java 21 on deluxemenus :/

#

so i have to downgrade

tight junco
#

okay barry

#

making me ghostping

#

(in caps) visual studio lolxd

marble heart
#

why u ghost pinged me :/

#

yeah well

#

it works fine

#

i use it for the sftp

graceful hedge
azure heath
#

Do deluxemenus have api?

graceful hedge
#

Yeaa

#

Even open source now :)

azure heath
indigo schooner
#

Yo if someone can help me with something dm me please

#

Can someone help me with something important about other plugin?

neat pierBOT
#
FAQ Answer:
ยป Give the helpers some details
ยป Ask suitable questions
ยป Be polite
ยป Wait

Source

dense drift
sonic nebula
#

hows mac app called?

#

like exectuable

broken elbow
#

chatgpt says they are called apps or applications and they use the .app extension

atomic trail
sonic nebula
#

ill ask chatgpt how can i convert an jar to .app

#

ill search on how to run it in first tplace

pulsar ferry
dense drift
#

Without @file:JvmName it would be the name of the file + Kt = CurrencyKt btw

atomic trail
#

Ahhhh that's actually very nice, thanks!

#

I'm yet to learn kotlin, but it actually seems quite nice

hoary scarab
#

Can you not make custom enchants in 1.20.4 spigot?

sterile hinge
#

it was never officially supported

hoary scarab
#

๐Ÿคฆ NVM issues with static/private

#

I see what you mean now. Can't find out how to register the enchants anymore. Hmm...

river solstice
#

i suppose updating my plugin is gonna be fun

dense drift
#

It is now a registry that emily said you supposedly could unfreeze

hoary scarab
#

Yeah it goes deeper than that. I can't just new <enchant>(Namespacedkey) anymore either. And there is no method to set the key...

dusky harness
#

I'm surprised md_5 did this because he usually tried keeping backwards compatibility

#

Or forwards no one knows which is which

hoary scarab
#

๐Ÿคท
Java has backwards compatibility

#

Pretty sure someone on the staff wanted to convert everything to registry. They were saying it for awhile. When that happened it prevented backwards.

sterile hinge
hoary scarab
#

And there is no method to set the key...
Fuck!
@Override public NamespacedKey getKey() {return null;}

#

Another half hour wasted lol

worn jasper
#

waiting for paper to hard fork be like

hoary scarab
#

Hmmm yeah still not applying...

ItemStack stick = new ItemStack(Material.STICK);
stick.addUnsafeEnchantment(GlowingEnchant.glow, 1);
player.getInventory().addItem(stick);
spiral prairie
hoary scarab
#

They said they won't

worn jasper
#

Idk about Modrinth but Hangar never officially said it wouldn't have paid plugins

#

it's actually something they are looking into for the future.

#

They just want to make the infrastructure as good as possible

#

And besides that, Polymart and BuiltByBit probably would support paper plugins

#

so...

spiral prairie
#

Yeah Ik

#

I just think that having Hangar and Modrinth on the train would be better

#

I mean it's not like anybody is using Spigot anymore

hoary scarab
#

Contradicting statements from paper staff...

spiral prairie
#

i mean 2 months have passed but yeah

minor summit
#

we love lying, yes

spiral prairie
#

thats what i saw too

minor summit
#

no no

#

over a year

spiral prairie
#

oh shit

minor summit
#

one is from 2022 the other is from 2023 peperla

spiral prairie
#

yeah i JUST saw that... craazy

hoary scarab
#

Yeah I haven't been in that discord for ages just searched up "paid resources" lol

sonic nebula
#

wdym

#

not with offical API but with NMS

spark skiff
#

guys should i use completablefutures with files or is it overkill

tight junco
#

depends

#

is this file creation or file reading/writing

#

if you're doing it a lot, like a lot of lot it cant hurt but

spark skiff
#

both

#

what if it was just small operations?

worn jasper
hoary scarab
#

๐Ÿ‘

hoary scarab
#

Any reason why java ConsoleOutput.instance.debug(data.getClass().getName()); Arrays.asList(data.getClass().getMethods()).forEach(m -> { StringBuilder sb = new StringBuilder(); Arrays.asList(m.getParameterTypes()).forEach(t -> sb.append(t.getName()+",")); ConsoleOutput.instance.debug("Name: "+m.getName()+" Return: "+m.getReturnType().getName()+" Params: "+sb.deleteCharAt(sb.length()-1).toString()); }); Would only be displaying 2 methods when there are clearly more? I also tried getDeclaredMethods() ```
DEBUG >> net.minecraft.network.syncher.DataWatcher
DEBUG >> Name: b Return: java.lang.Object Params: net.minecraft.network.syncher.DataWatcherObject
DEBUG >> Name: b Return: void Params: net.minecraft.network.syncher.DataWatcherObject,java.lang.Object

sterile hinge
#

man what is this code

river solstice
#

peepeepoopoo

hoary scarab
#

Debug to figure out why it wasn't providing the method.
Still have no reason as to why it's not.

sterile hinge
#

have you tried using a debugger?

spiral prairie
#

oh jeez

hoary scarab
#

Nope just the strings at the moment. I have this code in another plugin running fine so it's weird that it's not functioning here.

merry knoll
#

unless you are loading on launch etc

hoary scarab
#

So any ideas why it doesn't show the other methods?

proud pebble
#

under a different compoundtag name