#help-development

1 messages ยท Page 51 of 1

rapid aspen
#

if (p.getGameMode() == GameMode.SURVIVAL) {

compact haven
#

yes

rapid aspen
#

p.getInventory().addItem(heart);

#

and in here

#

i want to do like: /withdraw 5 and it give me 5 hearts

iron glade
#

So it gives you 5 of those items and removes 10 hp from the player?

rapid aspen
#

yes

#

the hp i think already works

#

but i need to give the number of items

iron glade
#
ItemStack heart = new ItemStack(Material.NETHER_STAR, amountOfItems);```
#

Check if the player has >= hearts than the amount he wants to get

#

ah sorry only >

#

otherwise it just kills him

rapid aspen
#

if(((Player) sender).getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue() <= Integer.parseInt(args[0]) * 2) return false;

#

it already check

iron glade
#

The whole command class is a bit messy

rapid aspen
#

if (p.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue() <= Integer.parseInt(args[0]) * 2) return false;

iron glade
#

I don't see you checking for args.length anywhere

rapid aspen
#

better?

#

(args[0]) * 2)

iron glade
#

There could be no args[0]

#

that's why u have to check args.length == 1

#

and then you have to check if args[0] is a number

rapid aspen
#

ok

#

im new to java

#

i gonna try and send here

iron glade
#

No worries

#

We're here to help

rapid aspen
#

thx

drowsy helm
#

anyone know how to make it so custom entities dont reset when the chunk unloads?

rapid aspen
# iron glade We're here to help

try {
Integer.parseInt(args[0]);
if (p.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue() <= Integer.parseInt(args[0]) * 2) return false;
} catch ()

#

what i put i catch?

carmine nacelle
#

NumberFormatException

waxen plinth
#

Why do you call Integer.parseInt(args[0]) twice

#

And you don't even do anything with the result of one

iron glade
#

?paste

undone axleBOT
rapid aspen
#
if (args.length == 1) {
    try {
        Integer.parseInt(args[0]);
        if (p.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue() <= Integer.parseInt(args[0]) * 2) return false;
    } catch (NumberFormatException e) {
        p.sendMessage(ChatColor.RED + "You have to write a number");
    }
}```
carmine nacelle
#

you could just use player#health

waxen plinth
#

That's not the class

rapid aspen
#

?

carmine nacelle
#

No

#

What is "amountOfItems"

rapid aspen
#

thats

carmine nacelle
#

I assume you are wanting to make it the parsed arg

rapid aspen
#

not for now

#

yes

carmine nacelle
#

well u gotta declare the variable outside the try and set it inside

#

check if its not null at the end..

iron glade
#

The way I'd do something like that would probably be something like

    public boolean isInt(String s) {

        try {
            Integer.parseInt(s);
        } catch (NumberFormatException ignored) {
            return false;
        }

        return true;
    }```

Then after checking
```java
if(args.length == 1) { }```

I'd use
```java
if(isInt(args[0]) { 
int input = Integer.parseInt(args[0]);```
carmine nacelle
#

^

iron glade
#

and now you can check if input > the player's hp

rapid aspen
#

ok thx

#

if (args.length == 1) {
try {
Integer.parseInt(args[0]);
} catch (NumberFormatException ignored) {
return false;
}
}

#

like this is good?

#

i will go to bed now, can we talk tomorrow?

iron glade
#

you can literally copy and paste the isInt(String s) method into your utility / main class and access it from your command class

iron glade
rapid aspen
#

thx

charred pollen
#

i'm trying to only make the hoe's replant when the durability is above 0

carmine nacelle
charred pollen
#

interacts with wooden hoe or other hoe's

#

to crops

glossy lily
#

any1 know how to fix playerinteractevent firing right_click_block twice/thrice? already searched & tried multiple fixes to no avail

charred pollen
#

tried damageable.getDamage() > 32 then wooden can't replant cause the durability is under 32 not sure what is happening

#

but when its 0 or 1 keeps going negative

glossy lily
#

already tried, but maybe im not implementing it right?

#

how would you implement it?

carmine nacelle
#

if e.gethand = right return

#

lol

#

pseudo ofc

glossy lily
#

you're checking if the hand is the right hand?

glossy lily
#

got any better ideas?

iron glade
carmine nacelle
#

if(e.getHand() != EquipmentSlot.HAND) return;

glossy lily
lime moat
#

I specify my GUI items like this: java GuiItem guiItem = ItemBuilder.from(Material.STONE).asGuiItem(event -> { event.setCancelled(true); String test_message = main.getConfig().getString("test-message"); player.sendMessage(MiniMessage.miniMessage().deserialize(test_message)); }); How could I add a certain CustomModelData/nbt to it?

I'm using TriumphGUI if it matters.

#

I can also chance GUI libraries if there's something that makes it easier/better...

carmine nacelle
#

CustomModelData is on the itemmeta

lime moat
iron glade
#

ah sry I misread

#

CustomModelData goes to the item meta?

#

why don't grab the guiItem's itemStack and from there on its itemMeta, edit it and put it back on the item?

glossy lily
#

i only clicked once

#

doesn't work

#

any other ideas?

carmine nacelle
lime moat
#

Erm, how shall I do that? I've never worked with itemStacks/itemMetas.

lime moat
iron glade
#

and from there on you just have to know how to edit the CustomModelData of its meta and set it back

desert frigate
#

how come this simple line of code doesnt work?

glossy lily
#

aaaaaaaa i need a good solution

glossy lily
#

its causing a bunch of errors with certain things

carmine nacelle
desert frigate
#

yeah ty

iron glade
#

Is there a way to remove a player from tab list without making him invisible?

lime moat
#

Another quick thing, how can I make colors work with the title here: java Gui gui = Gui.gui() .title(Component.text("&dTest")) .rows(6) .create();

iron glade
#

use ยง instead of & or do .title(Component.text("Test").color(NamedTextColor.YOUR_COLOR))

lime moat
#

Thank you!

iron glade
#

np

worldly ingot
#

Legacy in a text component is a sin and you should be crucified if you do it >:((

#

If that's Adventure, you can do Component.text("Test", NamedTextColor.LIGHT_PURPLE)

lime moat
#

Fair enough, the GUI guide just had this as default, so I used it haha

#

Another dumb question... ```java
public class JoinEvent implements Listener {

@EventHandler
public void onJoin(PlayerJoinEvent event) {
    event.getPlayer().setResourcePack("https://www.dropbox.com/s/rieh4n8tvkjh1gw/dd.zip?dl=1");
}

}``` How can I determine if they accepted or declined the pack?

drowsy helm
#

PlayerResourcePackStatusEvent

#

you can also force them to accept it

#

or it will kick them,

lime moat
#

Thank you very much!

drowsy helm
#

nws

drowsy helm
glossy lily
drowsy helm
#

it fires for both main and offhand

glossy lily
#

didnt do anything

drowsy helm
#

show your code

glossy lily
# drowsy helm show your code
package plugins.neptune.neptune;

import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.block.Action;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;

import java.util.Objects;

import static org.bukkit.Bukkit.getServer;

public class Interact implements Listener {
    NamespacedKey key = new NamespacedKey(Neptune.getPlugin(), "item");
    CustomItemEvents customItemEvents = new CustomItemEvents();

    @EventHandler
    public void onInteract(PlayerInteractEvent event) {
        Action act = event.getAction();
        ItemStack item = event.getItem();
        Player plr = event.getPlayer();
        
        getServer().broadcastMessage(act.toString());

        if (event.getHand() != EquipmentSlot.HAND) { return; }
        if (act.equals(Action.RIGHT_CLICK_AIR) || act.equals(Action.RIGHT_CLICK_BLOCK) && !(item == null)) {
            PersistentDataContainer container = Objects.requireNonNull(item.getItemMeta()).getPersistentDataContainer();
            String itemtag = null;
            if (container.has(key, PersistentDataType.STRING)) {
                itemtag = container.get(key, PersistentDataType.STRING);
            } else {
                return;
            }

            assert itemtag != null;
            customItemEvents.handleRightClick(itemtag, event);
        }
        return;
    }

}
#

sorry if this is bad im still a newbie to java

#

the broadcast is for debugging purposes

drowsy helm
#

that looks fine to me

#

how can you tell its firing multiple times?

#

wait for a response no need to advertise your question

glossy lily
#

broadcast says it twice, aswell as some errors happening in my block destroyer item because the block was already broken

drowsy helm
#

well your boradast is called before any checks

#

so it will fire multiple times

river oracle
drowsy helm
#

by block destroy item do you mean CustomItemEvents?

glossy lily
glossy lily
#

customitemevents does all the cool stuff

drowsy helm
#

hm strange

#

dont see why it would fire twice

#

also dont use assert just use an if statement

glossy lily
#

it looks nice so im keeping it

drowsy helm
#

it will throw an error if not true

#

quote from a stack overflow comment "They should never be triggered in production code, and are indicative of a bug or misuse of a code path"

#

your best bet is just printing out the action, and hand and seeing which are passing through your if statements

glossy lily
#

alright, ill stop using assert

#

itemtag will never be null anyways though

#

so i can just remove that

drowsy helm
#

yeah

glossy lily
#

alright i fixed it

#

thanks man

#

do you know any way to completely freeze a server to cut down on memory?

#

i want to make it so when nobody is playing on my server no code will be ran, no npcs will move, basically nothing

drowsy helm
#

eh not really possible

glossy lily
#

hm

drowsy helm
#

just have functions in place that doesnt run logic code when no one is on

glossy lily
#

will do

#

how would you stop logic code from running though?

drowsy helm
#

depends what your code is

glossy lily
#

well i mean like

#

default stuff from minecraft

drowsy helm
#

ah right

#

unless you modify the server jar, not really

#

base minecraft code doesnt really use much mem anyway

glossy lily
#

hm

drowsy helm
#

you'll probably run into more issues trying to cancel it than not

glossy lily
#

when i go idle/leave my memory usage will slowly go up

drowsy helm
#

you have a memory leak then

river oracle
#

^ one of your plugins has a memory leak

glossy lily
#

how would i tell what thats coming from

drowsy helm
#

use a profiler

#

are you storing the Player variable anywhere?

#

that can cause mem leaks

glossy lily
#

oh shoot

#

how

river oracle
#

generally rule of them to use UUID instead of player object

drowsy helm
#

spigot has an inbuilt profiler

#

or use something like spark

#

which is really good

glossy lily
#

like this?

river oracle
#

no ahaha

#

He means if you store a player like this

#

Map<Player, ?>

#

or Map<?, Player>

#

any collection containing a player can cause memory leaks

drowsy helm
#

nah anything declared on the class scope

#

will cause a mem leak

#

method scopes are fine

lime moat
#
    @EventHandler
    public void onResourcePackStatus(PlayerResourcePackStatusEvent event) {
        Player player = event.getPlayer();
        // If the resource pack download failed
        if (event.getStatus().equals(PlayerResourcePackStatusEvent.Status.FAILED_DOWNLOAD)) {
            player.kick(Component.text("Server resource pack has failed to download.\nPlease rejoin."));
        }

        // If the user declined the resource pack download
        if (event.getStatus().equals(PlayerResourcePackStatusEvent.Status.DECLINED)) {
            player.kick(Component.text("You failed to download the resource pack."));
        }
    }``` Is this how I would check to see if they decline the resource pack?
glossy lily
#

how do i open up said profiler

#

i dont know what this is coming from

lime moat
#

Under the JoinEvent class.

drowsy helm
lime moat
drowsy helm
#

basically, its a piece of code that will run after x ticks

glossy lily
drowsy helm
#
Bukkit.getScheduler().runTaskLater(plugin, () -> {
//CODE
}, delay};
drowsy helm
#

get that

#

its real good

glossy lily
#

ok

lime moat
#

I'm so confused on how to use that, can I get a bit more of an example, sorry ๐Ÿ˜…

lost matrix
lime moat
#

I'm on 1.18.2, so that would work?

lost matrix
#

It was either 1.18 or 1.19

lime moat
#

Where shall I go to see how to do that? hah

lime moat
#

I have this, isn't it similar/the same thing? java @EventHandler public void onJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); player.setResourcePack("https://www.dropbox.com/s/rieh4n8tvkjh1gw/dd.zip?dl=1"); }

glossy lily
#

is there any way to set time for just one player

#

i wanna make time corresponding with irl time

lost matrix
glossy lily
#

i dont mind

carmine nacelle
#

hey @lost matrix

balmy valve
#

Is there any way to hide particles from specific players?

carmine nacelle
#

I was working with a couple guys last night trying to make it so bees couldnt wander over 32 blocks from their hive using:

    @Override
    protected PathNavigation createNavigation(Level world) {
        final PathNavigation vanillaNav = super.createNavigation(world);
        FlyingPathNavigation navigationflying = new FlyingPathNavigation(this, world) {
            public boolean isStableDestination(BlockPos blockposition) {
                return vanillaNav.isStableDestination(blockposition) && blockposition.closerThan(blockposition, 32);
            }

            public void tick() {
                vanillaNav.tick();
            }
        };

        navigationflying.setCanOpenDoors(false);
        navigationflying.setCanFloat(false);
        navigationflying.setCanPassDoors(true);
        return navigationflying;
    }

in my custom class, but the bee's ai breaks once it gets nectar

#

it just floats in place indefinitely

lost matrix
charred pollen
#

i just realized it counts the durability

#

made it work

#

added playsound, it really does the job damn

quaint mantle
#

How can i filter a TabCompleter. Like if i add "s" it'll show only the things that start with s?

winter pagoda
#

Is it possible to spawn an invisible block thats not a barrier?

lost matrix
winter pagoda
#

Nah that wont work

#

Just need any block being invisible but interactable

#

So you can still break it

#

Im willing to use packets if i have to

lost matrix
#

There is no invisible breakable block in minecraft. If the client thinks that the block he is hitting doesnt exist, then he
wont send any packets that would indicate that he wants to break the block.

winter pagoda
ornate patio
river oracle
winter pagoda
#

That wont work either

lost matrix
winter pagoda
#

Its done randomly

#

And supposed to be secret

#

so texture pack would not work

lost matrix
winter pagoda
#

Damn ight thanks for the help

ornate patio
#

wait

#

try structure void

#

idk if thats breakable in survival though

winter pagoda
#

has to be a selectable block

#

not one set one

ornate patio
#

oh

winter pagoda
#

sendBlockChange makes a block only visible for one player or whoever you send it to

#

right?

lost matrix
winter pagoda
#

Yeah thanks

quaint mantle
#

how would i make it so the if (e.getPlayer().getItemInHand().equals(item)) { works with any stack number

#

only works with 1

quaint mantle
#

1.17 api version

lost matrix
#

But dont do this to check for custom items. Use the PersistentDataContainer of the ItemMeta.

lost matrix
quaint mantle
#

oh nvm

#

i did it wrong ๐Ÿ˜ข

lost matrix
#

But dont do this to check for custom items. Use the PersistentDataContainer of the ItemMeta.

quaint mantle
#

ye

fiery prairie
#

how do I allow using hex colors?

opal juniper
#

md5 chatcolor

lost matrix
fiery prairie
#

more like how do I make it possible to use them without getting white numbers and letters in return

supple elk
#

Does anyone know if Bukkit.unloadWorld() is async or not?

tardy delta
#

Ig not

#

Look at the impl

#

?stash

undone axleBOT
tardy delta
#

CraftServer class prob

#

Sync

supple elk
#

kk

#

ty

#

In which case why can I still not delete the world folder?

azure hawk
#

Permission denied

#

Well

#

XD

supple elk
#

yeah but why is the permission denied

#

presumably it's still in use by the server or smmin?

rich sun
#

K

azure hawk
#

Thats not your plugin

#

Try hosting your own server on e.g. ploudos and test your plugin on there. If it works there then its the server owwners fault

supple elk
#

I'm hosting the server

supple elk
azure hawk
#

Then idk why the permission is denied

supple elk
#

Presumably because it's still session locked?

#

Is there any way I can override it?

azure hawk
#

Maybe its some kind of "anti hack" so dont 3rd party stuff can delte files idk XDD

lost matrix
#

Make sure the user that runs the server has permissions for that fiel

supple elk
#

Yeah I do

#

I only use one server

#

and I can delete it

#

*one user

#

I''m going to try delaying the deletion

#

Still no permission

#

What if I try running the server as an administrator?

tardy delta
#

Not one tick lol

supple elk
lost matrix
#

I would just try deleting the folder every 50ms until its gone

supple elk
lost matrix
#

Because unloading the world doesnt instantly release all resources. The spigot api for loading and unloading worlds
is absolute utter garbage (no exaggeration)

supple elk
#

๐Ÿ˜”

supple elk
lost matrix
#

Waiting

#

Or constantly checking

supple elk
#

ugh

#

welp, guess I'll have to do that then

vivid cave
#

Why is AsyncPlayerChatEvent.setCancelled() is deprecated?

#

Why is Player::getDisplayName() deprecated?

#

What should I replace those by?

ivory sleet
#

displayName() and displayName(component)

#

And paper favors AsyncChatEvent to AsyncPlayerChatEvent @vivid cave

#

(Uses components instead)

vivid cave
#

ah

ivory sleet
#

Thats all

vivid cave
#

But damn i don't want to use their components it's overly complicated for what i want

ivory sleet
#

I mean just use minimessage?

vivid cave
#

what's that?

ivory sleet
#

A way to write components in a tag style like format

#

And no its not slow at all

vivid cave
#

But am I really obliged to go through their stuff? I really dislike it

ivory sleet
vivid cave
#

I think it's cool for specific cases but strings is so much simpler

#

I use custom formatting for colors

#

for example and many other stuff

ivory sleet
#

Thats where mini message comes in

vivid cave
#

based on regex

ivory sleet
#

To be genuine here I dont see the issue

#

Sure components can get long to use and all that

#

But mini message sophisticatedly fixes that

#

Or well you could just use spigot

vivid cave
#

okay

ivory sleet
#

Since you were asking here after all

vivid cave
#

maybe one day i'll use components

#

yeah sure thanks a lot

ivory sleet
#

Still

#

Minimessage

#

You didnt even look at it I bet

vivid cave
#

nah cuz i know i have to user other classes, objects, etc

#

but i'll check okay

ivory sleet
#

Literally one method

#

But if thats your mindset, I cant help it

vivid cave
#

yeah sorry that i'm being like that

ivory sleet
#

Anyway do whatever you feel comfortable with

vivid cave
#

i'll check ^^

ivory sleet
#

I guess at this stage where paper hasnt hard forked yet your choice is really insignificant, and it will stay that way if you choose not to migrate to paper once all that has happened

vivid cave
#

i'm checking, it looks really fun like html but still a bit complicated for what i do (i'd need to change a lot of code)

ivory sleet
#

Alternatively get used to components a bit, and minimessage which isnt that big of a deal with you pay 5 min of attention shrug

#

Best of luck :3

vivid cave
#

yeah i'll be actively considering that choice

vivid cave
#

isn't that a great way to circumvent 1.19.1

#

By the way thanks a lot for your assisante buddy ๐Ÿ™‚

vivid cave
#

but like getPlayer isn't deprecated

ivory sleet
#

Probably just forgot to deprecate that also

vivid cave
#

aha okay

#

thx^^

ivory sleet
#

Or well

#

Oh

#

Its from PlayerEvent

vivid cave
#

oh

#

makes sense ye

tender shard
ivory sleet
#

Elaborate

tender shard
#

e.g. no legacy color codes, you always have to turn them hex colors yourself

#

admins don't like having to switch to a new syntax after having used &c for years

vivid cave
#

that's a bit my situation yes

ivory sleet
#

Yes well the aim of minimessage is to address the ambiguity of legacy color codes

tender shard
ivory sleet
#

So if you find their aim annoying sure Ig

tender shard
vivid cave
#

I mean i keep an open minded i won't bash them they're probably a great alternative

#

It's just that i'm so not used that it'll take time

tender shard
#

but yeah it's paper being paper again

#

"let's deprecate everything"

ivory sleet
#

I mean, minecraft stopped using it in principle and has a more intricate system to represent complex components

#

So it makes sense to dry out it from the api

#

The deprecation is to make devs aware of it all the more

#

Like finalize in Java

#

First provide alternative solutions, then deprecate and after some time invoke the removal

tender shard
ivory sleet
#

Myeah Ig thats partly true

quaint mantle
#

can anyone dm if you are able to make custom enchants

ivory sleet
#

Altho they are trying to provide hands on string methods that use mini message

#

like sendRichMessage or sth iirc

chrome beacon
undone axleBOT
tender shard
vivid cave
quaint mantle
tender shard
tender shard
#

if you are trying to request work, then this is not the right place

#

?services

undone axleBOT
quaint mantle
#

that link doesnt even work

chrome beacon
#

I believe they were here yesterday offering 2$ for an entire custom plugin

chrome beacon
tender shard
#

see?

quaint mantle
#

nope it says error

tender shard
#

you probably just don't have any forums account

ivory sleet
tender shard
quaint mantle
tender shard
#

also wtf intelliJ

#

last time I checked, java 17 was already released lol

#

okay I started to love Jeka

        JkDependencySet deps = JkDependencySet.of()
                .and("com.googlecode.playn:playn-core:1.4")
                .and("com.threerings:tripleplay:1.4")
                .withDefaultScopes(COMPILE_AND_RUNTIME);
        JkDependencyResolver resolver = JkDependencyResolver.of(JkRepo.ofMavenCentral());
#

does anyone know how to do this without creating resource packs?

formal bear
#

I would love to know too, toast ui is very gooood

tender shard
#

is it just ChatMessageType.SYSTEM

#

I'll try it out

#

great, now my intellij stopped working completely >.<

tender shard
#

seems like you actually have to create an advancement

#

then grant it

#

then you can remove the advancement again

supple elk
#

even after 50s it still fails

#

How long do I have to wait until I can delete the files?

ivory sleet
#

you probably wanna return in case the deletion worked

tender shard
#

yo uhave to recursively delete all child files

#

or use something like apache's FileUtils that does this for you

supple elk
supple elk
tender shard
supple elk
#

Right okay

#

that would make sense

ivory sleet
#

Id recommend using Files.newDirectoryStream or sth to avoid DoS

#

Which normal File can cause

tender shard
#

DoS?

ivory sleet
#

Denial of Service

tender shard
#

isn't the whole File api kinda deprecated anyway? i heard everyone recommends to use Paths now, which I hate, they are so annoying lol

ivory sleet
#

File has a method called listFiles or sth, but that returns File[]

tender shard
#

yes, thank you gradle, you are so fast. only took you 3 minutes to setup this project duh

ivory sleet
#

And that also means the array with its elements is eagerly created

#

So yes

#

Files + Path is objectively better

#

Its a miracle File isnt deprecated

tender shard
ivory sleet
#

As said

#

It can cause a dos

#

If you use listFiles

#

And iirc the remame function for instance did not work consistently across different platforms

#

Small things like that which makes it volatile and unreliable to work with

#

Also

#

File metadata accessed with javaโ€™s File class was inefficient

#

And also, some methods did not throw exceptions that they were contracted to

#

also the symbolic link impl was a hacketry iirc

#

Some more stuff also

#

Its on the oracle website

tender shard
#

hm

ivory sleet
#

Legacy io or sth if you wanna google it

tender shard
#

oki thanks, will google that after I finally made toasts working

#

they are so annoying D:

ivory sleet
#

Yeah Path and Files is way more verbose for sure

#

Thats a major con

tender shard
#

why is there no toast api D:

ivory sleet
tender shard
#

I wonder

#

if I'd add sendToastMessage or whatever to spigot

#

should I add it to Player or Player.Spigot

ivory sleet
#

Player.Toast maybe :>

tender shard
#

uuugh why is everything deprecated here D:

#

does anyone know what this was replaced with

ivory sleet
#

I think they just wanted to eradicate support for legacy

tender shard
#

but how else would I create an NMS DisplayInfo object

#

it takes a "Component"

ivory sleet
#

Hmm didnt bungee chat add api for it?

tender shard
#

dont think so. i need an NMS component to create this thing

ivory sleet
#

Oof

tender shard
#

๐Ÿฅฒ

#

in 1.16 and below it was called IChatBaseComponent or sth like this

ivory sleet
#

?jd-bcc

ivory sleet
#

Youโ€™re not after sth like this?

tender shard
#

no, I need the actual NMS component D:

ivory sleet
#

Ah fair

tender shard
#

I think I found it

#
net.minecraft.network.chat.Component.literal("Some title")
drowsy helm
#

anyone know if theres any native hash map deque object?

ivory sleet
#

HashMap deque?

#

LinkedHashMap is the closest I think

drowsy helm
#

not really a map more like a Pair with FILO

ivory sleet
#

It doesnt conform to the deque contract interface

#

But its linked so it can effectively work like one

drowsy helm
#

yeah

#

actually wait i can do a Deque of pairs

#

ill figure it out

ivory sleet
#

Oh, thats better then :>

tender shard
#

does anyone know how to send an NMS advancement? :/

#

I'm dying on this

vocal cloud
#

Through human suffering probably

supple elk
#

What's the difference between these 2? The top one produces a stack overflow but I don't see why

ivory sleet
#

๐Ÿ˜ฌ

#

But well

#

You call it on the same file

#

Probably wanna forceDelete(child)

vocal cloud
drowsy helm
#

yeah lmao

#

just running forever

tender shard
supple elk
#

I'm so dumb

tender shard
#

with HOW CAN I CAN I meant HOW CAN I SEND

#

i cant write today

supple elk
#

๐Ÿคฆโ€โ™‚๏ธ

tender shard
#

but why not ๐Ÿฅฒ

#

i'm so done with those fucking advancements

severe oak
tender shard
#

I don't really want to create actual advancements

#

I just need some temp advancements to send toast messages

tender shard
#

unfortunately Bukkit.getUnsafe().loadAdvancement always returns null

vocal cloud
#

Don't you need to use a resource pack with an advancement in it?

tender shard
#

nope

#

you can also load them using Bukkit.getUnsafe().loadAdvancement

#

if only that would work

#

it always just returns null

severe oak
#
GitHub

CrazyAdvancementsAPI is a full-fledged NMS-based API for creating and managing Advancements on Spigot Servers - CrazyAdvancementsAPI/ToastPacket.java at 7e65a3be1653be656d66bbda39f7bb868cd8aec1 ยท Z...

#

but NMS ๐Ÿ˜ฆ

tender shard
#

and this stimply doesn't work for me

#

1 sec

severe oak
tender shard
#

I'm fine with using NMS, if only I would know what exactly I have to do to get this working haha

#

?paste

undone axleBOT
tender shard
#

obviously the advancement json is correct, I copied it from the blaze and caves data apck

severe oak
#

They only use NMS to turn their advancement wrapper class into NMS.

#

afak though

tender shard
#

OMG

#

I got it to work

#

even without any NMS

severe oak
#

Really?

oblique geyser
#

Hey Can I get a list of every chests placed in a world?

tender shard
oblique geyser
#

is enough

tender shard
severe oak
tender shard
severe oak
quiet ice
tender shard
severe oak
quiet ice
#

Tile entities are likely stored specially

tender shard
#

you can just do chunk.getTileEntities()

#

erm wtf

#

I meant

#

chests are tile entities

severe oak
# tender shard

I would ask to see source cuz im interested but I don't wanna impose.

tender shard
#

lol

severe oak
#

mb

tender shard
#
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        try {

            org.bukkit.advancement.Advancement adv = Bukkit.getUnsafe().loadAdvancement(new NamespacedKey("test", "test3"), "{\n" + "\t\"display\": {\n" + "\t\t\"icon\": {\n" + "\t\t\t\"item\": \"minecraft:crossbow\"\n" + "\t\t},\n" + "\t\t\"title\": {\"translate\":\"mfnalex is cool and you're not\"},\n" + "\t\t\"description\": {\"translate\":\"it's true! Also fuck @imajin\"},\n" + "\t\t\"announce_to_chat\": \"true\"\n" + "\t},\n" + "\t\"rewards\": {\n" + "\t\t\"function\": \"bc_rewards:weaponry/ol_betsy\"\n" + "\t},\n" + "\t\"criteria\": {\n" + "\t\t\"shot_crossbow\": {\n" + "\t\t\t\"trigger\": \"minecraft:shot_crossbow\",\n" + "\t\t\t\"conditions\": {\n" + "\t\t\t\t\"item\": {\n" + "\t\t\t\t\t\"items\": [\n" + "\t\t\t\t\t\t\"minecraft:crossbow\"\n" + "\t\t\t\t\t]\n" + "\t\t\t\t}\n" + "\t\t\t}\n" + "\t\t}\n" + "\t}\n" + "}");
            Player player = (Player) sender;
            player.getAdvancementProgress(adv).awardCriteria("shot_crossbow");
        }
         catch (Throwable t) {
            t.printStackTrace();
         }
        return true;
    }
severe oak
#

Json is easy replicable so, ๐Ÿคทโ€โ™‚๏ธ . Thanks!

quiet ice
#

Now rip out any tabs and newlines

tender shard
#

first of all, I wanna make this work more than once

severe oak
#

the \n go crazy

tender shard
#

because once you use this namespacedkey, the server remembers it ๐Ÿฅฒ

quiet ice
#

Then make it forget it

#

The Unsafe class might help

tender shard
#

seems like a restart gets rid of it

#

so I can just use a random UUID as namespacedkey

severe oak
#

I'll mess around with it in a little, I have to wrap up some refactoring I'm doing on my codebase

tender shard
#

oh shit

#

restarting is NOT enough

#

the advancement does persist

severe oak
#

"Loaded advancements will be stored and persisted across server restarts and reloads."

#

In the docs for the method

tender shard
#

yeah, I found out I'll need to manually remove the json files on each shutdown

#

pretty dirty

#

but

#

I dont see another way

severe oak
#

Damn, well. In the docs for UnsafeValues#removeAdvancement it says you need to call Server#reloadData alongside it.

#

Otherwise, it wont remove it from the running server. It will only remove it from persistent storage

tender shard
#

what the heck

#

thank you so much

#

i didnt see the removeAdvancement method at all haha

#

I looked for it, but I didnt find it, haha

severe oak
#

No problem, thats what we're here for.

#

I just looked at the docs because I be forgetting half of Spigots methods

tender shard
#

but yeah, that method does the same thing I also wanted to do

#

however I don't need to wrap CraftMagicValues.getBukkitDataPackFolder() now, which is handy lol

unreal quartz
fiery prairie
#

How would I listen for item rename event (with anvil) and check if the item is a sunflower?

severe oak
#

PrepareAnvilEvent

tender shard
#

that will be called prior to renaming though, right?

#

I think to listen to "taking out the renamed item", its simply InventoryClickEvent

fiery prairie
#
    public void nomorerename(InventoryClickEvent e){
        if(e.getInventory().getType() == InventoryType.ANVIL ){
            
        }
    }```
#

i have this now

tender shard
#

now check if the clicked slot is the result slot, and if the clicked item is a sunflower

severe oak
tender shard
#

i think they want to detect taking out the "finished" item

severe oak
#

Ok, yeah then you're in the right place.

#

You can get the finished item by InventoryClickEvent#getCurrentItem [e.getCurrentItem()]

fiery prairie
#

What do I put after this

severe oak
#

I'm usually not one to force feed. I believe it is valuable to learn. Though,

InventoryClickEvent#getCurrentItem returns type ItemStack.

You can take that ItemStack and use ItemStack#getType and compare it to Material.SUNFLOWER

fiery prairie
#

Well the problem is I cant really do ItemStack.getType

#

it just kind of doesnt exist

severe oak
#

I'm sorry. I didn't mean to confuse you with the #. just do e.getCurrentItem().getType()

fiery prairie
#

yea I know

#

its just getType doesnt exist after ItemStack

#

even after adding () ofc

#

nvm i got it

#

but now I cant do Material.SUNFLOWER

#

now sunflower doesnt exist

severe oak
#

It should, iirc? Lemme look at docs.

#

Yeah, It exists.

fiery prairie
#

Weird

chrome beacon
#

1.8?

fiery prairie
#

am I doing it correctly? cause i also added this Player p = e.getWhoClicked() but it also doesnt work

fiery prairie
#

getWhoClicked still has a stroke

chrome beacon
fiery prairie
#

i had 1.8

#

i forgot to change it

chrome beacon
#

Just so you know your plugin won't work on 1.8 anymore

#

anyways cast getWhoClicked

severe oak
#

Don't cast it. You need to make sure that that entity is actually a player before you assume so.

opal juniper
#

can it be anything else?

severe oak
#

Yes.

chrome beacon
#

I believe it's always a player. Never seen it anything else

#

but yes the method returns HumanEntity so I guess do an instanceof check

fiery prairie
#

so i have this now

#

but still this

chrome beacon
#

Yeah

#

That's a class not an item stack instance

severe oak
#

Your if statement is a bit broken. You're attempting to use ItemStack#getType statically.

fiery prairie
#

so what should I do?

severe oak
#

Not to mention, you're supposed to be calling e.getCurrentItem().getType()

fiery prairie
#

ohh yea right

#

what about this?

severe oak
#

Overall, your statement should come out to if(e.getCurrentItem().getType() == Material.SUNFLOWER)

fiery prairie
#

alright yea thats what i just got, so uh thank you guys ill test it

severe oak
#

Now, there is only one more thing. ItemStack#getCurrentItem can return null so you'll just want to check that.

#

#help-server, and It really depends on the features you're looking for. I personally prefer more updated versions just because of the added blocks and customizability.

#

You can have 1.8 pvp in newer versions.

fiery prairie
#

so uhh it works, thank you guys

tardy delta
#

?1.8

undone axleBOT
tender shard
#

it's only 11 major versions behind

vocal cloud
#

If you want to even remotely compete with every new server out there you can't just use what everyone else does and expect it to work. You have to come up with something new and unique lol

tender shard
#

for example a 1.8 pvp server

#

very original idea lmao

#

i dont even get why people like 1.8 pvp

#

it's basically just "no skill needed, just spam left click"

tardy delta
#

^^

cunning canopy
#

Setting the damage for a crossbow?

tardy delta
#

got so many wins with my tripe click mouse

frank kettle
#

@tender shard Hello, I saw your post on nms mappings, is it a version that allows u to see the functions with the proper name or is it still a, b, c... etc?

tender shard
#

e.g. Mob.getNavigation() instead of EntityInsentient.b() or whatever

frank kettle
#

yeah... i was trying to create a armor stand entity...

tender shard
#

you have to use mojang mappings to extend entity class

#

otherwise you'll get weird problems like "method x() clashes with LivingEntity#x()" and stuff

frank kettle
#

is it safe to apply that mappings on my current plugin pom or should I create a new project and try there first?

tender shard
#

do you already use any NMS things?

frank kettle
#

nope, tried but that a,b,c,d 1.19 with barely any examples online isn't very good :Sadge:

tender shard
#

you can just add everything mentioned in the blog post to your pom.xml then, it shouldnt break anythinig

frank kettle
#

even using both spigot and spigot-api dependencies?

#

i saw u are only supposed to have the spigot one after having Buildtools

tender shard
#

yeah that's no problem. although spigot-api is basically useless if you add spigot directly, anyway

frank kettle
#

oh ok, i will try out

#

ty for your time

tender shard
#

no problem ๐Ÿ™‚

native gale
#

Is there a way to get tps?

tender shard
#

yes but only with reflection

native gale
#

Okay

tender shard
#

either reflection or NMS

native gale
#

Then how do I schedule a delayed task not in ticks, but in seconds? Should I assume that tps is always 20?

tender shard
#

e.g. this is my 1.19 code ```java
@Override
public double[] getTps() {
return ((CraftServer) Bukkit.getServer()).getHandle().getServer().recentTps;
}

tender shard
#

well that's not 100% accurate unless the server always has 20 tps

frank kettle
#

is there a seconds way to do it tho?

tender shard
#

java has method builtin to schedule tasks in "exact times"

tardy delta
#

gson sucks lol

tender shard
tardy delta
#

had to write to many typeadapters to make it work lol

tender shard
tardy delta
#

and it still gives me weird errors

frank kettle
tender shard
#

yeah sure but just imagine your server is always at 10 tps

#

and now you wanna wait exactly 1 minute

#

then you can't just do 20*60 to get the correct amount of ticks

#

so just use java.util.Timer for stuff like this

frank kettle
#

is there any server.getTicks() * seconds?

tender shard
#

or a ScheduledExecutorService

#

that's probably a better idea than using the normal java.util.Timer

frank kettle
#

that seems to be better

tender shard
frank kettle
#

fair

tender shard
#

creating a new thread is quite expensive

#

but no problem unless you do it all the time

tardy delta
#

create your own threadpool ๐Ÿ™„

frank kettle
#

quick question a bit less to do with development, does verified role give extra chats access?

tender shard
#

there's a verified channel, yes

tardy delta
#

shit

frank kettle
#

I kinda don't want to link my discord to my spigot acc :Kek:

frank kettle
tender shard
#

no

#

but you cannot send pics etc if you're not verified

#

or files

frank kettle
#

fck

#

and emotes?

#

can we use with verified?

tender shard
#

being a booster allows you to use other server's emojis, but that's it

tardy delta
frank kettle
#

I'm ashamed of my spigot account because of the bad plugins i released in the past, so I dont wanna link it

tender shard
#

there is no player. brewing stands can brew even when no player has it open

#

you can only get a list of all players currently having this inventory open

#

just cast the Block to InventoryHolder, then do getInventory().getViewers()

#

i dont think that brewing stands have any titles

frank kettle
#

@tender shard I don't know where to ask this and search on google a bit but nothing good, is there any website with a list of particles and what they look like, like an image of them?

tender shard
#

there's also a list on the MC wiki but it uses the "vanilla names", but includes pictures

frank kettle
tender shard
frank kettle
tender shard
#

but as said, those are the vanilla names

frank kettle
#

oh ty ty

#

man

tender shard
#

usually the spigot name is just the vanilla name in UPPER_CASE

frank kettle
#

they fcking have the ads on top of the images

#

:kek:

tender shard
#

(but not always)

azure dirge
#

is it possible to use interface which is implemented by main plugin class as main class in plugin.yml ?
main: path.to.interface

eternal oxide
#

no

tender shard
#

your main class obviously need to be the implementation

eternal oxide
#

You can;t instance an Interface which is what spigot will try to do

azure dirge
#

oh okay, i get it

tardy delta
#

lets change my h2 database to a sqlite one ๐Ÿค”

#

and get rid of the damn gson

glass shell
#

Hello, im looking for a rough price estimate for a plugin that includes the following:
.a command that gives you an item that allows you to shift click minecarts together (the command must have a cooldown of 5 minutes and only 15 minecarts can be attached together)
.a command that allows you to change the max speed of minecarts and the powered rail boost percentage
.vertical rails and upside down rails
.a new type of track that moves trains at 3 blocks per second that can be toggled on/off by redstone and right clicking

crimson relic
#

!services

#

?services

undone axleBOT
oblique geyser
#

What is the best way to make a count down?

severe oak
#

You can use BukkitScheduler#scheduleSyncRepeatingTask.

tardy delta
#

in what context?

#

::runTaskTimer cleaner tho

oblique geyser
#

I need one count down for the game end and for some events that I run while the game is running

severe oak
tardy delta
#

lmao

oblique geyser
#

I saw scheduler and bukkitrunnable

severe oak
#

It really depends on the context of the situation.

tardy delta
#

anyways doesnt the spigot api has sqlite included?

oblique geyser
tardy delta
#

i'd use the scheduler to schedule a task and integrate that into your gameloop

severe oak
tardy delta
#

ah someone told me that

oblique geyser
#

I thought on this but if I have 100 games will have 100 tasks runnings, I think this isn't a good idea in performance

tender shard
#

damn, finally got this ugly toasts working

severe oak
#

I think thereโ€™s most likely a good middle ground here

severe oak
chrome beacon
tardy delta
#

i believe these are all the libraries i currently have access to

severe oak
#

Even if it doesnโ€™t you can find drivers pretty easy

tender shard
oblique geyser
chrome beacon
tardy delta
#

ah meh

chrome beacon
#

Anyways you don't need to access it directly

tardy delta
#

wtf am i looking at lol

severe oak
tardy delta
#

anyways do i really need the api or can i just do Class.forName?

#

using hikaricp btw

chrome beacon
#

Class forName is fine

severe oak
tardy delta
#

dunno if i actually need the driver with hikaricp

#

with h2 i just did datasource.setDriverClassName("org.h2.Driver") so i might be able to do smth related

worldly ingot
#

You do have to Class#forName() SQL drivers that you intend on using. I still do it even for HCP

#

I usually just throw in

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ReflectiveOperationException e) {
            e.printStackTrace();
        }```
echo basalt
#

Does it do more than just checking if the class exists?

worldly ingot
#

It loads it

echo basalt
#

Part of me feels like it loads some static values in an obscure way

worldly ingot
#

Class#forName() has two optional arguments, one of which is whether or not the class should be loaded. It defaults to true

echo basalt
#

But at the same time, It's usually an interface

tardy delta
#

i thought hikaricp does all that stuff

worldly ingot
#

You honestly might be able to with the setDriverClassName()

tardy delta
#

just using DataSource#setDriverClassName now

worldly ingot
#

Yeah, that method looks like it loads the class and creates an instance of it

tardy delta
#

i'm wondering what the point is of using the datasource that the database provides

echo basalt
#

So I wonder what would we be loading in that case?

worldly ingot
#

java.sql.Driver is an interface

#

Implementations are all classes

echo basalt
#

Hm

#

We'd need to load the implementation in that case

worldly ingot
#

com.mysql.cj.jdbc.Driver is the implementation

echo basalt
#

I see

worldly ingot
#

They're usually nothing more than a static block to register the driver

tardy delta
#

oh

echo basalt
#

Makes sense

quiet ice
#

alternatively, just use the service loader.
Whether that makes sense, I donno

worldly ingot
#

Raw Java stuff. Not related to Bukkit

tender shard
#

raaaaawr

glossy lily
#

need help finding music to program to

#

all of those "lofi code playlists" are shit

tender shard
rapid aspen
#

@iron glade

quiet ice
tender shard
#

my soundtrack is to have The Office running on netflix

rapid aspen
#

Hi

#

can someone help me

echo basalt
#

uhh

#

coding music ehh

#

I just play some eminem or some shit

tardy delta
#

?ask

undone axleBOT
#

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

echo basalt
#

whatever I feel like

tardy delta
#

listening to french rap lol

echo basalt
#

I've listened to lloyd banks - warrior part 2 on repeat for 6 hours straight

#

did a lot of work that day

rapid aspen
#
@Override
    public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {

        if (sender instanceof Player p) {
            if (args.length == 1) {
                try {
                    Integer.parseInt(args[0]);
                    if (p.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue() <= Integer.parseInt(args[0]) * 2) return false;
                } catch (NumberFormatException e) {
                    p.sendMessage(ChatColor.RED + "Tu precisas de especificar um nรบmero para levantar");
                }
            }


            if (p.getGameMode() == GameMode.SURVIVAL) {
                ItemStack heart = new ItemStack(Material.NETHER_STAR);

                ItemMeta heartMeta = heart.getItemMeta();

                heartMeta.setDisplayName(ChatColor.RED + "Coraรงรฃo");

                heart.setItemMeta(heartMeta);

                p.getInventory().addItem(heart);

                double pHealth = p.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue();

                p.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(Bukkit.getServer().getPlayer(args[1]).getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue() + Integer.parseInt(args[0]) * 2);
            }
        }
        return true;
    }``` 

im doing a lifesteal plugin and now im doing a /withdraw command
#

and i want like: /withdraw 3 and give me 3 hearts

echo basalt
#

I swear I've seen a commission for health bank notes

#

but at the same time, all text contents are in portuguese

rapid aspen
#

im portuguese

desert frigate
#

Would it be possible to force a spawner to load/work?

echo basalt
rapid aspen
#

eu gosto de fazer assim, o plugin vai ser sรณ para mim por isso sei onde estรฃo as coisas

tender shard
#

english pls

chrome beacon
#

^

echo basalt
#

^

ornate mantle
#

what does the getHandle method do in CraftBukkit classes?

rapid aspen
chrome beacon
ornate mantle
#

aight

chrome beacon
#

CraftWorld#getHandle would return ServerLevel for example

rapid aspen
echo basalt
#

parseInt twice

#

also man doesnt return whenever you catch a numberformat exception

#

ehh

#

that can cause problems later

rapid aspen
#

can u show me an example

#

im new to java ๐Ÿ™‚

tardy delta
#

catch (NumberFormatEx) { pl.sendMessage(aaaaaaaa); return; }

rapid aspen
#

catch (NumberFormatException e) {
p.sendMessage(ChatColor.RED + "Tu precisas de especificar um nรบmero para levantar");
return;
}

#

like this is good

oblique geyser
#

the blockstate of a trapped chest is instance of Chest?

tardy delta
#

ah return true

rapid aspen
#

ok

#

and now like /withdraw 3 and give me 3 hearts

#

how i do that

tender shard
undone axleBOT
glacial sphinx
#

Can I put a license on my plugin so people won't spread it for free?

oblique geyser
#
if(state instanceof Chest && state.getBlockData().getMaterial().equals(Material.TRAPPED_CHEST))
vocal cloud
tardy delta
#

ig block.getType() == Material.TRAPPED_CHEST lol

rapid aspen
echo basalt
#

๐Ÿฅฃ

vocal cloud
#

Probably by learning java

#

is there even a spoonfeed command

tardy delta
#

check return type of Integer.parseInt

#

?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.

tardy delta
#

oh there is

#

lmao answering easy questions is fun

echo basalt
#

its not

#

answering the tough questions is fun

vocal cloud
#

Yeah the ones were you need to do NMS and realize that there is no great solution

echo basalt
#

because you get to do productive stuff like look at bee code for 3 hours

tardy delta
#

lmfao

vocal cloud
#

beatyoutooit.png

glacial sphinx
glacial sphinx
#

Why?

echo basalt
#

technically you can

#

but it's too much work

vocal cloud
#

Because it's java. It's not hard to bypass it

#

For every 100 hours you spend writing a solution it will take only 1 hour for someone to bypass it

glacial sphinx
#

I am not bypassing anything

vocal cloud
#

Reread it

echo basalt
#

no need to stress over that one plugin that won't reach 10 sales

#

it's like premature optimization

#

if it ain't broke, don't fix it

echo basalt
#

if there is something more fun

#

than helping people with nms

#

it obviously is rebuilding an obfuscated plugin's source

glacial sphinx
#

So it is allowed if those steps are followed?

tender shard
#

obviously, yes

echo basalt
#

Yeah I guess

tender shard
#

for paid plugins only though

echo basalt
#

Still a waste of time

glacial sphinx
#

Well, but I can get more sales.

vocal cloud
#

No you really won't

echo basalt
#

in theory yes but in practice no

#

if you want to be a greedy mf and spend every hour of your live making your customer's life hell

#

for spreading a plugin

#

that's on you

#

But those same customers will just view you as greedy

#

Also nothing guarantees you'll have sales

glacial sphinx
echo basalt
#

I've had a premium plugin on sale for 4 months and no one has bought it

#

but I also did a terrible job marketing it lol

echo basalt
#

Inventory syncing across servers

tender shard
echo basalt
#

instant with fail safe logic

tender shard
#

why would be outdated

glacial sphinx
#

I have 3 free resources and I can't post premium.

echo basalt
#

and no database queries if you've just finished saving

#

but whatever

chrome beacon
echo basalt
#

21 positive ratings

tender shard
echo basalt
#

oddly specific

tender shard
#

is your account 8 weeks old?

#

do you have 2fa enabled?

glacial sphinx
glacial sphinx
tender shard
#

2fa too?

glacial sphinx
tender shard
#

then message support

#

?support

undone axleBOT
chrome beacon
#

In the five years which we have run this section for, not once has a user failed to be promoted within one hour of meeting these requirements. Do not contact us about being unable to use this service.

#

Nice comment

echo basalt
#

I mean

#

it seems nice

#

but in reality

#

they have taken like 2 hours to promote me

#

sooo

tender shard
#

wtf i thought it's automatic

echo basalt
#

Also looking at goldenmine's code, this doesn't seem to have the quality to actually go premium

glacial sphinx
#

I waited a few days from my last check .

chrome beacon
tender shard
chrome beacon
#

It's usually very bad

worldly ingot
tender shard
worldly ingot
#

Also, way longer than 5 years at this point

echo basalt
#

how come that automation isn't instant choco

sterile token
worldly ingot
#

It's likely run on a cron job

#

One that isn't run every minute lol

#

because why would it

tender shard
echo basalt
#

imma get that guy to make a full soundcloud rap about you

tender shard
#

copy pastes of the same things for hundred of lines, e.g.

echo basalt
#

I'll just leave this thread made by our lord and savior choco