#help-development

1 messages · Page 1264 of 1

echo basalt
#
public class MyMenu extends ConfiguredMenu {

  private static final String CLOSE_BUTTON_KEY = "c";

  public MyMenu(Player viewer) {
    super(viewer);
  }

  @Override
  public String getIdentifier() {
    return "my-fancy-menu";
  }

  @Override
  public void setup() {
    registerButton(CLOSE_BUTTON_KEY, this::close);
  }
}
ivory sleet
#

Was expecting kotlin- damn

earnest girder
#

unfortunately not
I tried both HIGHEST and LOWEST because one thread I found suggested LOWEST was run first, but neither affected it unfortunately

echo basalt
#

my-fancy-menu.yml

title: "Whatever"
mask:
- "# # # # # # # # #"
- "# . . . . . . . #"
- "# # # # c # # # #"

items:
  "#": 
    type: BLACK_STAINED_GLASS_PANE
    name: " "
  c:
    type: NETHER_STAR
    name: "<red>whatever"
#

I don't actively use kt unless I'm doing backend dev or I need it for a proj

#

I'm hoping to maintain some API compat when I'm done w this rework because it'd really suck to port a million menus

young knoll
#

How does it represent all the item component options

echo basalt
#

ofc my example sucks ass bc I cba writing something fully

ivory sleet
#

Prob I think u’d have to send it before the respawn no?

young knoll
#

Or does it just not support those because 3 years old

echo basalt
#

it like

#

has a class for each "field"

#

where it passes whatever object you want and it applies em to the item

mental trail
#

anyone tried converting adventure text components to SNBT? Mainly for setting sign text in 1.21.5

young knoll
#

Do you have all the options documented somewhere :p

echo basalt
#

So you can just

public class FoodItemStackCodec implements ItemStackCodec<ConfigurationSection> {

  @Override
  public ItemStack load(ItemStack current, ConfigurationSection value) {
    // do stuff w it
  }
}
ivory sleet
echo basalt
young knoll
#

Let’s say I want to add, idk, no tooltip to an item, what would I add to the config

echo basalt
#

I have a huge list

earnest girder
#

I just need to use event.setRespawnLocation tho lol

mental trail
#

dfu?

clever zephyr
echo basalt
#

and ppl can ask for more

young knoll
#

Fair

ivory sleet
echo basalt
mental trail
echo basalt
#

it strictly "loads" the menu but doesn't reference it

clever zephyr
ivory sleet
# mental trail dfu?

Yes, Minecraft’s graph library that maps different data versions of data types

young knoll
#

DataFixerUpper

echo basalt
#

Again, it's built for them to be kinda done in API and everything else is an afterthought

ivory sleet
#

it automatically upgrades older data formats and transforms them

echo basalt
#

But yeah I also keep my essence when it comes to slot selections and whatever

mental trail
#

yes but talking from an adventure text to snbt because I'm looking to update from pre 1.21.5 to 1.21.5 which requires snbt

echo basalt
#

(It just wraps a list of slots)

young knoll
#

Or as I sometimes like to call it DataFuckerUpper

mental trail
#

I don't think the DFU will update that when it's setting it in my code

echo basalt
#

And because it's ordered you can have selections that apply it in weird patterns

#

like as a snake or spiral

ivory sleet
#

Neon, my suspicion, is that paper might have api that invokes the DFU

#

or if there is some sort of serializer maybe

#

idk

echo basalt
#

So for pagination it just follows whatever order the selection implies

mental trail
#

paper is easy, yes I just use the component methods, looking for spigot

#

xD

ivory sleet
#

A bit goofier

echo basalt
#

what I'm kinda working rn is a weird abstract-deabstract-abstract thing for menu + slot events

mental trail
#

seems this may be the incorrect discord to ask

echo basalt
#

because I want to be able to tie events to either slots or the menu as a whole

ivory sleet
#

@young knoll dou know if there is anything on the spigot side?

echo basalt
#

except I need to transform them down and then back up so everything's neat

young knoll
#

Spigot doesn’t natively support adventure so… probably not

eager crescent
#

?service

young knoll
#

Adventure might have something built in? No idea

ivory sleet
eager crescent
#

@echo basalt last forum was in 2024?

#

or am I tweaking

echo basalt
#

last forum what?

#

post?

mental trail
eager crescent
#

ye

echo basalt
#

dunno

#

I don't really yap on the forums much

ivory sleet
echo basalt
#

Still need to figure out what my SlotRestrictions class will do

#

I want to have some sort of SlotRestrictions.restrictAll()

#

SlotRestrictions.accepts(item -> true)

echo basalt
#

but what does that boil down to 🤔 a list of event handlers?

#

And then tie these to either a slot or the entire menu

young knoll
#

I tend to always parse my components from a config in minimessage format so I don’t really have to worry about updating them

ivory sleet
#

Oh yea

true cosmos
#

i need to figure out how to make yaml files readable

ivory sleet
#

As in?

#

read file permission?

echo basalt
#

more manual encoding and less ConfigurationSerializable I assume

true cosmos
#

Like with comments

mental trail
true cosmos
#

and more syntax error handling

echo basalt
#

didn't snbt change

young knoll
#

Comments are always good

#

Breaks things up and tells the user how not to be dumb

mental trail
#

yes, but the signs use to be able to use JSON format, then it switched to SNBT

echo basalt
#

chat changed from json to snbt as a whole

#

that was it

clever zephyr
#

So i have decided that im gonna do the next update on saturday @ivory sleet
Just wondering if you had any other interesting ideas to be considered ?

echo basalt
#

and I want to avoid Map<String, Object>

ivory sleet
#

unsure

echo basalt
#

been replacing mine with a fancy pattern

#

that's really tedious to write

ivory sleet
young knoll
#

Unfortunately the Bukkit platform is pretty limited

clever zephyr
echo basalt
#

you gotta go bonkers but goes a bit like

MetadataKey<T> (String name, Type<T>)
MetadataHolder<T> (Key<T>, T, Type<T>)
MetadataContainer (Map<MetadataKey<T>, MetadataHolder<T>>)
MetadataType<T>
MetadataCodec<T>
MetadataRenderer<T>
young knoll
#

You need a bit of NMS to use components for items, signs, inventory names, etc

eager crescent
ivory sleet
echo basalt
#

it's a headache to run

#

but by having a holder class you can have nullability

#

separating codecs lets you reuse them across diff types

young knoll
#

?whereami

echo basalt
#

but then you go crazy

clever zephyr
#

it was a joke lol

weak wasp
echo basalt
#

and it starts looking like mojang code

young knoll
#

Not quite

#

Needs a few more genetics

echo basalt
#

Lens

#

and whatevers

#

D14<A, B, C, D, E, F, G, H, I, J, K, L, M, N>

clever zephyr
young knoll
#

