#development
1 messages · Page 34 of 1
the method (from PlaceholderExpansion) called getDefaults()
is always called? or only when its the first time running the expansion
real question is, what if i want to add default config but i dont want it to keep adding it again
if the owner deleted some options
#general-plugins or #1007620980627230730
don't crosspost
posted there, apologies!
👍 if u want i can delete my message so its as if nothing happened 🪄
its okay dw, im more concerned about getting this plugin to work lol
maybe you should add a option to open guis as admin
so you can take items from the gui
why
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
I've tried everything I can think of at this point lol
Yeah so that’s a no lol
You can also read the past conversations for what I have tried as well as the advice I have bee given.
You’re not writing the response string length
Does that have to be added to the packet length or included? (Its included already using buffer.limit())
everything is included in the packet length
Ok so yeah its already set.
No it’s not
in sendPacket I add the buffer limit
that is not the same thing
length of the packet data != length of the string
you need both
So would I add to the buffer limit? buffer.put(0, buffer.limit()+response.length)?
no what
that's really unsustainable and that's a completely different thing
whenever you write a String, you write its length first
Ok, let me go test something
this is a rough sketch of what the data should look like, note the string length being written twice
whereas this would be like this, which im sure you can see is completely different
you major in computer science?
don’t really have majors here but yes
Having issues trying to create a byte array for the int rather then writing directly to stream
?
Nothing just on my part lol
private void handleMOTDRequest(DataInputStream in, DataOutputStream out, int packetSize, int packetId) {
Output.debug("Handling Packet:HANDSHAKE");
try {
int status = 0;
byte[] packet = new byte[packetSize];
in.readFully(packet);
status = packet[packet.length-1];
Output.debug("Handshake [status:"+status+"]");
int responseId = UninitializedConnectionTypes.ClientBound.STATUS_RESPONSE.getId();
byte[] responseBytes = response.getBytes(StandardCharsets.UTF_16);
ByteBuffer buffer = ByteBuffer.allocate(9999);
buffer.putInt(responseId);
buffer.put(varMethods.createVarInt(responseBytes.length));
buffer.put(responseBytes);
Output.debug("Sending Packet:STATUS_RESPONSE [id:"+responseId+",status:"+status+"]");
readBytes(responseBytes);
sendPacket(out, buffer);
} catch(IOException e) {
e.printStackTrace();
}
}
public byte[] createVarInt(int paramInt) {
List<Byte> buffer = new ArrayList<>();
boolean loop = true;
while (loop) {
if ((paramInt & 0xFFFFFF80) == 0) {
buffer.add((byte)paramInt);
loop = false;
}else {
buffer.add((byte)(paramInt & 0x7F | 0x80));
paramInt >>>= 7;
}
}
byte[] output = new byte[buffer.size()];
for(int i = 0; i < buffer.size(); i++)
output[i] = buffer.get(i);
return output;
}
```Same output (failed packet basically) Tried mimicking the var method without outputting.
are you sure 0xFFFFFF80 is the right number?
idk shouldnt the leftmost 1 be 0 in the first 8 bits?
cuz basically you are trying to fit 8 bits of integer in 1 byte right?
but tbh you probably wont need this varint method in the first place?
cuz the bits of the length should be of constant length, or else it will be imposssible to know the length?
like the length can be 1 byte two bytes or even 4 bytes
but its supposed to be 4 bytes fixed
just uneducated guess if you deem its wrong ignore
Why are you doing varints like that
one way to learn cpp socket programming in java for me lmao
i think the fix is just to dump the whole 4 bytes responseBytes.length into the byte buffer and ditch the createvarint method
🤨
usually for packet length, the field should be a constant uint_32 or whatever thing that have fixed length, not a number type with variable length that can be 1 byte, 2 bytes, 3 bytes or 4 bytes
Does that make sense?
that is not true in this case
varint exists too
yeah well i guess i dont know much about minecraft packets
i assume its higher level packet setting to have a variable packet length field?
i mean just look at the packet structure
it's not particularly high level
lol
Can't reply to 2 messages lol
WanderingPalace — Today at 10:07 AM
are you sure 0xFFFFFF80 is the right number?
Brister Mitten — Today at 10:16 AM
Why are you doing varints like that
Method was taken from https://wiki.vg/protocol and just made it so I can use the byte[] instead of writing it directly to output
the one there looks very different to the one you've written lol
Sent the message to early reread lol
I would say that after 15 hours, it might be quicker to test it yourself by putting a System.out.println
15-hours-to-test-a-placeholder slow?
or read the source code 😉
I feel like my issue is the packet size now... Like maybe I'm not writing the right size
Could still be completely wrong though xD
int responseLength = response.getBytes(StandardCharsets.UTF_16BE).length;
int statusSize = (responseLength+varMethods.createVarInt(responseLength).length);
Output.debug("StatusSize: "+statusSize);
varMethods.writeVarInt(out, statusSize);
varMethods.writeVarInt(out, 0);
varMethods.writeString(out, response, StandardCharsets.UTF_16BE);
```Even tried this (and variations of) and still getting the 1.6 ping packet as a response...
size includes the packet id so yes
yeah tried +1 as well. Also down to and up to -10 and +10 (from statusSize)
as well as int statusSize = (responseLength+varMethods.createVarInt(responseLength).length+varMethods.createVarInt(0).length);
Just for the hell of it lol
- Don't advertise anywhere unless the channel states otherwise.
probably
if you're doing it in a plugin
yes
but if you're talking about deluxemenus then #general-plugins and maybe

