#help-development

1 messages ยท Page 1800 of 1

eternal oxide
#

get a basic plugin workign first

thorn merlin
#

well aint that code that is some lines ? i mean, i cant read the whole site\

eternal oxide
#

You need to learn how to create a plugin first.

#

If you don;t know Java you need to learn that first

thorn merlin
#

i know java 6/10

#

if i need to code

eternal oxide
#

have you made a plugin before?

thorn merlin
#

nope

eternal oxide
#

then start there

thorn merlin
#

kk

#

jeez, im download eclipse again after 8 months

buoyant viper
#

intellij ๐Ÿ˜Ž

eternal oxide
#

eclipse is good

thorn merlin
#

yess

eternal oxide
#

use whatever you prefer

thorn merlin
#

welp i starteed coding with eclipse, ig im gonna continue with eclipse

quaint mantle
#

eclipse bad intellij idea good

sullen marlin
#

Yes, see ChatPaginatir

native gale
#

Thank you!

pastel stag
#

So there is no way to add things to the end of an existing config file w/o losing comments OR having a server owner delete their already existing config file?

#

How do plugin developers add functionality and items to their config files down the line as their projects grow? o.o

#

There must be some way around this issue?

eternal oxide
#

Pick in a lowercase string?

brave goblet
#

I am an idiot

#

i think i put mending on the pick

#

not silk

#

๐Ÿ˜ข

buoyant viper
#

theres also the looking for an uppercase char in an all lowercase string part

#

use .toLowerCase().contains("pick")

brave goblet
buoyant viper
#

pog

brave goblet
#

the problem was

brave goblet
buoyant viper
#

rip

thorn merlin
# eternal oxide use whatever you prefer

about the plugin, how can i assosiate it with dispencer ? my idea is, the dispencer will drop 2 types of items (wets say oak wood and birch wood). How can i make the plugin to drop oak wood to 2 players only at 100% ?

#

only at 100% - guaranteed drop

pastel stag
#

Adding functionality or options to config.yml

spiral light
#

Hey if i run "./makePatches.sh" in my changed craftbukkit the following error shows up:
line 5: $1: unbound variable

any fixes ?

sullen marlin
#

Should have am argument

#

../work/decompile-xxx

thorn merlin
#

help ?

spiral light
spiral light
thorn merlin
#

or if a plugin exists that can do this do you know name

spiral light
smoky oak
#

how can i generate the 1.18 server with buildtools? It's generating 1.17 still

quaint mantle
#

--rev 1.18

smoky oak
#

k thanks

wicked lake
#
@Override
    public Map<String, Object> serialize() {
        Map<String, Object> data = new HashMap<>();
        HashMap<String, Map<String, Object>> serializedSkills = new HashMap<>();
        for(Map.Entry<String, SkillObj> entry : skills.entrySet()) {
            serializedSkills.put(entry.getKey(), entry.getValue().serialize());
        }
        data.put("skills", serializedSkills);
        data.put("race", this.race);
        data.put("lvl", this.level);
        return data;
    }```
```java
@Override
    public Map<String, Object> serialize() {
        Map<String, Object> skill = new HashMap<>();
        skill.put("level", this.level);
        skill.put("exp", this.exp);
        skill.put("max", this.maxLevel);
        skill.put("name", this.name);
        return skill;
    }```
How would I deserialize this?
#

Need to get the skills out of serializedSkills

#
public static ConfigurationSerializable deserialize(Map<String, Object> map) {
        int lvl = (int)map.get("level");
        int exp = (int)map.get("exp");
        int max = (int)map.get("max");
        String name = String.valueOf(map.get("name"));
        return new SkillObj(lvl, exp, max, name);
    }``` here's the deserialize for SkillObj
worn tundra
#

Is the second one a "skill"?

wicked lake
#

Second one is a SkillObj, first is Playerdata containing a hashmap of SkillObjs

worn tundra
#

And the problem is?

worn tundra
#

If you have a Map<String, Object>, you can cast the object to anything

#

So in this case I believe you want to get the serialized SkillObj from Playerdata

wicked lake
#
HashMap<String, Map<String, Object>> serializedSkills = new HashMap<>();``` the Object in question is another map
worn tundra
#

You can do

HashMap<Whatever, Whatever> anotherMap = map.get("Whatever");"```
#

And the cast itself so that your ide won't freak out

wicked lake
#

I'm so confused I'm sorry

#

I've been working at this for hours

