#velocity-dev
164 messages · Page 6 of 1
Hi, I've a problem with the API: when a message breaks, the color resets
Can you show your code for creating the message
maybe it's because im using the § (so legacy colors)? The code is simple Component#text
Using that character is legacy and not supported
That’s probably why you’re seeing the color messed up
so i must use minimessage's colors?
You don’t have to use minimessage, kyori has a few ways for coloring
You could even try using the LegacyComponentSerializer
That’d probably work better
yeah, that's right
But using the section sign by itself is just going to mess things up for you
I highly discourage it
The legacy component serializer at least puts it into proper components from what I understand
ik, i'll use the & with the legacycomponentserializer
👍
LegacyComponentSerializer#legacyAmpersand.deserialize()
Is this the correct use for the & symbol right?
Seems right
I noticed this too
it looks like, color does not get transfered to a new line
tho you can do some workaround around the issue
or use minimessage
that's nothing to do with the API but down to how newlines work
do NOT mix legacy and modern text together
is it an issue if I parse "legacy" text as a component? I do it because people are used to work with it
fuck, sorry for the ping
parsing it properly is not mixing
btw, can minimessage work together with legacy?
MM doesn't parse legacy
with the LegacyComponentSerializer seems working fine
components are compnents
the serialiser that you use to create those individual components is irrelevant
Could I (in theory) make a serializer which would convert legacy to minimessage and then pass it to minimessage's one?
I would love to use the benefits of it, but I would also appreciate the legacy codes
I mean
it'sboth of those formats have serialisers
there is literally nothing stopping you deserialing and then serialising to the other
not to mention that MM has things like placeholders, etc

