#help-development
1 messages · Page 736 of 1
dem
i was create 2 plugins in 1 pacage
but i was can do this...
what the bukkit derictory? i mean it doesn't look like the icons below
I have not tested code yet I’m just implementing a system’s packet listeners for preventing block breaks and stuff in regions and I don’t want to use the bukkit api
Idk why you don’t want to use the api but okay
I don’t want anything else to happen before I do my checks
That’s what event priorities are mainly for
But what if there are other listeners at the lowest
I’d like to prep for those cases if they exist
Well then they are probably protection plugins too
Or they could just be dumb and using the wrong priority
Anyway idk if cancelling events will inform the client, probably not for most cases
Right, could you link the error? It could provide some insight as to why it's not working
yes sure
Be sure to @ me too otherwise I might miss it
See, now that's a pretty insightful error message. Check out this stack overflow thread: https://stackoverflow.com/questions/50505042/mysqlnontransientconnectionexception-client-does-not-support-authentication-pro
i am working on a skin maker with Graphics2D, but i have some problems with drawing the hair. the hair is not geting drawed on to the skin that is chosen at Graphics2D g2d = imageskin.createGraphics(); it also does not work when i change it to this g2d.drawImage(imagehair, 64, 64, null); hope you can help me.
switch (sex) { //sex
case "Junge":
pathsex = "./char/vorlagen/boy";
break;
case "Frau":
pathsex = "./char/vorlagen/girl";
break;
}
switch (bodycolor) { //skincolore
case "white":
imageskin = ImageIO.read(new File(pathsex,"skin_white.png"));
break;
case "black":
imageskin = ImageIO.read(new File(pathsex,"skin_black.png"));
break;
}
Graphics2D g2d = imageskin.createGraphics();
switch (hairart) { //hairtype
case "long":
pathhair = "./char/vorlagen/hair/long";
break;
case "short":
pathhair = "./char/vorlagen/hair/short";
break;
case "dreadlocks":
pathhair = "./char/vorlagen/dreadlocks";
}
switch (haircolor) {//Haarfarbe
case "blau":
imagehair = ImageIO.read(new File(pathhair,"hair_blue.png"));
break;
case "braun":
imagehair = ImageIO.read(new File(pathhair,"hair_braun.png"));
break;
case "schwarz":
imagehair = ImageIO.read(new File(pathhair,"hair_black.png"));
break;
case "red":
imagehair = ImageIO.read(new File(pathhair,"hair_red.png"));
break;
case "violet":
imagehair = ImageIO.read(new File(pathhair,"hair_violet.png"));
break;
case "green":
imagehair = ImageIO.read(new File(pathhair,"hair_green.png"));
break;
}
g2d.drawImage(imagehair, 0, 0, null);```
no error in the console
There is wiki.vg/Protocol
NMS is a lot more than packets
anyone some idea? I need to change block hardness or just breaking time for block. Best way would be probably get custom block hardness every time when player will start destroying and than calculate the breaking process. Maybe there is some better way to do that? I just used minecraft wiki to calculate that but seems to be wrong or I just made mistakes somewhere. Idk Im geting kinda weird output. I just assume canHarvest means if its a crop but that does not make sense... if its like that, because the efficiency enchant would never be applied. Probably it means something else. Code: https://paste.md-5.net/tasizofizo.java and my output:
it is intresting that i get the error image == null! when i try to get just the imagehair
you can't change block hardness you'll ned to spoof this
you can probably just fuck with the BlockDamageEvent iirc its called
and send the damage packet to the player
^ is build into spigot so no need for nms
If I edit block breking process with NMS I think I can, but I would like to keep the tool mechanics.
could be wrong but iirc hte only way is spoofing it
then you need to readd efficency and haste manually by runnign the calculations yourself
I just get inspiration here https://www.spigotmc.org/threads/why-custom-block-breaking-change-block-hardness.531825/ but there is set duration for every block and tool, thats why Im tring to calculate breaking time on my own with changed block hardness.
I just need to get correct calculation idk how thats why Im here xD
googling allready for some time
Or maybe I will just need to set breaking duration on every block for every tool... that sounds like pain xD
If you modify the block hardness server side it won’t change for the client
how do i make a triangle
You should probably start with three sides
How so? How do you want to make a triangle? What type of triangle?
a location, 2 days ago, bc 🐺
jk i’m trying to cut his face and put it onbthe ground
only rhing i can think of is 5 triangles
like a venus fly trap for players
json
I will change the whole process of breaking block with packets. Like its on the forum post which I mentioned. So now I need to get correct calculation for block breaking speed/time just something xD
why would you send this here
How do I see if a falling block and player collide?
Oke I found something new... canHarvest if you can get drop from the block. For ex. if you are mining obsidian with stone pickaxe this is false. It has nothing to do with crops.
ah! Of course!
not really a problem yet but just an idea
i want to be able to sync faction like groups to a database back and forth and when the server starts it'll load those factions back into the manager
and when events happen like new creations or a name change, the database will update to reflect that
Hi, sorry to repeat myself
But is there any a good way to cancel a Cow milking?
Im currently removing the milk from the player after the PlayerInteractEntity event
But i dont think thats the best way
This is my current code:
if(this.CurrentMilkingCoolDown == 0){
player.sendMessage("You just milked " + this.Name + ". Cooldown now is: " + this.MilkingCooldown);
this.CurrentMilkingCoolDown = this.MilkingCooldown;
player.getInventory().remove(new ItemStack(Material.MILK_BUCKET, 1));
ItemStack item = this.giveMilkBasedOnQuality();
player.getInventory().addItem(item);
this.taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(ZooFee.getInstance(),
this::LowerCooldown,
0,
20);
}
Actually, im going to post the whole code for the handler that i got:
public void onPlayerMilkEvent(Player player, Entity MilkedEntity){
if(this.entity.equals(MilkedEntity)){
if(this.Sex.equals(ZooSex.Male)){
player.sendMessage(ChatUtils.setColorName("&lYou can't milk a &r&9&lMale"));
player.getInventory().remove(new ItemStack(Material.MILK_BUCKET, 1));
return;
}
if(this.Age.equals(ZooAges.Baby)){
player.sendMessage(ChatUtils.setColorName("&lYou can't milk a &r&d&lBaby"));
player.getInventory().remove(new ItemStack(Material.MILK_BUCKET, 1));
return;
}
if(this.CurrentMilkingCoolDown > 0){
player.getInventory().remove(new ItemStack(Material.MILK_BUCKET, 1));
player.getInventory().addItem(new ItemStack(Material.BUCKET, 1));
player.sendMessage("The Cow: " + this.Name + " has been milked already. Cooldown now is: " + this.CurrentMilkingCoolDown);
}else if(this.CurrentMilkingCoolDown == 0){
player.sendMessage("You just milked " + this.Name + ". Cooldown now is: " + this.MilkingCooldown);
this.CurrentMilkingCoolDown = this.MilkingCooldown;
player.getInventory().remove(new ItemStack(Material.MILK_BUCKET, 1));
ItemStack item = this.giveMilkBasedOnQuality();
player.getInventory().addItem(item);
this.taskID = Bukkit.getScheduler().scheduleSyncRepeatingTask(ZooFee.getInstance(),
this::LowerCooldown,
0,
20);
}
}
}
Only other event i can think of which probably doesnt get fired for this is the playerfillbucket event
Thats the one im trying rn
Could try it doubt it will work. Otherwise the way you are doing it is the only way
Without resorting to nms of course
It actually works!
@EventHandler
public void onPlayerBucketFill(PlayerBucketFillEvent e)
{
System.out.println("Converted");
if (e.getItemStack().getType() == Material.MILK_BUCKET)
{
e.setItemStack(new ItemStack(Material.BUCKET));
e.getPlayer().updateInventory();
}
}
hey so I got it working but I kind of have to give the player the map item itself for it to render properly, do you know any fix?
this is myt code rn
Ey, Quick Question. I got a Mob that has custom holos that i made. Using the DPC (Data Persistent Container) can i save this mob and the holos and reload it after?
It has thing like right click action, amongst other things
Oh nice. Maybe someone can update to add more entity related methods instead of just blocks
Glad it worked for you
Can someone help me? How do I detect when a player gets touched by a falling block?
Question; To create custom items that will be use to interact with entitys (Ex: Cow food) is it better to use inheritance from ItemStack or just use the customize the MetaData
use metadata/pdc
2 ways to achieve this:
- Maps
- Text display entities
this is an invisible Map?
I don’t see volume, the text is literally in blocks
Probably, if its a newer server then it could be display entities as well
1.20.1
Neither of these work to ban player.. first one throws "nosuchmethod" and second one doesn't even compile as you can see
victim is a Player
red squigglies say "cannot resolve method addban.........."
No such method on this as well
At runtime
Its fine in IDE
intellisense shows it
server version?
disregarding the fact you are running paper and this is spigot, you are running a build prior to that method being added
tldr update your server
ok to fix this I gave the player an item then ran a task async where I remove the item from their inv
why r u calling fields with upper case first letter
Can someone PLEASE HELPPP
How do I check when a falling block hits a player?
I am dum
And new
Hello?
lmfao peoples just given up
Probably entitydamagebyentity
@umbral marsh
I'm pretty sure falln blocks deal damage
Not all the time
what's the greatest vertical velocity a player can possibly have in vanilla?
then byblock
???
its probably infinite until server dies
not what I meant
wait
what's the greatest vertical velocity a player can possibly reach in vanilla?
bro WHAT
ithats the thing tho its not
v is like legit some special value or smth
jvm bug?
this is the java.lang.StringConcatHelper#stringOf code
the null check just doesnt work lol
i can also not replicate this on my machine with the same data
If value is equal with null returns true
Maybe write a print above the return to see whsy your value is
you should make the code a bit longer, because some things may not work as expected when you shorten everything into one line
just seperate the if statements
this is jdk code
i didnt write this
this is from openjdk
but i can easily see that if the value was actually null as defined by the jvm it would work as intended
my value is some kind of special null it seems like because checking == null doesnt do shit
i also cant print it
trying that throws the error i showed above
a special null huh
since the jdk string concatenation code can not handle the value
but the jvm still thinks its null when you attempt to deref it
yeah lmao istg
i made a special null value
i fixed it though, im pretty sure i made it with Unsafe
it was trying to get the boolean field from the Boolean class which somehow resulted in a corrupted object value or smth
but now that i made a special case for it it works
it's easier and safer to just --add-opens and use reflection regularly lmao
yes but slow as fuck
unsafe is faster than bytecode
like i generated bytecode for the serializers which used GETFIELD and shit and it was slower than using Unsafe
and im not gonna require ppl to add flags ill just use Unsafe and method handles to remove encapsulation
java security is bullshit when its so easy to break it why even have it
its just annoying
Well, there's a reason why security manager is deprecated
true
its been deprecated since like java 14 or smth tho
also will something replace it then or what
before C2 hits, sure, but no-one's running with -Xint lmao
reflection is slow if you don't optimise for it
wdym if you dont optimise for it
also yeah a good JIT will prob make it faster, doesnt it have to do access checks though
not once it has asserted it's visible
the JVM aggressively inlines constants (static final fields), and that is especially true for core reflection and MethodHandle/VarHandle invocations
oh it prob does that when resolving the reference from the constant pool yeah
but why tf is it still so slow
Imagine writing final static fields just for jvm to just inline it anyway
VarHandle might work yeah but i still think Unsafe should be faster
have you properly benchmarked it.., like, jmh
VarHandle is the literal API replacement for Unsafe lmao and it uses it under the hood
which is inlined
oh sick
nah im also exaggerating but i did warm up rounds and repeated it a couple times and it was consistently slightly slower than Unsafe
its some goofy benchmark system tho so the results might be off
slightly
also idk if i could do any optimizations in the bytecode
i dont think so
we're talking nanoseconds here, the point of bytecode is to be simple, not optimiseable, that is for the runtime to do
nvm now the asm version is faster
couldve been java version but i think my benchmark system mightve just done some weird shit
Unsafe is generally faster due to intrinsification
at least its faster than ObjectInputStream
ObjectInputStream isn't great...
That is like comparing Windows XP to Win 98
Do you at least have strong enough protection against malicious data?
idk
Half of Javas exploits come from ObjectInputStream
its for internal communication tho
closed network
so im not too worried about that
how did this happen tho
also here is the unoptimized write method the loop and switch is prob the reason why its slower https://pastes.dev/2busIxU3Ra
fuck i forgot to handle booleans again
Gotta love net connection speeds that are slower than modems
Refer to my private messages for a business enquiry 🙏
Also I am bewildered at your ability to write Java code that looks like C code
lmao
fr
My initial thoughts
do you think wt(stream, type).write(val) is faster because it returns the stream on top of the stack or { wt(stream, type); stream.write(val); } because the compiler can just DUP the stream on the stack and reuse it
or will the jvm do that
bro it literally does not matter
i need the nanoseconds
don't run in interpreter mode then
it doesnt
?paste
https://paste.md-5.net/kuleqatela.cpp get error "Location loc1 = new Location(v1.getX(), v1.getY(), v1.getZ());" because the sintax is new Location(World, x, y,z ) how i can do?
pass null
ok
actually just pass a world context
param
what you're writing is weirdly structured
i do it now
how i can do entity.getEyeLocation().getDirection();???
What
how i can get vector of eye
The position vector or the look vector?
how can i do more commands in a single class file?
look vector
getEyeLocation#toVector ?
wtf is the Distance class
dont exist
huh
Might only be on LivingEntity
ok
right
looks kinda like a raycast
but anyways, I checked and it is on livingentity
how can i async blocks?
What
an asink
how can i async like the wood block
Okay how do we explain this? lol
You cannot just "async a block". That means nothing
Getdirection instead of tovector
I want logs to have their own thread
That's doable
But isnt the file already written async
Asynchronousy is taking a task and performing that on a thread separate from the server's main thread. The wood block doesn't do anything. There is no task to accomplish. So what do you want to do with this wood block? Do you want to change it to some other block? If so, asynchronous world writes are not supported and can leave the world in an irrepairable state
i want to async because someon told me the runTaskLater take a lot of prestaction of the server
that is the code i done with runTaskLater
public void onBlockPlace(BlockPlaceEvent event) {
Player p = event.getPlayer();
Block under = p.getLocation().clone().subtract(0.0D, 1.0D, 0.0D).getBlock();
if (event.getBlock().getType() == Material.OBSIDIAN) {
p.sendMessage("hai piazzato un blocco di obs!");
new BukkitRunnable() {
@Override
public void run() {
event.getBlock().setType(Material.AIR);
p.sendMessage("Il blocco e' stato rimpiazzato in aria!");
}
}.runTaskLater(plugin, 200);
if (under.getType() == Material.OBSIDIAN) {
p.sendTitle("Sei sopra un blocco di obs", "OSSIDIANA!");
}
}
}```
it's tthe change of a block after an amount of seconds
Yeah, don't run that asynchronously. You're changing a block. It's not supported
Just learn about time complexity and memory complexity and in 99 % of cases your problems resolve themselves
You're changing a block type which will take you nanoseconds to do. Probably less than that 😛 You don't need it async
From within the main thread
You may want to make a single task that handles replacing blocks later instead of making a task for each
But I doubt it matters much
then if like 10/20 players do that in the same time will do nothing right?
Yeah, you can always spread the block placing over many ticks
It'll spread the load and you won't feel it
You have to keep in mind that a significant majority of Minecraft is run single threaded
Every single entity, block entity, particle, sound, block logic, containers, literally anything and everything in Minecraft, is being processed synchronously
Your single block change will not affect it lol
That's nothing then
Spigot async everything when?
oh ok thx a lot ❤️
ehh
If it wouldn't be so difficult why not
particles not really
anything and everything [...] is being processed synchronously
massive generalization
For all intents and purposes, this is true though
Well
can i ask another question?
Probably less
We are not getting into packet level details here or the specificities of asynchronization of the server when he's just trying to set a block 😛
I heard something about netty thread pool
It must spread the load across those threads
how can i put 2 or more command in the same .java file but let they get executed from diffrent command like i want to lock the command /plugin / pl how can i do it within a single fie?
file*
alias?
i want to do differnt actions too
I think the main thing that would benefit from being async atm is entities
does it really need to be on a single file
What's the benefit other than just having a file with 5000 lines
u are true XD
thx a lot ❤️
@worldly ingot the guy told me the think of RunTaskLater said :"Distributed workloads or an asynchronous task with a map of blocks and times"
Yeah it doesn't need to be async. They're high
You can create a single task to replace a list of blocks at specific timestamps, which Coll also suggested (and is probably going to save you from creating tasks over and over again), but it definitely doesn't have to be async
And in fact probably shouldn't because you're modifying the state of the world
distributed workloads would only be needed for an insane amount of block changes
FAWE really doesn't need to exist
then it's a good think if i change from RunTaskLater to workloads right?
Usually you shouldn't be doing large block manipulation on a production server
You're A-okay using the task you're using now, Phonk. lol
ooh shots fired
what A-okay mean?
I remember just placing large buildings and just waiting, even if my client lost connection
?ischocoreal
No, Choco is not real. I was not programmed to say this by Sam.
I would just rejoin later
JIT compiles stack operands well. I'd say returning void is actually better
putting an enchantment level of 0 results in level I right or was that just a potion effect amplifier thing
just potion effects
gotcha thanks
does block break event trigger on any block break or only the player?
player
hm
I'm still thinkin about makin that block remove event
ig then blockbreak and explosion should work
good idea
So, I am working on character skills rn, and I don't know how to upgrade the skills based off their level. My current thought process was to use if statements check for level and do the stronger variation of the ability.
if (currentLevel >= 11) {
.....
} else if (currentLevel >=22 ) {
.....
}
......
But doing this makes everything else unreachable, and im just drawing a blank, don't know how to structure this.
Algorithms!
Let's say you have a "strength" skill that has levels from 1 - 100
And every 5 levels you want to give health to a player
You can just do something like
int healthToAdd = level / 5
We love math
yep
Yeah, I understand that, the thing is, these skills can be used over and over and whenever, so the player could be a different level. there are certain sections in the levels where everyone has access to certain things. e.g beserk skill gives buffs, but it cost less mana and last longer the higher level you are. I don't know how to structure when to give what variation of the buff.
if (currentLevel >= 11) {
.....
} else if (currentLevel >=22 ) {
.....
}
......
This here only the first if statement runs nothing else will, because the first one will always be true. i dont know how to make this idea work in a sense.
i dont
Yeah. i just dont know how to think of it.
data classes for this kind of stuff
lets stick to the norm lol
public abstract class ActiveSkillData {
private final int skillLevelRequirement;
private final int manaCost;
protected ActiveSkillData(int levelRequirement, int manaCost) {
this.skillLevelRequirement = levelRequirement;
this.manaCost = ...;
}
public int getLevelRequirement() {
return skillLevelRequirement;
}
public abstract SkillType getSkillType();
}
public enum SkillType {
STRENGTH,
...
;
}
public class BerserkerActiveSkillData extends ActiveSkillData {
private final float damageBoost;
public BerserkerActiveSkillData(ConfigurationSection section) {
super(section.getInt("level-requirement"), section.getInt("mana-cost"));
this.damageBoost = (float) section.getDouble("damage-boost");
}
public SkillType getSkillType() {
return SkillType.STRENGTH;
}
public float getDamageBoost() {
return damageBoost;
}
}
something like that
rest is up to you
that's just one way to do it
How would this fix the different level for skills thing? if someone is level 11 they can have the first varation but once they get to level 21 they get an upgraded, but it checks for the level everytime, and i want them to have the first varaition until they reach 21. then the 2nd unclocks and they can continue using the 2nd varation until level 27, where the 3rd unlocks. I don't really understand what that does.
you kinda need to loop on the opposite way
ActiveSkillData is a "variation"
You can do something like
loop through all the variations, from the highest level to the lowest
And if the player's level belongs to that variation, stick to it
Okay, that makes a little more sense.
how i can semplify https://paste.md-5.net/exomijetez.cpp
declaration: package: org.bukkit.util, class: BlockIterator
who knows why annotations are needed? I mean, there is inheritance of interfaces, etc.
reflection is very resource intensive
only disadvantages
you don't have to use reflection during actual runtime
its usually during aplication startup
as startup time usually doesn't matter
hm
also reflection is pretty much faster in newer java versions
and for this reason people decided to give more importance to convenience than speed?
i want to replace a default minecraft command with a custom one that i created in my plugin, how can i do?
Yeah I mean as with any other thing, if you're not just calling it tons of times for no reason, you probably wouldn't be able to notice any performance hit
hm
Well, if you look at it from this side, will registering commands be convenient and at the same time not resource-intensive in the process if you use annotations?
The lengths people are willing to go to avoid comparing arguments
Spigot doesn't force you to use annotations, you may also i.a. register your listener method manually https://hub.spigotmc.org/javadocs/spigot/org/bukkit/event/HandlerList.html#register(org.bukkit.plugin.RegisteredListener)
declaration: package: org.bukkit.event, class: HandlerList
However, I believe that the overhead you get from reflection is negligible and possibly not something that you'd actually notice in practice
Does anyone know a way to automatically get the getMappingsVersion() string during the plugin compilation and, for example, save it to a maven property or put it in a file (like what com.google.code.maven-replacer-plugin does)? This would be very helpful working with NMS since the checking of getMappingsVersion() would be automatable.
Also, doesn anyone know what that string means? Or if it even has a meaning or it's just random
I'd guess that this is a version number that is given by Mojang
what do i need to type in my pom.xml that it save my plugins into the file i want them to be?
It's a randomly generated hash. And no, I don't think there's a way to get that with a Maven plugin
also reflection is
pretty muchfaster in newer java versions
fify
Why am I getting this error: java.lang.ClassCastException: class org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData cannot be cast to class org.bukkit.material.PoweredRail (org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData and org.bukkit.material.PoweredRail are in unnamed module of loader java.net.URLClassLoader @759ebb3d) when casting this: PoweredRail rails = (PoweredRail) clone.getBlock().getState().getBlockData();
same error
can you provide code ?
Location clone = ...; clone.getBlock().setType(Material.POWERED_RAIL); PoweredRail rails = (PoweredRail) clone.getBlock().getBlockData(); location.getBlock().setType(Material.POWERED_RAIL); PoweredRail secondRail = (PoweredRail) clone.getBlock().getBlockData(); secondRail.setDirection(rails.getDirection(), rails.isOnSlope()); location.getBlock().setBlockData((BlockData) secondRail);
what version do you use ?
PoweredRail is deprecated
You're deprecated
Did you forget the new keyword: new Color(int, int, int)
bot shut up
Rail is from org.bukkit.block.data
but i wonder how i would check if its a powered rail
?jd
Thank you! I think I'll just try implementing one myself then (I'll make a post on the forum when it's done).
declaration: package: net.md_5.bungee.api, class: ChatColor
You probably imported the bukkit ChatColor instead of the Bungeecord one
check the material
declaration: package: org.bukkit.block.data, interface: Powerable
nah thats not what i wanted ... i was searching for #IsPowered()
but its packed into Powerable ^^
The JavaDocs page says Rails extends MaterialData, so PoweredRail rails = (PoweredRail) clone.getBlock().getState().getData();. Or am I wrong?
wrong
there is no PoweredRail anymore
if you want to check if your Rail is powered or not (and its a Material.POWERED_RAIL as well) you need to check the
Powerable power = Block#getBlockData()
and how can I check the direction and apply it to another rail too?
Rail rail = Block#getBlockData()
thanks!
Rail has getShape() and also getShapes (valid shapes that can apply) and a enum for all Shapes
java.lang.ClassCastException: class org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData cannot be cast to class org.bukkit.block.data.Rail (org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData and org.bukkit.block.data.Rail are in unnamed module of loader java.net.URLClassLoader @759ebb3d)
It's not possible to cast a powered rail to a rail
why?
you could try RedstoneRail as well
buttttt the BlockData says it can O.o
they still have a shape O.o
they just have not all shapes available ^^ but still have a shape
holy shit finally
That's a lot of nested method calls
Or just like a proper readable algorithm lol
nice
So you actually did it, nice
um
alr
public class HealthEvent implements Listener {
@EventHandler
public void OnBossDamage(EntityDamageEvent e){
Entity boss = e.getEntity();
if(boss instanceof WitherSkeleton witherSkeleton){
if(witherSkeleton.getScoreboardTags().contains("a")){
witherSkeleton.setCustomName(ChatColor.BLUE + "" + ChatColor.BOLD + "Ancient Wither Skeleton" + ChatColor.WHITE + "| " + ChatColor.RED +"❤ " + Math.round(witherSkeleton.getHealth()));
}
}else if(boss instanceof Zombie zombie){
if(zombie.getScoreboardTags().contains("b")){
zombie.setCustomName(ChatColor.DARK_RED + "" + ChatColor.BOLD + "Reaper Zombie" + ChatColor.WHITE + "| " + ChatColor.RED +"❤ " + Math.round(zombie.getHealth()));
}
} else if (boss instanceof Ravager ravager) {
if(ravager.getScoreboardTags().contains("c")){
ravager.setCustomName(ChatColor.RED+ "" + ChatColor.BOLD + "Chaos Ravager" + ChatColor.WHITE + "| " + ChatColor.RED +"❤ " + Math.round(ravager.getHealth()));
}
}else if(boss instanceof Spider spider){
if(spider.getScoreboardTags().contains("d")){
spider.setCustomName(ChatColor.LIGHT_PURPLE + "" + ChatColor.BOLD + "Exotic Spider" + ChatColor.WHITE + "| " + ChatColor.RED +"❤ " + Math.round(spider.getHealth()));
}
}else if(boss instanceof Husk husk){
if(husk.getScoreboardTags().contains("e")){
husk.setCustomName(ChatColor.DARK_PURPLE + "" + ChatColor.BOLD + "Feral Husk" + ChatColor.WHITE + "| " + ChatColor.RED +"❤ " + Math.round(husk.getHealth()));
}
}
``` its working till Ravager
idk why
the husk and spider does have the tag
Why are you using scoreboard tags instead of pdc
I understand that you have made datapacks before?))
nah
actually
i was trying to do smth with screoboard tags
and i had used them all diff classes
now its gona take ages to replace with pdc yk
but it should work with tags its working untilll ravager
If i have a data that i want to save in a db but that data updates like every second for each player is it smart to just temp save it in a var and update the data once the player disconects? or update it like very 10 seconds?
there seems to be a bug with blockdata Leaves
cache it and save every 15-60 min
Oak and Birch Leaves in particular thinks that it is waterlogged
alright
and on leave
mangrove works as usual though
.................
Guys! Why can't I create an inventory named like this: §1§9§2§3§7Menu
cache in what? a simple file or just variables?
bruh
map or ur favourite choice
just use one color code
alright thx ebic
thats not the format for hex codes
Not "bruh". I'm trying to make an identifier for inventory titles.
add §x to the start
I was about to reccomend components but then I remembered you need NMS for that
pr it
choco already did
do it better
You don't understand what I'm trying to do. I want to create an invisible identifier. It can be created for itemstacks, but I don't know, why I can't do the same for inventories.
we are waiting on bungeechat array remover being merged
because that isnt hex format
don't do that
identifying inventories by names is beyond dumb
you cant add an invis hex component without the right format
How to do that then?
instance of the view inventory
infact recently setTitle was added xD really shows you, you really shouldn't be identifying inventories by the title
instance of the inventory not the view
forgot
every inventory event provides you with an Inventory oyu can use
do you have the 7smile7 thread I'm on my laptop so can't send
heres an example
heres the spigot forum
^ this is how you really should be doing it. Obviously I wouldn't expect you to copy this 1 for 1, but its a good guide on what idea you should be using
But I am creating a menu of multiple inventories. How can I add an identifier, so that the plugin knows, that those are a part of a specific menu?
instance of the inv
pagination is fun. Read the thread epic posted its really easy to go about it
remember Inventories override hashCode so Hashmaps will be useful here
you can see how i handle my invs here, it uses the same principle of the spigot forum but no class just for buttons
alternatively https://github.com/Y2Kwastaken/Suketto/tree/master/bukkit-core/src/main/java/sh/miles/suketto/bukkit/menu something like this also works it has the same fundamental idea
suketto on deez nutz
helper on deez nuts?
static SlotHolder<SukettoContainer> of(@NotNull final SukettoContainer container) {
return new ContainerSlotHolder(container);
}
``` :3 I love this method doens't it look great
I still haven't updated my lib to 1.20.2
too compilcated
I should really script this
6/10
i wanna write an nms wrapper
that can function of mojmaps or obsfucated and uses reflections/method handles
imho my container system is ever so slightly better than spigots though its still a pain I might try to attack it with a diff angle in the nera future
eg NMSWrapper.getClass("net.minecraft.server.world.entity.player.EntityPlayer").getVariable("connection")
idk if that package is write
e.g. right now I'm opening the menu before changing anything when really that should be done after
get variable would probably need some form of name cache for across versions and a return type param
🤔 you'd have to download the map file or sometihng
are PDCs accessible through the data command? curious if I could set custom PDC data without needing a plugin
yeah
really this should be done at a compile time in a maven and gradle plugin
you can but its painful
could do that
I'm a fan of pain /s
idk what the legality of that is though
Looks good, thanks for the help!
its definitely the best approach
if you do it at runtime you'd need to load the mappings into memory or you're slowing your nms calls down by having to run them asynchronously (again this doesn't mean on another thread)
would mojank or spigot appreciate me putting mappings on central
💀 nah bruh
mojang lawyers might, they might be boared
give them something interesting to do
"hey boss this guy put all the mappings on maven central, what do we do"
"take it down"
epic did you know that Player#openEnchating doesn't work if no location is provided
I did :P
enchanting tables are so wack
its probably for the xp
like the menu won't work unless the block is in the world but like you could totally just ignore that and create the menu anyways and it works fine
there is a check to see if its placed in the world, but you can legit just ignore it and force create the menu anyways
new EnchantmentMenu(i, playerinventory, ContainerLevelAccess.create(player.level(), pos))
, ServerAdapter.toMinecraftChat(super.getTitle())```
expand the height map at 0, 0 and spawn one there
providing container access doesn't actually create any block in the world
@river oracle godgo dead bro
?
what in the fuck does that mean
also another fun fact its deprecated so prolly will be removed eventually but every block has a method called getMenuProvider than can be implemented
nerd
that doesn't make any sense, it should just be implemented as needed not used accross every single block
Minecraft Stone Menu Confirmed 😱. I just right clicked stone! You won't believe what happens next
what is this uspposed to mean
I'm really curious
don't leave me hanging
Maybe they meant godot
is there any public image to particle converters
godot is dead
well that wouldn't make sense
😭 I feel like it might be bad for the server, so I don't think so
I godgo geddaway
I annaflah awayy
yea
yea
yea
I mean image to particle is pretty easy
bad, why?
lol bro meant gojo in my pfp
i just need to cut the demogorgons head into pieces to make a trap on the floor
Who? Unity?
That would be an interesting headline; Especially in their current situation.
why are you even spoiling it that's lame asf since anime isn't caught up yet. I know because I got fucking spoiled by youtube, but otherwise I'd be pissed rn
might be someting you need to make yourself couldn't find anything
alr
Everyone already knows this, who watches videos on YouTube
I could not resist)
How would I go about checking if an item frame itemstack is an invisible item frame? My current thought would just be to get nbt and check if {EntityTag:{Invisible:1b}} exists
Yeah it appears we don't have a meta type for that
@worldly ingot add it
I encountered a problem when I tried to create an annotation for registering a command. How get commandSize from args (not maxArgsSize)
no
lazy
yup
I haven't really messed with nbt too much previously, what would be the best way to check that?
iirc it's covered. Just can't remember what by
ooh ok
Oh boy weird name time
Trying to remember and find it
is that not covered by BlockStateMeta?
?jd-s
I think it is, yeah
It's not a block state
oh its an entity 💀 worse
It's covered by CraftMetaEntityTag but I don't know what the interface is for it
inb4 there is none
Hello, I wanted to know if there is an event to save if the player right clicks with an item in the main hand?
There might not be, actually
PlayerInteractEvent
Honestly Coll, perfect candidate for your virtual entities
Implementation is already there and done
entities the player can see but they dont actually exist on the server
so the player sends the packet to the player saying its there but it really isn't
iirc ^
interesttingg
Hmm so it's the exact same as spawn eggs
But without the entity type
Question is should it be split up into multiple metas for differnt entity types
💀 nah bro sounds like a horrible idea we would have like 10 billion meta types
there wouldn't be too many right? unless i am misunderstanding
you'd have like item frame and leash(?)
that makes sense
Lead does not have it, neither does boat
thought maybe leash knot might
makes sense
invisible boat would be pretty cool lol
I'm talking about items that make use of this tag
Unless there are some other special attributes idk I don't see a reason too
Well armor stand has differnt methods than itemframe
Sure the dev could cast but ehhh
wouldn't it be best off to have 1 parent type then children type with the other items if needed
Probably
e.g. ItemEntityMeta or whatever
then ItemFrameEntityMeta and ArmorStandEntityMeta etc etc or whatever it'd be called
Probably
Technically spawn egg meta could extend it too
Spawn eggs are special though because you can use entity type with them
I've always wanted to integrate a better inventory system into bucket but its so messy 😭 and virtual containers are well, awful
Which means yes, you can have a creeper spawn egg spawn a chicken
anyone know how to detect if a falling block hits an entity?
seems like a reminant of the good old days when that data mattered :P
Give it damage and then it should trigger an event
How would I do that
FallingBlock#setHurtEntities
hmmm
there's also setMaxDamage
Yeah then set it to hurt entities, set the damage, and then listen for the damage event and cancel it if it's not a player
Fish buckets (cod, pufferfish, salmon), item frames, glow item frames, and paintings
I'd imagine boats and armour stands are included as well but were just never updated
you;'re on the new wiki right :P
mhm
beast
They also don't show the option on mcstacker
Hmm painting also don't show it on the wiki
Seems to be
letting you know that doesn’t work for falling blocks
I’m compiling rn for the other thing tho
cod, salmon, pufferfish, tropical fish and axolotl buckets (not tadpole for some reason), armor stands, and both item frames
Will require some testing I guess
So should there be subclasses for the specific entity types?
Want to know the great part about tropical fish needing support? There are overlapping ItemMeta types again 🙃
I had to deal with that bullshit for the first time when adding ArmorMeta
Is the a way to have pistons move unmovable blocks?
I’m sure there is with the API, but I have no idea how
I did it with ASM
kek
What is ASM?
ASM is an all purpose Java bytecode manipulation and analysis framework. It can be used to modify existing classes or to dynamically generate classes, directly in binary form.
Oh lovely LOL. I’ll need to modify the class of a block?
Whomst dared to mention ASM?
Coll is what you're working on a pr for spigot or a separate lib?
You've summoned the geolykt
what does it do
Oh apparently nothing of note. I sleep.
night night geol
Lets pistons push any block
hey coll
Location loc = player.getLocation();
FallingBlock block = player.getWorld().spawnFallingBlock(loc, Material.GRASS, (byte) 0);
block.setHurtEntities(true);
block.setVelocity(player.getLocation().getDirection().multiply(2.0D));
}```
illegal
Why would you even need ASM there?
How else you gonna do it
Oh, you are retransforming classes. That is cursed.
hehehe
doesn’t that break like a lot of stuff
how i can get the block lokking of player?
Might break other plugins that mess with those specific NMS classes
ray trace
player.getBlockExact
nope i mean like piston machines and stuff
i thought that it would mess with that
You are aware of https://bugs.openjdk.org/browse/JDK-8306275, right? So does it break on J21 or not?
It has a config for that
No idea
"Issue warnings when agents are loaded dynamically into a running JVM."
Probably not yet
here is my code
.
Ah you are using bytebuddy, in that case it would still work as long as you keep it updated.
But smh, not using raw ASM.
Albeit that would be equally cursed
and injecting the transformers
The transformation itself is raw ASM
Yeah I know
I find it interesting that most people add a wrapper around the ClassVisitor/ClassNode schema. What is the point in that?
There’s no other way to move a piston LOL?
Location loc = player.getLocation();
FallingBlock block = player.getWorld().spawnFallingBlock(loc, Material.GRASS, (byte) 0);
block.setHurtEntities(true);
block.setVelocity(player.getLocation().getDirection().multiply(2.0D));
}```
Not in a way that would be good for performance
the falling block still dont hurt entitys
Fantastic
I wouldn't use setHurtEntities generally
what would you use?
Manual proximity checks and more explicit damage handling (in order to not cause overly generic events)
is there a simple way to see if a server version is greater than 1.16? (without NMS)
However uh, that is the code that I've been inherited and it is very old code as it stems from pre-1.12 times
If you know some class that was added in 1.16 - just fetch that class via reflection and check wether that works
ummm... how would I do that...
as you can tell by my leaf, i am new as heck to this stuff
Anyone know a gradle plugin to code smth using mappings and then deobuscate smth once it’s compiled
yea I don't know any classes that are 1.16 and above specific, was just trying to implement hex colour code support if they used 1.16+
The most obvious choice would be to go with a newly added material but that wouldn't actually be great.
for nms?
(Adventure)
Hello, does replaceText invocation affects hoverEvents & other stuff, or its just text?:
message.replaceText(b -> b
.matchLiteral(entry.getKey())
.replacement(entry.getValue()));

No, the thing I’m working on requires me to obfuscate the jar but I am tryna code without the obfuscated jar
do you hav emappings
i would be using proguard mappings
paperweight
I'd assume it is the former
hey geol how would i do those proximity checks? and damage handling?
uh i cant seem to find anything
it probably exists just i cant findit
Should I just skid paperweight and make my own
sorry
Dear god CraftMetaSpawnEgg is an abomination
I personally do https://github.com/Geolykt/EnchantmentsPlus/blob/4xx/src/main/java/de/geolykt/enchantments_plus/enchantments/Anthropomorphism.java#L120-L145 but as I said that is ancient code
if you dont have a deadline yeah you probably would want to make ur own
I don’t have a deadline, also any idea if u can publish private gradle plugins to jfrog
I’ve never made a gradle plugin before
isnt jfrog dead and you can publish it anywhere aslong as you give gradle the repo
Wdym dead
Idk my team still uses it
No. Unless you are absolutely sure that you want to enter the realm of gradle. It is rumoured that everyone that hasn't turned back was never seen again
Must be smth else
jfrog shouldn't be used regardless
What? I’d much rather use gradle then proguard
Why
it should work with artifactory
You'd generally want to roll your own repository for private stuff
Gradle is .... let's say it is unique.
It is, it’s a private artifacory is it not
Especially gradle plugins tend to be a bit strange in layout that chances are jfrog may block your upload. You are better off going to the gradle plugin center if a private repo isn't viable
Uh we publish the ver to jfrog every time we compile so idk
With a new ver patch obv
If you know that you can publish gradle plugins to jfrog then great. Otherwise I cannot guarantee anything
Is there a way to convert custom "&" for color into ChatColor.Enum?
Because there is bug when you use bungee components and colors via the char. It happens that apply the color to some lines of the whole component
Yeah because you shouldn't be mixing legacy text with components
perfect, what about this?
public static BaseComponent[] createCustomComponent(String input) {
Pattern pattern = Pattern.compile("&[0-9a-fk-or]");
Matcher matcher = pattern.matcher(input);
List<BaseComponent> components = new ArrayList<>();
int previousEnd = 0;
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
if (start > previousEnd) {
String plainText = input.substring(previousEnd, start);
components.add(new TextComponent(plainText));
}
ChatColor color = ChatColor.getByChar(matcher.group().charAt(1));
if (color != null) {
TextComponent textComponent = new TextComponent(input.substring(start, end));
textComponent.setColor(color);
components.add(textComponent);
}
previousEnd = end;
}
if (previousEnd < input.length()) {
String remainingText = input.substring(previousEnd);
components.add(new TextComponent(remainingText));
}
return components.toArray(new BaseComponent[0]);
}
You can use a method to turn legacy text into a component
And then append it to your components
isnt that?
It's better that what you're doing
how? But that will broke, because you mixin componentes with legacy text, what said the staff not doing
Not sure how it was called
It won't, it'll make the hierarchy like you're supposed to
From the legacy text
What i thought was, the only way color works great is via TextComponent#color() so i said, well i can just create a parser from &<color> obtaining its ChatColor object, to finally apply to the component
What you think choco? I see you typing too much and im really anxious haha
Just as a general note, please avoid arrays for components. It can be represented as a single component.
public static BaseComponent createCustomComponent(String input) {
Pattern pattern = Pattern.compile("&[0-9a-fk-or]");
Matcher matcher = pattern.matcher(input);
ComponentBuilder builder = new ComponentBuilder();
int previousEnd = 0;
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
if (start > previousEnd) {
String plainText = input.substring(previousEnd, start);
builder.append(plainText);
}
ChatColor color = ChatColor.getByChar(matcher.group().charAt(1));
if (color != null) {
builder.append(input.substring(start, end)).color(color);
}
previousEnd = end;
}
if (previousEnd < input.length()) {
String remainingText = input.substring(previousEnd);
builder.append(remainingText);
}
return component.build(); // You can use #create() if you REALLY need a BaseComponent[]
}```
Really not much reason to not use a ComponentBuilder here
hi chocus
I don't know if your logic is sound by the way. I just converted it to use a ComponentBuilder lol
I don't have my pc on hand to look 😦
yeah i havent try it, i will have to try it hehe. I dont think it would be fixed to componen ts but idk
oh rgiht, no problem man. Just tag me if you found it or remover it. Thanks you too
But i am 100% sure there is a from legacy to component somewhere in there
Just search the md components for it
There is a Component#fromLegacyText() is what you mean?
But that brokes too if im not wrong
It shouldn't i think
Thats what causing color being apply to some lines and the others get without the color
It actuslly parses the legacy text
And i'm pretty sure it supports bold and underline
Weird
It shouldn't cause issues
I mean yeah if you're insistent on using legacy colour codes that's the method you should be using
But if you're using components you should ditch the notion of legacy format codes entirely
components 
yeah the problem comes when using config files, you wont be creating components for them
And also you have to make huge configurations for configuring component messages
If you want to use BungeeChat still there's MineDown as a library you can use for parsing, or if you want to use Adventure then there's MiniMessage
yeah but thats a huge library, has thousens of classes
ChocoMessage when??
what do you need components for
from configuration messages? just use MineDown its relatively small, provides nice BaseComponent[] (and I add an extra step and reduce the array into a BaseComponent)
Being able to apply legacy color coudes, without getting them bug
Yeah, legacy text is still pretty cool
MineDown is perfect for this. If you don't want the array too you can always reduce it into a single component
It's only 5 classes
yeah only for that. Because if i dont want them to configure just use Component with color already set up, but what if you want to configurable? So there you have to do many and huge configurations
Right really thanks to all i will try it
Minedown does sound pretty cool
But i think bungeechat would be cool if it had some way to parse legacy chat for clickable/hoverable
Yeah my goal is to make a fully and simple library working for both platform 😂
I'm going to figure something out. Whether it's getting MineDown directly integrated into BungeeChat or adopting MiniMessage's language syntax
I want something easy
I feel like choco would say, "you can always contribute"
Paper will inevitably remove BungeeChat. They despise it
It's been deprecated for a long while now, it will go
Choco if i design a simple and functional components system for spigot would be apply as contribution? How about the probability
oh you doing one better really nice
I'm not gonna support another component system
finally I won't have to manually turn BaseComponent[] into BaseComponent 🙏
totally agree}
Yeah I made sure to drop array syntax because it was never really necessary, just conflated with existing API is all
yeah java, is a broken fucking lang. Just changing 1 line can broke something
are bungee components mutable or immutable
I've never looked
what means mutable?
https://paste.md-5.net/umifufequd.diff full API patch I have ready by the way
I feel like they should not be mutable
I dont understand the sense of mutability with texts?
Hello, I created a Post thats intention is to Provide Learning Resources to Beggining with Developing a Minecraft Java/Bedrock Anti-Cheat
https://gist.github.com/Snowiiii/2c306f3e8926bc7fb8acaaa8c3c105d7
So?
Such a really nice note, would love to keep it pin
thanks ❤️
I like the introduction where you explain really well about the packets, thats really interesting topic to make about it
I would love to find such a great information fully related to working witth Packets, because we most of here dont really have the best or been friends of packets to use them correctly
Ye, I saw there where really not much resources about Macking an Anti-Cheat or something like that most of the knowledge just comes over time
That's an advanced topic
Yeah, only 10% of developers known about making them correctly. What do you think ppl in general?
Don't expect any tutorials
Let discuss about the topic
You'll learn over time how the game works internally and then you can work from there
no not even 10%
more like 1% if even that
Yeah i think understanding the base is the most important thing, but im really stucked around how mojang process the packets with Netty
Because they just use them raw, they dont even use Protobuf so you deal a lot understand fucking data types
ye NMS is really ugly, But many Packet Librarys makes your Life alot eaiser
Yeah, but doest make sense just using a library and thats done
Because if you know how packets works internally, you know to came with solutions
well issue with packet libs is that things become slower
package com.example.linkeddamage;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class LinkedDamagePlugin extends JavaPlugin implements Listener {
private Map<Player, Player> linkedPlayers = new HashMap<>();
@Override
public void onEnable() {
Bukkit.getServer().getPluginManager().registerEvents(this, this);
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player joiningPlayer = event.getPlayer();
Player randomPlayer = getRandomPlayer();
if (randomPlayer != null) {
linkedPlayers.put(joiningPlayer, randomPlayer);
event.getPlayer().sendMessage("You are linked with " + randomPlayer.getName() + ".");
}
}
@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (event.getEntity() instanceof Player) {
Player damagedPlayer = (Player) event.getEntity();
if (linkedPlayers.containsKey(damagedPlayer)) {
Player linkedPlayer = linkedPlayers.get(damagedPlayer);
double damage = event.getDamage();
double linkedDamage = damage * 0.3;
// Inflict 30% of the damage on the linked player
linkedPlayer.damage(linkedDamage);
?paste
if you use netty its irrefutably gonna be faster
PLease!!
linkedPlayer.sendMessage("You received " + linkedDamage + " damage from " + damagedPlayer.getName() + ".");
}
}
}
// Helper method to get a random player on the server
private Player getRandomPlayer() {
Player[] onlinePlayers = Bukkit.getOnlinePlayers().toArray(new Player[0]);
if (onlinePlayers.length > 0) {
int randomIndex = new Random().nextInt(onlinePlayers.length);
return onlinePlayers[randomIndex];
}
return null;
}
}
👍
please, we already told you to use pastebin
can someone tell me how to put that in my server
Yeah, but start you trying to decode what the heck means varInt and those shits they use
?paste
varInt isnt hard
underestanding the netty design can be
?, Use Plugins
how
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/
na, i understand how Buffers fully work. But not the shits that minecraft has, i havent seen such a bad protocol like Mc
Thats for fure bro
i mean
there are a lot of shitty protocols that still are used today
mc isnt that bad compared to some of them
what is ppl ?
People
people
i just use weird conventions that ppl here uses hahaha
I guess its true that like only 1% of Developers are really Heavily into Packets, especially into Anti-Cheats, Thats the Reason there are not many Realy Good Anti-Cheat, I Mean at this Point the Most is just scam Intave, Matrix, Artermis and more costs hundreds of Dollars but are not that Good
The Reason is that there is not an Big competition
I could make a better anti cheat
doubt
In fact i'll just make something for aimbot and post it
even if u are competent it demands a lot of time
There is a lot more competitions than with other kinds of plugins
A really nice example of shity and scam anticheats is called Verus, cost over 120 usd they license for using and doesnt even give exact positives about the "lagging cheat"
Multi-currency economy implementations are few are far spread out for example.
yes this thing exists too, At this point i would not called it a Anti-Cheat anymore
yes
Do you know Spartan Anti-Cheat ?
for u to understand and be able to write anti cheats properly u need to be proficient in nms packet protocol, nms physics, netty and what not
idk
jfc remind me to finish my Economy service API
i just know a lot of mediocre servers use essentials as an impl against vault
In my case what doesnt help me is the shity and shity Mojang data types, why fuck they dont use plain Buffers without adding shity encoding
If you want to commit that to spigot you are a madlad
I do! 🙂
Vault by itself is a monolithic currency API.
bro
madlad? is that russian?
It better support async
api without impl
No, it's florida man
and quite poor
Yeah, but as the API does not support multi-currency the impls generally don't either
mojang has done a nice job to map out primitive datatypes to more data oriented ones
💀
And you can even bypass it
idk, i wouldnt dare to touch vault
I was writing with the Developer of Spartan and asked him why the Anti-Cheat is Bukkit Events based and if he planning a Packet Rewrite, He told that he never had Problems using Bukkit Events and That if he would make a New Anti-Cheat he would use Packets but at the current State he would must be Rewrite everthing. So hes basicly to Laziy to Rewrite the Premium Plugin which many People use, I don't understand how this Anti-Cheat is so Popular
Great!
it looks like a java 6 api
So what is the issue?
I have a project that is actually compiled with Java 6 - eventually I want to move to Java 5.
and already there I decided to not touch it
the api developer who founded it must have been quite inexperienced when he started it
idk maybe its better now
Oh my god - you are one of the people to think that JIT optimizes short-lived objects.
how much you think hypyxel anti cheat costs? any idea here i really interested on its price idk why
oh its expensive
Java is not precise for working with numbers
Only for very high values (read: Multiple billions)
depends but yea
