#help-development
1 messages · Page 1178 of 1
As I said earlier some people in services would probably do it for very cheap or even free
Well, a lot of people use AI today to fix it, even if they don't know about it :/
The problem is that I'm brazilian and it's kinda difficult to find people that could do that service for me (and if they did, it would not be cheap to me)
AI is horrible at coding
You shouldn't use AI to fix a problem you know nothing about good way to fuck things up
If you think so
He has experience
He’s also horrible at coding and the AI keeps making code that looks just like his
lol
What plugin and what needs to be fixed?
dw about it
i think i already know the problem
and its not the code lol
what sound you guys thinks is good for an alarm
alarm sound
yeah but no textutre pack
why not?
Well if it ends up being the code I can help ya out
Thanks for offering help 🥹
I will call you if i have another code problem!
A dm works if you don’t mind
So real
Maybe a bell sound
Bells are basically alarms
Or you could basically create your own sound with noteblocks
is my math not mathing or why isnt it a box but a rectangle(from the center)
it is a box
Because it’s probably centred on a block location
Which is in the corner of a block
You told it to be a 4x10x4 box and that’s what you got
yeah but off by 1 block from the center
yeah prob
yeah but it is a box wasnt very helpfull yk but still thanks
the white block is the first block top right
@young knoll Try out InventoryView builders or I'll ban you form spigotMC
Hi can someone help me with this error happening when i send packet to the player : ```java
ServerPlayerConnection connection = ((CraftPlayer) player).getHandle().connection;
connection.send(new ClientboundPlayerInfoUpdatePacket(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER, npc)); //(LINE 264)
connection.send(new ClientboundAddEntityPacket(npc, serverEntity));
1.21.1
Is your NPC a ServerPlayer?
If so
you need to set a dummy connection
.
well
its connection is null
so you need to set it to a dummy one
this
but honestly just use citizens lmao
so I have to instantiate a class every time I want to send a packet to the player?
which is why I promptly allowed this in my api:
var npc = Entity.create(Identifier.minecraft("entity/player"));
world.addEntity(npc);
npc.send(MessageTeleport.to(position));
teleportation to a world adds the entity to that world, but you can omit it to just set the position, you can also just add the entity to a single player and then it will only show for that player as long as you don't add it to the world*
They don't want to use APIs
they are using the spigot API
which is basically sitting at the same level as mine
true
but still they'd rather write their "own" code by copy pasting what we give them
Spoonfeed a newbie for a day and they'll come back with more questions. Teach them to find their own answers and you'll both be better off: you won't get stuck answering the easy questions and they'll be much more productive than before.
https://paste.md-5.net/qunanatezu.cs Ok so why does this code work 3 times and after that just stops doing anything besides debug printing
My code was simply written in previous version before the remapping NMS 
That wasn't entirely directed towards you
What exactly isn't working
yeah so basicly its I want to protect a certain area and it works arround 3 times (block the blocks from being placed) and after that I just stops blocking them even tho I place it on the same block as before
and location before and after messages are being sent?
?
You have location before and location after messages
in the code
are they being sent
yeah it was to check if it centers it correctly those still get send
Is the "In protected area" message being sent
nope thats my problem
and it worked 3 times before it broke and thats every time
I don't think the issue is in the snippet you sent
There's a problem in one of the methods you're calling
are there map implementations that use arrays.hashcode for arrays?
fastutils can be tweaked for that
whats that?
but if you are on paper, the api exposes those
okay, thank you :)
final Map<int[], String> map = new Object2ObjectOpenCustomHashMap<>(new Hash.Strategy<>() {
@Override
public int hashCode(final int[] o) {
return Arrays.hashCode(o);
}
@Override
public boolean equals(final int[] a, final int[] b) {
return Arrays.equals(a, b);
}
});
would be an example usage
but then why is it running the method like it goes all the way down to the bounding box check like as stupid as it sounds does it ratelimit me somehow
or just use an array wrapper that properly implements the methods :run:
you mean highmemoryusageutil
Memory is cheap
it would be really funny, like REALLY funny, if it was purposely slower
I get charged per byte
Well but you are the exception
true
@chrome beacon ? since like its the bound box thats being checked thats wrong not the actually execute no?
Why did bro ping oliver
They were probably trying to ping me kekw
His fault for having a name starting with O
yeah mb
if Crops is deprecated in favour of BlockData, how do we get crop growth status?
@EventHandler
public void onBlockGrow(BlockGrowEvent event) {
Ageable blockAge = (Ageable) event.getBlock().getBlockData();
if(event.getBlock().getType() == Material.WHEAT) {
blockAge.getAge();
}
}```
Ty
uhh
you really should do the check before casting
if it isn't ageable like stone or whatever it'll blow up
my bad
I've been distracted trying to figure out how to get the damn age of the blocks without Crops, I didn't think about that.
Will it then be an instance of TNT?
Can you tell that I haven't touched the spigot api in a long time and want to do things propperly :p
did you register it
yes
@EventHandler?
yes
show ur code
I'm capturing player chat events though
the block will be a Block, not a BlockType
question why not broadcastmessage?
Never makes it that far.
Forgot about that, fixed that too
When I use .getMaxAge() I get interesting results. Same with getAge()
When I bonemeal a wheat block, it says 3 / 5 at it's max growth. But F3 shows 7.
Is this allowed in my plugin?
PluginDescriptionFile descFile = plugin.getDescription();
boolean nameMatches = EXPECTED_NAME.equals(descFile.getName());
boolean authorMatches = descFile.getAuthors().contains(EXPECTED_AUTHOR);
boolean descriptionMatches = EXPECTED_DESCRIPTION.equals(descFile.getDescription());
if (!nameMatches || !authorMatches || !descriptionMatches) {
logMessage("§c[SGReborn] Plugin.yml verification failed!");
disablePlugin(plugin);
return false;
}
return true;
}```
Essentially I want to be sure nobody modifies the plugin.yml of my plugin
weird
when I try and get the block age, I can, but it's never accurate
It's like the events fire too fast
Apparently others have run into this
Yea, blockAge doesn't seem to work?
Uhh sure
But who cares if the name and authors are changed
i mean if they want to modify it, they can just remove that from the code
I mean that's true. But I'll use some obfuscation that's compliant with spigotmc rules
I'll open src all my projects anyway
So you're probably right
Mmm yes obfuscating open source projects
gonna go obsfucate jishlib
public class CropGrowthListener implements Listener {
@EventHandler(priority=EventPriority.HIGHEST)
public void onBlockGrow(BlockGrowEvent event) {
if(event.getBlock().getType() == Material.WHEAT) {
Ageable blockAge = (Ageable) event.getBlock().getBlockData();
Bukkit.broadcastMessage(blockAge.toString());
if(blockAge.getAge() == 7) {
Bukkit.broadcastMessage("block is fully grown, breaking");
event.getBlock().breakNaturally();
}
}
}
}```
Unless you are writing commercial code don't bother with any protections or obfuscation.
It never sees the block at it's full age.
commercial code? wdym?
You are using teh Blockj so you are looking at teh OLD age
declaration: package: org.bukkit.event.block, class: BlockGrowEvent
You need to check the NewState
Code you are selling so need to perform some level of protection
As soon as you said the Blockj thing, I updated it to use getNewState()
🙃
Ty
One more question. Am I allowed to send user information about his server to me when he first installs the plugin for example? (If it's a premium resource) as a piracy counter-measure.
.addField("User: ", "https://spigotmc.org/members/" + ServerUtils.userID, true)
.addField("Unique Download Link:", ServerUtils.uniqueDLID, true)
.addField("Server IP: ", ServerUtils.getIPAddress(), true)
.addField("Server HWID:", ServerUtils.getHardwareId(), true)
.addField("Server Hostname:", ServerUtils.getHostName(), true)
.addField("Minecraft Version/Java Version:", ServerUtils.getMinecraftVersion() + "/" + ServerUtils.getJavaVersion(), true)
.addField("CurrentPlugins:", ServerUtils.getActivePluginsAsString(), true)
.addField("Server Operators:", ServerUtils.getServerOperators(), true));```
For example here
Or is that breach of ToS?
Just so I know
I'll break it in a couple seconds if you want
just to show you how futile it is
and the futile struggles make it all that more satisfying to beat 
you technically could, but also you need to ensure that the plugin works when not connected to the internet (with exception of libraries feature)
so your fail safe would need to be the plugin booting as normal
Point is people you don't directly know that when installing the plugin. I mean obviously it's easy to crack it. I was thinking of adding bytecode hash protection so I generate unique hash for an entire class and then if it's modified it doesn't load
But that doesn't work well with obfuscations
I've tried
yeah I mean even if you add bytecode hash protect can just mixin to your classloader
idk what plugin ur trying to project here, but its probably not worth it
or whatever protecting you use
Yeah gl getting the hash right, because whatever you change inside the class will result in a different hash lol
But I gave up from that system anyways
It's too much work to perfect it
but for not much gain
no matter the system you implement its probably not worth it 😉
you can use the actual productive counter measure of only offering support to those who have purchased your plugin, there are plenty of ways to do this.
want support? Buy the plugin
want to pirate? Don't expect support
You think that'd be more beneficial than licensing system?
Hello everyone do you know where can i sell my services ?
Or going into anti piracy measures
Well, the people that wanna pirate will pirate, the people that wanna support you will
^^
The amount of people you'll manage to "convince" into buying something because you invest ttime into anti piracy matters is probably not that large
given they'll already be downloading the pirated jar from some scuffed forum
so there just need to be one guy that does the (somewhat) easy task of disabling whatever measure you dream up on
is it possible for a spigot player to get the number of players online for another spigot server that is under the same bungeecord?
hey guys, what is best: make docker download the files i want or have it already on the image?
depends on the files
i want to create an image that contains the jre (ik there is images that already do that, but i want to play a bit). rn i am downloading the .tar.gz
The image should contain the jre yes
makes sense
The only files you generally don't wanna include in an image are those that are data or are so large/dynamic it doesn't make sense
what do i put as my subchannel
E.g. a Minecraft world or a llm model
my goal is to create a minecraft server image. I want the user to be able to specify which version he wants to use, so in that case it would be better to download at runtime, right?
why so, just download the right jre depending on the minecraft version
maybe give the option to download the full JDK too, since some plugins do expect the full thing to be there (even though, they shouldn't but shrug)
hey so I just updated my spigot build and my listeners broke
the listeners were to make the custom items immovable, and everything else works as intended, but everything related to the custom item listener isnt working, but the listeners from everything else in separate plugins are working fine, what did i do wrong here?
is it possible to spawn a snowball projectile and then change its texture to something like with customModelData?
including net.minecraft solutions
Yes. ThrowableProjectile has a #setItem() method that accepts an ItemStack, which can hold custom model data
(and snowballs are throwable projectiles)
There were some somewhat recent changes to dropping items? I guess it depends on what your listeners are doing
why wont it print out online players even tho im on?
im trying to get it to print out every couple of secs the players that are online in that specific world
okay show how you are sending the message
i have no idea what that means
how do i send the msg?
show where you send the plugin message
well this part is reached but i dont know if its sending the plugin messege
okay so add a message to the listener
maybe, sounds crazy
add it before your if statement
see if its recieveing anything, if it is what
not only that but the part that stops it from going into containers also doesnt work? can you send the spigot patch notes if there is any? also heres the listener for context
why cant i paste in screenshots?
@EventHandler
public void onPlayerDropAbilityItem(PlayerDropItemEvent event) {
if (AbilityItems.isImmovable(event.getItemDrop().getItemStack())) {
event.setCancelled(true);
}
}
@EventHandler
public void onInventoryClickAbilityItem(InventoryClickEvent event) {
if (event.getClickedInventory() instanceof PlayerInventory) {
ItemStack clickedItem = event.getCurrentItem();
if (clickedItem != null && AbilityItems.isImmovable(clickedItem)) {
if (event.getClick() == ClickType.SHIFT_LEFT ||
event.getClick() == ClickType.SHIFT_RIGHT ||
event.getClick() == ClickType.DOUBLE_CLICK ||
event.getClick() == ClickType.NUMBER_KEY ||
event.getClick() == ClickType.SWAP_OFFHAND) {
event.setCancelled(true);
}
if (event.getAction() == InventoryAction.MOVE_TO_OTHER_INVENTORY ||
event.getAction() == InventoryAction.PICKUP_ALL ||
event.getAction() == InventoryAction.PICKUP_HALF ||
event.getAction() == InventoryAction.PICKUP_SOME ||
event.getAction() == InventoryAction.PICKUP_ONE ||
event.getAction() == InventoryAction.PLACE_ALL ||
event.getAction() == InventoryAction.PLACE_SOME ||
event.getAction() == InventoryAction.PLACE_ONE ||
event.getAction() == InventoryAction.SWAP_WITH_CURSOR) {
event.setCancelled(true);
}
if (isContainer(event.getClickedInventory().getType())) {
event.setCancelled(true);
}
}
}
}
@EventHandler
public void onPlayerSwapHandAbilityItem(PlayerSwapHandItemsEvent event) {
if (AbilityItems.isImmovable(Objects.requireNonNull(event.getOffHandItem()))) {
event.setCancelled(true);
}
}
@EventHandler
public void onInventoryDrag(InventoryDragEvent event) {
for (int slot : event.getRawSlots()) {
Inventory inventory = event.getView().getInventory(slot);
if (inventory != null && isContainer(inventory.getType())) {
event.setCancelled(true);
return;
}
}
}
@EventHandler
public void onHotkeyAbilityItemIntoContainers(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
if (event.getClick() == ClickType.NUMBER_KEY) {
ItemStack item = player.getInventory().getItem(event.getHotbarButton());
assert item != null;
if (AbilityItems.isImmovable(item)) {
event.setCancelled(true);
}
}
}
@EventHandler
public void onAbilityItemInHeldHand(PlayerItemHeldEvent event) {
int newSlot = event.getNewSlot();
ItemStack item = event.getPlayer().getInventory().getItem(newSlot);
assert item != null;
if (AbilityItems.isImmovable(item)) {
event.setCancelled(true);
}
}
private boolean isContainer(InventoryType type) {
return type == InventoryType.CHEST ||
type == InventoryType.HOPPER ||
type == InventoryType.BARREL ||
type == InventoryType.SHULKER_BOX ||
type == InventoryType.DISPENSER ||
type == InventoryType.DROPPER ||
type == InventoryType.FURNACE ||
type == InventoryType.BLAST_FURNACE ||
type == InventoryType.SMOKER;
}
whatever this works ig
i guess its not reaching here
perchance?
plugin messaging goes spigot -> bungee or vice versa
you need to forward the message from bungee
how can i do that
listen for it on bungee, figure out where to send it and there you go
i need to make a bungee plugin?
yeah
how to update the worlds in the server to the new version guys?
I have worlds in the server 1.19. I want to update to 1.21 but the worlds are not compatible. how to update the worlds to match the server version?
Can anyone help me please?
it seems a little counter intuitive to be checking if the player list is not empty only to then let ur supplier potentially return null
i see no reason to not just do Bukkit.getOnlinePlayers().get(0)
There's an iterables that has a get first method?
That's nice
I assume the null is the default value
If it's not empty then it'll never return
if the list is empty and you use get(0) it'll throw an IndexOutOfBoundsException, getFirst() will throw a NoSuchElementException if the list is empty
but if you stream the list you can use List#stream.findFirst().orElse(null) to make it return null (or some other default value) if the list is empty
but he does the check for that
there's at least 1 element, get first will work in this case
Makes no sense to make value null
i assume there's no way to get first without a default value?
please use enumsets instead of adding tons of conditions to an if
let me see
Well the first value dictates which channel to write to.
But i guess making the default null is fine though because the method only runs if there is players
Therefore the default should not be used
indeed
also, so sad that my plugins support 1.18+
this shows as a warning for beta to me
could you try registering a new channel with different name? (rather than BungeeCord), and try sending the message through it?
wait
i'm not sure why this first line is like this
shouldn't it be BungeeCord if you're using Bungeecord?
yes
No look up
just do this
out.writeUTF("PlayerCount");
out.writeUTF("pvp");
not really
if you are using bungeecord built-in channels, then you can use bungeecord, however you can pass anything you want there
Technically it can be anything but it should be bungeecord if you want bungee to handle it for you
And javier beat me to it
did you registered BungeeCord channel on your plugin?
nah, the output should be just
out.writeUTF("PlayerList");
out.writeUTF("pvp");
yep
but it seems like there is no output of "subchannel" when he tried to print
.
did he tried to print the subchannel without the check?
It’s okay
The problem is
That I don’t have a bungee plug-in
Or something like that
no
you don't need a bungee plugin for this
you dont need
@Override
public void onEnable() {
this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", this);
}
@Override
public void onDisable() {
//make sure to unregister the registered channels in case of a reload
this.getServer().getMessenger().unregisterOutgoingPluginChannel(this);
this.getServer().getMessenger().unregisterIncomingPluginChannel(this);
}
You have to get them both registered, both input and output message channels
https://www.spigotmc.org/wiki/bukkit-bungee-plugin-messaging-channel/ this is built in bungeecord
Look at this
then just write those messages:
out.writeUTF("PlayerCount");
out.writeUTF("pvp");
and wait for response that should look like this:
String server = in.readUTF(); // Name of server, as given in the arguments
int playercount = in.readInt();
and the subchannel should be PlayerCount
@timid berry yes, just do that and it'll be fine
and + make sure to have these two registered in your plugin
public final class OnlineCounter extends JavaPlugin implements Listener, PluginMessageListener {
@Override
public void onEnable() {
this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", this);
this.saveDefaultConfig();
// Plugin startup logic
System.out.println("DiscordBot-counter by Zarif enabled");
this.getServer().getPluginManager().registerEvents(this, this);
new BukkitRunnable() {
public void run() {
if(Bukkit.getOnlinePlayers().size() > 0) {
System.out.println("more then 1 online");
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("Zarifsigmachannel");
out.writeUTF("PlayerCount");
out.writeUTF("lobby");
Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
System.out.println(player.getName());
player.sendPluginMessage(OnlineCounter.this, "BungeeCord", out.toByteArray()); }
}
}.runTaskTimer(OnlineCounter.this, 0, 20);
}
@Override
public void onDisable() {
System.out.println("Goodbye! -Zarif");
}
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
ByteArrayDataInput in = ByteStreams.newDataInput(message);
String subchannel = in.readUTF();
System.out.println(subchannel + " " + channel );
if (!channel.equals("BungeeCord")) {
return;
}
if (subchannel.equals("Zarifsigmachannel")){
String server = in.readUTF(); // Name of server, as given in the arguments
int playercount = in.readInt();
System.out.println(playercount);
}
}
}
this is my full code
Zarifsigmachannel replace it with PlayerCount
move subchannel bellow the bungeecord channel
it is below?
you'll get an error if it's not a utf
subchannel should be below the !channel.equals BungeeCord
u mean inside that if statement?
no
System.out.println(subchannel + " " + channel );
if (!channel.equals("BungeeCord")) {
return;
}
String subchannel = in.readUTF();
like this
oh so just remove it?
String subchannel = in.readUTF();
dont call this before checking the channel equals to BungeeCord, if you do that, and another type of message is sent that doesn't have UTF in its first element, it throws an exception
just move it below
wait a sec
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
ByteArrayDataInput in = ByteStreams.newDataInput(message);
String subchannel = in.readUTF();
System.out.println(subchannel + " " + channel );
if (!channel.equals("BungeeCord")) {
return;
}
String server = in.readUTF(); // Name of server, as given in the arguments
int playercount = in.readInt();
System.out.println(playercount);
}
}
String subchannel = in.readUTF();
System.out.println(subchannel + " " + channel );
move these two, under channel.equals(BungeeCord) statement
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
ByteArrayDataInput in = ByteStreams.newDataInput(message);
if (!channel.equals("BungeeCord")) {
return;
}
String subchannel = in.readUTF();
System.out.println(subchannel + " " + channel );
if (subchannel.equals("PlayerCount")){
String server = in.readUTF(); // Name of server, as given in the arguments
int playercount = in.readInt();
System.out.println(playercount);
}
}
like this
nvm, you did it
public final class OnlineCounter extends JavaPlugin implements Listener, PluginMessageListener {
@Override
public void onEnable() {
this.getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
this.getServer().getMessenger().registerIncomingPluginChannel(this, "BungeeCord", this);
this.saveDefaultConfig();
// Plugin startup logic
System.out.println("DiscordBot-counter by Zarif enabled");
this.getServer().getPluginManager().registerEvents(this, this);
new BukkitRunnable() {
public void run() {
if(Bukkit.getOnlinePlayers().size() > 0) {
System.out.println("more then 1 online");
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeUTF("PlayerCount");
out.writeUTF("lobby");
Player player = Iterables.getFirst(Bukkit.getOnlinePlayers(), null);
System.out.println(player.getName());
player.sendPluginMessage(OnlineCounter.this, "BungeeCord", out.toByteArray()); }
}
}.runTaskTimer(OnlineCounter.this, 0, 20);
}
@Override
public void onDisable() {
System.out.println("Goodbye! -Zarif");
}
@Override
public void onPluginMessageReceived(String channel, Player player, byte[] message) {
ByteArrayDataInput in = ByteStreams.newDataInput(message);
if (!channel.equals("BungeeCord")) {
return;
}
String subchannel = in.readUTF();
System.out.println(subchannel + " " + channel );
if (subchannel.equals("PlayerCount")){
String server = in.readUTF(); // Name of server, as given in the arguments
int playercount = in.readInt();
System.out.println(playercount);
}
}
}
no problem
take care
there's one more improvement that i really like
@timid berry this looks a bit more clean
i think bukkit runnable has been superseeded since the introduction of functional programming
this looks a lot cleaner to me
Hey chat I got a question for you
if I edit an item in a player's inventory it will update right?
I'm not crazy
it requires a packet to update player inv :P so was just thinkin
I mean when I put worlds from lower version into Servers from higher version they usually crash the Server or some other problem that I don't know. I don't know how to say it but some chunks have display errors or something like that.
sorry if my english is not good. i am learning and will try harder to improve
oh, so use multiversecore plugin to fix this
Maaybe
I did some research and found --force update.
I'm not sure if it's okay to apply.
make backup, try that, see if it works
Anyone familiar with shading a plugin?
With this one, I get the unsupported Unsupported class file major version 65 error
Lower the java version
17 should work
Unsupported class file major version 61 That's the error
Where are you getting the error, on the server or when building
Update your shade plugin
What's the latest version?
3.6.0
That seems to have fixed the error
How do I know if I am shading the plugin in the right way?
A jar file is just a zip
So you can open it like one and see the files inside
You might need to rename it to get windows to detect it as such
Am I supposed to be looking for a class?
Yeah look for the classes
Ah, lame
I use an online decompiler 😭
just install 7zip 😦
https://imgur.com/a/gLmEDUa
I'm guessing this works?
I do have it installed, but, 
yeah but with 7zip you can modify the jar file
That’s like 4 extra buttons
^
If I just want to look at the contents I can do so in Intellij
I use winrar personally
7zip is faster so I use that
Windows's built in zip support is slow tho
maybe I just notice it since I have a shit pc lol
It's slow
jar xf be like
interesting, thought they were basically even
*could be considered worse than the searching
For plugins though it works good enough
unzip be like
is it allowed to upload a paper plugin to spigotmc, or do i need to change the code so that it's compatible?
It needs to be compatible with Spigot
ok thanks
too bad eza doesn't support piping non-existing paths, otherwise you could just do jar tf jar.jar | eza --icons --tree --sort=type -L5
there was a pr to support inspecting archives but it got nowhere it seems
jar tf lol
t is for table of contents, aka --list
it does sound funny though now that you mention it lol
do i need to use the meta of the item to access the PDC?
So you think it's just best to completely get rid of any way to do anti-piracy? Also is this system compliant with spigotmc rules? If someone can tell me since I'm not actively shutting down server. I'm just sending info to myself.
.addField("User: ", "https://spigotmc.org/members/" + ServerUtils.userID, true)
.addField("Unique Download Link:", ServerUtils.uniqueDLID, true)
.addField("Server IP: ", ServerUtils.getIPAddress(), true)
.addField("Server HWID:", ServerUtils.getHardwareId(), true)
.addField("Server Hostname:", ServerUtils.getHostName(), true)
.addField("Minecraft Version/Java Version:", ServerUtils.getMinecraftVersion() + "/" + ServerUtils.getJavaVersion(), true)
.addField("CurrentPlugins:", ServerUtils.getActivePluginsAsString(), true)
.addField("Server Operators:", ServerUtils.getServerOperators(), true));```
yep
Should be fine? Iirc you could also shut your plugin down just, if there is no internet or your webpage is down, the plugin needs to still work.
Tho to note, I don't moderate that forum not a forum staff lol
Yh idk about that g. I got banned because I had custom command through PlayerCommandPreprocessEvent that'd shut down if I wanted and if it was my UUID
so I removed that entirely
guys
Yes?
im newbie on plugins develop
Ahh so if there is no internet it's not allowed? Yh then I can't use this system
who can fix for me? (1 bug i think so easy with u)
actually I'll just surround it in try catch block
and make it execute even if it fails
Sure
?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!
can u check dm?
bruh-
nah bro
what
can u help me fix?
can you read what the bot said
@quaint mantle I don't do DMs, sorry.
- I can't see a bug. That squiggle could be a number of things, such as an unused import (though that's normally grey).
- I don't see how ImageIO is in any way related to Spigot.
ye, those are just warnings that you have unused import
oh
hover over it with cursor and you'll see what it tells you
tip: do that whenever you see a squigly line
So how is this related to Spigot?
i ...
sometimes ppl don't come here with spigot questions, its fine if this chat is dead I say
i join to server for find 1 person can help me
Fair. But he said Plugin Development.
OH-
How do you write enough code to have that many dependencies, yet not know what that squiggle means?
Do you know Java? Or is this copied?
🚓
thanks for advice bro;-;;
All good.
Bro is not even using chatgpt. He straight crimo ☠️
I recommend you trying to rewrite that code yourself instead just copying pasting if you want to learn. That's my advice
Or learn the language before an api
no, really i love when my university tries to push an ORACLE APEX as a solution
its shit really
probably they've got a good offer from oracle to advertise their products
He can learn some basics from rewriting imo. But yes you're right
I stopped recomending Oracle when they tried to copyright an API
The API is protected by copyright
not sure what you are on about
alternatives for PlayerArmorChangeEvent?
The contention it came down to was the naming of some api methods where it was too generic of a name
it is protected by copyright
just the generic method names are not
If you are that confident that it is indeed not at all protected, then lets see you copy it and freely distribute it?
By a 6-2 vote, the nation's highest court held that Google's copying of Oracle's Java API was fair use.
the naming
read the court docs
otherwise don't throw some news article at me
I actually followed that case
Try reading it instead of being rude
it came down to the names
court documents trumps what ever news article you read
news articles are not what define the case, the court documents out lines specifically what was at issue and what was not. And really it came down to naming conventions specifically the date utility methods.
anyways, Oracle owns the API and their rights over the api were not stripped
There were two questions put before teh court but they only chose to answer teh second (not the copyright part but fair use).
So my original statement stands "I stopped recomending Oracle when they tried to copyright an API"
right fair use means were you allowed to use it the way you were using it, not that the owner doesn't have copyright
Well thats debatable as the court refused to rule on copyright
fair use is not the same as copyright. Fair use has to do with copyright and whether or not your usage of copyrighted material was legal
Google and Microsoft argued that you should not be able to copyright an API, only the implementation
you can't have fair use without copyright
if there is no copyright over the thing in question, then there is no case over fair use because all usage would be allowed
what api are we talking about?
In other words, the Supreme Court didn't provide any guidance on whether an API can be copyrighted—the main question everyone expected the court to answer. Instead, the court ruled that even if APIs can be copyrighted, Google's copying was protected by fair use.
The copyright has yet to be answered by a court
Because of this the Federal law still applies until someone challenges it
that is how it works in the US
just because the supreme court ignored the question doesn't mean they lost copyright over it or that you are free to do whatever you want with it
Even going by your logic I still don;t see how my original stament is in anyway invalid
it is just the supreme court didn't address that topic and therefore whatever laws that govern such things still apply until supreme court gives an actual answer
That means, API's are copyrightable until supreme court says they are not
maybe in your country you can't copyright them, but in the US you can
The moment Oracle attempted to sue Google for copyright infringement of their (claimed) API copyright I stopped recommending Oracle.
holds copyright of work
attempts to protect copyright of owned work
mfw
If you are in the camp that an API can be copyright then you are correct. I'm in the other camp
I do not believe any API shoudl be under any copyright protections
Businesses especially those that have publically traded companies like Oracle have no choice but to defend their IP. If they don't they get sued by their investors for devaluing their stock by freely letting go of IP without first addressing it with the investors and all kinds of other stuff
you may not like that a business fights for their copyrights and other stuff but the majority don't really have a choice on the matter
unfortunately in the US, unless the copyright law is changed or the supreme court gives some kind of direct answer in regards to api's and copyright, they are copyrightable in the US.
Copyright really needs to be reworked honestly
I'm no lawyer but I think it's a bit bonk that companies can hold copyrights for 94-95 years
It does. Even Oracle lost on ALL 4 factors for fair use, the first being that it is unlikely to be copyrightable
what's the point of having an api if you're gonna copyright it?
exactly
Like the entire point of copyright is to reward advancement or good ideas, but they end up damaging stuff if they can be held for a very long time. Also copyrights on public software is so weird
Just use a license or something 💀
Blame Disney for the crazy length of Copyright
I know they're exactly who I'm kinda referring too
did you see what disney did with mikey?
Yes and it's lame as hell
they kinda let it expire, but they've modernized old mikey and basically they keep the copyright over it
They like split his IP the "old" and "new"
If I remember copyright was originally 10 years or somethign similary short
you have the right to license copyrighted material if you hold the copyright for said material
Yeah I mean that's a good length, considering the point of copyright
if copyight didn't apply to api's then why does every api have a license for its use?
just use an api key to license it no?
Just because you slap a label on it doesn;t mean its true or legal
even bukkit/spigot has a license for the api and even paper
Then why do businesses bother having a license for their api if you claim its not legal? Why does Oracle still have a license for their's?
because they are hoping
I've yet to see a court order upholding a copyright on an API. But I havn't looked
it depends on the license in question and what it says
if i put a new frame on a painting it won't break on copyright no?
going against the license is copyright infringement
some people even modify the painting as long as it's the original it's fine no?
That is why peopel argue against API copyright, because when you distribute your compiled code it includes a part of the API
Modifications belong to the copyright holder
the only way a modification does not is if said modification could stand on its own
if i mention a famous modern painting is it part of copyright?
well no, speech is not the same thing
it can be, depending on circumstances
I saw someone get sued for copyright when they use a picture of a building as a background when they were talkijng about the building in a news report
The building wasn;t copyright btu that specific image was. It didn;t even qualify for fair use
hmm
now, if you were wanting to talk about said picture
you would be allowed to show said picture to those you were talking to
that is called fair use
yep
this is what i think too, an api is a mention
also one of the major factors in infringment is whether or not were you making any monetary value off of it as well
unless you compile it into your own project 🤔
some1 help me compile a plugin?
but if we're speaking about http get/post it should be fine no?
alright, what are you struggling with?
http is a standard
ik it's a protocol
A protocol with trust issues😂
the writing for the standard is protected by copyright, not the thing it conveys
indeed, it needs to be more (s)ecure and it'll be fine
this is where you start getting into patents
however unlike copyright, patents are very short lived and once they expire you can't renew them
patents are a nightmarte. SO corrupt
I really don't like patents, mainly because the Patent office in the US tends to not do any research to see if a patent already exists as well as ignores some obvious rules in regards to what can and can't be patented
I would much rather have patent laws reworked and changed as opposed to copyright
for example, software can meet the requirements to be patented and I don't believe software should be patentable
afaik you need to do the research yourself and more precise, you have to hire lawyers to do it for you
at all
except the US patent office has the database
and can do the searching if not better, where as they let you search their database
but isn't the patent library public?
but it seems dumb that you pay an a large fee for them to tell you did you look in our database
yes but my point is, its their database
they could have searched considering they are paid
they are government employees
its not like its some private business that manages the database and forces you to pay them money to apply for a patent and then they decide whether or not you can have one. Since they have to decide if you meet the criterias you would think part of the decision making process is if there was a duplicate patent
unless they use some sort of ai
sure they can, its why it can take a few years to actually get a patent
unless you are Nintendo
lol
i'm happy that nintendo didn't try to take palword for all they have in court for the bs patent
Their "patent" is SO broad it covers way too many possibilities.
the patents are for throwing some thing and catching something and another is for flying on a mount?
lol
how did they even get that approved
also in record time and AFTER palworld released
they really want to corner the market for themselves
because the Patent office in the US is stupid and doesn't actually do their job
no ball throwing game for you or me
they do verifications on random no name's when it comes to patents and approve for big brands and companies without even looking
Me OMW to patent plumbers
you can't tell me google waits 3 years for a patent to apply in order to sell the idea
what if I patented maths
its why you will commonly see patent pending on some things
with a patent number still listed
I particularly like the number 7, gonna patent it
has to be something unique tho
technically you could copy or make a similar product, but only until the patent is approved
sine waves
then you would have to stop making such things XD
but you know what to expect at sin (3.14159/2)
personally I wish patents would go away
The sun woudl stop sunning
because I have yet to see any data or research actually prove its beneficial to competition and research
just like my brain stops braining when it comes to math
well, it's atleast a decent way to protect your invention
you don't want your business to die because some asshole did the same thing as your with -200% quality and +500% advertizements
its called competition for a reason
you have to constantly develop and make stuff not ildly sit by because you made something
competition is not always the most important thing
it is
without it, you have no innovation
patents stop competition sometimes completely due to the penalties of just even slightly encrouching on someones patent lmao
Well, this is kind of a two sided sword iykwim
not really because I have yet to see any patent cause innovation
I have not once seen, heard, found anything where a business saw a patent and said I am going to compete with that. If there is a patent on something businesses don't go near it
Without patents, you'll have a lot of people doing the same thing, theoretically reducing innovation, but maybe people will try to be better than others so more people buy their product, so they innovate
With patens, people can't do the same thing, so they'll try doing it better and more different initially, which is also causing innovative
This is theory
right, but the there is already research and data that proves patents being harmful, but not the other way around
Maybe it won't go that way on smaller scale, but it probably will on bigger scale
I am all for theory if there was actually any evidence of it =/
even inventors who have made things if you read their autobiographies they didn't invent or make stuff because they could patent it
or that because they could patent it was the reason they did
maybe a select few might have?
but for the most part people don't invent stuff because of patents, they invent stuff because they want to solve some kind of problem or improve something
patent troll is a thing too no?
it is
however, it is also easy to lose your patent that way too
patent trolls lose their patents when you can prove they have no intention on capitalising on their patent
I believe patents might promote smaller companies? Idk tho
Cuz smaller companies can probably grow bigger by patenting something and doing that, but it will be hard with no patent, as a big company will be able to steal their invention easily and do it on a bigger scale
IE, they are not trying to setup anything in order to actually create said thing or offer it etc
the purpose of a patent is to allow an inventor time to reap the rewards of their creation, however if you don't attempt to do this after a few years you can actually lose your patent
however, in regards to the whole its suppose to let the inventor reap the rewards, everyone just sells their patents if they manage to get one to some company since its very cost prohibitive to an individual to try and actually do the thing you invented
so the reality is, very few individuals actually make so called millions unless you manage to sell the patent for millions which is not common
unless they have the funding, they are realistically better off just selling it to some company or convincing a company to invest in them to have the ability to produce it
generally you would try to sell your patent to a company that would most likely benefit from it because it is either in the industry where they operate already or closely related
so for example, you invented something and it has to do with vehicles, you are better off getting a car manufacturer to buy the patent
In this case the inventor still profits from the patent tho
then it would be to try and get the manufacturer to buy your product or for you to try to become a car manufacturer that has that feature
Which the inventor simply couldn't if those weren't a thing
assuming they buy your patent
If they don't, you still own a patent somebody might want
if they don't like your thing they won't buy it and even if they do like it they are not going to shell out millions for it unless you came up with something revolutionary which as I said is actually not common
that has an expiration
that does not get extended just because you sold it
I'm gonna make an efficient water powered engine, is that enough
idk, you will have to try. but don't be surprised if you don't make money or invent the thing for quite a few years
its also not uncommon that inventors break even as well
when they sell a patent or just come out slightly ahead
an example is, lets say it cost you $10k to invent something but it took 5 years, and the most you can get for your patent that someone is willing to pay is $15k
then you made $1k/yr
hydrogen engines have been tried so much, yet it's one the same wavelength as nuclear fusion
10 years away
i heard hydrogen is not really efficient
like it takes a lot of energy to create the fuel, transport and so on
any way to remove this Bungee text?
Don't use Bungeecord?
what???
Then you won't have the bungee text
isnt there any work around
Idk, maybe stop the packet with the server software from sending and replace it with smth else?
how can i do that
By preventing the server packet from sending it and sending another one in it's place
will using velocity fix it?
no
Velocity will say velocity
^
and you think its that easy to edit server packets being sent
not exactly
For some one that know how to
i don't
I mean if u never worked with em or don't have experience ye its a pain in the ass
Why u tryin to hide Bungeecord from the info anyways?
You could maybe fork the bungee jar change the message and recompile, don't quote me on that tho
Tldr: There's no point in changing the name and it isn't easy
@near furnace You can send a plugin message to the minecraft:brand channel with the text you want. See https://wiki.vg/Plugin_channels#minecraft:brand
oh SHI
noice
neat
i just wanna configure the f3 menu 😭 what is all this
Why would you even want to change that?
After all you're giving credit to the contributors of Bungee by naming it in the server brand
do you see a big ugly text saying "Bungee SNAPSHOT git 1209312093 1209xXJodiaj@#)(Da"
can this fix it? or can I just make my own little plugin that lets me configure the f3 info
there are several plugins doing that already
that plugin doesnt look like what you want
how to check if block is in world guards region
LMGTFY
i think i found
but there is no instance.getRegionManager
no
Hello, i cant get and damage entity with raycasting, what could be the problem?
RayTraceResult raycastResult = player.rayTraceBlocks(30);
Entity raycastEntity = raycastResult.getHitEntity();
if (raycastEntity != null && raycastEntity instanceof Damageable) {
((Damageable) raycastEntity).damage(10);
}
rayTraceBlocks
there's a raytrace method for entities, use that
lmao, sorry i am a bit stupid
Easy
what does this ==: mean? (i dont know what plguin is this from
That’s a config
That's there to tell Spigot what type of object there is
oh......
it is the key spigot uses to determine the class of the serialized object, as Olivo said
if you don't want that key, you may make your own serialization format that doesn't depend on bukkit's
Is it possible to create a fake player that plugins can not distinguish from the real one?
yes
get a new computer
lol
buy microsoft account
fr
what do you need this for
can't you just use offline mode?
citizens npcs are pretty realistic
i'm pretty sure you can code them any way you want
on my local environment I can run CompletableFuture.runAsync and it works fine and logs fine
but on my pterodactyl panel it wont actually do anything
im so confused
Vault will interact with npc? I don't think so
you can code them to
Vault for permissions? yes they can be recognised
you should fake a login event though
I don't want to customize every plugin and somehow change their behavior it's too much like female coding
well, of course there's a lot of work ahead
you're asking for a bot to act natural as a player
pterodactyl:
[22:06:04 INFO]: [xincraft-lobby] 1 Test logging on thread Server thread
[22:06:04 INFO]: [xincraft-lobby] 4 Test logging on thread Server thread
[22:06:04 INFO]: [xincraft-lobby] 5 Test logging on thread Craft Scheduler Thread - 1```
for other plugins to think your NPC is an actual player you only need to fire a login and join event before spawning them
ive never used gradle, whats better kotlin dsl or groovy?
local
[09:06:47 INFO]: [xincraft-lobby] 1 Test logging on thread Server thread
[09:06:47 INFO]: [xincraft-lobby] 2 Test logging on thread ForkJoinPool.commonPool-worker-6
[09:06:47 INFO]: [xincraft-lobby] 3 Test logging on thread ForkJoinPool.commonPool-worker-6
[09:06:47 INFO]: [xincraft-lobby] 4 Test logging on thread Server thread
[09:06:47 INFO]: [xincraft-lobby] 5 Test logging on thread Craft Scheduler Thread - 4
looks like ptera is only listening to the main thread
however I dont think the code is actually executing on the completable futures at all
whats a good way to test
do a Bukkit.broadcastMessage
I need somehow create fake player in core level
I don't think plugins will interacting with npc like they players
But if this so
they do
can that be called async
yes
you need to trigger the player events
What if I not has citizes?
and i think you can use the player as the command sender
okay will get back to u
Citizes not free 😦
So npc not have only join event?
join event is a Bukkit event
I need start login and join event in nms before create npc right?
What the "fire one"
pluginManager.callEvent(new BlahEvent
Oh
all you are doing is telling other plugins that xxx player joined
well you need the Player instance
so fire it whenever you want, once you have teh Player instance
I need nms ye?
I don't can get him from citizes API?
Oh wait
You mean
Craft player or like this?
Alr I will try
And sending packets for the player to see the fake player in tab is not enough ?there is a huge amount of data packets to simulate ?
not if you want other plugins to see it as a player
to be a player other plugins have to see it join
Connection process? Or just event call?
just the event call
Uhh
I was think I need somehow register player data in server list
Bypassing the connection
Or citizes already do this?
server lilst? Do you mean in tab?
I mean smth like container
No idea what you mean
I imagined the process of creating a player as follows: when connecting to the server craftbukkit creates a player profile and adds it to some container on which it calls events
it does, but you are not doing any of that., You are creating fake players/NPC and want it to be recognised by Vault and other plugins
all you have to do for it to be seen as a player by other plugins is fire a join event
events do not pass beyond the server. its literally just a message all plugins will see
That doesn't mean I have to call every single event related to an player
no
So this mean join even do all this process? I need not only for vault
Yes but how plugins will get this fake players from others events
all other events are handled by craftbukkit IF your NPC is spawned correctly
No clue
it has a Bukkit entity so I assume it is fully spawned
If so it shoudl trigger events
Fair
I was think this hard but...
Only way to know is try it
Oh my fingers
It makes use of protocolLib to mirror the players skin & armor. but the regular mobs still work without it. if it used its own packets i dont think it would use pLib
When i remove plib the npc has a random skin. there is a such thing as Player entity
Yes but they’re a bit more complicated than your average entity
eh, not really
the major difference is that they require a connection, however you can just provide a fake one if you want to replicate a player
usually that isn't efficient nor recommendable, so people instead go for manipulating the type of the entity in the spawn packets instead
I thought they were? Since they have player like mechanics?
how the fuck is this possible
if therye running the same code
how tf is code running inside competablefuture runasync running on the server thread
one sec I'll shwo code
wait could it be that I think locally I'm running java 8
but on my panel I'm running java 17
I got this test logging method
public static void testLogging() {
XinCraftCore.get().getLogger().info("1 Test logging on thread " + Thread.currentThread().getName());
Bukkit.broadcastMessage("1 Test logging on thread " + Thread.currentThread().getName());
CompletableFuture.runAsync(() -> {
XinCraftCore.get().getLogger().info("2 Test logging on thread " + Thread.currentThread().getName());
Bukkit.broadcastMessage("2 Test logging on thread " + Thread.currentThread().getName());
}).thenAccept(a -> {
XinCraftCore.get().getLogger().info("3 Test logging on thread " + Thread.currentThread().getName());
Bukkit.broadcastMessage("3 Test logging on thread " + Thread.currentThread().getName());
});
Bukkit.getScheduler().runTask(XinCraftCore.get(), () -> {
XinCraftCore.get().getLogger().info("4 Test logging on thread " + Thread.currentThread().getName());
Bukkit.broadcastMessage("4 Test logging on thread " + Thread.currentThread().getName());
});
Bukkit.getScheduler().runTaskAsynchronously(XinCraftCore.get(), () -> {
XinCraftCore.get().getLogger().info("5 Test logging on thread " + Thread.currentThread().getName());
Bukkit.broadcastMessage("5 Test logging on thread " + Thread.currentThread().getName());
});
CompletableFuture.supplyAsync(() -> {
try {
XinCraftCore.get().getLogger().info("6 Test logging on thread " + Thread.currentThread().getName());
Bukkit.broadcastMessage("6 Test logging on thread " + Thread.currentThread().getName());
return true;
} catch(Throwable th) {
th.printStackTrace();
return null;
}
});
}```
run on onEnable
and now it doesn't even run the code inside the CompletableFuture blocks
however I use CompletableFuture.runAsync somewhere else in my plugin
and it works
above is called inside the ctor of my plugin
not it
except I've just tried my logging method inside the ctor and it still doesnt run
and how are you using it exactly?
does it not log anything during startup/enabling either?
I ran in ctor and in onenable and also when a player joins server event, none work
which is called in the ctor
of my lobby plugin
wait I got somewhere
these log fine
this one doesnt
it works up to before new MatchCommunicator
the code that runs there is the following
- mongo stuff that doesn't touch completablefuture
CompletableFuture.runAsync(() -> {
try (Jedis jedis = new XinCraftJedis()) {
XinCraftCore.get().getLogger().info("Subscribing to " + channel + " on thread: " + Thread.currentThread().getName());
jedis.subscribe(getSub(), channel);
}
});```
and then
```java
CompletableFuture.runAsync(() -> {
try (Jedis jedis = new XinCraftJedis()) {
XinCraftCore.get().getLogger().info("Subscribing to " + channel + " on thread: " + Thread.currentThread().getName());
jedis.subscribe(getSub(), channel);
}
});```
for 2 different subscribers for jedis pub/sub
I'm going to try move these subscribers to new Thread instead of completable future
it fucking worked
I want to know why though
it sounds like you are exhausting the common fjp by blocking in it
by default CF will use the common pool, if you push enough tasks and all of them block, no new tasks can be push there
you can pass your own Executor so that doesn't happen, such as CF.runAsync(() -> { blah blah }, task -> bukkitscheduler.runTaskAsync(task)) or whatever
for this jedis operation, what would you recommend is best
having its own thread per subsribe channel, or running completable future on a different executor
considering it runs in the ctor I believe I can't use bukkit's schedular because it relies on the plugin being loaded
that does make sense though, because pterodactyl must just get worn out easier than my localhost
you can have your own ExecutorService as well, such as a Executors.newCachedThreadPool or something
I'm not all that familiar with jedis, but if a single jedis instance can subscribe to multiple channels then it should probably be kept in one thread, otherwise one thread per channel but that sounds yucky
I had so many issues when using a single jedis instance for multiple channels as I was subscriving to 3 different channels and it would just get them all mixed up
whats the difference in using my own thread pool than just creating a new thread
if its blocking it will never change threads so it doesnt make sense to use a pool right
Is the difference in common pool size due to a command line arg or something
would you believe me if i said that i dont know nor used enums?
Updating a plugin to 1.21.1, tf's Particle.REDSTONE been replaced with?
available cores
Finally?
Runtime.getRuntime().getProcessorCount() * 2 iirc
yeah!!
POG
Ah
how can i get the amount of players online in a spigot server from a bungee plugin?
this.getProxy().getServerInfo("onlinecounter").getPlayers();
i wonder if it is this
try it and see
i will
int playerCount = server.getPlayers().size();
That’s not gonna work on a proxy :p
what is server?
@young knoll will this work?
No idea
okay
Tbh I’ve never worked with proxies
Really? In my instance, server would be getProxy().getServers().values()
for (ServerInfo server : getProxy().getServers().values()) {
int playerCount = server.getPlayers().size();
// somethn
}
new BukkitRunnable() {
public void run() {
//something
}
}
}.runTaskTimer(OnlineCounter.this, 0, 20);
what is the bungee equivilent of this?
i want to do something every x seconds
Huh I didn’t know the proxy had that data
I guess it makes sense though, since it handles connecting players to that proxy
i want to do this in my bungee
but
this is for spigot plugins only
I'm developing a plugin to random spawn mobs in the survival world but I got a performance problem. Is World#getHighestBlockAt is just a heavy task or it's because I'm trying to random spawn in an unloaded chunk so it has to be loaded first?
Code: https://paste.md-5.net/zudigowaxi.cs (line 28)
It’s loading the chunk
getProxy().getScheduler()?
Ah okay, checking if the chunk is loaded would improve it by a lot right?
Yes
Thank you!
getProxy().getScheduler().schedule(this, () -> {
//something
}, 0, 1);
do you use velocity?
@timid berry
Gotta give it a TimeUnit I guess
It literally just wants a TimeUnit
So TimeUnit.SECONDS
or milliseconds or whatever
yes
but how do i set the number?
getProxy().getScheduler().schedule(this, () -> {
//something
}, 0, TimeUnit.SECONDS);
oh is 0 the secs?
every 0 secs
Mhm
Time unit is just a better way of dealing with time than each tick