#help-development

1 messages · Page 296 of 1

wet tapir
#

People hide how to do things with plugins
How to get help with it

They are very "advanced" when it comes to trying to explaining it but not many people understand the details

remote swallow
#

?spoon

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.

remote swallow
#

that

wet tapir
#

@last temple I don't wanna be spoon fed a plugin.
I wanna learn how to make one my self.
With out the help on starting from a template.
The issue is I can't get clear answers on how to begin that.

#

I don't even know what tools I need.

remote swallow
#

you would need an ide

#

most people use intellij

rotund ravine
#

?learnjava

undone axleBOT
remote swallow
dry yacht
#

How about they patch the stupid display controller first to avoid having to plug in external monitors (dell especially) three times until it switches from YPbPr to RGB so 4K@60Hz actually works without crashing the monitor every few seconds. Far more interested in that than in some edge-case security fixes.

tender shard
dry yacht
tender shard
#

I got 3 displays with 2560x1440, two over usb-c and one over hdmi

dry yacht
# tender shard that sucks

I already modified the com.apple.windowserver.displays.plist to force RGB-Mode, but it still doesn't use RGB the first time I plug it in. If you google this issue, there's like a ton of people complaining and there are multiple hacks which all don't work 100%, and apple does nothing about it. Nothing, just nothing.

sullen marlin
#

presumably not an m1 since they dont support for than 1 display lmao

tender shard
#

still waiting for the m2 16" macbook pro D:

#

a bit more details pls lol

sullen marlin
#

16" is big

tender shard
#

wdym "using the original .jar"?

#

if the jar you wanna install is already maven project, then you dont need this

dry yacht
# sullen marlin 16" is big

Yep, would never want to own 16", even tho I love the screen. I'm happy that I went for 14", perfect size for the bed and for carrying around.

tender shard
#

you only need "install-file" to install .jar files that are NOT a maven project

#

you can just run mvn install from inside your project

#

and then as dependency, use the same group id and artifact for the dependency as the other project has in its pom

#

you dont need systempath

#

that's what mvn install is for

#

yes

#

and in the other project, you just declare it with scope compile

#

maven automatically gets the file, there's no need to put it anywhere

#

you dont have maven intsalled

#

just run it from within intellij

#

intellij brings its own copy of maven

dry yacht
#

Noob question: Is there some sort of way to have an unsigned byte in Java? Or do I have to use an integer, even though my value range is [0;255]?

sullen marlin
#

you can store it is a byte, but any manilpulation has to be an as integer

#

byte & 0xFF to get the unsigned int representation

dry yacht
worldly ingot
tardy delta
#

i got the 15 inch laptop or smth

worldly ingot
#

Oh y'all talking about laptops

tardy delta
#

uhhh

eternal night
dry yacht
#

How did you add the dependency? It has to be marked up like any other dependency, there's no differentiation. Check that your specified version is equivalent to the version your lib's POM specifies.

#

Noooo, we're in 2023, stuff's live by now, xD:

#

Did you check the versions? What does your lib's POM specify, what did you specify in the dependency entry?

last sleet
#

Is there any way to access an OfflinePlayer's inventory ?

#

Apart from storing a copy if it in a file or something

dry yacht
#

That's why I usually remove the snapshot suffix on my projects

tardy delta
#

its in the pom finalName prop

#

or smth

dry yacht
last sleet
#

I believe it is stored under world/playerdata/UUID.dat

dry yacht
#

Seems like there sadly isn't any API available to manipulate this kind of data.

last sleet
#

ah

sullen marlin
#

adding a getter to the api is easy

#

allowing writing, harder

dry yacht
last sleet
#

I've never really messed around with files/getting NBT data from player .dat files

#

I'll try to get something working though

dry yacht
# last sleet I'll try to get something working though

It can be tricky if you're new to it, yes. While it would be a cool learning experience for you, you can always just call for help when you're stuck on a dead end and I'll try to implement a basic inventory modifier on top of this library for you. I have no idea yet how they're serializing inventories, but I bet it's just an array of items. And there's an NBTItem wrapper in this library, so you just have to tie a few loose ends together.

last sleet
#

I'm just trying to get a copy of an offline player's inventory so I can display it in an invsee-like fashion on command

#

I can't getInventory on an OfflinePlayer

remote swallow
#

check how open inv d it

#

do it

last sleet
#

I will

#

gtg eat for now though

dry yacht
last sleet
#

no, just viewable

#

but I'm guessing if I can view it, writing to it should not be that much harder

remote swallow
#

i love shading

#

is the thing your shading another plugin or a lib

dry yacht
remote swallow
#

i have an easy fix for you, check how plug woman adds redlib

sullen marlin
#

Don't shade other plugins in if they're already on the server

tender shard
#

md_5 in which class does the commands.yml stuff happen?

sullen marlin
#

Idk

tender shard
#

I'm trying to do a plugin similar to commands.yml for bungee and I wondered how it parses these $1- arguments

remote swallow
#

unless it actually does stuff for the server why is it a plugin not a lib

#

import spigot

tender shard
#

import *.*.*.*;gg ez

remote swallow
#

check how jefflib works

remote swallow
#

bukkit im guessing

tender shard
#

craftbukkit

#

would be my guess

#

lol

remote swallow
#

so i dont think commands.yml is handled in a file that is descriptive

tender shard
#

that is unlikely

#

cant you check your commi t history to see what you changed?

#

no git no mercy

remote swallow
#

sodds law

tender shard
#

iirc maven 4 won't even allow systemPath anymore

#

which is good

remote swallow
#

there is never a need for system path imo

tender shard
#

imagine your library has group id me.mfnalex and artifact mylib and version 1.0. Now you mvn install that.

then in your other plugin, you just do this:

<dependency>
  <groupId>me.mfnalex</groupId>
  <artifactId>mylib</artifactId>
  <version>1.0</version>
  <scope>compile</scope>
remote swallow
#

do you relocate

tender shard
#

then show your getInstance method

#

does your library extend JavaPlugin?

orchid gazelle
#

Hi

tender shard
#

ah I see, so its a standalone plugin

#

in that case, use <scope>provided

#

not compile

#

you dont want to sahde it then

remote swallow
#

is the plugin on the server too?

tender shard
#

and your plugins must ofc depend: [MyLib]

#

right now your getInstance() always returns null because the constructor / onEnable never run

#

since you are using the shaded classes instead of the ones provided by the library plugin

orchid gazelle
#