Any ideas?
I would probably compare your code with the examples on wiki.vg and see if anything sticks out.
I have, also multiple users have given suggestions over multiple days and still can not get it to work.
print the raw output of what you're sending and show me. also why utf-16? it clearly says on the wiki that strings are utf-8
Tried all the standard charsets. Can't debug right now won't be at my PC for a few hours.
Which part do you want an output for?
Ideally all of it
Holy shit!!!!
whatever you’re sending
I fucking got it
What did you change?
UTF back to 8 and added +1 again to size
private void handleMOTDRequest(DataInputStream in, DataOutputStream out) {
try {
int responseLength = response.getBytes(StandardCharsets.UTF_8).length;
int statusSize = (responseLength+varMethods.createVarInt(responseLength).length);
varMethods.writeVarInt(out, statusSize+1);
varMethods.writeVarInt(out, 0x00);
varMethods.writeString(out, response, StandardCharsets.UTF_8);
} catch(IOException e) {
e.printStackTrace();
}
}
Literally been working on this for over a week FML
i was gonna mention that but i assumed you'd changed it to this
That was one reason towards the end yeah
anyway that approach is not particularly good
you dont wanna be calculating the length manually if you can help it
Yeah I was using bytebuffer but wanted to manually do it for debugging
refactor it out, make that method just write the packet id, string length and string, then make a separate thing to write the length (and if you ever get that far, compression)
Just wanted to get this packet down the rest should come naturally now. Damn this took way to long
indeed
So just making sure, do you have to add the size before any object other than string?
it'll say on the wiki for the corresponding data types, but off the top of my head it's just that and arrays
usually depends on context though
just look it up ad-hoc
Make sure it's 64x64 or it won't render
Yeah must have been the image I used. Another one worked.
I have this class: https://paste.helpch.at/awurixahoz.typescript. And I am having issues importing it. It worked like 5 minutes ago, but IntelliJ just started freaking out and now no classes can access that class. I checked the imports, and they are correct. I rebuilt gradle and restarted IntelliJ multiple times. Any ideas?
It is there through Explorer, so I know it is a physical file.
is the package correct?
also what happens if you go into that file in IJ?
It is there through Explorer, so I know it is a physical file.
it is perfectly fine
IntelliJ treats it like normal
until I go into another class
yes, it is correct
close intellij and nuke .idea
I deleted the file and added it back, and now it works. seems like a cache bug or smthing
I am using the beta version, so I guess I cant complain
last time I tried it none of it worked lol
I want to change CONTENT of the chests that are generated naturally (Temple chests, Village chests etc)
I'm thinking about what is the best way to do it but I don't have a better idea then listening new chunk create event then looping over all the blocks in it and checking is block a chest (it doesnt sound too optimised lol) is there any better way than this?
loot tables?
Have never heard of it
Thanks!
👍
It looks like I have to create a data pack instead of a plugin right?
i havent dealt with loot tables much so im not positive but there's a very good chance you can also manipulate them with plugins
this seems pretty helpful https://www.spigotmc.org/threads/insert-loot-into-chest-from-custom-loot-table.435965/
This was very helpful thanks
you are very welcome
Anyone know how to cancel knockback for when a player hits a nonplayer entitiy with PrococolLib 3.7.0 for Bukkit 1.7.10?
I tried listening for and cancelling the PacketType.Play.Server.ENTITY_VELOCITY packet, but that only seems to cancel knockback for when a player hits another player
@EventHandler
public void entityDamageByEntityEvent(EntityDamageByEntityEvent event) {
//do the damage to entity
event.setCancelled(true);
}```
just manually do the damage and then cancel the event
What would be the best way to override a default crafting recipe? I know that I can loop through the iterator and make my own, but I saw somewhere that there are hidden recipes that then get ignored. I saw that you can do it through NMS, but the examples were out of date and I couldnt find the modern versions. What is the best way to replace the default crafting recipes?
Hello there ,
I linked ProtocolLibAPI to my project and I'm trying to spawn a armorstand and it's not spawning in the world, my code:
public void spawnEntity(Entity entity, Location location) {
PacketContainer packet = this.getProtocolManager().createPacket(PacketType.Play.Server.SPAWN_ENTITY);
packet.getIntegers().write(1, 1);
packet.getDoubles().write(0, location.getX());
packet.getDoubles().write(1, location.getY());
packet.getDoubles().write(2, location.getZ());
packet.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND);
this.getProtocolManager().broadcastServerPacket(packet);
}
public void despawnEntity(Entity entity) {
PacketContainer packet = this.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_DESTROY);
packet.getIntegers().write(0, entity.getEntityId());
this.getProtocolManager().broadcastServerPacket(packet);
}
about the entity I provide to spawnEntity they are entities I spawn to the world and right before the spawnEntity i remove them from the world.
What am I missing? (it's the first time using ProtocolLib)
maybe https://www.spigotmc.org/threads/spawning-client-side-entities-with-protocollib.552259/ would be helpful
i would assume that your missing the entity's id and UUID
I followed the thread and still not spawning 😦
Does any of you know of a plugin that gives you the ability to add collectibles to your server?
A plugin where people can collect certain limited edition items.
I'm getting passed around like a hot potato around here
#hot-potato
Are there any libs for using HOCON in Java with POJOs?
I also have heard that
Jackson has a pojo lib, and I think Configurate does this as well
HOCON this duck
is
@EventHandler
public void onBlockInteract(CancellableEvent e) {
if (e.isCancelled()) {
return;
}
...
is (basically) the same as
@EventHandler(ignoreCancelled = true)
public void onBlockInteract(CancellableEvent e) {
...
}
?
yes
sometimes I'm confused how some people are allowed to code
if you do java @EventHandler(ignoreCancelled = false) public void onEvent(CancellableEvent e) { } its the exact same as ```java
@EventHandler
public void onEvent(CancellableEvent e) {
}
crazy that right
or functionally the same
(i meant it's not crazy)
oh
ha
thats like 6 more steps than it requires
mind blown ngl
I am trying to add lore to default vanilla recipes. ```java
List<Recipe> recipes = new ArrayList<>();
for (Iterator<Recipe> it = Bukkit.recipeIterator(); it.hasNext(); ) {
Recipe recipe = it.next();
if (recipe.getResult().getItemMeta() == null) {
System.out.println("Skipped recipe");
continue;
}
ItemStack item = new ItemConstructor(recipe.getResult())
.setLore("", ChatColor.translateAlternateColorCodes('&', "§8§lCOMMON"));
if (recipe instanceof ShapedRecipe shapedRecipe) {
Bukkit.removeRecipe(shapedRecipe.getKey());
NamespacedKey key = new NamespacedKey(TaleOfKingdoms.getInstance(), shapedRecipe.getKey().getKey());
ShapedRecipe newRecipe = new ShapedRecipe(key, item);
newRecipe.shape(shapedRecipe.getShape());
shapedRecipe.getIngredientMap().forEach((character, itemStack) -> {
if (itemStack != null) {
newRecipe.setIngredient(character, itemStack.getType());
}
});
recipes.add(shapedRecipe);
}
if (recipe instanceof ShapelessRecipe shapelessRecipe) {
Bukkit.removeRecipe(shapelessRecipe.getKey());
NamespacedKey key = new NamespacedKey(TaleOfKingdoms.getInstance(), shapelessRecipe.getKey().getKey());
ShapelessRecipe newRecipe = new ShapelessRecipe(key, item);
shapelessRecipe.getIngredientList().forEach(itemStack -> newRecipe.addIngredient(itemStack.getType()));
recipes.add(shapelessRecipe);
}
}
for (Recipe recipe : recipes) {
Bukkit.addRecipe(recipe);
}
Pretty sure shaped recipes require a char for air (null) as well...
And debug it, see where the code doesn't function.
Thanks discord... Don't reply when I want you to 🤦
offline players arent null
yeah intellij is drunk
it tells you that the condition is always false because Bukkit#getOfflinePlayer is marked as @Notnull
well, you dont ovverride the recipes, but add new ones with your own namespace
you should use the namespace of the original recipe
oh
Help please
I used the original namespace and nothing changed.
anyone knows a reliable dependency manager at runtime api or wtv?
so I don't have to shade 10 different libs
something like pdm by brister
slimjar
or if you're using 1.16+
then spigot itself
although I dont understand why you wouldnt want shading
Spigot has a size limit for premium plugins, 4.5mb or something
All plugins have that limit, but free plugins can link to an external download while premium can't
premium cant? damn
havent some plugins said they are free, but then link to their own website where you pay for it?
Not allowed either. A few have been banned for it.
Anybody have experience automating / outsourcing parts of a project to a remote desktop? Wondering how I can "send" and "return" JSON data with a Remote Desktop
spigot also injects their DRM into your plugin without a way to turn it off
yes
Which one is the most low-maintenance easiest solution to implement? The script on my computer is in Python and the script on the remote desktop one is also python
And all I need is the ability to "send" a string (JSON) and "return" a string (also JSON), no added complexity like transferring files or anything like that
It really depends on your technical ability, SSH requires like, setting up SSH and opening port 22 (or another one), setting up a certificate, etc. Meanwhile you can spin up a python web server super easily and have it respond to stuff, but you kind of have to know how to program and have experience running services like that
Well the only context I've ever used SSH is for connecting to remote machines or transferring files (SCP)
What protocol would I use to somehow convert SSH into "send" and "receive" type relationship?
I mean you can just send JSON or something and put it on a file, I suppose if you're more interested in the request/response relationship a web server would probably be your best bet as they are primarily designed for that
then you'd just use HTTP and stuff, super easy
yeah if you just need something quick, flask is a great choice
here is the updated version:
I want to add a section of lore to every crafting recipe, and using tutorials I found online, this was the best supposed method. It doesnt work as intended, and nothing changes on the crafting result. ```java
List<Recipe> recipes = new ArrayList<>();
for (Iterator<Recipe> it = Bukkit.recipeIterator(); it.hasNext(); ) {
Recipe recipe = it.next();
if (recipe.getResult().getItemMeta() == null) {
System.out.println("Skipped recipe");
continue;
}
ItemStack item = new ItemConstructor(recipe.getResult())
.setLore("", ChatColor.translateAlternateColorCodes('&', "§8§lCOMMON"));
if (recipe instanceof ShapedRecipe shapedRecipe) {
Bukkit.removeRecipe(shapedRecipe.getKey());
ShapedRecipe newRecipe = new ShapedRecipe(shapedRecipe.getKey(), item);
newRecipe.shape(shapedRecipe.getShape());
shapedRecipe.getIngredientMap().forEach((character, itemStack) -> {
if (itemStack != null) {
newRecipe.setIngredient(character, itemStack.getType());
}
});
recipes.add(shapedRecipe);
}
if (recipe instanceof ShapelessRecipe shapelessRecipe) {
Bukkit.removeRecipe(shapelessRecipe.getKey());
ShapelessRecipe newRecipe = new ShapelessRecipe(shapelessRecipe.getKey(), item);
shapelessRecipe.getIngredientList().forEach(itemStack -> newRecipe.addIngredient(itemStack.getType()));
recipes.add(shapelessRecipe);
}
}
for (Recipe recipe : recipes) {
Bukkit.addRecipe(recipe);
}
you could have a system where you have to verify in a discord server to get access to a channel to download the resource from
but it can be easily leaked if someone just copies the file link and sends it to whoever and they will be able to download it aswell
Not allowed on Spigot
works like that for spigot too
you have to make your own anti-piracy system
if (OorlogSimulatie.instance.getSettingItems().normalSwordBoolean){
OorlogSimulatie.instance.getSettingItems().normalSwordBoolean = false;
}else{
OorlogSimulatie.instance.getSettingItems().normalSwordBoolean = true;
}```
```java
OorlogSimulatie.instance.getSettingItems().normalSwordBoolean = !OorlogSimulatie.instance.getSettingItems().normalSwordBoolean;```
Is this a good way to simplify this?
seems fine
oke, thanks
ignoring the static abuse
🤷♂️
Its not open, just private
Why not use it then yk if its making some things so much easier
a lot of people would disagree with the premise that it makes things easier
mostly because you generally want to keep the best practice throughout all your projects to make maintaining the projects way easier long term
you make a plugin that has generally bad practice all throughout
someone else [may] have to work on the plugin, they load it up
yeah oke, but thats not the case with this project
normally indeed i don't want to use static abuse or anything
but regardless its still makes a project harder to maintain
the more you implement static abuse, the harder it gets to work worth the worse it is to maintain
Such as me
it may be easier in the short term but it will absolutely make your life harder in the future
you could write all your code in a single class but you end up with very rigid inflexible code
Same principle
does anyone have experience with paypal webhooks? I cant get them to work on sandbox (I don't receive any payload), and they dont even show on the dashboard https://developer.paypal.com/dashboard/webhooks/sandbox
how do I make sure that the storage field map key/value types are the ones that I define?
How do I make it so when I have to specify an api version that it works on multiple server versions instead of just the api I specify?
I call super with <String, String>, but IDE doesn't understand
api-version: 1.13
that the storage field has that type of key/value
specifying 1.13 means 1.13+?
yes
however
i'm not sure about those brand new master daster features
of the new versions (if any)
but about materials
api-version: 1.13
doesnt affect 1.8 - 1.12
and still allows you to use new materials
without LEGACY_NAME
including that thing called block data
or something like that
wonder what are you doing
xd
all my plugins are 1.8.8 - 1.19.3
and never had any issue with api-version
however people say "its not good"
or something
but, 1.8 doesnt care
class SerializableMapStorage<K, V>
protected Map<K, V> storage;
class ResidenceVoteHandler extends SerializableMapStorage<String, String>
// Map is now Map<String, String>
oh, ok, thanks, totally forgot about this approach
api-version: 1.14
means minimum required version is 1.14
so should work too
however api-version: 1.13
allows you to use everything (afaik)
including ofc +1.14 exclusive features such custom model data
but if your plugin is +1.14 only, then api-version: 1.14 is fine
including?
if you set 1.13?
wie joine ich servern mit geyser per ip die auf meinem pc gehostet sind ich nutze port freigabe?
how do i join servers with geyser via ip that are hosted on my pc i use port sharing?
the api version
means that version AND above
never below
thats why you see in spigot those reviews
"Not working in 1.14 ⭐ "
because the developer forgot to set api-version to 1.14
how do i join servers with geyser via ip that are hosted on my pc i use port sharing?
wanna know how?
idk if its correct or not what i'll tell you tho
yes
its working thanks
is that chatgpt 💀
yes

Does anyone know if it’s possible to manipulate end crystal beams in 1.8?
EnderCrystal#setBeamTarget()
according to the javadocs its not in the api, but could be done through nms i think
right, according to what i found, you can only set the location of the beams with 1.9
from what i gathered i dont believe its possible to change the position it points without modifying the server jar directly
Yeah its not in the APi
Trying to figure out what packet to send
Ah
Maybe I send fake dragon entity?
maybe look into the code relating to the end crystal and seeing what mojang does
Yeah I guess that's what I'll have to do
probably the best option
Hey, so I made special items, but they appear to be very dark in the inventory, Not exactly sure what to do, I angled them so maybe the light source does not hit them correctly, but I want to disabled like the shading on them
They do, but collections are weird in java
so what should i do?
i can change what is required btw, i have it as Collection<Object> cause i wanna allow any type of collection to be used and any type of object
i think its like ? extends Object
or smth
oh wait
yeah ig you have to just to map all the values to the new collection
like addAll
it also says this: https://media.venox.network/KXYS4Jk0BQ.png
i mean like what code
it fixes it but it just seems so pointless
¯_(ツ)_/¯
when returning
public Collection<Object> onTabComplete(@NotNull AnnoyingSender sender) {
return TeamManager.getTeamIds(); // <-- this
}
TeamManager#getTeamIds returns a Set<String>
mhm
public Collection<Object> onTabComplete(@NotNull AnnoyingSender sender) {
return Collections.singleton(TeamManager.getTeamIds()); // <-- this
}
IJ tells me to adapt to that, which works, but again, seems super pointless
I'd recommend returning a Collection<String>
¯_(ツ)_/¯
if that doesn't work u can make a new list and add all of them in a loop
what about Collection<?>
does Collection<? extends Object> work
IJ tells me to remove the extends Object part
I'm not sure how looping through ? works
iirc it should be a List<String> lol
this means that ? by itself already extends object?
this is a custom tab completer
yea
I recommended that but they need Object for some reason
so I just left it like that
regardless, I don't see what other objects you'd allow besides Strings
you have to put them in a Component at some point lol
just easier, if i have a list of integers or something i dont have to convert the list to strings. obv not just integers, practically any object
so you just call toString() on whatever?
String#valueOf to prevent NPE
that sounds like a recipe for disaster lol
gonna get a lot of hashcodes
I would just keep it explicit, the whole point of a type system is that you limit what types things can be
and I feel like rarely do you want to return an entire object/that object's toString, you want to return a field of it or a name or something
its mainly just for things that ik will return a pretty string
so just call it explicitly
return things.stream().map(Item::toString).collect(Collectors.toList());```
Or make a class like
interface Tabbable {
String getAsTabCompletion();
}
but I mean then you're just moving the conversion from a method in the command to a method in the object
which I guess could be a good idea if you're using a lot of the same objects across various commands?
More for this than anything else
ye ill probs just stick to Collection<String> (which is what i had before using Object anyways) to keep things simple
I would stick to List<String> to have a guaranteed order
idc about tab complete order, and a ton (90%) of my methods return sets
i mean what if you do though lol
you'd at least want consistent order
might need alphabetical, might want to sort based on popularity or some other metric, etc.
at some point you're going to have to convert that into a List anyways
return suggestions.stream()
.filter(string -> string.toLowerCase().startsWith(args[args.length - 1].toLowerCase()))
.collect(Collectors.toList());```
once again you might as well let the producer decide what that order should be
couldnt i still return a List<String> since List extends Collection?
you could
but you could also return an unordered set
or an unordered tree
or an unordered hashmap
wait hashmap extends Collection?
it is indeed a collection lol
are you sure
ye but i mean the Collections class itself
or interface
I don't know what it is
oh it's an interface
The collection interfaces are divided into two groups. The most basic interface, java.util.Collection, has the following descendants:
java.util.Set
java.util.SortedSet
java.util.NavigableSet
java.util.Queue
java.util.concurrent.BlockingQueue
java.util.concurrent.TransferQueue
java.util.Deque
java.util.concurrent.BlockingDeque
The other collection interfaces are based on java.util.Map and are not true collections. However, these interfaces contain collection-view operations, which enable them to be manipulated as collections. Map has the following offspring:
java.util.SortedMap
java.util.NavigableMap
java.util.concurrent.ConcurrentMap
java.util.concurrent.ConcurrentNavigableMap```
all right I'll concede that it doesn't work for that exact case
but the point still stands that you can pass a lot of non ordered things into it when it should be ordered
also I just found out that java has a Dictionary class
by reading the 2nd line of the Map javadoc
lol
Hello
My plugin's placeholders stop working after /papi reload
How can I solve this bug?
My code: https://github.com/iBuseWinner/Reputation/blob/master/src/main/java/ru/fennec/free/reputation/handlers/messages/PlaceholderHook.java
you're missing this: java @Override public boolean persist() { return true; // This is required or else PlaceholderAPI will unregister the Expansion on reload }
Oki, thank you!
Why is that not true by default? I feel like that'd be more common than the other way around
honestly not sure, backwards compatibility reasons I'm guessing?
don't worry - this'll all be fixed in PAPI 3.0 - coming 2030 😌
Soon ™️?
What method should I use to store ItemStacks in blocks
like furnace and brewing stand does
Is it possible to disable block outlines/prevent players targeting specific blocks?
Similar idea like in adventure mode.
With resource packs yes, without it, probably not
Barrier blocks don't show unless in creative (the outline) unless holding as well.
Only doesn't in adventure mode
Well you could code a plugin that checks the block you're looking at and switches your gamemode from survival/adventure
lol
Why would that make it unplayable?
players fighting in the arena, suddenly get switched to adventure mode
back n forth
I look at a barrier block, oh no I am not invinsible
I'm not seeing the issue lol. Adventure mode just stops you from using tools other then whats needed to mine blocks right?
well you can still pvp in adventure mode, but its kind of a janky fix. plus players that lagged would randomly not be able to break/place things until they un-lag
I'm not sure. Might mess with other plugin functionalities
if they only check survival/creative modes.
i think the idea is to hide barrier blocks, which would still show a split second of the outline if this solution is used anyways
True but if they check survival IDK why adventure wouldn't be checked.
It's vey unstable
Well... If you don't mind the lag back from ghost blocks... (Running through and being tp'ed back) You can just send the player air blocks where the barrier blocks are.
What's so bad about the outline anyways?
immersion
.
Visibly shows a block. (Which point is specifically not to be seen lol)
oh i gues not
If you want immersion throw in a resource pack then ;p
i assumed your goal was to make like a hidden parkour jump or something. but if it's just meant to restrict players location than probably worldguard would work
yeah well, I am using WG, but it get's annoying making N different regions for all the restricted areas
if this was possible it would've been nice, but owell
you could also just make a polygonal region around where players are allowed to be
Basically does the "lag back" scenario though.
yes
Will tp you back to before you left the region
fun fact - vanilla doesn't care if you clip vertically upwards through blocks
then get better plugins lol
adventure has been in the game since 1.8
meaning that if you put someone in a bedrock cage, they can simply clip through upwards vertically
thanks mojang!
way to support poses
ah yes, the classic, 'just do X'
world is complete now
all problems solved
You can not store items in any blocks I think, but you can access the inventory of the said blocks by casting BlockState to the type of block
Huh? Wdym?
1.3.1 actually https://minecraft.fandom.com/wiki/Adventure
PlayerStatisticIncrementEvent
anyone have experience using this event?
it mentioned its not updated with high frequency
so how frequent exactly is it updated?
is it more like a combination of other events, such as health events and the others?
if it is similar to registering multiple listeners then im using it.
thx in advance!
public class PlayerStatisticIncrementEvent
extends PlayerEvent
implements Cancellable
Called when a player statistic is incremented.
This event is not called for some high frequency statistics, e.g. movement based statistics.
yes friend, I have checked the doc thx.
im just not sure if it behaves like normal listeners for specific events
or are there any other mechanisms
i need someone that has the experience of using it
anyone that can help me? its kinda urgent so pls
ping me if you have actual info, thx a lot in advance!
well the event isn't triggered for some statistics. but there isn't anything special about it
so it is triggered from normal actions such as damage taken right?
like not the player statistics in the scoreboard or sth?
@sterile hinge (sorry for the ping but really kinda urgent, just a quick answer tho)
https://jd.papermc.io/paper/1.19/org/bukkit/Statistic.html I can't tell you what's considered high frequency of this
ahh damn this looks sus enough
i just wanna know if this event is triggered once the player does the action
or its just a stupid updating task that grabs statistics once in a while
i am interpreting the former from your last message, but i need your confirmation
yeah this certainly looks like a minecraft statistics
sorry im stupid
but i guess its fast enough
alr thx for your info bro appreciate it
Alot of things that should be in events but are "to spammy" should be sent atleast as an async event so it can atleast be tracked.
so it 'can' at least be tracked you mean?
Yeah was editing as you sent that xD
Didn't read after I sent it
The game mode, not the library lol
trying to add papi support to my plugin but it is not parsing.
it recognizes it as a hook as it is listed in /papi list, but when I do /papi reload it only says 1 placeholder hook registered, that 1 being a different expansion we already have
Here is the class that I do this all in: https://pastebin.com/refaRCnv
and then I register it in the onEnable method in the javaplugin class:
placeholderManager = new PlaceholderManager(instance);
placeholderManager.register();
Any ideas?
at a loss here
(I added those log messages to see if it was even parsing, none of those show up in the log)
give an example of the placeholder you tried
“%goal_TestGoal_parent”
your missing the identifier
yeah
Ahh I see, ty
also im not sure if it matters if you have capital letters in your identifier
like the getIdentifier method
Using “MetaGoals_TestGoal_parent”, requested gets logged
though it doesn’t appear to get past the length check
Ah I see! Thank you for your help!
turns out they are kinda good
I want to protect my api from remote code execution (because one of the params it takes is a URL). Suppose I want the url to be accepted if it fits one of these websites: https://ytdl-org.github.io/youtube-dl/supportedsites.html
I could easily split the url with . and see if one of the elements is a valid domain (like youtube twitch), and check if the next element has the correct top-level domain (like .com, etc), but the thing is that I have no idea what the top-level domains for those specific websites are. The list only shows the domains but not the actual top-level domains, so someone could do an attack if they used youtube.net instead of the actual website youtube.com (this is obviously hypothetically speaking). Is there a better way to check url validity in this case?
well, create a list of legit domains
like a whitelist of domains
why split the domain name from the tld
oh wait i see, you don't have the tld
tbh that list seems pretty useless, like others have said just build up a list of approved domains as you go
anyone know if the voteparty api is available though maven?
even better, have a dropdown they can choose the domain and tld, then put in the code in the second slot
Jeez
That's a lot of websites
Cornhub, my fav place to watch yt videos on
hi
How to remove currency symbol for %vault_eco_balance_formatted% ($)
i got double $
Because u can develop servers
Not everyone knows that helpchat means plugin development
#software-dev
How to add external plugin api(.jar) with gradle?
maven local and install file
Does DeluxeMenus work in 1.19.3?
Spigot page includes 1.19 so probs
wdym? If there is an API it would be hard to believe it wouldnt work with Maven.
Just trying to figure out if it is available though a public maven repo. So I don't have to mess with trying to add it to my machines local repo.
On there spigot page it doesnt mention an API, and the source code is private. You can join the discord and ask for it, or you can add it to your local repo. It doesnt look like they have a public api.

