#help-development

1 messages ยท Page 367 of 1

silent musk
#

Im gonna do some tinkering I suppose

wet breach
#

just move the eventhandling methods to the class that extends gui

regal scaffold
wet breach
#

and the registering

regal scaffold
#

Forst I will cryu

#

Heads up

#

I will straight up cry

wet breach
#

why?

regal scaffold
#

If it works

#

I will cry

wet breach
silent musk
#

Yes that is true, but I'd rather have those events in the abstract class, since I have many more menus extending from GUI, and otherwise I have to duplicate so much code

#

BUt if it turns out it's the only way, then I will do that for sure

#

I have one more trick up my sleeve

wet breach
#

lol ok

regal scaffold
#

Why am I not getting this error

#

?paste

undone axleBOT
regal scaffold
#

Vault was never giving me issues before

#
    private boolean setupChat() {
        RegisteredServiceProvider<Chat> rsp = getServer().getServicesManager().getRegistration(Chat.class);
        chat = rsp.getProvider();
        return chat != null;
    }
lost matrix
#

Just glimpsed over here. I am hoping nobody here registers a new Listener for every GUI they have...

silent musk
#

Its a work in progress ๐Ÿ˜‡ ๐Ÿ˜‡ ๐Ÿ˜‡ ๐Ÿ˜‡

wet breach
eternal oxide
#

always 1 listner with a map of inventories

regal scaffold
#

yeah, I'm doing something else rn 1 sec

wet breach
silent musk
#

I will change it

wet breach
#

which just add a depends to your plugin.yml

lost matrix
#

Yeah one listener and then delegate the events to every inventory handler

regal scaffold
#

It is there

#

Which is why I'm confused

#
depend: [Vault]
softdepend: [PlaceholderAPI]
wet breach
silent musk
#

OOoooh

regal scaffold
#

Nothing at all

#

Doesn't even depend on it

#

Only same one is Placeholderapi

wet breach
#

what are you using for chat?

regal scaffold
#

The plugin Im making xd

wet breach
#

so betterprefix is for chat

regal scaffold
#

Yes

wet breach
#

and you are trying to obtain your own service provider for chat from vault?

#

which would ultimately fetch yours

regal scaffold
#

I use vault to get the Players prefix

#

getChat().getPlayerPrefix(player);

wet breach
#

why is that necessary if your plugin is for chat o.O

regal scaffold
#

My plugin just adds prefixes

wet breach
#

what other chat are you trying to get it from is what I am asking essentially lmao

regal scaffold
#

And was working perfectly without these nte shenanigans

#

Well I was using it before and it was working correctly tho

#

Just having nte as a jar is the difference

#

Well and all we've done to it

wet breach
#

maybe you are making it getting invoked more then once? lol

#

have no idea

#

but something is accessing it even though it returned null

regal scaffold
#

I am accessing it it should just never return null

wet breach
#

ok, but you shouldn't be assuming it isn't null either

#

otherwise pointless to return a bool

regal scaffold
#

But regardless it shouldn't be null

#

That's because it checks that it can register first

#

I use that

#

OK

#

Fixed it

#

Obviously there was something missing...

#

We have a chat plugin that gets prefixes

Using vault to get them

#

Where was the permissions plugin XD

wet breach
#

the permissions plugin doesn't have an api?

#

which is where I am assuming you are pulling prefixes from

regal scaffold
#

Yes

#

I just never added the permissions plugins jar

#

lol

#

To the test environment

#

Now I need 1 more thing and Im done here frost

#

How can I reduce the size of this massive jar

#

It went from 30kb to 4mb

#

Holy shit it works btw โค๏ธ

wet breach
twin venture
#

ok 1 thing i didn't do is :

  • if player join arena : save his inventory -> and remove any item from his inv and armor

if he leave the arena or leave the server
give him the items back

wet breach
#

you essentially have two plugins compiled as one

regal scaffold
#

But nte alone is 300kb

#

Not 4mb

wet breach
#

well NTE is probably the larger of the two

regal scaffold
#

310kb nte + 31kb mine does not = 4mb

#

So nothing I can do to reduce the size

wet breach
#

most likely not, but still not sure why it is a concern lol

regal scaffold
#

It isn't I just liked having a 30kb plugin

wet breach
#

well

#

open it up

regal scaffold
#

There is so much

wet breach
#

make sure you like didn't shade the paper api or spigot

#

pretty sure you did

regal scaffold
#

It's

#

common.lang

#

Entirely

wet breach
#

remove it

rough drift
#

"why is my jar so big I just shaded nms so that I can use it on spigot"

  • Someone, probably
wet breach
#

lmao

regal scaffold
#

XD

#

Do I not need to have it shaded?

wet breach
#

you need to add <scope>provided</scope> to any dependencies you don't want to get shaded in

rough drift
#

included in spigot

wet breach
#

^

regal scaffold
#

Oh

#

Ok ok gotcha

#

Thanks

#

And simple-json too?

wet breach
#

spigot already has it

#

which means so does paper

regal scaffold
#

What is HikariCP

wet breach
#

connectionpool lib

#

not part of spigot or paper

regal scaffold
#

And google guava

wet breach
#

provided ๐Ÿ™‚

regal scaffold
#

What is scope system?

rough drift
#

you want it shaded or not

regal scaffold
#
        <dependency>
            <groupId>ninja.leaping.permissionsex</groupId>
            <artifactId>permissionsex-parent</artifactId>
            <version>2.0-SNAPSHOT</version>
            <scope>system</scope>
            <systemPath>${basedir}/lib/PermissionsEx.jar</systemPath>
        </dependency>
rough drift
#

basically that

wet breach
#

means the dependency is only found on the system

rough drift
#

oh

#

I thought they meant what are scopes

#

my bad

wet breach
#

lol

regal scaffold
#

yeah mb mb lmao

#

Bad wording

#

What is the type of scope "system"

rough drift
#

oh

#

basically makes it so you also add a path to the .jar

#

so you can have .jar dependencies

wet breach
#

it is as I said, the dependency can only be found on the system, with the path provided

regal scaffold
#

Bro pex is dead, getting removed

wet breach
#

it won't be found in a repo thus it tells maven to not try to find it there

regal scaffold
#

Essentials group manager ๐Ÿ˜‚

rough drift
#