I know why alex will never go to london

#

You wanna know why?

tender shard
#

i was in london many times

#

but always only during christmas time

orchid gazelle
#

Because there is no Jägermeister in London

eternal oxide
#

London is not a nice place these days

tender shard
#

that's sold in literally every place

remote swallow
#

does the uk not have jager

#

most pubs sell jager bombs

#

so thats a lie

tender shard
#

you can get jägermeister even in zimbabwe

orchid gazelle
#

Have not seen it in like 10 pubs now

tender shard
#

check out a normal supermarket

remote swallow
#

your not in the right place then

orchid gazelle
remote swallow
#

fuck london

tender shard
remote swallow
#

wrong place

tender shard
#

last time I was in london I accidentally drank water from the thames lol

remote swallow
#

why

orchid gazelle
#

Alex send me some

orchid gazelle
remote swallow
#

its probably full of sewage

orchid gazelle
#

We played darts and got sent out at 11pm =(

tender shard
# remote swallow why

we were walking along the thames at night, then suddenly we spotted a wine bottle. it looked to be full. turned out it was just disgusting tasting water. and since we were right next to the thames I assumed someone filled it up with water from it

remote swallow
#

london is weird

remote swallow
tender shard
remote swallow
#

fair

tender shard
#

i was 16 or so

orchid gazelle
#

ICANT alex being in london at christmas time and not watching darts

remote swallow
#

darts is so fucking shit

orchid gazelle
#

Then you've never been in a hall with 10k people having the best mood ever

#

Watching darts

tender shard
orchid gazelle
#

Singing songs together

remote swallow
#

common football stadium

orchid gazelle
#

Literally biggest cap I have ever heard

remote swallow
#

your the cap here

orchid gazelle
#

No

#

I experienced both things live in the stadium, and I can say that its literally 1000x better mood

faint pumice
#

@tender shard Thanks for yesterday, it worked, i set a block somewhere in the world as the enchanting table and the openEnchanting() method worked...

tender shard
#

you could maybe try this:

#

instead of setting a block, simply do sendBlockChange(...) to the player

#

so only this one client things there's an enchanting table instead of actually using a real one

#

it MIGHT work, or it might not work, lol

faint pumice
#

oh it could work 🤔

tender shard
#

e.g. sth like this:

player.sendBlockChange(myLocation, Material.ENCHANTING_TABLE.createBlockData());
player.openEnchanting(myLocation, true);
orchid gazelle
#

Depends on if its handled clientside or not huh

tender shard
#

yeah I am not sure

#

maybe it works, maybe it doesnt

orchid gazelle
#

Yeah

tender shard
#

if it works that would be great

faint pumice
#

i'll try and get back to you

tender shard
#

alrighty

sullen marlin
#

problem with enchanting tables is they rely on the books around them for their function

faint pumice
#

just another question, is it possible to change the enchanting options?

tender shard
#

the offers?

sullen marlin
#

if theyre not in the world then thats a problem

faint pumice
river oracle
#

is there any way with spigot api to get particles to stick around

#

or do I have to use NMS

tender shard
sullen marlin
#

the particle api covers 100% of nms

#

so no nms will not help you

river oracle
#

oh nice I have been using Player#spawnParticle 🤔 clearly wrong spot then

#

I guess I'll look elsewhere

tender shard
#

particles suck so hard

orchid gazelle
#

Yes

tender shard
#

they are so annoying

sullen marlin
#

youll find that they probably just have to be repeated on a timer

tender shard
#

yeah just do a while loop with Thread.sleep on the main thread /scnr

river oracle
#

okay thanks

orchid gazelle
#

lmao

river oracle
#

will do

orchid gazelle
#

If you have 1k particles

sullen marlin
#

yes

tender shard
#

great, np 🙂

#

compile = "maven includes it in your .jar"
provided = "maven lets you use the methods and classes and stuff, but the server itself has to already have those classes from somewhere"

#

and a few days ago I learnt that maven's compile is gradle's "api" and maven's provided is gradle's "apiCompileOnly" lol

#

and that gradle needs the "java-library" plugin for these scopes to exist

orchid gazelle
#

Tf

remote swallow
#

is api a kotlin thing

#

ive never used or seen api in gradle

#

compileOnly or implementation

tender shard
#

everyone in gradle uses "implementation" and "compileOnly" while the correct one would actually be "api" and "apiCompileOnly" in most cases

remote swallow
#

huh

#

weird

orchid gazelle
#

I still prefer using maven over gradle

ivory sleet
#

ye

#

well

#

no

#

but gradle nice nice

tender shard
#

right now I try to use gradle as much as possible, except if I have to shade any dependnencies, because I hate the shadow plugin

#

then you haven't seen The Matrix

river oracle
quaint mantle
#

Hello guys, im trying to open a gui by clicking on a entity, but the gui is in another class, can you tell me how to "import" the gui in the other class?

river oracle
#

?di

undone axleBOT
orchid gazelle
#

I have an idea just hanging in my mind randomly right now: for a huge minecraft server private plugin, would it be a smart idea to have heavy data in a database and IF there is a lot of memory available and the server is currently not on high load, load data from the persistant database to a high-performance in-memory database to spare some cpu-power for peak-times?

river oracle
#

?learnjava!

undone axleBOT
quaint mantle
#

Hello guys, im trying to open a gui by clicking on a entity, but the gui is in another class, can you tell me how to "import" the gui in the other class?

river oracle
#

?di

undone axleBOT
river oracle
#

?learnjava!

undone axleBOT
tender shard
river oracle
#

I "didn't help"

tender shard
river oracle
tender shard
river oracle
#

but seriously just read one lmao

tender shard
#

they'll ask again in 2 minutes anyway

river oracle
#

they are there so no one has to type everything out all the time

ivory sleet
#

the gif wth

remote swallow
#

add a ! at the end

quaint mantle
tender shard
ivory sleet
#

oh fuck I added that command, I remember now

river oracle
#

lol

tender shard
river oracle
#

all equally as useful imho

tender shard
quaint mantle
#

I cant know that links are for me if you dont say that

tender shard
#

yeah okay but now you know

orchid gazelle
#

Because for complex mc server systems, I usually have RAM free on mass but no CPU power

remote swallow
#

if they werent for you they would say probably

quaint mantle
#

Yes thanks

tender shard
#

the first one is probably the most useful one

remote swallow
#

lmfao alex we have been afk on the lobby for ages lol

tender shard
#

ik lol

#

I'm doing the aliases plugin

remote swallow
#

are we using this as spawn?

#

im bored so i might build somethig

tender shard
#

but so far I only made an Alias class and a Command class

river oracle
#

does anyone have links to the particle api or something I found the Particle class is that all there is?

tender shard
remote swallow
tender shard
#

I thought about maybe a forest

remote swallow
#

it tracks coding time

tender shard
#

e.g. with worledit, create some trees that are the "borders" of the lobby

#

that'd be my idea but do whatever you like

remote swallow
golden turret
#

nms experts

remote swallow
#

lies

tender shard
#

yeah wait Ill give you op quickly

golden turret
#

my client wants me to create something using fake entities

remote swallow
tender shard
#

ah ok

golden turret
#

to emulate the tick

tender shard
remote swallow
#

frick

#

worldedit is outdated

golden turret
#

the entity will not be added in the world

tender shard
#

ah ok

#

I am not sure if tick() will work if the level field isn't set

#

so try it out

remote swallow
#

do you think world edit visulizer needs updating

tender shard
#

can't hurt, then it stops complaining in the logs

remote swallow
#

fair

tender shard
#

sooo you update WESV, and build a spawn, meanwhile I try to finish the lobby plugin asap

#

I'll just make it very basic and add the complicated stuff later

remote swallow
#

yeah

#

ur doing the cmi stuff lol

tender shard
#

yowza

remote swallow
#

an episode for each of the shows i watch has came out

#

so ill just watch these and build

tender shard
#

alrihty :3

remote swallow
#

oh just so you know this might be awful

#

if it is please say

tender shard
#

huh

#

shouldnt intelliJ complain about using "final" on enums?

#

because enums are final anyway?

#

it complained when I added the static keyword because enums are also always static inner classes

#

why does it not complain about final?

river oracle
#

sonar lint

#

all i'ma say vscode

tender shard
#

oh wait

#

maybeee

remote swallow
#

this is hard

tender shard
#

another class could extend Command and then override the CommandSenderType

remote swallow
#

im normally always watching discord

#

not watching stuff

tender shard
#

ah now it complains. it didnt earlier because the class wasn't finished yet

strong parcel
orchid gazelle
#

Hmmm a Command API, probably I should do something like that for my plugins too lol

tender shard
#

File -> Project Structure -> SDK

#

must be at least java 17

#

?nms

orchid gazelle
#

Did anything important happen on Java Update 18?

tender shard
strong parcel
tender shard
#

latest version is 3.4.1, so just use that

#

then it should work

#

and set the version of the specialsource plugin to 1.2.2

orchid gazelle
#

For a custom player head, can't I just upload my own textures and use them as heads?

tender shard
#

they have to be uploaded to official mojang servers once

#

e.g. change your own skin to that head

#

then you can obtain the URL

#

after that you can change your skin again

orchid gazelle
#

And change it back?

tender shard
#

yes

orchid gazelle
#

So I can just upload 1000 heads and use them forever?

tender shard
#

IIRC, yes

orchid gazelle
#

Thats weird but nice lol

tender shard
#

one might think that it would work use the base64 strings, but they also just encode the URL

orchid gazelle
#

Well but if I get the UUID, it'll get the newest skin of the player?

#

Not an older texture

orchid gazelle
#

Well

#

But how do I use old textures then

#

Never worked with heads, im about to tho

tender shard
#

you upload skin1. then you obtain a PlayerProfile and can get the URL from that. Save it somewhere.
you upload skin2. get the URL again, it will be different this time

orchid gazelle
#

So I just get a Map with Heads and URLs to Heads

tender shard
#

not sure what you mean

orchid gazelle
#

Thats just how imma implement it

#

I like your blog btw.

tender shard
#

thx :3

orchid gazelle
#

Because it has interesting topics

tender shard
#

I've just written everything down there for stuff where I couldn't find a proper explanation for, myself

orchid gazelle
#

Yeah

tender shard
#

there's still about 25 unfinished posts but I never found time to finish them

orchid gazelle
#

Sometimes its hard to find specific topics in plugin dev

tender shard
#

yeah especially for newer stuff

orchid gazelle
#

Im still gonna cry about everything being clientsided

#

Ouch, getting data for the playermodel serverside hurts

#

Im on getting hit bodyparts of bullets and its the hardest pain ever

tender shard
orchid gazelle
#

Wait that does not work anymore?

tender shard
#

not on 1.18+ :<

tall dragon
#

the fact that riptide is fully client side is also very nice

orchid gazelle
#

/:

tall dragon
#

if ur using essentials ppl can just set playerweather to storm and use it lmfao

orchid gazelle
#

I wanted to use that in a plugin

tall dragon
#

woulnt it give cheats an easy way to fly as well maybe?

#

they could probably make it work even without storm

orchid gazelle
#

Yes

#

They can fs

tall dragon
#

yea very odd imo

orchid gazelle
#

Imma actually cry

#

Mojang making more and more things not work anymore

tender shard
#

yeah ...

#

it sucks

#

I get a new ticket every other day about middle click not working anymore in chestsort

#

and I always just have to say "well sorry I cannot do anything about that" D:

orchid gazelle
#

Oh no

remote swallow
#

alex if your here can you check how my island looks

tender shard
#

sure

#

tp me, I'll check it out in a few minutes

orchid gazelle
#

I have always been a guy trying to dribble and workaround and abuse systems to get crazy stuff happening

tender shard
orchid gazelle
#

And its getting ruined more and more

#

And also, f*ck microsoft for making mc require microsoft garbage accounts

#

Now every second day I can only play minecraft online with VPN somehow

#

And support does not help at all

strong parcel
tender shard
strong parcel
#

I get the error while compiling with "install"

tender shard
#

bungee's config api sucks big time. All this is needed just to recreate the saveDefaultConfig() and getConfig() methods of spigot:

tender shard
tender shard
sullen marlin
#

I guess ss or at least the maven plugin doesn't support java 19

sullen marlin
#

Is there any reason you need java 19 in particular, best practice would be java 17 which is lts and the reason used by mc

tender shard
#

can you people see the pictures I sent above? If yes, my discord is broken. if not, discord itself is broken

strong parcel
sullen marlin
#

You can make it work by overriding the SS and/or ASM version used by ss-maven

tender shard
#

you used java version "1.19"

#

it should be "19"

#

but yeah usually you wanna go for "17"

#

as md said

sullen marlin
#

And yes that too

strong parcel
#

Oh, there is no particular reason I am using Java 19. I just thought bigger number means better.

tender shard
#

if you set it to 19, it will only run on 19 and later

#

set it to 17. you can leave your sdk at 19 though

#

java 19 can also compile for java 17

#

so yeah, sdk can be anything >= 17, and <java.version> should be 17

strong parcel
#

Ayy, build success!

#

Thanks guys!

tender shard
#

np!

strong parcel
#

Now to see if the code works XD

tender shard
#

well that's your problem lol 😛

tender shard
#

can you guys upload screenshots?

orchid gazelle
#

What do you guys use for brainstorming and notes?

tender shard
#

I usually use kanban-style things

orchid gazelle
#

I am literally using an empty discord self-group lol. Because I always have discord open

tender shard
#

it has a ton of features and you can also create custom fields and stuff

#

(wanted to send a screenshot but its still not working lol)

orchid gazelle
#

Thats interesting

#

I usually just write 1 ToDo for 1 project. I just write like -Add CommandHandler -Fix Bug xy -Add Function to...

#

Im more a guy to do one task at a time if you know what I mean, I want to have function xy done before I start working on the next one

#

Im literally the definition of "out of the box", just doing what I feel like without plans sometimes

dry yacht
wet tapir
#

?learnjava

undone axleBOT
dry yacht
orchid gazelle
#

If I want to note a ToDo because I really don't want to forget something for a complex system, I just write //TODO and note that down

#

So whenever I get up the next day I know "ahh this is what I gotta do next"

tender shard
orchid gazelle
#

But mostly if you write //TODO you already would have it in your head the next time you open your project

tender shard
#

sure, but I got over 20 plugins on spigot and with wekan I don't forget stuff about projects I dont open very often

orchid gazelle
#

If you write something like that down, its important enough to get stuck in the head

orchid gazelle
#

I lose all my motivation whenever I cannot fix a bug

#

And wake up again

dry yacht
orchid gazelle
#

Same

#

If I finish a function or bug, I can think: "Ah yes I feel good about succeeding to complete this and now I can wake up in peace and start making something new"

dry yacht
dry yacht
orchid gazelle
#

I am too investigated in my personal projects and problems

#

Cannot fall asleep without thinking about my code or problems after coding

#

And I gotta say my code is the biggest mess of all time without "clean" formatting and commentation, but this way I just feel myself and know better what exactly this does and what I need to do next

tender shard
#

ah screenshots work again

hazy parrot
#

Nop

tender shard
#

wtf

orchid gazelle
#

They don't

tender shard
#

in general they work

orchid gazelle
#

tf

remote swallow
dry yacht
orchid gazelle
#

Yeah

tender shard
orchid gazelle
#

Im addicted to coding, im in vacation but want to code on my personal project lmao

dry yacht
remote swallow
#

its a spawn lol

compact haven
#

is there no boolean persistent data type?

orchid gazelle
#

I still think it may be a good thing for my plugin

remote swallow
#

store a bye

compact haven
#

i know

compact haven
#

there's a million ways to do it

remote swallow
#

more pdc prob adds it

compact haven
#

but why does it not exist

remote swallow
#

no clue

tender shard
compact haven
#

thats like nearly comedical xd

tender shard
#

More PDC Types is probably one of the most useful things I've ever written, because it allows to use basically anything as PDC type, e.g. a Map<String,List<Location>>

orchid gazelle
#

Me using SQL,NBT,JSON for everything:

dry yacht
compact haven
orchid gazelle
tender shard
#

ughm quick question, I didnt find it that quickly. GPL3 means anyone can copy/paste stuff, use it in paid and free things, can change anything, and must not credit original author, right?

orchid gazelle
#

I aint loading millions of entries at start

dry yacht
dry yacht
gleaming grove
tender shard
#

i am not sure

remote swallow
#

alex are we gonna make this spawn a void world

tender shard
orchid gazelle
dry yacht
orchid gazelle
dry yacht
tender shard
#

reason why I ask is, I used GPL3 for my older libraries and I dont want people to have to give credits or anything. I just want people to be able to use it however they want

dry yacht
orchid gazelle
#

Use MIT then

tender shard
#

is there a license that I can use that just says "Do whatever the fuck you want with this"?

olive lance
#

how would you automate minecraft server deployment with multiple machines?

orchid gazelle
#

MIT basicly permits anything

tender shard
#

ok thx

tender shard
#

alrighty thanks I'll switch to that in future commits

orchid gazelle
#

sure thing

olive lance
#

plenty of clouds out

dry yacht
olive lance
#

wish it was more sunny

quaint mantle
orchid gazelle
tender shard
olive lance
warm mica
#

ORMs are amazing

tender shard
#

copyright doesn't get "created" or something. you automatically have it

orchid gazelle
#

for example if a player has ingame currency, update INSTANTLY

quaint mantle
tender shard
gleaming grove
quaint mantle
tender shard
orchid gazelle
#

Or just update things from which I know are important instantly and sync the remaining stuff

tender shard
#

the only way to give copyright away is to die and inherit it to the heirs

tender shard
#

(at least in germany)

tender shard
dry yacht
orchid gazelle
#

I want to inherit your jägermeister

tender shard
orchid gazelle
#

alex when are we writing a Jägermeister plugin together? Or a barmixer plugin?

tender shard
#

but I got a notary-approved last will for what happens with my plugins/source code in case I'd die lol

orchid gazelle
#

Wait really?

tender shard
#

yes

#

@quaint mantle will be taking over then

orchid gazelle
#

Wow

tender shard
#

and make all the source code public on github

ivory sleet
#

alex question

#

do u have any specific code style?

tender shard
#

nothing that's cast in stone

#

what exactly do you mean?

ivory sleet
#

well im writing a pr

#

for ur pdc type thingy

tender shard
#

perfect

ivory sleet
#

so was just curious cuz of that

tender shard
#

if I don't like the style I'd just merge it, and then adjust it, so no problem

ivory sleet
#

ah alr

tender shard
#

what are you going to add?

#

unfortunately I don't get many pull requests lol

ivory sleet
#

so for yk the map data type

tender shard
#

DataType.asMap(...) ?

ivory sleet
#

yes

#

I was gonna add a builder

orchid gazelle
#

I never got a PR lol

tender shard
#

sure, sounds good

ivory sleet
#

Unresolved plugin: 'org.apache.maven.plugins:maven-source-plugin:<unknown>'

#

argh

tender shard
#

huh

#

do mvn clean package -X and ?paste the whole log pls

#

the maven-source-plugin version should be defined in the super.pom

#

do you use maven 3.6.3 or higher?

orchid gazelle
#

Aight guys gn8

tender shard
#

good night

orchid gazelle
#

Cya later alligator

remote swallow
#

how come you dont pr the boolean, char, float and some of the others into bukkit

tender shard
#

good question

#

actually, fuck, let's do that

remote swallow
#

are you just gonna add it as byte

#

1 and 0

tender shard
#

actually, the reason why I made that lib was so that I don't have to write "PersistentDataType" everytime lol

remote swallow
#

lul

tender shard
remote swallow
#

you could store it in a string

tender shard
#

NBT's "tiniest" datatype is a byte

remote swallow
#

you could probably also get away with adding uuid

tender shard
#

a byte is only one byte

remote swallow
#

location maybe, itemstack and meta maybe

tender shard
#

imho all the ConfigurationSerializable datatypes should have their own datatype

#

however

remote swallow
#

wait a damn minute

#

why can you put a file config in pdc

#

wth

tender shard
#

the reason why only the current PDC types exist is that that's exactly what NBT supports

tender shard
dry yacht
tender shard
#

I added it because I used to save playerdata in a per-player yaml file

remote swallow
tender shard
#

then people were like "this is slowing down my backups. I have 18517 players, and every player has a 3kb yaml file" so I said "alright I'll just turn the config into PDC". So i didnt have to rewrite everything, just the load() and save() methods

dry yacht
tender shard
#

@ivory sleet pls ping me when you PRed it, otherwise I won't see it

ivory sleet
#

ye

tender shard
#

thx

remote swallow
dry yacht
tender shard
#

"being neccessary" is no criterium of whether it's useful or not

eager yew
#

Hey guys, i'm trying to change the enchantment table offers, but when i do that they change just visually, and when i click the offer it enchants the item as the original offer, not the one i setted. Anyone know anything about that?

tender shard
#

?paste

undone axleBOT
dry yacht
# tender shard "being neccessary" is no criterium of whether it's useful or not

Didn't mean to talk it's usefulness down, I personally would just design the API in a way where "exotic" data-types (non-NBT-native) are encoded on top of existing values in a clearly communicated way, kind of like the PacketDataSerializer serializes varints and the like on simple ByteBuffers.

But again, sorry for intervening, I'm just gonna keep myself out of that discussion, as people do not seem to share my view of API design.

remote swallow
#

?codeblock

undone axleBOT
#

You can use the discord code block format to display code or just text in a more pleasing way:
```java
public class MyPlugin extends JavaPlugin {
@Override
public void onEnable() {

}

}```
Becomes:

public class MyPlugin extends JavaPlugin {
    @Override
    public void onEnable() {

    }
}```
eager yew
#
            if(event.getOffers()[i] == null) {
                continue;
            }
            Enchantment enchantment = getItemEnchantment(event.getItem());
            int enchantmentCost = 1;
            if(i != 0) {
                Random random = new Random();
                enchantmentCost = random.nextInt(7);
                if(enchantmentCost == 0) {
                    enchantmentCost = 1;
                }
            }

            EnchantmentOffer newOffer = new EnchantmentOffer(enchantment, 1, enchantmentCost);
            event.getOffers()[i] = newOffer;
        }```
#

the event is a PrepareItemEnchantEvent

tender shard
#

maybeeeee

#

every class / interface could have it's own pdc type

#

e.g. ItemStack.PERSISTENT_DATA_TYPE

#

that way, the normal PersistentDataType class would only have the "native nbt" types, while people could still have some more datatypes

#

and one would easily know whether it's a native type or not

#

or maybe ItemStack.getPDCType()

#

idk

#

it surely can't hurt to add it

#

I'll bug choco or lynx about it when they appear in this chat

#

and ask them about their opinion

#

CHOCO

dry yacht
tender shard
#

@eternal night @worldly ingot I'm thinking about pull requesting a lot of new PersistentDataTypes to spigot. For example, we could have a datatype for boolean, itemstack, and more. However, I am not sure where to add it.

Currently we have PersistentDataType.STRING etc. There is exactly one spigot datatype for every native NBT data type. I'm wondering whether I should add them to those, or in another class.

Example: PersistentDataType.BOOLEAN could be very useful. or PersistentDataType.ITEM_STACK. However that would break the 1:1 connection between that class and native types. I thought about creating a public field (or getter) for data types in the respective class, e.g. ItemStack.PERSISTENT_DATA_TYPE or ItemStack.getPDCType(), however that obviously wouldn't work for booleans.

So, you guys got any suggestions / opinions on whether and/or where to add those things?

EDIT: alternatively, maybe we could have a PersistentDataType.forClass(...) method or something? I don't know. Please let me know your opinions

remote swallow
#

ItemStack.PERSISTENT_DATA_TYPE just seems like a mess

#

mess

tender shard
#

yeah it was just an example

remote swallow
#

getPDT might be better

#

for those types of things

tender shard
#

the basic question is, whether or not to clutter the existing PersistentDataType class

quaint mantle
#

I seem to have an issue I cant figure whats happening.

Location l = ((BlockCommandSender)sender).getBlock().getLocation();
int radius = Integer.valueOf(args[2]).intValue();
List<Entity> entities = new ArrayList<>(l.getWorld().getNearbyEntities(l, radius, radius, radius));
for (Entity e : entities) {
  if (e.getType().equals(EntityType.PLAYER) && ((Player)e).isInsideVehicle()) {
    ((Player)e.sendMessage("Your here!");
  } 
} 

if there are more than 1 person inside the radius given here, it only picks 1 person and sends the message instead of everyone and I dont understand why its not sending to all in the radius

remote swallow
#

for the rest they should probably go in the respective class

tender shard
#

but that would break the 1:1 connection between NBT types and existing PDC types

remote swallow
#

could do something like ExtraPDT.BOOLEAN

#

ect

tender shard
#

alternatively, maybe we could have a PersistentDataType.forClass(...) method

#

that returns the correct data type, if there is any

remote swallow
#

that might work

#

if it doesnt just wrap it in byte array maybe?

#

then you can add anything

tender shard
#

right now I just wrap all ConfigurationSerializable things into a byte[]

#

for some things, there'd for sure be a better way

#

e.g. a Location could be a nested PDC with x: 1, y: 2, etc

remote swallow
#

couldnt everything be wrapped in byte[]

tender shard
#

yes sure

remote swallow
#

but for some things other methods might be better

#

so those you define

tender shard
#

exactly, e.g. for location you could just use a nested PDC that holds double values

remote swallow
#

oh theres one thing you would probably want to check

#

the meta on an itemstack

faint pumice
remote swallow
#

if the name + lore is maxed out it could just die when it gets pdt'd

tender shard
remote swallow
tender shard
#

List is just an interface, you cannot instantiate it. You have to use ArrayList (or another explicit List implementation) to create any object

faint pumice
tender shard
#

i would rather use a stream

#

getNearbyEntities(...).stream().filter( ... ).forEach(...)

#

sth like that

faint pumice
remote swallow
#

oh alex how the hell does bungee reconnect work

tender shard
#

I am not 100% sure, but in 95% of cases, any collection you get through bukkit is immutable

dry yacht
remote swallow
#

how does the player stay connected while the server isnt online

tender shard
#

it simply blocks the "disconnect" packet and send some titles meanwhile and acknowledges every incoming packet I guess

remote swallow
#

why does that work lol

tender shard
#

why wouldn't it?

#

lol

remote swallow
#

because the server gets turned off

#

how does it block the discon packet

#

oh wait

tender shard
#

it injects a custom listener to netty

remote swallow
#

its on the proxy

tender shard
#

yeah sure it's a proxy plugin lol

remote swallow
#

yeah

#

that makes sense now

tender shard
#

😄

#

but yeah it's indeed a bit like magic, altohugh actually very easy

dry yacht
# remote swallow because the server gets turned off

Doesn't matter if the server dies, as the client doesn't connect to the server, but to the proxy. The proxy just keeps the socket alive, doesn't allow disconnect to pass through to the client and sends some other packets in the meantime. It seems like it's magic, but it just uses basic traffic routing logic as well as some protocol trickery.

ivory sleet
#

@tender shard I hate java generics

#

not fkn structurally typed

#

anyway

#

I want your insight

eager yew
tender shard
#

they suck

#

maybe some people could state their opinions, would be appreciated

tender shard
#

I've spent a fucking day to get these asMap(...) methods etc to work properly without dirty casts

#

especially the arrays were annoying

#

that's why they require you to toss in an empty array of the correct type while retrieving values

#

same like List.toArray(...)

dry yacht
# eager yew Thx my friend, i will try later.

You're going to have to cache your generated offers between PrepareItemEnchantEvent and EnchantItemEvent, then use EnchantItemEvent#whichButton to get which of the three offers got clicked (0-2) and clear the map EnchantItemEvent#getEnchantsToAdd to then add your custom enchantments to it.

You have to keep that little state yourself, as the API provides no way to get your offers back in the second event. Quite sad actually.

dry yacht
ionic thicket
#
    public void onPlayerInvClick(InventoryClickEvent event){
        
        if(event.getClickedInventory().getTitle().equals("Menù")) {
            event.setCancelled(true);
        }
        
    }
    ``` is there anything wrong?
remote swallow
#

yes

tender shard
#

yes

ionic thicket
#

ok lol

remote swallow
#

you shouldnt be checking inventory name

tender shard
#

^

#

you should keep a List or Set or Map or whateveer of your custom inventories

#

and use that to identify them

remote swallow
#

^^

tender shard
#

for example you could have another plugin that creates a GUI with the same title

#

then you'd be fucked

#

and not in the good way

remote swallow
#

or it wouldnt surprise me if there was a packet to just change the name and that would cause more problems

ionic thicket
#

like

#

you mean like an id?

buoyant viper
remote swallow
#

oh damn

buoyant viper
#

time to PR it

remote swallow
#

you havent pr'd ur motd and playercount stuff yet

tender shard
#
List<Inventory> myInventoes = new ArrayList<>();

///

// create inv
Inventory mvInv = Bukkit.createInventory(...);
myInventories.add(myInv);
player.openInventory(myInv);

// listener
if(myInventories.contains(clickedInventory)) // do stuff
buoyant viper
#

ClientboundSetContainerTitle packet when?

remote swallow
#

if those inventories are in another class make it a private var and create a getter

buoyant viper
remote swallow
#

ah

buoyant viper
#

like i did with BT but didnt? idk

remote swallow
#

make sure to create a branch for it too

buoyant viper
#

ye

remote swallow
#

i fucked up some prs on github by not making a new branch lol

eternal night
tender shard
#

I mean YamlConfiguration also has getString(), getLocation(), getItemStack(), ...

eternal night
#

because they can be implemented in a few different ways

#

yea

tender shard
#

why not also have this for PDC types

buoyant viper
#

dont PDCs hook directly in nbt actually

eternal night
#

they do

buoyant viper
#

so u would need to change the underlying NBT api no?

tender shard
eternal night
#

in my opinion, it is better to leave this up for libraries

remote swallow
#

also, couldnt having those as pdc type make people use pdc for more than it should

buoyant viper
#

hm

tender shard
#

you would just declare some public PersistentDataType<?,?> fields or methods

eternal night
#

The way you implement an ItemStack[] PDC type may be completely different to the way I do it

tender shard
eternal night
#

boolean I can see yea

tender shard
#

for ItemStak and Location, I agree, there would be different methods to implement it

eternal night
#

as a nice wrapper around the byte type

#

tbf, maybe even uuid

remote swallow
#

yeah

#

uuid would be pretty useful

tender shard
#

yeah that's what others already said too

eternal night
#

but not much beyond that in my opinion

buoyant viper
#

oh, booleans still arent native NBT type? wat

eternal night
#

nah, bools are just bytes

remote swallow
#

do we have an int and double as pdc?

eternal night
#

in nbt

remote swallow
#

those also might be useful

tender shard
#

I'd appreciate it if you could reply to the thread @eternal night so we have all opinions in one central place, in discord discussions tend to get lost

buoyant viper
#

makes sense for compression/space saving :v but damn

eternal night
#

ah

#

yea lemme post there

tender shard
#

thanks

#

oh epic

#

you finally have a profile pic on spigot

remote swallow
#

just added it

worldly ingot
tender shard
#

but why?

#

whom would it hurt?

remote swallow
#

but storing uuids, ints and doubles

worldly ingot
#

More or less a thing for libraries to implement. The PDC API is extendable for a reason

tender shard
#

the config classes also have getItemStack(), getLocation() and stuff

remote swallow
#

the ints could be useful for storing task id

tender shard
#

I think it would only make sense to keep both "the same" kinda

worldly ingot
#

I think granting developers access to the most primitive of types should suffice

tender shard
#

but then why do we have Configuration.getItemStack

worldly ingot
#

Configurations are a Bukkit concept

#

NBT is not

tender shard
#

if the "most primitive types" should suffice, there also shouldnt be getLocation() etc

#

yeah NBT isnt, but PDC is

#

I mean spigot also didnt invent SnakeYaml

worldly ingot
#

PDC wraps NBT

tender shard
#

and Configuration is a wrapper for SanekYaml

#

SnakeYaml*

worldly ingot
#

I would not extend further beyond types that Mojang themselves use

#

So a UUID type would also be fine, but I'd mirror their implementation of an array of 4 ints

tender shard
#

I'm currently using 2 longs for UUIDS

#

basically the same

worldly ingot
#

Yeah I'm not sure why Mojang opted to use 4 ints

#

But they did, so again, I'd mirror that behaviour

tender shard
#

hm okay I didnt know that they do it like that

#

yeah anyway choco, would be nice if you could post your opinion in the thread, even though it's the opposite of my opinion

worldly ingot
#

I think it's a relatively recent thing. They have some places where it's two longs (see attribute modifiers) and others where its 4 ints

#

Like dog owners iirc are 4 ints

tender shard
#

lmao I just thought for a second that you talk about real life dog owners

#

but could you please post your opinion in the thread? That way I get a better overview about what the community thinks, so I wouldn't waste my time writing a PR that would then get denied anyway haha

worldly ingot
#

Yeah that's fine

tender shard
#

thxxx

eternal night
#

I mean, same reason spigot does not include IF or ACF

tender shard
#

well that reason is probably more CLA related

eternal night
#

community iterating over concepts is an important part of the API

#

you get the point tho

tender shard
#

anyway, if you guys all say "boolean and UUID is fine, the rest isn't", then sure, no problem,then I'll just PR those

#

a small improvement is better than no improvement at all :3

eternal night
#

Hmm, yea I guess UUID with 2 longs should be good ?

#

¯_(ツ)_/¯

#

boolean for sure

tender shard
#

yeah but as choco said, mojang uses 4 ints instead of 2 longs

worldly ingot
#

Mirroring Mojang is probably best

eternal night
worldly ingot
#

Despite it being weird af lol

eternal night
#

exactly the point of why shit like this shoukd not be in the API

tender shard
#

I definitely would have used 2 longs

#

and tbh - who cares how mojang did it?

eternal night
#

people might

#

hence API pushing shit is meh

tender shard
#

so we all agree that at least adding boolean and uuid to the original PDT interface can't hurt, right?

worldly ingot
#

2 longs is honestly easier to serialize so whatever

#

Yeah

eternal night
#

At least I don't mind 😝 once you have the PR open I am sure downstream will talk about it too

tender shard
#

alrightyyy

eternal night
#

so maybe some more input from that side at that point

tender shard
#

yeah you'd have to forward that discussion to me lol

dry yacht
# tender shard and tbh - who cares how mojang did it?

90% of people won't, but those 10% that want to integrate with other systems which expect mojang format will.

But then again, on the other hand, they can just use their own implementation. The interface seems like a nice to have, not like you have to use it.

eternal night
#

it'll end up on the PR if needed 👍

tender shard
#

PDC uses it's own NBT "container" or however it's called so I don't think there's any problems with doing it differently than them

eternal night
#

it is readable in the client 🤔

#

and in the config

#

¯_(ツ)_/¯

tender shard
#

yeah I just wanted to say - nobody is going to use the mojangson "readUUID" method to read something coming from BukkitValues

worldly ingot
#

inb4 PersistentDataType.UUID_4_INTS & PersistentDataType.UUID_2_LONGS Kappa

eternal night
#

like really, really stupid stuff

tender shard
#

yeah okay true haha. but tbh when someone messes with NBT, they are using NMS, and those people should know that they are "on their own" when doing that

#

I mean it doesn't really matter whether it's 2 longs or 4 ints, so might as well do what mojang does

dry yacht
# tender shard nobody would however read the NBT tag called "PublicBukkitValues" and expect it ...

No? Why not? NBT has been created by mojang because they weren't happy with what's out there and wanted something special. You now use that internal representation format to roll your own representation on top of it, rather than sticking to conventions. If we know for a fact how mojang depicts UUIDs, why not follow that implementation 1:1? You just create more possibilities which don't solve any problems (not meant in a bad way! :)).

remote swallow
#

is it possible to create something like PDT.UUID or PDT.UUID.2LONG

tender shard
#

if mojang uses 4 ints for a UUID, we could also just do that

eternal night
remote swallow
#

im just wondering

#

if thats possible

tender shard
#

lmao lynx

remote swallow
#

it defaults to 4 ints but you could specify 2longs

tender shard
#

I love how lynx said "this is not a good idea, there's already libraries for this" and then sent a link to my lib lol

#

but yeah I get your point

#

it's definitely a valid point

dry yacht
# remote swallow if thats possible

Everything is possible, the question is just whether it should be done. Why have two different ways of serializing the same type? It just creates confusion and room for errors, while not solving a single problem.

ivory sleet
#

@tender shard alr

remote swallow
#

true and yeah

ivory sleet
#

got it down

#

think that ought to work

remote swallow
#

wait

#

are you a banana

sullen marlin
#

The itemstack example is bad because mojang does serialize itemstacks to nbt

worldly ingot
#

FeelsShulkerBoxMan

#

If ever we were to add an ItemStack implementation for PersistentDataContainer, I would personally rather it be implemented in CraftBukkit and have the DFU handle it if necessary

#

but I'm still sort of against it lol

tender shard
#

it'd be a nice addition without any downsides and would maybe make more people use PDC - somehow way too many people don't even know that it exists

dry yacht
dry yacht
tender shard
#

idk there's a ton of usecases to store a boolean in a PDC

worldly ingot
#

I've had plenty reason to, yeah

tender shard
#

player: "hasAcceptedServersTOS" -> boolean

#

idk whatever, there's a ton of usecases for booleans

#

ofc, people could use a byte and check whether its 0 or 1

#

but it also can't hurt to just create a boolean datatype

#

ofc everyone right now can already do anything they want with PDC. It's not about whether adding new types is required, it's simply about whether it wouldn't be **convenient **to do so. For those things where there's different approaches, like ItemStack, I understand that some people don't want it to be added. But we can all agree that the only way to store a boolean is to use a byte that's either 0 or >0, so why not at least add that?

wet breach
tender shard
#

I simply don't understand why some people are against a boolean PDC type

#
boolean isTrue = myItemMeta.getPersistentDataContainer().getOrDefault(myKey, PersistentDataType.BOLLEAN, false);
#

what's the problem with that

#

lol

wet breach
#

I am not. Just stating and partially agreeing with you that boolean does have a use

dry yacht
#

I just realized that I'm arguing over an API that I'm not even in the target demographic of, as I would always have a wrapper serializer for anything more complex than vanilla NBT datatypes. I should stop at this point, lol.

Btw, don't forget about bytes being signed, so a != 0 may even be better than > 0.

tender shard
wet breach
#

Ah ok

tender shard
wet breach
#

Might have to post my two cents worth on it

tender shard
#

my bad

tender shard
#

erm

#

you all know what I meant

#

lol

dry yacht
#

yup, haha

wet breach
#

False does not mean 0. False in java just means not equal to 1

tender shard
#

yeah frostalf, it's almost 5 am here, we all know what I meant lol haha

wet breach
#

If you really want to dive into the intrinsics of booleans lol

tender shard
#

I don't want to do that

dry yacht
wet breach
#

No they dont

#

False has always been anything not equal to 1

tender shard
#

I just want to get opinions, preferrably in the thread and not on discord, about whether people which data types would be a nice addition to the api. basically everyone agreed that boolean and uuid would be nice. I still stand my ground that all other seriazable objects like ItemStack, ItemMeta, Location etc would also be nice, although I understand that some people are sceptical about those

#

e.g. a location could be stored as byte[] using BukkitObjectOutputStream, or it could be a nested PDC

wet breach
tender shard
#

but we all agree that having a BOOLEAN or UUID type can't hurt, right?

wet breach
#

I agree

tender shard
wet breach
#

It is more of convenience to have it there then to not have it

tender shard
#

I'm open for any opinions, as long as they include an explanation on why one thinks what they think

wet breach
#

Two different things. Because 0 doesnt equal 1

#

If you ever looked at the code for boolean implementation you will see that it compares it to see of it equals 1 or not. Not if it equals 0

#

Now there could be an implementation that specifically does that since there is like millions of languages lol

dry yacht
tender shard
wet breach
#

It is generally implemented that way because you only need to check for one state not both

#

So its easier to check for the on state or true. Anything not on or true is false

worldly ingot
#

i just want my shit to work, i don't care how it does it

wet breach
#

Lmao

worldly ingot
tender shard
worldly ingot
#

I am a Windows user

#

Bite me

remote swallow
#

sudo apt remove Choco

tender shard
#

macOS people like: "Wow, the weather is so nice. The flowers are beautiful. My dog has to take shit." They don't talk about their computers bc macs simply always work just fine 😛

dry yacht
wet breach
#

Now in java depending what you are doing it is better to use a byte for 1 or 0 in terms of boolean checking because it takes less resources that way. But that is why if its purely internal you should just use a byte

dry yacht
tender shard
river oracle
#

I would also love to know jvm impl but I'm probably way too stupid to understand any of it so I just don't

wet breach
#

The only things missing from openjdk is just the sun packages because those are proprietary.

tender shard
remote swallow
wet breach
#

OG choco will always be better like gnome

tender shard
#

"og choco is in da hooouuuze"

wet breach
#

Yes i have played all of the gtas

#

Including gta 1 and 2

warm light
#

why my log is always black & white? I am using color code but its not working

wet breach
#

Log strips colors away. So console can be colored but the logs wont

dry yacht
# wet breach Look at openjdk source

It's just that I have zero experience with the codebase and gonna take forever to locate that exact section of code. But I'll have a look. Downloading that big thing through it's slow hosting server right now.

@quiet ice would know that from the top of their head for sure, but well... Not at this time of the day, lol.

wet breach
#

Lol

tender shard
dry yacht
#

my lord

wet breach
#

You have some slow internet

tender shard
dry yacht
warm light
#

I mean in console

#

for my plugin

wet breach
dry yacht
# warm light I mean in console

There are, if you use Bukkit.getConsoleSender().sendMessage() and use color-codes, or whatever it was. They are translated to escape sequences for terminal colors somewhere in chain.

ivory sleet
#

@tender shard i prd btw

wet breach
#

Need to use ChatColor to color log output to console. Hex colors dont work for that if i recall

ivory sleet
#

check it when ugot time

dry yacht
wet breach
#

I dont use it

dry yacht
#

The download finished, thank god.

wet breach
#

Always used oracle because it works best on windows

#

Also encountered less problems with oracle jdk as well

dry yacht
# wet breach I dont use it

I also don't use chromium, yet I am happy that it is another force on the browser engine market keeping competition up.

wet breach
#

And unlike most here i do have a license to use jdk commercially 🙂

buoyant viper
#

i think rheyre trial versions of 1 & 2

tender shard
#

hannah did you watch grey's anatomy?

#

or scrubs?

wet breach
#

Its called cops and robbers and their cabinet games

tender shard
#

are* free*

buoyant viper
tender shard
#

scrubs?

wet breach
#

You need an emulator for them

#

Since they are cabinet games

buoyant viper
#

i forget how i managed to play the ones i have

tender shard
buoyant viper
#

since they dont run on windows natively

#

not recent windows at least

wet breach
tender shard
#

gog is love, gog is life

wet breach
#

That is why though gta starts at 3

tender shard
#

isn't gta 3 this "claude" dude who also appears in GTA:SA?

#

the one who does racing lol

#

the dude who never talks

buoyant viper
#

well SA is after 3 isnt it

tender shard
buoyant viper
#

true

dry yacht
#

From the IntegerValueImpl, not sure if they partially self-host, as I could only find this kind of logic in a .java file, not in c/c++. But it's a nice first indicator.

tender shard
#

gta 3, vice city, then san andreas

wet breach
buoyant viper
#

yee

tender shard
buoyant viper
#

i have like a trilogy pack for the PS2 lol

wet breach
#

Nice

#

Keep them in good condition and they will be worth a lot

buoyant viper
#

i got it for $20 at walmart in 2018

wet breach
#

Only because you cant really find ps2 games as easily anymore

tender shard
#

I once got gifted the whole valve package. e.g. CS, CS:source, half life, half life 2, TF, TF2, ...

dry yacht
tender shard