this is the VoteParty discord?
Yes (Yes) [Idk]
I found a different plugin on Spigot called Vote Party
override fun onPlaceholderRequest(player: Player?, params: String): String? {
val rank = AlchemistAPI.findRank(player!!.uniqueId)
val profile = ProfileGameService.byId(player.uniqueId) ?: return ""
when (params) {
"rankDisplay" -> {
return rank.color + rank.displayName
}
"rankPrefix" -> {
return rank.prefix
}
"activeTag" -> {
return profile.getActivePrefix()?.prefix ?: ""
}
"rankWeight" -> {
return rank.weight.toString()
}
}
return ""
}
Doesn't replace anythng -> /papi bcparse Nopox %rankPrefix%
the format is %identifier_params%
it's whatever you return for getIdentifier()
ah
omg hi nopox
Is == equal to equalIgnoreCase()?
no
Oh is === the same as EqualIgnoreCase?
Oh nvm
It checks the type too
Didn't even know that
no lambda 
my brother in christ ```kt
when(params) {
"param" -> return "value"
}
player!! 
is player even nullable
@Nullable
public String onPlaceholderRequest(final Player player, @NotNull final String params) {
Hello, can someone tell me how to start a plugin with placeholdersapi?
yes it is i believe
very consistent usage of nullability annotations
I currently use ngrok for a http tunnel to my computer's IP so I can test some paypal webhook shit (because they require a domain and dont accept IPs). The problem that I have with ngrok is that the domain is different from a session to another and it is annoying to constantly update the address. Since I host my own domain, I was thinking to redirect all calls to gabytm.me/test/paypal to my-ip:port for example and I was curious if nginx has something for monitoring, to see details about requests (host, headers, method, body, etc.)?
could you not just like use Wireguard and reverse proxy from your nginx to your web server and see connection details there?
Im not sure what that means but I will do some research
How would this work, domain > wireguard > local-ip:port?
okay so
wireguard is a VPN that is awesome and requires very little setup and automatically reconnects when your ip changes and everything'
you'd use that to essentially put your server with nginx and your pc you want to receive things on on the same network
then, you can just use nginx reverse proxy to send them to like 10.0.0.1 or whatever you choose your wireguard ip to be, and bam your computer can listen on that channel and get all the webhooks
I ended up realizing that I could just check for &&, ;, or || because the only way they can execute commands is if they chained commands like that (my api directly uses the url in a process command)
And how would that help, Star?
that would help because it would automatically update whenever your IP changed
and you could still listen to those sweet, sweet webhooks
this feels like an injection bug still lmao, it's quite likely impossible to escape everything they could use
@dusty frost oh no, my ip is not changing that often, but the ngrok domain (they basically give you one like <code>-<ip>.ngrok.io), if I was to use my domain and regirect the traffic to my ip, I would like a monitoring tool, ngrok allow you to see all requests to your domain and your reponse
Yeah true, I'm not really sure if there is any good way to check for other possibilities
Hello, there's a way to tp the player instantly when touch nether_portal? Currently using the PlayerPortalEvent, but it fires when the player's about to tp, not when it touch. I'm trying to avoid PlayerMoveEvent!
i'm attempting to make a plugin that will past a specific shematic at x y z (it will paste one for each player). what is the best way to do this? is it easy to save and load .schem files or is there a way to access worldedit's .schem files?
You can (and arguably should) use the worldedit api.
See https://worldedit.enginehub.org/en/latest/api/ and https://worldedit.enginehub.org/en/latest/api/examples/clipboard/
thank you so much <3
np
Hi all, I see for quite a long time, PAPI has support for my plugin UltimateVotes, I wanted to expand the available placeholders but I could not find the repository in order to submit a PR to, is that repository no longer available or?
I don't believe there is a repo for it. It might be better to include the expansion in your plugin from this point on vs externally though
not sure if this is the place to ask, but im making a discord bot in jda;
im not sure how to go about storing data using mongodb that is per-server
should i create databases for each server or what? i tried googling a bit but found nothing useful
Just store the guild id in each document
ty
Like Sparky said I would make each document their own guild, and then just have a "id" field that contains the corresponding guild id.
double-sided copier
When multiple plugins write to actionbar, do they simply replace eachothers texts or do they get queued / appended?
replace
alright, thanky
np
np
Yeah this is what I’m doing, each database of different data will have 1 document per server
Wait what about user data? Do I do the same structure (except with user ids instead of guild ids)?
yeah, make a database for like users, and then each document is a user.
should i not create multiple databases like user_levels and user_inventory (just 2 random examples)?
user_levels probably wouldn't need a separate table/database
just a random example, could be anything
any data with a one to one relationship can be put into the same table (in general, not always the best idea tho)
any data that is not one to one probably deserves separate tables
one to one?
what would be an example of not 1-1?
let's say exp gains
maybe you have a table that tracks every single exp gain event
which includes the user who gained it, the amount gained, the source of the gain, and the time
one user can have many exp gain events related to them
so you can have one table for users and one for the exp gains
would each exp gain have its own document? or would each user have its own document? (in the exp gains table)
tbh i'm not too versed in the differences in structure between mongo and sql, i'm giving you this from an sql perspective
o
but i think each exp gain is a separate document in my example
and each user is also a document
hey there, should i create a "async task queue thing" for mysql
because calls are async obviously i am wondering if it can be a mess
but in mongodb it might be more correct to embed the exp gain events within the user than to relate them externally, idrk
wdym by task queue thing
yeah this is the part im not rly sure about
i'd say just make a guild-user document and put all user related stuff for that server in it
not sure if that's the best way mongodb can do it but i dont see any immediate issues with it
are you sure you need a queue at all? do you need the tasks to be executed in a specific order
i mean probably not, depends on your usecase though
like for example lets say i am creating a home and deleting after that
should create home first and then delete
maybe your later queries will depend on the actions of your prior ones and you can't reverse the order
but in a scenerio that idk if that can happen
delete action can switch with the create
actually it sounds pretty nice and feels safe
it just sounds safe
i actually don't know enough to tell you that what you are worried about (generally) won't ever be a problem
but you probably won't have the issues you are worried about
as long as you don't do silly stuff like try to delete before you create a home
are you using a thread pool manager to handle your sql connections
just out of curiosity
hikaricp
ok
if that is what you are asking about
yea
oh wait are you already experiencing the issues you were talking about
does that do this for me
it's very smart, idk for sure if it handles this but the docs on it will tell you more
no i didnt mean that
ok
just wondering if tasks order can corrupt somehow because of lagging
i am checking thanks for the idea
idk if it applies to this exact case but i know there's a way for you to bundle multiple sql statements together and ensure that they are treated as atomic
so that you are guaranteed both the order and that either all or none of them are executed
ah i found it, it's called a transaction
that would fix the problem mostly
yeah again not sure if transactions are exactly what you want but they offer a lot of protection for various situations
tbh if you're really worried about this you can always execute the query on the main thread/sync (obv not wait for it the whole time but just get it started), would solve the out of order worries i would think
yeah it makes sense
wdym by get it started in the main thread
is there a thing such as starting in main thread and continuing async
also i think that queue thing that i said before it's not gonna work as a i expected
because even if you order them they are still async so eta depends on the execution speed of tasks etc.
yeah idk bottom line this is
a) a good question for someone who knows exactly what hikaricp / the jdbc / sql is doing
b) probably nothing to worry about
no, you would have fields in the document for those things. It would be inefficient and a lot more work imo to do something like that.
yeah probably a stupid or genius question
yea
here is an example
i'll leave it here
lol thanks for the support 🤝
ofc ofc
so all data specific to the user inside one document?
what about global vs per-server data?
for that, I would create a database for global, and a database per server, and then just store user data that way.
would you even want a database / collection per server
that's like, equivalent to making a new table per server in sql right?
I am not sure about SQL, I know nothing
i'm referencing this image because i barely know mongodb
yea
would you need to manually create each collection
well right but
i should ask is it good practice to scale the number of collections which exist to N
or should you only ever have a constant amount
I mean, if you have under 100 servers, there shouldnt be any problems
hell, under 1000000
like, there shouldnt be any issues, and the efficiency will be decreased, but not by much
but there would be some serious issues in your overall design for your code/server if you want that many collections
right
i think a nice and pretty solution would just be to have one table with documents which denote which server they belong to
that way it scales to however many servers you want
but the code isnt as clean, and there would be a lot more documents in each collection
you would have to filter each document for the server you are looking for
that's true, at that point i'm sure you can index the documents though
idk, imo it would be messier and I wouldnt do it that way, but that is just me. Idk the best solution.
if mongodb lets you do that
you can
yeah idk either tbh
mongodb is powerful if used correctly, and I dont know how to use correctly lol
xd
well under
oh database?
sry i just pinged u twice
your good
you're*
your*
both of you are wrong
i am twisty
so a structure like this? https://paste.srnyx.xyz/gefuvuliqi.txt
warnings could be in their own database
Hey,
I need to edit a plugin. The plugin has Custom effects in minecraft but i want it so it doesn't at certain areas. cause we want to make an event map but the custom effects still work in there and its unfair for the other people.
ok
it was a question do some people know how
well, you needing to do X doesn't tell much
People I need your help
[!] Game is currently whitelisted, wait until whitelist is disabled.
I am getting this error every time, I tried everything. From checking startup commands, to all .ymls, to server properties.
Whitelist stays on.
there's probably a different plugin thats causing that
but that's for #general-plugins not here so
I deleted everything expect of imanity spigot and aquauhc.
Is your whitelist message in spigot.yml set to that
the message thats showing
if yes, the issue is something in spigot probably idk
if not, the issue is with aquauhc
Can we see the error?
[!] Game is currently whitelisted, wait until whitelist is disabled.
this is still not the right channel 
It is Aqua. That [!] is your prefix.
Already fixed it for him 🤣
How can I get rid of it;
Technically, you can't. You will just have to replace Face's name with yours in the config.
Thanks.
wow that sounds terrible
Hey. I'm having an issue and I am so confused because I don't even know where to start in terms of debugging.
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
System.out.println("1");
if (!event.getView().getTitle().startsWith("Corpse")) {
System.out.println("Title does not start with Corpse");
return;
}
System.out.println("2, Title does start with Corpse");
ItemStack clickedItem = event.getCurrentItem();
if (clickedItem == null || clickedItem.getType() == Material.AIR) {
System.out.println("Item is null");
// return;
}
System.out.println("3");
//if (event.getClick() == ClickType.SHIFT_LEFT || event.getClick() == ClickType.SHIFT_RIGHT) {
System.out.println("4");
// Declare
Database db = new Database();
Inventory inventory = event.getInventory();
InventoryView inventoryview = event.getView();
String npc_id = inventoryview.getTitle().replaceAll("[\\D]", "");
System.out.println(npc_id); // Developer note
System.out.println("5");
// Update the inventory in the database
String inventoryString = BukkitSerialization.toBase64(event.getInventory(), event.getView().getTitle());
System.out.println("6");
// update the inventory in the database
try {
System.out.println("7");
PreparedStatement updateInv = db.getConnection().prepareStatement("UPDATE corpses SET base64=? WHERE id=?");
updateInv.setString(1, inventoryString);
updateInv.setString(2, npc_id);
updateInv.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
//}
}```
The point of this method is to update the Database whenever the inventory is modified, as I store a base64 encoded version of the inventory in the Database. However, if a player takes an item out or puts an item in, it doesn't update -- However, if they take multiple items in or out, they all update except for one, how would one go about fixing this? I am so confused.
Quick question
Is this code using java syntax properly?
if (yours.getLeader().getCombo >= opponent.getLeader().getCombo) then (display "§a" + yours.getLeader().getCombo() + "Combo") else if (opponent.getLeader().getCombo >= yours.getLeader.getCombo) then (display "§c" + opponent.getLeader.getCombo + "Combo") else (display "§fNo Combo")
no
How can I make it follow java's syntax?
by learning Java
I'm currently learning java
@sterile hinge Is this better?
if (yours.getLeader().getCombo >= opponent.getLeader().getCombo)
then
(display "§a" + yours.getLeader().getCombo() + "Combo")
} else if {
(opponent.getLeader().getCombo >= yours.getLeader.getCombo)
then (display "§c" + opponent.getLeader.getCombo + "Combo")
} else {
(display "§fNo Combo")
anyone know exactly what caused the newer versions bow boosting mechanics to change?
im making an "old bow boosting" plugin, i could jank it by having it boost under certain conditions, but i think it'd be best to find out what happened so i can reverse it better
btw old bow boosting is also very messy
servers with bow boosting have a custom plugin (even on 1.8)
i remember making a bow boosting plugin a while ago
was pretty fun to fly everywhere lol but wasn't that good
I think what happens is that if the arrow has been alive for too little then it won't do anything
that's just a guess though
high chance that's wrong
if that's the case i could just make the life longer
What is wrong with this code?
you'd still want to handle the projectile hit anyways
because you can't really bow boost without modifying the velocity
what do you mean
the normal velocity is fine, no?
or did that change in newer versions as well
no - whatever server you bow boosted on - they use a custom plugin afaik
removing the randomness from shots is already handled
idk then
it's been months since I made the bow boosting plugin
ill try adding to its ticks lived and see if that lands a hit
oh is that an actual variable?
yes
maybe I just got that guess from deep inside my memory
it doesnt seem to let me boost when i set to 100, so either something else has changed, or i'm setting it before it spawns or something
you can use either paperweight or sponge's tool to see the inner workings
both gradle only 🙃
i hope you use gradle 😌
no, but ive only written an event listener really so its not hard to change
dw for sponge's tool you don't incorporate it into a plugin anyways
it's just to view minecraft server code
(without spigot)
and paperweight is typically used within plugins since it includes paper (and spigot)
lemme see if i can find it
yeah im using spigot
Need context, what language is that? And what do you expect it to do that it isn't doing?
It's Java, and I'm trying to make it get the target's ping
It gives me an error
Saying that int cannot be converted to java.lang.String
use int() instead of Integer()
or you may not even need to cast it at all
what does PlayerUtil.getPing() return
The player's ping
what type
Paste Services
When asking for help with a config/menu/code issue please use our paste bin:
(we prefer it over pastebin.com)
• HelpChat Paste - How To Use
I don't know how to make it work, however
It's a fork
im probably misunderstanding something, but to me it looks like it should be
.add("{target_ping}", String.valueOf(PlayerUtil.getPing(target)))
ah
I tried that alr
and what does it say then
It says that it can't be converted to java.lang.String
earlier in your file,
PlayerUtil targetPing = PlayerUtil.getPing(target);
PlayerUtil senderPing = PlayerUtil.getPing(sender);
these should both be errors also, they should both be "int" instead of PlayerUtil types
They work, tho
i dont think so... are you using an IDE?
not anymore
no
Also Integer(PlayerUtil.getPing(target)) is not a thing, and your IDE would yell at you
github.com, and github.dev
My computer can't run IDEs
13GB left
Actually 15GB left, but still
okay, so when you say "it works", you probably are just committing to github right
What IDE are you thinking that you can't run with 15GB??
IntelIJ?
Eclipse?
That's in storage, btw
not in RAM
i dont think you'll have a fun time coding without an IDE, it's necessary especially on big projects like that
I do one thing at a time
Well good luck
but each step is never checked
lots of small commits can all be wrong (we see many are in this case)
when creating a new file variable, what would the path be to get a .schem file in the plugin's folder? would i just do something like ./plugins/mypluginname/?
From your plugin instance you can use getDataFolder to get the exact folder your plugin uses
oh that's nice! thank you
getting the error Not all platforms have been registered yet! Please wait until WorldEdit is initialized. when attempting to execute this line of code Clipboard clipboard = reader.read();
not sure why this is happening?
make sure WorldEdit is added as a dependency in your plugin.yml
that will force it to load first
i have this in my plugin.yml depend: [WorldEdit]
not sure, maybe you have to wait for some event for worldedit to initialize
can't really say much without seeing the rest of the code
ClipboardFormat format = ClipboardFormats.findByFile(file);
ClipboardReader reader = format.getReader(new FileInputStream(file));
Clipboard clipboard = reader.read();```
that's all the code that uses the worldedit api and the error occurs on the last line
what method are we in, onEnable()?
I fixed it
Wanna see my creative fix?
separate function created in main file but called within a command
Will also help folks having the same issue.
show your pom.xml/build.gradle
too many times people accidentally shade the plugin in
.add("{target_ping}", String.valueOf(PlayerUtil.getPing(target))) Didn't work for me, and after alot of messing around, I got to this (fully works, btw):
.add("{target_ping}", Integer.toString(PlayerUtil.getPing(target)))
odd, but if it works, it works
¯_(ツ)_/¯
It was throwing an error saying that it couldn't convert Int to java.lang.String
those two lines should really be doing the same thing
im guessing there was another issue somewhere down the line
but sure
sorry, i'm dumb. do you just mean what is inside pom.xml?
Paste Services
When asking for help with a config/menu/code issue please use our paste bin:
(we prefer it over pastebin.com)
• HelpChat Paste - How To Use
pastes.dev >
I didn't change anything beside that, so it might just be Java being Java ¯_(ツ)_/¯
ummm
that code shouldn't be compiling at all
@dusky harness Do you agree?
no - the purpose of String.valueOf is to have a general all-in-one method to combine other methods like Integer.toString
you don't have worldedit in ur pom.xml
rye what IDE do you use
ex eclipse, intellij
you might be using whatever build system is inside the IDE instead of maven
intellij
I changed nothing else
how are you importing the worldedit dependency/jar/etc?
because your pom.xml only includes spigot-api
i thought i had the worldedit stuff inside the pom.xml
I can give him the worldedit's pom.xml thingy
ok wb this:
what are you doing to create your jar file
like what buttons do you press
build artifacts
Hmm so how was it created or who created it? What do you mean "include expansion" ? Is there a new way of adding placeholders now ?
yeah I think that's the issue
You're using IntelliJ's build tool, not maven's
github?
oh lmao
I use github for compiling
Build the expansion inside your plugin, yes. https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/PlaceholderExpansion#with-a-plugin-internal-class
Doesn't need to have a repo to be created, clip created it in 2017.
ye 🥲
ex try double click control -> type mvn clean package
and you should be getting some errors
added worldedit stuff to pom.xml and it says build success
that's how you create (or in maven's terms, package) a jar
alr - send pom.xml once again
so that i can make sure
Right so that means a new dependency for my plugin that hooks into papi right?
I don't know what you mean by "new dependency"
🥲 🥲
typically people using Eclipse run into this issue since it's literally just a "Export JAR" button or smth
but hey, at least now you know how to use intellij's build system
🙃
yeah this should work fine
Right let me re-phrase it. Is there an example of doing this?
Yes, the example is linked
yep haha
thank you so much lmao 
run the command i put above and the jar should be in the target folder
np 😃
for intellij i use an addon called "Minecraft Development", it basically generates a default plugin for you and sets up the build configuration
Oh sorry I missed that, let me take a look. Thanks
was edited in 😉
makes it really easy
that's what i use aswell
ah that's probably how you ended up using intellij's tool instead
ah, you wont need to use build artifacts then, you can just run it (it comes with a default config)
since maven's the default ( 🤢 )
it has a gradle option too
the more you know
oh?
that's neat
f10 ez
yeah i jst click new "spigot plugin", fill in some details, and then click the big green arrow
ez plugins
I'm thinking of making a program to create a project (theres someone in another server who uses like a shell script but I don't know scripting enough to do that lol) since minecraft dev is a bit limited and i end up changing all the files anyways
but
i've been thinking of that for like a year and still haven't done it
even though it'd probably save me like 5 min
im really surprised the tutorials on youtube dont use the Minecraft Development addon
yeah
well
I know one that does
I don't remember the name though
the one I used to learn didn't use it though
it used eclipse 💀
me too
Just make file templates tbh
and worldedit has to be added to the libraries, right?
when you compile itll do all that stuff for you
o, so is the worldedit stuff being red fine?
yeah, after build it should not be red