bro what pom do you have

wet breach
#

what did you do

#

shade everything?

rough drift
#

why do you need so many dependencies

regal scaffold
#

Probably the oldest poms

#

In the entire world

#

Like wtf

wet breach
#

lol

rough drift
#

nah you got the whole of the central repo as a dependency

regal scaffold
#

lmaoo

#

LOL

#

They were set to system

#

But I'm straight up removing them

#

6gb jar incoming tho

wet breach
#

because most of those dependencies

#

can't be found no more

#

but someone wants to maintain compatibility

rough drift
regal scaffold
#

Well now it won't even look for them

#

cya dependencies

wet breach
#

not that it would anyways

#

because like who is running those old economy plugins that wouldn't work anymore anyways

regal scaffold
#

Ok

wet breach
#

bet you it has a dependency for Iconomy

regal scaffold
#

After removing the shade for the entire central repo

#

The new jar size is:

rapid aspen
#

how can i make a menu like this?

regal scaffold
#

693kb

#

There we go

rough drift
#

Economy plugin is so old it's still using bartering ๐Ÿ’€

wet breach
#

lol

regal scaffold
#

Much nicer

#

LMAO

twin venture
wet breach
#

you should have a backup in case of a server crash

#

so just store their inventory in a PDC chunk

rough drift
#

or

wet breach
#

temporarily

rough drift
#

frost

rapid aspen
rough drift
#

store it on the player itself

rough drift
#

where

wet breach
chrome beacon
rapid aspen
rough drift
#

hell iirc there is a saveplayer

wet breach
wet breach
#

then they should use that right after

rough drift
rough drift
rapid aspen
#

ok

rapid aspen
#

ill just stick with the inventory gui

rough drift
#

i forgor how to type it lmao

wet breach
#

lmao

#

shame they botched the live action movie of that show

rough drift
#

fr

wet breach
#

like literally the ending is like the best bit and that is it

rough drift
#

if you want spoil it, won't watch it anyways

#

don't spoil legend of korra, still watching that one lmfao

wet breach
#

lol

regal scaffold
#
player.setDisplayName(colorize(prefix + " " + player.getName() + " " + suffix + ChatColor.RESET));
#

Why does that line not include spaces

wet breach
#

which line?

rough drift
#

the display name

regal scaffold
#

I assume the display name is what gets displayed in tab correct?

rough drift
#

they likely want ADMIN NTSans_

rough drift
#

try setTabListName

regal scaffold
#

Oh

#

setTabListName not a thing?

rough drift
#

hm?

regal scaffold
#

setPlayerListName()

rough drift
#

ah yeah

#

My bad

wet breach
regal scaffold
#

indeed

wet breach
#

we can't always remember every little thing, I mean its impressive as is that most of what I help with I am not even using my IDE ๐Ÿ˜›

#

like your little project

rough drift
#

I gathered all my knowledge from looking at the API when I was trying to get fabrigot working lol

wet breach
#

all of that was from just me remembering ๐Ÿ™‚

rough drift
#

TIL there is updateCommands on players

wet breach
#

lol

rough drift
#

so much useful shit fr

#

there is so much shit in the api

#

though there should be a more clean way of doing things

twin venture
#

mm is this good way to save player inventory in yaml file when he join the arena :
and load it after he leavearena

rough drift
#

