#help-development
1 messages · Page 1249 of 1
Alright, but I'm saying I don't think your warning is necessary.
Async plugin loading is just a stupid idea since plugins may have to block the server from starting whilst initialising...
You right but for the rest of the plugin like BlockBreakEvent for a example, that is where async can be used
plugins could request to be sync if required
i mean yeah its not necessary
just a thought
Would just break all plugins made before that version though
idk @ ike do u wanna make ur exentions load async in helix
Rip poor block break event
I do async plugin loading because once you have enough plugins it actually starts to take a while, and most of the things happening on load can be done in parallel
Not async in the sense that I patched the server to throw a new thread at every plugin's onEnable, but rather making select time consuming plugins do their startup async and offer a completablefuture for dependents to block on
I am working on an auction plugin - I have an event every second as the GUI shows a live countdown - will this affect performance / is there a solution
It is working perfectly but just brain storming since in testing I have like 5 items but of course in theory you never know it might become 2000 one day
server has lots of events per second already
About memory impacts - currently I generate two items, the item being auctions and a modified display auction (lore for countdown/price/etc) - is it necessary to reduce that to one itemstack value (default item being sold) and just generate and throw the lore onto it while being displayed instead of having a display item generate ?
uh
huh?
i'm not sure what your questions it, but aside from items that hold recursive data like shulkers or written books, itemstacks aren't that heavy on memory, it will be fine to have thousands of them
in some sense the server is allocating and discarding thousands of them all the time, or at least tens for every online player
What would be the best way to disable redstone in a world?
listen to the related events and spawn tnt
BlockRedstoneEvent -> event.setCancelled(true)
@jagged thicket you around?
how did you enable whitelist?
@echo basalt it's nexo
Your PDC issue
Someone else on paper ran into it, cross referenced with your plugin list, only nexo and mythic mobs matched and removing nexo solved it. They are reporting it as I type this
whitelist on
I still can'tt reproduce
[19:48:55] [Server thread/INFO]: Login by md_5 from 127.0.0.1
[19:48:55] [Server thread/INFO]: Disconnecting md_5 (/127.0.0.1:46738): You are not whitelisted on this server!
[19:48:55] [Server thread/INFO]: md_5 (/127.0.0.1:46738) lost connection: You are not whitelisted on this server!
Since the timers is what I can do with my goal. I going to create a manager that my plugin can access. I might be doing too much. But if you look at the code from how SA-MP does it, you see it needs a timerID.
https://sampwiki.blast.hk/wiki/KillTimer
But from the Java end, there is no such thing as a timer id. You get the timer and run .cancel(). So my question is, how would I put multiple timers (BukkitRunnable) into one List<BukkitRunnable> in a named array. Like what I doing with the Player object?private HashMap<Player, List<BukkitRunnable>> timers = new HashMap<Player, List<BukkitRunnable>>();
hmm what event are u doing listenin
public void event(PlayerLoginEvent event)
{
System.out.println( "Login by " + event.getPlayer().getName() + " from " + event.getAddress().getHostAddress() );
}```
can i show it live?
are you offline mode?
yes
let me try that
[19:51:08] [Server thread/INFO]: Login by md_5 from 127.0.0.1
[19:51:08] [Server thread/INFO]: Disconnecting md_5 (/127.0.0.1:55738): You are not whitelisted on this server!
[19:51:08] [Server thread/INFO]: md_5 (/127.0.0.1:55738) lost connection: You are not whitelisted on this server!
still fine
this seems fine
maybe it only affects windows haha
what's the question? it looks to me like you answered your own question
i did it ptero linux
what version are you on
1.21.4
if you want to associate the list with a String identifier instead of a player, change it to Map<String, List<BukkitTask>>
are you a chatgpt bot?
no I mean, build version
like how is GTA san andreas relevant
i need to build spigot jar 💀
A lot of people seem bots in this chat lmao
/version
This server is running CraftBukkit version dev-Spigot-73860e0-f0c8dd3
i only have the patched version rn
You can run ngrok and let people test it. I found out you not getting player's IPs. I was testing my VPN block and I seen "VPN/Proxy detected - (0:0:0:0:1) " so its safe to run. But if you running it on your network, you might wish to avoid this. Ngrok is perfect for protection between its users and the hoster
leme re build spigot
wat
and try again
are you a bot?
no he's just a bit uh
No, you do know that you cannot use bots on user accounts
the way he is
definitely a human
self botting is a thing but it's against the tos and whatever
could try 1.21.5 I guess, although I was testing 1.21.4
makes me think he's not a human
bots don't get offended and i'm pretty sure he still has me blocked for telling him to start with java basics
im building 1.21.4
leme let u know in 5 mins
i have so many server jars
idk which is the stock spigot one
@sullen marlin
yeah i can reproduce
hmmm
what about if you make a new server folder and start from that
hmm idk why I'm not getting the issue
maybe my connection is closing too quickly, I think I see where there could be a bug
maybe try in a non local env?
also weirdly it only happens on the first connect
@sullen marlin can confirm only happens in offline mode
doesn't happen after reload either, only the first connection of the player
after restart
its probably mojangs fault then
@jagged thicket I think this is a better fix:
Add "DISCONNECTED" to LoginListener.EnumProtocolState.
As first line of try { block in disconnect(IChatBaseComponent) add "this.state = EnumProtocolState.DISCONNECTED; // CraftBukkit"
does that fix it for you?
hey guys!
ive made goals for melee attacking players, but how do you make ones for ranged attacks like a traditional skeleton bow and arrow shooting?
Lemehost[09:33:44 WARN]: Can't keep up! Is the server overloaded? Running 6804ms or 136 ticks behind
Need free hosting, this one not working
what was that fork with the async entity pathfinding again?
Use your PC
i vaguely remember someone actually competent implementing it at some point
Server given up
I been using my PC but what if I need to test the VPN feature?
not talking about the $100 "async paper forks"
Who said anything about PaperMC?
i'm saying $100 async paper forks are not competently written; they're almost universally cashgrabs written by beginners
but i vaguely remember someone doing async entity pathfinding in a proper open source fork
i just can't remember which one of them it was
I see. Well, pathfinding can be heard. Trying to do that on SA-MP server with the SA map makes my head hurt. You have not given the price but it might be a reasonable price due to the complexity. Just as a note, people want money for their works but I don't think $100 for a plugin is not ok
i mean like i feel like spottedleaf or one of the other paper performance nuts has already done this open-source, i remember it being talked about
Try to create one and you see what I talking about, you have been warned
i'm not commissioning an async pathfinder fork or anything
pathfinding itself is pretty simple, but there are tons of ai goals associated with mobs which would all have to be made thread safe probably individually
I like to see you create a plugin that has this if that is the case. I just saying that I attemptted this on SA-MP servers with the SA map and I given up
With their road system
i did write a pathfinder for my npc plugin
Minecraft is more complex than SA-MP because the mobs and all that
you can do pathfinding in async pretty easily, what are we smoking today
Who?
if you implement your own goal system it can be as async as you want lol
just remake the game
but asyncier
What is SA-MP ?
pathfinding itself isn't that expensive these days vs all the goals being started and tested every tick
San Andreas Multiplayer
Its a mod for GTA SA that allows Multiplayer
and it sucks if you're pushing follow distance
scarcely shows up in my timings but then again i'm not doing anything special with pathfinding, most mobs have like a 20 block follow range or something so it's usually not an issue
trying to use it for like getting hundreds of blocks away is probably doomed
I mean it's not the thing you think about short of wanting to mess with entities at least in the low to high hundreds all at once, or tryign to make a caravan-style mob that can go for thousands of blocks
why doesnt
InventoryClickEvent.getCursor().setType(Material.AIR)
work?
i just want to try and remember what that fork was to see if they have some work done on the goals
uh folia or whatever it was?
i'm debating looking into having some of the common goals run async and would like to see how others have done it before me
folia was the regionized ticking thing, right? i don't think that's the type of async i'm looking for
yeah it was mostly for async chunks
iirc
the main problem I see with throwing too much stuff into async is just that you might end up with some critical behavior that feels sluggish
as long as all of it runs every tick there should probably not be more than maybe 50-100ms delay for things to happen, i'm not sure how noticeable that would be
at least i can't think of an ai goal that'd be that sensitive to delays
maybe like running around with speed V and mobs chasing you; if the pathfinder lags behind they'll look to be chasing your shadows
man why is buildtoolsl failing
I love having my computer getting wiped
I don't think I had the jdk
yesterday I had to manually download some stuff for directx 11
Any luck?
I want plugin fakeplayer support 1.19.4
I want ten million dollars
I want a billion dollars in gold bars
You're in the wrong place
And no idea what you're demanding here
Where can I get plugins?
Probably here ? https://www.spigotmc.org/resources/categories/spigot.4/
Hello, I am trying to add custom font to text into minecraft resourcepack, I added font throught .ttf, added .json for getting the abilities and added it into en_us.json. It doesn´t work, can someone help me please?
I do not think the lang file supports font or anything text component related.
For this probably go to the Minecraft Commands discord server
ok opened #1540
perfect, thanks
alrightt!!
yeah, it would be convenient
Chocos component pr is a good start
I do remember a move of a good amount of patches from spigot to CB not that long ago right?
@wise rock hi, could you add me? I need to dm you about some of your projects [sorry for the ping]
also i thought i was in #general lol
Is any1 able to make a plugin for my minecraft smp you will get acces to the smp without making a application as you coded the plugin
?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/
Can someone help me to get only some text with different font with minecraft resource pack?
You can use the font field in a text component
?components
For hoverable, clickable, hex colored, or otherwise complex text, use the component API. Documentation can be found here:
https://www.spigotmc.org/wiki/the-chat-component-api/
I am trying to get it into minecraft first throught resourcepack but I want it only apply the custom font to action bar
You have to use components as linked above
im sorry to hear that
i use packetevents and i want create armor stand with name above, and i try search what metadata i must use but i can't find. i find some github repository, where if find on which index i should set string name, but i don't know how to do to see this title, anyone have idea?
my actual code:
WrapperPlayServerEntityMetadata metadataPacket = new WrapperPlayServerEntityMetadata(entityId, Arrays.asList(
new EntityData(0, EntityDataTypes.BYTE, (byte) 0x20),
new EntityData(4, EntityDataTypes.STRING, nameTag)
));```
https://github.com/Attano/Spigot-1.8/blob/master/net/minecraft/server/v1_8_R3/DataWatcher.java
I search in wiki.vg for 1.8.8 in web archive, but information in web archive is not same as in datawatcher class:
https://web.archive.org/web/20151004095301/http://wiki.vg/Entities
player placed leaf blocks know they've been placed by a player. is this something all blocks have or something sepcific to leaves?
use that
I assume you're talking about the 'persistent' state of leaves
not all blocks have this
Does anyone know anything about TensorFlow?? Please
?ask
If you have a question, please just ask it. Don't look for staff or topic experts. Don't ask to ask or ask if people are awake or available. Just ask the question to the channel straight out, and wait patiently for a reply. Make sure you use the right channel regarding the topic of your question. Create a thread in case the channel is already in use!
though that has little to do with plugin development tbh
`from keras.models import load_model # TensorFlow is required for Keras to work
from PIL import Image, ImageOps # Install pillow instead of PIL
import numpy as np
Disable scientific notation for clarity
np.set_printoptions(suppress=True)
Load the model
model = load_model("/content/keras_model.h5", compile=False)
Load the labels
class_names = open("/content/labels.txt", "r").readlines()
Create the array of the right shape to feed into the keras model
The 'length' or number of images you can put into the array is
determined by the first position in the shape tuple, in this case 1
data = np.ndarray(shape=(1, 224, 224, 3), dtype=np.float32)
Replace this with the path to your image
image = Image.open("/content/manette.jpg").convert("RGB")
resizing the image to be at least 224x224 and then cropping from the center
size = (224, 224)
image = ImageOps.fit(image, size, Image.Resampling.LANCZOS)
turn the image into a numpy array
image_array = np.asarray(image)
Normalize the image
normalized_image_array = (image_array.astype(np.float32) / 127.5) - 1
Load the image into the array
data[0] = normalized_image_array
Predicts the model
prediction = model.predict(data)
index = np.argmax(prediction)
class_name = class_names[index]
confidence_score = prediction[0][index]
Print prediction and confidence score
print("Class:", class_name[2:], end="")
print("Confidence Score:", confidence_score)`
This is my code to identify an object with teachable Machine in google colab
?codeblock
You can use the discord code block format to display code or just text in a more pleasing way:
```java
public class MyPlugin extends JavaPlugin {
@Override
public void onEnable() {
}
}```
Becomes:
public class MyPlugin extends JavaPlugin {
@Override
public void onEnable() {
}
}```
also is that code ai-generated
it looks bigger than it actually is because of the accidental titles, I believe
Probably
was about to say myself
no way they did so many comments
i have this error :
`---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/usr/local/lib/python3.11/dist-packages/keras/src/ops/operation.py in from_config(cls, config)
233 try:
--> 234 return cls(**config)
235 except Exception as e:
19 frames
ValueError: Unrecognized keyword arguments passed to DepthwiseConv2D: {'groups': 1}
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
/usr/local/lib/python3.11/dist-packages/keras/src/ops/operation.py in from_config(cls, config)
234 return cls(**config)
235 except Exception as e:
--> 236 raise TypeError(
237 f"Error when deserializing class '{cls.name}' using "
238 f"config={config}.\n\nException encountered: {e}"
TypeError: Error when deserializing class 'DepthwiseConv2D' using config={'name': 'expanded_conv_depthwise', 'trainable': True, 'dtype': 'float32', 'kernel_size': [3, 3], 'strides': [1, 1], 'padding': 'same', 'data_format': 'channels_last', 'dilation_rate': [1, 1], 'groups': 1, 'activation': 'linear', 'use_bias': False, 'bias_initializer': {'class_name': 'Zeros', 'config': {}}, 'bias_regularizer': None, 'activity_regularizer': None, 'bias_constraint': None, 'depth_multiplier': 1, 'depthwise_initializer': {'class_name': 'VarianceScaling', 'config': {'scale': 1, 'mode': 'fan_avg', 'distribution': 'uniform', 'seed': None}}, 'depthwise_regularizer': None, 'depthwise_constraint': None}.
Exception encountered: Unrecognized keyword arguments passed to DepthwiseConv2D: {'groups': 1}`
also not related to plugin development
yeah, I was hoping they were using tensor in a plugin for some reason but clearly not the case
I recommend just joining some random machine learning/python discord, there's bunch of them
though they'll probably just tell you to not use AI and to learn the thing, ironically
using AI to build an LLM has gotta be the most ironic shit ever
it could be the end of us all
national disaster
if I want to have several timed tasks run periodically on my server, is it best to make one server ticker task for all of them, or to make separate bukkit tasks?
Use multiple tasks
whats the best way to get an array or list of all online players? bukkit#getOnlinePlayers returns a collection..
new ArrayList<>(Bukkit.getOnlinePlayers())
ah thanks
Why do you want a List specifically?
spoiler alert, you don't
That's not true! There are valid use cases for lists!
to select a random player
and that is not one of those
If you're only randomly selecting one random player, you could opt to use an Iterator and stop at a random index instead
doesnt work

wont compile
Oh, Elgar's example
because selected player might not be defined
yeah lynx is 284 years older smh
I mean, like I mentioned, if you're only selecting one random player, you're probably fine just using an Iterator
In fact, there may even be a Guava method to select a random value from a collection. In Iterables or something
Eh, kinda. But there is a method to get a value from any iterable object at a given index
or just ```java
public static <E> Optional<E> random(Collection<E> collection) {
return collection.stream()
.skip((int) (e.size() * Math.random()))
.findFirst();
}
you cant select from a collection so you have to use an enhanced loop
Collection<? extends Player> players = Bukkit.getOnlinePlayers();
Player randomPlayer = Iterables.get(players, ThreadLocalRandom.current().nextInt(players.size()));
Mine is probably a bit nicer because it actually does have optimization for random access lists, which getOnlinePlayers() theoretically could return
Plus it uses an Iterator over a stream
using threadlocalrandom there is crazy
Why?
is there really a need for it
Is there a reason not to use it?
good point
It's a Random constant and you don't care about the origin of its values
If you needed a seeded random, or a specific Random implementation, or a Random instance where you cared about the generation order, then yeah you could use your own instance
You probably don't need that here 
I would argue the Math#random() was crazier
int i = 1;
int randomInt = (int)(Math.random() * Bukkit.getOnlinePlayers().size());
Player player;
for(Player p: Bukkit.getOnlinePlayers()) {
if(i == randomInt) {
player = p;
break;
}
i++;
}
I was just saying that this doesnt work because player still might not be defined
Oh, yeah, cause player would need to be initialized as null
This works fine ^ It's 2 lines. You can use this lol
ah yeah
ArrayList<Player> allPlayers = new ArrayList<>(Bukkit.getOnlinePlayers());
does it matter if I use this or that?
It's a bit unnecessary. You could do it that way, but you don't need to if all you need is one player
ok thanks
I would do that if I were wanting to select a handful of random players and not getting duplicates
only difference really is that iterables is a google commons class iirc
so it's not in the java standard library
Which Bukkit has at runtime, but yes
Clearly the best method is to use Bukkit.selectEntities(Bukkit.getConsoleSender(), “@r”).getFirst());
doesn't matter in bukkit but that's about the only difference
Iterables has some optimizations for List implementations which is nice
public static <T> T get(Iterable<T> iterable, int position) {
checkNotNull(iterable);
return (iterable instanceof List)
? ((List<T>) iterable).get(position)
: Iterators.get(iterable.iterator(), position);
}
Though I notice they actually only check for List, not if the list is also RandomAccess 👀 So technically, not the MOST optimized
nah, repeat @n until you get a player
i kinda hate streams but the streams approach here is probably the superior one
I don't think so
I want to say that internally, CraftBukkit does return a ConcurrentList or something, so that improvement in Iterables helps
its a copy on write list i think
yeah it's a COW
I mean even better lol. It's still RandomAccess
I love cows
Or I guess still a List because Guava doesn't care about RandomAccess
🐄
i mean in terms of being the least boilerplate without relying on third party libs
I'll concede that at least, yes
performance wise the cast is probably the best
streams could have optimisations depending on the pipeline configuration and the source spliterator too
streams
optimisations
if it's in a very hot loop the jit might nuke the streams altogether
We're all fucking nerds. This person just asked how to get a random player and we're debating semantics between optimization techniques
💀 We need to go outside
the weather has been very nice recently
finally getting some early spring sunshine after a long winter
Make a PR to change getOnlinePlayers to return a List and then use List.get(random.nextInt(list.size))
why does it return a collection, anyway
didn't it use to return a list like 10 years ago?
iirc it is a view and promising as little as possible there makes sense
It used to return an array
oh yeah that's right
Is it a view?
what about a Map<Integer, Player>
@Override
public List<CraftPlayer> getOnlinePlayers() {
return this.playerView;
}
I'll be damned
or even better, a BiMap<Player, Integer> and you just reverse it
Java has bisexual maps?
java has turned woke now
an unmodifiable view of a cow list, yes? 🐮
Probably. I can't be bothered to look at what type DedicatedPlayerList.players is lol
-# it's a gson class
not gson
google commons
even worse
guava, whatever
public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - ArrayList -> CopyOnWriteArrayList: Iterator safety
smile
It probably hasn't changed
where hygot.jar
can I have a copy of C:\Users\chocolate\Desktop\hypixel source code NDA DO NOT PUBLISH OR YOU WILL DIE.zip
I don't wanna die :(
oh yeah just ignore the file name
He’ll only die if they find out it was him
jail for different reasons
How do I stop golden apple potion effects from happening without removing the player's potion effects
and I can't cancel the event
pretty sure they mentioned something about breaking kneecaps when I asked about NDAs forever ago
oh mb then
I need help on this too please somebody it's impossible
Why can't you cancel the event?
Because it stops the full eating animation and sound, also i can't seem to reduce the itemstack amount
The potion effect event??
What do you mean
declaration: package: org.bukkit.event.entity, class: EntityPotionEffectEvent
Yeah so the thing is I can't really use that lol
is this what the cool kids would call... an XY Problem?
😭
Hypixel is able to do the exact same thing I am trying to do. Take a look at how they implemented golden apples in some of their gamemodes. In the Hypixel Pit they removed the absorption potion effect while also keeping all animations and sounds working fine.
Why can't you use one of the several options
What's wrong with the above event?
Or removing the effect?
lol just cancel the eat event and replicate the effects if you really want to
I hope that is possible though
maybe PlayerItemConsumeEvent
So....
I may be on 1.8.8
...
Listen I have to use it
I'm sorry
isn't PlayerItemConsumeEvent on 1.8?
Yes
If I cancel it the animation wont play fully, same with the sound
and cancelling it means you can't change the itemstack using e.setItem, you would have to change it using the player's inventory
but still, I want it to be authentic
if you are really that into it intercept the packet outgoing from the server and discard it, then do your own logic from there
1.8 moment
yo is there some sort of goal priority for entities
where they can target players for combat first but when out of combat will return back to a set starting point
like path back
do you mean PathfinderGoals?
Eggscuse me, wtf is going on, When I include com.sk89q.worldedit or worlguard then com.google.common.base goes to buy milk, but if I dont include worldedit nor worldguard, then it comes back...
But IntelliJ do not even compile it
You can easily just code that yourself
This means it went to buy milk...
task triviality is subjective.
if WE/WG packages the common package it will override your dependency if it is higher in the list
its about dependency versions
<dependency>
<groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit-bukkit</artifactId>
<version>7.2.7</version>
</dependency>
<dependency>
<groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-bukkit</artifactId>
<version>7.0.6</version>
</dependency>
I have it like this
At the last place in <dependencies>
looks fine, reload maven
modern string utils
oh cool! How do paths work in terms of entity goals?
modern
Theres legacy too 🙂
lmao
or if you would like to call it as OLD
and how can I make target goals take priority over pathfinder goal
I'm not sure what your project specifics are
I used citizens
if you need more customization just use citizens npcs, they cover everything including mobs
but if you need vanilla stuff, I really can't help you too much because I've never used the pathfinding
is spigot open source?
I dont want to just start saying things because I have no clue what your project looks like
?stash
the funny part is that doesnt even have spigot itself
there ya go
I forgot how messy this stuff is with the bukkit stuff that happened damn
yes, that
i know
what things might break if you move a plugin from a spigot server to a paper server?
depends
undefined
hopefully nothing, but who knows for the future
ofc they have
paper hard forked recently so there is no longer any guaranteed compat
villager example:
good example, thank you
is there any way to configure exact points a and b to move to?
like returning to a set point after all other goals aren't valid
PathfinderGoalMakeLove
there is a navigator that you can set to a specific position
ok
just checking but do goals go in order of increasing priority
based on when you register them
the number before the goal is the priority
I see
Not anymore!
Did TextComponents/BaseComponents get an update in 1.21.5?
Cause all hover and click events aren't working.
worldguard includes a million outdated libraries (and ancient versions of the bukkit api) as transitive dependencies, you will want to manually exclude them or you'll get conflicts like these, or not finding 1.13+ bukkit classes
in any plugin that builds against worldguard, three quarters of my maven build file is excludes for garbage from worldguard/worldedit
Circa 1:30 ago
Frick
btw that was from an old version, now it's similar:
guys entities with "entity.isPersistent = false" will despawn on server restart?
HoverEvents and ClickEvents seem to have broke.
?notworking
"Does not working" is a useless statement. Please describe what exactly is not working, what you expect it to do, and what actually happens. If you get any console errors, also ?paste the entire stacktrace.
i.e. they are not registering.
All text styling is still present, but any event that is added to the component such as click or hover isn't being set.
Are you up to date?
Yes, built it like 5 minutes ago.
Did they work on a previous 1.21.5 version?
I am unsure, cause I am just now getting around to testing 1.21.5
Open a bug report with reproduction code please
I have tested with 1.21.4 and the events still work as intended.
?jira
kk
someone knows
okay, thank you
Not to be confused with the vanilla use of the term “persistent” which is equal to removeWhenFarAway in the api
(I blame MD)
yea
if the server restarts and the entity exist they will be removed right
help
im not receiving the verification email from spigotmc
ive tried doing it many times it doent work
Yes
thank you
If you need this “working” before a fix is implemented, I haven’t tested this yet but somebody on my team said this workaround “works” for the 1.21.5 builds.
Bug report has been made.
https://hub.spigotmc.org/jira/browse/SPIGOT-8024
Interesting
im confused then, are we supposed to use behaviorcontroller or the goals?
May be a dumb question, but why do big servers hide their plugins if they are custom made anyway?
No reason, sometimes it's so you don't realise they might have a known exploit with a plugin
Ohh yea
any given information could be a vulnerability, or you dont want people knowing what anti cheat systems you have set up so it takes more time to bypass them
this is NMS anyway. If you want to...
Also note that the previous one was woth spigot mappings and this one with mojang's mappings
?protocol
ty
Hey does anyone know how I can disable a potion effect packet? When using protocol lib, it only disables the visual in the player inventory and not the actual affect it has on the player, for example absorption still produces absorption hearts.
@Override
public void onPluginEnable() {
PitRemake.getProtocolManager().addPacketListener(new PacketAdapter(PitRemake.getPlugin(), ListenerPriority.NORMAL, PacketType.Play.Server.ENTITY_EFFECT) {
@Override
public void onPacketSending(PacketEvent e) {
Player player = e.getPlayer();
PacketContainer packet = e.getPacket();
if (ItemUtils.getInstance().isPitItem(player.getItemInHand(), PitGoldenApple.this)
&& packet.getBytes().read(0) == PotionEffectType.ABSORPTION.getId()) {
e.setCancelled(true);
}
}
});
}
Is there something I'm missing?
The effect is server side
Well, for most things
You can cancel it with the EntityPotionEffectEvent
That's not available to me
Should I instead look at the source for that event to try and make my own for what I'm working with?
The event wont help you much, you need to look at the code implementations of it.
yeah that's what I meant
😭
Well I'm making a remake of something that is specifically in 1.8
Again what exactly isn't working
Me when I remake a hypixel game instead of just playing on hypixel
I need the absorption potion effect to be cancelled
so we are saying things without thinking
but also to keep all the animations and sounds working when I eat a golden apple
If you cancel it what happens?
If I cancel the packet the visuals are the only thing that is being cancelled
in the inventory
The absorption hearts are still present on the server and client. basically it acts as if its still there because it technically is
and if i cancel the PlayerItemConsumeEvent it wont fully play the golden apple animation and sound
Yeah that seems logical. Just sending a packet means the server will still recognize it and some time later also the client (after some syncing probably)
Maybe you'll have to abstract this even further
You can just remove the effect a tick later
I mean i could but that would mean I wouldn't be able to use the absorption effect at all
Why?
Just remove it one tick after they consume the apple
Could also check if the duration matches that of the apple
I'm trying to look for the EntityPotionEffectEvent implementation
that's not a good solution
really scuffed
and what if i already have an absorption effect?
Well then you get to patch the server to implement the event
im trying to find a better solution
Have fun
thanks?
No no no do not patch the server if you are gonna release this
I'm not
I mean that’s basically your only option
it is a possible solution tho. The easiest one.
Do not patch
Also note that hypixel is working with heavily modified spigot API that has direct controls to the slurce coe that is why they can do what they do
yeah
You do not want to cancel the absorption why?
?
No i want the absorption gone from the golden apple
without cancelling the PlayerItemConsumeEvent
You already sent the packet as I said eralier right? But only the visuals (I assume you mean hearts) are gone
Why are you cancelling the event? Just remove the potion effect with spigot API on the packet fly and discard the packet.
I can't get rid of the potion effect like that because that means every other absorption that I gained gets removed too
it affects other things
I dont want it to even get sent to the server if it was from a golden apple
but that's not possible.
Okay so I guess this whole problem can't really be solved with just packets
Yes it is. Check for receiving packet: eating state food and discard the packet while confirming the eating. Look at the actual protocol for concrete impl.
The only way I can edit the potion effects packet is with PacketType.Play.Server.ENTITY_EFFECT
which when cancelled doesn't do what it should
I guess you could just cancel the eating and then manually restore hunger
And saturation
Okay well i'm either going to just competely remove the ability to gain the absorption potion effect and just use absorption methods from the nms entity player or im going to patch spigot
What are the cons about patching spigot?
Given you're using 1.8, knock yourself out lol
lol
Not like you have to upkeep it
Unless we get another log4jshell
But yeah now that I think about it you can just cancel the eating and apply everything yourself
Except the absorption
e.setCancelled cancels alot more than just the effects
The cons:
- your plugin will not work on standard spigot, since you will be patching the spigot server itself, which I doubt is recommended for that version
I'm probably going to try and patch it, if it fails i just wont use absorption potion effects
ok
It cancels thing that you can easily remake yourself
Hunger, saturation, removing the item from the inventory
The animation, sound..?
Didnt he mention that canceling eating cancels the animation of eating?
Well you can play the sound
does the entity effect event or whatever it was that was suggested earlier not exist on 1.8
I thought the event occurs when the animation is done anyway
no
Nop
Is that a challenge?
this would be fine
With packets you can do something about it
well idk man
I added the entity potion effect event myself lol
fuck it, patch spigot
i've researched a good 2 hours
give them a regular apple named golden apple and give them the desired effects manually on consume
Oh
I was annoyed it didn't exist so I pulled it in
please inform me
I cba to look for the old impl of the event
You see he made it now you can ask him how you can do your own replica on 1.8
The new one is quite different since yknow, item components
New implementation doesn't differ much from 1.7
You could probably look at the source for whatever version it was added tho
Just the fact it uses integers in most places instead of objects
i like how everything can be edible now with components
wouldnt u link the entity effect event into add/removePotionEffect rather than an item consumption?
has anyone made an edible cobblestone plugin yet
Yes
Idk
would make it much more future proofed lol
Latest has it in net.minecraft.world.component.consumable
Like I said, implementation doesn't differ much from current implementation. That's all we do now is overload the add/remove methods and add causes
Is that where i can find it
Yes, it would have it anywhere addEffect() is called lol
ARE MY MESSAGES COMING THROUGH!?
Cause.MILK
I THOUGHT YOU SAID TO PUT IT IN ADD EFFECT ITSELF
YEAH
The event call is in addEffect()'s implementation
A method overload is added that takes in an optional cause
Oh it’s just the cause that’s determined beforehand