#
Map<String, Map<String, Object>> skill = (Map<String, Map<String, Object>>)map.get("skills");```
#

Is this basically what you're saying?

#

Actually that worked!

knotty ember
#

Did somebody notice that the ClickEvent.Action is completely missing?
I cannot get it to work in 1.18 ๐Ÿ˜ฆ

pastel stag
#

is there a cleaner, more graceful way to disable a plugin onEnable instead of this.getServer().getPluginManager().disablePlugin(this);

ivory sleet
#

Technically could raise an exception ยฏ_(ใƒ„)_/ยฏ

knotty ember
pastel stag
ivory sleet
#

ClickEvent.Action?

pastel stag
#

looking for a way to do it without all the spam

knotty ember
spiral light
#

InventoryAction ?

knotty ember
spiral light
#

ClickEvent is bungee ?

knotty ember
#

Yes sorry. I mean the chat api : import net.md_5.bungee.api.chat.ClickEvent;

quaint mantle
pastel stag
#

yes

#

...console spam

#

?paste

undone axleBOT
pastel stag
quaint mantle
#

This is not intented

#

Djd you swap the jar on running server?

pastel stag
#

well its what happens when you try to use that method of disabling the plugin on startup

#

nope its simply the console output when that method is fired, it disabled the plugin, just very sloppily

spiral light
quaint mantle
#

recompile the jar and try again

#

Like, there's no other way

pastel stag
#

i just want my plugin to throw itself on the sword ok...

#

gracefully

#

lol

knotty ember
#

import net.md_5.bungee.api.chat.ClickEvent.Action => Cannot be resolved
import net.md_5.bungee.api.chat.ClickEvent$Action => Works fine. I dont get it

tender shard
#

it's working fine for me too

#

btw your import should look like this usually:

import net.md_5.bungee.api.chat.ClickEvent;
knotty ember
tender shard
#

does it work when you directly import ClickEvent instead of the nested class, and then access it as shown above using ClickEvent.Action?

knotty ember
#

Nope. My IDE adds the import to the list but marks it as an missing import

tender shard
#

hm very strange. which .jar did you add as dependency? the one that buildtools created? Because I think in 1.18 it only contains some bootstrapping thingy

stone sinew
tender shard
knotty ember
#

I have added the marked jar to my library

spiral light
tender shard
tender shard
tender shard
# stone sinew Broken

can you explain what you think is broken? because everything's working just fine for me

spiral light
knotty ember
#

Looks like it does

stone sinew
tender shard
#

can't find it, you got a link?

#

@stone sinew

knotty ember
stone sinew
tender shard
tender shard
#

"stuff is broken" - "what stuff?" - "search for it. I won't tell you" lol

stone sinew
knotty ember
#

lmao

sullen marlin
knotty ember
sullen marlin
#

works for me, depending on the -shaded jar

tender shard
#

maybe you just don't know how to do stuff because everything seems to be working for the majority of people @stone sinew

sullen marlin
#

your ide just seems broken

tender shard
#

try to invalidate caches

sullen marlin
#

try restarting it, clearing caches, reloading project, etc

knotty ember
sullen marlin
stone sinew
#

Tried all jars, tried maven etc... still get errors.

sullen marlin
tender shard
sullen marlin
#

so your IDE even compiling that is wrong

#

yeah straight javac will not compile with a $ for me

tender shard
knotty ember
#

yes

tender shard
#

alright then I'm not surprised lol

knotty ember
#

xD

#

It compiles with ClickEvent$Action. No issues after that

sullen marlin
#

I feel like reloading/clearing cache will fix it

#

java IDEs still havent figured out reliable caching

tender shard
#

you actually get it to compile with this?

import net.md_5.bungee.api.chat.ClickEvent$Action;
knotty ember
#

Yes

tender shard
#
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /C:/Users/mfnal/IdeaProjects/Test/src/main/java/de/jeff_media/test/PDCCommand.java:[10,32] cannot find symbol
  symbol:   class ClickEvent$Action
  location: package net.md_5.bungee.api.chat
knotty ember
#

Could it be a problem that 5 other plugins in my library implement that ClickEvent.Action?

tender shard
#

that is what should actually happen when using the $ symbol lol

sullen marlin
#

wdym implement

knotty ember
#

Event that

#

No issues

tender shard
#

is that some kind of strange eclipse magic? that it just shows a $ sign there to show that it's a nested class, while it actually uses a normal . ? ๐Ÿ˜„

knotty ember
tender shard
#

because as md_5 pointed out, that code should NOT be able to compile

knotty ember
#

It even tells me that the class is there

tender shard
# knotty ember

those do not "implement" ClickEvent, they just have a class with the same name

#

that's no problem because that's what packages are made for

knotty ember
#

I really dont want to leave it like that. But if its working, I guess its fine

tender shard
#

somehow it seems to be normal that eclipse uses the $ sign but that makes no sense as it also doesn't do anything else than passing the whole stuff to javac when building

stone sinew
#

@tender shard with the amount of times you asked you could have searched it up.

tender shard
worn tundra
#

Huh

knotty ember
tender shard
#

only stuff I can see @stone sinew is you having trouble with Files.copy and that has nothing to do with spigotr / 1.18

sullen marlin
#

eclipse doesnt compile with javac

tender shard
#

oh it doesn't?

sullen marlin
#

it has its own compiler, ecj

tender shard
#

I just assumed that. Haven't used eclipse for years

#

yeah maybe it's indeed a weird eclipse thing then? idk

knotty ember
#

Hm maybe I am fine then

tender shard
#

I'll just start eclipse and check whether it happens to me too

knotty ember
#

Alright thanks

stone sinew
#

...

tender shard
#

it uses the "normal" variant for me

tender shard
#

it would be way easier to just use maven. buildtools automatically installs the correct dependency to your local maven repository

#

otherwise, you can find the spigot server .jar inside BuildTools/Spigot/Spigot-Server/target

#

or something like that

next fossil
#

Guys, how do I compile with the new Packets when it blocks out the 1.17 ones? Like GameProfile, EntityPlayer are not showing up, I'm using the Mojang & obf imports and all as said in the forum thread

tender shard
#

it's a separate library now

#

if you extract the spigot server .jar file, you can find it inside META-INF/libraries

stone sinew
tender shard
tender shard
#

correction:

#

it should be ServerPlayer

#

import net.minecraft.server.level.ServerPlayer

#

e.g. like this:

#
  final ServerPlayer entityPlayer = ((CraftPlayer) player).getHandle();
next fossil
#

Wait, how do you find the changelog from 1.17 to 1.18 packets?

#

That'd be super helpful

stone sinew
tender shard
next fossil
#

Oh then how did you know its been changed to ServerPlayer from EntityPlayer?

tender shard
tender shard
#

if you want to use the "old" names, don't use the obfuscated mappings

#

but tbh you should use the mojang mappings for NMS

stone sinew
tender shard
tender shard
next fossil
#

But I don't get it, CraftPlayer doesn't show up in the new import

tender shard
next fossil
#

Just tells me CraftPlayer cannot be resolved to a type

#

Ohh..

tender shard
#

what .jar did you add as dependency?

next fossil
#

I'm using the remapped-mojang jar for NBT and the shaded-api for the API part

tender shard
#

remapped mojang should contain CraftPlayer

#

here's the import, working fine for me with just spigot .jar

#

also remapped-mojang

next fossil
#

Maybe its this error:

#

The type com.mojang.authlib.GameProfile cannot be resolved. It is indirectly referenced from required .class files

tender shard
#

are you using maven?

next fossil
#

No

tender shard
#

or adding the dependencies manually?

#

okay so

next fossil
#

Manually

tender shard
#

go to your buildtools directory

#

open spigot .jar with winrar or sth similar

#

then go to META-INF/libraries

#

you have a authlib.jar inside there

#

extract it somewhere and add that as dependency, too

#

it'll work then

#

I had the same problem but I installed it to my maven repo instead. however adding it manually will work fine, too

#

@sullen marlin would it be possible for buildtools to automatically install all the libraries inside META-INF/libraries to the maven repo? I think I alraedy asked you something similar a few days ago but I have missed your reply

sullen marlin
#

It's does....

tender shard
#

or maybe I don't understand how it works in 1.18, but I had to manually mvn install:install-file the authlib

#

oh really?

#

hm

sullen marlin
#

Thats why using maven works

tender shard
#

are you sure it also installs all those libs when NOT using the mojang mappings?

sullen marlin
#

Yes

tender shard
#

strange, I must have been stupid then, thanks^^

brisk estuary
#

is there any event for everytime a player gets hit?

#

i'm willing to aply a potion effect to a player everytime he gets hit by a specific sword

tender shard
#

If so: EntityDamageByEntityEvent or simply EntityDamageEvent

brisk estuary
#

oh

#

ok tks

tender shard
#

np

#

so basically

#

use EntityDamageByEntityEvent, then get the damager, check if it's a player, if yes: cast it to player and check their main hand item

brisk estuary
#

ok, ty so much : )

next fossil
#

Wait what happened to the Packet sending function?

next fossil
#

Now it becomes send(<Packet>)

#

I'm trying with:
connection.send(new PacketPlayOutNamedEntitySpawn(npc));

tender shard
#

didnt you say you use mojang mappings?

#

PacketPlayOutNamedEntitySpawn is NOT the mojang name

#

here's how I'm sending packets

#
((CraftPlayer)player).getHandle().connection.connection.send(packet)
#

that's for 1.18. Are you on 1.18 or 1.17?

next fossil
#

1.18

spiral light
#

connection.connection ?

tender shard
#

are you sure you using mojang mappings? because as said, PacketPlayOut... is not the mojang mapped name

tender shard
#

the first "connection" refers to ServerPlayer's ServerGamePacketListenerImpl

#

and that also has a field called "connection" of the type "Connection"

next fossil
#

Yes but I'm confused on how to use ServerGamePacketListenerImpl, do we declare the entire Packet inside like:
connection.send(PacketPlayOutNamedEntitySpawn(npc));

tender shard
#

check out this:

#

it has some methods for spawning fake players etc

#

maybe it'll help you

#

PacketUtils.sendPacket is basically the same as the sendPacket method inside that class

sullen marlin
#

hideEntityFromPlayer(@NotNull

#

There's now an API for that

#

Player#hideEntity

tender shard
#

oh nice

#

but I need it for fake entities

#

for holograms using area effect clouds

#

I assume that's not possible yet? I just send the packet for "yo there's an invisible entity called asdasdasd nearby" and then hide it again when I don't want to show it to the player anymore

#

I'd love to try to contribute something to the API sometime but I literally have no idea lol

brisk estuary
#

did I make it correctly?

buoyant viper
#

namely the Skull owner thing

next fossil
#

The method sendPacket(Packet<capture#1-of ?>) is undefined for the type ServerGamePacketListenerImpl what..

brisk estuary
#
            if(damager.getInventory().getItemInMainHand() == FluPotion.FLU_SWORD){
#

should I use .equals or == in this case?

next fossil
brisk estuary
#

ok

next fossil
#

Omg the ServerGamePacketListenerImpl # sendPacket(Packet<packet>) is so hard to grasp

worn tundra
#

What the hell are you saying

worn tundra
next fossil
#

I read on Spigot forums they said the .equals method is some obsolete way to replace the == which didn't work on some comparisons

#

They said the == method is more efficient

worn tundra
#

== has it's own use cases

worn tundra
#

Like comparing ints and enums

#

Not objects

hybrid spoke
#

objects aswell

brisk estuary
next fossil
#

Anyways how to handle the 1.18 Packet sending? That got me stumped

worn tundra
next fossil
#

I really need help with the 1.18 packet sending please

wide coyote
#

np

tender shard
#

you should use equals instead

#

and also

#

it will break once the item lost durability

hybrid spoke
tender shard
#

you should use a custom PDC tag to check for your custom item

tender shard
worn tundra
#

^

next fossil
#

Can someone give me an example of the 1.18 packet sending method? The one from the library still uses 1.17 NBT

tender shard
#

I sent you an example for sending packets in 1.18

#

the github link

next fossil
#

Yeah that one uses 1.17 NBT

tender shard
#

it does not use NBT at all

hybrid spoke
tender shard
#

yeah you're right on that

next fossil
#

I tried copying that over to my code to test it has import problems

tender shard
#

I already said that 3 times

buoyant viper
tender shard
#

for custom base64 textures, no

buoyant viper
#

oh right weve gone over skulls..

next fossil
#

I had to change PlayerConnection to ServerGamePacketListenerImpl and the getHandle().c is still the old one, which is now getHandle().connection;

tender shard
#

if it's possible to use base64 without NMS, let me know pls ๐Ÿ˜„ I don't think it's possible

worn tundra
next fossil
#

I am using Mojang Mappings

buoyant viper
#

depends on if u can make a fake player without nms.. bc if u can supply the GameProfile somehow thru api then it should work

worn tundra
tender shard
next fossil
#

I have this in my external library: spigot-1.18-R0.1-SNAPSHOT-remapped-mojang.jar

#

That's the mojang mappings jar

#

It still shows import errors

tender shard
#

but you still have the old packet names so something's not right in your dependency setup

#

e.g. packets are not called PacketPlayOut... but Clientbound...

#

in mojang mappings

#

e.g. PacketPlayOutEntitySpawn (or sth like that) is actually ClientboundAddEntityPacket in mojang mappings

next fossil
#

There's no changelog like you said

tender shard
#

you are not supposed to find it out, it's not part of the API

sharp wren
#

1 help guys

next fossil
#

???

tender shard
#

I simply looked through the packets and looked for it myself

#

there is no official changelog

#

because it's ondocumented

#

because it's not part of the API

#

it's internal MC stuff

tender shard
next fossil
#

You said CraftPlayer has changed to ServerPlayer, stuff like that. I looked through the new 1.18 classes with a decompiler, it doesn't mention the new ones

hybrid spoke
tender shard
#

I said EntityPlayer changed to ServerPlayer

sharp wren
#

I installed znpcs plugin and economy shop

tender shard
#

CraftPlayer is still CraftPlayer

tender shard
next fossil
#

My bad I meant EntityPlayer

tender shard
#

this is for plugin DEVELOPMENT

tender shard
sharp wren
#

Then where i will ask

tender shard
next fossil
#

You said it doesn't use NBT..?

tender shard
#

@next fossil Yes. My lib does NOT use NBT ANYWHERE

tender shard
#

I use == on objects quite often. But you should only use when you know that it'll work, otherwise stick to equals

next fossil
#

Then you said the NMS is in the internal MC and you looked through it yourself

next fossil
#

So it DOES have NBT

tender shard
#

no

#

NBT != NMS

hybrid spoke
next fossil
#

Oh

#

I thought NBT and NMS are the same thing

tender shard
#

oh no

#

let me explain

#

NBT are something like "data storage" on itemstacks, entities etc. NBT is part of NMS, but there are many other NMS stuff things, like e.g. sending packets

next fossil
#

As long as its packets I assume its NBT/NMS (Different Names)

worn tundra
sharp wren
next fossil
#

Ohh okay I get it now

tender shard
next fossil
#

NBT is like ItemStack attributes & modifiers, NMS is overall Packets

#

Got it

tender shard
#

yeah well, "overall packets", not really. NMS is short for everything inside "net.minecraft.server", so basically everything that mojang coded themselves

hybrid spoke
#

NMS is simply said minecraft multiplayer based

next fossil
#

Okay so what I meant to say just now was the JeffLib github repo you sent still uses the old NMS from 1.17

#

I'm just trying to figure out how to use the new ServerGamePacketListenerImpl to send packets

tender shard
#

obviously that's 1.18

#

to send a packet:

next fossil
#

I tried but it keeps giving me this error:
The method sendPacket(Packet<capture#1-of ?>) is undefined for the type ServerGamePacketListenerImpl

tender shard
#
ClientboundAddEntityPacket packet = new ClientboundAddEntityPacket(someNMSEntity);
((CraftPlayer)player).getHandle().connection.connection.send(packet)

where "player" is a normal org.bukkit.entity.Player

tender shard
#

which is why there is ".connection" twice in the code above

#

trust me, my code is indeed 1.18 and it's working fine. Otherwise I would have gotten 50 bug reports already lol

#

if you got a problem, show your code pls

#

including your imports

next fossil
#

Does the new Spigot 1.18 NMS use the lettering convention still btw?

tender shard
#

lettering convention?

next fossil
#

Like .getHandler().a.b.c?

tender shard
#

no

#

it has real names

#

well

#

mojang remapped has real names

#

the "normal" obfuscated code, the one the server actually runs, still has obfuscated names like getHandle().a.b.c

spiral light
#

is it possible to code with mojang mappings and then while maven run obfuscate it to spigot using ?

tender shard
#

in short:
The server you run has obfuscated names. However, since mojang released the mappings, you can get yourself a .jar that contains mojang's original names. So the variables have meaningful names. However, to run your plugin, you have to "reobfuscate" your plugin again. It can be easily done with maven.

tender shard
#

One sec

#

check out my pom for 1.18

#

the interesting part is the <plugin> section with net.md-5

#

also be sure to use the correct dependency:

        <dependency>
            <groupId>org.spigotmc</groupId>
            <artifactId>spigot</artifactId>
            <version>1.18-pre8-R0.1-SNAPSHOT</version>
            <classifier>remapped-mojang</classifier>
            <scope>provided</scope>
        </dependency>
#

obviously you can remove the pre8 part

#

you now have the mojang mappings inside your IDE, but when you compile it, it will be "reversed" to the obfuscated names so it runs fine on the server

next fossil
#

Is it mandatory to reobfuscate the code again in order for the plugin to work? Or optional? Cause Maven caused me a lot of issues in the past and I really don't want to turn back to it again

tender shard
tender shard
#

in the beginning, it's hard. I also raged at maven the first time I tried but I never wanna miss it again

#

just go through the hassle once and you never wanna miss it again

#

I promise

next fossil
#

Okay

tender shard
#

I was also like "wtf is this shit, maven makes my life more complicated" lol. But meanwhile I know better

#

TL;DR: Use IntelliJ instead of eclipse if you want to use maven. I never got eclipse to properly load maven projects when the project was originally created in eclipse without maven

spiral light
#

i just have to find out where those classes are and how they are named ... uff

tender shard
vital sail
#

help

#

i added plugins to my server, but when i do /pl it sends "skript, vault" and when i try /skript it sends "/skript help"

hybrid spoke
summer scroll
#

The output of the debug:

[18:51:12 INFO]: milisToSecond() = 1638445865
[18:51:12 INFO]: milisToSecond() > 30 = true
tender shard
#

just divide it by 1000

#

int seconds = System.currentTimeMillis / 1000;

#

you probably gotta cast it or store as long instead

summer scroll
tender shard
#

what are you actually trying to do?

summer scroll
#

Check If it has passed 30 seconds.

#

From the creation of the object.

tender shard
#

you must check the difference between both times

#

you just check whether the current time since 1 jan 1970 is greater than 30

summer scroll
#

Oh

tender shard
#

basically

summer scroll
#

I know I think

tender shard
#

public boolean isTimeRanOut() {
return milisToSecond() > 30 + (time/1000);
}

summer scroll
#
int timeCreated = System.currentTimeMilis();
int now = System.currentTimeMilis();

timeCreated - now / 1000;
tender shard
#

btw I wouldn't care about converting to seconds

#

just check whether the difference is greater than 30000

#

it's easier than converting it everytime imho

summer scroll
#

It's more readable for me.

#

Dividing by 1000 won't hurt xd

#

Anyway, thank you

ivory sleet
#

Or use TimeUnit fingerguns

tender shard
#

they already use timeunit ๐Ÿ™‚

#

I just think it's easier to not convert back and forth, it's just another place where a bug could somehow occur

summer scroll
#

Conclure why you left me ๐Ÿ˜ฆ

next fossil
#

Why are some packet listeners not able to be resolved? The imports are correct and all

#

The import net.minecraft.network.protocol.game.PacketListenerPlayOut cannot be resolved

tender shard
#

you still try to use the normal names

#

although you have to use the mojang mapped ones

#

this is the fourth time I tell you this

next fossil
#

I looked through the implementation it has those too

static crane
#
    public static void OnShift(PlayerToggleSneakEvent event){
        if(event.isSneaking()){
            PlayerInventory inv = event.getPlayer().getInventory();
            if (inv.getHelmet() == ItemManager.warriorHelmet){
                if (inv.getChestplate() == ItemManager.warriorChestplate){
                    if (inv.getLeggings() == ItemManager.warriorLeggings){
                        if (inv.getBoots() == ItemManager.warriorBoots){
                            Player player = event.getPlayer();
                            player.getWorld().createExplosion(player.getLocation(), 4);

                        }
                    }
                }
            }
        }
    } ``` Can someone help me I dont get why my plugin isn't working?  it seems to be te right code and I get 0 errors.