(such as I'd prefer getLevels().getCurrentLevel(), getLevels().getCurrentExp(), getLevels().getTotalExp(), getLevels().getRemainingExp() would be nicer tbh)

rough drift
#

there is a way better way

regal scaffold
#

Considering it worked

#

And you had to instruct someone else, not even do it yourself

rough drift
#

Basically use PDC to store an array of item stacks, then right after call saveData, once a player exists re-load from PDC

#

player.getAddress().sendCake();

wet breach
#

but otherwise I been playing my games all this time ๐Ÿ˜„

rough drift
#

I should be writing an essay

#

nah

wet breach
#

just multi-task

#

write the essay and play games at the same time

#

use speech to text

rough drift
#

I am, 99% spigot help-dev and 1% essay

wet breach
#

I like that dragon software for such things

tardy delta
#

dont write stuff about games on your essay

wet breach
#

pretty decent

rough drift
#

I remember seeing this dude in 2015 with a stt phone

#

It was stunning how well it worked lmao

#

(I didn't realize it at the time, but it was making like no mistakes)

wet breach
#

well it probably missed out on punctuation marks

rough drift
#

nope

#

you told it manually ๐Ÿ˜‚

wet breach
#

then it had to be using an online service

rough drift
#

like "COMMA, DOT, EXCLAMATION"

wet breach
#

well that is what I meant

rough drift
#

"Hello COMMA how are you doing QUESTION MARK"

wet breach
#

that is how the dragon software works for the most part

regal scaffold
#

Can I force a specific java version to be used on startup.bat?

rough drift
#

I mean it can probs figure it out

#

sentence structure

rough drift
#

well

#

actually yes

wet breach
rough drift
#

Why is this a thing

#

lmao

#

Being completely honest

wet breach
#

it can be used like a loading screen

rough drift
#

It could be used for like yes/no

#

like a binary option menu

wet breach
#

the picture of the screen on that page

#

to the right is the demo screen

rough drift
wet breach
#

yes

rough drift
#

you can re-name it so that it shows yes and no

wet breach
#

indeed or any other option

#

and custom text

#

etc

rough drift
#

nice

wet breach
#

niche stuff people forget are there or don't realize

#

like the conversation api

#

for example

#

and some other stuff

rough drift
#

I even forgor about the convo api

rapid aspen
#

hi, i want to remove the usages of IntellJ, i already disable this and it still have the usages

tardy delta
#

isnt that supposed to be 29? (a+b)^2 -> aยฒ+2ab+bยฒ

rough drift
#

5^2 is 25

earnest forum
#

lol

tardy delta
#

well idk but i learnt years ago that (a+b)^2 is aยฒ+2ab+bยฒ

eternal oxide
#

Shoot your teacher

rough drift
#

(a+b)^2

is c * c

#

because c = (a + b)

#

and then it's just a power

regal scaffold
#

Man why the f do I need a oracle account

#

Which has the most insane password requirements

#

To download a old java version

tardy delta
#

imma leave it like this then

eternal oxide
#

use adopt open JDK not oracle

#

oracle needs to die

rough drift
#

it won't

eternal oxide
#

They want to copyright APIs

#

worst idea ever

tardy delta
#

๐Ÿ’€

tender shard
#

binomic*

#

whatever it is in english

tardy delta
#

maths go brr

rough drift
#

it's much simpler

ebon vortex
regal scaffold
#

How can I check when something like setPlayerTabName() was added to the spigotAPI

#

Like what version

chrome beacon
#

help chat has all the javadocs

regal scaffold
#

wym

chrome beacon
regal scaffold
#

1.14 it is

#

Thanks!

rapid aspen
#

hi, i want to remove the usages of IntellJ, i already disable this and it still have the usages

rapid aspen
#

ok thanks

summer walrus
#

Hey, is it possible to change the tablist for only a specific player?

lost matrix
tender shard
summer walrus
lost matrix
#

Ah

chrome beacon
summer walrus
lost matrix
tender shard
chrome beacon
lost matrix
#

LinkedTreeSet with a Comparator ๐Ÿ˜„
Then you dont risk duplicate entries

summer walrus
#

how do i send packets manually then

lost matrix
chrome beacon
#

^^

#

( or packet events )

summer walrus
#

i already checked out protocol lib but i couldn't understand how i'm supposed to use it

chrome beacon
#

It can be a bit complex at first but take a look at PacketWrapper and it should contain what you need. Might be a bit outdated though... depends on what version you're targeting but you can learn from it

tender shard
lost matrix
#

Wait its just TreeSet

final monolith
summer walrus
tender shard
#

I don't want to sort the blocks by something that's inherent to the block

summer walrus
#

right now i'm trying to target the latest version so i'm hoping it'll work

final monolith
chrome beacon
tender shard
#

basically I just shuffle the collection once and then keep that order

summer walrus
#

am i looking at the wrong repository then?

lost matrix
chrome beacon
final monolith
#

im running with -e flags, give me a sec

lost matrix
summer walrus
chrome beacon
#

outdated readme

lost matrix
#

PacketWrapper is outdated af. Half of it is broken.

chrome beacon
#

True but you can learn from it

chrome beacon
#

You get the general idea of how to read and write to packets

lost matrix
final monolith
lost matrix
#

maven special sources. To get mojang mapped nms

final monolith
#

no

summer walrus
#

ngl this looks like a pain in the ass

final monolith
#

im not even using the NMS on the maven

tender shard
final monolith
#

using the spigot-api dpeendencyu

tender shard
#

to run maven

final monolith
tender shard
#

which exact version

#

java -version

final monolith
#

jre1.8.0_361

final monolith
tender shard
#

jre? how can you compile using jre?

#

or are you using the eclipse compiler?

summer walrus
#

is NMS any easier than protocol lib?

final monolith
# tender shard `java -version`

openjdk version "17.0.5" 2022-10-18
OpenJDK Runtime Environment JBR-17.0.5+1-653.25-jcef (build 17.0.5+1-b653.25)
OpenJDK 64-Bit Server VM JBR-17.0.5+1-653.25-jcef (build 17.0.5+1-b653.25, mixed
mode)

lost matrix
tender shard
#

what is it actually that you are invoking maven with?

#

just see the very first lines of the maven output

tender shard
#

codes/laivy/npc/LaivyNPC.class
is this from your plugin, or a dependency?

final monolith
lost matrix
summer walrus
#

does it have any documentation?

tender shard
#

paste your entire pom.xml pls

final monolith
tender shard
#

erm why do you shade jetbrains annotations

#

also get rid of the <finalName> and <outputDirectory> in your maven-shade-plugin, that's prone to break things

lost matrix
#

Hm you could try updating the maven shade plugin to the latest version 3.4.1
Probably not the cause but worth a try

tender shard
#

also I've read stuff about java8 type-annotations breaking the maven-shade-plugin when using certain java 8 versions

#

jdk1.8.0_202

#

maybe that's th eissue

#

just try to run it using java 17 and see again

lost matrix
#

Imagine being 11 major java releases behind

tender shard
final monolith
final monolith
tender shard
#

aaaaaand, just like you, they were using java 8 type annotations

tender shard
#

you go to File -> Project Settings and set the JDK to 17

final monolith
#

If i change to java 17 i will need to change a lot of code lines

tender shard
#

how that

final monolith
#

wait, let me see

lost matrix
tender shard
#

yeah

#

also java 8 code should work on java 17 just fine

lost matrix
#

That too

tender shard
final monolith
#

rn

tender shard
#

File -> Project Sturcutre -> JDK 17, compile again

#

it'll still work on java 8

#

alternatively, not shading the jetbrains annotations will probably also fix the problem

final monolith
#

compiling...

tender shard
#

it's useless to shade them anyway

lost matrix
#

Well thats my cue

final monolith
#

now that

#

i really doesn't like particular using Maven, its... slow and so complex

tender shard
#

remove the jetbrains annotations from your shaded .jar

#

set its scope to "provided" and remove it from the <includes> in maven-shade

tender shard
#

Have you tried โ€žmvn cleanโ€œ before running package again?

#

Otherwise, i also dont have any ideas anymore

final monolith
#

let me see

final monolith
#

๐Ÿค”

hazy parrot
#

yeah clean cant really fail

final monolith
#

thats why i have maven

#

xD

tardy delta
#

what did i do

tender shard
# final monolith thats why i have maven

it didnt work before because you didnt "clean" after doing changes to your pom, so there was still bullshit around in your "work" folder or however it's called

#

usually you run clean after doing changes to the pom

#

it was a bug in ASM, not in maven, btw - and yeah, probably related to the issue I linked earlier about java 8 type annotations

#

not 100 % sure, but as long as it works now, all good

#

if you wanna find out what exactly the issue was, try to use java 8 again to compile, then if it fails, remove all those Nullable and NotNull annotations in your class, if it works now it's related to the bug report I sent

final monolith
#

ok i really couldnt remove all the @urban grotto, @Nullable, @Experimental and @Internal annotations xD

tender shard
final monolith
#

its more than 1k

final monolith
#

i've done mvn clean, and mvn package in the order

tender shard
#

still working, or still broken? ๐Ÿ˜„

final monolith
#

broken xD

tender shard
#

then I am out of ideas

final monolith
#

do you know any other compiler? im sick of using maven, its so much problems

tender shard
#

if you're using java 17, and are NOT shading jetbrains annotations, then no idea what it could be

tender shard
#

but ofc there are other build systems. gradle, ant, ...

lost matrix
#

Is your project in a cloud drive?

final monolith
lost matrix
#

...

final monolith
#

i dont think its a problem, i use that way for months

tender shard
#

just send a link and let us try to compile

final monolith
#

just today it started to happen suddenly

final monolith
lost matrix
#

Yeah but you have no idea which parts are cached (And when they suddenly get uncached). I have seen so many problems with cloud drives. Especially when the maven repo is not on the same drive

final monolith
#

i will try to compile another plugin on the cloud and see what happens

#

apparently its just with this plugin, others runs ok

lost matrix
#

95% sure its a problem with your local dependency

#
        <dependency>
            <groupId>codes.laivy</groupId>
            <artifactId>LvMultiplesLanguages</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/../LvMultiplesLanguages/LvMultiplesLanguages.jar</systemPath>
        </dependency>

Put the dependency on a concrete dir on your system and change the systemPath. Then try again.

tender shard
#

using systemPath in the project.basedir is deprecated anyway

final monolith
#

i will try removing it, not sure if it is, because im using that for months

tender shard
#

why don't you just let maven handle that dependency? or is LvMultiplesLanguages not a maven project?

#

If so you can still manually install it with mvn istall:install-file

final monolith
#

not done yet

#

im using that system scope then

tender shard
#

why would you need system scope if you have a repository?

#

the whole reason for a repository is there to avoid using any hardcoded paths

final monolith
#

not yet

tender shard
#

yeah anyway, systempath isnt the problem, still it's nasty and and should be avoided

final monolith
lost matrix
#

Show your new pom

final monolith
#

ok, i will paste the new pom and the error

#

i've tried invalidate all caches, restart the computer, and still with that

lost matrix
#

Try not to shade gson in

chrome beacon
#

Try not running in what I assume is a google drive folder
and not using the systemPath dependency

orchid gazelle
#

hi

final monolith
# lost matrix Try not to shade gson in

ok, i will try

    <build>
        <sourceDirectory>
            src/main/java
        </sourceDirectory>
        <testSourceDirectory>
            src/test/java
        </testSourceDirectory>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>
                    ${project.basedir}/src/test/resources
                </directory>
            </testResource>
        </testResources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.4.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>

                        <configuration>
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

and provided scope.

orchid gazelle
#

ok so I am still on the performance-issue with the multiblock-changes(fake-block-packets). I have not even been able to find anything why the client would lag out on such a small amount of blocks

lost matrix
#

What mc version?

chrome beacon
#

I've been using massive amount of block changes without any major lag

orchid gazelle
lost matrix
#

Thats a bit weird then

orchid gazelle
#

its only 100/t

lost matrix
#

I can as well send a ton of blocks without any major lags

orchid gazelle
chrome beacon
#

I have a 10 year old CPU with an 8 year old GPU

final monolith
#

removed all relocations and compile scopes

#

worked

orchid gazelle
chrome beacon
#

I was running IJ + Server + 2 Mc instances

orchid gazelle
#

im running eclipse + Server + 1x Instance

lost matrix
final monolith
#

i need to shade then

#

xD

sage patio
#

how can i change this to 3 blocks? like > 10% Gold, 20% Coal & 70% Iron

chrome beacon
lost matrix
#

Googles range map is decent for this

tender shard
#

are you doing that outside of a code block? o0

sage patio
#

no

orchid gazelle
#

you can see how bad this works

tender shard
#

I'm sending random blockchanges for about 3x3 chunks with random blocks for every already occupied block, and not even that causes huge lags

lost matrix
# sage patio like this?

I mean you can do that but using a RangeMap is more scalable

  private final RangeMap<Integer, Material> materialRangeMap = new ImmutableRangeMap.Builder<Integer, Material>()
          .put(Range.atLeast(10), Material.GOLD_ORE)
          .put(Range.openClosed(10, 30), Material.COAL_ORE)
          .put(Range.greaterThan(30), Material.IRON_ORE)
          .build();
  
  public void something() {
    int random = ThreadLocalRandom.current().nextInt(0, 100);
    Material material = materialRangeMap.get(random);
  }
summer agate
orchid gazelle
tender shard
#

ok it DOES cause lag, but not because of the blockchanges itself, but because of rendering all these funny blocks

tender shard
#
public class TestSpigot extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        getCommand("test").setExecutor(this);
    }

    private static Material[] blocks = Arrays.stream(Material.values()).filter(Material::isBlock).toArray(Material[]::new);

    private static Material getMaterial() {
        return blocks[ThreadLocalRandom.current().nextInt(blocks.length)];
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        //Set<Location> locations = new HashSet<>();
        Player player = (Player) sender;
        for(int y = 0; y < 100; y++) {
            for(int x = player.getLocation().getBlockX() - 10; x < player.getLocation().getBlockX() + 10; x++) {
                for(int z = player.getLocation().getBlockZ() - 10; z < player.getLocation().getBlockZ() + 10; z++) {
                    Block block = player.getWorld().getBlockAt(x,y,z);
                    if(!block.getType().isAir()) {
                        player.sendBlockChange(block.getLocation(), Bukkit.createBlockData(getMaterial()));
                    }
                }
            }
        }
        return true;
    }
#

just some funny stuff I made to test this quickly

orchid gazelle
#

hmmm im using Player#sendBlockChanges which should even be a lot faster

tender shard
#

when just using stone, it still takes a while for 20x20x100 blocks, but it doesnt cause any FPS drops

orchid gazelle
#

when using single block changes, its lagging less but still speaking of a LOT of spiking

dry yacht
tender shard
orchid gazelle
dry yacht
tender shard
#

idk, I'm running vanilla 1.19.3 on an i7 9700K (which already runs at 100%) with a 2080 RTX Super

#

i also just checked on my m2 macbook and there it's even faster

orchid gazelle
dry yacht
orchid gazelle
#

calling MAX 1 per tick

#

but its even lagging when sending a lot less

dry yacht
#

Still wouldn't hurt to check, now would it

tender shard
# dry yacht Just out of curiosity, could you send the player a message like `"done"` after t...
    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        //Set<Location> locations = new HashSet<>();
        Player player = (Player) sender;
        for(int y = 0; y < 100; y++) {
            for(int x = player.getLocation().getBlockX() - 10; x < player.getLocation().getBlockX() + 10; x++) {
                for(int z = player.getLocation().getBlockZ() - 10; z < player.getLocation().getBlockZ() + 10; z++) {
                    Block block = player.getWorld().getBlockAt(x,y,z);
                    if(!block.getType().isAir()) {
                        player.sendBlockChange(block.getLocation(), Bukkit.createBlockData(getMaterial()));
                    }
                }
            }
        }
        Bukkit.broadcastMessage("Done");
        return true;
    }