fck another ping
I am trying, trust me
i mean you could arguably just do a find and replace tbh
I was thinking about that at first, but it seemed too good to be true
However I see a single issue I don't
Gonna do that, I will report how it ends up
hex colors are gonna be a bit of a hassle tho
For some reason GeyserMC players can see the server in their servers list, but once they join it kicks them, any ideas why?
Reason in console "CLOSED_BY_REMOTE_PEER"
is there any exception visible in the console?
"[geyser]: Bedrock user with ip: /(Blocking this IP out for reasons) has disconnected for reason CLOSED_BY_REMOTE_PEER" is all it says.
[floodgate]: Floodgate player who is logged in as Nathan4031 00000000-0000-0000-0009-01ffeed6a406 joined
27.02 19:16:37 [Server] INFO [floodgate]: Floodgate player logged in as Nathan4031 disconnected
27.02 19:16:37 [Server] INFO [geyser]: Nathan4031 has disconnected from the Java server because of Connection closed.
27.02 19:16:37 [Server] INFO [geyser]: Bedrock user with ip: /(Once more not showing the IP for reasons) has disconnected for reason CLOSED_BY_REMOTE_PEER
all that says is that the server closed the connection
or, maybe not, the wording of that stuff is weird
all i can say is that something closed the connection
I have installed floodgate velocity + geyser and set it up the way it should be, but IDK what else could be the issue.
This was surprisingly easy, does anyone want to get my legacy to minimessage converter?
I just check and I am 100% sure that my geyser is fully setup, but it doesn't seem to work.
Is there any way to set ping response description field as raw string instead of TextComponent?
you can use the gson component serialiser if you've only got raw components as strings to use
May I ask why would you want to do that?
Some external things like server lists pages didn't implemented handling server motd as TextComponents and I want to pass it like Bungeecord do, as raw string
But as I assume it isn't possible by Velocity api
im getting this error when i try to load my plugin anyone know whats going on?
this is my main class
that means a program is already occupying the port 25577
do you have a duplicate instance of your server?
no
try going into task manager and closing any existing java instances
closing a server by just exiting out of command prompt is a bit buggy
sometimes it doesnt register with the java runtime to close the program
so the instance stays open occupying the port
oh ok
alternatively sometimes you can actually connect to the instance
if you can do that then try running /end
anyone know why its telling m that my class doesnt implement a registrable command subinterface
even though it does
your pfp looks exactly like someone in my school
lel
its not me btw
its an image i took off of (french accent) le googel (french accent)
You must implement SimpleCommand
i replaced simplecommand with command because arguments were being odd
do i have to change the way im registering the command?
cause rn im registering it with commandManager.register("maintenance", new MaintenanceCommand());
hmm
is implementing Command like some deprecated thing or something?
i see
when are they gonna update this page? https://docs.velocitypowered.com/en/latest/developers/command-api.html
cause thats whats listed on the front of the velocity page
how do I add velocity to falixnodes??
what do you mean?
how do you make a velocity server on a panel?
@spice dagger isnt falix a free host?
you need atleast 3 servers to create a network. if you have 3 servers then its pretty straight forward. just follow the velocity installation guide
yea I know but how do I set it up on falixnodes
its pretty much the same with every host
as long as you have access to the console
if you know how to do it on a localhost server
doing it on a server host is about the same
no it doesnt allow custom jar files
then this is your issue
and it gives errors when default install
if falix doesnt allow custom jars then installing a custom jar is out of the question
if the install provided by falix is broken
then thats another issue
try contacting falix support
is it possible to write to a toml file?
Well, Velocity does it, so I assume it’s possible yes
wait velocity writes to the toml file?
time to go through velocity source code to figure out how it does that
Well… it certainly reads from it, it’s how the config file is
except creating and reading from a file is different from writing to it
nvm
writing to a toml file is about the same as writing to any file using java
shoulda realized this :\
I think Velocity uses Configurate internally
Place your main class inside a package
Yeah I fixed the issue
All documentation on that subdomain should be assumed to be outdated, use the new wiki
Where's the new wiki?
How can I remove the change screen when changing server
you can't with velocity by default and really you shouldn't
Why not with velocity
I mean
"why not" in general, the thing requires messing with a good chunk of the client state in order to work
i.e. it's gotta manually despawn entities and other stuff and many plugins pulling that mess have been buggy af
can you do it with bungee tho?
I believe so
It's also possible with velocity, but you gotta mess with some shit basically src
@maiden hawk
really?
I mean it would be sick
but I imagine it would be well, messy.
as cat said, you would need to clear the world manually
I mean, if you can find a plugin to do it, you can do it on any platform
Just, like
people generally haven't bothered to recreate all the stupid ass plugins yet™
so, there is probs no plugin for it yet
I mean
Is there really any practical reason to do this?
Players don't care about the screen when changing worlds
why would they now?
and which?
I can't think of a single reason
Asking about your attempted solution rather than your actual problem
i dont really know if this is the right chat for this, but it seems that this (https://github.com/PaperMC/Velocity/commit/596d4758ba9efedc60ede2789644ea10263c48e4) commit broke the "PlayerResourcePackStatusEvent" in the bukkit api, it just doesnt fire ever.
has anyone else experienced this?
the build of velocity before that commit works just fine
seems like this was mentioned earlier here in this chat too, but that was ignored.
It stops a bukkit event from firing? That seems very weird
it may be that the packet isnt being forwarded back to the server
Maybe it’s due to the origin logic being messed with?
velocity just eats the packet
The only other thing that the PR touches other than S2C is the origin logic - so that’s the only place I’d think it could sit
Velocity has its own ResourcePackStatus event, can you check if that’s called and print out all the fields of the event
Might give us more info on what’s going on
I can probably take a look this weekend, feel free to just make an issue in the GitHub about it
will do
anyone know what im doing wrong? i cant use @override and i cant find anything for tabcompletion on simplecommand
there's no args parameter
args are held in the invocation
no problem 👍
is there a method that can be used to restart the proxy
You can shut it down with https://jd.velocitypowered.com/3.0.0/com/velocitypowered/api/proxy/ProxyServer.html#shutdown() and setup a script that restarts it
alright, ty
I would like to use the latest version of the Adventure library, but unfortunately does it conflict/clash with the one Velocity has bundled.
Is there any way to bypass this?
The error in question is this one: https://paste.helpch.at/momipadame.md
The Parser class itself, as of right now, is this one: https://github.com/Andre601/OneVersionRemake/blob/feature/improve-component-parser/core/src/main/java/com/andre601/oneversionremake/core/Parser.java
that more looks like you never shaded it
I did tho
Haven't pushed the change yet, but added this line to the pom.xml of the velocity module in hopes it would work....
<relocation>
<pattern>net.kyori</pattern>
<shadedPattern>com.andre601.oneversionremake.core.dependencies.adventure</shadedPattern>
</relocation>
you also can't just shade+relocate your own adventure-api and use native methods for components
not to mention you'd need to use platform too ^^
and sadly there isn't a velocity platform so :')
o o f
submit a PR to update adventure?
was there any API breaks? 
if no ABI breaks then i don't see why not
From what I know did at most the minimessage module break in some way
wasn't a breaking change as there was no release
Like MiniMessage.get() became MiniMessage.miniMessage()
uh.......
snapshot builds are allowed to break as much as they want, that's how semver works
There was...
as soon as you make a release, then semver comes into play
There was no ABI breaks between the releases of adventure
ABI breaks in the snapshots in the meantime or other components are irrelevant
So what now? Simply PR to bump the version?
yup
mkay... Will see if I can manage that xD
Can I do PR to add Kotlin Symbol Processing (kotlin's analogue for annotation processing) to velocity api?
basic kotlin annotation processing executing 8 times slower than ksp
@bold wharf can we continue the discussion here about pr #657 i have a really bad connection now and it makes hard to use the github page (that was the reason for the duplicate message too)
no-ping
The vhost getHostString just returns the string that was passed into the unresolved socket thing
if extra crap is getting in there it's further up and should be in the more general cleaning logic, but I question how such mangled stuff got in there
when i used the official client it had the /<unresolved>:XXXXX part
and, how are you seeing that?
where from?
is the only place where that's added in
in the issue i posted a simple plugin that logged this info
and, velocity doesn't use toString
conn.getRemoteAddress().toString()
that's why you're seeing the /unresolved
but i made another version which looks like the velocity internal:
@Plugin(
id = "handshakemonitor",
name = "Handshakemonitor",
version = "1.1-SNAPSHOT"
)
public class Handshakemonitor {
@Inject
private Logger logger;
@Subscribe
public void onHandShake(ConnectionHandshakeEvent e) {
InboundConnection conn = e.getConnection();
logger.info("{} -> {}", conn.getRemoteAddress(), conn.getVirtualHost().map(InetSocketAddress::getHostString).orElse("").toLowerCase(Locale.ROOT));
}
}
and got the same result
what result?
domain/<unresolved>:XXXXX
I'd need to see it
cos, the only way that /unresolved gets in there is from a toString on the address object
so something somewhere else is screwing that one up
what you PR'd doesn't make sense given how getHostString works, if getHostString returns a thing with the unresolved in it, something is mangling it elsewhere
if you want i can send you the unmasked log in dm
I don't accept DMs
you'd need to send it to pencil but might need a paste.gg link or something, idr
then i'd prefer to not publicly expose my backend ip
but yeah the getHostString does return more than just the domain
and the fix just removes that data if it present
the fix if that's the issue is in the wrong place
But, I don't see how that could be the issue
but getHostString is a builtin java method, so i can't see another possible fix
getHostString is a builtin java method which returns the hostname set when createUnresolved is called
if that s returning a string with /<unresolved>, there is an issue higher up
No
when i used a cli chat client to test it (can't run mc on a rpi) i got the base64 data
I can try to test it if you want
the thing only appends :port on the end of the hostname
Couldn't that also cause the issue?
well, no
I mean
toString only appends :port on it
at least to me that sounds like something installed on the proxy is scuffing the hostname
hmmm
you mean plugin installed?
I can try to run a bare proxy without any plugin, except the hostname shower and then try to connect with notchian client?
i tried it without plugins and it had the same issue
even with notchian client?
Well, what's the contents of the handshake packet?
is the cli chat client open source?
According to wiki.vg the hostname sent should be:
Hostname or IP, e.g. localhost or 127.0.0.1, that was used to connect. The Notchian server does not use this information. Note that SRV records are a simple redirect, e.g. if _minecraft._tcp.example.com points to mc.example.org, users connecting to example.com will provide example.org as server address in addition to connecting to it.
gonna take a look at the source
oh wait
it is C#
Well that shouldn't be that off from Java right?
ok looking on the source, the cli chat client sends the server address obtained from this method:
public string GetServerAddress(string serverAddress)
{
if (ForgeEnabled())
return serverAddress + "\0" + forgeInfo.Version + "\0";
return serverAddress;
}
Maybe here is the issue?
while serverAddresss is the bare thing inputted by the user
Or at least I think
it's not about debugging the chat client as the issue started with the vanilla client
wait
so the issue is also present with the vanilla client?
I thought you couldn't test it
i just used the chat client to continue working on the issue because the only available thing for me at the moment is a rpi4
Shouldn't the rpi be able to run Minecraft?
in theory yes, in practice no
you have the low memory version?
more like driver issues, video performance is also bad, like i can't watch a youtube video nor an mp4 file without tearing and low fps
but 4gb version
ty
I will just reply to this, so I can have the source easily accessable
However, I can only test this on localhost
well i think it should work the same or at least similarly
gonna use build #115
done, booting up minecraft
/127.0.0.1:44204 -> localhost
This is what gets printed
Weird
I am using latest build, notchian minecraft 1.18
gonna try what happens with fabric
The same thing
Maybe there's an issue somewhere else in the chain?
it might only happen with domains or a specific java vendor?
idk if anything else could affect it
or maybe linux/windows
i run the server in quay.io/parkervcp/pterodactyl-images:debian_openjdk-15-hotspot
@wicked stag Please take a look on my latest comment on the PR, what do you think of my theory?
i found that description too and i have no idea how can String form of the address look like domain///XXX.XXX.XXX.XXX:XXXXX///XXXXXXXXXX///long-base64-encoded-binary-data
where the part after the domain is the source ip port
and idk what is the number and base64 binary data
or another solution is to keep the server address field from the handshake packet as a string and use that for getting forced hosts
that way there couldn't be a single thing affecting the final string representation of the host
I am blind then
but it gets converted to InetSocketAddress at some point
gimme a while
also is there any benefit of using InetSocketAddress instead of a string?
can confirm
sorry for the misunderstandement
this is really weird
can you try and deploy this on production noel?
So we can see where the issue is?
you mean a public server without my fix?
Well I would want to see what InetSocketAddress#getHostString spits out in your case
because as I've said, it behaves normaly on local
@maiden hawk i modified the plugin to this:
@Subscribe
public void handler(PreLoginEvent e) {
InboundConnection conn = e.getConnection();
String vhost = conn.getVirtualHost().map(InetSocketAddress::getHostString).orElse("").toLowerCase(Locale.ROOT);
if (vhost.contains("mct")) {
e.setResult(PreLoginEvent.PreLoginComponentResult.denied(Component.text(vhost)));
}
}
the server is available at test-a.mct.noelnemeth.com and test-b.mct.noelnemeth.com
should I join?
it will respond you with the host string
don't worry i didn't plan it 😄
ok
which build of velocity do you use?
latest dev/3.0.0 which has my fix
ok
btw, can you please try to parse that base64 string? My client didn't log it and I am too lazy to write it by hand
I just want to make sure that my ip isn't there
actually i need to remove test-b i ran out of available domains on tcpshield 😄
i leave test-a up for a while
until i need one more domain
oof
yeah i'm on free plan, since i just occasionally host servers for friends
do you need tcp shield then?
chinese script kiddos will find the backend ip and bruteforce or dos everything
that's why i started using tcpshield and cloudflare
until i found tcpshield i proxied mc over websockets XD
I will pretend I didn't see that
GJ I guess
anyways i'm happy with my fix so i'll leave it for the velocity team to decide how they want to fix it in the official version

yep
everything
why?
I didn't realize :D
they could do some whacky stuff
I mean, based upon the fact that they have a plugin to literally cleanup the handshake packet...
Hm?
TCPShield literally has a plugin
To his defend, many (mostly professional networks) use it, so I think something like official support would be appreciated by many
That fix is bad anyways, as I keep saying
it wasn't enabled during this test
Yes
so tcp shield isn't the cause?
The literal statement here is that the things returning mangled data
yes
which, cleaning that out in a very specific case is not the proper solution
you'd need to clear the entire thing
Just because something is widely used does not mean it's good software. Coreprotect is extremely popular, yet it's a literal piece of crap internally
but noel says that tcp shield wasn't enabled at the moment of testing
and, idk if we should be maintaining crud to deal with oddball platforms
I use CoreProtect, is there any issue with it? (I haven't looked at it's source)
Cat?
eh it works (somehow), but the fact that it does is frankly shocking.
that's LITERALLY their format.
oh
so the cleanup doesn't happen before the decision made about the server?
Is it that bad?
tcp shield passes client data in the server address field so the plugin can restore the original client ip
okay, and that does not work for some reason?
the plugin removes that information late or it doesn't even remove it idk
You need their plugin to clean up that stuff
the plugin should remove it before the server choose stuff happens
do you have it installed noel?
- Every interaction opens a new SQL connection
- Classes nested in
ifstatements (didn't even know that was posible) - massive "util" class that does everything from SQL connections to formatting
aaaarrree yyyouuu kkkiddin?
I am going to remove that thing ASAP from my server
it was originally, then removed during testing
does this mean, that every time someone breaks a block a new connection is made?

Well that's mystery solved
iirc yes 🙂
That can't be real
I refuse to believe it
I hope it is at least async, right?
well, the good thing is, I use sqlite for coreprotect
This is because my shared host only allows maximum size of 1GB per DB
ikr cringe
uhhh
wtf
you might consider doing a purge
storing a 100GB CP DB on your Desktop seems like a horrible idea tbh
@maiden hawk could you try now that i have re-enabled tcpshield plugin?
okay
still the same thing
dunno why the hostname has desktop tbh. It's effectively a dedi.
besides, we have the space (top is primary SSD, bottom is HDD for backups) https://f.u11.io/JLNyLi
anyways should move this to #general if you want to continue before cat or someone yells at us
maybe my plugin acts before tcpshield, i removed it now only tcp shield is enabled
uhh should I try again then?
?
it should work since it's running the modified velocity version
the base setup was tcpshield plugin with official velocity, which didn't work
but the plugin rewrites the packet so it should work

maybe the server decision is made before the rewrite?
Looking at the source, the event in which their plugin operates
should be fired before server choosing begins
Maybe it is a nonblocking event? Therefore the proxy doesn't wait for its execution and just continues doing its job, possibly being faster than tcpshield?
am I able to send a player to a specific world inside a specific server, or am I just able to send the player to the server and the server handles what world
no, but, yes
the proxy can't control where people are in a server, etc
but, nothing stopping you sending a message to the server of which you have some plugin on the server to send people there or whatever
could you guide me in the right direction of sending a message from what you described?
did you compile velocity by yourself
yes but it never gave problems
try removing plugins 1 by 1 until it stops, it looks like it's being caused by a plugin
I'd start with any stats plugins and stuff like that
I think one of their plugins hooks into the proxy's provided bstats, and the backend for that may have changed
@bold wharf added a quick hotfix to another spotty location in the resource pack send, it was queuing the initial resource pack rather than the intended one received from the event, which could also cause this issue, just a heads up that it's another piece post your review
I pinged him with something meaningful, I didn't ping him while there was an active conversation going which he was apart of like most people do
still says dont ping him xd
let him tell me that 

This is kinda awkward but can someone please take look at #637?
I kinda need it fixed, so I don't need to use my fork.
How difficult would it be to make an API for sending spawn and destroy packets, is there anything in velocity that allows you to do this? Trying to implement a server side player culling system.
well, this is my code right now:
@Subscribe public void onLogin(final PostLoginEvent e) { ProxiedPlayer p = e.getPlayer(); String hostName = p.getPendingConnection().getVirtualHost().getHostString();
can someone help me with this?
How can I let the player issue a command with velocity?
Pretty difficult - you’d need to fork velocity, those packets aren’t handled
Ah, I figured. Is there any place I should put that functionality in when I fork it? Didn't know if there was a packet manager class. Sorry if my question is ignorant, not familiar with the codebase.
There’s a Registry which you can mess with
I’d recommend looking at how the other packets are drawn up, but it’s called something Registry
I cant find anything referring to registry by doing a simple github search, am I missing something?
Never mind, I found it in Velocity/proxy/src/test/java/com/velocitypowered/proxy/protocol/PacketRegistryTest.java Is this what you were referring to?
com.velocitypowered.proxy.protocol.StateRegistry
Are you sure that doing this is a good idea?
Unfortunately, Velocity is mostly undocumented
Most things are in JD
but that's really only the api
someone?
get the command manager, map, or whatever it was called and use the execute method
(See the javadocs)
Ehhh, not sure, I told myself I would give it a day and see where I get. I really have no other good solution. Working to achieve 10k players in a world with minestom, which is the easy part but making client performance workable is the hard part, hence the dynamic culling
why can't you do this directly from minestom?
btw, can minestom really handle that much?
Considering that even Velocity pbly cannot
The performance overhead would be nuts probably with 10k players
minestorm basically does nothin on its own
Ikr?
Yeah it can
That seems sussy
iirc, noone even managed to get 10k players with one velocity proxy
Going to use multiple proxies, Ive been talking with the contributors over on their discord
yeah, Im assuming ill need 3-5
it just seems weird that minestom could handle more players than velocity
bandwidth should be fun 🙃
I realize that minestom is really only a skeleton
Yep, theres nothing to it
But I would dare to say that it still processes way more data than proxy
proxies basically get weird, like, it's still gotta mutate stuff, it's still gotta copy data around, etc
Its only viable to offload packet processing to a proxy, I doubt minestom can do 10k players actually
am sure that one could get velocity to handle that many players
with one instance?
Just, you'd need to throw a ton of resources at it and that point you'd be better off just load balancing
Yeah, makes sense
or, wait, would netty cope with that
iirc someone told me that the max (with velocity 1.0 iirc) players someone managed to achieve was 5k or 3k, not sure
Like, I don't recall how efficent the selectors are
they used 48c xeon
You could probably do 10k on a mulan epyc then
I believe so
But I think you would hit architectural limits
The thing is, noone has ever tried it
so we really don't know
but what are you trying to achive with having 10k players on a single server?
Btw, bandwidth will also be pain in the ass
No idea on the specifics yet, it would be a one off event though. Some kind of gamemode like hide and seek etc.
Yeah ive already done the numbers on bandwidth, 10gbps minimum
Gbps or GBps?
Gbps, I dont think any hosting providers offer that much haha
AWS maybe? I though they only do 50gbps
I've found out, that you should count about 1Mbps for one connected player
so this makes sense
This whole thing is a sorta long term project with a team im working with. Im just trying to figure out now where to steer things based of theoretical limits
are you really sure you can obtain that much players?
idk, putting 10k players on a single server seems like an incredibly dumb idea tbh
Im not sure that its even possible to get 10k players in a server
honestly
even 1k players on a single server seems like an incredibly dumb idea
there will just be huge chaos
yeah but it hasnt been done, so why not? ;) Make something fun about and turn some heads.
And waste thousands of dollars
Yeah how?
don't tell me that infrastructure to handle this is going to be cheap
10k players is way more than it may seem
Minestom is much better than you would think
Someone got 10k players running on a M1 macbook air lol
Idk, but I am having my doubts on that
Its wonderful when you dont have to use mojang code
Join their discord and ask around, theres a video of 7.5k bots running fine on a laptop
Even handling that huge amount of network IO is going to be really expensive
it's not really about mojang code - it's more about the fact that minestom doesn't do anything
yup
Well thats the whole point
it's like body without brain
sure there are some improvements/optimisations - but i doubt you'd get much better performance than a vanilla server if you re-implemented all the features
^
Obviously, Minestom isnt that at all, the point is to use it as a game engine of sorts
10k players in a survival world would be a nightmare
the moment you start implementing features, the player count you can handle is going to drop drastically
yeah ofc, i was just correcting what you were saying about mojang code :p
While minecraft server code isn't the best (mostly because of the old codebase), it is still optimized pretty fine (especially with things like Paper)
Gotcha gotcha, sorry was meaning that its nice when you dont have their code in the way, not that it was written poorly
right yeah
this is why you kinda have to develop things in mind with high players. Again im not saying im going to get 10k players doing whatever tomorrow, this is more of a research based project that see what is possible and what is not, then to move on from there.
tbh
it will be a miracle if you will be able to handle 1k players
tho I still don't understand how you want to obtain those in the first place
Thats not really the point, the point is to develop efficient systems and server architectures that could handle those players
Hi, I am trying to create a universal plugin compatible with spigot, bungee and velocity, but I get the following error:
[23:10:12 ERROR]: Unable to load plugin plugins\XSBuildTest.jar
com.velocitypowered.api.plugin.InvalidPluginException: The plugin file XSBuildTest.jar appears to be a Bukkit or BungeeCord plugin. Velocity does not support Bukkit or BungeeCord plugins.
at com.velocitypowered.proxy.plugin.loader.java.JavaPluginLoader.getSerializedPluginInfo(JavaPluginLoader.java:151) ~[velocity-3.1.1-98.jar:3.1.1]
at com.velocitypowered.proxy.plugin.loader.java.JavaPluginLoader.loadCandidate(JavaPluginLoader.java:61) ~[velocity-3.1.1-98.jar:3.1.1]
at com.velocitypowered.proxy.plugin.VelocityPluginManager.loadPlugins(VelocityPluginManager.java:92) ~[velocity-3.1.1-98.jar:3.1.1]
at com.velocitypowered.proxy.VelocityServer.loadPlugins(VelocityServer.java:324) ~[velocity-3.1.1-98.jar:3.1.1]
at com.velocitypowered.proxy.VelocityServer.start(VelocityServer.java:222) ~[velocity-3.1.1-98.jar:3.1.1]
at com.velocitypowered.proxy.Velocity.main(Velocity.java:64) ~[velocity-3.1.1-98.jar:3.1.1]
[23:10:12 INFO]: Loaded 0 plugins```
Is there any way to solve it?
do you have a @plugin annotation on your velocity class
and is there a velocity-plugin.json file inside of the jar
I put velocity.json, it does not work?
No
Where would I actually find out the latest version of the velocity API to use?
In the Paper repository https://papermc.io/repo/repository/maven-public/
Is there an approximate release date for Velocity 3.1.2*(Includes Minecraft 1.18.2 support, brings MiniMessage and Adventure-API 4.10.0 and a new event, which I would think is enough for a release)*? I already have 5 plugins that depend on Velocity's latest "SNAPSHOT" 😅
What new event?
Hi, anyone have an idea how to change the brand text in the client debug menu? Is there any java method for this?
I want to change "Paper (Velocity)" to something else.
You will need to modify Velocity's source and compile it yourself. This has been discussed in the past, we don't understand why anyone would want to do that
There is no other way? For example using api? https://jd.velocitypowered.com/3.0.0/
there is no way
velocity and paper and others don't provide api for removing attribution
Are you sure you are right? This plugin works for bungeecord and paper https://github.com/theminecoder/ServerBrand
Unfortunately it is not compatible with Velocity.
Its a plugin message
like, you basically just need to send the correct plugin message to the client
We're not gonna walk you through removing attribution, however
hello, what is the difference for a command between Suggest and SuggestAsync pls?
The one with async in the name does it asynchronously.
Is 3.1.0-SNAPSHOT the latest stable version of Velocity?
Make sense, but not stable but latest release that include MiniMessage 4.10.0
3.1.2-SNAPSHOT
Thank you!
bukkit release when
rule #0 of foss programming: nothing is ever stable
Hi! Anyone know how to check if a player session is premium?
Use online mode
This is not a solution
I mean
depends on the proxies config
then theres the UUID version
if you mean, you wanna make a plugin to do the hybrid auth mode thing, see the mc api docs
hybrid auth mode is spooky
It is doable
but it has some issues
Main issue being, hitting Mojang API ratelimit
Most are, except book/sound methods
Oh well, that sucks
Anyone has an idea on how to code a sorted tablist for velocity?
The issue with sound is, that Velocity would need to track player's position, which would be pretty resource demanding. You can solve this by having a plugin on the server, and sending the sounds via plugin message channel.
Then send them directly from the backend server, don't overengineer it
Thats not true
you'd need to store a sound registry on velocity
not for everything
if you just wanna use the custom sound packet, yea, sure
but, that packet doesn't support all the expected features
But thats still better than nothing, right?
We generally try to err away from half assed features
Can't you also play a sound only for a player at the players position nowadays?
Yea, sure
but that'sliterally half assed and doesn't support everything
and, once again, we don't really wanna maintain half assed code
and, well, actually
that;s part of the issue
We don't know where the player is
Isn't there a packet you can send to the player that spawns the sound where he is, without giving a position argument?
In some cases you would want to send it from the proxy 
Hello!
I am trying at the moment to implement Velocity to my multi platform plugin.
This is my first time working with Velocity...
I read that @Plugin(id = "DiscordNotify", name = "DiscordNotify", version = "3.0.0", authors = {"TrueMB"}) Annotation should create a velocity-plugin.json. This doesnt seem to work, since I couldnt find it in the compiled jar.
I am using maven.
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>16</source>
<target>16</target>
<encoding>UTF-8</encoding>
<annotationProcessorPaths>
<annotationProcessorPath>
<groupId>com.velocitypowered</groupId>
<artifactId>velocity-api</artifactId>
<version>3.0.1</version>
</annotationProcessorPath>
</annotationProcessorPaths>
</configuration>
</plugin>
PS. Sorry for the repost, just saw that i was in the wrong channel
tried it without as well 😄 Just wanted to make sure I am not making the mistake like ppl on gradle xD
Yup, you only need to do that with gradle
the compiler should already look at the classpath for annotation processors
Send the entire pom.xml please
don't even need to with gradle last I knew
Well it didn't work without it for me 
kotlin?
oh, odd, apparently you do
at least for gradle
I thought the compiler dealt with that
do you mean the build file language, or the project language
I meant project, god knows

so, I have doubts that you're actually building with maven
https://pastebin.com/QippCU9A
Works for me. Or do you mean something else?
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.
There was indeed a problem, since I moved the package name ^^
But this shouldnt have to do with the json?
Must be done in some situations but very rarely as gradle lets you specify annotation processors
It depends
what's the event when poison damages an entity?
there is no such event for this on velocity
Whats the equivalent of ByteArrayOutputStream b = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(b); try { out.writeUTF("Connect"); out.writeUTF(SERVERNAME); } for a velocity instance?
Why not
Here I am again .-.
Now I got a problem with a SimpleCommand.
For some reason the command, which needs arguments, doesnt work ingame. It doesnt event trigger.
Only if I am running the command through the console....
VelocityCommandExecutor_Staff staffCommand = new VelocityCommandExecutor_Staff(this.instance);
CommandMeta staffMeta = commandManager.metaBuilder("staff").aliases("s").build();
commandManager.register(staffMeta, staffCommand);
If I am using only the command ingame without arguments, then it just gets ignored....
Is there a permission for it
that commend doesn't have any arguments?
omg this was really the Issue....
Now I got some more questions.
My problem was, that I wasn't using Luckperms. Is there a way to do permissions management like in Bungeecord with the config?
And I guess /server worked, since it is using the bukkit Luckperms and PluginMessengerChannel?
Is it also possible to change the error message? Or can I only prevent that by returning true and do the check on myself?
Velocity doesn't include a permission manager, no
No, /server works because it's allowed by default
The "Incorrect argument ..." message is hardcoded in Brigadier, a Mojang library (it might be translatable by the client, not sure)
Thanks for your answers!
does velocity have a built in plugin config system like paper?
Configurate
how can I communicate Velocity and Paper servers?
so, I want to send packet from Velocity to Paper server, and receive response from Paper server then
that depends, if there's a player online you can use plugin messages, but if there are no players you should use something else like redis, rabbitmq, etc
okay, I'll use plugin messages, because communication will be only when player online. I need to listen to PluginMessageEvent in Velocity, right?
but how?
I know how to do it on Paper side, but don't know how to do it on Velocity
found ProxyServer.getChannelRegistrar().register()
thank you
How can I send packet from Velocity to my Paper server?
I tried event.getTarget().sendPluginMessage(Constants.MINIGAME_CHANNEL_IDENTIFIER, "test".getBytes(StandardCharsets.UTF_8)); in PluginMessageEvent, but it doesn't work
did you register the incoming channel on the paper server as well?
also I'm pretty sure that method sends the plugin message to the client
Yes, ofc
nvm I fixed it
Do I need to implement something for listening class?
Hello 👋!
What's the difference between ServerConnectedEvent and ServerPostConnectEvent?
the javadocs explain the difference pretty clearly
Ok
Hello, I'm quite new using the velocity api, and I have ran in to this error. I'm not sure what is velocity-plugin.json, as in the wiki page it doesn't appear. I have put the @Plugin annotation in my main class.
Are you using Gradle?
If so make sure you've set velocity as an annotation processor
pretty sure someone had the same issue a few days ago
had something to do with relocating
plus you don't have to manually add the annotation processor with maven
How to log debug if this level is disabled in logger?
/how to enable this level
and the latest api version is 3.1.0, not 3.1.1
yeah, have realized that
hm
ok
@bronze yoke sorry for the ping, I have read the conversation and I didn't realise how he solved that issue.
Paper is a server software, Velocity is a proxy (like Bungeecord)
does anyone know?
remove the AP paths I guess
like, processors should generally be picked up automatically
unless they forked with that...
hi, can someone help me with my first plugin? xD
i dont know how to invoke this
this.server.getCommandManager().unregister("livetest");
this.server.getCommandManager().register("livetest", new vLiveCommand());
Wdym, put you command name as the first arg, then the class that you have your command logic in
I removed it, but still dont load
I have another plugin build with gradle which works perfectly
Ups, sorry for ping

I think i will switch to gradle
how can i add multiple ServerPing.samplePlayers in ProxyPingEvent when only method that exist is
'''
public Builder samplePlayers(SamplePlayer... players) {
this.samplePlayers.addAll(Arrays.asList(players));
return this;
}
'''
okay thanks
Using CommandExecuteEvent. Is there a way of knowing if the command ran on the proxy or was passed through to the servers?
Basically, I want to be able to log what Velocity commands people are using but I can't seem to figure out a way to filter my velocity and server commands.
checking the sender, no?
if sender instance of ProxiedCommandSender or ConsoleCommandSender, i forget
No because it will be a player regardless
Player runs /gamemode ----> Proxy ----> Server ->>>> Command Runs!
Players run /velocity ----> Proxy ->>>>> Command runs!
I wan't to check if the command runs on Velocity or gets passed through
this would probably be easier through backends but uh, check the commandmanager maybe to see if the command is registered on velocity probably
Back ends?
paper server
So, when I tried to connect to my (online mode) proxy, with an offline mode client, I got disconnected with a custom response. Does that mean, that you can now specify the message to send to people with offline clients? afaik this was only a client side thing
the kick comes from the server as it tries to validate the session
But, afaik, the client would disconnect first.
Does that mean that there's some kind of racing condition here?
The proxy is on localhost btw
I do not recall there being anything on the client which dc's itself in such cases
the client doesn't have the auth token, etc, it relies on mojang sitting in the middle, and, given that every kick I've ever seen for invalid sessions comes from the server, 🤷♂️
well
That's great :D
I thought you would always receive the "Invalid Session" message
This is on fastlogin's wiki
We could check if that username is associated to a paid account but if we request a online mode login from a cracked player (who uses a username from a paid account), the player will disconnect with the reason "bad login" or "Invalid session". There is no way to change that message on the server side (without client modifications), because it's a connection between the Client and the session-server.
Now I am even more confused
Velocity kicks you with this, if it received 204 from https://sessionserver.mojang.com/session/minecraft/hasJoined
ok
this was caused by tlauncher modifying the client in a way, which allows the encryption process to continue, even if the client knows its data is invalid. Therefore the server kicks you.
This is what I receive when connecting with a notchian client
It is pretty weird
But it also is pretty sussy, that tlauncher modifies the client
But I am not really surprised, most of these "cracked" launchers are very questionable
why do u need the proxy
I need MinecraftPacket
are you trying to send a packet to a player?
I want to intercept a packet
I need PluginMessage#handle(MinecraftSessionHandler handler) as well
So I want the proxy
is there a native way to get all permissions a player has
Velocity treats permissions as a function of (player, permission) -> tristate. But most people are likely using LuckPerms at this point, so just integrate with that.
I’ve never understood this, why do permissions use tristates rather than just have permission, doesn’t have permission. Seems odd to me, I’m sure there’s a purpose.
returning a possible null Boolean isn't really desirable
and having information about whether or not its actually set can be important
e.g. maybe you don't want to change the value if its already set
sure you could have another method but tristate makes it cleaner
Hm makes sense
it's tux! the man behind velocity himself! 
Can anyone help me detect where a command runs on Velocity or get passed through to a server?
Player runs /gamemode ----> Proxy ----> Server ->>>> Command Runs!
Players run /velocity ----> Proxy ->>>>> Command runs!
Hello, I've a problem with the API.
I tried to register a player to the mysql database, but the code does not seem to run and the debug message "test" doesn't appear. The import of Subscribe is the velocity one and I already registered the events class in the main.
That's my code: https://pastebin.com/tzcfpzRa, ping me if you know how to fix the issue.
Show me your imports
99% sure it’s annotated with the incorrect annotation
I’m gonna PR in an error message for this, it’s happening quite a bit
It's not the Google eventbus, it's the velocity one. I said that in the message
can you show a full snippet of the code (including constructor) along with where you're registering the class as an event listener, sorry missed that while reading
thats the code https://pastebin.com/CxNT1Awd
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.
thats the line to register the events in the proxy initialize event:
proxyServer.getEventManager().register(this, new BaseListeners(this));
very weird, I'm unsure
hi, i wanna do database queires in login event is this correct way to do that? @Subscribe public EventTask onLogin(final LoginEvent event) { return EventTask.async(() -> { // code }); }
There's no way to get all effective permissions from a player in velocity?
Oh that sucks
Cause like how do you check player's highest permission based of like weight
Guessing random numbers
That sounds like very inefficient
Use something designed for that purpose i.e. luckperm's Meta system
The logic is a bit involved, you can check e.g. the BrigadierCommand test cases https://github.com/PaperMC/Velocity/blob/94e8b0df43fa7d59372d62bef1dcff5baa7315fc/proxy/src/test/java/com/velocitypowered/proxy/command/BrigadierCommandTests.java#L101
How do i fix ```
[13:58:12 ERROR]: Can't create plugin siecmcproxypoints
com.google.inject.ProvisionException: Unable to provision, see the following errors:
- [Guice/ErrorInjectingMethod]: NoClassDefFoundError: com/zaxxer/hikari/HikariConfig
at SiecMCProxyPoints.initializePlugin(SiecMCProxyPoints.java:30)
at VelocityPluginModule.configure(VelocityPluginModule.java:48)
at com.google.inject.internal.InternalProvisionException.toProvisionException(InternalProvisionException.java:251) ~[velocity.jar:3.1.2-SNAPSHOT (git-596d4758-bunknown)]
at pl.siecmc.siecmcproxypoints.SiecMCProxyPoints$$FastClassByGuice$$5539533.apply(<generated>) ~[?:?]
at com.google.inject.internal.SingleMethodInjector$1.invoke(SingleMethodInjector.java:50) ~[velocity.jar:3.1.2-SNAPSHOT (git-596d4758-bunknown)]
at com.google.inject.internal.SingleMethodInjector.inject(SingleMethodInjector.java:87) ~[velocity.jar:3.1.2-SNAPSHOT (git-596d4758-bunknown)]
at com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:146) ~[velocity.jar:3.1.2-SNAPSHOT (git-596d4758-bunknown)]
at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:124) ~[velocity.jar:3.1.2-SNAPSHOT (git-596d4758-bunknown)]
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:91) ~[velocity.jar:3.1.2-SNAPSHOT (git-596d4758-bunknown)]
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:296) ~[velocity.jar:3.1.2-SNAPSHOT (git-596d4758-bunknown)]
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) ~[velocity.jar:3.1.2-SNAPSHOT (git-596d4758-bunknown)]```?
Main file:
@Inject
public void initializePlugin(ProxyServer server, Logger logger, @DataDirectory final Path folder) {
this.logger = logger;
this.server = server;
logger.info("========================");
logger.info("=> Plugin loading...");
logger.info("========================");
this.config = ConfigManager.loadConfig(folder);
Toml dbConfig = config.getTable("Database");
this.dbManager = new Database();
dbManager.initializeDatabase(dbConfig);
if (!dbManager.getConnection().isRunning() || dbManager.getConnection().isClosed()) {
logger.info("========================");
logger.info("=> Loading failed! Database not connected.");
logger.info("========================");
} else {
logger.info("========================");
logger.info("=> Loaded successfully!");
logger.info("========================");
}
return;
}
Database.java:
@Inject
public HikariDataSource initializeDatabase(Toml dbConfig) {
logger.info("========================");
logger.info("=> Loading database!");
logger.info("========================");
config.setJdbcUrl( dbConfig.getString("jdbcUrl") );
config.setUsername( dbConfig.getString("user") );
config.setPassword( dbConfig.getString("password") );
config.addDataSourceProperty( "cachePrepStmts" , "true" );
config.addDataSourceProperty( "prepStmtCacheSize" , "250" );
config.addDataSourceProperty( "prepStmtCacheSqlLimit" , "2048" );
ds = new HikariDataSource(config);
logger.info("========================");
logger.info("=> Database loaded!");
logger.info("========================");
return ds;
}```
Line ```this.dbManager = new Database();``` cause this error
you need to shade in hikaricp
what do u mean?
U mean this?
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>LATEST</version>
<scope>compile</scope>
</dependency>```
Can we see your full pom.xml file? (use a paste site)
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.
Can someone help? i dont know how to repair hover text and add open url on click event
it's just .hoverEvent(component) if you're wanting to do a show text hover event
open URL on click event is .clickEvent(ClickEvent.openUrl("etc"))
You're missing maven-shade-plugin
Hi! What are the steps for setting up messaging with paper plugins? Here is what I've done:
Velocity: server.getChannelRegistrar().register(MinecraftChannelIdentifier.create("imdabigboss", "main"));
public void onPluginMessage(PluginMessageEvent event) {
Paper:
this.getServer().getMessenger().registerOutgoingPluginChannel(this, "imdabigboss:main");
this.getServer().getMessenger().registerIncomingPluginChannel(this, "imdabigboss:main", this);
public void onPluginMessageReceived(String channel, Player player, byte[] bytes) {
But for some reason, no messages are coming through. Have I missed something?
ur not sending a message to a player
so no plugin messages will come through
make sure u also registered ur listeners
Well yeah. I can share that code if you like.
That's done, for sure, the other listeners work.
Spigot: player.sendPluginMessage(instance, "imdabigboss:main", b.toByteArray());
Velocity: player.sendPluginMessage(CHANNEL_ID, b.toByteArray()); (public static final ChannelIdentifier CHANNEL_ID = MinecraftChannelIdentifier.create("imdabigboss", "main");)
and ur velocity listener has the @Subscribe annotation right
its either Subscribe or SubscribeEvent, i forget
.
In the end... i found this lol
VelocityControl.getServer().getCommandManager().hasCommand(event.getCommand())
It's Subscribe. Yes. My events are fine.
Well, that tells you that a command with the given alias is registered, but there's some cases when even a registered alias is redirected to the backend server: for example, /foo gets redirected if the player doesn't have permission to execute foo on the proxy
Hi! How is it possible to load a plugin after server startup? PluginManager#addToClasspath is only for dependencies, right?
It's not possible
Yikes.. okay, I will initiate a server restart then. Thank you
Loading and unloading plugins at runtime can have undesirable side effects
yeah, thought so, I was just curious because there's a method in waterfall, but since I'm new to velocity.. 
Hi, why .clickEvent(ClickEvent.openUrl("www.serwer.pl/discord")) dont work?
My code:
source.sendMessage(Component.text()
.content("Jesli tak to serdecznie zapraszamy do nas! ").color(NamedTextColor.GOLD).build()
.append(Component.text().content("[Klik]").color(NamedTextColor.RED)
.decoration(TextDecoration.BOLD, true)
.hoverEvent(Component.text("Kliknij aby dolaczyc na discorda", NamedTextColor.GREEN))
.clickEvent(ClickEvent.openUrl("www.serwer.pl/discord"))
.build()));
hover text work but ClickEvent no
Hello, is it possible to somehow disable the automatic language adaption of velocity to a specific client and set one default language that is used for everyone? I currently have the following idea, but it doesn't seem to be working:
@Subscribe
public void onServerConnected(ServerConnectedEvent e) {
e.getPlayer().setEffectiveLocale(Locale.ENGLISH);
}
retranslate all language files to english
ctrl V
server connected event is probably too early for that
like, the client sends the locale info pretty late in the process, idk if there is an event specificlaly for when velocity reads the clients settings
How does velocity determine which language should be used for which client? Event with changed Minecraft in-game language the messages are still not in English. Also I tried adding a delay of 5 seconds before setting the client locale, but still I wasn't successful.
@sick ether Where are the language files located? Isn't the translation coming from adventure?
in jar file
In which path?
Okay, found it! Thanks a lot!
you're welcome
why .clickEvent(ClickEvent.openUrl("www.serwer.pl/discord")) dont work?
My code:
source.sendMessage(Component.text()
.content("Jesli tak to serdecznie zapraszamy do nas! ").color(NamedTextColor.GOLD).build()
.append(Component.text().content("[Klik]").color(NamedTextColor.RED)
.decoration(TextDecoration.BOLD, true)
.hoverEvent(Component.text("Kliknij aby dolaczyc na discorda", NamedTextColor.GREEN))
.clickEvent(ClickEvent.openUrl("www.serwer.pl/discord"))
.build()));
hover text work but ClickEvent no
the client reports their locale in the settings packet
what's my best bet for transmitting data between velocity & paper?
is it the same as bungee?
"best bet" is basically open ended
plugin messages still work within their typical limitations, ofc
best overall solution especially if you want something scalable is more on the lines of pubsub type stuff, etc
unfortunately this specific project isn't on a scale where that is practical, so ig I'll just go with plugin messaging
Hi, i'm trying to get the servers list on a velocity proxy, i don't know how to
can someone help me?
ProxyServer#getAllServers
i'm creating a bukkit plugin
it's not possible to get servers on a bukkit plugin. maybe with the plugin messaging channels
that's what i was trying to do
because i didn't want to import apis or do complicated stuff in order to do that
as now, i just removed that method, but if you could send me a wiki or a documentary, it would be helpful
Anyone?
what's that LoginEvent?
What event should I use for that?
what are you trying to do
check whenever a player joins the server?
or when it logs in via some authentication plugin
Yup
ok, so then you should use PlayerJoinEvent
lol? There isn't any playerjoinevent in the velocity api
oh sorry, i don't quite use the velocity api
have you registered the event?
I already registered the events class in the main.
there is no trace of server.getEventManager().register(plugin, listener); in the code you sent
so, i'll ask you again, have you registered the event?
in my main class: proxyServer.getEventManager().register(this, new BaseListeners(this));
you don't need to use this as argument
Anyone know why this command is never registered?
@Subscribe
public void onProxyInitialization(ProxyInitializeEvent event) {
CommandManager commandManager = proxyServer.getCommandManager();
CommandMeta meta = commandManager.metaBuilder("runtrial")
.build();
commandManager.register(meta, new RunTrialCommand());
}
?? Do you know how the Velocity API works? 😐
void register(Object plugin, Object listener);
/runtrial is not registered, nor does it work from the console
that's not even velocity api, it's just java
..
and also, the velocity docs doesn't say to do so
Oh, wait, now I understand what do you mean.
The this in the new instance of BaseListeners is an argument of the constructor
You have to register with an instance of the plugin
that's what i said, but you don't have to pass that istance to the event class
oh ofc
that was what zMario was saying
i also think (and i can be mistaken) that if you do so, there is a chance that the event won't work
that won't break things
that's how dependency injection works
so you can get access to the main plugin
ok, thanks
exactly
you can do the same using istances
what?
DI is passing an instance of your main class
do you mean using static abuse?
you can declare a method to get this
huh?
nope
the this as an argument goes to the method as an instance of your main class
wdym with static abuse?
you're abusing the functionalities of static methods
the issue with this is that it makes unit testing and such much more complex
it's not necicarily bad per-se
so?
that's still abusing static
it's fine and all
but there's no reason not to do DI if you can
atleast imho
i think that you're stretching a bit the concept of "abuse"
using a static variable is considered abuse
?
if so, that's the stupidest thing i heard in a while
not a static variable
a static instance
static itself is just fine
I use static methods all the time for utils
but using it to carry an instance is referred to as static abuse
and why is so terrible if i may ask?
read the stack overflow post I sent
evil is a strong word
but that's why it's referred to as static abuse
you're stating that i'm abusing static so you should telling me
read the post!
There's no reason for me to write why when 31 people replied to that post
you started this discussion so you're the one that should argument
"argument"?
wdym

