i would just use https://www.simplymc.art/Gradients
#help-development
1 messages Β· Page 371 of 1
That was what i use
but that wasnt working
What should i add to this regex ^[a-zA-Z0-9]+$, to be able to use the color caracter & ?
Probably a &
[a-zA-Z0-9&]+
Unless you're trying to write a RegEx for like &f, &9, etc.
In which case &[0-9a-fA-Fnmor]
No no, its just for a display name command
So then you cant use any special character unless color code one
Yeah, then the first one
right, thanks choco
[] is just a list of characters that should match
Any of the chars in that []
https://regexr.com/ is a fantastic website by the way in case you're ever writing RegEx and want to test out your queries
Really thanks!!
som1 still can help me pls
how to do?
Do you know hat its a packet? Have you worked with mc packets before?
regex101 >
ayone knows how to raise IJ's memory limit?
I got 64 GB of RAM but IJ keeps refusing to use more than 2 GB
I believe
thanks!
I do it to all my JB ide's what's the point in having memory if you ain't gonna use it?
I do use that much
I usually have 10+ projects open haha
yeah that indeed worked, thank you
another question: I usually got github copilot enabled, but whenever it's enabled, sometimes this menu doesn't open anymore
anyone got any fix for that, too? π
yeah, use Eclipse π
sometimes it's just like this
did they finally mix their maven integration? if yes, I got no problems switching back to eclipse
mix?
I've had no issues
I had some issues with eclipse being confused when there's both, a pom.xml and an .eclipse folder
ah that
but that was like 3 years ago
yeah if you mess the classpath it can play up
hmmm
and does it work nicely with github copilot?
if yes, I might consider switchig back
I've no interest in copilot so no idea
nah it makes people lazy
along comes copilot then ChatGPT, next comes people telling the AI what they want and it writes the whole program for you
its a terribly bad slope to slide down
Won't be long before there are no more programming jobs
check out this, for example
yeah obv you cannot just use it 1:1
but sometimes it let's you do stuff very quickly that you'd nnormally have to type out by hand
or this, for example
(also sorry in case my numbers miss any "n" char, my keyboard is a bit broken and I have to hit the n key like a maniac for it to work)
quickly is nice, but it's also teaching an AI to take your job
I doubt you remember when the majority of coding jobs were farmed off to India
I'm a lawyer, coding plugins is not my job lol
I saw a bot recently (test) passed the UK bar exam
then it must be a good bot
I think the biggest reason ChatGPT and the like won't replace jobs is that in order to do that it first has to be trained on how and by the time it is then it's already behind.
I always say that AI has it's limitations, e.g. it cannot help people answer questions like "how can I avoid inheritance taxes when my grandmother wants to inherit some property to me", but it does a good job in making people code a bit quicker
ChatGPT is a HUGE leap forwards in predictive AI. Comparted to 10 years ago it's astounding
definitely
it still doesn't undertsand basic concepts
e.g. ask it about the event priority in spigot plugins
imagine another 10 years
it will give you a totally incorrect answer
okay but in 10 years, I'll have enough money to not have to work anymore, anyways haha
Yep because it's currently predictive but that ability expands with every iteration of the AI
Maybe, we'll see. I really hate how it's so confident in it's incorrect answers. Can you imagine the bugs in production code that will exist from ChatGPT and the like?
oh it will be a buggy mess, but Corporations won't care, it's free labor
At the end of the day they will because lawsuits and legacy code bases will always exist
anyway, this discussion only started because I asked whether there's a fix for IJ not showing "IntelliSense" suggestions anymore just because GH copilot is running. does anyone have a fix for that? would be appreciated, thanks
π
I didnt want to start a war about "is AI good or not?"
it is good
Sometimes
most of the times*
i tried using mojang mappings and create npc, and i get
java.lang.NoClassDefFoundError: net/minecraft/server/level/ServerPlayer
i use 1.19 paper
?whereami
show your code dude
we cant gfuess
looks like you're not mapping it properly
You didnt remap
?nms
Also you are using this weird api
almost been an hour, guess they fixed it
steps to stop having problems coding minecraft plugins:
- Use spigot instead of paper
- ???
- profit
What should I use here to output a more readable death message?
I'm currently using
"lastDamageCause"
to string it
You cant just print out a whole Object like that.
Get the DamageCause of the event and format/translate it.
Ah I see
hey i made it so when players use command /1v1 an inventory opens and there are list of players and when they click a player name they can confirm or cancel 1v1 request if they click confirm an message pops up to the other player to accept or decline the request and when they both accept they can pvp and i dont know how to make it so when those two players are fighting other players cant attack them.
Create a class ActiveDuel which contains a Set<UUID> of participants.
Then a DuelManager which has a Map<UUID, ActiveMatch> which maps players to active duels they are in.
EntityDamageByEntityEvent:
(Pseudocode)
- if duelManager.hasActiveMatch(defenderId)
- ActiveMatch match = duelManager.getActiveMatch(defenderId)
- if not match.isParticipant(attackerId) -> cancel event
Another, simpler approach:
Put the duel partner in the PDC of both players and check them on the damage event.
hello guys, anyone has an custom rates xp? for 1.19?
for example put custom values for each level or any formula
Have u ever tried it?
Cause no way π
Half of the time it doesn't know what it is doin
unless u spot a mistake it it will confidently tell you the wrong answer
for copilot it also messes up
maybe in 10 years
Elgarls point is that you should look at ai 10 years ago, it basically doesn't exist
And according to that pattern, what will happen in next 10 years
so, according to them AI would be coding itself then
I mean if AI can do everything why even bother living
For some reason, the config folder is not being created on my client's server, although on my localhost it works without a problem. I am using saveDefaultConfig() in the onEnable() method.
yes, it is the second time. I have really no idea what is the matter.
probably no, but I will ask
are they using pufferfish by chance
spigot
that makes it more confusing
do you actually provide a config in your plugin? saveDefaultConfig doesn't create one, but copies the existing one from the jar file
yes
If its some permission error or smth it should throw in console
So ask them about it
There are plenty of exceptions/logs in cases where copying the resource didn't execute as planned. Have you also added a debug log after your call to make sure it actually executes on your client's machine? If so, and if the file's still not there, there has to be more information in the logs. Request the latest.log.
Someone has to teach it
Can't smarter AI teach dumber AI
then that dumber AI can learn from the internet by itself gradually becoming more smarter
The problem with that is without proper filtering/sorting of the data if you input random garbage you'll get out of it random garbage
I really don't understand why spigot decided to not use the same versions across craftbukkit's package, Bukkit#getVersion and the NMS package (on older versions). What a headache...
@wet breach
I was just browsing looking for how people do nametags for players and I came across MultiLineAPI
pre 1.19.4 armor stands
i've chosen to rewrite an older plugin of mine and i've decided to do that by simply making a new plugin project with the same plugin name, but on startup it's complaining about permissions that were already registered. do plugins have like a type of ID? where could i find or edit it in that both versions would be the same?
only 1 plugin can have a specific name
i know, thats the purpose
im not trying to run both plugins with the same name
i have to make the plugin rewrite with the assumption it will replace the plugin pre-rewrite, so the pre-rewritten plugin will have been enabled on such servers at some point, but when it does it seems it'll complain about permissions already having been registered and probably some other things that i dont know about
so that leads me to believe plugins have an identifier beyond just the name, and im wondering if i can find that id somewhere so i can make it the same as the older plugin version
why cant found?
i search the net
i think this is in 1.19.3
from that prior screenshot you sent, its obsfucated so your gonna need to find the obsfucated version of that
Where to find?
Epic are the only ways you know to changing a players nametag above their head packets and scoreboards?
packets, scoreboard somehow hiding the current name and making a new armorstand on their head
Is it that complicated as I think it is?
ive got no idea
Cause some places I've lately seen like insanely simple ways of doing it
only ever seen it in 1 plugin
But then a plugin like NameTagEdit is extremely complicated
Pastebin
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 try to use 'rk'
but not found
might be spigot mappings
i watch the tutorial and do as the video
it build the spigot Buildtools.jar
tbf i often dont use mojmap cause i normally use the intellij build thing
i can never work out how to get maven to compile to a proper directory so give up
Hey,
Im having some trouble setting a Chat format. Well to be more precise, setting it is no problem, but getting the console to properly log messages.
This is my code (simplified):
@EventHandler(priority = EventPriority.LOWEST)
public void setChatFormat(AsyncPlayerChatEvent e) {
String format = "{username}: {message}";
format = format.replace("{username}", "%1$s").replace("{message}", "%2$s");
e.setFormat(format);
}
Works fine ingame, however the console only logs messages without usernames once I set a custom format. I also tried using e.getPlayer().getName(), but that didnβt change anything sadly
Someone else here two days ago had the exact same issue.
they claimed it was due to including the color code in the format without calling ChatColor.translate
How can I destroy an end crystal without making it explode?
Tried removing my color code (so the code is exactly like in the snippet I provided) and still get the same result
No like, destroy an end crystal without the player hitting it
call translate on the format before you set it, just to be sure
Entity#remove doesn't work for some reason
Im using a tutorial from the wiki (https://www.spigotmc.org/wiki/using-mongodb/), im using the URL string how can i use it, i tried implementing using the docs but i had some problem.
Same result sadly
No clue then. The code you posted should work
Same result with stripColors? Just to make sure.
yes
Are you running paper by any chance? xD
yes
See if it happens on Spigot
Paper's chat processing logic is completely different from spigots. It's such a ratsnest that I didn't completely investigate it.
Latest version?
I've tried purpur 1.19.3-1908 & paper 1.19.3-404
both didnt work lmao
I dont recall ever having had issues with papers chat formatting
Maybe I just dont remember
?whereami
I hate paper for their nag messages on logging/sysout
If you were able to change teh logging level on teh Bukkit logger people would not need sysout
I was forced to remove debug due to papers nags
I will never understand the hate from the Spigots community towards the Paper community and vice versa
It looks like (to me, at least) that they lately screwed with the chat logic and introduced a bug which only sporadically comes up and drives people insane... xD
Both parties should just have sex (aka merge) and everything would be fine
We dislike the "community" mostly because it's toxic. I hate some of their choices, like FORCING devs to use the Bukkit logger with nag messages telling people to harass the dev.
I'd ignore that. If people don't want to help out, they can just be quiet, xD. Solving issues isn't based around forks, but around common logic.
How about go fuck yourself.
Don't think that you could merge those two codebases easily without stepping on somebodies foot. What code do you take, a or b? Forks are great, there's just no need to hate other people for using something that they like.

What's wrong with that? It makes it easier to trace where the messages come from. It's not hard or time consuming to use it
The reason its bad is as I stated, once the Bukkit logger is initialized it's logging level is fixed. You can not change it at runtime
On top of that they are driving users to harass devs to change their code.
sout is a lot better for sure
much better, you can change logging level on the fly and have proper debug

I don't understand the issue? You can just specify what log level when using the logger?
You try changing it at runtime
change it from teh default of INFO to FINE at runtime and try to log a FINE message
It's just a normal logger? So just pass fine as an argument when logging?
You try that, it will be ignored as changing the logging level does nothing at runtime
idk in what environment you'd ever want to change log level at runtime
very frequently to enable/disable debug output
which should require a proper startup of a debug mode server
no, thats what logging level is specifically for
it really isn't
I can totally relate to the fact that chaning the log level is at runtime is normal
a production server does not need the ability to change its log level during runtime
it really is, it's been the defacto way of enabling debug for at least a decade
aha
I've been using it for over a decade π
users comes to you with an issue, you tell them to change teh logging level and post the output, issue found and fixed.
I wasnt aware that there was such a big difference between the two.
I figured I should ask here since I'm coding a spigot plugin
Tbh, ideally, production-code shouldn't even include function calls for debug logging. All these "agile" people wanting to turn on their debug logging service remotely, lmao
Let's hope they fix it lol
I mean your code base can obviously contain the logger.debug calls
just, they should never be enabled on a production server
Tbh, I don't think they will if you don't get the ball rolling. Is there a way you can tell them about it? Some sort of ticket-stuff?
that is not what they are for
unless you NEED a debug log from a production server to find an issue you can't see in a dev environment
then properly start the server in debug mode ?
Tbh, depends, I don't know if the JVM actually optimizes these calls out if they're always noops. I just generally dislike the idea of having unused cpu cycles, as I'm used to debug and non-debug binaries. But I get it, that's immensely nitpicky.
not sure tbh, gotta research a bit on that
yeah, you are making excuses now to be obtuse? Restarting a production server is not always feasible.

I'd help to maybe even locate the bug, but I couldn't even get the darn server up and running, xD. That pissed me off so badly that I deleted the folder again.
In many local authorities systems I've installed and maintained they dealt with taking the publics payments. You could not "down a server" for any reason.
lmao
I'm just gonna open a ticket on github
You had to have the ability to turn on/off a debug
What's next, hotpatching in production? Okay, sorry, I'm not going to add to this discussion, xDD.
We've actually done that in the past :). Local councils are bitches
But I do get the point, it's actually pretty valid. Collect traces on a running system to later debug locally.
So many crazy rules in their CLA
So I tested the logger. The log levels are missing in the prefix. Is that the issue you were talking about?
No, if you use the plugin logger you can not change teh logging level after startup
wdym by changing to logging level
what logs it prints
if you startup with INFO level and change to FINE after startup no FINE logs will be produced. The level remains at INFO
Couldn't you just use setLevel?
Thats the point setLevel on a Plugin logger has no effect
There very likely is, but I have no idea of what you tried to accomplish there, xD. Is that a hardcoded tree? lmao
what are you trying to do here
ye like blvck said
context
its a structure yeah but i cant think of a way to generate it proc so... hardcoded values atm
ye but what kind of structure
It's literally a tree, isn't it?
I don't see anything that would break that in the logger source?
Do you have a rendered screenshot of it?
nah a leaf
oh my lord
because the default server does logging through log4j2 ?
wrong reply

cant you just load in the azaela tree structure and remove the blocks
`logs i mean
the log4j appender is configured to log level info by default, you can supply whatever log4j2.xml file you want
Just have the middle stem and then use block-faces to generate the leafs around them. Top left bottom right for the middle and front and back for front and back, well, obviously.
if you care for debug level output
ah I now I understand. I forgot it uses Log4J
How can I use a "config-version" field in config.yml to then replace the config if there's a new version available?
Like delete the old file and replace for the new one
I mean yeah, they are meant to be like leaves on a stem though
Get the config version. Check if it's older than the new one. Run your conversion code
Did discord switch image renderer?
They've done some image changes
But saveDefaultConfig doesn't overwrite
You can set values to the config
Do I instead just delete the file and then run saveDefaultConfig?
getConfig().set smth
or delete the file if you want to reset their settings
which would be a pain for the user
Wait you're saying I can actually "update" the file without deleting it
Btw, depending on how fancy your "leaf" needs to be, I'd just advise the simple route: Write a yaml file where you have block-type sections and coordinate entries, based on a relative coordinate system, as you already have. Then just load that yaml and generate the entries at startup. "The ugly code gotta be somewhere", in this case it's not code but only data in a flat-file, that's alright. You're also not hardcoding the data that way, which I'd consider bad practise to be honest.
Interesting
Yeah
How does that work tho? How do I know what changed?
You write data fixers
also @opal juniper if all you care about is code size/readability do something like this
int[][] leafPos = { {0,1,1},{1,0,1}...};
//init set
for(int[] pos : leafPos){
set.add(Pair.of(new Vector(pos[0],pos[1],pos[2]),Material.AZAELA_LEAVES);
}
which would mean you could order the triplets in the leafPos initializator by height for example
For each field in the config?!/
Can someone enter help-server i need a lil help
Yeah
brh
I know its pretty bad, I was honestly thinking about a string that I just loop through like shaped recipes are done
So if config version is 8 and new 10
You'd run update fixer 9 then update fixer to 10
Yeah looks oke, still gonna have a huge array but is better
It's not that much if you're only making small changes
You can generate it by just following the middle "stem" itself (no matter what material that'll be) and appending leafs around it, but your structure looks like it's not just that simple. It actually has some "accents" which don't follow the simple logic.
Does someone know why does my server open and closes?
Yeah fair, so I can check if a field exists and if not, add it?
That what you're saying?
Yeah
Ooooo ok that's not as bad as I thought
I just - personally - really think that it's better to separate this kind of data from the actual compiled code, which is why I'd prefer a "markup" in an external file.
If I need to change a field I guess best thing to do is straight up remove it and add the new format for it
Gotcha gotcha
the stem is procedural and really simple. it just generates 3x3 layers, has a chance to offset and a chance to omit a block
id probably use a config myself but this was cleanup, not redesign
sides
not like that changes
the form i mean
so hard coding it is fine
And then, I've been using saveDefaultConfig() onEnable to copy the config.yml from the plugin.jar
Is this the best?
That's fine yeah
Alright thanks Olivo
I called the "core" of your leaf a stem, sorry, that was a bit ambiguous, xD.
ultimately, the leaf wasn't something I wanted people to be able to configure, however If i just shove it in the config and have some string -> material map in there too it should be fine
To put it simply: your array has some redundant logic you could pull out, but I don't know if that's worth it.
yeah i imagine π
will work on it again later, will probs put it in a config
I have done something like this before
jank, but meh
i just use RedLib for structures
I'd use something like
SPRUCE_LOG:
- 0 0 0
- 0 1 0
...
AZALEA_LEAVES:
- ...
This way you have a clean separation between code and data, just like you don't inline sprite sheets into program memory in games like minecraft, xD.
Uhm, that's even better, xD
you can put a default value as second arg in the get method
Really good to know. Thanks anyways
Hey, If I'm making a class called Scheduler that I want to use to run a task on repeat. I make that class implement Runnable right? Then is it as simple as it sounds?
Start new instance of the class from Main class and call Scheduler.run()?
That will only call the run method once
Ok wait wait
calling it Scheduler is probably not a good choice
I was using this before
?scheduling
(new BukkitRunnable() {
public void run() {
}
}).runTaskTimer((Plugin) this, 20L, 20L);
And that's what I'm trying to move to a separate class
I think im confusing terms tho
Extend BukkitRunnable
class extends bukkit runnable, @overwrite the run method, call it like above
and call it a SomethingTask rather than Scheduler
how can create villager trades manipulation like this?
by the way @eternal oxide do you not sleep or something? I go to bed, i wake up, and youre still online
instantiating bukkitrunnables π
I'm confused on this last part
I have an ill wife so my hours are never regular
public class PrefixTask extends BukkitRunnable {
BetterPrefix betterprefix;
public PrefixTask(BetterPrefix betterprefix) {
this.betterprefix = betterprefix;
}
@Override
public void run() {
}
}
ayo
new SomethingTask().runTaskTimer(this, 20L, 20L);
pee pee poo poo check
ooooooooooo
https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/inventory/Merchant.html#setRecipe(int,org.bukkit.inventory.MerchantRecipe)
or listen to the events and change the trades
declaration: package: org.bukkit.inventory, interface: Merchant
by free java teacher
Alrtight alright thanks
with a scoreboard, can I hide the red score number and just show the entries instead?
no
client limitation
sad
You can use a resourcepack
just make your own client
oh yeah thats a good idea brush
i really have to change my name
why
people either think that im 14 or that im a toothbrush
worked for the last 5 years
i guess I will use bold numbers for the actual score xD
If you're on a modern version you can use shaders in the resourcepack to remove the numbers
why not use the red if youre doing an actual scoreboard
my plugin doesnt really come with a resource pack now
Found this
well I want to show a team name, but also the players in the team
but only the actual team name has the correct score
so then I cant order it correctly
Oh, thanks for clearing that up, I actually thought you were a 14 year old toothbrush, lol
because those red scores are also used to order teh board

you can have all the scores zero
you order by... sec I have it done
you create a team per line...
then teh simplest way is to use a MC colors to create the team name
// Create a Team for each line in the Sidebar.
for (int index = 1; index <= 15; index++) {
Team team = scoreboard.registerNewTeam("TEAM_" + index);
/*
* Set a colour code as the team name because it's an invisible
* character and will not display over any Sidebar text.
*/
team.addEntry(createKey(index));
}```
I see
then it's simple to change a line with ```java
/**
* Set a specific line on the Scoreboard.
*
* @param index 1-15 (bottom to top)
* @param text String to display.
*/
public void setSlot(int index, String text) {
Team team = scoreboard.getTeam("TEAM_" + index);
String entry = createKey(index);
if (!scoreboard.getEntries().contains(entry)) {
sidebar.getScore(entry).setScore(0);
}
// Translate colour codes so they can be displayed correctly
// and trim to 32 displayable.
text = trimWithoutColour(translateColourCodes(text));
team.setPrefix(text);
}```
this will make my scoreboard more complex though, since I am already using this to create my normal teams
but yeah the way it gets ordered is just by inserting it in the right order
yes, each team is added in order then any changes are kept
so you can change any line and it stays in the same place with a zero score
but I guess i can use a separate invisible scoreboard for the actual team scores and then have this additional visual scoreboard displaying what i want
the key used above is just ```java
private String createKey(int slot) {
return ChatColor.values()[slot].toString();
}```
can a scoreboard only have 15 lines?
yes
ok
and can I also hide certain lines?
without ruining the order
like I might not want all the lines at all times but still want it to be possible to use them if I need it
yes
okay so how do I hide a line
set it to an empty string
How to change the filename export from
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<outputDirectory></outputDirectory>
</configuration>
</plugin>
If I wanna make it use <version>5</version>
should i have to install redis on my pc ? (im on windows) since its throwing an error on creating client
Make sure to shade & relocate redis and its libs, both the server and redis use netty which can overlap
Nope you dont need redis installed. Just make sure you shade the redis driver into your project.
This problem is back.
Nice image size discord. you nailed it
@EventHandler
public void aSyncPlayerChatEvent(AsyncPlayerChatEvent event) {
if (Configuration.getChatEnabled()) {
Player player = event.getPlayer();
event.setMessage(Utils.colorize(Utils.translateHexColorCodes(event.getMessage())));
String format = Utils.setPlaceholders(player, Configuration.getChatFormat(), event.getMessage());
event.setFormat(ChatColor.translateAlternateColorCodes('&', format));
Bukkit.getLogger().info(format);
}
}
wait so what is the goal?
The output in console should be identical to the output ingame. But it doesn't even show the player name
Which is how it would work if I turn my eventhandler off. So I know I'm doing something wrong
so you want the console to display the same as the client?
.
The console already does display the same as the client. by default. But if I change the format like I'm doing above it completely messes up
Use spigot, lol
have you tried using Bukkit.getConsoleSender().sendMessage()?
Paper already accepted my issue on github about this
yes
I told you...
Hello
where is the PortalCreateEvent called?
"iT's tHe ColOrs"
So what I'm doing is correct they just messed up
This is why we ask people to only use Spigot here π
Everyone recommends using paper as server jar and using spigotapi to code
yes, but TEST on Spigot
That's a good point
when either of its CreateReason happens I assume
meaning when fire lights a portal, when a portal gets created in the nether as a pair by the game, or when the end portal creates a obsidian platform in the end
Class name?
declaration: package: org.bukkit.event.world, class: PortalCreateEvent, enum: CreateReason
where does minecraft check if it is a valid portal
declaration: package: org.bukkit.event.world, class: PortalCreateEvent, enum: CreateReason
oof
idk where minecraft checks it
but if its created, it should be a valid portal
i.e. I would expect this event to fire only for valid portals
but like, what do you consider an invalid portal
ik i wanted the locgic where it checks if its valid for my own portals
what do you mean by your own portals
i do have it and the plugin size has increased to 18 mb
Event-Call site: ./main/java/net/minecraft/world/level/portal/BlockPortalShape.java:194
Block logic: ./main/java/net/minecraft/world/level/block/BlockFireAbstract.java:149
May deviate a bit on your version. That's grepped from craftbukkit. Basically checked onPlace, when the block is fire.
Couldn't find any other call besides PortalCreateEvent.CreateReason.FIRE, so I may be missing a case.
hmm
thats weird
well I guess the other 2 reasons dont really have to rely on a portal being valid as they are the result of a portal already being created
java.lang.UnsupportedClassVersionError: org/bukkit/craftbukkit/bootstrap/Main has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 60.0
``` This means I need to install a lower version of jdk right?
newer
tf I have latest
your classpath disagrees
I do agree with my classpath somehow
60 is by no means latest, xD. https://en.wikipedia.org/wiki/Java_version_history
The Java language has undergone several changes since JDK 1.0 as well as numerous additions of classes and packages to the standard library. Since J2SE 1.4, the evolution of the Java language has been governed by the Java Community Process (JCP), which uses Java Specification Requests (JSRs) to propose and specify additions and changes to the Ja...
How do I have that I download jdk19
install and update path
The java command points at the wrong binary
Hey! i tried to hide the player's name tag from putting an armorstand as passenger to the player
and when i removed my code and return everything as it is, the player's nametags always hidden
how can i fix this?
ahyes
oh i did it by Entity#eject
Can console not display unicode characters?
depends on teh codepage of your server
Β»
Is there anything I can do in the plugin itself to support it or is it a 100% server side setting
all server side
looks like a registry hack to fix/change
Can't do that for a public plugin tho
Could add the fix as a description if they want
console should be fine on linux
But might as well just add a description to change the encoding on startup
Same thing
looks like it's fixed in newer JLine
How do I turn a maven repo into a dependency
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<outputDirectory></outputDirectory>
</configuration>
</plugin>
Maven plugin project on GitHub into my maven dependencies
How can I change the output name to include <version> as well
<finalName>BetterPrefix-${version}</finalName> tis?
How to check if an itemstack is equal with a predefined one without checking the itemstack's amount?
ItemStack#isSimilar
Thanks
To fully replace a file with the default config file from the jar should I use File# methods to delete the existing folder and then saveDefaultConfig()?
why the player's nametag is hidden?
If you want to completely reset teh config but you have one already saved use getConfig().load(Reader) and pass it a Reader via getResource
i wanted to say Files.copy(plugin.getResource("config.yml"), Paths.get("config.yml"), StandardCopyOptions.REPLACE_EXISTING) lol
but ye that works too ig
still gotta load it then
using load you only need to call save after adn you never touch the file yourself so no possible chance of locks
File file = new File(getDataFolder(), "config.yml");
if (file.exists())
file.delete();
saveDefaultConfig();
Doesn't that do the trick too?
it does, but you then also have to load it again
as your modified one will still be in memory
\π
You just pointed out something and now I'm even more confused
load the file again
I never loaded the file in the first place I don't think
How was it working
Do you want to change it on runtime or onEnable
If its onEnable, no need to do anything
If its runtime tho, you have to load it again, you can just do it with reloadConfig
private void setConfigFile() {
config = getConfig();
try {
int configVersion = config.getInt("CONFIG_VERSION");
//Make a switch to check what version the config is currently at. If it is not the latest version, update to the next version
switch (configVersion) {
case 1:
break;
default:
break;
}
} catch (Exception e) {
//If the config version is not found, it is most likely the first time the plugin is being run. Set the config version to 1
Bukkit.getLogger().log(Level.WARNING, "Config version is outdated. Resetting config version to 1");
File file = new File(getDataFolder(), "config.yml");
if (file.exists())
file.delete();
}
saveDefaultConfig();
if (config == null ) {
config = getConfig();
}
}
I think that works
To replace the file completely if it's a very old version, even before I added "config_version"
If it has the field "CONFIG_VERSION" it'll do the stuff for the number of the version.
If it doesn't have it it, delete, saveDefault and load
But your approach will delete any modification user already made
I need to force that
I need to force it because the config file changed drastically
this will wipe your config and save over teh config you have savedjava try { getConfig().load(new InputStreamReader(getResource("config.yml"))); getConfig().save(new File(getDataFolder(), "config.yml")); } catch (IOException | InvalidConfigurationException e) { e.printStackTrace(); }
I can have a config updater once the config includes the field "CONFIG_VERSION"
should i do someth extra except shading the redisson into the plugin???
I just need to make sure they have the very old config version before I delete it. Which in this case is not having the field "CONFIG_VERSION"
After that it won't delete anymore and I can do config updater stuff
So even tho alex suggests not to use exceptions for this
Also this empty switch is kinda...
interesting
It's for the future
For config updater no?
I can remove it for now obviously
I was just thinking on ikt
private void setConfigFile() throws IOException, InvalidConfigurationException {
config = getConfig();
int configVersion = config.getKeys(false).contains("CONFIG_VERSION") ? config.getInt("CONFIG_VERSION") : -1;
if (configVersion == -1) {
Bukkit.getLogger().log(Level.WARNING, "Config version is outdated. Resetting config version to 1");
getConfig().load(new InputStreamReader(getResource("config.yml")));
getConfig().save(new File(getDataFolder(), "config.yml"));
}
}
There you go. that looks much better
Hey there. I have a simple fake player. When the npc faces to north, it's head being a bit weird. anyone knows whats the error here?
Vector dir = player.getLocation().toVector().clone().subtract(npc.getLocation().toVector()).normalize();
double r = Math.sqrt( dir.getX() * dir.getX() + dir.getY() * dir.getY() + dir.getZ() * dir.getZ() );
double yaw = Math.toDegrees(Math.atan2(-dir.getX(), dir.getZ()));
double pitch = Math.toDegrees(-Math.asin(dir.getY() / r));
connection.sendPacket(new PacketPlayOutEntityHeadRotation(npc.getPlayerObject(), (byte) yaw));
connection.sendPacket(new PacketPlayOutEntity.PacketPlayOutEntityLook(npc.getPlayerObject().getId(), (byte) yaw, (byte) pitch, true));
I want it to look my eyes. Its working fine for other rotations but when north, it is a bit weird
how can I fire a let's say fire_charge at a specific direction with a specific radius?
and make the exploded blocks surroundings turn into a specific block
ClientboundRotateHeadPacket(npc, (byte) Math.floor(npc.getYHeadRot() * 256f / 360f));
like coding a meteor that turns surrounding exploded blocks into magma and netherrack
will this change the head rotation of the npc or player
NPC is a Player
i mean the real player
how can I make a let's say tnt explode and turn all exploded blocks into (80%) netherrack/magma block (20%)
Also, which version is this? It says ClientboundRotateHeadPacket cannot be resolved
thats 1.19.3?
i was using 1.16.5
1.19.2 sorry
time to update
everyone ignoring me be like
You can loop the blocks in the radius you want and change them
Use random to randomize the blocks
no i know the rng part but im asking the placement part
you don;t need to place, just get teh blocklist in the explosion and randomize
after you made your changes don;t forget to set teh yield to zero and probably clear teh BlockList
you still want the explosion to happen, just not change blocks
Well... if your plugin is actually used by people you shouldn't do that, :-: Think about your layout properly before the first release and then only patch in keys on the fly or deprecate others (would be best if you'd also add a comment above). But drastically changing the whole file would be a dealbreaker for most people who took the time to make it their own and now have to manually migrate everything.
Hey, how I can create a clickable npc in java spigot 1.12.2 ?
Step one: Break down the problem into manageable tasks, as your question is actually quite huge.
I'd use the Citizens API
any more methods i can add to my math parser? i currently have sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, sqrt, cbrt, log, rad, floor, ceil, abs, int, pi, e, min, max, avg, round, rand, exit, and, nand, or, xor, not, nor, xnor
lol
I would like to create a clickable NPC that would open a menu, and I would like to know how to do this.
Citizens has an extensive API for working with NPCs. Make sure you always are using an up-to-date build of the CitizensAPI to ensure that your plugin works with the latest release of Citizens.
I have already looked here, the problem is that there is a step that I do not understand, the one about 'Hooking Into Citizens'.
i always made my npcs myself with packets π₯Ί
My plugin was released long time ago with 3 fields. I had to do something. It's not the first release. I wasn't that experienced back then
What part don't you understand? Adding the line to the plugin.yml or listening to an event?
Both of them
So to add the line you open the file and write the text then you save
For the other one you use the event api that spigot has: https://www.spigotmc.org/wiki/using-the-event-api/
The home of Spigot a high performance, no lag customized CraftBukkit Minecraft server API, and BungeeCord, the cloud server proxy.
(a, b) -> a != 0 ^ b != 0 ? 0 : 1 me wondering how a != 0 ^ b != 0 is a valid expression
or does ^ act as a boolean operator?
probbaly xor ig oh ye
π Use variables
varargs method
the plugin manager
^^
is there a reason you're instantiating all your stuff before calling that method?
With three fields you mean just three key-value pairs? Well, then why redo the whole thing? Just add new members to the loaded configuration, save it and thus patch in new customization features. The newer snake-yaml also allows to append comments to nodes, so you could even explain what's moved and what the new stuff does. Just overriding the file is a bit intrusive.
you dont do registerEvents(new EventHandlerX(), this)
i dont think thats supposed to work lol
If you're really interested in a more clean and flexible solution (which most people actually aren't, lol), you could check this out: https://github.com/BlvckBytes/AutoWirer
It's very simple and lightweight. This is how I use it: https://paste.md-5.net/wocudisoza.java
In your case, the addInstantiationListener for Listener.class would do the trick. You of course still need to add the classes to have a reference, but the part of wiring is being done for you.
does spigot have a specific implementation for async callbacks?
I need to install the Citizens plugin in my server ?
Yes
I don't think so
If its true and file already exist, it will be overwritten
Old school impl
them not using FIles
Working with vectors using a syntax like (x,y,z,w,...)?
uh oh
Hi, im having a stroke for making this, i made an upgrade item when you click into an armor it opens a GUI but i realized after some time that how can i change the lore to the armor piece selected, any help on how to pass it from the InventoryClickEvent in the upgrade to the one in the GUI?
some code:
https://sourceb.in/uffy1QlnMJ (GUI)
https://sourceb.in/ya7Kvy8eEx (Event)
its currently only working with numbers but ye i might try
i dont even know how vectors work lol
Well normally you can distill vector math down to a sequence of regular expressions, where each result is "stored" in a different portion of the vector.
Important math expressions for vectors are the dot product, normalizing and smth I never can remember.
i was thinking about transforming my parser to a interpreted language but that will probably go brr
Hey, how I can create a clickable NPC without Citizens ?
not easily
it takes a lot of Java knowledge, NMS and rewrites for every version of MC/Spigot
me 3 years ago https://www.youtube.com/watch?v=qBOpTJtWogI
Learn how to create an NPC! The super-easy way using packets and NMS!
Patreon:
https://www.patreon.com/codedred
Donate to me :)
https://www.paypal.me/CGMax
Join my discord:
https://discord.gg/zMzXSgk
------ Links ------
Download Eclipse: https://www.eclipse.org/downloads/packages/release/2019-03/r/eclipse-ide-java-developers
Download Spig...
Hey anyone know their way around 'creating a pull request'?
You can find information about contributing to Spigot at the following links:
https://www.spigotmc.org/wiki/cla/
https://www.spigotmc.org/wiki/guide-contributing-to-spigot/
https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse/README.md
https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse/CONTRIBUTING.md
can I have a scoreboard thats visually present on the players sidebar but still have the tablist displaying a player name with the prefix of another scoreboard objective?
or can I have multiple objectives on the same scoreboard but only have 1 showing
like I can make a scoreboard and add an objective for the team name prefix
and then another objective for the things that I want to display on the scoreboard
like can both of those things be on the same scoreboard?
I've not done anythign with tablist
hmm ill play around then
Yes, that's possible. Scoreboard Objectives and Teams don't really share anything that could collide. Teams are just named groups with members and some properties.
Hi with the replaceall if i have something like "Power LVL" but has some color code doesn't get replaced?
int s = Armor.getLore().size();
for(int x = 0; x < s; x++) {
String st = Armor.getLore().get(s);
st.replaceAll("PowerLVL", "Speed");
}
//&e&l* &d+PowerLVL <- Color code
but doesn't work, no error too
do you want to also replace the color code?
Does anyone know a way to make brewing instant? And make it require certain amount of money to brew?
So players don't need to wait
no just the PowerLVL
no its not replacing nothing
its the same
i mean cant you check when the inventory changes and remove the items and place the potion
iirc theres some sort of event triggered if a player places an item in an inventory
this code repeatedly get the last entry in Lore
yes its normal
you need to re apply the line to the lore
like you are just getting a copy of the lore, not actually setting it back
except you are getting the index by size when arrays are indexed on zero
i repeat in all the lore because i don't know how the people will set it
you are not looping lore to replace the string
what you mean?
you are trying to fetch the last entry + 1 and perform a replace on that
you mistyped
you shoud get x not get s
New Day
you probably want to get the x'th line instead of s'th one, like String st = Armor.getLore().get(x);
New attempt
x < s -> s < x?
Hi, is it possible to send chest opening animation without using nms packets?
OOOH i got it
first line inside your for loop
Shit
i did that but same is not working
lastly this is not how you actually modify lore
for values added with YamlConfiguration#addDefault, how do I make sure that the values are there? if I use #options().copyDefaults(true), then everytime i edit a value in the configuration, it'll be overwritten upon restart and i don't want that to happen
and how?
get lore -> modify List -> put back on object
int s = Armor.getLore().size();
for(int x = 0; x < s; x++) {
String st = Armor.getLore().get(x);
Armor.getLore().set(x, st.replaceAll("PowerLVL", "Speed"))
}
lore = Armor.getLore();
for (String line : lore) {
// replace
line = line.replaceAll("PowerLVL", "Speed");
}
Armor.setLore(lore);```
its not originally mine. I had for a short period of time took over it to maintain it while the author was away
replaceall is for regex remember
List<String> lore = Armor.getLore();
for (String line : lore) {
line.replaceAll("PowerLVL", "Speed");
}
Armor.setLore(lore);
itemstack.setItemMeta(Armor);
even whit this doesn't work
it also works for string replace
it will work yes
am i looking at kotlin or smth cuz Armor
or are we not caring about naming conventions anymore
probably this
also strings are immutable so line.replace wont have any effect to line
im confused right now
String#replace returns a new string with the replaced content of the string you call that method on
oh
Hey, what happen if I remove Spigot-server in pom.xlm?
yep
spigot-server?
In BuildTools setup
you should never need to modify BT at all
I have no idea why your build fails. We went over everything yesterday
cmd and Bash
java version, cmd line, file location, access level.
Can anyone here recommend me some Command Frameworks?
The only one which gets recommended here is Aikars ACF
Which features do you need? Tbh, org.bukkit.command.Command is more than enough to get everything implemented. You can add a few little abstractions to it, but I would avoid using some bloatware library just for commands.
^
There's nothing special I really need. I just thought I'd give some frameworks a try
I would usually work the other way around
well acf makes your life 100 times more convenient imho
but it will give your plugin some extra weight
if you don't mind it, try it
acf is a bit too much imo
I generally java public abstract class BaseCommand implements CommandExecutor
depends
then extend it for each command
I made my own tiny SimpleCommand util that is about 10kb
if your plugin has a lot of commands with a lot of code, it can probably be simplified
whats in this basecommand then
mind sharing?
just a constructor and a default onCommand
other than concrete commands
then any shared fields
Yea I used a custom abstract class before too, but I felt like I gave myself more work than if I had just sticked to the normal CommandExecutor
?paste
I guess
public class WhateverMyCommand implements SimpleCommand {
@Override
public String getIdentifier() {
return "teleport.*"; // /teleport 123asdf
}
@Override
public String getPermission() {
return "command.teleport";
}
@Override
public void execute(CommandSender sender, String... args) {
Player source = (Player) sender;
String targetPlayer = args[0];
if(targetPlayer.isEmpty()) {
...
return;
}
Player target = Bukkit.getPlayer(targetPlayer):
// validate target
source.teleport(target.getLocation());
}
}
idfk
all it really does is just hide some casting of the sender
It's good enough
as far as I can see
yeah same I feel like CommandExecuter is already the base so there is no reason imo to make another one for it
it allows you to minimize code not having to check for console etc in every command
you can also simplify tab complete using an abstract
tab complete is already pretty simple as is imo
well you still need to check for console in your implemented class, but now its a boolean instead of a cast check
true
nice song choices
thx xd
saving the config on plugin reload will override previous settings afaik
I usually have a reload method like this
public static void reloadFiles(boolean save) {
try {
if (save) config.save(configFile);
config.load(configFile);
catch (IOException | InvalidConfigurationException e) {
e.printStackTrace();
}
}
and in my reload command I just call FileManager.reloadFiles(false);
honestly config reloads are the bane of my existence
i never get them right on the first try
and barely on the fifth
is there anything wrong with it? never had any issues
ArmorStand#setHelmet is deprecated. What do I do?
See its docs.
Deprecated.
prefer EntityEquipment.setHelmet(org.bukkit.inventory.ItemStack)```
thanks
Is there a way to make an entity invisible from the time spawned so you can't see the armorstand visible for a splitsecond?
What's the problem with seeing a armor stand?
it is supposed to be invisible
You can use NMS then
And send packets of the armor stand after you have created it fully.
yes you can, spawn it using the method that accepts a consumer
ArmorStand inherits LivingEntity and can thus use #setInvisible(), no?
a consumer?
I am using it
in the consumer you can set it invisible and that code runs before it's actually spawned
He says he can see it for a split second
but you can still se it for a split second
then he can;t be using the consumer method
oh, didnt read that part, sorry
He must be using a 5tps server and really bothered by it
thank you
its 20 and yes I am really bothered
Thank you
world.spawn(world.getSpawnLocation(), ArmorStand.class, (stand) -> { stand.setInvisible(true); });```
why does this is not creating a 3x3 portal?
block1x1.setType(Material.PORTAL);
block1x2.setType(Material.PORTAL);
block1x3.setType(Material.PORTAL);
block2x1.setType(Material.PORTAL);
block2x2.setType(Material.PORTAL);
block2x3.setType(Material.PORTAL);
block3x1.setType(Material.PORTAL);
block3x2.setType(Material.PORTAL);
block3x3.setType(Material.PORTAL);
1.12.2
very unrelated to minecraft but how would i replace numbers in a string with their sum if they are next to each other?
e.g.
28hi -> 10hi
248test49helloworld10 -> 14test13helloworld1
cant figure it out for the life of me
probably regex
yeah tried that the library doesnt give me anything useful
yeah that one
yes regex
(\d+) i tried
seemed to do something but i dont know how to capture groups properly
oh
yeah im aware i need help lol
so you need to cache a pattern somewhere
like you know
Pattern pattern = Pattern.something("(\\d+")
and then
uh
Matcher
something
lmao
yeah i have all that
show your code at least
I dont really understand the clazz argument for world.spawn
no clue what to do with the matcher object
while (matcher.find())
and then matcher.group(1) something
i do not remember π
but it should be group
or split on a regex
yeah that would work actually
well split() accepts regex actually
so i guess just pass a regex string there
toTruncate.split("\\d+")
wait no
that would remove the numbers
I posted exact code to spawn an invisible ArmorStand
ah thanks I did not see
can someone elaborate on this? I just want to understand why I shouldn't use static FileConfigurations
you need two splits the same as the stackoverflow shows, if you want to reassemble it after
yeah but then all the numbers will be next to each otehr
so it wouldn't sum correctly
why
that would return you an array
oh i see ok
like 28a15 -> [28, 15]
so to remove everything else i just split with regex
you split to create two arrays, one of the number and one of words
you need to split by a regex that matches anything that's not a number
so perhaps negate your \d+
you add up each char in the number array, then recombine with yoru words array (if you need to)
if its only letters you can use /w
yeah
okay and what kinda strings did you test
oiers1
q2i1e2rosl
the first 2
some random spam
p2p1p2[, 2, 1, 2]
printed the array next to the string
br6[, 6]
[^a-zA-Z]+ gets you all the numbers \D+ gets you all the words
Hello, I tried using mojang mappings and spawning a ServerPlayer, but when starting / reloading the server I get this error
at me.souprpk.areaglow.AreaGlow.onEnable(AreaGlow.java:18) ~[?:?]
Caused by: java.lang.ClassNotFoundException: net.minecraft.world.entity.player.Player``` which then points to a class that has all my nms imports and handles spawning / removing entities
I have downloaded the remapped 1.19.2 version with Buildtools and also have specialsource-maven with spigot <classifier> set to remapped-mojang, so I'm not really sure what could be causing this error
?nms
why does this is not creating a 3x3 portal?
block1x1.setType(Material.PORTAL);
block1x2.setType(Material.PORTAL);
block1x3.setType(Material.PORTAL);
block2x1.setType(Material.PORTAL);
block2x2.setType(Material.PORTAL);
block2x3.setType(Material.PORTAL);
block3x1.setType(Material.PORTAL);
block3x2.setType(Material.PORTAL);
block3x3.setType(Material.PORTAL);
1.12.2
first guess is all your blocks are teh same block not different ones
I already checked this and have my pom.xml setup the same way (only changed the version 1.19.2-R0.1-SNAPSHOT )
No
Block block1x1 = block1.getRelative(BlockFace.UP);
Block block1x2 = block1x1.getRelative(BlockFace.UP);
Block block1x3 = block1x2.getRelative(BlockFace.UP);
Block block2x1 = block2.getRelative(BlockFace.UP);
Block block2x2 = block2x1.getRelative(BlockFace.UP);
Block block2x3 = block2x2.getRelative(BlockFace.UP);
Block block3x1 = block3.getRelative(BlockFace.UP);
Block block3x2 = block3x1.getRelative(BlockFace.UP);
Block block3x3 = block3x2.getRelative(BlockFace.UP);
then you are using the wrong jar on yoru server
Let me check wqith other blocks
locations are corect
then do yoru blockchange without physics
?
setType(material, false)
ijust dont know hwo to replace them back
getting the sums isnt the difficult bit atm
replace them back, ie rebuild the string?
You are the best
you use a StringBuilder adn concat the two arrays
wut
and that would work in the examples i gave
because i feel like that wouldnt
all numbers next to each other get added and put back into the string in the same place, replacing the numbers used
I dont know what you mean by wrong jar? A diffrent minecraft version?
I would go with a simple for loop, going char by char, appending non-numeric characters to a StringBuilder and collecting digits into a numeric accumulator, which you only append when you encounter either the next non-digit or the end of the string.
thanks nice idea
Takes a bit of practise, but I'm sure you can make that work out! :).
Oh, was that actually what was asked about? Because that's immensely different to what I interpreted it as, xD
you are usign arrays rather than strings is all
can server crashes be caused by infinite while loops?
when you build with NMS using special source you get multiple output jars. you are likely using the wrong jar
no you understood it right
Btw, if you face some difficulties with the implementation, this may help: https://paste.md-5.net/irapekuneb.cs
yes
a while loop that doesn't complete essentially blocks the thread it is running on
Hello, I'm trying to create a file like this java File file = new File("plugins/SennyMines/database.db"); if (!file.exists()){ file.createNewFile(); } But I get this exeption java.io.IOException: No such file or directory [18:31:00] [Server thread/WARN]: at java.base/java.io.UnixFileSystem.createFileExclusively(Native Method) [18:31:00] [Server thread/WARN]: at java.base/java.io.File.createNewFile(File.java:1043), why?
folders don't exist
but how can I create a folder automatically?
You really shouldn't be hardcoding paths. You need to check for the existence of the containing folder, if that doesn't exist, call mkdirs.
https://paste.md-5.net/izicozidaz.php
Something along the lines of this, where getDataFolder is a public method of JavaPlugin.
can you earn 6 figs off of making plugins
most will be lucky to break 3 digits
I thought I was the only one, xD
i'm asking cuz it's fun to ask lol
Wouldn't say no, but you've gotta be immensely good at your craft.
Guys what if you ahve the most insane utils class ever
Instantly finish 99% of all projects
well
thats just a programming language
has all the utils to make anything you want
If your plugins are superficial to the degree where utilities get you 99% of the way there, I don't think you'll be making much if anything. The great ideas don't take boilerplate, but rather a lot of logic.
Cmonnn
There's lots of boilerplate in those great ideas
Maybe the strategy is to only accept the easy ideas
and then finish them in 2 seconds with your insane util class
Yeah, but you usually don't think about how you reduce that, this comes naturally if you're doing it long enough. You'll stock up on libs of your own.
That could actually work, not gonna lie, xD. But not for the crazy amounts you invision.
millions
lol
That's messed up steaf...
The mega ideas aren't worth it
If I have to spend weeks making this guys insane minigame for 100 dollars
They are, if you actually take pride in engineering. If you don't, it's likely the wrong field for you. Maybe you can still pull it off, as many others here do, charging insane amounts.
So I should charge some wacky amount
And find the people willing to pay for it, yes, xD.
What if I take too much pride in my own work that once I make the plugin I just can't give it away...
You print it out and use it as a wallpaper in your whole home, :).
lol
What do you do when you just finally finished this man's $10000 commission
but you're just so proud of your precious plugin you can't give it up
Are people actually selling the whole thing? I'd just sell the software, not the rights of the code, xD. But I guess 10k would be something different, yes.
Yeah but just knowing that someone else out there is making off with your precious baby
Who knows how they're treating her
Man, you got too much time on your hand, xD
How much would you charge for an entire recreation of Mineplex's SSM gamemode BlvckBytes
Don't even know what that is, and I don't do commissions, xD.
what libraries should i shade
i already shaded up netty and slf4j
Make sure you relocate them
wdym by that
Relocation is a feature of shadow/shade plugin that changes the package of shaded dependencies
You need to do that to prevent conflicts if the same dependency is loaded multiple times
what's the easiest way to make custom items with custom textures (like mcc island, for instance)? the tutorial im following is https://www.youtube.com/watch?v=XGxn_Mb8VzI&ab_channel=CodedRed, but it was made 2 years ago; has there been any more integration to make this process easier?
Not really
It still works the same way
You just have more customization with shaders and custom characters
and in 1.20 the display entities that can be interpolated
alright, thanks!
has there ever been a pre player death event before
how should i do that i mean should i add something to my shade plugin in build options ? (im on maven)
aight thanks
Don't know what you mean, but it's likely the damage event with health comparison
well there's an unresolved pre player death event in this guys code