tender shard
tender shard
#

and also

#

avoid the arrow pattern

#

as a short debug thing: add a print statement inside every if

#

so you can see where your code stops

summer scroll
tender shard
#

oh yes

summer scroll
#

Maybe try to use ItemStack#isSimiliar instead?

static crane
#

tnx guys

orchid cove
#

hello

#

how to make a repeat code per tick without crashserver?

tender shard
#

don't do stuff that crashes the server

#
Bukkit.getScheduler().runTaskTimer(yourPlugin, () -> {
  // Your code
}, 1, 1);
#

it won't crash unless you do things that are really really bad

next fossil
#

Do you know the replacement for DataWatchers btw?

#

Like the external skin for a Player used to be DataWatcher

#

Oh nvm found it: SynchedEntityData

tender shard
#

yes

#

just wanted to mention

#

lol

orchid cove
tender shard
#

a reference to your class that extends JavaPlugin

#

e.g. if you are inside that class, use this

orchid cove
#

ok thx

tender shard
#

if you are outside of your main class: use a static getter to get your instance, or use dependency injection

#

both is fine. some people claim one thing is better than the other, but in the end it doesn't matter which of those you use.

ivory sleet
#

๐Ÿฅด

quaint mantle
#

hi i need help with reading data from a config file into a HashMap<String, String> does anyone know how that works?

