#help-development
1 messages · Page 1010 of 1
okay i think i solved my issue. for whatever reason canceling EntityExplodeEvent does the mobs from taking damage
so i just set a dumby NPC i have on my server to be the cause of the explosion
then in EntityDamageByEntityEvent i check if its that entity and cancel
you could just set a flag on teh exploding entity itself
problem is, that NPC might despawn if i go to a diff world
?PDC
oh yes i didnt explain that part
wake up CafeBabe
?pdc
lowecase
case sensitive
lol case sensitive
for most cases that would work, but i have a very specific case where the player themself causes the explosion. they jump in the air and when they land it creates an explosion
doesn;t matter
the explosion you spawn IS an entity
you set a flag on IT not on the cause
yes but i need to set the source entity
for blame yes, but not for the damage logic you wan tto apply
hmmm this works sort of. it's the effect i was looking for but unfortunately like you said at range it becomes inaccurate because the players location stays static
i think i may essentially do this exact same thing just using packets and adding the item manually
im pretty sure its the same entity used for e.getDamage() i just checked it
well yes, but if its not loaded, how does it take damage
or am i misunderstanding
but it shouldnt really matter
all info you need can be saved in the explosion
then it doesnt matter who done it
teh getEntity in teh EntityExplodeEvent will always return the exploding Entity
set a pdc flag on that when you create it
detect it in teh explode event
the source you set will be available in the damage event
heres the whole thing. a trident can be thrown and cause an explosion. a throwing tnt can be thrown and cause an explosion using createExplosion and passing in the trident and tnt entity as the damage sources. I have metadata attached to those two entities so i can ignore the damage in EntityDamageByEntityEvent and apply my own damage. I do this because these weapons can be upgraded and I want to increase or decrease damage. The problem is the player themself can cause the explosion by jumping in the air and landing. So if i set the player as the damage source entity then i run into issues. Because I can check if the damaging cause is an explosion then check if its the trident or tnt with my meta data were the damaging entities and cancel. But if I do damage cause Explosion and get the damager and its a player, well i dont think i can cancel that because a player setting off TNT normally in survival would be linked to the damager and i dont want to also cancel that. but maybe the damager would be the TNT that was set off
this could work but with a special metadata instead since its temporary
at least better than using my dumby npc
now that i think about it more, does a player setting off a standard TNT in survival and it killing someone even count as their kill? should it
normally no
i guess i gotta test it
if they throw a fireball they wouldnt normally be the damaging entity either i assume
i guess that could maybe work
Normally no, as thats not vanilla mechanics
you can via teh API though by setting the source
ah okay, well id probably just use metadata on the fireball to circumvent that anyways
Note setting teh source is setting the damage source not the explosion source
so as it stands i will do damageCause = explosion, then check if its my trident, tnt, or player. Then cancel
with thrown fireballs, it's usually a launched projection so it has a shooter
damn yeah
but a projectile right? or still explosion i guess if its not a direct hit
regardless, in EntityDamageByEntityEvent the damager() would still just be the fireball
it should never be the player if its an explosion
with launch you use a disguised projectile, then cause the explosion on hit
If the trident is what explodes then it would make more sense to put that as the entity
also it's preferable that you send text as text
instead of in an image
?paste
Hi, how can I change the size of the armorstand (the hitbox)
For what purpose are you trying to change it
yes
but the player themself can do a special move where they jump in the air and land on ground causing an explosion
Is it possible ?
so if i pass them in ill be checking for the player anyways with that part. so i just set the player as the damager for all types
depends on how you want to change it
Just the hitbox
You can change it on the server, not the client
change how? Bigger, smaller?
smaller
as far as im concerned there will never be a case where theres an explosion and the player is the direct damager entity. except for where i explicity say to in my code
so i cancel that
and it works great now
and why do you need to do that
Without using marker and small
then no
^^ can't help you further without any information
Tell us what u wanna do and we can maybe find another solution
To place the armorstand above player head exactly
You are still not properly explaining. What is your end goal?
so xy problem
?xy
We know an AS as a passenger will be offset. We also know about collisions for clicking. So stop beating around the bush and tell us EXACTLY what you want to achieve
We might be able to help and by being precise we might avoid 10 hours of back and forth with questions
Why does it take so long for a premium resource to be verified?
And how can I speed up the process? Can I send src to some staff member?
Verification is done by volunteers in their free time
all you can do is have patience
Bro wants to become a volunteer just for speed up his own resource 💀 Thats not really what that word means xd
Yes
If you are trying to add a second nametage above the player, i think theres better ways to do it now instead of what you are thinking
can u show me?
If you really wanted to use an armor stand without a hitbox, then your answer is nms (sending packets)
You'd need to override the internal hitbox (probably each time it's refreshed)
I think using the scoreboard you can at least get one under
And send refresh hitbox packets (dunno what that is)
Nah player's name can't be with hex colors
Thats why I'm trying this way
Yeah i think you gotta go with nms, unless you can attach a TextDisplay to a player
But i dont think those are entities they cant be mounted you would have to update the location basically on playermovement which can be slow to do for every player
TextDisplays are 1.20.6
Havent used them yet they might be easily attached to an entity dunno
The addPassenger is smooth asf and I need a same result to place the armorstand above the player
And now that i think about it, with nms youd still have to teleport the armor stand to the players head on movement probably
arent text displays 1.19.4 or whatever?
I doubt theres an easy way to use addPassenger but there might be
I thought they were brand new ive been out of the loop for a year
ye, can u show me?
with current version syou can use a TextDisplay as a passenger
using a text display as passenger is the easiest thing ever what
Ayo there you go
Yes but I don't wanna use TextDisplay
you can apply translations to align it however you want and it has no ditbox
what version are you coding for
I was talking about a nms armostand
Bruh
xD
Use text display lol
nms AS has teh same issues of collision boxes or stuttering if its not a passenger
i thought your context was this: #help-development message
Yeah ur good alot of people typing lol
TextDisplay is the way to go
Nah bro I'd also like to examine future premium plugins. Seek if they're infected with malware, backdoors or generally against the rules
why not
Exactly why no textdisplay lol
they're my fav entity
oh
yea you can
That makes more sense but in that conversation that sounded highly selfish, im sorry dude xd
lm see
you might have issues with teleportation, not sure how spigot handles that, paper doesn't directly allow you to without a flag that's all i know
True if its a passenger. But he said he wants to use passenger anyways
So hes prob accounting for that or should at least
cross-world might not
unmount and then mount on respawn
nope
Yeah figured
Honestly worth it cause teleporting on player movement would be slowww if you get alot of player online
it looks really bad too
wouldn't necessarily be slow but looks shit
as it's slightly delayed
So @dusty nexus think of these edge cases when you do passenger
Death, teleport, leave, join, etc
All gonna need to be listened for
Ye
ye
the nice thing is that you can just do Player#hideEntity
oh also gamemode switching!!
important
My server never got big enough to notice a delay i just read to never use playermovement if theres another way
I have one check for it and its to raise the void height
Actually wait
I changed it to a runnable
every tick tp it??
Every tick i check their Z value and if its like below 40 i kill them
okay but that's unimportant here and pretty sure you mean y
Cause i made a skylands map and dont want to put the islands close to the void and have it look all shitty and dark
Yeah i was just saying i avoid playermovent at all costs if theres a better way
And right now text display as passenger is the way
i still do it with the move event tho
I mean if it works it works
should be better than a task
as it doesn't check every tick
pretty sure playermoveevent triggers at least every 4 ticks
Probably more actually like 20
as it's 5x/second if not moving
wdym? every tick ig
Yeah
only if the player is moving
It could maybe send an event multiple times per tick
If they are sporadically moving
nope
At least for my case its not necessary
Ah okay i dont really know what constitutes as an event for that
This might not be an ideal solution for my problem (certainly a bad solution xd) but it's been the only thing preventing me from finishing for around a month now, and it's really unmotivating i gotta say, so I've come up with another solution.
As the data needed to be stored isn't much, it's possible to store it in localizedName. Ik this is a bad thing to do, but as I already have ways of identifying items which would use that, I could grab the real localizedName, as I would seperate the data with another character I won't use otherwise. The data could then be split by, for example double underscores so I get all seperate pieces of data.
The actual problem I had with PD I'll leave for future me to solve, maybe when I'm more experienced with PDCs as this was the first real time working with them
check out ServerGamePacketListenerImpl
Huh insteresting never seen this. And now that i think about it more itd be impossible to send an event multiple times per tick that doesnt even make sense logically. Im tired lol
Well basically i use runnable cause i only need to check every 1-2 seconds. For something more involved like a second nametage obviously playermovent is the best itll get
But of course we got text displays now
So add that thing as a passenger and go wild
What are you trying to do exactly. Give a broad overview of the start and end goal
Often the solution you are already implementing could be flawed and there might be a better way to do it overall
So if you just give a general statement with some examples of edgecases im sure we can come up with a solution here
So I basically have 'Tool' items which can have up to 3 upgrades and theoretically unlimited abilities. Upgrades and abilities are stored in enums, which hold all the data (identifying name). These names get converted to integers acccording to what value I gave them, and from that I store it in an integer array for storing in PDC
My end goal is that this works flawlessly and would work for every item
But somehow even when I overwrite this data, It still shows the already modified one, which is from a different item
lmk if u need any other information (I'll be away now bc RL's calling lmao)
important code pieces are found in replies from the messages if u go through the replys
Heres an idea for what I think you are trying to do. You want special items on your server? Create a java class called Weapon and use that to store an item and any special attributes about it such as material, damage amount, name, methods that do special abilities, upgrade values in arrays, etc. Then create an Enum class which will store the WeaponType, like THORS_HAMMER for example. Add this enum as another field inside of your Weapon class. Now when you want to give a player a special item, you simply create an insance of your Weapon class (which will create the item) and then give that item to the player. When you create the actual item inside of the Weapon class, attach a PDC to it that stores the WeaponType Enum you made earlier. Then whenever a player uses that item such as for a BlockBreakEvent, you can do item=e.getItemInMainHand() or whatever it is and then simply retrieve the PDC from that item. Then you get the WeaponType from the PDC you stored earlier. And now you know the exact Weapon they are using. Keep in mind you will only know the type at this point. But if you are being a smart programmer and storing your Weapon instance you made earlier to give to the player, you can simply say okay I know hes using THORS_HAMMER so im going to go retrive that Weapon instance I made earlier so I can get values from it I need.
I just read your last messages what i wrote should apply
You are going at it like a caveman, you need to use a wrapper like i suggested. The Weapon class will be your wrapper
If you need any help with direct implementation @ me
is it possible to get chunk id? if not would it be very burdensome for the server to loop all chunks and put to the hashmap id per chunk when plugin start?
What i wrote above is for you
why?
why I need chunk id?
Why all of it?
X,y is it’s id
It’s unique
i have an idea to make somethink like postal system, postal would be chunks, then i will get nearest chunk (postal) to the player and shows chunk id
I think i need id like {1,2,3,4 etc…}
I've no clue what a "postal system" is sorry
Yeah just stringify the position
A chubk is a 2d map, it cant be flatmapped to one integer because it’s effectively infinite
Wrote the code when I was pretty nrw to java, I didn't want to rewrite half my code so I decided to go with the old approach. But what u said really seems like the best possible way. Theoretically the same problem may occur but I don't think so. Really ty for ur help, this one little problem really's been bothering me haha :D tysm
Yes
okay thanks
X:Z is enough
Brother i did the same exact thing when I first started. I think most people do. You need to take advantage of java objects its the only way. Trust me the headache of fixing it now will be infinitely rewarding on the other side. It’s going to be a pain in the ass but will be way way more scalable.
Ik haha
There are alot of specifics I left out. Im not sure how familiar you are with java or object oriented programming in general
Refractoring code is necessary sometimes c:
But mostly everything in your Weapon class should not be static either
From one fellow cat profile pic to another you got this
https://paste.md-5.net/uconekageg.sql
Could someone tell me why am i getting this error? doesn't make sense to me
My line 83 :
List<String> worlds = data.getConfig().getStringList("created-worlds");
for (String world : worlds) {
System.out.println(world);
Utils.createWorld(world);
}
loadGames();```
(line 83 is the list)
Whats in Utils.createWorlx
But i don't think the error is there
maybe
so line 83 is:
List<String> worlds = data.getConfig().getStringList("created-worlds");
?
yea
But dont be afraid to use static in the beginning @pliant topaz. Just try to implement what i said and we can help you make it better. I also updated that message a bit
That should give you a pretty good jumping off point
Whats in DataFile, line 30?
reload method
but i'm not using it there i believe
let me check lol
Your stacktrace says NexusCore 83 calling a method -> DataFile 42 calling -> DataFile 30
just here
so
You tried to access a Yaml file with a Location in a world which is not loaded
Could be because of this?
all objects in a config are deserialized the instant you access the file
it is called after trying to create the world
So if it uses a world thats nto loaded it blows up
just load the world
I'm doing that, but getting the error because it is not loaded
have mvcore and others as dependencies
i think i have a list of what people use atm
I have just read that the server "stops" until world is loaded
you sure its loaded?
it does
I mean yea
On Spigot
I'm on spigot
The method that is calling the location from the file is loadGames();
It shouldn't be null right?
I try to explain:
The code:
dataConfig = YamlConfiguration.loadConfiguration(configFile)
or
YamlConfiguration defaultCOnfig = YamlConfiguration.loadConfiguration(...)
Tries to deserialize the location to a world thats not loaded
yes, you access the config before loading the worlds
But i'm just getting world name there
teh INSTANT you TOUCH a config its object are deserialized. Worlds must all be loaded before you touch it
keep your world names in a different config
elsewhere in that config is a serialized Location
.
i understood now
teh whole file is parsed at once
Is there a way to send data and messages from one server to another without relying on Redis? Since most of my customers don't know how to use redis
ik there's pubsub on redis, but looking for easier to setup alternatives for customers
So I want to send data from lets say KitPvP to Hub
Using Bungeecord? I think theres a Bukkit Plugin Messaging Channel
the other alternative is that you consider the ips to be static and do a direct plain old TCP/UDP connection which is negotiated using a plugin message or via the configurations - but that isn't ideal compared to more stable solutions and also means that TCP/UDP port needs to be exposed in the first place
yea tho letting customer just setup a very simple server socket thingy isn’t that bad, but yea you run into some issues if you wanna scale on it
You can use my new java library pigeonlib
For sending and receiving data through carrier pigeon
* pigeon not included
Does it support immortal snail
Yes but don’t touch it
No
help me pls "Invalid signature for profile public key"
in regards to what
Wrong channel but
okay thanks
My server uses bungecoords, I can join the lobby, but when I enter the survival server I get kicked "Invalid signature for profile public key"
all servers behind bungee shoudl be set to offline but in spigot.yml bungeecord: true
I've done that, but still can't
You did it on your lobby server but probably not on your survival
Only a few experienced "Invalid signature for profile public key".
my friend can join to survival, but i cant
different clients?
The same
one pirate, one not?
Then you must have bungee set to offline
and you are using some auth plugin
I can't help with offline though
Why is Trident#getItem() marked as experimental?
Hello i'm trying to send an Entity Metadata packet but I'm getting an error when the client is receiving the packet
**My code : **
final Player player = Bukkit.getPlayer("Hokib");
if (player == null) return;
PacketContainer packet = manager.createPacket(PacketType.Play.Server.ENTITY_METADATA);
packet.getIntegers().write(0, player.getEntityId());
WrappedDataWatcher watcher = new WrappedDataWatcher();
// Index 0: Byte flags (e.g., is on fire, crouched, etc.)
byte flags = 0x01; // 0x01 for on fire
WrappedDataWatcher.WrappedDataWatcherObject object0 = new WrappedDataWatcher.WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class));
watcher.setObject(object0, flags);
// Index 8: Indicates the player is interacting with the item in hand
byte handFlags = 0x01; // Assuming 0x01 means interacting with the main hand item
WrappedDataWatcher.WrappedDataWatcherObject object8 = new WrappedDataWatcher.WrappedDataWatcherObject(8, WrappedDataWatcher.Registry.get(Byte.class));
watcher.setObject(object8, handFlags);
// Convert the WrappedDataWatcher to a list of watchable objects
List<WrappedWatchableObject> watchableObjects = new ArrayList<>(watcher.getWatchableObjects());
// Set the metadata in the packet
packet.getWatchableCollectionModifier().write(0, watchableObjects);
// sending...
Error :
Packet encoding of packet ClientboundSetEntityDataPacket (ID: 86) threw (skippable? false)
java.lang.ClassCastException: class net.minecraft.network.syncher.DataWatcher$Item cannot be cast to class net.minecraft.network.syncher.DataWatcher$b (net.minecraft.network.syncher.DataWatcher$Item and net.minecraft.network.syncher.DataWatcher$b are in unnamed module of loader java.net.URLClassLoader @3b764bce)
I don;t see it
in 1.20.5+
wasnt the case before that
so im wondering what changed and if i can still use it
I'm looking at 1.20.6 javadocs
its under AbstractArrow
I'm guessing you are looking at Paper
which trident implements
oh possible, let me check
part of the plugin is only enabled if paper is also there
ah I see
nope definitely spigot
nope, its experimental on Spigot too
my guess is that it was previously a trident exclusive method and it instead got moved to abstractarrow so that regular arrows get it too
Anyone have an idea why Chunk#unload would return false?
You need someone in teh know then, Col, Choco or...
so its experimental for regular arrows but for tridents nothing changed
implementation the same
I'm trying to load chunks, create snapshots of them, then unload them again, but somehow unload() always returns false and they stay loaded
If its being held by a ticket or there is a player in the chunk
Can someone help me as to why the player can still see server broadcast messages and player joins / leaves?
I'm new to protocollib. I tried the player info packet, but it still doesn't work.
Why not just send the message to privileged players
Because I'm trying to cancel messages from being recieved by a player in a list
It's in general, not just from my plugin
Is it printing “packet cancelled”?
yes
it works fine with player messages, but when it comes to anything else like player join / leave messages it does not work
Theres also system chat messages pretty sure it’s another packet
Ah okay I'll look further, thanks
Keep in mind protocol lib isnt updated for 1.20 so it might be missing some packet types
how can i disable join, death and quit messages
Config for join and leave, gamerule for death
You can also pick up on the join/leave/death event and use event.set{event}Message("");
This is a simple google search
if i do the message to an empty string will it work?
oh what did i do wrong here?
Show where you use PlayerJoinEvent
different listener class
Oh wait i have an idea
i set maxHealth to 1.0 earlier
would it break if i set the health to a number higher than the maxHealth?
Yes
seems unrelated to this event
Ij even shows you where it's going wrong lol
oh i remember having that earlier but it wasn't an issue
getItemInUse doesn't return what you think it returns
you're looking for getInventory().getItemInMainHand()
Gets the item that the player is using (eating food, drawing back a bow, blocking, etc.)
this is what the item in use is
so i use this function to give a player a name prefix, how bad of an idea is it to just call it everytime that prefix changes? ```java
public static void setNametags(Player player) { // create scoreboard & teams
player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());
for (Map.Entry<String, Rank> entry : Ranks.getInstance().getRanks().entrySet()) {
Rank rank = entry.getValue();
Team team = player.getScoreboard().registerNewTeam(rank.getName());
team.setPrefix(ChatColor.translateAlternateColorCodes('&', rank.getPrefix()));
}
}
So you refresh the scoreboard when the prefix changes?
no i was wondering if i could just call the function again when it changes?
it looks like it just makes a new scoreboard that could be bad
so extra function for refreshing?
i'm gonna use .breakNaturally actually but is there a way i could remove the drops of the block
oh wait i have idea
lemme test something first
I'm not 100% on scoreboards its been over 3 years since I touched them, but can't you get the player scoreboard and modify the value instead of making a new one?
okay my idea didn't work
is there a way i could not drop the average drop of the block and also play the sound of the block breaking
oh wait the particles also aren't there
is it possible to listen for right click on air with no item in hand?
No
You should be able to
no packet is sent
md_5 said no packet gets sent
PlayerInteractEvent and check if the action is left_click_air
so i'm hella confused
but right click might not work
i want right click as well
ima just force give the player an item
wait...
what if i trick the client that he has an item in his hand with a fake packet
You could put something in their left hand
You could also just place an entity in front of them so they interact with that
so either hypixel is using magic or im missing something
he can rightclick on air with no items
theres most likely an entity in their face
it works if there's an invisible entity?
sure iirc
does that mean the client knows about invisible entities 😳
yeah
wild stuff
in tweakaroo you can see invisable players with 1 tweak last time i played mc
The client know a lot of stuff. That's what hackers do. They use data that the client would normally not display and kinda adds an "overlay" over your screen to show you some secrets
why does minecraft give so much to clients
discord tells all users about channels, even ones they have no permission to se e
in the early days u could even modify ur own inventory while in survival, thank god they made it serverside
Because it's very hard to know exactly what the client should and shouldn't have. Most of the reasons also just boil down to make the server run more efficiently and not let players, blocks and entities in general appear out of thin air
Admin items are wild with specific nbt data. Early day griefing was kinda 💀
companies trust their clients alot
bedrock had that exploit until 2022 iirc
Fr💀
is conorsmine writing an essay
yes
did u just spend like 5 minutes writing yes
yes
companies trust their clients alot
yesn't.
Let's view the following example:
Two players are sperated by a stone wall, neither of the players can see each other. With your logic, the server shouldn't send the players any data about the other player. Well... that makes sense, but there are two issues:
- The server would need to do multiple checks to make sure that players that should be able to see each other actually do so. This issue gets worse the more players you have. 2 players is fine, the server checks if Player A can see Player B and Player B checks if they can see Player A. But you rarely are only 2 players. Now lets assume you are something like 16 players. That would be 16 checks per Player for a total of 256 checks. Depending how this check is performed, this might take a while.
- Player A walks a bit to the side, so far that Player B should be able to see them. Since the server will most likely check every tick if players can see each other, it'll take at worst 50ms before the server checks if the players can see each other. But don't forget that it will also take some time for the data to be sent to both players, maybe 20ms. At thins point a grand total of 70+ms have passed before players could see each other. On your screen it would seem like the player just appeared out of thin air. That's... shit.
Reasons like these just make it impractical to sanitize every bit of information that gets send to every client. It's far easier to just estimate that every player within X blocks should be informed about the player. Then the client does the calculations, therefore a lot of load is removed from the server.
hackers can use latency to their advantage. There was an issue where hackers just didn't send movement packets to the server for a while and then spammed a bunch when they wanted to "teleport". Since the server was naive and trusted the players, it execute the "movements" one after another, effectively teleporting them to a destination.
I think paper and spigot might still have this issue, but in a very, very small amount. While you can't "teleport", you can move a very small amount, iirc
Any thoughts what this kick means?
https://imgur.com/a/crash-RTrg2wc
yeah, but there's also the opposite. If you sit in a minecart and still send movement packets, you get moved a very tiny amount. So you could just ride a minecart without tracks. This was once used to ignore protection rules for some protection plugins
Looks like some packet is not doing what you intend
can u remove the fire effect from a fireball
If only I knew about them however 😦
No error message in console either
This is btw a random trivia fact I vaguely remember, so I don't have any source to back this up. Therefore take this with a grain of salt
Is it from a plugin you made do you think?
how do i make non persistent block displays?
i made one but when i left and rejoined they still existed
I'm pretty confident
Do you remember the other day (ith it was you) I thought there was a setPersistence on display entities
it wasnt me
disable each plugin one by one until it stops
also that looks like a protocollib or viaversion kick message
i did it but it still exists
nvm the chunk has a ticket
Haha
I'm pretty confident it's an error from my plugin
What kind though?
do u use nms
Indeed
try disabling ur plugin
My queue to dip
It's only during a boss fight
what does ur plugin do with entities or bosses
There is a hit phase, once the hit phase is 0, the boss summons some kind of beacons around it
Instantly killing the player if the player touches the beam
https://paste.md-5.net/uvudiqopus.cs
This should be it
wtf is exampleclass.entitybeam
public static void entityBeam(final ArmorStand stand, Location location1, final Player p, final Entity e) {
final Beam beam = new Beam(stand.getLocation().clone().add(stand.getLocation().getDirection().normalize().multiply(20)), stand.getLocation().clone().add(stand.getLocation().getDirection().normalize().multiply(-20)));
stand.setGravity(false);
beam.start();
new BukkitRunnable(){
public void run() {
if (stand.isDead()) {
if (beam.isActive()) {
beam.stop();
}
this.cancel();
return;
}
Location location = stand.getLocation();
location.setYaw(stand.getLocation().getYaw() + 2.25f);
stand.teleport(location);
Sputnik.getEntity(stand.getLocation().add(stand.getLocation().getDirection().multiply(20)), stand.getLocation().add(stand.getLocation().getDirection().multiply(-20)), p, e);
beam.setEndingPosition(stand.getLocation().add(stand.getLocation().getDirection().multiply(0 - Sputnik.findArgo(p.getLocation(), stand.getLocation()))));
beam.setStartingPosition(stand.getLocation().add(stand.getLocation().getDirection().normalize().multiply(Sputnik.findArgo(p.getLocation(), stand.getLocation()))));
if (!beam.isActive() && !stand.isDead()) {
beam.update();
}
}
}.runTaskTimer((Plugin)ExamplePlugin.getPlugin(), 0L, 1L);
}```
whats Beam
public Beam(Location startingPosition, Location endingPosition, double viewingRadius, long updateDelay) {
Preconditions.checkNotNull((Object)startingPosition, (Object)"startingPosition cannot be null");
Preconditions.checkNotNull((Object)endingPosition, (Object)"endingPosition cannot be null");
Preconditions.checkState((boolean)startingPosition.getWorld().equals(endingPosition.getWorld()), (Object)"startingPosition and endingPosition must be in the same world");
Preconditions.checkArgument((viewingRadius > 0.0 ? 1 : 0) != 0, (Object)"viewingRadius must be positive");
Preconditions.checkArgument((updateDelay >= 1L ? 1 : 0) != 0, (Object)"viewingRadius must be a natural number");
this.worldname = startingPosition.getWorld().getName();
this.viewingRadiusSquared = viewingRadius * viewingRadius;
this.updateDelay = updateDelay;
this.isActive = false;
this.beam = new LocationTargetBeam(startingPosition, endingPosition);
this.startingPosition = startingPosition;
this.endingPosition = endingPosition;
this.viewers = new HashSet<UUID>();
}```
so which part uses nms?
get direction is already normalised
normalized means the length is 1 block
i think i was trying to figure this out but
i wanna make a system that doesn't save worlds when they are unloaded?
my idea was by simply just making a copy of the world and taking people there, then when the world isn't being used anymore just deleting the copy
you have to remove them from the disk
creating a world creates a folder on the server with the world in it
oh
i dont know of a way to only create a world in runtime memory
anyone here ever used discordkt
no
Kord is nice
Isnt DamageSource an enum?
i dont know that is why i am asking
getCause() not getDamageSource
remove the ! if you want to cancel lava damage
no im cancelling everything except lava damage
ok
its an expansion on kord
Neat
ig thats enough awful code for today
We love awful code
im wondering how many people would be fired if they shipped things i saw here into production
Truth
Well that’s another issue
ceo is always about profit
Which is why it only matters if it works kek
Sorry, I encountered an error while processing your message.
That’s not to say as a dev you shouldn’t care for proper writing techniques and what not
but having non maintainable code slows things down 😳😳
but it doesn't matter for profit ad ceo doesn't know shit about code
Maintainable, scaleable code, hell nah kekw, gimme money thats all
you can milk old code for so long before it all comes crashing down
im literally reusing old code rn xD
when a competitive project comes along yours is dead
you can't restructure
you just become skype
who the hell uses skype
i remember when i was added to 1k people groups
and there's no option to turn it down
so every day i was spammed by these groups
sounds like a real shitshow grandpa
we'll be grandpas together in 5 years don't worry
true
elgar is a grandpa, ask him about his experience
Exactlyyyyy
i might
Elgarl is a Chad grandpapa
lol
Granddaddy
what the sigma
Not the cat
NOOOO
Im doomed
😔
Alright but lets try to keep this channel a bit clean when it comes to gif and meme shitposting
fine
I mean you caught me lacking w my brainrot soo :(
this is general
what do you mean
smh
thx man 🤝
private void reloadPlanetFundAmount() {
planetFund = BigInteger.ZERO;
for (OfflinePlayer player : Bukkit.getOfflinePlayers()) {
double balance = econ.getBalance(player);
BigInteger balanceBigInt = BigInteger.valueOf((long) balance);
planetFund = planetFund.add(balanceBigInt);
}
}
could yall imagine a better way to get the total money on the server
seems pretty good already
bukkit runnable, start a task for every player and run it async
mhm
I mean you could technically parallelize it
i give advice not good advice so take it with a grain of salt
but I think it'd be pretty diminishing
do yall think it would be faster
to load it once on boot
and then track transactions myself
whats option B?
wheres the decimals
reload it very often
i dont see a reason to optimize it if you dont have 20 thousand people
not sure when though
if you run it once a minute async it should be fine
some sort of sync buffer that runs periodically then and updates?
ig when someones balance change, change the total too?
if you really want to optimize it
yh thats what i mean with track transactions myself
well I mean usually a total is calculated just like that, you poll an update every so often, ofc given that the data availability of the total isn't needed to be realtime-high
british people really are a troll
is it possible to completely freeze the player's camera/head from moving?
Is this allowed? Can I add a "_" inbetween without issues? The IDE isn't complaining, so ig it's ok
yes you can
neat
You can make the player spectate smth
just write Ox00000fff
or smth
But I find it's more understandable that I want the last 12 bits of an int this way. Tbh I almost never use hex for masks, I find bits just convey more of an intent
bits for masks make sense
~0 >> (32 - 12) or smth lol
im gonna jump infront of a truck on the m42
what are you doing
trying to get data from a companion object ona class specified in an enum value
¯_(ツ)_/¯
i can't delete a value from an List<String> while in a BukkitRunnable?
?paste
if you want other thing tell me
How do you create List instances inside of map
Like how do you set map value
?paste
immutable collection?
the code wortk i know
Collections.singletonList is immutable if thats the issue
^
also youre doing three map operations to waste two
but when i wan't to delete for the list inside of the map I just can't do it
You are putting an immutable list as a value
actually way mor
You can't mutate that list
?
i cant' mutate that list = what?
public void addPlayerInvitation(String playerName, String Inviter) {
invitations.computeIfAbsent(playerName, k -> new ArrayList<>()).add(inviter)
}
probably
you cant call any methods that modify it internally
= can't add or remove any element
cuz they didnt learn liskov
in a bukkitrannable?
no its about the list
because of the collection.singleton?
look at the impelemntation of Collections.singletonList
Yes
Goofy Java
reminds me of our discussion about liskov
yep, in conclusion goofy java
Loll you'd be surprised the shit I see at work.
the shit i see at college
Well yeah, it's college, they're learning
It's why code reviews exist, they'll phase out of it
they taking a long time to learn
Some people learn at their own pace. When I was in college some people took the entire course to get a grip, some people got it right away
However there are a lot of ppl in college doing programming who just shouldn't do it
has anyone made a tutorial for compiling and using vsc as a ide instead of intellij
i jus wanna liveshare wit my besties lmao i didn't think it would cause any issues
OH !
That's cool though I didn't know this kind of thing existed
just invoke maven
or gradle or whatever
Is it possible to get a list of possible equipment slots for an entity?
isnt there an integrated code together?
ah well that one supports cross ide
omg im triggered, I am trying to use the translated texts for statistics for minigame purposes, but for some reason, while all other languages have 2 arguments for the player killed "entity" "2" times, some languages like french and spanish only have one argument
cuz the translator was lazy or something
so it doesnt read well since the actual mob you killed isnt in the translation in that case
but its only for about 13 json files
all the other languages have double arguments, like you would expect..
Sure he was lazy? Not he was like: Do it on purpose to fuck someone up, that would be hilarious xd
but I dont think there is any way to treat those languages differently when translating, since its done in the client
yeah well they did it I guess
it is kinda funny
but its also kind of an unsolvable problem for me
True, sadge
I can cheese it a bit
it would just be You killed 2 " " (mob_name) which works for most languages, where " " is an empty placeholder and (mob_name) is after the translated part
works well enoug I guess
Hello, i'm trying to use EntityType enum and my IDE (IntelliJ) tells me it does not exists and so it does not compile ... I'm using Spigot 1.20.6-R0.1-SNAPSHOT and EntityType exists in the documentation. Any other class like Player, Bukkit, CommandExecutor, etc are available so I don't understand. If anyone has an idea. (Yes I tried to add EntityType import line)
Update ij
Update IJ did not work. EntityType seems to be a problem in version 1.20.6 because it is working in 1.20.5
Send your pom.xml
I desperately need help adding nms to my plugin; ive tried like 100 times and guides and none of them work and i have nfi why. Just getting 😦 now
https://blog.jeff-media.com/nms-use-mojang-mappings-for-your-spigot-plugins/ this is the one that should work 100%
If you need to access NMS classes from inside your Spigot plugin, it is a very good idea to use the so called Mojang mappings. Disclaimer: This post is written for 1.20.4. If you use another version, you of course have to replace every occurance of “1.20.4” with the version you actually use. What are...
im using paper not spigot
?whereami
why was my message deleted
?whereami
you are in spigot
i wasnt going to prolong the conversation any more than sending the link to help them
includes isn't a thing but is there something kinda like what i'm going for
Not sure if there is for arrays
But you can make it into a set or a list and use contains
u need to use streams to check in an array
new ArrayList<String>("A", "B");
u cant do that
List.of
aw
List.of(...)
Or Arrays.asList
actually it'd be nice if arraylist had a constructor like that
since List.of is immutable iirc
okay cool
did u just double not
im in immutable is a not
yes
but dont cast it as player
also u can just do if (sender instanceof Player player)
you missed the part where I don't care
boolean isImmutable = Idk.isImmutable();
if (!!!!isImmutable) {
...
}```
does that look annoying to u
i just wanted it to return early bc everything was in an if conditional and i thought it looked pretty bad
return true not false
the console would be hella confused if it just sends the usage message
what does the bool do actually
false = sends usage message
ah
also do these enhanced switch cases need breaks
(ima change how this is coded later i'm just curious)
nope
cool
fancy
fence
farce
Why player gets send message twice
private void processUpgrade(Player player, int upgradeCost, int upgradeLevel) {
String uuid = player.getUniqueId().toString();
try {
int balance = plugin.getDatabase().getBalanceFromDatabase(uuid);
if (balance >= upgradeCost) {
plugin.getDatabase().updatePlayerBalance(uuid, balance - upgradeCost);
plugin.getDatabase().setPhantom(uuid, upgradeLevel);
player.sendMessage(ChatColor.GOLD + "You bought Upgrade " + upgradeLevel + " for the Phantom Kit!");
player.playSound(player.getLocation(), Sound.BLOCK_ANVIL_USE, 1.0f, 1.0f);
} else {
player.sendMessage(ChatColor.RED + "You don't have enough coins to purchase this upgrade!");
player.playSound(player.getLocation(), Sound.ENTITY_SHEEP_AMBIENT, 1.0f, 1.0f);
}
player.closeInventory();
} catch (SQLException ex) {
ex.printStackTrace();
player.sendMessage(ChatColor.RED + "Error processing database transaction.");
}
}
what message are they getting twice
player.sendMessage(ChatColor.RED + "You don't have enough coins to purchase this upgrade!");
this is sending twice
where are you calling the method
@EventHandler
public void onInventoryClickPhantom(InventoryClickEvent event) {
if (event.getView().getTitle().equals(ChatColor.YELLOW + "Phantom Kit")) {
Player player = (Player) event.getWhoClicked();
ItemStack clickedItem = event.getCurrentItem();
String displayName = clickedItem != null && clickedItem.hasItemMeta()
? clickedItem.getItemMeta().getDisplayName()
: "";
if (displayName.equals(ChatColor.YELLOW + "Upgrade 2")) {
processUpgrade(player, 1000, 2);
} else if (displayName.equals(ChatColor.YELLOW + "Upgrade 3")) {
processUpgrade(player, 1500, 3);
}
event.setCancelled(true);
}
}
does it always happen? you could be actually double clicking. add a log in the click event to see where its running twice
i'm getting a null error but i literally have a null check i'm not sure what's up
also the "okay ima do that" does get sent to the player so the code is good up to that part
You check if it’s null
But then in the else you call toLowerCase on it
Nvm I’m dumb
yea it wouldnt be null in the else
i feel like i'm missing something directly jingled in front of me oufhh
Wait you are accessing the 3rd element in args
But the command in the other screenshot only has 1 argument
the crash happens before these two messages are sent
Yeh it’ll brick as soon as you do args[2] == null
Because 2 is outside the bounds of the array
args.length
fixed thank you
Anyone know an event for when primed TNT explodes, affecting (usually moving) other primed TNT?
I checked EntityDamageByEntityEvent, but it isn't called since the primed TNT doesn't deal damage to other primed TNT. I can't find anything else in the Spigot javadocs that may be fired in this situation.
Currently my solution is to check nearby entities for primed TNT on EntityExplodeEvent and manage them that way. But I'm wondering if there's a better way. If not, that's chill
Does it call EntityKnockbackEvent
is TNTPrimeEvent not called?
Should be, but that’s basically the same as the explode event
Just allows you to stop the explosion from happening
Not for my situation. I'm looking for when primed TNT affects other primed TNT rather than priming blocks
Tbf I think the solution I have atm is sufficient. Thanks for the help though c:
Not sure if this is the correct channel or server but I am currenting using spigot 1.16.5 and I am using mavern and vsc to make plugins and currently I am having issues with connecting a plugin to postgreSQL if anyone could help me.. that would be great..
sure, what have you tried so far
and what isnt working
Is it okay if I dm you
so I don't flood the server chat
alr
I've been following this youtube video for connecting spigot to postgreSQL and current my code looks like this:
package com.pixelite.easylogin;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Logger;
import org.bukkit.configuration.Configuration;
import org.bukkit.plugin.java.JavaPlugin;
import org.postgresql.Driver;
/*
* easylogin java plugin
*/
public class Plugin extends JavaPlugin {
public static Logger LOGGER = Logger.getLogger("easylogin");
private CommandHandler commandHandler;
public Connection connection;
public Configuration config;
public void onEnable() {
loadConfig();
LOGGER.info("easylogin enabled");
try {
DriverManager.registerDriver(new Driver());
connection = DriverManager.getConnection(
"jdbc:postgresql://" + config.getString("database.ip") + ":" + config.getInt("database.port") + "/"
+ config.getString("database.database") + "?stringtype=unspecified",
config.getString("database.username"), config.getString("database.password"));
commandHandler = new CommandHandler(connection);
getCommand("register").setExecutor(commandHandler);
} catch (SQLException e) {
LOGGER.severe("failed to register");
e.printStackTrace();
}
}
public void onDisable() {
LOGGER.info("easylogin disabled");
}
public void loadConfig() {
getConfig().options().copyDefaults(true);
saveConfig();
config = getConfig();
}
}
package com.pixelite.easylogin;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SQLHelper {
private Connection connection;
public SQLHelper(Connection connection) {
this.connection = connection;
}
public ResultSet query(String query, Object... args) throws SQLException{
PreparedStatement preparedStatement = connection.prepareStatement(query);
for(int i =0; i < args.length; i++){
preparedStatement.setObject(i + 1, args[1]);
}
preparedStatement.executeQuery();
return preparedStatement.getResultSet();
}
public void update(String query, Object... args) throws SQLException{
PreparedStatement preparedStatement = connection.prepareStatement(query);
for(int i =0; i < args.length; i++){
preparedStatement.setObject(i + 1, args[1]);
}
preparedStatement.executeUpdate();
}
}
I am not recieving any errors
like syntax
errors or anything
then I have a config file
like this
database:
ip: localhost # host of your database
port: 5432 # default port for MariaDB and MySQL
database: postgres # name of your database. A database server can contain multiple databases
username: postgres
password: 12345
What java are people using to compile for latest mc plugins? 21?
ill show you the server error now when I run the server
java.lang.NoClassDefFoundError: org/postgresql/Driver
at com.pixelite.easylogin.Plugin.onEnable(Plugin.java:25) ~[?:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:342) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:480) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at org.bukkit.craftbukkit.v1_16_R3.CraftServer.enablePlugin(CraftServer.java:492) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at org.bukkit.craftbukkit.v1_16_R3.CraftServer.enablePlugins(CraftServer.java:406) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at net.minecraft.server.v1_16_R3.MinecraftServer.loadWorld(MinecraftServer.java:554) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at net.minecraft.server.v1_16_R3.DedicatedServer.init(DedicatedServer.java:257) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:928) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$0(MinecraftServer.java:273) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at java.lang.Thread.run(Unknown Source) [?:1.8.0_411]
Caused by: java.lang.ClassNotFoundException: org.postgresql.Driver
at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:140) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:99) ~[spigot.jar:3096a-Spigot-9fb885e-af1a232]
at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_411]
... 11 more
you're not shading it
show your pom.xml
Thanks
yeah it's not being shaded
so basically during runtime, the library isnt available. Shading it puts the needed library (in your case postgres) inside your jar so it can use it
Yes
if it's not in the spigot runtime, yes
but there is an alternative with spigot
sec
what is the easiest way to serialize an item stack into json? im using kotlinx.serialization btw
look at the libraries section
basically spigot will load your library at runtime, rather than it being shaded in your jar
unless theres a lib out there, you will have to manually do it with an adapter
yes
would it just go inside the pom file
no thats inside your plugin.yml
if you don't want to shade it
If you do want to go the shading option, look into maven shade plugin
for such a large lib like postgres i would use the plugin.yml alternative as it might be shared by other plugins
there has to be
does it have to be human readable?
if not, at least, if i want to be able to not lose any information, what do i have to serialize? material, amount, enchantments, lore, idk what else
no
serialise it then
I got one of those
can serialise to b64 or a binary blob
i mean, unless i can convert Map<String, Object> to a json string somehow
what i want is to store it as json in a database, and then access it from javascript, and be able to get its name, enchantments, all of that
so it doesnt have to be readable
but it has to be json
i mean you can still serialise it but it wouldnt be ideal
just make an adapter and manually store the variables, theres not that many
NBT, name, desc, stack size, material
thats about it
for example if i do itemStack.toString(), its almost like what i want, just that its not json, its some other weird format
are you using SQL or a no sql db
because if you use an ORM on your javascript side it will automatically get converted to json
sql
storing it as json in the db is just adding an extra layer of complexity
not sure what you mean
you mean using ItemStack#serialize
and storing it as blob
and then an orm will magically convert it back to json?
no
store it in a table as you would any other sql object
{
name: varcar(256),
desc: varchar(256),
etc..
}
right
then your ORM on the javascript side will convert it to json
why..?
so i dont forget stuff
you're using a proprietary method to consume the data, expect there to be some manual work to get it working
and bc i plan to use items adder and idk how does all that work
Probably all in pdc
but i mean, there is already a serialize method provided by spigot so, i dont know why it cant be json
itemsadder doesnt add ontop of anything that spigot doesnt use
you can even store that directly in a yaml iirc
if oyu cover everything spigot does, it will work with items adder
i dont even know what that is
Spigot has methods to convert it to yml
and thats why i wanted to use an already existing serializer and not my own
Which is a subset of json iirc
really?
Yes
which one exactly, i guess i can serialize it to yaml and then json
ItemStack#serialize converts it to a map<string, object>
From there that gets converted to yml
map it to a json object
Various types
can be anything
Should be all primitives in this case though
and collections of primitives
(And string which technically isnt a primitive)
ok but how do i create a string in yaml format from the Map<String, Object>
how does spigot do it
iirc you can do config.set("something", x)
string is just the item path
x being the Map<String, Object> serialized thing
x is just the value which is always a primitive
all it does is iterate over the map and put the value where the path is
Yeah you can stick the entire map into spigots yaml objects
It handles the rest from there
ok, good to know, but how do i use that information to create a yaml string
yea, thats what i mean, how does it handle it
is there an easy way to go from those paths with their primitives
to a yaml string
past that point, is where it uses snakeyaml
String.valueOf(x)
if its a primitive, valueOf will work
You should be able to just String.valueOf anything that isn’t a collection or another map
ok so the snakeyaml library is what can convert a Map<String, Object> into a yaml string?
Yes
Gson might be able to deal with that map too actually
Assuming the meta in that map is already serialized, it should be all types gson is able to handle natively
is this what you ment by shaded?
have you decided whether you are going to shade it or use the plugin.yml
I'll use the plugin.yml
which was already provided to me
with mavern
okay add
libraries:
- com.squareup.okhttp3:okhttp:4.9.0```
but with the lib you need
in your plugin.yml
my apologies
I used a mavern plugin
to create it
it generated it
is what I meant
name: easylogin
main: com.pixelite.easylogin.Plugin
version: 0.0.1
api-version: 1.15
author: ("Rose")
commands:
register:
description: Creates an account
usage: /<command> <password>
aliases: [r]
libraries:
- com.squareup.okhttp3:okhttp:4.9.0
do I got red of the "-"
okay thank you
I am not sure what I need though
I cannot find any tutorials on youtube
nor does it mention it
in the series
the postgres library
I've been following
that you import in maven
mention what
libraries
yes
well the tutorial I followed just assumed the watcher
already had it
and didn't provide any context
¯_(ツ)_/¯
i did find this though :p
https://github.com/barbarbar338/spigot-postgresql
yea, Gson().toJson(itemStack.serialize()) works exactly like what i want, thanks
Read docs https://jd.papermc.io/paper/1.20.6/org/bukkit/block/Block.html#getDrops(). It’s not the drops that will drop from the block
It’s just potential drops as if it ran the loot table once.
p-paper
Well spigots javadocs aren’t helpful for that method
?whereami
I've got a strange error with gson & itemstacks...
com.google.gson.JsonIOException: Failed making field 'java.util.Optional#value' accessible; either increase its visibility or write a custom TypeAdapter for its declaring type.
... rest of stacktrace is just repeated gson reflection bs
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final java.lang.Object java.util.Optional.value accessible: module java.base does not "opens java.util" to unnamed module @22c8d07d
at java.lang.reflect.AccessibleObject.throwInaccessibleObjectException(AccessibleObject.java:391) ~[?:?]
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:367) ~[?:?]
at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:315) ~[?:?]
at java.lang.reflect.Field.checkCanSetAccessible(Field.java:183) ~[?:?]
at java.lang.reflect.Field.setAccessible(Field.java:177) ~[?:?]
at com.google.gson.internal.reflect.ReflectionHelper.makeAccessible(ReflectionHelper.java:35) ~[gson-2.10.1.jar:?]
... 72 more
public class ItemSerializer extends TypeAdapter<ItemStack> {
private static final ItemSerializer INSTANCE = new ItemSerializer();
public static final Gson GSON = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.registerTypeAdapter(ItemStack.class, INSTANCE)
.create();
@Override
public void write(JsonWriter jsonWriter, ItemStack itemStack) throws IOException {
for (int i = 0; i < 50; i++) {
System.out.println();
}
jsonWriter.jsonValue(ItemUtils.itemStackToBase64(itemStack));
jsonWriter.close();
}
@Override
public ItemStack read(JsonReader jsonReader) throws IOException {
return ItemUtils.itemStackFromBase64(jsonReader.nextString());
}
}
This is my item serializer and I am attempting to serialize a
List<Kit>
probably want registerTypeHierarchyAdapter
That fixed it
preciate it gangy
In IntelliJ there is a feature where when there's a color in the name of something (like a class or method) it will show that color on the side of the line. Anyone know of a vscode extension that does something simmilar to this?
I'm remembering to when I used IntelliJ and it would show a color preview whenever I would use a Bukkit Color or something like that
that might of been from the minecraft development plugin on intellij? dunno if that adds it
not sure if someone made it for vsc
yeah thats the intellij minecraft plugin
@pseudo hazel