Why do you have a separate float parser

#

Rather than using the valueOf like the rest

echo basalt
#

10% -> 0.1f

#

guy wanted it because we use floats for percent-based attributes

#

like 10% chance of blocking an attack

young knoll
#

Isn’t that what the renderer is for

echo basalt
#

Renderer spits it out

#

Parser loads it from the config/command

#

guy cba doing 0.001 on a 1000 line config

#

and it's a lot neater to just /armory attribute block_chance set 10%

#

I also wrote a really neat trigger system that looks a lot like an event system

#

but it's kinda reactive?

young knoll
#

I never know how I should store a percent in configs

#

To make it user friendly

echo basalt
#

yeah you can just "10%" on mine

young knoll
#

Ah

#

I flip between 10 and 0.1

echo basalt
#

go brr

#

ah shit I gotta make some stuff immutable

#

just to call it enterprisy

#

like this

young knoll
#

Nah if you really want to call it enterprisy then the list needs a custom default size

echo basalt
#

like 4

#

but it needs to be a constant because it needs a name

#

class needs to be final, private constructor- package-private factory method

young knoll
#

Mmm yes perfect

echo basalt
#

the list becomes immutable and we return a copy every time we add sumn to it

#

we switch from a list to an array because muh objects

#

and add this. everywhere

#

I just cba

#

because then I'd need to do it for the rest of the codebase

#

and rn we're at like 35k lines

#

which is pretty tiny in the grand scope of things

#

also full unit-test coverage and javadoc everywhere

young void
young void
echo basalt
#

code

young void
young void
echo basalt
#

rpg

young void
blazing ocean
echo basalt
#

add final to params

blazing ocean
#

explicit immutability sucks

echo basalt
#

ImmutableList 🤮

blazing ocean
#

kotlin List 👍

orchid trout
blazing ocean
#

how is explicit immutability optimization lmao

orchid trout
#

i heard that c++ compiles differently if something is final

wet breach
#

however, it should be treated as a design choice and not an optimization. When a virtual function is not declared as final, the compiler must generate code for dynamic dispatch such as virtual function table. But if instead it is declared final, the compiler knows it can't be overridden in any derived class thus the compiler can devirtualize and replace indirect functional call with a direct call. If the class is declared final, all the members are implicitly final. The final keyword on a class can allow the compiler to do more aggressive inlining and optimizations since the layout is pretty much known at that point.

mortal hare
#

the rule of wisdom

#

"code duplication is far cheaper than wrong abstractions"

buoyant viper
#

t b h

pseudo hazel
#

im only using this. in the constructor 😎

#

if something is not from this class, it will have a prefix anyways

snow stone
#

it's from weaponmechanics

drowsy helm
#

Anyone know of a quick and easy way to get the interaction point of a BlockPlaceEvent (like from the PlayerInteractEvent) or will I have to manually raycast it

wet breach
drowsy helm
#

PlayerInteract provides click position but block place doesnt

wet breach
#

so couldn't you just use some field to detect you want the position from that event? probably could just make your own event for this

drowsy helm
#

yeah seems sorta hacky though

#

ig its either that or raycast calcs. I'll figure it out thanks

drowsy helm
#

https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse/nms-patches/net/minecraft/server/network/PlayerConnection.patch#698,705,1100,1105


    public static Vector getBlockFaceLookedAt(Player player, double maxDistance){
        CraftPlayer cp = (CraftPlayer) player;
        ServerPlayer serverPlayer = cp.getHandle();

        Location origin = player.getLocation();
        Predicate<? super Entity> predicate = entity -> entity != player && player.canSee(entity) && !serverPlayer.isSpectator() && serverPlayer.isPickable();

        RayTraceResult hitResult = serverPlayer.level().getWorld().rayTrace(origin, origin.getDirection(), maxDistance, FluidCollisionMode.NEVER, true, 0.1, predicate);
        Block block = hitResult.getHitBlock();

        if(block == null)
            return null;

        return hitResult.getHitPosition().subtract(block.getLocation().toVector());
    }

Had to adapt this, thank god for moj mappings

#

feels like this should be part of api

wet breach
#

could always make a pr

drowsy helm
#

yeah might

#

my dumbass compied the wrong code block

mortal vortex
#

LOL RIP BESTIE

#

YOU GOT THIS

buoyant viper
#

fixed it now tho

young knoll
#

What plugin

buoyant viper
#

u should probably look for versions of whatever plugins ur using that support bungee, and then use said plugin on Bungee server instead of per-spigot-server

sonic vessel
#

How to add Mace Plugin In Aternos server

#

Sir Help Me

#

This one

eternal oxide
#

?noping

#

#dontping

#

?dontping

sonic vessel
#

Oh sorry

eternal oxide
#

there is a link but I can;t remember

sonic vessel
#

You can help me

eternal oxide
sonic vessel
#

Oh sorry

young knoll
#

Aternos only allows plugins from their specific plugin manager afaik

#

So if it isn’t on there you can’t add it

sonic vessel
#

As a mod ??

#

I can ad

#

Add

mortal vortex
#

Jishuna is a staff member for Aternos. Direct all your questions to his DMs inbox

sonic vessel
#

I want to add Mace for lowest version of Minecraft

mortal vortex
#

Dude. This isn’t the right channel.

sonic vessel
#

Kk

slate siren
slate siren
zealous osprey
#

Ahh, you calling ASM. Why not use the native keyword and link a C file with inline asm or just pure compiled asm code

buoyant viper
true cosmos
#

deadlink

#

alivelink

upper hazel
#

what this? Could not find com.mojang:brigadier:1.3.10.

#

when i try load nms from core

#

server jar i use from lib derictory

#

1.21.3

eternal oxide
#

You need the mavenLocal() repo and run buildtools

upper hazel
#

hmm for 1.12 this was worked

#

but not will work in runtime right?

#

(i was just load paper server core:)

#

and added to lib

#

but anyway paper is fork spigot so this will work i gess?

chrome beacon
#

Hard fork so might not work

#

When working with Paper you should ask Paper

upper hazel
#

wdym hard fork?

chrome beacon
#

They're doing their own thing now, Spigot and Paper might split code wise so compat isn't guaranteed

upper hazel
#

i think they support spigot plugins like 99 %

#

i never see spigot plugins what crashed bc they in paper, purpur core

#

but yes this not garanteed 100 %

chrome beacon
#

There are slight behaviour differences

#

Take the hide attributes item flag for example

#

That people in here keep having issues with

#

On Spigot just adding the flag will stop it from showing

#

but on Paper it won't unless you manually add an attribute

#

Small differences like this is why you really should ask Paper when using Paper

upper hazel
#

you've obviously had experience. Can you guess how many percent incompatible?

#

50%?

#

60?

eternal oxide
#

One million

#

2

eternal night
#