orchid cove
#

hello this my first time using this how to fix this errors

hoary pawn
#

i cant see which one it should have else

quaint mantle
#

Reading data form an config file into a HashMap

summer scroll
orchid cove
tender shard
buoyant viper
#

and seeing if the plugin.yml is correct

tender shard
quaint mantle
# tender shard You want to have every node inside that hashmap?

Yeah, so i have a claim command that is using a HashMap with <String, String>
I got it to save the data but i don't know how to read it and put it back in
saving Code:

        for(Map.Entry<String, String> entry : chunks.entrySet()) {
            hash.getHash().set("claims."+ entry.getKey(), entry.getValue());
        }
        hash.saveHash();
    }```
quaint mantle
#

i am slow at typing sorry XD

tender shard
#

no problem ๐Ÿ˜„

#

what I sent will work with every FileConfiguration. Obviously you'll have to change "getConfig()" to the FileConfiguration object you want to use

hoary pawn
tender shard
#

java -jar <jarname>

#

or on most OS: just double click it

hoary pawn
#

that is not working

tender shard
#

open a terminal and type java -jar Recaf.jar

quaint mantle
buoyant viper
desert loom
#

if you just want to check if your exported jar has your plugin.yml, you could use winrar/7zip to open the jar.

buoyant viper
#

oh yeah, that is possible

hoary pawn
#

WHY DOES WINDOWS HATE ME

buoyant viper
#

lets take theones route

tender shard
#

hm one sec

buoyant viper
#

u got winrar or 7zip?

hoary pawn
#

i got something that can open it yes

summer scroll
#

jd-gui best

hoary pawn
#

it is the wrong plugin

#

BUT WHERE DOES IT GET IT FROM

buoyant viper
#

what does it look like

hoary pawn
#

i get this

tender shard
#

oh wait @hoary pawn

#

you got the wrong jar

#

you need the recaf-<version>-jar-with-dependencies.jar

hoary pawn
#

ahh

#

well winrar worked

tender shard
#

then you can easily start it

quaint mantle
hoary pawn
tender shard
buoyant viper
#

oh

quaint mantle
#

okay

hoary pawn
#

just dont undetstand where it gets it from

buoyant viper
#

wait target is just a compiled output tho..

hoary pawn
#

yes

quaint mantle
#

i guess i could've just tested xD

tender shard
#

e.g. this:

key1:
  subkey1: test
key2: test

Will turn into this hashmap:
key1.subkey1 -> test
key2 -> test

hoary pawn
#

i just dont understand where target gets it from

buoyant viper
#

try running the "Clean" task in either gradle or maven

#

and then build again?

hoary pawn
#

WAIIIIIIIIIII

quaint mantle
hoary pawn
#

its because plugin.yml was in the wrong place

buoyant viper
#

oh rip

hoary pawn
#

well it might work now soooo

buoyant viper
#

oh yeah u can delete recaf if u want, u probably dont need to be decompiling or editing jars any time soon

orchid cove
#

how to fix it , it happend when i try to add plugins after the implements Listener for Bukkit getScheduler working

buoyant viper
#

what class is ur main plugin class

#

like what one has extends JavaPlugin in it

hoary pawn
buoyant viper
worn tundra
hoary pawn
buoyant viper
#

but if ur gonna keep recaf u should probably get the right one lol

hoary pawn
#

like 2 tbs of random video files xd

buoyant viper
wide solstice
#

Anyone know if there is a feature w/ placeholderapi for plurals? i.e.

MY_MESSAGE: 'You have %player_wins% wins' # <-- make "wins" -> "win" if %player_wins% == 1

I know I can just add my own check, but I'm wondering if placeholderapi can do it for me ๐Ÿ™‚

buoyant viper
#

only had what i needed... deleted what could be sacrificed...

hoary pawn
#

isnt that the amount of space windows uses on a install xd

spiral light
#

Does someone know a translation file between Bukkit-Names and the mojang-names ?
For example:
Bukkit-Name is NBTTagCompound and in Mojang they called it CompoundTag

buoyant viper
ivory sleet
#

Because that is inconsistent in regards to localizations Nicbo

wide solstice
#

Ah okay, thanks

hoary pawn
buoyant viper
#

wahoo

ivory sleet
#

?scheduling

undone axleBOT
orchid cove
ivory sleet
#

?paste

undone axleBOT
ivory sleet
#

On phone so discord sucks

buoyant viper
#

dont gotta be on phone for discord to suck

ivory sleet
tender shard
#

if you have, at ANY point, something like "YourPluginName plugin = new YourPluginName()": you did sth wrong

ivory sleet
#

I donโ€™t think he understands the notion of instantiation

opal sluice
#

Maybe he does "new Main()" ๐Ÿคก

tender shard
#

show your main class and highlight line 14 pls @orchid cove

paper viper
tender shard
#

I also still ahve plugins where the Main class is called Main lol

opal sluice
#

By looking at his error, he named it "Main" ๐Ÿคก

tender shard
#

meanwhile I know better but

lean gull
#

can someone explain to me how to make this? (clarification: i do not want spoonfeeding, i want someone to explain to me how i can achieve this and maybe even add some resources if you can - if you tell me to learn java i will just ignore you since i do find it annoying and rude)

tender shard
#

never change a running system

buoyant viper
#

i usually do <PluginName>Main or something

#

or Core, Plugin, etc

tender shard
tender shard
#

and, don't kill me, I'm using static getters to get the main instance

ivory sleet
#

<PluginName>Plugin is imo the best as its actually a derivative of Plugin, PluginBase and JavaPlugin

tender shard
buoyant viper
opal sluice
tender shard
#

I think it's bs

ivory sleet
#

๐Ÿฅด

tender shard
#

but somehow those people are right

#

it indeed violates some OOP laws

opal sluice
tender shard
#

but I don't care because it doesn't matter in this case

paper viper
buoyant viper
#

just slap in a good old public static PluginMain INSTANCE; and a good old onEnable INSTANCE = this;

orchid cove
#

i am so bad lmao

tender shard
ivory sleet
buoyant viper
#

?java

#

?learnjava

undone axleBOT
ivory sleet
#

Anyways

tender shard
ivory sleet
#

Start by removing extends JavaPlugin ^

tender shard
#

only exactly ONE CLASS may extend javaplugin

ivory sleet
#

must

tender shard
#

yes

buoyant viper
#

perhaps

lean gull
#

whoevers behind the discord server development should remove learnjava command

tender shard
#

no

#

it's a good command

ivory sleet
#

I added it ftr

tender shard
#

the problem is that 99% of people don't read it

lean gull
#

it's rude

quaint mantle
#

What is the best way to check if a player interacted with a custom ItemStack?

tender shard
#

it is not rude

#

if you don't know basic java, you must learn it to code plugins

ivory sleet
#

No itโ€™s unarguably the most helpful command

buoyant viper
#

not rude, useful

tender shard
#

it's like saying "ugh I need a drivers license to drive a car? that's rude"

lean gull
tender shard
#

it's not rude, it's just neccessary

ivory sleet
tender shard
#

noone is mocking someone for not knowing java. it's a hint to help people understand that spigot is not a language, but just something you can use after you already know at least basic java

lean gull
ivory sleet
#

In that case, compare nbt data (for instance an entryโ€™s value and check if it matches another value.

buoyant viper
tender shard
#

e.g. yesterday

buoyant viper
#

i ran it so they can take a look at how java works to aid them in finding out their issues

lean gull
tender shard
#

there was a guy (or girl, idk) who wanted to something like this:
player.setMaxHealth("20");

quaint mantle
buoyant viper
tender shard
#

if people don't even know the difference between ints/doubles and strings, they MUST ?learnjava beforehand

ivory sleet
#

?pdc

lean gull
#

or you can just explain to them what they're doing incorrectly in a nice way

tender shard
#

yeah PDC is heaven sent

buoyant viper
#

they are telling them the issue exactly

tender shard
buoyant viper
#

i am providing sources so that they can avoid the mistake again

lean gull
#

yes, it will take them longer to learn but some people prefer it (or just me, idk)

quaint mantle
#

Sweet thank you guys

opal sluice
ivory sleet
tender shard
#

@quaint mantle just to clarify: PDC is NOT nbt

ivory sleet
#

Sort of is

tender shard
#

it's however something that's better and that you can use instead, 99% of the time

lean gull
tender shard
orchid cove
#

yess thank @tender shard , @ivory sleet i got fixed that errors

buoyant viper
lean gull
buoyant viper
#

and thats what ?learnjava can do

#

so that i dont have to

lean gull
#

you don't need to go all "oh you don't know java here's some stuff to teach you"

tender shard
lean gull
#

but it's rude

opal sluice
buoyant viper
#

tough love? idk..

tender shard
lean gull
#

if you don't want to teach them stuff then don't, you don't have to be rude about it

opal sluice
#

This wouldn't be a Serious spigot and bung prog/dev help channel

tender shard
#

maybe you get offended when someone tells you that you don't know everything, but most people are not offended by that

buoyant viper
#

i sent the command so that i dont have to teach them it myself...

tender shard
#

after all this is a channel for help, and someone who already knows everything won't ask questions here

buoyant viper
#

or so that mfnalex and conclure woukdnt have to

opal sluice
#

It's like on Stackoverflow

tender shard
#

I'm doing spigot plugins since 2011 and I still need some help from time to time

lean gull
#

no, actually this is also for java help in general

opal sluice
#

if you ask for basic things, they'll just lead you to the javadoc

buoyant viper
#

spigot should not have to teach some1 java, java should teach some1 java

ivory sleet
#

iDerpyOfficial yes I have seen you getting greeted by some rude encounters long time ago but just because someone tells you to learn java doesnโ€™t inherently mean they had a rude and insulting intention

lean gull
#

good intention or bad intention, it's rude

tender shard
#

learnjava is a totally fine command and it doesnt offend anyone. its simply a link to some basics, to help people understand stuff

tender shard
#

I'm out

#

have a nice day @lean gull

ivory sleet
lean gull
buoyant viper
#

couldnt tell if they didnt understand java or the spigot api so i did a ?learnjava

lean gull
#

alerithe your intention was rude but telling people to learn java is rude by itself

#

so that's double the rude!

#

wow

buoyant viper
spare prism
#

Is there a way to check if a player equipped armor in PlayerInteractEvent instead of opening a furnace, for example, without using a list of such type of blocks?

opal sluice
buoyant viper
#

he couldve just not understood with JavaPlugin was so idk

tender shard
buoyant viper
#

i actually thought thats what the issue was judging by attempting to implement Plugin in his event class

opal sluice
lean gull
opal sluice
#

If he just c/p a tutorial on the net

#

not really sure if it's a good way to learn

tender shard
ivory sleet
buoyant viper
lean gull
#

welp i guess that argument is done

ivory sleet
#

Maybe checkout something like armor equip event lib

tender shard
#

yeah sorry but I really don't get your point

#

Noone meant to be rude. People wanted to help you by providing useful links @lean gull

spare prism
#

ok

#

ty

ivory sleet
#

๐Ÿ‘

opal sluice
lean gull
#

you were meant to be rude, alerithe meant to be rude, and that's just in the past like 10 min

tender shard
#

If you don't want to read them and instead say you don't need to read it, that's okay, but then noone here can help you

buoyant viper
tender shard
buoyant viper
#

it was a hey im not sure if u understand java, read these

tender shard
#

sorry for that

#

wasn't my intention @lean gull

lean gull
#

"small child"

tender shard
#

yeah as said, sorry, didn't mean to be rude, I just got pissed because you ask for help and then don't take our advice

lean gull
#

anyways i actually have motivation to work on my plugin so cya

tender shard
#

so I wonder why do we even try to help and waste our time if you don't listen anyway

#

can you understand that, at least a bit?

quaint mantle
#

Rainbow flag is god

#

Listen to him

lean gull
#

i can understand that you got mad because i wasn't seeing things your way, but it's also kinda irrational to think that everyone would see everything in your way and if not you get mad

tender shard
#

I can understand, but as said: giving someone linkes to basic java tutorials is not rude

quaint mantle
#

?1.18

undone axleBOT
tender shard
#

it's just a link with information

lean gull
#

i think the oppisite

quaint mantle
#

?1.16

#

?1.17

undone axleBOT
quaint mantle
#

?1.19

tender shard
#

can you stop that pls

lean gull
#

maybe i'm biased because of the past, idk

quaint mantle
lean gull
#

spams
"i was testing"

#

does something horrible
"i was testing"

quaint mantle
#

Literally being rude
โ€œI was testing.โ€

tender shard
#

noone here meant to be rude. It's just that when we see beginner mistakes, we think that people didn't understand some basic java concepts, so we want to show people on how to do it better. And that's what this command is for

tender shard
#

lol

#

well but anyway. you should check at least one of those links out

#

they ARE helpful

buoyant viper
buoyant viper
#

even i still go on javadoc for stuff that i should know by now well after 6 years

lean gull
#

i didn't learn all the basics and i'm doing completly fine with trying and getting help from nice people here

tender shard
#

whoops sorry wrong chat

buoyant viper
#

?learnjava

undone axleBOT
buoyant viper
#

jk

lean gull
#

i was about to say "don't-"

buoyant viper
#

heh

tender shard
buoyant viper
#

its my favorite sticker

#

bc i love smug shit

tender shard
#

i dont even know what smug means lol

lean gull
#

weewooweewoo mods they swore BAN EM

tender shard
#

everyone's swearing here

buoyant viper
tender shard
#

aah just looked it up

#

in german, we call it SELBSTGEFร„LLIG!!!!!!!!!!111111111one

ivory sleet
#

Yeah self satisfied Ig

#

lol

buoyant viper
#

you've provably heard it in the term like

#

smug grin

#

oh

#

nvm

ivory sleet
#

Smirk

buoyant viper
#

german native lang

ivory sleet
tender shard
#

german has the best words

buoyant viper
buoyant viper
tender shard
#

Abseilen, Kindergarten, Rindfleischetikettierungsรผberwachungsaufgabenรผbertragungsgesetz

#

that's the only 3 german words you will ever need to know

buoyant viper
#

isnt that last one a law

tender shard
#

yes

buoyant viper
#

yeah

tender shard
#

it's about how beef products must be labelled

lean gull
quaint mantle
#

Stardenburdenhardenbart

#

Is that right?

tender shard
tender shard
lean gull
#

i don't think u even read it when i sent it

tender shard
#

bart (last part) = beard

#

the one before that makes no sense at all

quaint mantle
#

No i saw it in some video about cats

#

Like calling cats with that name or something

buoyant viper
#

der Kek

tender shard
#

it's bullshit, the word is made up

#

๐Ÿ˜„

tender shard
buoyant viper
#

today on god i hope i said cookie and not something else

tender shard
#

but I read it now and all I see is that you're asking for help without actually explaining what's your problem

#

you ask on "how to make this" without specifying what "this" is

lean gull
#

no i did

#

look at the video 2 messages below that message

#

i even said it in the reply

tender shard
#

ah didnt see the video because it had no preview

ivory sleet
#

iDerpy in short you need to know the spots/places which are able to randomly generate a structure selected from a pool of said structures.

lean gull
#

huh

tender shard
#

yeah but what do you actually mean with "this"? making the GUI? Creating the structures? ...

ivory sleet
#

Then pick a random structure from your pool of structures, and generate it where ever you desire.

tender shard
#

btw

#

does spigot meanwhile have an API for structure blocks?

#

probably not

lean gull
#

basically i want to make like a grid, and in that grid you can spawn randomly selected dungeon rooms

quaint mantle
#

Wait what is the best way of getting the main class? I canโ€™t just make every constructor of my plugin has every other class just to use the function ngl

tender shard
ivory sleet
#

Just donโ€™t make every other class depend on your main plugin instance

lunar schooner
#

Hey folks, working on porting my NMS work to 1.18, I'm looking for the new name of isDebugWorld() and isFlatWorld() defined in net.minecraft.world.level.World and WorldServer, what are the new names for these? I cannot find the World class on Mini's mappings viewer to try and find it myself ๐Ÿ˜…

quaint mantle
ivory sleet
#

Use design patterns and other methods to avoid class hierarchy abuse or whatever weโ€™d call that

quaint mantle
#

Like why every of them need to contains the main classโ€ฆ

ivory sleet
quaint mantle
tender shard
#

I basically do it this like this most of the time:

public final class MyPlugin extends JavaPlugin {
  @Getter private static MyPlugin instance;
  {
    instance = this;
  }

or, without lombok:

public final class MyPlugin extends JavaPlugin {
  private static MyPlugin instance;
  public static MyPlugin getInstance() { return instance; }
  {
    instance = this;
  }
#

now you can always access your main instancve using MyPlugin.getInstance()

ivory sleet
tender shard
#

and YES, it's true that this violates some OOP principles, but tbh I would not worry over that

quaint mantle
ivory sleet
#

Iโ€™d mainly be concerned if weโ€™re unit testing with mfnalexโ€™s code

#

Which probably isnโ€™t the case

grim ice
#

omfg

#

im very stupid

tender shard
#

but I'd love to do so

#

I didnt study CS or something similar

ivory sleet
#

Yeah just donโ€™t do them too much lol

lean gull
#

i need the main class instance for a lot of stuff tho

ivory sleet
#

Such as?

grim ice
#

i had real time protection while gradle building

lean gull
#

1 sec

grim ice
#

and i was blaming my pc for being slow on building

ivory sleet
#

Lol

tender shard
grim ice
#

good thing internet exists

#

holy shit.

tender shard
#

tbh I even agree that dependency injection is better but I hate it

grim ice
#

DI looks cleaner imo

ivory sleet
#

Yeah at least youโ€™re depending on the type and not an instance

tender shard
lean gull
#

persistent data containers, using a class other than main but with the same instance, and more idk

tender shard
#

I have to change the constructor for EVERY single class that needs the instance

grim ice
#

it takes literally 20 seconds if ur slow

quaint mantle
#

Every class iโ€™ve made until 2 months ago has this

Main class {
@override
public void onEnable() {
Classhere here = new ClassHere(this);
OtherClass classhere = new OtherClass(this, here);
}
}
Like why?

grim ice
#

for me it takes like 10 seconds

#

how is it that hard

tender shard
#

not if your plugin consists of 100+ classes

tender shard
#

I hate Guice

grim ice
#

just do it whenever u create a class

ivory sleet
#

Yeah a bit problematic with namespacedkeys, bukkitrunnables/BukkitScheduler, registration of certain things maybe iDerpy but you can create middle classes for it and then pass those

tender shard
grim ice
#

but if ur that lazy ig do ur thing

ivory sleet
#

I also hate guice altho itโ€™s necessary sometimes

grim ice
#

dunno how u can be that lazy

tender shard
#

I tried to use it many times

quaint mantle
#

Guice saves you from statically typed constructors

tender shard
#

but I feel like it creates a new instance everytime

grim ice
#

pay me 1$ and ill spend my time doing it for you :)

quaint mantle
tender shard
lean gull
grim ice
#

KEK

ivory sleet
#

Let me write an example

tender shard
#

I'll be back in a few minutes, gotta call a doctor for my bf

quaint mantle
#

Fuck namespaced keys

#

I want them as constants so much

tender shard
quaint mantle
#

It requires a plugin

tender shard
buoyant viper
#

lombok :(

tender shard
#

lombok is not bad

eternal night
#

this in a static

#

the good stuff

quaint mantle
#

You cant use this keyword in static context

tender shard
tender shard
#

lemme check how I'm actually doing it

lean gull
#

so can anyone help me with the dungeon rng thing?

eternal night
#

You can parse them now without a plugin

quaint mantle
eternal night
#

doubt it

#

the method is not deprecated

#

publically available

tender shard
#
    @Getter private final NamespacedKey keyCraftingRecipe = new NamespacedKey(this,"craftingrecipe");
    @Getter private final NamespacedKey keyIsWarpBook = new NamespacedKey(this, "iswarpbook");
    @Getter private final NamespacedKey keyGuiFunction = new NamespacedKey(this, "guifunction");
    @Getter private final NamespacedKey keyOwner = new NamespacedKey(this, "owner");
    @Getter private final NamespacedKey keyWarp = new NamespacedKey(this,"warp");
quaint mantle
#

Ikr

paper viper
#

namepsace will be minecraft default tho

quaint mantle
#

But still, thats for parsing, not for creating a brand new key

tender shard
#

there's a good reason why a NamespacedKey normally requires a plugin instance

eternal night
#

Yes so that peeps that don't understand the concept and importance of namespaces don't mess this up

#

but like eh

tender shard
#

I also wonder why that would ever be a problem. When you code a plugin, you always ahve an instance of your plugin

paper viper
#

you usually want to cache your namespaced keys

#

and make them static

#

or smthing

#

and you wont always have ur instance then

paper viper
#

the only other way is to use JavaPlugin.getPlugin

#

or singleton, but yea no i prefer the first

eternal night
#

I mean if you believe your DI to be "just pass my main class everywhere" then sure you have your plugin instance everywhere

tender shard
#

when making them static, the code becomes twice as long and I'm too lazy for that

quaint mantle
#

Specially naming conventions are pain in the ass

tender shard
#

why?

quaint mantle
#

I want X, Y, Z instead of xKey, zKey and yKey

tender shard
#

then just go for it, noone will stop you

#

however your vars should be lowerCamelCase

#

so x, y,z instead of X, Y, Z

quaint mantle
#

Conflicts

tender shard
#

conflicts with what?

quaint mantle
#

I already have local variables with those names

tender shard
#

then you can probably understand why people prefer "descriptive" names

eternal night
#

the this.x is too hard

quaint mantle
#

Wait so you guys often get the instance of other class through constructor, singleton or static getters?

#

confusing โ˜น๏ธ

tender shard
#

I mean of course I also use x, y, z as variables sometimes, but tbh only in for loops where I'm running over some coords

paper viper
#

unless you are talking about making your plugin instance public static

#

and not using even a getter

#

๐Ÿคก

quaint mantle
tender shard
ivory sleet
#
class ConclurePlugin extends JavaPlugin {
  
  @Override public void onEnable() {
    this.getServer().getPluginManager().registerEvents(new EpigListener(this),this);
  }
}
class EpigListener implements Listener {
  final Plugin plugin;
  EpigListener(Plugin plugin) {
    this.plugin = plugin;
  }

  @EventHandler
  void onChat(AsyncPlayerChatEvent event) {
    this.plugin.getServer().getScheduler().runTask(this.plugin, () -> {
      event.getPlayer().getWorld().spawnEntity(EntityType.LLAMA);
    });
  }
}```
^ average spigot dev 