dry yacht
orchid gazelle
tender shard
#

yeah probably the createBlockData part, since just changing the existing blockstate's type is instantly

orchid gazelle
#

that does not sound like something to do real quick

dry yacht
orchid gazelle
#

alright

dry yacht
tender shard
#

anyway, on the macbook it keeps at ~400 FPS (fast forward to the end of the video)

#

I acidentally started recording when I started typing instead of when I started to test lmao

dire marsh
#

coding with mfnalex episode 1

tender shard
#

note, I set "suppressLightUpdates" to false, so it even also updates the light client side without any FPS issues

#

(on the mac I got sodium installed though, on windows I tested it with vanilla)

lost matrix
orchid gazelle
tender shard
#

999kb

#

Couldnt you have sent 1kb more worth of packets?

lost matrix
#

Also good job discord

tender shard
#

Lol

dry yacht
#

Hmm, you send bursts of multiblock-changes of size 40 at times, don't know if that's actually intended

tender shard
#

But i sent 20x20x100 block changes without problems

lost matrix
#

Thats a lot of multiblock sends for just one second

orchid gazelle
#

20

#

1/tick

dry yacht
#

PacketPlayOutMultiBlockChange is basically a chunk slice, right? So you're updating way too much for your little slice of grass there

orchid gazelle
#