is it this
while (iterator.hasNext()) {
+ MobEffect effect = iterator.next();
+ EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED);
+ if (event.isCancelled()) {
+ continue;
+ }
+
+ iterator.remove();
+ toRemove.add(effect);
+ }
this is Minecraft
do i just need to follow it
I mean that's one of them. There are like 3 or 4 call sites for that event
damn
They're all in EntityLiving though afaik
Yeah okay
I get how it works
this probably wont help lol
I need to get to the root cause
which is the golden apple
or the potion effect
It’s probably something like ItemGoldenApple
yeah, well im going to patch this so I can actually have a 1:1 replica
is this a good tutorial? i've never patched tbf
https://www.spigotmc.org/threads/tutorial-adding-custom-patches-to-spigot.158694/
Seems fine
This was Choco, 100%
well, yeah, i think he wrote the implementation
The start/end message only gets sent when I stand on the pressure plates for a few seconds, not immediately when I walk over it. How come?
if (playerLocation.equals(startBlockLocation)) {
player.sendMessage(ChatColor.GREEN + "Successfully started parkouring.");
} else if (playerLocation.equals(endBlockLocation)) {
player.sendMessage(ChatColor.GREEN + "Successfully ended parkouring.");
}
please show the entire code, when does it get called?
@EventHandler
public void walkOverStartEnd(PlayerInteractEvent event) {
if (event.getAction().equals(Action.PHYSICAL)) {
Player player = event.getPlayer();
Location playerLocation = player.getLocation(); // Player's location (contains floating points)
Set<String> parkours = parkour.getConfig().getConfigurationSection("parkours").getKeys(false);
for (String parkourName : parkours) {
Location startPlate = parkour.getConfig().getLocation("parkours." + parkourName + ".start");
Location endPlate = parkour.getConfig().getLocation("parkours." + parkourName + ".end");
// Convert to block coordinates (to match integer-based locations)
Location startBlockLocation = new Location(
startPlate.getWorld(),
Math.floor(startPlate.getX()),
Math.floor(startPlate.getY()),
Math.floor(startPlate.getZ())
);
Location endBlockLocation = new Location(
endPlate.getWorld(),
Math.floor(endPlate.getX()),
Math.floor(endPlate.getY()),
Math.floor(endPlate.getZ())
);
Location playerBlockLocation = new Location(
playerLocation.getWorld(),
Math.floor(playerLocation.getX()),
Math.floor(playerLocation.getY()),
Math.floor(playerLocation.getZ())
);
if (playerBlockLocation.equals(startBlockLocation)) {
player.sendMessage(ChatColor.GREEN + "Successfully started parkouring.");
} else if (playerBlockLocation.equals(endBlockLocation)) {
player.sendMessage(ChatColor.GREEN + "Successfully ended parkouring.");
}
}
}
}
I know the Math floor part is kinda goofy, bcs I need to fix that in the config (but that doesn't matter, the locations are right)
I'm just curious why it doesn't immediately activate the msg
I do need to bcs in my config a coord looks like this
-48.32442794911786
and in getBlock().getLocation() its just -48.0
where exactly?
i would change the config, because these coords are really nothing you want to work with, especially in a config
on Location
yeah ik
Huh sorry, I'm not really following. You just mean naming convention or you mean an acutal method that will activate the msg instantly?
is that a paper only method
It's spigot
finally
hahah no worries
every fucking time i say something is or is not a paper exclusive method, reality warps, and someone tells me its exactly the other way around
Do you have an idea how to instantly activate the message when I walk over a pressure plate in spigot terms?
Not only after standing on it for like 0.5s
i'm pretty sure pressure plates should get depressed instantly when walked over, not sure where that delay would be coming from
Hmm weird
Whenever I walk over it I don't get anything, not even after some time, I really need to stop moving to get the message
If i hold my W and go over the plate I'm not receiving any msg
I only get it when I stand still for a second on the plate
i'd start by getting rid of that flooring nonsense
Yeah ur right
compare blocks or int vectors or something
Am I supposed to floor it when I put it in my config?
So I don't get these weird numbers like -48.32442794911786 but just -48.0
for sure
Alrighty
Check this out btw: https://medal.tv/games/minecraft/clips/jXWaPSWNASSTozcSm?invite=cr-MSw4S08sMTk4OTMwNTE5
Watch Minecraft and millions of other Minecraft videos captured using Medal.
on startup i would read the config once, and build a Set<Block> from the locations
and then do parkourPlates.contains(event.getClickedBlock()) instead of looping over the config
Alright!
Is walking over a pressure plate seen as clicking a block?
the click in the clip was just by accident haha
for the PHYSICAL action iirc the "physically interacted with" block is returned by getClickedBlock yeah
could be wrong, test it
Always scares me to see bukkit datatypes being used in a collection, but Block is just a glorified location so phew
yeah they're not something you want to use willy nilly, and sadly it's not really documented which ones are safe to use or how they behave, so you kind of just have to know or have the sources at hand when working with them
a lesser known case of this, quite similar to Block, is Chunk
World::getChunk with the boolean generate overload, when passed false for, doesn't actually even try loading the chunk - it just constructs a world,x,z tuple from the thin air, and so can be safely used in collections as well
that still scares me bc of the world it holds a reference to
Iirc it's a weakreference
I don't think you're supposed to keep that stored
Location for example does make sense to be stored though
i don't think chunk is really supposed to be stored either
i could maybe see it being more costly on block than it is for chunk or location, since all world access goes through block, and it gets allocated frequently
hm yeah you're right
If it's weakref on chunk then I feel like it should be on block as well
I guess you could create an issue and ask
or just make a PR 🤷♂️
i don't particularly mind it since i pretty reliably clean anything involving blocks on world unload
I am been trying to setup hibernate to with a test plugin before I implement it and I keep getting this error.
Error Log:
https://paste.md-5.net/ohonayapev.cs
how do you initialize hibernate
sometimes you have to set the current thread classloader to the one where hibernate is loaded in order or the sql driver to be loaded properly
private static final String HIBERNATE_CONFIG_FILE_NAME = "hibernate.cfg.xml";
this.saveResource(HIBERNATE_CONFIG_FILE_NAME, false);
this.sessionFactory = new Configuration()
.configure(new File(this.getDataFolder().getAbsolutePath() + "/" + HIBERNATE_CONFIG_FILE_NAME))
.addAnnotatedClass(Challenge.class)
.addAnnotatedClass(PlayerData.class)
.addAnnotatedClass(PlayerTask.class)
.addAnnotatedClass(Preset.class)
.addAnnotatedClass(Task.class)
.buildSessionFactory();
If this is what you mean unless I am dumb lol
apparently this is a different issue, it is related to some sun packages which have been removed in recent java versions
try upgrading hibernate (the sqlite driver too, while you're at it) and see if that helps
https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc
https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-core
you can see the latest version of these packages here
do note that hibernate 7 is still in beta so you may use 6.x releases
if that still doesn't work, try adding the jakarta bind API: https://mvnrepository.com/artifact/jakarta.xml.bind/jakarta.xml.bind-api. You may also need an implementation of this, the only compatible one right now as per Jakarta XML Binding's documentation is Eclipse's one: https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl
I'll try that when I get back from college and I'll let you know the results
hello im making a plugin and im trying to use: customItemItemMeta1.getCustomModelDataComponent().setColors(List.of(Color.WHITE,Color.LIME,Color.BLACK)); does nothing
Show more code please
But iirc getCustomModelDataComponent returns a snapshot, you have to set it back.
Same as you would do with ItemMeta
(I believe the docs say that, so read those too)
ItemStack customItem1 = new ItemStack(Material.IRON_INGOT);
ItemMeta customItemItemMeta1 = customItem1.getItemMeta();
customItemItemMeta1.setDisplayName(itemName);
List<String> ItemLore1 = new ArrayList<>();
ItemLore1.add("sword");
ItemLore1.add(madeFrom);
customItemItemMeta1.setLore(ItemLore1);
// AttributeModifier Item1Damage= new AttributeModifier(new NamespacedKey(AInfinitycrafterPlugin.DostatPlugin(),"test"), 3, AttributeModifier.Operation.ADD_NUMBER, EquipmentSlot.HAND.getGroup());
// customItemItemMeta1.addAttributeModifier(Attribute.ATTACK_DAMAGE,Item1Damage);
customItemItemMeta1.setItemModel(new NamespacedKey("glam","glam_base"));
// customItemItemMeta1.setItemModel();
customItemItemMeta1.getCustomModelDataComponent().setColors(List.of(Color.WHITE,Color.LIME,Color.BLACK));
// customItemItemMeta1.setCustomModelDataComponent()
customItemItemMeta1.getCustomModelDataComponent().setFlags(List.of(true,false,false));
System.out.println(customItemItemMeta1.getCustomModelDataComponent().getColors().toString());
System.out.println(customItemItemMeta1.getCustomModelDataComponent().getFlags().toString());
customItem1.setItemMeta(customItemItemMeta1);
player.getInventory().addItem(customItem1);
This is not readable
but yes it looks like you're not setting it back
'DostatPlugin'
Not only is it in Czech but also it breaks java naming conventions
still the same answer: you're throwing the component away after editing it
you need to set it back onto the meta after editing it
you need to call ItemMeta#setCustomModelDataComponent
Do the same you do with ItemMeta
i'm getting fucking radicalized by the frog brain
i have no idea what mojang did with it but it's looking like frogs are about on par with villagers now, in terms of being incredibly expensive
how do you know Czech?
how does it break the naming convention
It's a method
methods don't start with capital letters
Try to make a guess
oh I thought it was a class mb
and that's exactly why we have the convention
in translation "GetPlugin"
yea i was just happy it works im starting java and programing so sorry that i dont know this stuff or make mistakes
Still getting the same error
Did you try adding the Jakarta dependency?
Yes
Both the api and impl?
Hm, is it the exact same error?
Also, did you keep the old hibernate version or is it 6.x
I did update to the lastest 6.x version
Are you shadowing the Jakarta dependencies?
java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration I get this error if I use the orginal-TestPlugin.jar
In my pom?
Yes
I have the shading package but i didn't add anything to that
https://paste.md-5.net/bayolohawu.xml
I do get this warning tho when building
try adding <scope>runtime</scope> to com.sun.xml.bind:jaxb-impl
oh wait
you're using java 8
this lib is for java 11+
by changing it to 17 right in <java.version>
well, you got to have jdk 17 in your path too otherwise it won't work but yes
honestly no idea
Could it be issues parsing the config?
try removing the jaxb runtime, leave just the API
if it is the exact same error, it is because it isn't shading in the jakarta xml binding API
I'll try setting up hibernate myself in a test plugin just to check
Where can i find what all gems do?
gems?
ye
what are gems
like the brougt me here from sort of discord link from the bliss plugin fore minecraft
that sounds like an issue for #help-server though if it is a specific plugin, you might not get a lot of answers. You're better off asking in the discussions tab of the resource in question
Thank you very mutch !
?img
Can't send images? That's because you're not verified! Use !verify to complete verification.
Alternatively, you can upload screenshots to any image hosting site and share the link.
Here's some screenshot utilities that you can use to upload images.
Lightshot: https://prnt.sc
Imgur: https://imgur.com/upload
Flameshot: https://flameshot.org
If you can get it working that'd be awesome
Idk if it's also because I didn't competly fill out my classes with columns and stuff
is it possible to have a temporary chat message?
i want to use it to make a status bar
the best you can do is clear the chat after some timeout
But you can use just the action bar with some font magic probably
was there a maximum width for the actionbar text? you could offset it with regular old spaces rather than negative width symbols if the width is unlimited
how can i get the targetSlot? i mean where the item goes to from a InventoryClickEvent
if(it.action == InventoryAction.MOVE_TO_OTHER_INVENTORY){
val item = it.currentItem!!
val player = it.whoClicked
val targetSlot = it.
}
you don't
i cant?
not from the event
you have to look at the item being moved and then the slots in the target inventory and manually determine which slot(s) the item will go into
find stackable items in the target inventory that stack with the item being moved
uhm
then take the first one
and see if it overflows
and then take the next one
and repeat until the moved item stack fits in the slots
damn that sucks
yes
a client want that feature
its ass
so i need to cancel
the event
and do that logic
i mean depends on what youre doing
there's no point to cancelling the event and then doing the logic yourself anyway if the effect is the same
doesn't really matter whether its the server shoving the items in the target inventory or if you shove them in it in exactly the same way
i assume you're like trying to prevent items from being shift-clicked into a gui or something
i want to allow that
but see
let me record
a video
if i shiftclick the event that i have to convert items doesnt work
i have absolutely no idea what im looking at or what you are trying to communicate
you are placing a magnifying glass named search into a toilet?
It is a system where what you put above becomes what is below, the problem is that if I pass it with shift it does not go through the conversion logic
mmm well
in this case, i would listen to the "move to other inventory" click event, wait 1 tick, and then trigger an update for the inventory
and in that update call do the conversion logic
no need to cancel and simulate the event, just let the server place the things where the client expects them to go and then process them afterward
though you will have to fill the bottom row with some invisible item or gui element so it can't be shift-clicked into
items go into the first available slot that it fits to include stacking. So if you fill all slots and left a slot open then the item will always go into that one open slot as long as it can't be split and stacked (other items have to be the same including metadata which is how you can control splitting in a sneaky way)
Anyways, if you need to know where all items went even if it were split up, you just hold a copy of the inventory
compare to later
and then its just getting the differences
iirc partial stacks are prioritized over empty slots
so it's not necessarily the first available slot, you'll want to loop over partial isSimilar stacks first
PlayerInputEvent
☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️ ☝️
So I'm using playerInputEvent but I cant get key release... I asked GPT and it said I could do it with packets... Would this work?
that doesn't look right to met at a glance
Why would you ask chat gpt
those look like the input packet fields
cuz I was lazy
but its using the vehicle steer packet
🤷♀️ ik
use the input packet
hence why im asking
have you tried it
what do those look like
see the protocol documentation
nope, haven't used dependencies yet
is your question how to use dependencies?
now it is 😂
😭
but I could just look up some tut for that
thx
if I use custom packets should I still use playerinputevent for detecting the first keypress?
technically I should cuz it's a trigger for the script (an event) right?
sry wasn't thinking I mean just a packet 🤦 had a long day
you could use the event, but if you're already listening to the packet, you might as well keep your handling all in one place
i.e. the packet listener
hmm yeah that'd be smart
thx
but if I do that doesn't it listen for every packet? putting more load on the srv?
why the dependency not found?
did you add the repository to <repositories>
yes
did you reimport the project
reload maven
open the maven side pane on the right
and click the circular arrow buttons to reimport the project
worked thx
or the refresh button
there are also like 5 other buttons that do this scattered in random places of the ui, but the side pane is the most reliable
that'd be the circular arrows yes
yeah I've made plugins in the past just not with dependencies
i guess everyone uses the mcdev plugin these days
ill try
i just told him to fuck off anyway
lol
Allo, I was working on a skyblock plugin, and was curious what the performance tradeoffs, if significant, are for having multiple islands per world or one island per world?
worlds use an amount of memory
it isn't significant in reasonable numbers but it will absolutely fuck you over if you have them in the high dozens or even hundreds
and there aren't many advantages that i can think of in making it island-per-world
ok ty I was just curious if it was even significant for slime worlds
Lol
actually on that subject I wanted to make a similar plugin for my srv idea, and it requires seperate islands for players as well as undisruptive world creation. my main idea was to have empty worlds and load it and paste a schem into it (schem being player's island) and then give that player that world, when they log out the world saves the schem and removes all data from it before unloading. In the case of a lack of vacant worlds we would need to create temporary worlds (preferably async).
I like the idea of unloading, I feel like that would remove the performance issue
yeah
and instead of storing the block data in the worlds just store them in schem files
It's not in javadocs (I checked) but does anyone know if Damageable#damage() does damage values before modifiers (such as armor) or after (armor piercing damage)
I think its before modifiers
hmm not sure, def possible i'm sure I just dont know how
I was thinking about just using the slime world format
w/o ruining things here, has slime world manager been mentioned?
but I presume that's not what you're looking for exactly?
I mean I'm not against using it to manage the world format for me
also finegamez have you done any performance testing? is it feasible to do it in that manner by unloading the world when not in use?
Worlds use up more resources then just putting it in some far off chunk that gets unloaded when not in use.
so it's actually better to create a grid like system for players like each player gets a 16x16 chunk area?
Yes
but will that still make it use up a lot of storage space
You just space them far enough from each other if you dont want islands visible to each other. And dont load the chunks that are so many away
cuz I'm pretty sure say hypixel they use a schem based thing I'm pretty sure they give you like a simulated world not too sure how they do that but its like a separate world without being an actual world I think
Only if you generate the chunks between islands but even then you just use a void world which is just all air. Chunks that are only air take up no more then like 1kb
oh ok good
They are capable of utilizing different methods such as using a vm per world where it is more optimal. It appears its on one server when really its not. Its a bumch of vm worlds on a box
yeah
ik that they use multiple machines and resources but still
its not one srv for sure that'd be insane and impractical
However for smaller networks using 1 or 2 worlds is the best choice in terms of cost and resources
hmm alr
but like what if players play generate an island and never join again
it uses up space for nothing
no?
You would have a system in place that tracks where their island is at. If gone for like 2 months delete the chunk lol
thats what I would do but some just take a long break, a schem system while still being stored takes alot less space no?
Then use schem for storing their island for future use. Schematics take up the same amount of space the island will in a void world. Differences being schem wont save entities or lighting info
oh yeah... so it would end up being harder for no real reason
Schems are nice in generated worlds because you only save structures and the sorts and not the rest of the world with it...usually lol.
my worry also comes with migration reasons... if I want to transfer to another host or just store the files for a period of time im obligated to store the full world which each island may not be much but overal it adds up and instead of managing some several mb files it may be 20gb worth of a world I would think...
unless I'm overestimating the amount of storage void worlds take up
true
at the end of the day it's probably not that bad tho, I'm overthinking it
I read somewhere that Hypixel does a server per world for skyblock
then disables it when everyone is gone
I think
yeah probably containerized
yeah
kubernetes or something
yes yes I think your right
tells me smth
but some overcomplicated custom solution for sure
well for their amount of users
ye lol ofc
I'm sure it's worth it haha
overcomplicated for the average srv I mean
yeah
fr
Well, I guess I'll have to make a custom layer over a skyblock plugin now
because I cba recreating all the functionality from scratch
yeah
Mc doesnt store every air block. It stores air block and puts a range. This way it only had to store 1 air block or just a few instead of all of them. Thus it isnt wasting space. Only blocks placed use up more storage. In a 10kx10k chunk area a generated world on average if fully generated area takes up like 10gb of space and with 100 players they will probably contribute to about another 5-10gb of space in like a years time
A void world with 100 players you are looking at like 5gb at most lol
and I guess I could still have a couple different worlds
But that is 5gb in a years time
even if each player has like 16x16 chunks
A single chunk would take up no more then like 30-50mb depending on what that player is doing. They would really need to fill that entire chunk which is not easy in skyblock.
also random question I dont want to interupt the subject but do you know if coreprotect works with itemsadder
Have no idea, never used it
ugh coreprotect
alr thats good
whats bad abt it?
I had to go searching for their patreon just to get a working jar
huh?
I just downloaded it off spigotmc
worked fine
then later updated from 1.20.1 to 1.21.1
just fine
mine kept spitting errors with one of the plugins on 1.21.4
huh
I don't remember which one exactly
get fucked, COW people