```java
class DerpyPlugin extends JavaPlugin {
  @Override public void onEnable(){
    DerpyScheduler scheduler = new DerpyScheduler(this);
    this.getServer().getPluginManager(new LigindaryListener(scheduler),this);
  }
}
class DerpyScheduler {
  final Plugin plugin;
  DerpyScheduler(Plugin plugin) {
    this.plugin = plugin;
  }

  BukkitTask runTask(Runnable r) {
    return this.plugin.getServer().getScheduler().runTask(this.plugin,r);
  }
}
class LigindaryListener implements Listener {
  final DerpyScheduler scheduler;
  LigindaryListener(DerpyScheduler scheduler) {
    this.scheduler = scheduler;
  }

  @EventHandler void onChat(AsyncPlayerChatEvent e) {
    this.scheduler.runTask(() -> {
      e.getPlayer().getWorld().spawnEntity(EntityType.LLAMA);
    });
  }
}```
^ average code architect 


Okay derpy so yeah the latter is somewhat more engineered in the way that its reusable, in reality adding a high level layer of interfaces would be ideal.
#

Also yes wrote it on phone

tender shard
quaint mantle
#

This starts sucking at cross platform projects

paper viper
#

I prefer to assign my variable in the constructor so i can just refer it as plugin rather then keep calling getInstance(). Even if you could assign your plugin value in the constructor the first place, I feel like its wasted

#

And it is really not scalable tbh

quaint mantle
#

Yeah i guess im gonna stuck to ?di

tender shard
young knoll
#

I mean they are

#

Spigot runs on Mac and Linux

tender shard
paper viper
#

thats fucking gross

tender shard
#

that's your opinion