The point is, you won't know

#

Stuff might work, stuff might not

upper hazel
#

to meta

chrome beacon
#

I mean you need to set an attribute to the item

#

You add the flag and an attribute

upper hazel
#

oh

#

lol

amber barn
#

Hi im new to making servers, im atm using minefort host and atm I have it using purpur,
How can I add spigot plugins/mod to my server?

#

Just a note I'm mobile I don't really got a pc yet

smoky anchor
#

Anyways, either use their plugin manager or put plugins into the plugins folder.

amber barn
tall rune
#

on my server every 5 minutes did you know that five minutes have passed? message is sent and when damage is taken,
ouch you took damage is sent to the damage taker

smoky anchor
upper hazel
#

I have started to study the differences between gradle and Maven and found such a thing as “fileTree” analog of which in maven is not as I understand it

#

and as I realized I have to manually create repositories for Jar files with commands

umbral ridge
#

how do you compare Timestamps?

#

Timestamp == Timestamp does not work for some reason

smoky anchor
#

.equals ?
And the reason is because they are probably not the same object

drowsy helm
#

.compareTo

ivory sleet
#

Instant.java 🙏

umbral ridge
#

ohhh I see

drowsy helm
#

or yeah equals works i think

umbral ridge
#

let me try

#

yeah equals works

#

😸 😸 😸 😸

drowsy helm
#

java moment

umbral ridge
#

beautiful

smoky anchor
#

character(s)
lazy

umbral ridge
#

XD

#

IF reportCharacters > 1 add s at the end... ehh

#

too much work

quaint mantle
#
String a = reportCharacters > 1 ? "Characters" : "Character"
umbral ridge
#

there

#

xD

quaint mantle
#

lol

upper hazel
#

lol

eager crescent
#

yo if I’m tryna find a dev where do I go

young knoll
#

?services

undone axleBOT
tiny mountain
#

hey guys, do any of you know any good method to have textured player heads that work from 1.8 to 1.21 ?
I tried with reflection but could only manage to support from 1.8 to 1.20. I really don't get how I could support 1.21

eager crescent
#

ai

young knoll
#

Does doing it without reflection work on 1.21

#

If not that could be a spigot bug

tiny mountain
#

I tried but no, because since 1.20.5 if I remember well it requires some new methods

young knoll
#

Shouldn’t

#

The api has been the same since 1.18 afaik

drowsy helm
#

Its been the same for qutie a while now

#

I havent had to change my method

tiny mountain
#

that's really strange ...

#

I will send my method in a few

#

It's dirty now since I tried many things but still :

