#help-development
1 messages · Page 1198 of 1
Heey where could i start when i want to work on NPC i read somewhere that using citizensAPI is good option but i see that isnt free is it true?
There's the ci where they provide free downloads
You can also buy it if you like it
why isn't the io.netty.util.concurrent.DefaultThreadFactory used here?
like the whole netty depends on the speed of FastThreadLocalThread
and this just makes normals Threads
how did no server engine maker ever notice this?
for 13 years?
does this actually make a difference nowadays
I was under the impression that was just some legacy part of netty when the thread implementation kinda sucked
it's a microoptimization
but a network one, so might make a bit of a difference
How so?
that doesn't answer my question
In what way is DefaultThreadFactory faster
it makes FastThreadLocalThread
yes, but is it actually faster
it has Fast on the name but that doesn't assure me of anything lol
yes, because netty uses FastThreadLocal
instead of Map#get it does array[index]
dassit
;]
so there's really no difference
I mean it's a free optimization
that requires 2 lines of code to change
very slightly
and it gives ~35% speed boost
(it's not like Map#get isn't blazingly fast, I know xd)
where is the benchmark for this
because that sounds ridiculous
is it really an optimization, I am highly doubtful of it
???
why would you believe a benchmark from someone else if you don't believe their words?
again, just because it says it is fast, it doesn't necessarily mean it is
I done it
because it would at least give me some insight on where they are basing this information
why tf are you all on me?
go benchmark it yourselves
that's the best way to make it believable
I mean, you are the one who is claiming it is faster lol so of course anyone would ask for details
^ 35% speedup is nothing to ignore either. I mean extraordinary claims require extraordinary evidence
lol so in otherwords pointless alright that's crazy optimization I wonder if that's even accurate then
anyway, just test out array[index] compared to a small Map#get
on what object
that isn't proof
because some objects have faster hash functions
and what map impl
that too ^
this conversation bores me
like for an Int its hash function is literally just the value
You aren't giving a good defense
well, you asked a question that will bring out all the nerds, so what did you expect
my bad
anyway
I
'm gonna go
we're performance addicts you can't just come here, say "you smell array > map" and expect to leave without a proper explanation
it just stores an index in a fixed array
instead of using the java HashMap<Thread, Value>
jmh both connections
...it broke, and I have no idea how I can fix it
you'd have a hard time even with JMH tbh if it is indeed at the scale they mentioned lol
I've been testing with System.nanoTime ever since
it might fall in the range of acceptable error
with something that small
there are definitely some things that are measured at the nanosecond scale, just not something I'd expect here
tho java uses a specialized map implementation for Thread/ThreadLocal nowadays, not a hashmap
yeah I know
mfw 2 clock cycles can be optimized when a player opens a socket and there are no threads type shit
also, why aren't compression handlers cached?
that seems like a big memory waste
talking about these mfos
isn't using a ThreadLocal like this: a much better solution?
how does MC use them
wdym?
what is the equivalent of that getHandler0 method in minecraft's code
they just do a ```java
new PacketCompressor(compressionThreshold)
for each player
I see, so is your cache more of a pool of compression handlers waiting to be used or do you have a single instance of CompressionHandlerImpl?
yeah, it's a pool
with 4 netty threads, there are 4 compression handlers
and since usually there tend to be more than 4 players online, this would save memory
CACHE is a ThreadLocal
given a packet compressor would be created upon initialization of the connection, pooling the creation of compression handlers doesn't seem all that important given they're only created once and used over a relatively long period and compression handlers are cheap to instantiate
if they were not cheap to instantiate I'd understand more
I mean 8KB of mem isn't much
but every time I look into any server engine's code I see multiple, even very slight optimizations
so I think this would be a good one
is it an optimization though, how much memory are you saving and what's the sacrifice here
nothing is sacrificed
cool so you're saving 8kb of ram for each player
say, isolating only compression handlers, I assume one would be created per player so for 60 players it'd be 60 compression handlers in a standard minecraft server, that means 8kb * 60, is that accurate?
if you have 100 players that's 800kb
well 8KB per player is saved for each player above 4 players
ye
I guess 0.8MB isn't anything
then your code would re-use those 4 handlers for the 60 players
aight, nvm then
right?
yeah, they would be shared
you just spent 15 minutes ranting about it
Assuming 20$/hr that's 5 bucks
you can get 16gb of good ddr4 for about 30 bucks
that's 53 cents per gb
does this not create some churn when it comes to high volume of packets to be compress across multiple connections
nope
congratulations you just saved 0.00053$ in memory for 15 minutes of your time + some compute
I don't think it is nothing, if it doesn't necessarily cost some performance due to the instances beeing shared, saving memory is always a good thing
finally my maniacal nanooptimizations are understood by someone
I would be worried it did cause some performance issue with high volume of packets though
Saving wasteful memory is aite, micro-optimizing tiny things is a waste of time
thank you
...it wouldn't
don't forget you're using java. rewrite the game in rust or whatever and you'll reap the real benefits
xd
okay but usually I won't care about 1-2 megs
well I am sure
i'd rather use 32mb of ram than spent 2ms looking something up type deal
ok but we have enough memory-
compressors would have to be shared, so I can't see that not being the case with high volume of packets across different connections
we pay for memory, we're gonna use the memory!
I've seen prod servers run with 100gb of ram lmfao
netty has (by default, on minecraft servers) 4 threads
those 4 threads handle absolutely everything netty does
I've run a server with 140 gigs before
minecraft servers?
that's crazy, whoever is doing infra should get fired
that was only cause I was bored
each compression handler instance should be used on a single thread
eh
if it's compute heavy it's aite
if it were a single instance holding a redis cache or something, sure I understand
or if it handles like a trillion players type shit
folia
but minecraft servers won't use 100gb of ram per instance
- 2^31-1 players
even if you were to hold 100 survival worlds in memory, you wouldn't use 100gb of memory lol
that is theorically since no server would be able to handle 100 worlds with a single cpu unless they did some black magic to the server code
now I wanna try
in memory worlds type shit
the cool thing ab it is that you can have nasty memo leaks and the server wont care for a good while
just let it leak and restart the instance™️
Map<Player, Whatever> go brr
ok but serialising MinecraftServer is even better
why don't we just weakreference bukkit entity nms handle
@shadow night
bukkitobjectoutputstream go brr
BOOS 💀
System.gc() every tick for memory optimization
🧠
Thread.sleep(Long.MAX_VALUE) for multi threaded spigot
FastAsyncMemoryEfficientMultiThreadedSpigot
FAMEMTS that flows sooo well
Maybe in some years when those quantum processors have been developed :o
Quantum spigot when
in 500 years
there will probably be no discord anymore
economy will be dead
and spigot, no minecraft
😿
that's what people thought a decade ago, yet we are still here
doubt minecraft gonna die anytime soon
I am going to keep playing bedwars for as long as hypixel is alive
There's a chance we are in quantum spigot instance
ill give you a gold star for effort
i mean they have these small 100 qubit processors or whatever it is
"qubit logical gates"
Why is the ñ showing like that when using ChatColor.translateAlternateColorCodes??
Also this:
Does this make sense?
make sure to compile with UTF-8
or read with UTF-8 charset if that's within a configuration file
I believe I'm doing that
did you set it in your pom.xml?
Ye
is that a string in source code or in a file?
In a file
In config.yml
how are you reading it
oh apparently you also have to configure the encoding in the maven compiler plugin
hmm, how can I do that? Not so familiar with maven srry
I have intelij setup to use UTF-8 but didn't work
hm, it seems that it defaults to project.build.sourceEncoding so it should be fine
is the config.yml UTF-8 encoded?
this is a thing apparently
make sure you are running your server with -Dfile.encoding=UTF-8
i wonder how far can you push java's type system to evade runtime checks
I can possibly win the lottery today
i really like parse dont validate approach
I am possibly the president of the united states
but im not keen on creating validation class for each logic
rn im writing basic open renderer using lwjgl and im thinking of abstracting opengl shader nonsense into OpenGLShader class
the problem relies on the fact that opengl api is very unsafe tbh due to how its bindings are from C
so there's really no encapsulation since its a state machine
you can get pretty far with records honestly, but I'd wait for valhalla to do this kind of logic in Java
what im thinking is that i would have something like
public class OpenGLShader implements AutoCloseable {
public void CompiledOpenGLShader compile(CharSequence sequence) {}
}
that way i can exploit type system to provide compile time errors if i provide a parameter for another method as CompiledOpenGLShader
but this sounds ok, but we all know that when we have multiple parameters, inheritance doesnt really work anymore
what if shader is also attached, should i create CompilerAttachedOpenGLShader, this just sounds dumb
will save using the system default encoding
or possibly utf8
meanwhile: Writer writer = new OutputStreamWriter(new FileOutputStream(file), Charsets.UTF_8);
system default encoding my ass lol
encoding is literally the biggest pain in the ass in terms of IO file handling
file locking is also kinda pain
do all implementations just use this
i mean, there's only YamlConfiguration in the api, and the method isn't overridden from FileConfiguration so yeah i guess so
Ill try, Maybe it has something to do that i'm using java 8 and minecraft 1.8? (Yes I know is super old and unsupported but I need to use this version srry)
I am not well-versed enough in OpenGL or shaders in general to answer this question, however here's what chatgpt has to say about it if you are bored:
https://chatgpt.com/share/67673214-b874-800f-80b6-8d4a76bfec41
I wouldn't rule it out
now make raytraced spheres
you mean shiny balls?
yeah, but with ray-tracing because baked lighting is for kids
it is possible, just not very efficient
if i construct CompiledOpenGLShader from OpenGLShader's class compile(CharSequence source), the new object would still point to the same opengl state id, so i can fuck CompiledOpenGLShader state just by recompiling wrong code from OpenGLShader class, unless i deliberately create new shader on the state, by isolating previous shader, but that's just dumb
by typesafe i meant compile time typesafe
that's even harder if not impossible due to how opengl is a state machine
i really like the idea of type system exploitation for validation
but for some things i cant seem to make it work
I think you're trying to recreate a language server
you could probably make do with annotation processors too, lots of people use them for diagnostic purposes
annotating classes/methods just to check them does sound ugly though
i guess i can do something like this:
import org.lwjgl.opengl.GL33;
public class OpenGLShader implements AutoCloseable {
private final int id;
public OpenGLShader(final int id) {
this.id = id;
}
public static OpenGLShader create(final OpenGLShaderType type, final CharSequence source) {
int id = GL33.glCreateShader(type.getCode());
GL33.glShaderSource(id, source);
GL33.glCompileShader(id);
if (GL33.glGetShaderi(id, GL33.GL_COMPILE_STATUS) == GL33.GL_FALSE) {
throw new IllegalStateException("Failed to compile shader: " + GL33.glGetShaderInfoLog(id));
}
return new OpenGLShader(id);
}
int getId() {
return this.id;
}
@Override
public void close() {
GL33.glDeleteShader(this.id);
}
}
it only allows you to construct the OpenGL shader if you have the source for it and its been sucessfully compiled
else it throws exception
from that point i can pass this OpenGLShader object, ensured that the instance of OpenGLShader is compile-time type-checked and runtime parsed and it is ready to use for the program object
this minimizes the need to check for validity for each time it encounters that shader
and you only expose getId() as a package-default so that only OpenGLShaderProgram can access the shader id unsafely by its id to attach it to its internal opengl program object state
I really like this, but there one cons of this technique: Its not scalable!!!!!!
If you want to have combinations of multiple things, you cannot do that, so usually you make domain level types instead
also the problem is that you can call close() externally and i will fuck the OpenGLShader object. But this factory method's function was to compile code and validate that its compiled and not check its lifecycle so
or... i can skip OpenGLShader class and opt in for Program class instead for compilation of shaders (its not as if shaders can be used outside of program object anyways):
import org.lwjgl.opengl.GL33;
public class OpenGLShaderProgram implements AutoCloseable {
private final int id;
private OpenGLShaderProgram(final int id) {
this.id = id;
}
public static OpenGLShaderProgram create(OpenGLShaderData... shaderData) {
int programId = GL33.glCreateProgram();
for (OpenGLShaderData data : shaderData) {
int shaderId = GL33.glCreateShader(data.getType().getCode());
GL33.glShaderSource(shaderId, data.getSource());
GL33.glCompileShader(shaderId);
if (GL33.glGetShaderi(programId, GL33.GL_COMPILE_STATUS) == GL33.GL_FALSE) {
throw new IllegalStateException("Failed to create program shader: " + GL33.glGetShaderInfoLog(programId));
}
GL33.glAttachShader(programId, shaderId);
}
GL33.glLinkProgram(programId);
if (GL33.glGetProgrami(programId, GL33.GL_LINK_STATUS) == GL33.GL_FALSE) {
throw new IllegalStateException("Failed to link program shaders: " + GL33.glGetProgramInfoLog(programId));
}
return new OpenGLShaderProgram(programId);
}
public int getId() {
return this.id;
}
@Override
public void close() {
GL33.glDeleteProgram(this.id);
}
}
with this i can be completely sure that that program is ready to be used within renderer if it was created within the renderer
Would it be a bad idea to use the BungeeCord APIs ChatEvent for stuff like staff chat and maybe chat filtering? I ask because these involve cancelling the event, and I'm not sure how well this works by executing these events on the BungeeCord. I understand that Spigot runs an asyncronous chat thread, does this wait for bungeecord to respond or no.
staff chat sounds fine to me, chat filtering might prove somewhat annoying
How so
well, you can't set messages yet if I remember correctly
https://github.com/SpigotMC/BungeeCord/issues/3336 the issue about it is still open
Really? I feel like-
Ohh
I was going to say, I thought I saw the method in there but I guess it doesn't matter if it doesn't work
there is a workaround it seems with a plugin like this: https://github.com/Xayanix/BringBackChatEdit however I don't know how well that works
you can give it a go though
Alright
Here's another question, if you have several spigot servers running on the same computer to pool resources, is it possible to have one, almost like a shared API that runs the same core for each spigot server? Just so that you don't have to be loading an identical core for each server?
that's what people have a shared database for, then just a plugin/library to standarize communication with the database between the different servers and for the different actions
people also put a redis cache on the line or use pub/sub systems, it all depends on what's more familiar to you and how well-versed you are about infra design
I know, but lets say you had 3 Lobby servers each with identical plugins. You have all three servers running on the same computer to pool resources. But I'm pretty sure, wouldn't the JVM have to load the same plugin jars three times and keep them loaded during execution? Is there a way to only load it once?
Or have I got something wrong here
Also, you didn't answer my question earlier about whether or not the spigot Async chat event waits for the BungeeCord API's ChatEvent
the proxy receives all the packets and then forwards to the backend servers, so yes, if the proxy cancels or never returns the event, it'll never receive it
Alright
due to how tightly coupled plugins and the server are, I doubt you'd be able to achieve something like that, if it were more modularized, I'd recommend something like layrry for it though
then again, you could have your lobby instances all share logic by having all the logic on the proxy instead of the backend
then just communicate the necessary information to the backend servers
you'd have to switch all your plugins to proxy ones though which depending on what they do, it might not be as easily possible but for lobbies, I don't see that being the case
I also recommend using lobby-specific software like a stripped down minestom impl or something like limbo servers out there for maximum performance, that way you don't waste much on the lobby instances since they don't need much processing done anyway
Yeah, this was more of a hypothetical question. But this is fair. For my specific usecase, I have several gamemode servers running the server core, and I just wanted to know if these servers were running on the same computer if I could then not load this core on all three server instances.
And it also goes beyond the plugins, but the server architecture itself
I just realized
I could modify spigot to run multiple server instances, but that'd take forever
it is technically possible, by using some black magic and modifying the server classloader kek, probably a fun pet project
IntelliJ is saying "vulnerability found" in my craftbukkit dependency... is that an issue?
no
You sure I think it's probably not good I wasn't planning on them finding that backdoor I put in

so thats why paper hardforked
No paper didn't find it
They still have their TotallyNotAVirus.patch
It's a binary patch too btw
hidden in the server icon patch btw /s
Yeah I wish leaf would stop trying to remove it 🙃
i hate java streams api
why does it have mapToDouble
when it doesnt have mapToFloat
whoever thought to not include mapToFloat inside Streams api is 🐒
floats
is anyone able to vc and i ss my project
How could i make a mob has a bossbar that lowers with his health?
task timer that checks the boss health and cancel when he dies and updates health each delay. it's the most basic answer 😛
You can update it in the damage event
Why won't it let me install Spigot 1.8.8?
this dev or #help-server related?
if you are fine with using preview features, you can use stream gatherers:
public static <T> Gatherer<T, ?, Float> mapToFloat(Function<? super T, Float> mapper) {
Objects.requireNonNull(mapper, "mapper must not be null");
return Gatherer.of(
(_, element, downstream) -> downstream.push(mapper.apply(element))
);
}
they're gonna be final for jdk 24 without API changes so you could use them just fine
if you want something exactly like the other map methods, you'd have to make a FloatStream, shouldn't be hard but kinda annoying honestly lol
why not just use map?
FloatStream when
great question
that method would've been more useful if it actually provided a FloatStream
Yea true
is there a way to make bigger resolution maos?
maps?
i know you can place more maps on a wall but thats not what i want
there is it's called wait for me to finish Helix
kekw
you mean like, bigger when holding the item?
hi, i dont know after using ```plugins {
id 'java'
id 'java-library'
id "io.github.patrick.remapper" version "1.4.2"}
does it has to add repositories and dependencies?
i mean more pixels, its 128x128
even if you make it bigger in cartography table, its also 128x128 but 1 pixel is 4 blocks
bruh what
wron channel i guess
I have a example.txt file in my ressorces foulder and would like to create a file into the plugin foulder with the name and the content of the example.txt in my ressorces foulder how can i do this
Just adding the plugin isn't enough
you need to configure it. See the README file
also only if the file doesnt exists yet
plugin.saveResource("example.txt", false);
you can use that or just the standard java file api, either way works
just this?
yes
and its automatically that the file only createws if it dont exists yet?
ah okay thanks
declaration: package: org.bukkit.plugin.java, class: JavaPlugin
what I understood is it like, download buildtools, then generate a jar ?
okay thank you, do you also know how i can create the file in another foulder
not in the main foulder
thanks
nio 
what does your build.gradle.kts look like
put it in a paste
?paste
im getting this error
java.lang.IllegalArgumentException: The embedded resource 'example.txt' cannot be found in plugins/ItemSpawner-1.0-SNAPSHOT.jar
at org.bukkit.plugin.java.JavaPlugin.saveResource(JavaPlugin.java:209) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]
at eu.tomlegend.itemSpawner.ItemSpawner.onEnable(ItemSpawner.java:485) ~[ItemSpawner-1.0-SNAPSHOT.jar:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:281) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]
at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:189) ~[paper-1.20.1.jar:git-Paper-196]
at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:104) ~[paper-1.20.1.jar:git-Paper-196]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:507) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]
at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugin(CraftServer.java:642) ~[paper-1.20.1.jar:git-Paper-196]
at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugins(CraftServer.java:553) ~[paper-1.20.1.jar:git-Paper-196]
at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:635) ~[paper-1.20.1.jar:git-Paper-196]
at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:434) ~[paper-1.20.1.jar:git-Paper-196]
at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:308) ~[paper-1.20.1.jar:git-Paper-196]
at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1100) ~[paper-1.20.1.jar:git-Paper-196]
at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:317) ~[paper-1.20.1.jar:git-Paper-196]
at java.lang.Thread.run(Thread.java:840) ~[?:?]```
but i think i created the file right
did you recompile the plugin
yes
im not using kts, just normal gradle, what i dont know its like i inserted the ```plugins {
id 'java'
id 'java-library'
id "io.github.patrick.remapper" version "1.4.2"
}
...
tasks {
remap {
version.set("1.20.1")
}
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
open the jar with 7z or something, check if the file is there
Are you using maven or gradle?
maven
How did you compile your jar
you're missing the dependencies block
Did you select the remapped flag when running BuildTools
whats the dependencies. for that
i just only have ```dependencies {
compileOnly 'org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT'```
You don't really need that
for some reaseon the file is named Example.txt not example.txt
this is why I asked for the whole thing
you are using spigot-api, not the remapped spigot jar
dependencies {
compileOnly("org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT:remapped-mojang")
}
Remapper will take care of that
remapper will only do the special source task, not add it to classpath as far I was aware
I don't remember having to do that when using it
Nor does the github instructions tell you do add it
do i need still need to use the buildtools ? or with that good to go for using net.minecraft classes
Yes
BuildTools with the remapped flag
you need to use build tools with the remapped option but that's only once
and make sure to build 1.20.1
oh, then where do I put the jar of that
well, you may want to do it regularly if you are using latest but you aren't
i decompiled it and there is no file example.txt why?
that is what the ?nms guide does
that's really strange, it shouldn't randomly try to capitalize a file name
Are you sure you're not using an old jar
what does your pom look like, just to be sure
when decompiling it there is instead of example.txt Example.txt with the contect of the example.txt from ressorces
Hey, I'm currently working on an UHC Marvel plugin in 1.8 but there are some things I'm not good enough to work on it so I'm searching if some people are willing to help ^^'
Too old! (Click the link to get the exact time)
no way the bought the domain for this
you don't have to set the resources folder manually, it is src/main/resources by default
other than that, I don't know honestly, could be maven shade doing dumb stuff?
can you disable shade plugin just to check
comment it out
?howold 1.8
Minecraft 1.8 is 10 years, 3 months old.
where can i do this
just comment it out in the pom
which line?
okay, i got this spigot-1.20.1.jar
probably be better if they just showed their pom
they did, it doesn't have anything glaring
see here
what do you mean by comment
ig i will just keep it under the name Example it doesnt really matter
its probably the filtering
they should set it to false
yeah I was just checking that too
didn't think filtering would affect the file name but I guess it is a thing lol
well filtering doesn't mean to remove persay
it does some manipulations based on rules
I've only ever used it for placeholder replacement
I have a plugin for that
gonna have fun with this one
ew no codeglance
why not just use the maven-resources-plugin filtering for something like that
because this is simple
didn't need something that can do complex stuff when I don't need such functionalities
and at the time, I don't think that existed and I just never bothered changing what works
KISS
I don't think the filtering is complex, just the naming is confusing
you wouldn't expect a "filter" to do token replacement
well it is a form of filtering
it is, just that one doesn't usually perceive filtering as a mutative operation per se
hey the colors match your name
so that is good right?
why do you have so many errors
did you do a merge
that's always fun
yeah, never a fan when a dependency update causes literally everything to break
maybe he's a sadist and likes to suffer
lmao, imagine
lol
I'm doing kotlin explicit API mode now
After doing my regex magic, I've reduced that down to 17 errors
im having error
we all do marks, we all do
after I putted the jar into my main plugin carpet file then using that compileOnly("org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT:remapped-mojang") says unresolved dependency
thanks IJ
Did you run buildtools
With the remapped flag
yes
and the jar file into my main plugin carpet folder.
throwing like Could not find org.spigotmc:spigot:1.20.1-R0.1-SNAPSHOT.
the jar calls spigot-1.20.1.jar
try adding mavenLocal() to your repositories
yeah you need that
oh
omg
👽
🫶 no homo
oh, quick question
implementation "com.mojang:authlib:X" where do I see like these stuff what version could i use to 1.20.1
and what does jetbrains do
I don't think you need to depend on this
oh, okay
and I am unsure of what you're referring to with jetbrains
jetbrains is a company that makes ides like IntelliJ
oh, i saw like other plugins using jetbrains library, but im not aware that what does .
You mean annotations?
probably for the annotations
oh
they have quite a couple of libraries, but it is probably the nullability annotations yeah
nowadays you'd prefer jspecify ones though
why
it is the community consensus
Standard Annotations for Java Static Analysis
damn what a nice game
okay, next probably to figure how to use the Rad`s inject repository
for what are you using it for
alr good to know I guess lol
Hosting resourcepack on the server port
since im newbie , just start learning local resource custom pack of a green apple item.
Check the javalin example module
fuck
this one is supported by most of the members, but yeah xkcd applies
Thank you
Thanks you
I made a lil vencord plugin for XKCDs
Jetbrains supports it?
Yea
But don’t they have their own
Yup
Wack
The IDE understands more than just Jetbrains annotations
It supports most of the ones in use
(all of the ones I'm aware of at least)
I mean, jetbrains ones just existed before jspecify became a thing
do I see another eclipse L?
I love public final inline fun reified
fun
OpenRewrite has recipes for migrating from all known annotations to jspecify luckily, so it isn't so much of a burden to do it
a spec for automated refactoring
but if I use that, I can't spend my time procrastinating :(
i gotta cook some of those recipes then
🤣
rad
implementation("net.mcbrawls.inject:spigot:3.1.2") cannot use it, im on java 17
i dont know what version I could use
:C
No idea how to deal with older java versions tbh lmao
@chrome beacon perhaps you have any ideas
This a decant place to ask for help with nms and packets?
yup
Trying to make it so that an npc is sleeping using nms and packets. I have the npc spawning I just can't seem to find the right packet to set the position of the npc. I am trying to use the ClientboundSetEntityDataPacket but I can't seem to get it to work, I even tried creating a list of synced data values for it
serverPlayer.setPose(Pose.SLEEPING);
gamePacketListener.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, serverPlayer));
// Npc laydown
List<SynchedEntityData.DataValue<?>> entityDataList = serverPlayer.getEntityData().getNonDefaultValues();
gamePacketListener.send(new ClientboundSetEntityDataPacket(serverPlayer.getId(), entityDataList));
gamePacketListener.send(serverPlayer.getAddEntityPacket(serverEntity));
spawnedNPCs.put(name, serverPlayer);
}```
Can send the full code for spawning the player if required. Also should mention this is for 1.21.3
1.20.1 should work with Java 21
if not see if you can update to a more modern version
How is Bridge training server lobby made???
Does anyone have any ideas?
I want to write a plugin that creates a lobby with the maps I have in .slime format
I have no idea how Bridge training maps work
I want to be able to use custom maps, now I'm only stuck at this stage of the maps, almost everything is ready.
You can use custom maps without the slime format?
Wdym, yes, I can use them, but isn't it more optimal to use swm?
Not much
For example, I want it to be like this, every player who comes will have a map added, then if the player wants, he can customize it, if he doesn't want, he will go with the normal map. After playing, the map disappeared .... I don't want the server to be pressured
Custom how?
From different preselected maps or can they build their own maps
also how large are these maps
pre selected
Then one way is to just have one world with all the maps in different locations. Then teleport people to the map they want and then handle the blocks per player
If you want to be extra optimal you can use Minestom instead of Spigot so you don't have any unnecessary features loaded
Good idea, thank you for your help
https://www.youtube.com/watch?v=PSnPOYeTW-0
in this insane video of this guy he said that servers are able to get inputs directly at 5:55
WASD, in 1.21.4
does anyone knows how?
Adding bodies to my procedural spider.
Previous Videos:
2. https://youtu.be/r70xJytj0sw
Source Code:
https://github.com/TheCymaera/minecraft-spider
World Download:
Spider Garden: https://www.planetminecraft.com/project/spider-garden/
Ambertry Forest: https://www.planetminecraft.com/project/ambertry-forest/
All...
PlayerInputEvent
ty
?ask
If you have a question, please just ask it. Don't look for staff or topic experts. Don't ask to ask or ask if people are awake or available. Just ask the question to the channel straight out, and wait patiently for a reply. Make sure you use the right channel regarding the topic of your question. Create a thread in case the channel is already in use!
i love opengl. Sometimes it freaks out that sequence is operation is not right and provides NO ERRORS AT ALL.... but sometimes it forgives you and allows to do operations out if its sequence
turns out i've wasted 4 hours of time just because opengl glVertexAttribPointer was called before vertex buffer was binded
no one helped, neither google, neither people, neither ai
and there's literally zero info on operation sequences
I LOVE IT WHEN I CAN ENABLE VERTEX ATTRIBUTE:
GL33.glEnableVertexAttribArray(index);
BEFORE SETTING IT UP VIA:
GL33.glVertexAttribPointer(index, count, type.getCode(), attribute.isNormalized(), type.getByteSize() * count, offset);
WHICH MAKES NO SENSE SO IT SHOULD CRASH BECAUSE THERE'S NO DEFINITION OF OPENGL ATTRIBUTE POINTER... BUT IT DOESNT! WOW!
BUT SETTING UP POINTER BEFORE INTIALIZING BUFFER:
GL33.glBindBuffer(code, buffer)
CRASHES THE WINDOW! AND GUESS WHAT IT PROVIDES NO ERRORS VIA:
GL33.glGetError()
I LOVE IT WHEN I NEED TO DEBUG THIS WITHOUT NO KNOWLEDGE OF WHAT ITS DOING. GOOD JOB OPENGL 🤬
Welcome to graphics programming
i guess to prevent such dumb issues, i will implement a method which takes both attribute data and vertex buffer data arrays instead of decoupling them. this is just dumb api
is it possible to make this effect appearing without spawning an enderdragon ? And if yes is it also possible to change the size of the effect? https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQyziwZb4j5JkAEWLq8OJLmlEX18J5SjKq8N1rwX-lXmt6dBTmx6cJ8B46QkV9cOLczFTk&usqp=CAU
You might be able to fake it, but you can't make it bigger
like spawn the dragon invisible, then kill it and turn it visible. But that will likely be janky
where is the guide for exporting in the server directly
exporting?
probably building
If you’re using maven for your Spigot plugins (which you should do), it’s easy to make maven automatically save your plugin’s .jar in your plugins folder. There’s two ways of doing this: 1. The lazy way (not recommended) If you only work alone on one computer, you can just directly declare the output location in...
thx
How would I send a player to another server (using velocity) If thats possible idk
?pmc
mhm okay, but i found this clip on reddit and obviously somebody found out a way to make it bigger https://packaged-media.redd.it/owp8d594h1l31/pb/m2-res_360p.mp4?m=DASHPlaylist.mpd&v=1&e=1734894000&s=636f91db24d5685103c87aefa71a42729a0db22f#t=19.334806
but with the code he starts flying in an instant as soon as i press jum
This value must be zero
WHY DO YOU INCLUDE IT THAT THEN
i would get that if it was deprecated or smth
there's literally no mention of deprecation
its just there
how to have multiple textures on one item using custom block data?
(phillip told me to ask this)
hes too scared
It's custom model data
A tutorial on how to use custom model data in the Minecraft 1.21.4 update.
Example resource pack: https://ewanhowell.com/resourcepacks/example-custom-model-data
Custom model data is kinda pointless in 1.21.4 to be honest, you can just set the item model directly on the item using components, so you should probably do that instead ¯_(ツ)_/¯
Ch...
thx big dawg
Actually don't use that tutorial if you're on <1.21.4
https://pastebin.com/pE5Tzz1d so basically I want the player to start gliding if he jumps down from the spawn which should look like this: https://streamable.com/bufabi
but with the code he starts flying in an instant as soon as i press jum
some1 can help me? i am trying to fix it for 6 hours already i really aint good at java
hes on 1.21.4 he says
Yea that'll only work on 1.21.4 and higher
https://www.youtube.com/watch?v=Cw8PPPEl_IQ is also a good one
A huge thank you to Violet for teaching me all of this: https://twitter.com/violxiv
A stream where I make hats: https://www.youtube.com/watch?v=PfHN7cO87sc
Minecraft commands, particularly around NBT values have changed from 1.20.5 so I've updated them below for those who need it :)
00:00 - Intro
00:50 - Creating your model
06:49 - Texturing ...
nah hes tryna have different textures like varients for the fireball or ghastball or what ever its called (i forgor)
Are you trying to have different textures for an entity or what
That video is for items
I was about to say why does that look like martyn
Is is martyn
It is
he apparently needs 100 different textures for the firecharge item
Is he animating it
ok
bump
any idea how to fix when two players view the same inventory and one of them exists it the other player inventory contents are deleted somehow?
Sounds like you have some code clearing inventories
Only 1.21.4 right? Because i didnt saw that before
.3 iirc (well .2, but .2 doesn't exist)
does EntityDamageByEntityEvent can detect when a arrow hit a enderman?
i swear people are keen on supporting 1.8 no matter what
someone's trying to port Sodium to Minecraft 1.8
why people playing 10 y/o version of 15 y/o game
Servers for 1.5.2 are still active
xD
No
thats bad
As if there isn't one already
People! I want help with something I could not figure out when I initially made my server. It is a a latin-only server (as in the ancient latin, not american spanish) - we have a custom translation to replace the shitty GT one provided by Mojang and it is in an automatically downloaded resourcepack - the problem is that the language then still has to be manually set by the player to the custom language. Can I make it, so that the server would force a particular language upon entrance?
Don't think so
Well yes
Presumably you've forced the resource pack
omg spigot admin
You can just copy the latin lang file and rename it to en_us
or just copy it for literally each MC lang
Big brain
That can be done through server properties
Or make a tool for that
You can also propose changes to the Mojang pack via like crowdin
I did, I'm tryna find it rn but my terminal freezes as soon as I try to navigate to my HDD
Our translation is complete and I am still adding vowel lengths for the final version.
Oh so you are doing late latin? (Or was that early? Can't remember)
I am doing Latin overall
There is also mediaeval vocabulary for later concepts
There are like 5 different latins, isn't there
But everything with vowel length
Early, middle, late latin, vulgar latin, classical latin, whatever, no idea
Oh that's fun, I know Latin
Mostly reading only though, so translating to Latin is pretty good
classical Latin still had the vowel lengths and is the grammatical standard that was followed for millennia to come - although there are some quirks from Late Latin that are also accepted
I believe it is
😄
Lorem ipsum dolor amet
Speaking Latin sounds like such a cool thing to know
My server is already up for like half a year and people play there from time to time
Or even enjoy reading principia in the original form
It is under my latin only discord server
I did actually read it through
A lot more boring than I hoped
I didn't
is it really
Anyway you can do something like this, I just cloned the MC assets (https://github.com/misode/mcmeta/tree/assets) and wrote my languages to all those files
Still bad at math to understand that
i thought lorem ipsum is Sims language
I would join if I was allowed to learn latin instead of spanish but my school said no
Joining Latin only discord server be like
Everyone is allowed to learn what they want
salve
Can't get grades for knowing latin tho
You don't need school to do that. I never had Latin at school and I teach it as someone actually from STEM
equality != equity
exit
I don't like spanish, I like latin and they force me to do spanish :(
You can get pretty much all resources for free
Would be more efficient if I learnt spanish tho
Spanish is great
and very easy for my mother tongue
Plenty of content too
I don't like spanish
With Latin having milllions of scans out of copyright I am already never going to run out of material to read
Lifetime worth for free
Guys we forgot esperanto
What does this mean?
hi
Don't just exit 😭
Hi
But how much of it is still useful information nowadays?
Well, depends on what you read. I am paying my school expenses by tutoring a miss from the archive, who is translating court readings
Based Caesar with the Bello Gallico
Even plenty of stuff is in 19th and 20th century
Yeah nvm my comment
Just not as much
Latin is awesome
Yeah, now you know why all science stuff is Latin vocabulary
Ye
Is this my help?
Yea
Ah, so I would replace every language file
I hope that would not be too long to load though. Each lang file is like 6k lines
But alright, I will try it.
Shouldn't be, should all compress to the same
Grátiás tibi agó
@echo basalt Were you talking about something like this?
public interface DailyTypes {
DailyType dailyType = null;
Block block = null;
EntityType entity = null;
ItemStack itemStack = null;
void setDailyType();
void setBlock();
void setEntity();
void setItemStack();
}```
fields in interface is public static final yk
Im creating a plugin and in one of the modules I have to modify the Tablist, the thing is that i need to order all the users by rank, but it doesn't work properly, can someone help me?
That's the code
I did not know that.
Yeah you gotta make getters and setters
inside the interface?
never used interfaces properly.
okay, nvm my last question. looked into interfaces
Is it posible to detect when a player shoots an enderman?
Have you tried entityDamageEvent?
declaration: package: org.bukkit.event.entity, class: EntityDamageByEntityEvent
EntityDamageByEntityEvent
something has to detect it right?
Can anyone link resources for how custom animated VFX work? I know you need a resource pack, but is it just like...an item display that uses the animated texture you want?
ProjectileHitEvent might be better for this, since endermen don't necessarily take damage from being hit with arrows
Not sure if it fires EntityDamageByEntityEvent when they're hit by a projectile
It really depends on what you#re trying to achieve
can you show an example of what exactly you are trying to do. theres different ways of doing it
Yeah. Something like these https://www.youtube.com/watch?v=IalBwCsl4Uc
This is not a mod! (More description below in "NOTE:")
MMORPG classes in Minecraft - Dragon Warrior Class
Get The Dragon Warrior Pack now:
https://samusdev.com/product/rpg-class-series-dragon-warrior/
Also on MCModels:
https://mcmodels.net/model/rpg-class-series-dragon-warrior/
Requires MythicMobs
ItemsAdder support
[MMOItems, MMOCore]
Chec...
What part exactly
The actual VFX
That mostly just looks like item displays
yeah those are just item displays
does look really cool though
oh yeah, much nicer than using particle effects - I worked on an RPG server like 10 years ago before this was a thing, so we just used particle effects, and it made it hard to discern what abilities were being used in PvP lmao
You can do custom sounds from a resource pack by just using the playSound method with a string instead now, right? Last time I did serious spigot dev was several years back
Yeah
awesome
You can add custom sounds with a resource pack and then you just put in the key
it's nice that Mojang (and by extension Spigot) has added so much support for this stuff lmao
They're working on making items datadriven now
yeah
oh shit
resource packs can now basically work like full mods
got a link to that? or a summary idk
that's quite nice
I know you can do custom shaders now too? but it seems a bit difficult to wrangle in vanilla still
Yeah you can do pre-, post-, and core shaders
oh damn. thanks lol
Data-driven items are gonna be stored in those jsons
good god. that was the case in like 2010 when I did Modloader mods
They're still just hardcoded into some registries, but less hardcoded than before
i was 11 lol
Yeah data-driven is like...how you make a game properly modular, gmod style
Is it ok to use system out println to debug? (Not for information to the server)
Yes
yeah
tbf Mojang does know that modders/plugin developers/Bedrock content pack creators are why the game is alive still, the CTO said as much at a talk I went to last year
So no one will blame me for bad code if I send code with debugging with system out println?
I never like proper debuggers anyway, just put prints all over my code for each step
Use whatever works for you to debug, just don't package it into the .jar when you're done lol
I never figured out how to use a proper debugger for spigot anyway
This is the kind of stuff that's possible nowadays
(This is a fucking datapack)
(like holy shit)
not minecraft anymore
honestly though it is indeed just using minecraft as an engine and the modder codes a whole game on their own
The reflections are better than UE5 lmfao
Yeah that's the shader fuckery
For some reason in Fortnite, HUD elements appear in game as reflections.
??
Like only world components should have reflections, but i've seen times where in Fortnite and other unreal engine games, things that are only visible on your screen are reflected in water, like hit indicators or whatever.
Its crazy to see a datapack handling reflections better than a game engine
That's not an engine problem
Just the game?
yes
that is a fail on the game dev side
also I'd love to see an image of that
because I find it real odd if epic messed up that bad in their own engine
hang on hang on its in my dms with someone
Epic is totally good if the dev knows how to use it
it is actually the best available engine imo
that some sick shit that i've always dreamt on doing but that required the knowledge of proper shader language and exploitation of certain datapack features that will take ages to search
Unreal default settings and such aren't the best performance wise
Unreal is 100% the strongest but Unity's the easiest, especially for a solo dev
I am developing a game in Unity rn
FOUND
i dislike unreal
its just shit for performance
what the fuck is a game engine
nanite and lumen arent a solution
^^ it's a powerful engine but the performance is 💀
City demo 💀
Epic store gives you cooler treatment if you use their engine, so if you actually intend to publish there, it is good to switch
iirc
okay here
All games made in UE look.. How do i say. . fortnite'y
they all have their cartoony feeling
i cant describe
That is design of the games
Nothing to do with the studio
you can play with textures and shaders as you wish
i wish games focused more on 2012 gritty looks
this is because the developers don't replace the default shaders
@chrome beacon
That is highest settings possible in Fortnite, everything is maxxed out, and i'm using DLSS to 4K (not that AA is doing much here). But if you observe, it's reflecting an onscreen element, those little hit indicators, into the water.
you dont even need to replace shaders to do that
there's plenty of shading options in UE
That's probably just intended
It's part of the trail
Really? thats an onscreen element only visible to you, its basically the same as ur compass in the top. Theres no reason for it to be reflected.
Its an accessiblity setting for the hard of hearing, to visualize sound location.
The first is more realiiitc though
Yeah modern games love TAA which causes that blur
im probably the weird one who always disable anti aliasing
i just like the crispness
of having that off
im trashing UE games
meanwhile i cant import a single 2d texture via open gl
kekw
atlasing issues?
lol
not only is the work difficult (I work in rendering and graphics, so lots of high tech shit), it's stressful and you have to deal with the fact that the people in charge are just trying to milk a cash cow
I get paid pretty well but like
bruh I'd rather be an indie dev
yeah I expected that
for some odd reason texture gets red tint
i do not blend colors
might be something up with texture blending
would probably help if i could see your code and what format the image is in
how can you set the attack damage of custom items in its meta data?
I am IRL TAA
Change the attribute
note: if you're changing attribute of an item with default attributes, you will override them
I can't see for shit because everything is blurry but smooth
fixed it
turns out my sketchy .png texture loading loaded byte data in ABGR instead of RGBA byte order
// TODO: Refactor this sketchy texture loading
OpenGLTextureImageData textureImageData;
try {
BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("/assets/spritemap.png"));
byte[] data = ((DataBufferByte)image.getData().getDataBuffer()).getData();
for (int i = 0; i < data.length; i += 4) {
// ABGR -> RGBA
byte temp = data[i];
data[i] = data[i + 3];
data[i + 3] = temp;
temp = data[i + 1];
data[i + 1] = data[i + 2];
data[i + 2] = temp;
}
textureImageData = new OpenGLTextureImageData(image.getWidth(), image.getHeight(), data);
} catch (Exception exception) {
throw new IllegalStateException("Unable to load image.", exception);
}
such a sketchy code
well you could always opt to use stbi
thats how i usually do it
how do you send a player an action bar? whenever i try this it just sends "ACTION_BARDon't move" to chat:
public void onPlayerMove(PlayerMoveEvent e){
e.setCancelled(true);
e.getPlayer().sendMessage(ChatMessageType.ACTION_BAR + "Can't move");```
get player().spigot().send message, comma rather than plus
Could someone help me with a problem with the mines plugin?
like this?
event.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, "Can't move");
Hey everyone, how do I detect if the damager is an NPC:
net.citizensnpcs.api.npc.NPC doesn't seem to be working.
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event.getEntity() instanceof Player && event.getDamager() instanceof NPC) {
Player player = (Player) event.getEntity();
if (!BoxingMatchManager.isInMatch(player)) {
return;
}
NPC npc = BoxingMatchManager.getMatch(player).getNpc();
if (event.getDamager().equals(npc.getEntity())) {
BoxingMatchManager.incrementNpcHits(player);
}
} else if (event.getDamager() instanceof Player && event.getEntity() instanceof NPC) {
Player player = (Player) event.getDamager();
if (!BoxingMatchManager.isInMatch(player)) {
return;
}
NPC npc = BoxingMatchManager.getMatch(player).getNpc();
if (event.getEntity().equals(npc.getEntity())) {
BoxingMatchManager.incrementPlayerHits(player);
}
}
}
For getting a ban entry is wants to be provided a target, how do you obtain the target class via a player class?
I assumed it might have been player profile or smth but wasn’t
It should be a player profile
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.
Seems about right
It takes a component iirc
So you need new TextComponent(“Hello”)
event.setCancelled(true);
event.getPlayer().sendMessage(ChatColor.of("#E6E6FA") + "Can't move!");
event.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent(ChatColor.of("#E6E6FA") + "Can't move!"));```
for some reason when i run this, the chat color displays differently (lavender) than the action bar (light green) despite using the same hexcode, does anyone know why that happens/a fix?
i'm aiming for both to look lavender (what is currently only the chat color)
Use ComponentBuilder not TextComponent
event.getPlayer().spigot().sendMessage(ChatMessageType.ACTION_BAR, new ComponentBuilder("Can't move!").color(ChatColor.of("#E6E6FA")));
like this? it gives me a "no suitable method found" error
okay i saw this article but seriously lacked reading comprehension, it was missing .create() at the end. thank you so much, it worked!
hi
this setDisplayName() and player.setResourcePack(url); the setResourcePack its deprecated
uhm what was the new one functions for those :C
Am i tripping or is
private boolean overlaps(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
return this.minX < maxX && this.maxX > minX && this.minY < maxY && this.maxY > minY && this.minZ < maxZ && this.maxZ > minZ;
}
``` checking for contains rather than overlapping
I have two bounding boxes and this method only returns true if one is COMPLETELY in the other
i think you need a few or cases too I think
one box could be either side of the other one
but still overlapping
but in each case a diferent set of rules is true
its usually easier to visualize for me if it was just one dimension
because it scales to any dimension
for one dimension to just overlap, you need the this.max to be higher then the other.min, or have the this.min be lower then the other.max
and if both cases are true, then yeah, one fully contains the other
return this.minX < maxX && this.maxX > minX && this.minY < maxY && this.maxY > minY
-2 < 2 && 0 > 0 && -2 < 2 && 0 > 0
true && false && true && false
yeah the logic is flawed
it would make sense if it were a contains method, but there is another contains method which does this already
so whats that body like
I have methods for that
I just want to figure out if two bounding boxes intersect
.
ill sus ty
does
player.getInventory().clear();``` clear armor too?
for legal purposes that class is like 4 years old so if there's any ugly about it, I'm not responsible
thats a lot of code to check if some cube is inside another xD
i think the iterator is a lil off lmao
trying to use textdisplays for the first time and failing
anyone know what could be going wrong when this is all im doing?
TextDisplay display = player.getWorld().spawn(player.getLocation(), TextDisplay.class, entity -> {
entity.setText("Test");
entity.setBillboard(Display.Billboard.CENTER);
entity.setBackgroundColor(Color.BLACK);
});```
ik that would summon at the feet, dont worry about that
What's not working
it just doesnt show up at all
oh my plugin isnt loaded at all either
that would help
lol
nice one
woo
"asmr hell / Our shithole"
LOL
shitpile*
im entirely new to making public maven repositories available so that working with my projects is easier. i deployed my project as a github package and it should be available now, but whenever i try to access it from another project it complains that it couldn't resolve it because it's absent. how would i go about dealing with this
https://github.com/Athlaeos/LoreAPI/packages/2354212?version=1.0
with as repository
<repository>
<id>github</id>
<url>https://maven.pkg.github.com/Athlaeos/LoreAPI</url>
</repository>
Caused by: The following artifacts could not be resolved: me.athlaeos:lapi-parent:pom:${revision} (absent): Could not transfer artifact me.athlaeos:lapi-parent:pom:${revision} from/to enginehub (https://maven.enginehub.org/repo/): status code: 400, reason phrase: (400)
seems that it's trying to get it from enginehub, but i dont want it to grab from enginehub
Change the order of repositories
Yea, first declared, first attempted to resolve
unfortunately did not make a difference
show your pom
?paste
uh why not remove the EH repo
removing doesnt make a difference regardless
was left from an old dependency
settings.xml was improperly configured, so at least its no longer grabbing from the wrong repository, instead it just doesn't find the package
Could not find artifact me.athlaeos:lapi-parent:jar:1.0 in github (https://maven.pkg.github.com/athlaeos/loreapi)
I feel like I've hit a wall. If I use the mapTxt builder on its own, the format correctly gets cleared. But when I append it to another builder body, the format continues. I feel like I'm making a really simple mistake somewhere.
ComponentBuilder mapTxt = new ComponentBuilder("");
if (showMapLink) {
mapTxt.append("\n ");
TextComponent mapLink = new TextComponent("Show on Map");
mapLink.setColor(ChatColor.BLUE);
mapLink.setUnderlined(true);
mapTxt.append(mapLink, FormatRetention.NONE);
mapTxt.append(new TextComponent("This is still underlined"), FormatRetention.NONE);
}
BaseComponent[] body = new ComponentBuilder("")
.append(mapTxt.create(), FormatRetention.NONE)
.append("I am also underlined", FormatRetention.NONE)
.create();
idk what section this should go in but for a dev server what are some must have plugins? obv spark and plugman but what others?
alr
is there a go-to for backwards compatibility? idk if via version is still used I've been out the scene for a very long time. Is protical support still a thing
via is pretty much the only thing there is in that regard
alright thx
also for a very long time I've stuck to only 1.8 spigot but its time for me to move on. Where can I find a list of all the new spigot features since 1.8 spigot. Or the useful ones atleast
I mean tyhere are probaly so many but yk yk
You can try to create plugins on newer version, you can learn from there i guess.