#help-development

1 messages ยท Page 2037 of 1

vocal cloud
ivory sleet
#

Sure mixins can be a bit painful due to unintended side effects

#

But ye

vocal cloud
#

If the payoff wasn't there I wouldn't deal with it tbh.

quiet ice
#

Pure ASM Transformers better.
Sadly noone supports them

smoky oak
#

am i missing something here? Why's there no PDT.BOOLEAN?

golden turret
#

use a byte

smoky oak
#

if(0) is if(false) right?

golden turret
#

you can choose

smoky oak
#

...

#

if i use a BYTE for storage

#

and dont store anything in it

#

its 0

#

right?

#

dammit

vocal cloud
#

Just store false as a 0 and true as 1

smoky oak
vocal cloud
glossy venture
#

is this the correct way to generate a resource pack hash?

smoky oak
#

are there any resources on how to create PersistentDataTypes ?

tender shard
#

one sec

#

?pdc

tender shard
#

then scroll down to Custom PersistentDataTypes and how to use them ?

smoky oak
#

thanks

tender shard
smoky oak
#

what is relocating & shading again?

wet breach
tender shard
#

it means that maven adds the library into your .jar file

#

and that it renames the package of the library

#

e.g. com.jeff_media.blabla becomes your.plugin.blabla

tender shard
smoky oak
#

well your other library is what im trying to implement here lol @tender shard

tender shard
smoky oak
#

im a programmer

wet breach
#

well technically false does equal 0, but there is more to it. For instance if you think false means 0, you might then think 1 is then true if you were trying to compare the functionality of boolean. However, the boolean true is actually not equal to any specific number and rather just means does not equal 0. So that means true could be -1.

smoky oak
#

ctrl c and ctrl v maven seems easier than searching out the code i need

tender shard
#

true

wet breach
#

unless you were just asking if you could simply do if(0) instead of if(boolean)

smoky oak
#

yea

wet breach
#

ah, then no

smoky oak
#

bc it said byte cant be used as boolean

wet breach
#

well you can represent a boolean in a byte, but you would have to change your if check

#

to if (byte == (whatever number here))

smoky oak
#

@tender shard where tf do i insert <configuration>

vocal cloud
#

boolean result = byte == 0 ? false : true

smoky oak
#

copying the code it is

wet breach
#

lol

tender shard
smoky oak
#

??????
I have a completely different issue now

smoky oak
tender shard
#

do you already have a <build><plugins> section?

smoky oak
#

uh its a commented out section with the remapped plugin from md_5

tender shard
#

if you don't have <build> at all, just add this:

#
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.4</version>
            <configuration>
                <relocations>
                    <relocation>
                        <pattern>com.jeff_media.morepersistentdatatypes</pattern>
                        <shadedPattern>YOUR.PACKAGE.morepersistentdatatypes</shadedPattern>
                    </relocation>
                </relocations>
            </configuration>
        </plugin>
    </plugins>
</build>
#

if you do have a <build> section, insert the <plugin> section into your existing <plugins>

smoky oak
#

thanks

#

works now

warm light
#

How .isSimilar work?

tender shard
warm light
#

Itemstack

rough drift
#

^

chrome beacon
#

?jd-s

undone axleBOT
tender shard
#

This method is the same as equals, but does not consider stack size (amount).

#

it basically gives true when those two itemstacks would be able to stack

warm light
#

I mean what it check between 2 itemstack? name or what?

vocal cloud
#

ctrl+b that method lol

tender shard
#

name, damage, lore, material, ...

#

basically everything except amount

vocal cloud
wet breach
#

probably helps if you know what .equals() does

#

equals() in java compares object contents if that better helps understand what isSimilar() refers to when it says works the same as equals

smoky oak
vocal cloud
#

f4 is a weird finger movement that resets hand position so ctrl+b is way nicer for me

smoky oak
#

i spend 90 % of my time searching stuff so i dont realyl have a rested hand position lol

tender shard
#

ctrl+b > F4

warm light
#

Is there anyway to rename a itemstack permanently?
It reset when place & break

tender shard
#

you have to store the name of the itemstack using PDC when the block gets placed

#

then listen to BlockDropItemEvent and apply back the name

warm light
#

Alright

#

thanks

smoky oak
#

I really find it stupid how many fixes and qol stuff we need to do ourselves... question @tender shard does the PDC persist when the block's broken?

wet breach
#

which fixes and qol stuff you referring to?

glossy venture
#

why is this not bringing up a prompt? i know that the code is being called and there is no error console output

vocal cloud
#

Unless I'm misreading his code it's just writing the block data to the chunk. I assume you have to manage the writing/deleting yourself

glossy venture
#

no assertion fails, connection errors, etc

smoky oak
glossy venture
#

oh yea

#

let me check

#

nah its set to prompt

wet breach
glossy venture
#

i never got the prompt though

smoky oak
#

dont they check the havh on every join?

glossy venture
#

or downloaded it

#

ill append the hash to the name or something

tender shard
vocal cloud
#

Ayy I can read code after all

smoky oak
#

so in this case...

#

i can use it as a feature

#

lol

tender shard
wet breach
smoky oak
#

yes

hardy swan
#

I think it is not worth looking into

glossy venture
#

im used to it

vocal cloud
tender shard
glossy venture
#

i hate it when the whole text gets red on an error

smoky oak
#

anyways imma head off now

glossy venture
#

p a i n

wet breach
smoky oak
#

wellllll you cant do that normally

wet breach
#

your library may make it easier or extend functionality but isn't required since the API already facilitates it

smoky oak
#

and the workaround is storing it in the chunk pdc

tender shard
tender shard
#

only for tileentities

vocal cloud
#

Mostly because you require tile entities to store data for blocks

wet breach
#

well maybe not for every location, but chunk pdc is generally sufficient most of the time

tender shard
#

yeah that's what it does, my lib simply maps a blocklocation to a namespacedkey in the chunk

#

well and also handles loading/saving it everytime the PDC gets changed etc

smoky oak
#

also

#

why rewrite already existing working code

tender shard
#

yeah lol. I specifically made all those libraries so I don't have to copy paste my code between all my plugins

#

actually copy pasting was not the problem, but... if something needed a fix, then I had to fix it in 10+ plugins lol

#

now I just recompile them and have the fixed version everywhere

wet breach
smoky oak
#

PR's ?