public static ItemStack getCustomHead(String url) {
        ItemStack head = new ItemStack(Materials.PLAYER_HEAD.get(), 1, (short) 3);
        SkullMeta meta = (SkullMeta) head.getItemMeta();

        if (url == null || url.isEmpty() || meta == null) return head;

        try {
            Class<?> playerProfileClass = Class.forName("org.bukkit.profile.PlayerProfile");
            Method createProfile = Bukkit.class.getMethod("createProfile", UUID.class, String.class);
            Method setPlayerProfile = meta.getClass().getMethod("setPlayerProfile", playerProfileClass);
            Method setProperty = playerProfileClass.getMethod("setProperty", Class.forName("org.bukkit.profile.PlayerProfile$Property"));

            Object profile = createProfile.invoke(null, UUID.randomUUID(), "CustomHead");
            Class<?> propertyClass = Class.forName("org.bukkit.profile.PlayerProfile$Property");

            Constructor<?> propertyConstructor = propertyClass.getConstructor(String.class, String.class);
            String textureValue = Base64.getEncoder().encodeToString(("{\"textures\":{\"SKIN\":{\"url\":\"" + url + "\"}}}").getBytes());
            Object property = propertyConstructor.newInstance("textures", textureValue);

            setProperty.invoke(profile, property);
            setPlayerProfile.invoke(meta, profile);

        }

Im pretty sure I forgot something

#
 catch (ClassNotFoundException e) {
            // Fallback for 1.13–1.20 using GameProfile
            UUID uuid = UUID.nameUUIDFromBytes(url.getBytes());
            GameProfile profile = new GameProfile(uuid, null);
            profile.getProperties().put("textures", new Property("textures",
                    Base64.getEncoder().encodeToString(("{\"textures\":{\"SKIN\":{\"url\":\"" + url + "\"}}}").getBytes())));
            try {
                Method setProfile = meta.getClass().getDeclaredMethod("setProfile", GameProfile.class);
                setProfile.setAccessible(true);
                setProfile.invoke(meta, profile);
            } catch (Exception ignore) {
                try {
                    Field profileField = meta.getClass().getDeclaredField("profile");
                    profileField.setAccessible(true);
                    profileField.set(meta, profile);
                } catch (Exception ignoredAgain) {}
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        head.setItemMeta(meta);
        return head;
    }

Part2

young knoll
#

That’s still reflection though

#

I asked if it worked on 1.21 without reflection

tiny mountain
#

Well the problem is that I am using 1.13 API to make my plugin compatible from 1.8 to 1.21
Using 1.21 API It worked but I can't use it

private ItemStack createCustomHead(String textureUrl) {
        ItemStack head = new ItemStack(Material.PLAYER_HEAD);
        SkullMeta meta = (SkullMeta) head.getItemMeta();

        if (meta == null) return head;

        PlayerProfile profile = Bukkit.createPlayerProfile(UUID.randomUUID());
        PlayerTextures textures = profile.getTextures();

        try {
            URL url = new URL(textureUrl);
            textures.setSkin(url);
        } catch (MalformedURLException e) {
            e.printStackTrace();
            return head;
        }

        profile.setTextures(textures);
        meta.setOwnerProfile(profile);
        head.setItemMeta(meta);

        return head;
    }
#

I'm not really familiar with player textures sadly

young knoll
#

Alright so it’s something in your reflection

#

Personally I would just use a module system

thorn isle
#

personally i'd drop 1.8 support

tiny mountain
tiny mountain
young knoll
#

Basically you just load code based on what version the server is

#

Usually gonna be faster than a lot of reflection as well

tiny mountain
eager crescent
#

coach em up

true cosmos
trim quest
#

guys im trying to develop multi-versioned gui example

#

i followed ?gui instruction clearly

#

and its work for latest spigot versions

#

but i want to support 1.17-1.21.5

#

i have this structure but dunno which class i should load into core

wet breach
#

people sure do love making more work for themselves

trim quest
#

example project yml :

name: MenuPlugin
main: me.erano.com.Plugin
author: Erano
description: Menu Plugin
version: 1.0
api-version: 1.21
commands:
  menu:
    description: open menu
    usage: /menu
#

core project yml that supports 1.17-1.21

#

when i remove api-version it wont work for 1.21.3-1.21.1

#

the project uses 1.21.5 spigot dependency

#

it was work in 1.21.3 when api-version: 1.21 setted in yml

wet breach
#

better off just supporting 1.20.4 and above, not sure why you insist on supporting versions older then that

trim quest
#

i want to support them

wet breach
#

you want to support them for no reason? o.O

trim quest
#

its ok 1.20.4-1.21.5

wet breach
trim quest
#

but again i also need multi-project structure

#

just want to know how to abstract these spigot classes

#

and which class should i load

#

into core

#

what is the best way i mean

wet breach
#

if you looke at the versions, the amount of people using versions below 1.20.4 significantly drops

trim quest
#

if even nobody uses 1.17 i will support them just want to learn things

wet breach
#

you can either use reflection, you can use static enum or something else

trim quest
#

i will use reflection

wet breach
#

ok, then its pretty straight forward then

trim quest
#

i have samples to track

wet breach
#

not sure what help you are wanting now 🙂

smoky anchor
trim quest
#

i mean am i should load every class that i use for each version

wet breach
#

how else you going to load the class you need?

trim quest
#

arent there are common interfaces, classes

wet breach
#

not sure what you are asking

#

you compile all the classes into the project, select the class you need based on the version of server running

trim quest
#

I guess i have to load first of all these: ItemStack, InventoryEvents, Player

#

for each version

#

right

#

because i use them in my implementation

wet breach
#

no, you don't need to load anything until you need it

#

however if you have objects that are required for all the other classes you could use a single class for those

#

so that you are not having to load them all the time

trim quest
#

for example

thorn isle
#

what about muh drag event

wet breach
#

I generally use an enum to load classes though

#

or to load the appropriate ones anyways

#

I find it a bit more cleaner then using reflection

trim quest
#

do you have example on github may i observe

wet breach
#

you could just google for examples of loading objects using enums

trim quest
#

ok thank you will research

mortal hare
#

the more i do coding the more i realize coding to an interface is a bad practice

#

you should code to class unless you have to have two or more implementations of the same thing

#

am I wrong in saying that?

#

its easier to refactor than try to guess the future

#

unless you're making some kind of API for a library i dont see the need of interfaces for things which are implemented once

ivory sleet
#

or well, requirements per say

eternal night
#

The reason you interface in non libraries is usually tests. Otherwise you'll be spawning up your entire softwares dependency layout for every unit test semi quickly

#

If you don't write tests, it's w/e

thorn isle
#

you are discovering what i like to call the "taking any paradigm or principle no matter how sensible to its most absurd clown-car conclusion is a bad idea" principle

#

yes, interfaces are useful and flexible and it's generally a good idea to use them (mindfully)

#

but there's always a "too far"

ivory sleet
#

I mean yeah, if you go out of the way to code in a not oo-way, interfaces like quite powerful, for one with lambdas and method references, but then also like if you wna statically define some union type w sealed

worldly ingot
#

IInterfaceable, IInterfaced, IInterfacingInterface

ivory sleet
#

🎶

worldly ingot
#

You have to know how and when to balance inheritance vs composition

ivory sleet
#

120%

worldly ingot
#

Is that your balance?

slender elbow
#

my balance, too, is 120% of my current balance

#

($0)

trim quest
#

it depends

#

did you read GoF design pattern book

#

you will realize there are many relationships between classes for different scenarios

#

oop is not only about blindly abstracting classes

slender elbow
#

yeah what

#

I don't write an interface for every single class I make lmao

worldly ingot
#

>:( but they look clean

#

AND BUKKIT DOES IT!

slender elbow
#

take a shower 😷

blazing ocean
#

"and bukkit does it" is not a valid reason to do something the same way clueless

trim quest
#

people who dont know how oop works is oop hater mostly.

#

they think rewrite things x500 and writing 3million line of code is not problem for them

#

this could be no problem for you but for enterprises it will be loss of billion dollars.

somber scarab
#

does anyone know what would be a really efficient way of copying/pasting/modifying blocks in really high rates without destroying a server?

#

right now I'm using workload distribution to spread out the tasks

#

but I'm using world edit's api

thorn isle
#

depending on worldedit and leaving it up to the server admin whether to use base worldedit or fawe

#

this is both the safest and the fastest solution, though which one it is depends on the admin

somber scarab
#

im in development chat

#

wait

thorn isle
#

you can also try to do nms block placement nonsense yourself, but this will probably never be as fast or as stable as fawe, even if it isn't particularly stable to begin with

thorn isle
#

fawe as in fast async world edit

#

being a substitute for worldedit that is considerably faster and doesn't require you to do workload distribution yourself

#

but having a somewhat undeserved reputation of running into errors

#

personally over the course of many years i've only seen it mess things up only once, sometime in 1.8

somber scarab
#

okay. so moving my block placement methods and potentially change dependency to fast async world edit?

thorn isle
#

afaik you can just build against and use the regular worldedit api

#

and if the server admin chooses to use fawe on their server instead of worldedit, it will take over the api and do what you want it to do

#

so smaller servers can continue to use the slower but stabler worldedit, but larger servers have the option of switching to fawe if they need it

somber scarab
thorn isle
#

no, fawe takes over the api at runtime, you don't need to do any changes in your project i don't think

somber scarab
#

i never did this before so sorry if I seem lost

thorn isle
#

just put a note about it in your plugin description or something so admins are aware of the option

#

"if the plugin lags your server to shit, try installing fawe instead of worldedit"

somber scarab
#

I see

somber scarab
thorn isle
#

you said you're using the worldedit api, yes

somber scarab
#

yes. I've been using the api so far

thorn isle
#

that means you're building against the worldedit api

somber scarab
#

ahhhh

thorn isle
#

as in, the worldedit api classes are what the compiler compiles your classes against

somber scarab
#

okay..

thorn isle
#

you are also presumably building against the bukkit api

somber scarab
#

yep

#

oh wait

#

sorry

#

paper

worthy yarrow
#

(which is now technically paper kek)

somber scarab
#

okay so same thing

#

man getting used to all these terms

worthy yarrow
#

Kyori adventure got merged with paper recently, still a funny gif tho

somber scarab
#

only for minimessages tho

#

so far

worthy yarrow
#

I still use spigot and just shade all of adventure for minimessage kek

somber scarab
#

hm.. but Im still shading in adventure

#

do I not need to do that?

worthy yarrow
#

I don't think so anymore

thorn isle
#

paper includes adventure now

somber scarab
#

wait.. but I do need to do that..

#

so im using spigot? 😭

thorn isle
#

so no you don't need to shade it or even include it as a dependency, as it is a transitive dependency of paper-api and will be included in both the compile classpath and server runtime regardless

worthy yarrow
#

If you are using paper that is

somber scarab
#
            <groupId>org.spigotmc</groupId>
            <artifactId>spigot-api</artifactId>
            <version>1.21.4-R0.1-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>```
tribal quarry
#

Hello, is there plugins like SWM or ASWM (just plugin I mean, not whole server forks like Advanced Slime Paper) that supports slime world generation format with ZSTD compression & loading from DB/File/any custom loader that is available right now? just a simple plugin, not a whole paper fork or anything bigger, just as simple as grinderwolf's SWM

thorn isle
#

yeah that's no paper, you'll still need to shade in adventure

somber scarab
#

wait so what's this???

            <groupId>co.aikar</groupId>
            <artifactId>acf-paper</artifactId>
            <version>0.5.0-SNAPSHOT</version>
            <scope>provided</scope>
        </dependency>```
thorn isle
#

aikar's advanced command framework or something

#

not paper itself

#

prooobably shouldn't be using that on spigot since it maybe targets the paper runtime specifically

somber scarab
#

ahhh I was so confused for so long

somber scarab
#

well.. I'll be removing it once I finish merging this version

thorn isle
#

i never liked acf anyway

eternal night
#

cloud stonks

trim quest
#

is 1.21.5 is R4 ?

#

i guess it is

#

wiki is not up to date

#

i thought 1.21.4 and 1.21.5 share same interface

thorn isle
#

minor versions now come with nms changes, so the craftbukkit package is relocated accordingly

#

.5 was a relatively major update despite being a "minor" version change

trim quest
#

i created different projects for different interfaces anyway. i seperate R3 and R4 for 1.21

grim hound
#

since which version

#

can you send multiple resource packs to the player

#

(in packets ofc)

sacred knot
#

Returning to plugin development from 5-6 years ago. Is paper the new standard? It seems so but not sure on the market share

worthy yarrow
#

Could just dev for both

sacred knot
#

I saw that paper hard forked, so I’ve been using their documentation and handling things the way they seem to (Brigadier commands, Components, etc.). I know spigot’s way works for now but from my understanding they are deprecated and moving away from that. Maybe I’m misunderstanding that

vagrant stratus
#

keep in mind, if you want to upload to spigot's platform it must work with base spigot

trim quest
#

but some people calls it as propaganda

vagrant stratus
#

Also ngl, there's no guarantee they won't break something you're using lol

#

plugin of mine works flawlessly on spigot, but immediately breaks because of dumb shit the paper devs have done kek

trim quest
#

yeah they also limited for some in-game features @sacred knot . Spigot is still goat

eternal night
blazing ocean
#

could like, report it

thorn isle
#

a number of high-profile plugins have dropped spigot support altogether

vagrant stratus
blazing ocean
#

sigh

#

it's just so pointless to not submit issues and then complain about those issues not being fixed

remote swallow
#

its not like the issue is caused by obf or anything

eternal night
#

Well at least now it is fine xD

#

Previously I would have indeed argued that kind of incompatibility should have been reported but given hardfork has happend, yea, not much point in opening issues

vagrant stratus
#

^ Given I don't support such breaking, it's easier for me to just drop paper compat & just go about it as I have.
If it works, it works. If it doesn't, oh well

remote swallow
#

what happened to ur antimalware paper fork

vagrant stratus
#

I ain't touching that when there's a likely hood something will break next version kek

#

I do still have the code though

#

Not sure what version that's on 🤔

blazing ocean
#

looks like somebody thinks that paper will just oh, I may just like, delete this API and this feature, like no

rough drift
#

if I get helix modules loading properly (for the 900th time) will you implement AM as a module? 🥺 👉👈

blazing ocean
#

?

rough drift
#

some biome stuff

eternal night
rough drift
#

broke a freshly made plugin

#

#getByKey on the biome enum or smt idk

thorn isle
#

my only two gripes with paper are that they push for adventure over legacy strings way too hard, and that everything in the new api is marked experimental and my entire codebase has turned yellow from the warnings

remote swallow
#

biome isnt an enum anymore

blazing ocean
#

have you considered that mojang made biomes data driven

rough drift
#

at least keep the class and accessor from keys

remote swallow
#

oh yeah let me give you an enum value that doesnt exist anymore hold on

rough drift
#

or do what spigot did once and translate old usage

#

¯_(ツ)_/¯

#

but no, Biome can return custom biomes

#

tested it

vagrant stratus
blazing ocean
#

how can an enum be data driven

#

🤔

eternal night
#

Biome is an interface now

#

that was a spigot change even prior to hardfork

rough drift
#

Yeah, fair I read it wrong, still #getByKey doesn't exist on paper anymore

thorn isle
#

weeeelll you can asm a data driven enum together, provided all the driving happens before other classes access it

rough drift
#

which is... why?

eternal night
#

getByKey also doesn't exist on spigot either

thorn isle
#

but it doesn't really make any sense building against such an enum

rough drift
#

it does

remote swallow
#

✨ registry ✨

rough drift
#

I'm using it

eternal night
#

I am looking at the src

#

what getByKey are you talking about

#

Biome.getBiome exists

remote swallow
#

sounds like ike is outdated1outdated2outdated3

eternal night
#

Biome.valueOf exists

rough drift
#

1.21.5

#

hold

#

ah

#

Biome#getKeyOrNull()

#

mb

eternal night
#

Yea

#

that is a spigot method added post hardfork

#

we didn't remove it

#

we never had it

rough drift
#

mb I'm dumb 2x

#

still

thorn isle
#

in fact i would quite like for biome to have become such a "dynamic enum" so we could continue to get the performance benefits of EnumSet/Map at runtime, but it wouldn't really support reloading datapacks or registries

eternal night
#

Well it is part of spigots weird "maybe in registry" stuff

rough drift
eternal night
#

RegistryAware yea

rough drift
#

recreate the enum with native code

#

supports**** reloading

thorn isle
#

well yeah the idea is to build the enum with asm from the datapacks etc. at startup

#

however to get that to work with reloads, you'd have to reload all plugin classes as well

vagrant stratus
#

The fork doesn't seem too outdated lol
It's only on 1.20.2 @remote swallow

thorn isle
#

which i don't think vanilla /reload is expected to do

eternal night
#

don't need dynamically created enums

#

you just need the network int id

#

which the server has

rough drift
#

chat

thorn isle
#

alternatively i'd be quite content with a RegistrySet that uses a similar ordinal indexing scheme as enums but supports being rebuilt at runtime

rough drift
#

/reload starts a proxy which keeps players connected and restarts the server

thorn isle
#

which is what you're describing yes

eternal night
#

Issue naturally being, how do handle things being gone

remote swallow
#

mem leak duh

rough drift
thorn isle
#

shouldn't be an issue as long as you don't build against things that are gone

vagrant stratus
#

Actually. I do have the client-code basically done. I can quickly fork & add that 👀

vagrant stratus
#

Also, I personally wouldn't use helix so there's no reason for me to even bother with it to begin with kek

rough drift
#

I mean, there is the helix-spigot-module

#

it translates spigot <-> helix

#

(note: not a reimpl)

#

(mileage varies)

vagrant stratus
#

I trust those as much as I trust paper's.
I don't.

rough drift
#

fair enough(?)

vagrant stratus
#

not worth the effort kek

#

plus I'd have to apply the same forking treatment to helix as I'm doing w/ paper to get something that's not poorly impl'd so that's even more digging around code I'm never gonna really use outside of that one program

quaint mantle
#

do yall know of a plugin that disables mob spawning in a certain amounts of chunks of a play that has the command toggled

rough drift
vagrant stratus
#

Nope, I'd need to fork it so I can modify the module loading kekw

rough drift
#

module loading is done by the module loader module

#

which is the only hardcoded module that gets loaded

remote swallow
#

how does it load modules if the module loading is a module

rough drift
#

though it can still be swapped out

vagrant stratus
#

yes. so I'd still have to fork & learn APIs for something I won't use lol

rough drift
#

the module loader is separate from the module itself

#

it just requires the right metadata

#

so for all of the version / duplicate / compat checks it's not handled by the core loader

#

bit funky

#

but this means you get full control over what's happening

rough drift
#

hey

#

the idea is that nothing is locked in, so I'm making sure of that

#

except for yk, the required stuff like load order for the first module

vagrant stratus
#

which makes it even more of a bitch to work with, since there's no guarantee code even will exist

rough drift
#

there is a guarantee that the api exists

#

you should not be concerned with internals

vagrant stratus
#

Depending on how helix works, I might have to be concerned with internals lmfao

rough drift
#

you'd only be concerned with internals if you need to debug internals

#

otherwise it's designed to just allow relying on the API, specifically the data processing API which handles most of the work

vagrant stratus
#

ehhhh. you can figure the mess out once I release a client project LMFAO

rough drift
#

fair point

vagrant stratus
#

Given how it works... I'm not liking it from a impl something properly standpoint

rough drift
#

wdym

#

I like feedback, gimme

vagrant stratus
rough drift
#

yeah no the idea is that internals are useless

#

do not rely on internals

vagrant stratus
#

Except for if I do have to rely on internals kek

remote swallow
#

imagine when ike finds out people arent meant to rely on mc internals but still do

vagrant stratus
#

in my case, I straight up do have to rely on internals lmfao

rough drift
#

Example, to intercept plugin loading:

A message is created and broadcasted to the core channel
<any filters, processors, etc>
A handler (typically, yk, the module / plugin manager) will read the final message and work accordingly

#

all channels support middleware

vagrant stratus
#

Yea, I wouldn't do it that way since it means a different module could potentially fuck with shit

#

I'd add the changes before a single module gets loaded 😎

vagrant stratus
trim quest
#

guys i need open source plugin that supports many versions via multi-module(maven or gradle) structure

#

as an example, want to observe how people implements things

vagrant stratus
#

I'm not gonna use your message send/receive/modify system because of how easy it'd be for a different module to outright screw with the AV

#

same reason I don't make a spigot or paper plugin, but modify the server code itself

#

I'd have to dig through allll the code to see when, where, and how modules are loaded and then impl the necessary code changes to be before even a single module gets loaded so it's properly secured

vagrant stratus
#

You're entire project is an absolute security nightmare

rough drift
vagrant stratus
#

Nope. Not gonna trust it

rough drift
#

It's no different than installing random plugins what

vagrant stratus
#

If a third-party can manipulate the AV in any way, the method's fucking stupid

#

e.g. a spigot plugin, or using a messaging system

rough drift
#

oh I mean yeah I didn't think about that

#

which is why I said fair

#

I completely forgot that an AV needs to be "isolated" technically

rough drift
#

¯_(ツ)_/¯

vagrant stratus
#

or no since it means a different task can likely fuck with that one just by loading before mine

#

which is the entire issue with spigot plugins to begin with

rough drift
#

tasks are not modular

#

they are only defined by

A) Me
B) A fork of the launcher

#

they are like:

Get mc
Get libraries
Get helix
Do remapping
Start

vagrant stratus
#

ehhh

rough drift
#

I mean

#

better from a security perspective 😂

vagrant stratus
#

But not from a support perspective, as it means it can't support other launchers

#

so, therefore, have to fork helix

rough drift
#

I mean, fair enough ig, you'd have to edit helix itself then

vagrant stratus
#

yes.

#

that's what I've been saying.

rough drift
#

fair point

#

I see it now 😭

rough drift
#

I mean there is not much code

vagrant stratus
#

The only non-shit implementation helix can have is a fork of the helix internals lmfao
I'd still have to supply an official launcher anyways, but for maximum compat it'd have to be a helix fork

#

Just straight up not worth it

vagrant stratus
#

motions to the entirety of helix
It's a complete mess to support

rough drift
#

it's no different than plugins running on spigot & paper (pre hard-fork), the internals weren't really 1:1 and yet stuff still worked

remote swallow
#

helix reminds me of

rough drift
#

but yk

#

someone has to try

vagrant stratus
#

same way I'd have to ignore the "proper" way to implement things in helix

rough drift
#

I mean yes fair enough

rough drift
#

what where when why who

vagrant stratus
#

surprise. tool.

rough drift
#

oh so literally a surprise tool

#

I'm scared

mortal hare
#

i wonder how would bukkit api would look like if its event system would be switched to rxjava's observables

#

or java's Flow API

rough drift
#

kinda what I'm doing

mortal hare
#

completely event driven bukkit api would be kinda neat

rough drift
#

but in a much more general sense

rough drift
trim quest
rough drift
#

pretty much everything is done like:

Plugin data -> API impl -> Message -> Channel -> <Middleware> -> Destination (any)

and optionally backwards

trim quest
#

its already implemented with observer design pattern

main comet
#

Hello im new to this skripting and i created a few skript with plugin Skript and i dont know hot to make them start automaticly beacause im new to this stuff

mortal hare
trim quest
#

in java there are 4-5 different implementation for observer design pattern @mortal hare

#

gof way, deprecated observer/observable way, bean way, flow api

#

etc

#

it was my study topic

#

when i implement all of gof patterns

sly topaz
trim quest
#

yeah there are 2 context

sly topaz
#

RxJava would allow for composing event handlers or something of the like so it'd be cool API wise but that's just about it

earnest girder
#

My shop GUI is compromised... players can just take stuff from it by holding down a hotbar slot key and closing the inventory. How the hell can I fix this? The InventoryClickEvent is supposed to be cancelled... what do I do?
https://youtu.be/-D0wK4shoxc

sly topaz
#

that is, inventory drag mainly but there's also others like inventory move item

earnest girder
#

well those usually get cancelled by inventory click

trim quest
#

@mortal hare
observer ≈ listener ≈subscriber
subject ≈ observable ≈ publisher ≈ event

sly topaz
trim quest
#

not "=" its "≈"

earnest girder
mortal hare
sly topaz
thorn isle
#
        if(event.getClickedInventory() instanceof PlayerInventory) {
            return;
        }
#

this is your issue right here; inventory interactions can modify not just the inventory the player clicks, but the other one as well

earnest girder
#

hmmm

thorn isle
#

e.g. shift clicking an item in the player inventory will also modify the top inventory by inserting the item in it, but event.getClickedInventory() is the player inventory

earnest girder
#

but I cancel the event first

thorn isle
#

this'd cancel all events for all inventories then, no? is the listener even registered

#

how are you calling this? if this is only called for events that click the gui inventory specifically, the issue will be the same

thorn isle
#

InventoryHandler handler = this.activeInventories.get(event.getInventory());

#

try event.getView().getTopInventory() instead

earnest girder
#

ok

thorn isle
#

beyond that, make sure that your code actually gets called

earnest girder
#

it 100% does

#

theres delegation

thorn isle
#

put in a sysout at the very start of your listener and then right before where you cancel the event, and see if one gets printed without the other

#

then backtrack from there and see where it falls through

earnest girder
#

im confused, all the code is definitely running

#

everything is working correctly except for this bug

sly topaz
earnest girder
#

because the shop wouldnt work if the code didnt run?

thorn isle
#

put a sysout and see

#

that the shop code runs sometimes doesn't mean it runs always

#

this is what we call a sanity check

earnest girder
#

ok

#

in the video I linked you can see I have to try it 20 times to get the bug to work

#

its something to do with closing the inventory at the same time I hotbar-slot-click the item

thorn isle
#

are you in creative?

earnest girder
#

yes

thorn isle
#

the creative client does not always respect cancellation

#

try in survival

earnest girder
#

ah

sly topaz
#

creative is kinda annoying when it comes to inventory events

#

cursor is completely client-sided, among other side-effects

earnest girder
#

damn it just did it in survival

#

oh but wait

thorn isle
#

time to throw sysouts at it

earnest girder
#

the item dissappeared when i clicked it

thorn isle
#

yeah that's cancellation inventory desync

sly topaz
#

that's fine then, just a client desync

earnest girder
#

ok

thorn isle
#

the survival client respects the update it receives from the server later, destroying the item

earnest girder
#

what if I logged out after

thorn isle
#

the creative client goes "trust me bro" and tells the server to respawn the item

earnest girder
#

before it synced up

thorn isle
#

the item doesn't exist on the server

#

it's specifically because the creative client can arbitrarily tell the server to spawn shit in that it reappears on the server in creative

earnest girder
#

ok -- I tested bugging it and then logging out before it synced up, and the item is gone. I guess its all working fine, thanks for the help

sly topaz
#

you could try to guess whether an item was duplicated in the creative inventory by checking whether the cursor in the creative inventory event is the same as the last hotbar switch click type or something, but that's only if you care about creative anyway

earnest girder
#

yeah no one will be in creative so no worries

#

if someones in creative I have bigger problems on my hands lol

mortal hare
#

Wouldnt it be cool if you can listen to events like this

Set<UUID> joinedPlayers = new HashSet<UUID>();
playerJoinEvent.map(event => event.getPlayer().GetUUID()).subscribe(uuid => joinedPlayers.add(uuid));
playerQuitEvent.map(event => event.getPlayer().GetUUID()).subscribe(uuid => joinedPlayers.remove(uuid));

with rxjava you can, i can see how much bukkit plugins would shrink just because how much verbosity people need to listen to particular events

sly topaz
#

I mean, there's nothing stopping you from doing something like that with bukkit's current event system really

mortal hare
#

yes ik

sly topaz
#

just slap a spliterator implementation to a custom EventExecutor and make them a stream of events

mortal hare
#

but it would be kinda cool to have native support for it

sly topaz
#

eh, it's fancy but not without a cost

#

there'd be quite the overhead for high-throughput events like player move

mortal hare
#

you could probably pass static method references

#

but yeah it could be a problem

#

but i dont think that's problematic much

sly topaz
#

eh, it'd probably increase GC pauses on a larger scale, given how many plugins would have listeners for it so I wouldn't be able to say

#

it could be made fast, but it'd be annoying to implement

#

not to say the bukkit event system is perfect, the handler list collection impl is a mess, but even with that it works fairly well for what's worth

urban cloak
#

well servers on that scale probably just need to not use that feature

ivory sleet
#

sadly even w rxjava, u cant reap the full benefits of functional programming

drowsy bramble
#

is there a way to get an offline player's head to put in an inventory with spigot 1.18.2?

trim quest
#
<dependency>
  <groupId>com.mojang</groupId>
  <artifactId>authlib</artifactId>
  <version>3.11.50</version>
  <scope>provided</scope>
</dependency>```
#

you can create or get skulls with that dependency

blazing ocean
#

and why not just use SkullMeta#setOwnerProfile

trim quest
#

i developed this for 1.16.5 i guess

#

dont know

slender elbow
#

i mean, it isn't difficult to make a reactive-adapting EventExecutor

#

but the fact that the event system is not prepared for all the asynchonous nature of reactive programming means you lose all benefits the second you need to mutate the event based on something coming from some other stream

eternal night
#

how do you know that

slender elbow
#

all you gotta do is .join() :Clueless:

eternal night
blazing ocean
#

only valid use of CFs

trim quest
blazing ocean
#

completable futures

rough drift
buoyant viper
blazing ocean
#

capitalising the f should be criminal

young knoll
#

CloudflAre

blazing ocean
#

cLouDfLARe

worthy yarrow
#

Rad you wanna test packed for me

blazing ocean
worthy yarrow
#

Dang I knew it

wet breach
#

they probably have a sky window and are looking at clouds

blazing ocean
#

the window is behind me so it's hard to look outside whilst laying down

worthy yarrow
#

Nah no clouds exist in Germany

blazing ocean
#

true, spy drones

warm mica
drowsy bramble
#

how would i make it so that an EventException catch block won't throw an error if it's not implemented?

#

I don't know java @SuppressWarnings() options very well

#

it's for an InventoryClickEvent so i don't receive a console error any time someone clicks on an empty slot or outside of the inventory

slender elbow
#

uh, maybe fix your code so it doesn't error to begin with?

#

in any case, it isn't your code the one throwing an EventException, it's the server throwing/logging one when your code throws some other unchecked exception, like a NPE or IOOBE

#

so regardless the solution is "fix your code"

drowsy bramble
#

it uses a switch case. would you suggest not using switch then to do it?

slender elbow
#

the ItemStack itself is null

#

not the type

#

you are trying to call getType () on a null ItemStack

drowsy bramble
#

it occurs when i click an inventory slot or outside the inventory

slender elbow
#

yes, because no item was clicked

#

thus, the clicked item is null

#

so you cannot call getType

drowsy bramble
#

how would i fix it then?

#

or can i rather?

slender elbow
#

if (clicked item == null) {
empty slot or outside inventory
}

young knoll
#

Try catch around everything you write

buoyant viper
trim quest
#

Hello, I am currently learning about Spigot NMS. I am trying to understand when and which one I should use:

  • net.minecraft.server.level.ServerPlayer // NMS
  • org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer // CraftBukkit
  • org.bukkit.entity.Player // Bukkit
trim quest
# trim quest

im using bad practices sometimes just because this

chrome beacon
#

Use org.bukkit.entity.Player an much as possible

#

When that's not enough net.minecraft.server.level.ServerPlayer can be used as a last resort

#

CraftPlayer is mainly used to get the handle to the server player

trim quest
#

can you give sample for 3 of these

#

use cases

#

no code required

#

i just want to know

chrome beacon
#

ServerPlayer can be used to access the connection so you can send/capture packets

#

CraftPlayer to getHandle to the ServerPlayer

#

And Player to do everything else really

trim quest
chrome beacon
#

getHandle is a method in CraftPlayer that returns the ServerPlayer instance

#

You will generally find it in every craftbukkit entity wrapper

trim quest
chrome beacon
#

Yeah getHandle in that context returns the nms server

#

which contains the recentTps field that vanilla uses

vernal oasis
#

Is there a way to send a link to a player so it opens the "Are you sure you want to open the following website?" screen?

#

I'm geussing it's a hardcoded security measure preventing it?

drowsy helm
vernal oasis
#

Like, send this screen instead of having to click the link in chat:

remote swallow
#

That screen is most likely client side

vernal oasis
#

Can I make it work off a gui click?

smoky anchor
#

It's most definitely client side. It only opens when you click a link in chat.

warm mica
vernal oasis
#

Every security measure is bypassable...?

warm mica
smoky anchor
#

That is just false

vernal oasis
#

I guessed so, dang. lol

buoyant viper
#

i repied to wrrong message

vernal oasis
vernal oasis
#

Yeah, I realized what you meant lol

grim hound
#

yo

#

anybody ever done anything with libby?

smoky anchor
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!

grim hound
#

sure

#

so

#

uh

#

doesn't work

#

downloads

smoky anchor
#

?notworking

undone axleBOT
#

"Does not working" is a useless statement. Please describe what exactly is not working, what you expect it to do, and what actually happens. If you get any console errors, also ?paste the entire stacktrace.

smoky anchor
#

lol

grim hound
#

I try to load the classes

#

ClassNotFoundException

smoky anchor
#

You ever tried writing more than a sentence in one message...

buoyant viper
# warm mica You are asking for a zero day?

if i had a nickel for everytime someones asked about bypassing Minecraft security within the past 2 days, id have 2 nickels, which isnt a lot, but Weird that its happened twice...

grim hound
#

looks correct, right?

#

well the downloaded packetevents is 130KB instead of 3MB

buoyant viper
#

why not use the built in library loader?

grim hound
#

isn't it only for 1.17+ and only for maven central?

grim hound
#

this isn't maven central

warm mica
grim hound
#

yes, it seems to only have downloaded literally only that very module

#

it didn't even download its api

buoyant viper
grim hound
#

it also didn't download its abstract assets

#

(like block mappings)

grim hound
buoyant viper
#

?whereami 😔

grim hound
#

well spigot is G but slower

#

and paper devs are obnoxious

#

gotta balance by supporting both

warm mica
buoyant viper
#

does it work on spigot tho?

#

id test to make sure it isnt just a paper issue

grim hound
#

no

#

not how that works, checked the code

buoyant viper
#

just sayin, since they hardforked and do have different plugin stuff now

grim hound
#

its fuckin

#

file download

#

it literally does not download the entire jar

#

how the fuck would they change that

warm mica
#

maybe it has an api

grim hound
#

what downloaded vs what should've

grim hound
warm mica
buoyant viper
#

whats up with the {} in ur string

#

i doubt its the issue, but it is weird

grim hound
buoyant viper
#

does this plugin need to support <1.17

grim hound
#

basically

grim hound
#

this particular project - no, but I also wanted to use it for my other 1.12+ plugins

buoyant viper
#

does 2.8.0 exist

#

ah it does on codemc/snapshots repo

buoyant viper
grim hound
#

uhhh

#

can you

#

link that?

grim hound
#

wtf

#

bruh all of em are

#

wtf does implementation do then?

#

in gradle

buoyant viper
#

i think it tells gradle the dependency is required for code compilation

#

could be wrong

#

ik it superceded compile (and i think compileOnly?) tho

grim hound
#

not sure what compile does, but compileOnly lets you use the classes without bundling it into the output shadowJar

buoyant viper
#

compile is an old old Old gradle term iirc

grim hound
#

okay, still

#

how tf can you make libby download the dependencies

buoyant viper
#

maybe Libby isnt downloading Transitive Dependencies

#

looks like it probably doesnt

grim hound
buoyant viper
#

F

grim hound
#

why is this false by default and not mentioned in the tutorial

#

whyyy

#

now I look stupid

#

welp thnx for the help

buoyant viper
#

np

buoyant viper
#

?jd-s

undone axleBOT
buoyant viper
#

?stash

undone axleBOT
umbral ridge
#

is player reporting client sided

#

or can it be disabled in the server by plugins

#

i find it stupid.. why is player reporting button even necessary

eternal night
umbral ridge
#

nvm its client

#

😿

mellow edge
umbral ridge
#

ty!

#

in chat, can this be disabled too?

#

I like the first part of the message but not: error at position 1: /<--[HERE] what the heck is that

#

do I have to use brigadier for this? .. is that message client sided too?

sullen marlin
#

Yes the unknown command is client side

umbral ridge
#

hmm

#

even with protocolLib i couldn't do anything?

#

it's a tooltip

#

You can do colorized parameters with brigadier and suggested commands tooltips.. but there's so little info available about it

chrome beacon
#

Use a resource pack if you want to change it

#

command.context.parse_error

#

or if you just want to change/get rid of <--[HERE] it's command.context.here

umbral ridge
#

ok ty

fathom fox
#

Hi everyone!
I'm currently designing a system where players can plant and grow custom crops with multiple growth stages. I’m exploring different ways to implement this and was thinking about using ItemFrames with custom items to represent the crops visually at different stages. However, I'm curious: How would you recommend implementing a system like this efficiently on a server? I'm open to any ideas, including other approaches that might be better than using ItemFrames.
Would love to hear your thoughts and suggestions!

drowsy helm
#

Just a matter of managing them on chunk load so they dont persist