#help-development
1 messages · Page 698 of 1
yeah, you don;t need to specify javadoc dependencies
if you want to keep the javadoc thing for whatever reason, then use spigot-api
spigot doesnt have javadocs
javadocs are API only
it's not needed to add the javadocs, just do "Download sources" in IJ
but still, what do you even need CraftBukkit classes for?
i just wanted to know if it'd be available if i needed it
i once again forgor to register the event listener
cuz I'm insisting on separating them out
how to allow breaking only certain blocks
cancel block break event when you dont want the block being broken?
cant you check what region it is with worldguard
I create a region and I want blocks to not break in this region, but not all
to break those blocks that are in the List
allow
to break
then listen to BlockBreakEvent, check if the block is inside your region (I'd create a separate worldguard flag for that, instead of hardcoding one region), and then if it's inside your region, check your list?
StringFlags
a
what should I use instead of PlayerEditBookEvent.getSlot()? getSlot() is deprecated but I really need to get the ItemStack or the slot
If I want to register a FurnaceRecipe I have the option between RecipeChoice.ExactChoice and RecipeChoice.MaterialChoice is there a way to register it where it only checks the Type and the CustomModelData ?
method looks fine to me, idk why it's deprecated
it says it's because it might have been from offhand but offhand hsould return -1
it's deprecated since 1.13.1, so very unlikely that it gets removed now
it was deprecated in the same commit that actually added offhand support lol
I'll open a jira issue
https://hub.spigotmc.org/stash/projects/SPIGOT/repos/bukkit/pull-requests/897/overview if it gets merged, it won't be deprecated anymore
can someone explain why setting the cooldown of a material doesnt prevent me from using it -.-
I'm setting the shield cooldown but the player keeps the shield raised, and theres no method in the api to lower a player's shield far as i can tell
searching for shield is 0 results
Client-side issue, paper has clearactiveitem which can fix that I believe
?whereami
it needs to work in spigot
hm
is there a stash of paper's patched server file anywhere?
I'm trying to look at the method
use plib and send the metadata packet with the active item field
or you can do reflection/nms, calling the method this calls: https://github.com/PaperMC/Paper/blob/master/patches/server/0494-Add-LivingEntity-clearActiveItem.patch
if(blockManager.getBlock(block.getType()) >= account.getLevel()){
account.setXp(account.getXp() + blockManager.getBlock(block.getType()));
new RegeneratingBlock(block.getType(), block.getLocation()).runTaskLater(SkyMineCore.getInstance(), 400L);
if(account.calculateRankup()){
player.sendTitle(SkyMineCore.getInstance().getTextManager().getText("account.levelup"), null, 30, 200, 70);
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "eco give " + player.getName() + " 50000");
}
}else{
e.setCancelled(true);
player.sendMessage(SkyMineCore.getInstance().getTextManager().getText("block.error.lowlevel"));
return;
}```
why cant the player Mine Stone Which Needs Level 1 When He Is Level 2?
oh wait
im so dumb
i know
i should create a RegeneratingBlockManager Class
and asign each block a offTime or something
each 10s i remove 1 offtime from all of them
can i make an exception for certain blocks? How
i try create regions
but need allow break blocks in this list
does that require nms or just spigot without -api?
iirc handle was part of spigot wasnt it?
yea i aint figuring this out
How can i load itemstack as items to display into an achievement https://paste.md-5.net/uxazayuriw.bash (currently only supports items only name)
HI!! I'm seeking assistance to implement a feature on my Minecraft server. What I aim to achieve is sending a warning message to players attempting to join the server with versions earlier than 1.16.5.
You can use viaversion there’s something inside configuration
There are examples there
But I want to create my own plugin for this.
You are using viaversion?
No
What are you using
I'm just using my plugin, and that's it
Yes, but now I'm going to add ViaVersion. However, I want to get the code first, and then I'll add the ViaVersion plugin.
https://www.spigotmc.org/threads/how-to-get-version-of-player.463519/ use the event PlayerJoinEvent
via version is open source
It also has an api to check the players version
And so what i gave the answer below with viaversion
That's what I want.
Inside the thread there’s the answer on how
So, ViaVersion is needed, right?
Pretty much yes
Via.getAPI().getPlayerVersion(player)
This is how you get it call it when the player is login
ViaVersion shows up in red for me.
Check console for errors
@EventHandler
public void onBlockDropItem(BlockDropItemEvent e){
if(e.isCancelled()) return;
if(e.getItems().get(0).getItemStack().getType() == Material.ANCIENT_DEBRIS){
e.getItems().get(0).getItemStack().setType(Material.NETHERITE_INGOT);
}
}``` guys will this work? _no i wont try it and see bcz i only have 4GB ram and i cant have 4 things open at the same time_
😐
I mean in the code, Via shows up highlighted in red.
Via.getAPI().getPlayerVersion(player)
You need to import the lib
How do I import the lib?
https://github.com/ViaVersion/ViaVersion you can find it here
how i can add fake players in tab with nms?
No problem, I'm new to this and I don't know where to find it. How about you guide me a bit on where to find it?
What are you using? (maven, gradle)
And how can I check that?
Do you have in your project a pom.xml?
And plus
Yes
?learnjava
Here are some links to get you started on learning Java:
- https://www.codecademy.com/learn/learn-java
- https://www.sololearn.com/learning/1068
- https://www.learnjavaonline.org/
- https://programmingbydoing.com/
- https://docs.oracle.com/javase/tutorial/java/index.html
The last one is the only official one, however some of those concepts assume that you already know a bit about programming.
Which one returns the value if it already exists the key, or in case it doesnt exists create it, to then return the value?? Im dougthing btween computeIfAbsent() or putIfAbsent()
I recommend you to learn about java and maven too so you don’t have problems
Totally agree, coding plugins without knowing Java its worst thing you can do
oh right, really thanks morice
But on GitHub, how can I learn to read it?
What you trying to do?
?learnjava
Here are some links to get you started on learning Java:
- https://www.codecademy.com/learn/learn-java
- https://www.sololearn.com/learning/1068
- https://www.learnjavaonline.org/
- https://programmingbydoing.com/
- https://docs.oracle.com/javase/tutorial/java/index.html
The last one is the only official one, however some of those concepts assume that you already know a bit about programming.
Dont lost your time bro, some times people dont really wan tto learn
Just trying to help as much as possible
oh perfect, its exactly what i expected. But i was getting an NPE, will see it. Maybe the NPE is caused inside the cooldown itself
Soryr for tagging also, and again thanks
If you don’t have the knowledge viaversion has already a system
Yes, but can I create my own as well?
You are giving to many rounds, if someone dont know Java and want to code, best way is to tell just to learn java. Because if not its a mess helping them, because people here doesnt explain things in a none technical context so you wont understand nothing
And yes, I am using Maven
But also why trying to create your own via version? There is no need to reinveint the wheel when it was alreadt invented
Not is own but just checking if they are under a version that already viaversion has integrated (https://viaversion.atlassian.net/wiki/spaces/VIAVERSION/pages/54100070/Configuration) as explained here, block-versions : “<1.16.5”
oh right, i think i have something for that 1m
I will check into the tab api i have, which get the version from the client
I mean if the plugin has already that feature why code it
I sent even an example
he?
?
You cant get user version without libraries? Such as protocol lib or via version
I mean he wants to block users under a version using viaversion inside configs of it there’s blocked-version and you can do “<1.16.5” and all under it are blocked
He wanted to develop it but its for me not needed you can already do that and he hasn’t the knowledge so i recommend that
anyone?
it always uses the lowest priority goal that returns true for canUse()
you could just one wrapper goal that then randomly runs one, sometimes th eother goal
When using scoreboards or tablist, is it better to handle them via threads or instead use bukkit tasks?
how do i add fake players to the scorebord?
You mean to fake them in the counter?
in the tab yes
scoreboard != tablist, different things
Scoreboard is the one on the right of screen
Yeah, best option is to use ProtocolLib because messing without its a disaster and you will lost much time
to be honest, i find it much easier without it
Same
ProtocolLib is much more complicated and messy than the NMS packet constructors
Best option is packetevents
eh
I use nms for packets
but idk which packet is it
?
Im using mojang mappings breh
I mean, if you're using nms just see how vanilla/craftbukkit does it?
ClientboundPlayerInfoUpdatePacketwithAction.ADD_PLAYERClientboundPlayerInfoUpdatePacketwithAction.UPDATE_DISPLAY_NAME
For hiding simply send a ClientboundPlayerInfoRemovePacket
oh ok
can anyone help me setup my plugin i cant update maven i got an error
send it
My guy, this project looks absolutely bombed
Delete your target folder completely and try again
Und run mvn clean as well before compiling
Btw how do you compile?
*building artifacts incoming
@remote swallow made this plugin for me and im trying to fix bugs since he wont help anymore
whot is?
Did you... import a zip file?
yes
How about you extract this zip and open the resulting folder as project.
No wonder the compiler cant create a folder inside your zip file project...
eclipse has option for importing zip file i used it
ill try manually copying the folder
You also have meta-inf files. Are you sure that this is a project and not decompiled garbage?
Blame epic
i decompiled the .jar i need to edit the code to add functionality
Didnt epic send you the source or a github repo link
he sent the jar
@remote swallow send source
i dont think its needed since i can already decompile it
no its in meta inf folder
Well ok
Have fun recompiling this into a jar.
Editing an already compiled jar file is a really bad idea and will lead to problems.
why i can already see full source code not obfuscated
decompiling is always a last resort
Thats not really the source code. This is what your decompiler thinks the source code could have looked like.
decompiled code is like if you get a cake and try to turn it back into flour, sugar and eggs
the compiler is the blender and oven
and I'm the cook
Eclipse 💀
please do not gatekeep ides
Eclipse bestest IDE evar!!!
i think it not only guessing it got even variable names right
Can affirm
Totally agree, worst ide i have seen ☝️
eclipse, old man ide confirmed
IJ is the worst, yes.
I like old 🙂
Cannot even have more than one project open in a single window
What is this? An IDE from 1995?
Ive also started with eclipse. Its fine.
i mean is not issue if people like to broke their header using a nasty, outded and 2.000s IDE
Look what you did Verano...
oh it doesnt support java
We had another person that was adamant about using VI for java ... although A) it was a troll and B) it was ages ago
i mean eclipse for starting is well not that bad, fbut for huge projects forget about it. It takes ages to compile Maven, its a mess to install maven with it, etc
Why?
Its better for large projects. Smaller memory footprint
Yeah I can;t comment on Kotlin/Gradle, I don;t use them
Or kotlin alone. Or gradle alone.
That one does not come with Maven attached.
can i code in kotlin with eclipse?
Imagine installing an IDE and having to install compiling tools apart, doesnt make sense haha
For java you don;t have to install anythgin in Eclipse
Looks like someone didnt write any low level code before.
This is actually the norm.
Eclipse has great support of Groovy gradle - if you never touch any groovy files that is
XD
Technically yes but I wouldn't dare
on mac you can
but on windows you indeed cannot
wut. what is that of an arbitrary limitation
That was the biggest obstacle that held me back from switching from eclipse to IJ.
And then i started using build tools...
This would be a nightmare forIJ
i need name changer plugin which changes tab list name and name above head also in chat name can pay 20$ it already has some things done https://ufile.io/y1i12xpu
Also why ppl till using build tools? When there are public repos which they already have artifacts up. And in remote!!
IJ mac supports different projects in one window but they're split up into tabs
I know someone that might be able to write this
@remote swallow
idk why would you need BungeeTest and FakePlayer and GroupManager open in the same window though
because BT is the ONLY legal method of getting Spigot
because we don't trust arbitrary illegal sources
too lazy to have multiple workspaces or IDEs open
sure
Dont you trust on io.codemc repo? Isnt the one from paper
I also often work across multiple projects, if a bug is found It's there already and simple to open.fix
no I don't, I only trust repos that host things legally
Im certain that paper has no public repos with an edited minecraft version on it.