wet breach
#

pull requests

smoky oak
#

ah yea

#

i aint rewriting that code

vocal cloud
#

Gotta write your own libs for arbitrary unnecessary reasons

wet breach
#

typically the case

#

like the above is an example where most likely chunk pdc is sufficient since you won't have a block without a chunk loaded

smoky oak
#

is a lodestone a tileEntity?

tender shard
wet breach
#

didn't look at it

#

you said it provides per block pdc

smoky oak
#

correct

#

i do need to permanently store data for blocks

#

cant do that with stone

#

since it aint a tileentity

tender shard
wet breach
#

either way, people over engineer when it isn't necessary

smoky oak
#

that library is pretty simple tho

tender shard
#

it's like 5kb in only one file

wet breach
#

not sure why either you keep thinking my comment strictly refers to the library

#

even the comments before o.O

rough drift
tender shard
smoky oak
wet breach
#

I have nothing against your library @tender shard probably is useful to some. however that doesn't mean people have the tendency to over engineer or use things that are most likely not necessary.

smoky oak
#

im mostly just running under the principle 'if it works'

#

if someone wants to improve my code sure

#

but i aint doing squat beyond what's necessary

vocal cloud
#

I'm writing a library to be as unnecessary as possible. That being said if you have an idea for something that could be done with reflection (non NMS stuff) that would save you 2 seconds of typing lmk so I can add it to my TODO list. So far I have
Listener auto reg
Command auto reg
Plugin auto injection.
I need more stupid things to add. feed me ideas

tender shard
tender shard
#

create a PlayerScrollEvent with an Enum "ScrollDirection.UP" and .DOWN.

Now make your library automatically listen to PlayerChangeHeldItemEvent and call this event everytimg to indicate a player has scrolled up or down (only if they changed the held item by exactly 1 to the left or right)

#

I think my library does it too but only registers the listener if the plugins needs that event lol

#

so you can make menus where you can use the mousewheel to navigate

#

ofc the event must be cancellable

vocal cloud
#

Wouldn't I just make a normal event? Although automatic custom event reg is something I can add

tender shard
#

beautiful, isn't it?

vocal cloud
#

My lib isn't actually a plugin so I'm not sure the extent to which it can register things.

#

But automatic registration of custom events is something I'll add

wet breach
vocal cloud
#

Wait speaking of that I could look for println and complain about it thonk
Call it the "best practice tool"

rough drift
#

can you add \n in a kick message

vocal cloud
rough drift
#

i tried it

#

didn't work

#

it just appears as \n

#

so i asked here

wet breach
#

or lazy datastructures

rough drift
#

(ignore the time, i did an oopsie with conversion lmao)

vocal cloud
#

Trampoline technique plays out like a regular trampoline user. They go right over my head

silk hamlet
#

yes

kindred valley
#

How can i compare int with iterator.next

rough drift
last sleet
#

Just to be clear: I can store multiple keys under a same namespace in a persistent data container, and then one value per key ?

hollow bluff
tender shard
#

that's what it's for

#

your namespace is your plugin name

#

it's like
myplugin:name -> "test"
myplugin:age -> 3
myplugin:enabled -> 1 (byte)

glossy venture
#

so thats weird

#

do you have utf 8

#

does craftbukkit just wrap nbt data

#

or is it a whole different copy

#

of an nms item

safe edge
#

When executing command mvn install:install-file -Dfile=C:\dynmap\target\dynmap-api-3.4-SNAPSHOT.jar -DgroupId=us.dynmap -DartifactId=dynmap-api -Dversion=3.4
I got error.
What should I do ?

grim ice
#

which is why you cant reverse hashmaps

tender shard
#

does someone know whether the limit for maps is still only 65k?

#

and if so, what happens if all IDs are used up?

hardy swan
#

Do fireworks have a chance of curving upwards when shot from crossbow?

west oxide
#

hey @tender shard i was following one of your tuts
but where should i execute the command line here ?

grim ice
#

Where command lines are executed

west oxide
#

am using intellij idea

grim ice
#

and?

west oxide
#

should i do it there ?

grim ice
#

you can

west oxide
#

this didnt work

grim ice
#

since it has a terminal

#

but just do it

#

in

#

cmd

west oxide
#

ohh okok

#

amma try

grim ice
#

what happened

west oxide
#

1 sec amma try on cmd

west oxide
grim ice
#

the result of IDEs making everything easy for you:

#

you dont have maven installed

#

i would also install gradle

#

useful shit

crude loom
#

Is it possible to code plugins that would be compatible to 1.18.2 in intelliJ?

west oxide
frigid rock
#