its one for one chunk

dry yacht
orchid gazelle
#

oh nvm

#

its because of air

lost matrix
#

Move event... oof

dry yacht
# orchid gazelle

What size is that schematic? Looks like 32 in depth, but what is it's width?

orchid gazelle
#

it is 20x60

#

about

#

its like 25 blocks more

dry yacht
#

That should be doable with around 8 packets then, shouldn't it? 2 chunks depth, around 4 chunks width. Of course there could be more, if it's not aligned (which it likely isn't), but 20? Hmm, maybe, not sure right now.

#

How do you generate these packets? Still with the API?

orchid gazelle
#

yes

#

Player#sendBlockChanges

#

with suppresslight

dry yacht
# orchid gazelle its because of air

Could you fix that spam by now? Whatever you do, 40 packets per second is very likely just too much. Does it get any less laggy if you constrain yourself to 20/s?

orchid gazelle
#

imma limit it to 10/s rq

tardy delta
#

im kinda surprised that String#formatted doesnt return early when the args.length is 0 :/

orchid gazelle
#
                Bukkit.getScheduler().runTaskLaterAsynchronously(LoopCityScript.plugin, new Runnable() {
                    @Override
                    public void run() {
                        onCooldown = false; 
                    }
                    
                }, 4);
``` like this?
#

when doing this, it still lags the same

iron palm
#

is there any Player instance which would be not null even if no player logged in before?

tardy delta
#

where lambda

lost matrix
iron palm
#

it'd also break up many plugins if i implement Player by my own or either i have to use CraftPlayer

#

idk

lost matrix
#

Yes for that you not only need a Player object, it needs to be a connected one

iron palm
#

should i use sockets for that then?

#

since i need to get some data from bungee on plugin load (getting server names)

lost matrix
#

Is it a public project?

iron palm
#

nah its private

#

what if i make a fake player which has the vps ip and is connected?

restive rapids
#

Is it possible for me to check if a player has clicked an item in a chest inventory while holding CTRL?

dire marsh
lost matrix
restive rapids
#

Because there is a bug were players can hold ctrl + left click and it gives the item to their inventory

#

and players can easily steal items from gui's

dire marsh
#

i think inventorymoveevent handles that?

restive rapids
#

were they are not suppose to

dire marsh
#

I'm not sure though, the inventory api is so fucking awful I can't express it enough

iron palm
lost matrix
iron palm
#

since we're currently using SQL

restive rapids
lost matrix
#

Write stable code

restive rapids
#

well I don't know what its from

dire marsh
#

do you mean shift + left click

restive rapids
#

no

#

Ctrl

dire marsh
#

what version

restive rapids
#

1.12.2

lost matrix
lost matrix
restive rapids
#

I tried debugging it

lost matrix
dire marsh
#

are you sure it's not a ghost item

iron palm
lost matrix
lost matrix
restive rapids
#

oh okay

#

is there a way I can check if a certain gui is open?

#

by a name or something

dire marsh
#

can't you check the inv type

iron palm
dire marsh
#

Inventory#getType

lost matrix
#

on close -> remove it

lost matrix
# iron palm I'd be thankful if you could
    RedissonClient redissonClient = Redisson.create();
    
    // Gat a message channel named "comm"
    RTopic topic = redissonClient.getTopic("comm");
    
    // Register a message listener on the channel
    topic.addListener(String.class, (channel, msg) -> System.out.println("Message on comm: " + msg));
    
    // Send a message on the channel
    topic.publish("Hello World");

If you just use java classes then you can simply send messages like this.
You can also send json Strings ofc. If you have a decent codec then your Topic
can also send complicated objects of any type. But this is as simple as it gets.

iron palm
#

why did minecraft use io netty instead btw

lost matrix
#

Everyone listening on the "comm" channel will receive an event when anyone sends something in there

#

Redisson also uses netty

#

As a backbone

iron palm
#

oh

#

i got it

#

should i compile redis api ?

lost matrix
#

Netty is just a framework for networking. Abstracts away a lot of boilerplate and provides
templates for a lot of protocols like http ssl rtsp etc

lost matrix
#
    RedissonClient redissonClient = Redisson.create();

    RMap<String, Integer> globalMap = redissonClient.getMap("name-of-the-map");

But it doesnt get simpler than that. Any program can basically put data in this map
and every other program has the same view. (High consistency or high availability depending on your settings)

orchid gazelle
lost matrix
orchid gazelle
#

I guess so but its not that often

#

40/t should be fine?

lost matrix
#

40 what per tick

orchid gazelle
#

40 packets

lost matrix
#

40 multiblock packets per tick? This sounds like a gigantic schematic then

orchid gazelle
#

its not gigantic, but it needs to get updated often

lost matrix
#

Update it twice a second

dry yacht
lost matrix
#

Every 10 ticks

orchid gazelle
#

oh vnm

#

btw, when setting a tick-cooldown of 10 ticks, it still lag-spikes

#

40 didn't lag

#

oh nvm 40 still lags

icy beacon
#

what's a kotlin map that I could use to retrieve an entry's position? i think it's a treemap in java but i'm not sure about kotlin

dry yacht
# orchid gazelle there we go with more logging

At first glance it doesn't look wrong to me, as you're sending 256 block updates at a time, which in essence is a 16x16 slice, so exactly what you have to send. I guess you're only going to minimize lag by only sending the blocks that actually changed. I don't see any ways to optimize this further, apart from accepting slower update rates in order to reduce traffic.

orchid gazelle
#

things is that you gotta update ALL blocks in this case

#

since when you change it in the Y-Axis, it is gonna need to update everything

dry yacht
#

I guess you've reached a limitation of the game then. Just debounce updates even further, there's not really a need to have smooth and live movement of huge structures.

icy beacon
orchid gazelle
#

so if the schematic has structures above like 50 blocks, I cannot have live previews?

lost matrix
# icy beacon yep

There is no such collection. Neither in java nor in kotlin.
You could use a linked map and iterate while incrementing an index.

icy beacon
#

ah that's upsetting

lost matrix
#

And there is generally no need for such a map at all

icy beacon
#

well what i do is i sort a map of killstreaks and try to find a player's position there

dry yacht
orchid gazelle
#

then I gotta ask why its lagging when sending it every 2 seconds?

tranquil dome
#

Is it possible to have multiple HoverEvents and ClickEvents in one message?

dry yacht
#

Have you had a look at your logs? You're not only not sending it every two seconds, you're sending a bat shit crazy amount of them.

orchid gazelle
#

yes but I tried it every 2 seconds and it still spiked

dry yacht
#

Don't believe that until I see a log.

icy beacon
#

yeah i think i'll go with that

hasty fog
#

Does FileConfiguration support UTF-8? FileConfiguration.save(File file) keeps converting my files to ASCII

tardy delta
#

cant you provide a charset?

lost matrix
orchid gazelle
tardy delta
#

stuff using utf8

icy beacon
#

i think it's fine for now, if it affects my performance too much i'll look into it further

orchid gazelle
dry yacht
tender shard
lost matrix
#

Try it in a normal world

hasty fog
tardy delta
#

dunno what version you're using tho

icy beacon
orchid gazelle
lost matrix
#

If it works in a normal map then its for sure the lighting. Try it out.

icy beacon
orchid gazelle
#

im using supresslighting but ok

tardy delta
#

-1 + 1 = 0

icy beacon
#

tyty

lost matrix
dry yacht
orchid gazelle
#

player.sendBlockChanges(states, true); supress is on :(

dry yacht
#

I know, but I'd say that this flag should suppress re-calculating lighting for all of these blocks, and it clearly didn't in this case.

orchid gazelle
#

hmm how do I prevent it then?

tardy delta
#

in what method does it say that? thenAccept?

#

thenAccept takes a consumer

#

you cannot return in a future cuz that defeats the point of futures

#

you can return a CF<RankResult>

#

then let the calling code hook in the future by putting the code that would handle RANK_ADDED in the thenAccept etc

icy beacon
#

i want to take a moment to appreciate how supportive this server and community is

#

thanks yall

lost matrix
tardy delta
#

i mean

#

you know what i mean

#

like returning a value async

lost matrix
icy beacon
#

i still do think that spigot is really supportive

icy beacon
#

with some exceptions maybe xD

tardy delta
#

oh ye

lost matrix
#

.exceptionally(t -> PremiumRankResult.ERROR); should work just fine

tardy delta
lost matrix
#

I thought you needed a CF<RankResult>

#

Wait let me check the code...

#
        final long millis = System.currentTimeMillis() + expiry.getExpiry();
        return luckPerms.getUserManager().modifyUser(player.getUniqueId(), (User user) -> {
            user.data().clear(NodeType.INHERITANCE::matches);
            user.data().add(InheritanceNode.builder("premium")
                    .expiry(millis)
                    .build());
            return PremiumRankResult.RANK_ADDED;
        }).exceptionally(throwable -> PremiumRankResult.ERROR);
icy beacon
#

yield maybe?

#

instead of second return

lost matrix
#

Whats the error

icy beacon
#

or is that only for switches

dry yacht
# orchid gazelle hmm how do I prevent it then?

No idea tbh. You could try dispersing the updates and adding a bit of delay between the packets, but I'm not sure whether that would help the situation. One would have to check out how the client actually handles these packets.

icy beacon
#

what does modifyUser return?

lost matrix
#

Ah i see. luckperms uses a non generic CF<Void> return

icy beacon
#

maybe do something like

#
        CF<Void> cfvoid = luckPerms.getUserManager().modifyUser(player.getUniqueId(), (User user) -> {
            user.data().clear(NodeType.INHERITANCE::matches);
            user.data().add(InheritanceNode.builder("premium")
                    .expiry(millis)
                    .build());
            return PremiumRankResult.RANK_ADDED;
        })
        return cfvoid.exceptionally(throwable -> PremiumRankResult.ERROR);
#

to not chain returns

#

ah

lost matrix
#

Well then:

        CompletableFuture<PremiumRankResult> future = new CompletableFuture<>();
        final long millis = System.currentTimeMillis() + expiry.getExpiry();
        luckPerms.getUserManager().modifyUser(player.getUniqueId(), (User user) -> {
            user.data().clear(NodeType.INHERITANCE::matches);
            user.data().add(InheritanceNode.builder("premium")
                    .expiry(millis)
                    .build());
            future.complete(PremiumRankResult.RANK_ADDED);
        });
        return future.exceptionally(throwable -> PremiumRankResult.ERROR);
icy beacon
#

it's not i don't think

lost matrix
#

Ah missed the return

#

You need to append a .thenAccept(rankResult -> {}); on the CF
This will be ran after the CF is completed. If you want to do something

#

spigot related then inside this consumer you need to use the bukkit scheduler

tardy delta
#

i always used my cfs wrongly :((

lost matrix
#

Yes

glossy venture
#

cant you do smth like this

return modifyUser(() -> { ... })
    .thenApply(unused -> SUCCESS)
    .exceptionally(t -> ERROR);
lost matrix
#

Right thats a better approach

ivory sleet
glossy venture
rapid aspen
#

When i click the player head it won't open the other inventory. Its not complete wet i just want help with the inventory not opening

tender shard
#

?paste it

undone axleBOT
tardy delta
#

oh god

tawdry echo
tardy delta
#

<insert itembuilder here>

rapid aspen
tawdry echo
#

and dont nest your code

rapid aspen
#

i will try it it will probrably work but if it wont i tell you

#

ok

twin venture
#

hi , is there a way i can make bots test my plugin?its a minigame? i dont have player base to test with

#

or friends to join my test server :#

twin venture
#

what is that :?#

lost matrix
rapid aspen
delicate lynx
#

using titles to check for custom inventory is not a good idea

icy beacon
#

is OfflinePlayer supported out-of-the-box as an ACF context, or do I have to register it by myself

rapid aspen
tawdry echo
#

just get collection of onlineplayers and foreach

#

tip

#

next tip is to read up on itembuilder

rapid aspen
lost matrix
#

Any exceptions in your console?

rapid aspen
#

oh i just figured out

#

im so dumb

#

im not opening the inventory

#

i think the event is not firing, i put this "player.sendMessage("HI");" after i set the variable player and it dont send me a message

#

when i click the inventory

remote swallow
#

is it registered

rapid aspen
#

as i said: im so dumb

#

๐Ÿ˜ญ

#

thx

sterile token
#

Gold, you should take your time to carefully look your code, some minutes

rapid aspen
#

if (e.getView().getTitle().equalsIgnoreCase("Lista de Jogadores")) return;

sterile token
#

Because if not its realy easy i just have an issue and ask for help, without atleast looking what is the issue

sterile token
rapid aspen
#

thx i forgot it

rapid aspen
sterile token
#

right, so only equals, mainly comparing the whole object?

#

Perfect thanks morice, i will keep your update

rotund ravine
#

== is also fine if you are making the inventory and always sure there will be one instance of the inventory

rapid aspen
#

can you give me an example?

sterile token
#

Im seeing that you are really new to this and the reason of having many issues not elarning first Java, what i told you is from bad personal experiences that i have had

rapid aspen
#

ok

sterile token
#

So i would straightly forward suggest Java and then yes start by working with apis or libraries

#

It will be much easier for you, its just a suggestion you follow it as you want or not

rapid aspen
#

ok thanks, im just doing this for fun, to me and some friends play, i dont want to learn java because to what i want to do i dont think java will be very necessary

sterile token
#

Oh my gosh ๐Ÿ’€ , so please if you want learn Java dont code plugins, what more i can say

#

Its the same when you cooking, you cannot cook good recipies without you first learning the basics about cooking

#

Okay this is the reaosn why i dont compare whole object when using player as argument

#

And many peple will discuss me saying you should compare whole player object, instead of their name or uuid

eternal oxide
#

never only name

#

uuid OR Player Object

sterile token
#

This issue happen while comparing using the whole player object, but i dont really understand the why

eternal oxide
#

then you are making a mistake when comparing

sterile token
#

Im using equals(), is it right? In theory player object overrides the equals

eternal oxide
#

There is only ever one Player object for a player when they are logged in, UNLESS you kept a stale reference when they relogged

sterile token
#

But the question, is why would tell me message, when the name is written correctly and also when written wrongly

eternal oxide
#

Depends how you are getting the player object

#

if you are not using the exact method you will get the close match

sterile token
eternal oxide
#

you could use == as its an instance

sterile token
#

hmn right

#

I always confused about == for objects, i will revise them

tardy delta
#

player objects have reference equality

tender shard
pseudo hazel
#

just see if it works when comparing uuid, if not there is something else wrong

tardy delta
#

you shouldnt work with players instances that are not online

pseudo hazel
#

that too

#

just check for player.isOnline() firsy

remote swallow
#

that happens to all ofus

lost matrix
tender shard
# sterile token I always confused about == for objects, i will revise them
public class Main {
    
    private static class Person {
        private final String name;

        private Person(String name) {
            this.name = name;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Person person = (Person) o;
            return Objects.equals(name, person.name);
        }
    }

    public static void main(String[] args) {
        Person person1 = new Person("John");
        Person person2 = new Person("John");
        System.out.println(person1.equals(person2)); // True - both have the same attributes (name is "John")
        System.out.println(person1 == person2); // False - they are different objects
        Person person3 = person1;
        System.out.println(person1 == person3); // True - they are the same object
    }
lost matrix
#

Main.main(mainargs)

#

^^

eternal oxide
#

initialization order error causing null

lost matrix
#

Do you need the provider? If you just depend on LuckPerms then i would suggest simply using the static access.

dry yacht
lost matrix
quiet ice
#

and did you declare the dependency?

eternal oxide
#

did you do somethign silly like not set teh dependency to provided?

quiet ice
#

-.-

eternal oxide
#

yep

lost matrix
#

classic

quiet ice
#

no, default is compiled

#

*compile

eternal oxide
#

you shaded LP ๐Ÿ™‚

quiet ice
#

Always double-check your jar size

tender shard
#

why do people always assume that "provided" is the default lol

quiet ice
#

A humongous jar probably has a reason for being humongous

tender shard
#

if it was the default, then nobody would need to add "provided" to spigot-api

quiet ice
#

Conventions son

eternal oxide
#

brain farts happen often

quiet ice
#

Even for compile dependencies I always explicitly add the scope

tender shard
#

it feels wrong to not specify it

sterile token
tender shard
#

equals() is true whenever equals() returns true. == is only true if it's exactly the same object

eternal oxide
#

if you are using an invalid name you are comparing to null

sterile token
lost matrix
tardy delta
#

whats that label doing here

#

and why can you use break

sterile token
tender shard
#

for players, equals() only compares the UUID btw

#

(and if it's an OfflinePlayer, so a normal entity with the same UUID will not be equals)

tardy delta
#

and entity id

tender shard
#

oh yeah

sterile token
#

?paste

undone axleBOT
lost matrix
tardy delta
#

looks so

summer walrus
hazy parrot
sterile token
#

hastebin ๐Ÿ’€, Paste md4 ๐Ÿ˜

lost matrix
#

Ah i see what they did here. They tried reducing the nesting without having to extract additional methods
to spare a few stack calls...

tender shard
#

R rr = (R) r

#

sounds like an angry cat

#

and the second line, an angry snake

lost matrix
#

XDDD

tardy delta
#

๐Ÿค”

dry yacht
# lost matrix If you need to check the state of a WeakReference object to detect its viability...

I'm just trying to find out whether I actually misused the WeakReference. The concrete case was: A brewing stand block has an object mapped to it, which contains three WRs, one for each of it's output-slots. If the player puts an item into the slot, they're the initiator for it for the next brewing session. I didn't really see the need to manage the reference myself, as I'm only interested on brewing events which player initiated which slots. I know that I could also use a UUID, but then I'd have to resolve those IDs and check for whether the player's online anyways, so it's about the same from the perspective of efficiency. Is there a better solution to this? Seems like this pattern often comes up if you're trying to track player actions.

smoky oak
tardy delta
#

a weakreference value shouldnt be gced when the value is still in use right?

tender shard
#

that's the source code of CompletableFuture in jdk 17 lol

smoky oak
#

r u serious_

tender shard
#

yes

hazy parrot
#

obfuscating open source >>

tardy delta
tender shard
tardy delta
#

cf internals is the worst code ive ever seen

smoky oak
#

the worst or the least understandable

tender shard
# tender shard

ok this is actually from openjdk 18 but I guess it's the same in most versions

smoky oak
#

cuz i have a candidate for that

tardy delta
#

the worst to figure out how everything works

smoky oak
#

uuuh

tardy delta
#

the only thing i know is that it works with a stack

smoky oak
#

i raise to you

#

q_rsqrt

lost matrix
smoky oak
#
float Q_rsqrt( float number )
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = * ( long * ) &y;                       // evil floating point bit level hacking
    i  = 0x5f3759df - ( i >> 1 );               // what the fuck? 
    y  = * ( float * ) &i;
    y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//    y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

    return y;
}
lost matrix
#

Ah yes

#

Quake

tardy delta
#

look at Math.pow impl

#

and cry

smoky oak
#

dont have my ide open atm

tender shard
pseudo hazel
#

oh yes from quake right?

tardy delta
#

sec

tender shard
#

there's a quora post about it like every second day

#

quora has gone to shit in the last 3 years

pseudo hazel
#

i only go to quora when I click on a link accidentally when googling

tender shard
#

i always read it when going to sleep

#

or random wikipedia articles

smoky oak
#

actually i learned about it because the ieee 754 standard made some math operation in it trivial

tardy delta
smoky oak
#

theres an interesting yt video

tardy delta
#

math.pow

sterile token
#

I jsut read Quora to see the stupid things they post on the blog

tardy delta
#

maybe better that its an intrinsic

hazy parrot
tardy delta
#

just look at it lol

smoky oak
#

see this for reference

dry yacht
# lost matrix Sounds fine. But what happens if the server restarts? Wouldnt you have to store ...

I wasn't really interested in loosing that information when restarting, so I didn't think about it. You're probably getting at persistent data containers, right? I guess that would be even better, I just never worked with them this far. It was just a very little and quickly written library to get something done: https://github.com/BlvckBytes/PlayerBrewingListener/tree/main/src/main/java/me/blvckbytes/playerbrewinglistener

Still happy to hear that you think that it sounds fine so far, and don't call me an absolute idiot for doing it this way, xD.

hazy parrot
#

oh parameter is float, not long

tender shard
hazy parrot
smoky oak
#

yea like i said

#

some trickery with addresses

lost matrix
smoky oak
#

it copies the bits directly instead of converting

#

so you can do the bitops

#

thats what the line with all the stars does

tender shard
hazy parrot
#

star

tardy delta
#

told ya

tender shard
#

I really need a cigarette after looking at it

#

cya

tardy delta
#

im wondering whether id use a fastmath lib for my parser

#

as most of those methods are intrinsics

smoky oak
#

youre getting addicted to the wrong thing

lost matrix
smoky oak
#

try getting addicted to tea it soothes your nerves better

lost matrix
#

Now that i think about devs holding hard refs to player objects... i need to take a look at some of the recently released plugins.
Always something amusing there

smoky oak
#

i mean i just store the uuid

#

that works right

#

?

#

get player by uuid?

dry yacht
smoky oak
#

i mean i still use player refs sometimes

#

but usually i do only so in event handlers

#

not in any long term variables

dry yacht
# smoky oak i mean i just store the uuid

It's so funny that this is actually kinda the number one issue of all game mods, game engines and the like. How to handle disappearing entities. And they all solve it by IDs, because everything else is ending up in an unmanagable ratsnest, xD. Jon Blow talked a lot about this on his own engine.

smoky oak
#

i mean i use it cuz the uuid doesnt change

#

and its taking up less memory

#

not cuz its the correct solution

dry yacht
#

It's because you need to ask a centralized entity manager about the ID, and then are forced to handle the null-case.

#

And you don't keep the reference counter of the object up, xD

#

It's a crutch, kinda.

tender shard
#

I have now partly recovered after looking at this pow code

#

the javadocs are already a gem lol

tardy delta
#

better look at the c++ pow code

tender shard
#

i only got c++ stuff on my laptop

#

too lazy to reach around to get it

quiet ice
tardy delta
#

** NAN is NAN 4. NAN **

quiet ice
#

smh

tender shard
#

now idea why the inline rendering is so weird

quiet ice
#

Not using <li>in conjuction with <ol>

quiet ice
#

You need <br> for line breaks

smoky oak
#

doesnt <p> work

quiet ice
#

Or explicitly create paragraphs. Either way, that is the wrong way to create a list

tender shard
dry yacht
dry yacht
#

You said <li> without <ol>, xD