I'm trying to get around that shield glitch where its apparantly not possible to manually disable it. I've been told to use https://wiki.vg/Entity_metadata#Living_Entity this packet, but can't seem to find much information on doing the protocol manually or protocollib.
Same person mentioned that https://github.com/PaperMC/Paper/blob/master/patches/server/0494-Add-LivingEntity-clearActiveItem.patch its fixed like this in paper, so I tried looking at the paper code, but if i throw the paper.jar into a decompiler it just spits out a list of patches.
Any ideas? I've been stuck for a while now

What is the best way to pathfind for an arrow to reach a player?
Can anyone help with WorldGuardAPI knowledge? How do I check if the area where the player is walking is included in the region?
indeed we don't redistribute jars containing copyrighted mojang work 
codemc is a giant repo a shit load of people that did not make it into maven central can host their stuff in
But literally everyone can upload to central
it takes brains
I should start uploading my plugins to central one of these days
Ah thats what you mean lol
Do you want to create aim assisted arrows or arrows that can go arround corners and hit a player in the buttocks.
Create aim assisted arrows
The most difficult part is getting code signing to work otherwise it is dead easy
so like, jitpack
why microsoft would care if people publish their compiled sources. Why didnt they oblise all the devs containing to delete it from their OS? I always asked that to myself
Why they appeared public first of all, if they were protected by right licenses
https://worldguard.enginehub.org/en/latest/developer/
This should have enogh information to solve your question
Isnt that only adding an execution for the sign-jar plugin and thats it?
oh speaking of that, I've always been able to sign my API properly but recently my gpg just broke and I've spent like a week trying to fix it lol. in vain
not enforcing a copyright is a dangerous idea
Yeah but you also need to gen the keys and all that
Yea sure
But it is still straightforward (at least under maven, didn't yet do it under gradle) - yes.
Actually… someone who cant create a gpg key probably isnt able to write any useful dependency anyway lol
What do you mean by that? Im interested in the topic now, i wanna learn more about it
Step one: Create a very precise impact prediction.
You need to know how faw away the arrow is about to land from your target
before your can correct the trajectory.
And if you don't have gpg.skip set to true in the pom it can get difficult for others to work with your project
Oh, please don't do this to me. I have studied them many times and I do not know which one to base and how to use it. I would appreciate it if you could guide me as if to say, first do this, then this, and finally this. (Don't worry, I don't wanna spoonfeed.)
If you knowingly allow people to do illegal things you‘re basically doing illegal things yourself
So if you want to do stuff properly it isn't completely straightforward
Do you just want to know which regions a player is currently in?
Yes i know that if you break a license you are doing illegal things. But why the server jars were filtered / leaked, if they were protected by copy rights?
to the fact that server jars where filtered. The reason itself
filtered ?
or leaked /published same thing
I mean, they are leaked because mojang has to ?
how are you going to run a server
they permit you the right to have a copy of their work
this guy is all over the spigot..
you just aren't allowed to redistribute
Why you cant if you made of fork, in theory with including their license you shouldnt have problems? So why spigot did i cant find a really clarify explanation
Yes but I think it's been answered 😅
there is no OSS licence, the minecraft server internals are not open source
Player player = ...;
// Get global region container
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
// Get all regions which are applicable on a specific location
Location loc = player.getLocation();
RegionQuery query = container.createQuery();
ApplicableRegionSet set = query.getApplicableRegions(loc);
Too late. Here comes the spoon 🥄
they explicitly do not allow redistribution
right, but wont you be able to redistribute something they made it public. Its like a clown idea i mean, doesnt make sense tho
Their license says „no“
but it isn't public and allowed for redistribution

PacketContainer resetPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA);
resetPacket.getIntegers().write(8,0);```
`Caused by: com.comphenix.protocol.reflect.FieldAccessException: Field index 8 is out of bounds for length 1`
welp I'm out of ideas
because if stuff is yours and you allow others to use it you can set restrictions on how it can be used
they have the ability to provide a public jar and still prevent you from redistributing
😅 looks like an example I've seen in the docs, thank you
if I leave my phone in a cafe, you can steal it because now it's in public, but laws say you can't
is it stupid?
i need name changer plugin which changes tab list name and name above head also in chat name can pay 20$ it already has some things done https://ufile.io/y1i12xpu
?services
If you wish to request or offer development/art/building/administration services, please do so at https://www.spigotmc.org/forums/services-recruitment-v2.54/
First of all: This is a byte field and not an integer
so do i put a 7 in there? or a n where n is the number of previous existing bytes
Yes i know that, that why license or ToS exists to setup rules on it
But in theory you cant be punished for redistributing something that is already public, do i explain my point?
Why not just use the actual nms packet‘s constructor, then you dont have to deal with any stuff like this
Next: Those indicies do not correspond to the packets fields but the index inside the wrapped metadata.
yeah you can. you can't resell my phone if I left it in a cafe
laws enforce that you can't
cuz i know neither
Let me show you an example
and in the case of a public project, the license is part of the enforcement
the default license is all rights reserved
👋
private PacketContainer createDataPacket() {
// Create the metadata packet
PacketType type = PacketType.Play.Server.ENTITY_METADATA;
PacketContainer packet = ProtocolLibrary.getProtocolManager().createPacket(type);
// Insert fake entity ID
packet.getIntegers().write(0, this.entityId);
// Get the serializers for each data type i want to write
WrappedDataWatcher.Serializer byteSerializer = WrappedDataWatcher.Registry.get(Byte.class);
WrappedDataWatcher.Serializer chatSerializer = WrappedDataWatcher.Registry.getChatComponentSerializer(true);
WrappedDataWatcher.Serializer boolSerializer = WrappedDataWatcher.Registry.get(Boolean.class);
// Create a list which will contain the data values
List<WrappedDataValue> dataValues = new ArrayList<>();
// Add data to the data value list using wrapped values which contain an index and the serialized data
Byte flags = 0x20;
dataValues.add(new WrappedDataValue(0, byteSerializer, flags));
Optional<?> optChat = Optional.of(WrappedChatComponent.fromChatMessage(this.text.replace("&", "§"))[0].getHandle());
dataValues.add(new WrappedDataValue(2, chatSerializer, optChat));
Boolean nameVisible = true;
dataValues.add(new WrappedDataValue(3, boolSerializer, nameVisible));
Byte armorStandTypeFlags = 0x10;
dataValues.add(new WrappedDataValue(15, byteSerializer, armorStandTypeFlags));
// Write the wrapped data value list into the packet
packet.getDataValueCollectionModifier().write(0, dataValues);
// done
return packet;
}
Is that native packets?
Nope
Yeah i was going to ask if was ProtocolLib or a custom lib
This is how the nms impl looks like
private ClientboundSetEntityDataPacket createDataPacket() {
SynchedEntityData data = nmsArmorStandBackbone.getEntityData();
return new ClientboundSetEntityDataPacket(nmsArmorStandBackbone.getId(), Objects.requireNonNull(data.getNonDefaultValues()));
}
that looks worse lol
You literally just pass your armorstand to the packet. Done.
I think this is easier.
Its only 2 lines vs 30
just gonna throw my $.02 and say that that is usually code smell and an xy solution
well considering that code allows me to use protocollib and i still have no clue how to do nms :/
I know, its not great
also its a player im resetting, not an armorstand
generally you should be using flags instead
implements tabCompleter gives you a method that returns the list of stuff thats shown there
Yes but some people want to have a plain old „blacklisted-regions“ setting, dont ask me why
bleh
"configure your regions correctly" - close as not completed, label as question 😛
yeah but in tab completer when you click on it it's replacing your argument, but this is not like a choice to complete it's like description of argument
- the color of argument yellow
oh idk then sorry
Brigadier
Or any command framework that supports brigadier
Dont give permissions for it
andd is there any way to change minecraft command? Like change simple /me
i dont think he meant that
?paste
Hello i have a problem but i didn't understand the error ... can you help me...
https://paste.md-5.net/ewujutenot.cs
Recompile your jar
And from now on: never call any class/field "main" again pls
the main.getConfig.get....
??
Do like KitsPlugib
Or Kits
Or smth
Main is too ambiguous
why lol
Because Main does not mean anything
for me main = class with onEnable and onDisable but ok
I'll take your advice
Why do i have 3 pings here
Because you are the renaming plugin master it seems
Same person i updated a plugin for earlier
Didnt say i wouldnt help, i just went to bed and didnt check discord
naming the field main is fine, it's private anyway
I didnt write it lol
I just decompiled the outdated plugin and changed the nms
That's why it looks and is so horrid
can i ask for some more help? I'm doing this
initPacket(PacketType.Play.Server.ENTITY_METADATA); //this being an init method
packet.getIntegers().write(0,player.getEntityId());
addValue(8,Byte.class,(byte)0);//this being a helper method
and then send it to the player hit and the players observing said player, but apparantly its not doing anything?
Shouldn't telling a player 'ur not doing anything with your hand' make them lower the shield?
theres not even a console error
and im running on log = all
is Server the same as Clientbound?
uh good question
Clientbound -> bound for client / sending to client
no, but there's no entity_metadata apparantly
haha thats so troll
yeah another reason for not using asshole libraries 
yeah lol
ok that means Server is Clientbound
now idk if thats how I would describe it but yea plib is yikes
agree
You cant just do this for an existing player. It would result in every single metadata value being overwritten.
All metadata values of the actual player need to be copied first. After that you can modify them.
But be aware that every little change in a players metadata will result in a new meta packet being sent by
the server, resulting in your packet being overwritten again.
so you're saying it didnt actually hit the player, or you saying I've been deleting metadata accidentally?
Your metadata packet is probably so ridiculously invalid that the client just ignored it.
Do people create local chat using
for(Player player : Bukkit.getOnlinePlayers()){
Location playerLoc = player.getLocation();
if(playerLoc.distance(sender.getLocation()) <= chatRadius){
player.sendMessage(message);
}
}
```?
The recipients list of the chat event can be altered, although I'm unsure if that's still the case in modern versions with chat signing
Also, distanceSquared() > distance() to avoid a square root operation
not a big fan of square root choco?
It's just unnecessary and not fast
personally I think its fun to make those crazy ass numbers
Its kinda crazy how bad computers are with decimals
well we arent much better
Just square root computations because there aren't any specific instructions on it on most architectures
So what other option do people use?
I mean you can try it. It may work
If not, then yes your only option is to do what you proposed
a little bit is all that counts
I'm not sure that i can understand what you meant
:>
Tiny side project go brt
Qeue up all messages and as soon as a player gets near another player, you simply
dump all messages you havent read from him because of distance.
Use a scheduler every tick to check the distance of each player to everyone else.
Pretty neat
wouldn't it be easier to check within a players radius every message instead of every tick?
You cant dump the messages this way
And you would really want to read 50 messages you had nothing to do with, dont you?
i keep getting this error for too many chas in a prefix but how is this "§4§l[Owner] §4" more then 16 chas
am i just dumb
am i missing something
Its basically equally fast on modern CPUs
You're assuming modern CPUs
Yeah well i think modern is like last 15 years or so
I only tried on my i7 9700k and m2 max so yeah no clue about otherd
Next job is an inventory menu with a central activate button and 8 surrounding icons that cycle through X symbols (one cycle per click) to do adresses to other portals :L
imho using distanceSquared is unncessary especially for the chat
imho distance squared not mattering in the modern day and age is fair, but it doesnt hurt when we're dealing with a single threaded duct tape machine that we call a game.
Every little helps as they say in tesco lol
i.e. if someone signs off their letter with a curly fancy f rather than a normal f, then who the hell is gonna complain its "unnesecary" ? lol
Its like when folk go OTT with the "Enterprise code" issues.
Once had a guy get upset because I javadoc'd one of my plugins fully
Like, my brother in code, I decided to add a little extra effort in, why are you mad xD
anyone got a clue?
what version ru on
i know that 1.8 limits characters
BUT THERE IS NOTHING THATS 30 CHARACTERS LONG
LIKE
Someone do the funny how old is 1.8 comman d
Someone get the quake 3 devs
https://m.youtube.com/watch?v=p8u_k2LIZyo&pp=ygUYZmFzdCBpbnZlcnNlIHNxdWFyZSByb290
In this video we will take an in depth look at the fast inverse square root and see where the mysterious number 0x5f3759df comes from. This algorithm became famous after id Software open sourced the engine for Quake III. On the way we will also learn about floating point numbers and newton's method.
0:00 Introduction
1:23 Why Care?
3:21 The Cod...
it says theres something 30 characters long and i have no idea where
like
it doesnt exist
yeah but I doubt that it's actually faster at all
but i also like 1.8 pvp and i like making plugins for that too x)
the code only gets more messy
where does the data for the teams get saved
is there a way i can delete all existing teams
I'll just run JMH and check whether distanceSquared is actually faster. Should take 33 minutes
i think that might be causing the problem that theres still a team existing with too many chas
What should I use instead? https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/material/class-use/Redstone.html
all usage of MaterialData is deprecated and subject to removal. Use BlockData.
declaration: package: org.bukkit.block.data.type, interface: RedstoneWire
guys look at this https://github.com/coordinates2country/coordinates2country/tree/main
isn't that kinda a genius way to turn coordinates into country?
it just uses a grayscale image and then uses that to get the correct country
Redstone class has button, hopper...
declaration: package: org.bukkit.block.data, interface: Powerable
yeah Powerable are the "end consumers" of redstone, AnaloguePowerable are the wires etc (things that don't just have yes/no power, but a value between 0-15)
Ah.. was about to do the same...
kinda crazy how long jmh benchmarks take
I did one the other day that took an hour and a half
I mean that is the idea
ik I just didn't expect them to take that long
I thuoght maybe like a couple mins per not basically 10 or more minutes per
Actually, I want to control the blocks that the player can interact.
Yes, but I want to control the redstone materials it can interact with.
do it too, maybe we get different results
Already on it 😄
how does your code look like though? we should be using the same i guess
if anyone else is bored: git clone this and gradle jmh https://github.com/mfnalex/Bench-DistanceSquared
how can i get the team a player is in
Ah ok so you get the invocation time per 1k and i the throughput
yeah I thought maybe it's easier for JMH if the method takes longer than 0.0000000000001 second lol
But my result look pretty conclusive currently...
Benchmark Mode Cnt Score Error Units
DistanceTest.testDistance avgt 25 1645,770 ± 4,010 ns/op
DistanceTest.testDistanceSquared avgt 25 1635,375 ± 11,381 ns/op
exactly the same
well almost
i would be sceptical on this one
why?
Increase the number of positions and change the setup level to @Setup(Level.Iteration)
You are burning the same numbers into the cpu cache.
the number of positions?
Yes, and change the positions every iteration
it does that
Benchmark Mode Cnt Score Error Units
DistanceOverhead.distance thrpt 10 471,200 ± 5,791 ops/us
DistanceOverhead.distanceSquared thrpt 10 582,115 ± 10,796 ops/us
But for me it comes down to very similar results.
Squared is only slightly slower.
I mean still ~20% slower
squared is slower?
That's literally impossible 
distance() calls distanceSquared()
Unless you wrote your own impl
Well we had a more low level impl. Maybe there is some cpu magic that detected a vector distance calculation
and uses some specialized instructions for that. But now im curious.
I'll now run it again with @Setup(Level.Invocation), so caches cannot have any impact anymore
Ill do two tests. One with volatile primitives
here's my updated version that, like spigot, just takes the return value of distanceSquared and throws it into Math.sqrt https://github.com/mfnalex/Bench-DistanceSquared/blob/main/src/jmh/java/test/DistanceTest.java
It also creates new random doubles for each single iteration (so a loooooot of times)
and it also compares distanceSquared and distanceSquaredStandalone (which doesn't use a "nested" method)
Be careful with Invocation levels. Only makes sense if your tests last beyond 1ms
Is it possible in minecraft spigot to simulate ball moving?
like when looking from the sky
it will look like football is moving
20 ticks per second
PS:
@Param({"50000"})
private int numberOfElements;
🙂 Might not be useful here but is always a good idea to track
Or hear me out, it won't make a difference so it doesnt matter? Maybe some people dont wanna work with squared roots as they are stinky to debug? Maybe some people hate using the Math methods or maybe I they are just scared of Squares (and, like cultured developers, love hexegons and the humble octogon more).
We have 2.4 billion seconds in an average life time, use em to make cool stuff rather than prove a point that , in the grand scheme of things, doesnt make a difference eitehr way :L
I changed it to Iteration
smile's test is measuring throughput and the score is higher, see ops/us
Should be more than possible with Display Entities and a resourcepack.
Ah you are right
Facepalm
let us be, it's interesting
But that doesnt pass the reality check for me...
How about a compromise. If you carry on with it @lost matrix has to make a new thread guide on the topic 😉
that's ok
Well volunteered smile
no?
Tha fk
yeah but I don't have anything to say here

THE BEACONS HAVE BEEN LIT
people only have to accept what I say if they're decent people and not imbecile plebs
^ THIS is a so colled "k.o. argument"
Can you help me with some example i need it for creating a football game which player is going to be ball
jokes on you, im an undecent, imbecile pleb
are you using gradle while throwing all logic into subprojects {} or what?!
because that is the definition of imbecile
i really stopped hating gradle but the kotlin-dsl thingy is really bugged in intellij
You are doing that, dont you...
nope! I use separate buildSrc scripts even for stuff like spigot-dependency
Ok i dont think this makes sense with the average time setup
Benchmark (numberOfElements) Mode Cnt Score Error Units
DistanceOverhead.distance 50000 avgt 10 230,759 ± 15,473 us/op
DistanceOverhead.distanceSquared 50000 avgt 10 238,201 ± 19,281 us/op
see? I got nothing to hide https://github.com/mfnalex/PAPI-Replace
why not?
Witgh the error it makes perfect sense
okay maybe something else is wrong here i cant even connect when i delete every single plugin from the server it still trows that error what else could it be
There is an over 10000 overlap
How is this your full build.gradle file?
the buildSrc folder?
Was this about the closed zip stream?
about the character maximum
i took down every plugin and it still trows that error
Ah
because I iknow how to properly structure gradle builds lol
This just means its stored somewhere regardless of plugins. Maybe in a scoreboard or something.
i ran something that shouldve cleared all existing teams
where would that be stored? can i manually delte it from a world file or somethng?
cause its getting really annoying
finally
i found it
incanse anyone ever needs to
its located in data/scoreboard.dat
?paste
i now used the ALL option for the benchmark annotation @lost matrix
https://paste.md-5.net/cuqodafade.java
as expected, distance is the slowest, but distanceStandalone is only a tiny bit faster than squared
so that means, the most significant overhead isn't Math.sqrt but actually the nested method call lmao
@worldly ingot isn't that funny
choco should change his name to chicken
McFly
1.21 gigawatts
Yeah i came to the same conclusion.
Would be interesting if we could start an jmh instance on a running server to see the actual overhead.
But this is honestly so much better than i believed it to be. I was under the impression that it would 2x the
calculation time.
Yeah distanceSquared is overrated
At least today
Would be interesting to run this in kvm with as little passed through cpu flags as possible
That being said people must not ignore the fact that performance is stacking. A bit of slow code on it's own isn't bad but when it is bundled with other slow code it actually gets slow
Yeah but normally you dont run it millions of times per second if you only use it to code a local chat plugin
True. But we are speaking about millions of invocations per tick here before a noticable difference can be seen.
Because that’s how we came up with this lmao
How to waste time 101
I mean given that we are only working with primitives there is no serious performance impact
Benchmark distanceSquared for a fucking chat plugin
You should go to bed, it's after midnight
I'm doing the uberman sleep schedule
JUST USE DISTANCESQUARED. SAVE YOURSELF A CLOCK CYCLE 
lol
For some reason i sometimes actually fall into a triphasic sleep schedule while being in my semester break
yeah I also have that, since years now. I sleep like 4-8am, then again 2 hours in the afternoon and again like 1-2 hours in the evening lol
but not on purpose
Im so glad that my responsibilities are at a minimum for a month. I can just do whatever until i pass out 🙂
during my worst drinking phases I always fell asleep at random places like at the computer or in the bathtub lol

a friend of mine once wanted to go like 3 stations by train and woke up in berlin (he lived in NRW)
XDD
yeah that never happened to me
but the readability 🥲
Same. And im in the middle of munich so a ride could take me pretty far if i wasnt careful.
we can make a deal. a compromise
class Location {
// Protects Choco's precious clock cycles and mfnalex cannot complain about readability anymore
public boolean isDistanceLessThan(Location other, double distance) {
return distanceSquared(other) < distance*distance;
}
}```
Ive seen a video from some C crack who said to not use if clauses anymore to save clock cycles
branchless programming does exist
what else are you supposed to use
Thats what he was on about, right. Branchless programming
did somebody mention crack
basic arithmetic
no, bad alex
it's generally not worth using unless you know what you're doing
Support What's a Creel? on Patreon: https://www.patreon.com/whatsacreel
Office merch store: https://whats-a-creel-3.creator-spring.com
FaceBook: https://www.facebook.com/whatsacreel/
In this video we look at branchless programming. This is a technique to gain speed in our high and low level programming by avoiding branching code as much as po...
I mean jumps do use quite a few clock cycles 👀
that vid helped me learn about it
It makes the code so fking painful to read as well
but yeah, unless you're writing software in the 1960s and trying to send something to the moon, you don't have to follow that technique lol
reminds me of the time when we did stuff like that only to avoid using semicolons
if you're coding in java you shouldn't be worrying about that kind of optimization
brooooo why can't we use external emojis
you can if you boost
That technique is actually more and more relevant today

have yall seen the java programmer that tried out python
me I'm right here
Given that the CPU attempts to predict the branch the code uses. If it doesn't guess correctly it may have to wait
my java code be like
It took me a bit to write proper pythonic code
avoiding if statements?
Here's a full featured configurable death chest plugin that only uses 15 semicolons (minus imports)
https://github.com/GodCipher/the-cipher-project/blob/master/src/main/java/we/are/project/cipher/AngelChestListener.java
it has more config options than actual lines of source code lol
should just import *
Are you really coding if you dont have a horizontal scroll bar?
no ofc not, but the rules were "everyone must use no more than 3 semicolons per line, and use a maximum of 15 lines in total"
i've been coding wrong my entire life! all those lines wasted
We should host some coding challenges here in spigot 🙂
Coding Challenge write a basic plugin and following OOP correctly
99% of people fail!
(IMPOSSIBLE)
gradle fanboys must use maven and maven fanboys must use gradle. people who like both gotta use ant
but my singleton :madge:
💀 what you can't do this to me
dude imagine my pain
Be prepared for a 4h discussion between some of us what correct OOP impl looks like.
There is no crown truth to this.
static banned and now everyone is happy 😂
Gotta have a longer time limit if this is gonna be the case. lmao
Ill write a gradle plugin that simply uses a pom file.
Then my gradle file will have 2 lines
proper oop is making everything static and then claiming "yeah well but it's not an object because objects isv § 90 BGB are only körperliche gegenstände"
XD wtf
english?
Civil Code (BGB)
Section 90 Concept of the thingThings within the meaning of the law are only physical objects.
bad translation
basically it says " a computer program is not a thing because you cannot touch it"
I see
same like water, unless it's physically "contained" within a container like a glass
What did one interface say to the other?
"Let's keep in touch, but don't call me, I'll call you."
How do you compliment an OOP programmer?
Tell them they have class.
The challenge should be a plugin which allows player eine Anzeige nach StGB § 223 Körperverletzung, if he attacks you.
dude, nobody wants your puns. git out. or I'll commit a murder
damn I missed the opportunity to include "pushing" it too far, too
you're really pushing it
yeah realized it after I sent it
so everyone what are we throwing into JMH now?
String.contains vs iterating over the chars?
Sure why not
super async chat filter
Show the overhead of ConcurrentHashMap in a single threaded environment
Actually... i wanna know this myself. brb
I'm in the mood to write some stupid ass java code right now
lets see what Hell I can conjure up
Mood drops after 5 minutes of coding
no I could probably work on some dumbass project for 5 or so hours before I get bored
ETA 14 mins
?paste
probably, yeah. we'll see
Benchmark (numberOfElements) Mode Cnt Score Error Units
ConcurrentMapOverhead.containsConcurrentMap 500 avgt 5 7,995 ± 0,121 ns/op
ConcurrentMapOverhead.containsConcurrentMap 5000 avgt 5 7,883 ± 0,029 ns/op
ConcurrentMapOverhead.containsConcurrentMap 50000 avgt 5 8,202 ± 0,250 ns/op
ConcurrentMapOverhead.containsMap 500 avgt 5 7,430 ± 0,185 ns/op
ConcurrentMapOverhead.containsMap 5000 avgt 5 5,999 ± 0,115 ns/op
ConcurrentMapOverhead.containsMap 50000 avgt 5 8,092 ± 0,099 ns/op
huh it's slower for 500 than for 5000
Yes. But im only testing a single key. Let me also iterate over all keys like you do.
imagine jvm pulling a volkswagen and goes into turbo mode when it detects a benchmark
XDDD
JIT compiler: "contains? sure, return true, it's probably there"
Quick, compile everything to binaries and use a GraalVM, he is doing a benchmark
lol even better
is it called Graal because of the holy grail?
no idea
i always have to think of indiana jones 3 when I hear "graalvm"
have you not seen it?
he's looking for the holy grail but then nazis capture his father, sean connery
Was this the face melty ij?
so then he only tries to find his father but to do he actually has to get the holy grail because his father was shot and only be healed through the grail
the nazis are stupid and choose the wrong grail (a shiny one) and then the main nazi dies
indiana jones is smart and chose the most ugly grail because jesus made it himself (and apparently he wasn't very good at making grails)
that's indiana jones 3
Benchmark (numberOfElements) Mode Cnt Score Error Units Normalized
ConcurrentMapOverhead.containsConcurrentMap 500 avgt 5 4,199 ± 0,050 us/op 4,199
ConcurrentMapOverhead.containsConcurrentMap 5000 avgt 5 53,585 ± 9,624 us/op 5,358
ConcurrentMapOverhead.containsConcurrentMap 50000 avgt 5 830,219 ± 415,882 us/op 8,302
ConcurrentMapOverhead.containsMap 500 avgt 5 4,129 ± 0,207 us/op 4,129
ConcurrentMapOverhead.containsMap 5000 avgt 5 50,924 ± 2,807 us/op 5,094
ConcurrentMapOverhead.containsMap 50000 avgt 5 831,605 ± 435,935 us/op 8,316
Here its scaled up
but this is still my all time favorite scene of all indiana jones movies https://www.youtube.com/watch?v=kQKrmDLvijo
Don't bring a sword to a gun fight!
Follow us for more related content:
http://www.twitter.com/dexshirts
http://www.facebook.com/dexshirts
http://instagram.com/dexshirts
Ive seen this so often
best scene

How is the benchmark going?
does it automatically change the "numberOfElements" param?
1 min left
Yes. It runs a whole benchmark for each parameter
ah nice
@Param({"500", "5000", "50000"})
private int numberOfElements;
I gotta use that next time too
Its really nice if you need to plot the time complexity of a collection.
Simply increase the elements and you get nice plottable data
okay it's a confusingly long https://paste.md-5.net/udajevekeq.makefile
You ran it for all modes?
yes
check out remove / avgt time
the normal map is twice as fast
but the other things, the difference isnt that big
DistanceTest.remove_ConcurrentHashMap avgt 8 2802,612 ± 60,472 ns/op
DistanceTest.remove_HashMap avgt 8 1469,560 ± 105,702 ns/op
if n gotta be 0? when what is the point
I guess you dont have to check for locks if you simply want to call contains
Idk could be
diCtiOnArY
stroke?
Python user
Ah. Or js user as well, no?
be smart, stay apart

You know what would be nice? If someone remade the old lucas arts adventure games like monkey island or manic mansion as mc adventure map
jedi knight, jedi academy 🙂
Haven’t played those

Is that available for scummvm
pardon?
Is it a point and click adventure?
And is it 30 years old?
If yes, then yes its available for ScummVM
Yeah, its pretty much not
But i almost started writing a deep rock galactic type of plugin for mc.
*on that note
If I want to write a custom functionality for banning, should I make another class for that
like
new BanActionThing(args).issueOn(target);
is there any PlayerBanEvent?
package index
If you have to ask this question then there is a good chance you should create a ton of new classes.
Some could look like this:
- BanManager
- Ban
- BanType
- BanListener
- BanCommand
etc
But i would def not do
new BanActionThing(args).issueOn(target);
More like
OfflinePlayer player = ...;
Ban ban = new Ban("reason", BanType.TEMP, Duration.ofDays(7));
BanManager banManager = yourPlugin.getBanManager();
banManager.applyBan(player, ban);
hmm
I was thinking about something like a
BanAction
Nah create your own then call after u ban him
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/player/AsyncPlayerPreLoginEvent.html
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/player/PlayerLoginEvent.html
https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/player/PlayerPreLoginEvent.html
cancel event
declaration: package: org.bukkit.event.player, class: AsyncPlayerPreLoginEvent
declaration: package: org.bukkit.event.player, class: PlayerLoginEvent
declaration: package: org.bukkit.event.player, class: PlayerPreLoginEvent
I have my own little punishment system already
now im just making the "front-end" stuff
This looks like a pointless object creation
new Something().call(somethingElse);
Creates a temporary object for no reason
I also have this
I just like the more static typed things
instead of
getConig().getString("path.path.path")
Which is perfectly valid
I made a registration handler for these so users can edit them
well i dont like it lol
I feel like it's just too prone to mistakes and stuff
or you could make ur code look nicer
No, i mean preferring staticly typed value access is perfectly valid
You could write constants for your strings instead
Make-up, smoky eyes, etc
For common paths and values it's best to have them all in one place anyways
no
are you talking about urself? confusion
each one has their own implentation
Sometimes
Idk if this is bad or good I need opinions
smoky eyes 😏
you remain to be an enigma
the only costants I have are permissions
constants
which is an enum lmao
I've never done something like this before
my Ai pf has deepy eyes thb
but it makes it so server owners can set their custom permissions
Don’t smoke eyes
dont smoke using eyes
Two questions
- Why doesn't your
withPermission()method just accept aCommandPermissionsinstance? - Why are you using an enum to begin with? You can use String constants so you don't have to call
.getPermission()every time
withPermission is CommandAPI
and I used an enum rather than String constants is because of how I register classes
Hello! I'm trying to spawn a mob called 'ALLAY' on 1.20.1. But I'm having problems, the problem is this. When I enter the server it spawns, only there comes a time when it stops spawning and not even restarting the server can work. Can anyone help me?
Kotlin
The only thing I think may cause this is the fact it despawns but that still makes little sense
I found a bug
found
I know this isn't a very development issue but I think it would be best to post something like this here? idk shoot me if I'm wrong
What's the best way to advertise a spigotmc library?
I'm making a menus library named Woody and it has some very nice features a lot of libraries don't have (and more creative coming)
issue is advertising and I want to spread the library efficiently.
ping me when responding with some advice
hey! im working on a feature for an anticheat, where it tries to detect if someone is spoofing their client. here is my code: ```java
public boolean isLikelySpoofingBrand() {
final String brand = this.getBrand();
final String lunarClientRegex = "^lunarclient:v\d+\.\d+\.\d+-\d{4}$";
return (brand.equals("vanilla") && !this.isVanillaMath()) || // Vanilla doesn't have fast math
(brand.matches(".*lunarclient.*") && !brand.matches(lunarClientRegex)); // Some clients spoof lunar incorrectly
}```im wondering if there is other methods to detect if someone is trying to spoof their client?
Its rly hard to detect client spoofing tho
Cuz like, smart devs will make it unnoticeable
this is just used as a warning
when someone joins, or you view their profile, it they are suspected for brand spoofing it says (likely spoofed)
im banking more on dumb people
like with fastmath
ive had lots of players on my server with a brand of vanilla, yet they are using fast math
or people with outrageously fake lunar brands
This is gonna sound stupid but for Command Execution the one thats not the main one should those be classes in stead of .java
what
Wtf is fast math and how does one even detect that
and all of those files will have a class in it
alr thank you I had a blank moment for a second that I been coding my plugins wrong all this time
fast math is less accurate sin and cos calculations (not even beneficial on decently modern hardware)
simulation. simulate a client with & without fast math, and see which is closer
I see
Ok I have more time to explain now, so
-
I'm using CommandAPI, an API that I did not make. Here's a link to the API: https://github.com/JorelAli/CommandAPI
-
I wanted the String for the permission to be configurable, and I also have multiple groups of permissions. For example "CommandPermissions, PunishmentPermissions". And I want the server owner to be able to change the permissions. Another reason I didn't do that was because I didn't want to use reflection
Why do you want permissions to be configurable?
yeah seems like a waste of time to make them configurable
thats something a permission system is supposed to do
ok but does anyone actually turn that on
fast math still exists? lol
It doesn't
Yes
who lol
Well for one, badlion automatically enables it, and second, people who don't know what they're doing
wow badlion is wierd
I can't for the life of me figure this out.
If a player is in a duel, I don't want them to be able to move items out of their inventory as they'd be able to dupe duel kits.
also ik, amazing code
why sending item update packet makes item in hand swing :((
How can i load itemstack as items to display into an achievement https://paste.md-5.net/uxazayuriw.bash (currently only supports items only name)
So when doing right click interaction events, it continues to proc when holding (and most the time at least triggers more than once) and tends to fire off in pairs. This is nulifying an event where i wish to set on first right click, and nulify on a second right click if at the same location, has anyone bodged together awork around?
?interactevent
The PlayerInteractEvent may be called once per hand. If you only want code to be executed once, you can check the result of https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/player/PlayerInteractEvent.html#getHand(), then decide functionality.
For example, only executing code if the main hand was used:
@EventHandler
public void onPlayerInteract(PlayerInteractEvent event) {
if (event.getHand() != EquipmentSlot.HAND) { // * if the hand used is NOT the main hand:
return; // do not progress past this point |
}
// provide functionality
}
probably this
Hi im trying to provide this
"{skin:\"1\"}"
But the json complited result like this
{
"criteria": {
"trigger": {
"trigger": "minecraft:impossible"
}
},
"display": {
"icon": {
"nbt": "{skin:"1"}",
"item": "minecraft:DIAMOND_SWORD"
},
"title": {
"text": "Hello World!"
},
"description": {
"text": ""
},
"background": "minecraft:textures/gui/advancements/backgrounds/adventure.png",
"frame": "task",
"announce_to_chat": false,
"show_toast": true,
"hidden": true
},
"requirements": [
[
"trigger"
]
]
}
But in this way its wrong any fix about for this?
does anyone know how to get hand used in EntityDamageByEntityEvent and the item used?
the item in the main hand of the user
i would assume
cant you attack with offhand?
no for what i remeber
I don't think this is that easy
Throwing potions/shooting bow from off hand might trigger that event (idk by which entity)
ye im checking if the damager was a player
id assume thrown potions would be the damager in that case
- you have EntityType.ARROW and EntityType.SPLASH_POTION
well in that case it is always main hand
can't recall any instance of it being offhand
Is there a way to temporarily disable IntelliJ ordering of autocomplete? I'm creating a partial EnumSet and with non-alphabetical order keepint track is a bit difficult
can i check for key in pdc like this? or do i need to store the namespacedkey instance somewhere
instance is the plugin instance
i hate how it looks but i think that works
just want to make a quick wrapper so idont have to write the long lines everywhere
You do not need to store it
It will work like this as well
Just keep in mind that it may be using a bit more memory/be slower
I know of at least 2 pdc wrappers
mine and I believe alex's lol
i dont want ot use external dependencies
well then
I hope you never want to do NPCs
i mean atleast not a lot of them
What's the simplest way to test if it's day/night? I refuse to do math using world.getTime if possible since it returns total time
That's fine
nevermind, theres different times lol
btw how would you make a custom persistence data type? should i use classic serialization for it?
you've two options
the good one and the insane one
Illusion or alex, dunno which of em, made a PDC library that takes any data type if i remember correctly, thats the normal solution
alternatively you can just turn a object into a byteOutputStream, read that as a string, and shove said string into the PDC
so classic serialization
I would really recommend using the library :P
was alex
I barely make public libs
and all of my public libs are either on my search index or my gist
i wrote this simple thing, it should work right?
I mean
There's probably a better way
Like the object's yours
You can probably make a byte buffer and write the contents yourself
why dns takes too long to set up
You mean the propagation?
i had a dns that took a whole day to propagate
and the weird thing was that some friends had access to it
takes like 1-2 days
yes
isp also caches so its impossible to login if you dont change ip
it takes time
i switched to cloudflare warp
1.1.1.1?
I had some issues with call of duty and cloudflare warp
You can manually flush cloudflares DNS cache
Reading a file from my jar using Files.readString(path inside jar file) always replaces § with § (it's not like this in the jar file), using UTF-8 for both reading/writing
Hey everyone, is there way to remove all bad active potion effects from player?
sure. but as far as i know you will need to define your own list of "bad" potion effects
afterwards you can just loop through and remove them
Okey, thanks!
want to make inventory rollback plugin and have a question: which is the best way to save the data?
i need to save players info(inventory, location, health, exp and other) when player join, quit, world changes and deaths.
It is plugin InventoryRollbackPlus which saves data in this way:
/backups/deaths/<uuid>/<time_in_long>.yml
But is it a better way to save data? Maybe with sqlite?
There are many ways. You could save the (gzipped) NBT data
ok
@quaint mantle u've done modding right? (fabric)
yes
what you want?
so lets say I wanna add some "instance variables" to both LocalPlayer objects and ServerPlayer objects while they are valid in session
tell me it in yarn names
I thought of using another class just and add some mixins here and there, but I assume there are better ways
ugh let me see
you can easily implement a class and add new fields, methods into whatever class you want using mixins
yeah but then comes the issue

yeah I thought I could inject a data thingy into the dimension data storage
yes you can