does anyone how to solve this? java.lang.NullPointerException: Cannot invoke "org.bukkit.scheduler.BukkitTask.cancel()" because "this.val$finalKick" is null This is the code: java public void requestLogin(Player p){ User user = new User(p); BukkitTask timer = user.getTimer(); BukkitTask kick = user.getKick(); if(user.hasPassword(p)){ //timer timer = new BukkitRunnable() { @Override public void run() { if(!user.isLogged()){ p.sendMessage(ChatColor.RED + "Please log in."); p.sendTitle(ChatColor.WHITE+ "Log In.", ChatColor.AQUA+ "Thank you!", 10, 25, 10); } } }.runTaskTimer(TakaoLogins.instance, 0L, 100L); //kick BukkitTask finalTimer = timer; BukkitTask finalKick = kick; kick = new BukkitRunnable() { @Override public void run() { if(!user.isLogged()){ p.kickPlayer("You timed out on login."); }else{ finalTimer.cancel(); finalKick.cancel(); } } }.runTaskLater(TakaoLogins.instance, 600L); }else{ p.sendMessage(ChatColor.RED + "You need to register."); } }

spare canyon
#

Not sure if this is the right channel but
is there a reference sheet/documentation of all the callbacks (like onBlockPlaced(), onPlayerJoin() and so on)? I'm not sure if they are under Listener, or how to override them and write my own. Can anyone help?

#

In other words, just a guide to callbacks and a list

#

Thanc

buoyant viper
#

theyre not implementable callbacks from the Listener class @spare canyon

#

u can look on the spigotmc.org tutorial pages on how to listen to events

#

and a list of them should/would be on the javadocs

#

?jd

buoyant viper
rough drift
#

thats literally what i am doing

#

(diff text on the sides but you get the point)

#

tho its fine

#

idrc

#

the major problem is AsyncPlayerPreLoginEvent never being called

buoyant viper
#

should b called

rough drift
#

nope

buoyant viper
#

did u register listener?

rough drift
#

yes ofc

buoyant viper
#

does it work with something like the normal PlayerLoginEvent

rough drift
#

lemme add a print statement to my login event

#

and check

hollow bluff
#

its hard to help when you dont show anything

rough drift
#

because.. there's nothing to show?

hollow bluff
#

Then you dont have a problem theb

rough drift
#

i just kick the player if a certain condition is true (i get kicked so thats not the problem), it just shows \n as literally \n

#

not a newline

#

and yes i didn't type \\n

rough drift
worn tundra
#

What was the error / problem?

hollow bluff
#

event.setKickMessage. Why not use that for asyncplayerprelogin?

rough drift
rough drift
#

lmao

#

i am fine with \n not working

#

i need the event to work tho

worn tundra
#

But it still kicks the player?

rough drift
#

alright

worn tundra
#

But doesn't process the newlines?

rough drift
#

lets separate

rough drift
#

exactly

worn tundra
#

Version?

hollow bluff
#

@fresh templetHandler?

rough drift
#

newlines are written as \ and n

rough drift
rough drift
#

i am not new to plugins

worn tundra
#

Ooh, that's even more interesting

#

Can you test it in different contexts?

#

Like on enable get player and kick

rough drift
#

i mean on enable there wouldn't be any players on no?

#

exact paper version btw

west oxide
worn tundra
rough drift
#

oh yah

worn tundra
#

Anyways anywhere

#

except for in the evebt

#

Is the behavior pertained?

rough drift
#

checkin

#

my pc when i build my plugin: BRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR

regal carbon
frigid rock
#

does anyone how to solve this? java.lang.NullPointerException: Cannot invoke "org.bukkit.scheduler.BukkitTask.cancel()" because "this.val$finalKick" is null This is the code: java public void requestLogin(Player p){ User user = new User(p); BukkitTask timer = user.getTimer(); BukkitTask kick = user.getKick(); if(user.hasPassword(p)){ //timer timer = new BukkitRunnable() { @Override public void run() { if(!user.isLogged()){ p.sendMessage(ChatColor.RED + "Please log in."); p.sendTitle(ChatColor.WHITE+ "Log In.", ChatColor.AQUA+ "Thank you!", 10, 25, 10); } } }.runTaskTimer(TakaoLogins.instance, 0L, 100L); //kick BukkitTask finalTimer = timer; BukkitTask finalKick = kick; kick = new BukkitRunnable() { @Override public void run() { if(!user.isLogged()){ p.kickPlayer("You timed out on login."); }else{ finalTimer.cancel(); finalKick.cancel(); } } }.runTaskLater(TakaoLogins.instance, 600L); }else{ p.sendMessage(ChatColor.RED + "You need to register."); } }(i made the finalTimer and finalKick variables cause the IDE told me to and idk why)

quiet ice
#

It's because you cannot use variables that are not effectively final in a Lambda or anonymous class

#

I'd recommend to use the consumer schedule method instead

crude loom
#

If I'm trying to get a config value that does not exist and it's an int, will it return 0 or will it throw an exeption?

quiet ice
#

The issue you have is that you never defined kick to a non-null value and that thus finalKick is null. finalKick is passend through your Anonymous class into val$finalKuck as a synthetic field

#

I'd avpid the use of Bukkit runnables either way

quiet ice
undone axleBOT
crude loom
#

Oh, thanks !

quiet ice
#

Don't debug a Problem in 6 hours If Reading the Docs for 5 Minuten also solves it

frigid rock
#

i cant get that

quiet ice
#

user.getKick Returns null

#

And you kick = .... assignment is irrelevant

frigid rock
#

oh yeahhh

#

that's why dang

#

thank you man

errant jackal
#

hi
im using spigot server and when ever i use command it wont work and in consule it will show me this "issued server command: /plugin list enabled"

errant jackal
steady rapids
#

What is the event to check if a player is hitting a block?

visual tide
#

PlayerInteractEvent

steady rapids
#

ty

steady rapids
visual tide
#

yes

#

you can check the action of the event

steady rapids
#

nice

visual tide
#

however

#

you cant detect right clicks without an item in hand into air

#

but everything else yes

warm trout
#

How do I move a vector one block to the right/left

grim ice
#

the command prompt

#

not the command to use

regal sigil
#

quick question: I Have just created a bunch of worlds with MultiVerse. if i move some folders with the SAME EXACT names and replace the folders the plugin itself has created will it work and keep the worlds or does it have the possibility of crashing the plugin/deleting the worlds

kindred valley
#

How can I access a key via any value in hashmap<String, integer>

ivory sleet
#

probably wanna linear search the entry set of the map

#

alternatively use a BiMap<K,V> (which is a Set -> Set rather than a Set -> Collection)

grim ice
#

what r u trying to do

quaint mantle
#

What's the event for listening to a kick "You area already connected to this proxy!" i tried PreLoginEvent, LoginEvent, Post

spare canyon
buoyant viper
#

Listener itself is an empty interface iirc

#

u then annotate methods u want to listen to events inside a class that implements the Listener interface

#

u can annotate as many methods as u want in that class

spare canyon
#

but how do i tell the plugin that the function is a callback for when a player breaks a block for example

#

or when a player joins

#

are there fixed names like "onPlayerJoin" and "onBlockBreak" or can it be any name?

buoyant viper
#

so like

// in ur listener class
import org.bukkit.whatever;

public class MyListener implements Listener {
  @EventListener
  private void onBlockBreak(BlockBreakEvent event) {
    // do stuff
  }

  @EventListener
  private void onJoin(PlayerJoinEvent event) {
    // do stuff
  }
}

// in ur plugin class
import org.bukkit.whatever;

public class MyPlugin extends JavaPlugin {
  @Override
  public void onEnable() {
    // other stuff
    getServer().getPluginManager().registerEvents(this, new MyListener()); // or something like that
  }
}```
spare canyon
#

oh ok thanks

buoyant viper
#

and all the events are on the javadocs

#

?jd

spare canyon
#

thank you~

#

!

hasty prawn
#

we love annotation reflection prayge

crude loom
#

Hi, what is an item's lore?

hybrid spoke
#

onChat(BlockBreakEvent

hybrid spoke
hasty prawn
#

They can be private

hybrid spoke
#

sure in java 16+?

buoyant viper
hasty prawn
#

Yeah, it calls setAccessible(true) on them iirc

buoyant viper
hybrid spoke
#

wasn't there smth that prevented that?

#

or was it modifying a final?

buoyant viper
#

and i was already typing

warm trout
#

Letโ€™s say there are 2 blocks, how would I get the direction of the first block facing the second

#

Maybe the yaw

hybrid spoke
#

or the blockface

visual tide
#

is

public class MyClass {```
or
```public @Data
class MyClass {```
more readable
hybrid spoke
#

first

hasty prawn
#

first

wet breach
visual tide
#

alr

warm trout
wooden fable
#

Is there an easy way to create an permission that gives all permissions? (plugin.*), Or do I have to add that permission to every permission check?

steady rapids
#

Hello, I want to use an item durability bar to display its "usage cooldown" so when u use it, it gets to 1% and it slowly returns to 100% durability, using a separate thread sounds resource unfriendly, is there a better way to update the bar constantly? (there may be multiple items that are doing this at the same time)

buoyant viper
#

repeating task? idk

hasty prawn
#

Repeating task that iterates through the item list and updates all their durabilities yeah

sharp bough
#

?learnjava

undone axleBOT
crude loom
#

Hi, is there a way to make invisible text?
using ChatColor.COLOR_CHAR
only makes it black for some reason

hardy swan
#

Are there any events thrown when Entity#remove() is called.

#

nvm, not needed

steady rapids
shy pewter
#

?learn phython

#

Hmm

crude loom
# safe edge Just empty line ?

I want to uniqly identify items, and from what I understand the way to do it is putting a randomized UUID in the item's lore. Like so:

 ItemStack item = new ItemStack(Material.PAPER);
ItemMeta meta = item.getItemMeta();
meta.setLore(Arrays.asList(UUID.randomUUID().toString()));
item.setItemMeta(meta);

But I need the UUID to be hidden

hasty prawn
#

Use PDC for that

crude loom
#

What is that?

hasty prawn
#

?pdc

crude loom
#

I will check it out, thanks!

shy pewter
#

Hi

#

Dessie

hasty prawn
#

hi

shy pewter
#

Can u help me

hasty prawn
#

?ask

undone axleBOT
#

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!

shy pewter
#

Which coding is best to make a plugin

#

?ping

undone axleBOT
#

Pong.

shy pewter
#

๐Ÿ˜‚

crude loom
#

Plugins are coded in the Java language

shy pewter
#

Ok

crude loom
#

usually

shy pewter
#

Java is best

hasty prawn
#

Java is the only good option, if not the only one

shy pewter
#

?learn java

hasty prawn
#

There may be some weird wrappers that allow for other languages to be used but please don't use those NotLikeThis

shy pewter
#

Hmm

hasty prawn
#

?learnjava

undone axleBOT
shy pewter
#

๐Ÿ˜‚

ivory sleet
#

?learnkotlin

#

Ah didnโ€™t work

shy pewter
#

How to join multiple servers from one server dessie

hasty prawn
#

Wdym

#

You mean Bungeecord?

shy pewter
#

Wdym means

crude loom
dusty herald
#

what do you men

shy pewter
hasty prawn
#

Bungeecord

shy pewter
#

Yes

hasty prawn
#

You don't need to know Java for that though

shy pewter
#

Oh

#

So what i do for that

hasty prawn
#

Lookup a Bungeecord setup tutorial

shy pewter
#

Then

hasty prawn
#

Follow it

shy pewter
#

Ok

shy pewter
hasty prawn
#

On Google

shy pewter
#

Ok

vocal cloud
#

I love comment trains

shy pewter
crude loom
# hasty prawn Use PDC for that

If I understood correctly, PCT is used like a hashmap
Enter a key, get a value
But what I need is to just store a UUID inside an item, without a key

#

although I could just set the same key for every item
would this work?

hasty prawn
#

And yes you can set the same key for all items

#

Just no duplicate keys in the items

crude loom
hasty prawn
#

The uuid

#

"uuid": 478324832478327489327848328

crude loom
#

Oh, and "uuid" would be the same key for every item

hasty prawn
#

Yes

crude loom
#

I see

#

Now, when I delete the item (for example throw it in lava) everything related to it will be gone (the keys and values) and not take up space in the server's memory right?

hasty prawn
#

Correct

crude loom
#

That should work, thank you for the help! :D

buoyant viper
buoyant viper
vocal cloud
#

Java bytecode

visual tide
#

nashorn

#

๐Ÿ™‚

vocal cloud
#

Ballmers peak coding

crude loom
#

Guys lets just code in binary code

visual tide
#

jython :harold:

sharp bough
#

does it matter if my spigot.jar is 1.18.2?

dusty herald
#

no

hasty prawn
#

It does if you're using NMS

dusty herald
#

unless ur doing something 1.18.2 specific but I doubt

hasty prawn
#

Or that

sharp bough
#

na just first proyect its been a while so im catching up

#

should be fine for now

hasty prawn
#

Probably fine then yeah

sharp bough
#

what happens if i want to use NMS tho?

hasty prawn
#

It won't work

sharp bough
#

should i just wait until they add it

#

?

buoyant viper
#

just build it urself w BT ezpz

hasty prawn
#

You should learn how to setup a project yourself tbh

sharp bough
#

ah, i see

crude loom
#

That would be in eclipse?

sharp bough
#

well that looks like a problem for another day

buoyant viper
#

minecraft dev plugin is good for sponge mixins n thats about it imo

dusty herald
#

I mean they are setting it up themselves, u can just change the pom later...

hasty prawn
#

Yeah true ig

#

Still though, if you move away from plugin development you probably won't be able to use the plugin as a crutch lol

sharp bough
#

couldnt i just edit the pom.xml? <version>1.18.1-R0.1-SNAPSHOT</version>

#

in the future i mean

crude loom
#

This doesn't work for any version for me for some reason
Other than the one I initially chose

manic furnace
#

I there a way to spawn particles that doesn't get removed after like 5 sec and which you can delete by hand?

hasty prawn
#

Keep spawning them

tender shard
buoyant viper
#

tbh i think setting up a spigot plugin is just too trivial of a task to require a plugin to do it

hasty prawn
#

^

buoyant viper
#

sure it saves u a few seconds of boilerplate but

#

its much more useful for something like Mixins, since it can help get the descriptors of methods, constants, fields and what not

manic furnace
hasty prawn
#

I could see it be useful for beginners who don't need to understand maven yet I suppose.

buoyant viper
#

u dont need mcdev for mixins but boy is it a godsend

waxen plinth
buoyant viper
hasty prawn
#

Lol true

#

I mean I agree with you so ๐Ÿคทโ€โ™‚๏ธ

buoyant viper
#

gone is the good old <scope>system</scope> and <systemPath>yeahfilehere</systemPath>

vocal cloud
#

They removed it so people who spend hundreds on personal servers could justify doing so by hosting their own repos

tender shard
tender shard
hardy swan
#

hello

#

just a wild question

#

can non-human entities use shields

buoyant viper
#

but usually below

tender shard
buoyant viper
#

i think when i first learned maven stuff the tutorial had build above deps

tender shard
hardy swan
#

I mean, is there any trick that can make them

buoyant viper
#

mfs can use a totem tho cant they

hardy swan
#

yea

buoyant viper
tender shard
#

but now it feels ugly to NOT have them at the bottom

buoyant viper
#

i think i put it below bc like

#

gradle

hardy swan
#

why would you say so, build sounds like the last stage of your project

buoyant viper
#

deps is the bottom yeah but then u have like task config under it

hardy swan
#

by chronological order, deps should be above

lilac dagger
#

parent/childs

properties

build

dependencies

hardy swan
#

and people do weird stuff with build all the time, I like to keep weird stuff below

buoyant viper
#

properties

repos

dependencies

build

tender shard
lilac dagger
#

ah yes repos

tender shard
#

I should update my pom generator some time

#

it still looks like a website from the late 80ies

buoyant viper
tender shard
#

and pluginRepositories at the bottom

buoyant viper
#

plugin repositories anywhere after the plugins

lilac dagger
#

at the end you choose the order as you please

buoyant viper
#

even if its the wrong one

lilac dagger
#

keep the ugly stuff down

hardy swan
#

build

dependencies

properties

repositories

#

choose as you please

buoyant viper
#

but dont choose wrongly

hardy swan
#

ideally, you have no build

#

no repositories

buoyant viper
#

no dependencies

hardy swan
#

if you are talking about plugins, we need that

buoyant viper
#

nah

#

just reimplement the apis u think u needed

hardy swan
#

ever seen a pom with a long list of maven plugins and wonder what they do?

#

and you realise some are/can be called even without specifying them

#

auto-generated project stuff

#

everyone should be doing mvn archetype:generate

buoyant viper
#

nor do i use gradle

#

i actually dont even use an IDE

#

or write java

#

im just here for the ride

hardy swan
#

can you make nothing explode in spigot

#

make an explosion out of nothing i mean

#

oh found it

eternal oxide
#

yes createExplosion

warm trout
#

How can I make a mob break anything in its path (Iโ€™ve made it make a path with nms)

quaint mantle
#

Hi guys. I wanna create it so there is a sidebar scoreboard (that displays individual stats to the individual) and a below name scoreboard (that displays the players current health to everyone online) that both display at the same time. Would I need to use NMS to make that work?

buoyant viper
#

bukkit has a scoreboard api that can do that pretty sure

#

and health is a vanilla scoreboard objective u can add with a command

safe edge
vocal cloud
#

Check your paths make sure that's all good. Then make sure you're importing the dep properly

quaint mantle
#

@buoyant viper yes but the issue is when I do two scoreboards at the same time. Spigot only allows 1 at a time

#

It overrides one when I do the other

shy pewter
#

Hi

#

?learnjava

undone axleBOT
shy pewter
#

Which web is best

crude loom
#

Text Shadows

safe edge
vocal cloud
#

In your pom.

#

Make sure it follows the pattern you setup in the command

tender shard
pine forge
#

How are bungeecord plugins different from spigot plugins and can you make spigot plugins compatible with bungeecord?

tepid crater
#

My custom enchantment is vanishing when im using anvil, any idea why?

buoyant viper
#

bungee plugins are for bungeecord, the proxy software

and spigot plugins are for spigot, the server software

pine forge
#

Hmm okay

tepid crater
#

Hey mfnalex, how can i save a map with persitent data container?

tender shard
#

if I set a depedency that provides annotations to provided in my pom, are the annotations lost or are they still somehow included in my final .jar?

tender shard
tender shard
tepid crater
#

same when doing with ItemMeta#getEnchants

tender shard
#

i'd just use a string array then and split your stuff

#

e.g.

#

unbreaking,3

tepid crater
#

oh i see

#

yeah i guess its more easy

tender shard
#

but string arrays arent included by default

tepid crater
#

lol

tender shard
#

you can either use a normal string and do it like this:
unbreaking,3;someother,4

#

or create a string array datatype. I have one in my lib:

tepid crater
#

Okay thx

#

im going to use that

grim ice
#

does a cancelled event get passed to the next listener

tardy delta
#

yes depends on the priority

tepid crater
#

i mean you have the ignoredCancelled

tardy delta
#

EventPriority.HIGHEST wont get passed

grim ice
#

for example a inventory click event, if i cancel with highest priority, will another listener on another plugin with default priority and default other parameters recieve it

lilac dagger
#

can i tell the pom that this isn't to be parsed?

wooden fable
buoyant viper
#

i think

wooden fable
#

Thanks!

tardy delta
#

bruh my cat was sitting on my keyboard

tepid crater
tender shard
#

tbh I'd just use a string

tepid crater
#

okay

tender shard
#

I'd really just use a string and store it like this
enchName,1;enchName,2

#

then split by ;

#

than split everything again by ,

#

basically you can just do ```java
for(String enchantment : originalString.split(";")) {
String enchName = enchantment.split(",")[0];
int level = enchantment.split(",")[1];

chilly haven
#

how do i spawn particles?

tender shard
#

World#spawnParticle

#

or

#

Player#spawnParticle

chilly haven
#

doesnt work

tender shard
#

?dontworking

hexed hatch
#

lol

tender shard
#

?notworking

undone axleBOT
#

"Does not working" is a useless statement. Please describe what exactly is not working, what you expect it to do, and what actually happens. If you get any console errors, also ?paste the entire stacktrace.

chilly haven
#

spawnparticle isnt a thing

hexed hatch
#

Yes it is

tender shard
#

your MC version must be at least 7 years old if you don't see those methods

golden turret
#

and which direction the cursor moves?

tender shard
hexed hatch
#

Itโ€™s actually 8

golden turret
tender shard
#

it's probably the same value as "facing" in your F3 screen

eternal needle
#

Hi i have a problem with this ChatColor.translateAlternateColorCodes('&', instance.getConfig().getString("messages"));

i want to translate so i get collerd messages and it's not working

pls tag me

tender shard
#

I think 0 is north, 180/-180 is south

golden turret
undone axleBOT
#

"Does not working" is a useless statement. Please describe what exactly is not working, what you expect it to do, and what actually happens. If you get any console errors, also ?paste the entire stacktrace.

tender shard
hexed hatch
#

Because if so, thatโ€™s your problem

#

It only accepts a string

tender shard
safe edge
#

mvn install:install-file -Dfile=C:\dynmap\target\dynmap-api-3.4-SNAPSHOT.jar -DgroupId=us.dynmap -DartifactId=dynmap-api -Dversion=3.4 -Dpackaging=package
What I need to change in command when I want dependency to start working

visual tide
#

translateAlternativeColorCodes is for a single string

tender shard
#

not package

#

-Dpackaging=jar

eternal needle
# hexed hatch Is messages by any chance a list or an array

this is the hole code


    private List<String> messages;
    private boolean random;
    private int lastmessage;

    public Tips (Out plugin)

    {
        this.random = instance.getConfig().getBoolean("random");
        this.messages = instance.getConfig().getStringList("messages");
    }


    @Override
    public void run() {
        String message = "";

        if (!random) {
            //nytt
            ChatColor.translateAlternateColorCodes('&', instance.getConfig().getString("messages"));
            try
            {
                message = messages.get(lastmessage + 1);
                lastmessage++;
            } catch(ArrayIndexOutOfBoundsException e){
                message = messages.get(0);
                lastmessage = 0;
            }
        } else {
            Random random = new Random();
            int nextMessage = random.nextInt(messages.size());
            while (nextMessage == lastmessage){
                random.nextInt(messages.size());
            }
            message = messages.get(nextMessage);
            lastmessage = nextMessage;

        }
        for (Player player : Bukkit.getOnlinePlayers()){
            player.sendMessage(message);

        }
    }
hexed hatch
#

Youโ€™ll have to iterate through the list

lilac dagger
#

how can i tell a xml that <something> is not to be read as a tag?

#

i can't compile an option that requires those 'cause of it

tender shard
#

> = >

#

or use a CDATA

#

<![CDATA[<]]>
<![CDATA[>]]>

#

e.g.

<mystring><![CDATA[<]]>Wassup<![CDATA[>]]></mystring>

now "mystring" is "<Wassup>"

lilac dagger
#

oh nice

tender shard
#

(I'd rather use gt and lt)

eternal needle
tender shard
#

gt is for "greater than" and lt is "less than" so easy to remember

hexed hatch
#

For loop iterator

#

Learn Java

lilac dagger
#

&lt?

#

or <

tender shard
#

?learnjava

undone axleBOT
tender shard
hexed hatch
#

for (String msg : messages) {
// do thing with msg from list
}

lilac dagger
#

that was it @tender shard thank you

tender shard
#

anyone got any idea why my .jar won't run? D:

#

when I decompile it, the main class looks fine

lilac dagger
#

run the jar from the command line so you get the stack trace

tall dragon
tender shard
tender shard
lilac dagger
#

then there's too little information hmm

#

google that error tho

#

might be something that doesn't need explaining

tender shard
#

hm well doesn't really matters as long as it's running from spigot for now ๐Ÿ˜„

#

Ugh I'm stupid. it was indeed the missing manifest because I had this in my pom

tall dragon
#

:D

tender shard
#

I thought that the maven created meta-inf doesn't get removed by the shade plugin

strong parcel
#

I made a shield that strikes nearby entities with lightning when an attack is blocked, but the lightning also damages the player if there are mobs standing next to him. Is there a way I can temporarily make the player immune to lightning and fire?

tender shard
#
ignoreLightningDamage = true;
// summon lightning
ignoreLightningDamage = false;

And in the listener:

public void onEntityDamageEvent(EntityDamageEvent event) {
  if(event.getDamageCause() == DamageCause.LIGHTNING && ignoreLightningDamage) {
    event.setCancelled(true);
  }
}

something like this

#

you could also use a List<Player> or List<UUID> if you only want to exclude the damage for specific players

tall dragon
#

mfnalex do you happen to be good at math?

tender shard
#

if it's just some tiny vector stuff

tall dragon
#

well might as well try again here.

strong parcel
#

Thanks!

night barn
#

Hello,
how long it takes for response on unban appeal?
First time I e-mailed them they didn't even respond. ๐Ÿ˜„

#

And that was in summer 2021.

ebon stratus
#

i tried using TabCompleteEvent to modify a vanilla command but the event doesn't fire, any help?

tall dragon
# tender shard depends ๐Ÿ˜„

i am using an Exponentional Growth formula to determine a price for an "upgrade", now i want to determine the cost of like 50 levels together right. but thats not very easy because the price for each level will differ. now i could loop 50 times and add up the costs but this wont be very efficient as there could be like a million levels upgraded at once. sooo any ideas?

tender shard
night barn
night barn
#

I apologized and explained alt account.

tall dragon
#

sure one second

tender shard
night barn
night barn
#

You have been banned for the following reason: Alt account. To appeal, please email unban-support@spigotmc.org with details of why you were banned, why you should be unbanned, and how you will prevent it from happening again. Please note that creating a new account is against the rules and will only extend your ban.

tall dragon
# tender shard hm can you show the formula?
    private double quadraticBezier(double progress, double min, double max, double total) {
        return quadraticBezier0((progress / total), min, max, min);
    }

    private double quadraticBezier0(double t, double start, double end, double intersect) {
        double scalar = (1.0 - t);

        double firstToIntersect = scalar * ((scalar * start) + (t * intersect));
        double intersectToSecond = t * ((scalar * intersect) + (t * end));

        return firstToIntersect + intersectToSecond;
    }

i use this to determine the cost.

tender shard
jagged quail
#

in help-development

strong parcel
#

He wants help developing his unban request

night barn
strong parcel
#

You're gonna want to e.getplayer.setbanned(false)

tender shard
hasty prawn
#

Why would they need to instantly upgrade a million times though

tall dragon
#

well they dont. but server owners have the possibility to configure it that way

tall dragon
#

because owner also have the possibility of changing how its calculated

crimson terrace
#

hey there, I'm trying to make a system which tracks what player has done the most damage to certain Monsters.

my current idea of a solution is to have a hashmap, which stores the uuids of the damagers (only players) and the Double damageDone inside another hashmap which stores the damaged entities UUIDs along with that first hashmap. (The Monsters I want to track for are rather rare)

My current problem is that I assume it will be rather resource intensive to track the damage done and update the hashmaps accordingly, as currently I only see the solution of listing all contents of the inner hashmap inside 2 lists to return the maximum value, aka the max damage. is there any other way of going through a hashmap and returning the key and value of the maximum value found?

ivory sleet
#

Composition

tender shard
ebon stratus
#

Hi! Im trying to modify the give command to add my custom items, i used the TabCompleteEvent to modify the items list, but it doesn't fire, any help?

tall dragon
#

it would be a bit weird to just not show the price xD

#

i mean i guess i could calculate it async and have the player wait for a bit for the gui to open but thats also not ideal

tardy flame
#

So you can have like: "Updating values"

tall dragon
#

hmmm thats actually not a bad idea

tardy flame
#

And then replace them

tall dragon
#

i can have it say "calculating" or something

tardy flame
#

Yhm

tall dragon
#

had not thought of that yet

tender shard
#

is there command like mvn shade:explain that explains to me why a certain class doesn't get shaded?

tall dragon
quaint mantle
golden turret
#

wtf is bounce

quaint mantle
#

maybe you enabled that

quaint mantle
tender shard
#

it's working in all my other plugins with similar settings so I am confused

quaint mantle
#

somewhere in your code

#
/*
 * This block prevents the Maven Shade plugin to remove the specified classes
 */
static {
    @SuppressWarnings ("unused") Class<?>[] classes = new Class<?>[] {
        JButton.class,
        JMenu.class,
        JMenuBar.class,
        JMenuItem.class
    };
}
tender shard
mellow edge
#

is spigot server open source?

quaint mantle
#

?stash

undone axleBOT
tender shard
#

I relocated it to de.jeff_media instead of com.jeff_media so of course I didn't see it

#

it was actually shaded exactly as I specified it lmao

gleaming grove
#

Hi could someone recommend me some Websocket API for java? Currently i'm using org.java_websocket but websocket connection is not closing when plugin gets disable so Port gets forever stuck

eternal oxide
#

release it in your onDisable method

gleaming grove
#

i do

lilac dagger
#

there's a packet that tells the movement

glossy venture
#

does craftbukkit just wrap nms

lilac dagger
#

yes orby

glossy venture
#

or is it a whole different copy

lilac dagger
#

most of it anyway

#

it technically builds on top of nms

glossy venture
#

so does a CraftItemStack have a reference to a net.minecraft.world.item.ItemStack

lilac dagger
#

and then exposes stuff from the nms

#

not all classes are a counterpart of their nms

glossy venture
#

true

lilac dagger
#

craftitemstack as i remember is just a util

manic delta
#

Guys, does anyone know how to fix this? I've noticed that my scoreboard flickers (watch the video to understand) I don't know why it does it and I don't have the slightest idea how to fix it

glossy venture
#

OH FUCK

#

IT DOES

#

it wraps the item stack

#

thats actually amazing

tender shard
#

that's the whole idea of craftbukkit

glossy venture
#

i thought it made a whole different copy

#

lmao

manic delta
#

wrong video

lilac dagger
#

i don't know that class

lilac dagger
#

it was just a util

glossy venture
#

i mean it seems better for performance

#

instead of copying literally everything

#

so it makes sense

glossy venture
manic delta
#

yes

glossy venture
#

due to the CraftItemStack.as{}Copy(...)

lost matrix
# manic delta

This is a really old issue. Just search for it on your fav. engine and go through the forum posts.

lost matrix
manic delta
#

i dont like 1.9+ pvp

delicate lynx
#

that's your problem then

manic delta
#

see this

#

for some reason it ignores the first 2 lines

#

this should be the normal scoreboard ๐Ÿ’€

#

i just see an api on github, thanks

hollow bluff
#

@manic delta use scoreboard teams

manic delta
#

thanks

glossy venture
#

ah you can create custom nbt tag types

#

cool

#

kinda confusing that net.minecraft.tags.Tag<T> and net.minecraft.nbt.Tag are called the same

#

i wouldve just kept is as NBTTag in the mappings

#

or is this what mojang uses

tardy delta
#

the name above its head? packets or scoreboards

glossy venture
#

yeah using packets

#

you need to respawn the player client side for everyone with a different name and/or skin

#

ill write it in pseudo code

#

because tbh i dont know the specifics either

tender shard
#

oh man, generics can get really complicated lol. I wonder if I'll get this to work somehow lmao

package com.jeff_media.morepersistentdatatypes;

import org.bukkit.persistence.PersistentDataAdapterContext;
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;


import java.util.Collection;

public class DataCollection
        <C extends Collection<D>,D extends PersistentDataType<?,D>>
        implements PersistentDataType<PersistentDataContainer,C> {

    private final Class<C> collectionClazz;
    private final Class<D> dataTypeClazz;

    public DataCollection(Class<C> collectionClazz, Class<D> dataTypeClazz) {
        this.collectionClazz = collectionClazz;
        this.dataTypeClazz = dataTypeClazz;
    }

    @NotNull
    @Override
    public Class<PersistentDataContainer> getPrimitiveType() {
        return PersistentDataContainer.class;
    }

    @NotNull
    @Override
    public Class<C> getComplexType() {
        return collectionClazz;
    }
tardy delta
#

my eyes

glossy venture
#
List<UUID> disguised = new ArrayList<>();

public void disguise(Player p) {
  disguised.add(p);
  // disguise for all online players
  for (Player online : Bukkit.getOnlinePlayers())
    disguiseFor(online, p);
}

public void disguiseFor(Player to, Player toDisguise) {
  // send an entity destroy packet to the player
  // to destroy the old player entity
  
  // respawn the player entity with an entity create packet
  // name the entity with an entity name packet
}

@EventHandler
public void onJoin(PlayerJoinEvent e) {
  // disguise all players that need to be on join
  for (Player p : disguised)
    disguiseFor(e.getPlayer(), p);
}
lilac dagger
#

people used that to circumvent the class namespace

glossy venture
#

i always do klass when needed

#

one letter change

lilac dagger
#

that looks worse than clazz in my opinion

glossy venture
#

why?

quaint mantle
#

its faster

glossy venture
#

doesnt matter right

quaint mantle
#

it does

#

set doesnt keep order

#

you dont need order here

#

so you use set

glossy venture
#

true

lilac dagger
#

set can go to o(1)

#

which is always faster than o(n)

glossy venture
#

for removal yeah

lilac dagger
#

contains and add

#

iterator is slower however

tender shard
lilac dagger
#

because of all the empty spaces it may contain

tardy delta
#

no duplicate elements

tender shard
#

I always used clazz and Clazz

quaint mantle
#

Clazz

#

exactly

tender shard
#

in my java book they say Clasz

tardy delta
#

also faster and fancier ๐Ÿฅบ

lilac dagger
#

why do they hate Class so much?

tender shard
#

clazz looks like the h4xX0r version of class

tardy delta
#

Klatz

tender shard
#

it's like naming your variable True

#

or naming a method For

tardy delta
#

possible

#

True

lilac dagger
grim ice
#

even though im not as good

lilac dagger
#

but if it's something like prefixClass, i don't see the issue

glossy venture
#

plus i dont know how pdc works so i have no clue what any of this means

tender shard
tardy delta
#

generics

tender shard
#

yeah it's actually obvious

#

C = Collection

#

D = DataType

grim ice
#

yeah

tardy delta
#

oh OOOH

grim ice
#

what i did in my library is i commented what each generic means

tender shard
#

what I don't get is why the default uses T,Z for data types

#

what does T mean? or Z?

tender shard
#

and Z?

quaint mantle
grim ice
#

i dont see anyone using Z

tender shard
#

I would have named it P and C, for primitive and complex

quaint mantle
#

idk why

tender shard
grim ice
#

E,K,N,T,S,V,U

#

those are what I usually see

lilac dagger
#

^

tender shard
#

I understand K,V for maps

kindred valley
#

How can i get iterator.next method as an integer

tender shard
#

but in most other cases, people seem to use ANY letter they just randomly thought of

grim ice
tender shard
grim ice
#

or at least doesnt follow naming conventions, an unwritten one if it doesnt exist

kindred valley
tender shard
#
List<Integer> list = new ArrayList<>();
Iterator<Integer> it = list.iterator();
int firstInt = it.next();
tardy delta
#

the class has to implement Comparable?

tender shard
tardy delta
#

or am i understanding it wrongly

kindred valley
tender shard
#

you can't iterate over a hashmap in the first place

#

you can merely iterate over it's keys, values, or entryset

kindred valley
#

Yes

tender shard
#

so what are you actually iterating over?

glossy venture
#

i love atom material icons, except the interface icon

kindred valley
#

Want to get the integer

tardy delta
#

iterate over the values

tender shard
grim ice
#

Iterator<T>
T next();
the same generic is used

kindred valley
tender shard
#

just do getValue on the entry

grim ice
#

ur doing smth wrong

#

ye

tardy delta
#

so what are you trying to do?

tender shard
#

Iterator<Entry<String,Integer>> it = map.entrySet().iterator();
int number = it.next().getValue();

tardy delta
#

if you only want the integers
map.values().iterator()

grim ice
#

is making client side hacks disallowed here btw

#

just wondering since while googling about randomness ive found ppl making autoclickers so i thought to make one for fun

#

though i may ask questions about it here and i wonder if its allowed or not

kindred valley
#

Is this true?

lilac dagger
#

yes

tender shard
#

no

lilac dagger
#

wait no

#

that's an entry not the set

tender shard
#

?learnjava pls

undone axleBOT
tender shard
#

what do you think? Is this bad practice if I don't have and don't want to use any plugin for a namespacedkey?

lilac dagger
#

i think it's something like Iterator<Map.Entry<A, B>> it = map.entrySet().iterator();

glossy venture
#

with a string namespace

tender shard
tender shard
glossy venture
grim ice
#

"Represents a String based key which consists of two components - a namespace and a key" and you're only using a string, which defeats the point

glossy venture
#

also makes more sense but not a big deal

lime jolt
#

can you do Thread.sleep if it is not in the main class?

tender shard
grim ice
grim ice
#

worse*

tardy delta
#

if youre using the factory method the thing is minecraft:yourstuff

tender shard
glossy venture
#

it does the exact same thing

lime jolt
glossy venture
#

fromString("a:b") just calls new NamespacedKey(a, b)

#

at least that would make sense

grim ice
glossy venture
#

i dont think it will resolve the plugin and then make the key

#

so youre doing the same thing but more inefficient

grim ice
#

sure if it doesnt break the method contract

tender shard
tender shard
lime jolt
#

only async

#

alright

#

thx

grim ice
#

in simple terms, classes dont matter with multithreading

#

except if they're a runnable

#

or a thread

grim ice
glossy venture
#

its not for performance it just seems more logical and 'clean'

#

because now your just concatenating a string and then parsing it?

tardy delta
lime jolt
#

when I run a runTaskTimer asycronisly will it forever loop, or will it only do it once

grim ice
#

Not sure

tardy delta
#

forever

lime jolt
#

cool

#

thanks

tardy delta
#

until you cancel it

glossy venture
#

its like placing two lego bricks on eachother and then splitting them apart painfully again

lime jolt
#

got it

tender shard
glossy venture
#

yep

tender shard
#

lol we seem to have different opinions about what's clean and what isn't

glossy venture
#

i usually ignore deprecated stuff also paper deprecated like the whole fucking net.md_5.bungee.api.ChatColor

#

well i try not to use deprecated stuff

#

but there has to be a good reason for it

strong parcel
tender shard
grim ice
#

Joseph M. Newcomer @glossy venture

#

ever heard of that

glossy venture
#

its annoying af

grim ice
#

"Optimization matters only when it matters"

tender shard
glossy venture
grim ice
#

" When it matters, it matters a lot"

#

Actually

#

It doesn't look any more readable, even if it does

#

a one line comment can fix it