#1.21.5 Snapshots

1 messages Β· Page 6 of 1

proven compass
#

oh ig the item wouldnt

#

tho all it did was random.setSeed(seed);, no?

#

in 1.21.1 at least, it might have changed

#

between the versions

#

but u could set the seed urself if ur still passing the random

marsh mural
#

i mean that would be a bandaid fix but id rather find the correct place to apply the seed
rather than just patching it into the client levels random source

i mean vanilla is applying it somewhere, so i should be doing the same when i render stuff through my placement logic

#

my guess is its moved somewhered in the BlockModelPart collection stuff
to bake the seed into the collected model parts
rather than applying the seed each time some quad is rendered
but i cant seem to see anything seed related in there

#

ahh i think i see it, vanilla pre seeds the random source before invoking BlockStateModel.collectParts
rather than seeding it during quad renders
so i should maybe be doing the same before i collect parts for my render

frail patio
#

Yes, the vanilla method only accepts parts, which themselves do not depend on randomness, nor does any other part of that method

fleet dome
#

You can confirm that and go ahead

#

you can also just set it to ignore incompatibilities in the launch tab and save that, no idea why it doesnt like that specific tex param setting

lunar saffron
# fleet dome You can confirm that and go ahead

As I said, I did confirm it, otherwise I wouldn't know the specifics about that incompatibility. I didn't dig further into it yet, the only thing I know is that the early window is breaking things

fleet dome
#

That isn't actually breaking

#

You can still capture normally in NSight

lunar saffron
#

I'm not saying the early window is breaking the capture, I'm saying the early window is breaking Fabulous somehow.
Also, as soon as the frame debugger is present, it works fine regardless of the early window being enabled or not, so I'm not sure the frame capture is even gonna tell us anything

sterile abyss
#

<@&1067092163520909374>

#

rc

spice geyser
#

ayy

warm night
#

Minecraft 1.21.5 now has a Release Candidate! Here's a super-quick look at the changes in this version! #minecraftemployee

slicedlime works as a Tech Lead for Minecraft at Mojang, but the YouTube and Twitch channels are personal projects run entirely in his spare time. This is an unofficial update video that aims to be the most comprehensive gu...

β–Ά Play video
halcyon bane
cinder saffron
#

Looks like they're almost done, awesome!

warm night
#

i think someone needs to kick the showman... @oblique tusk

spice geyser
#

1.21.5 before the end of the month?

oblique tusk
#

btw dpeter, you realize you too can kick Snowman (as can any maintainer)? thinkies

warm night
#

i know

#

i just never did it before

oblique tusk
#

and that's all to it

warm night
#

well it is not there currently ....

oblique tusk
#

you don't see this?

#

oh wait

#

you're not a maintainer

#

I forgot

#

alright then, continue with the pings

warm night
#

okay @oblique tusk

#

this is only the version bump basically...

oblique tusk
#

btw for the peeps and lurkers, if you like low-stakes games regarding when the next MC version is published, go check out #1250829990195626115

proven compass
#

saturday

warm night
#

That is a link to our internal decompiled source repo. It has nothing you can't recreate on your own machine, but making it public would be illegal as it would re/distribute the source code

#

it just helps neo development so we can link to code lines / changes easily

real bolt
#

There's several alternative tools also available although I can't name them off the top of my head
They're all mostly the same, decomp and commit each release as a new commit to a git repo

fleet dome
lunar saffron
weak wasp
#

Basically just a few changes towards brightness (packed light)-related methods

marsh mural
warm night
#

yeah it is the same template as what you were doing

#

but don't worry we can share the load of making the pinned posts

#

LOL

lunar saffron
#

Resolved the tnt and dispense behavior rejects. I opted to give IBlockExtension#onCaughtFire() a return value to forward the return value of TntBlock.prime(). This will also allow modded blocks to "deny" a flint-and-steel interaction from a dispenser which prevents damaging the flint-and-steel.

lunar saffron
# fleet dome ok we're mixing stuff but i did have early display and NO frame debugger and it ...

I'm even more confused now than I was last night.
I just started the normal Neo client in Kits and Fabulous worked fine. Then I started the test client and Fabulous was broken. Last I started the normal Neo client again and Fabulous is broken there as well now.
Restarting the GPU driver (i.e. pressing Win+Ctrl+Shift+B) fixes it for the first start of the game after the restart, subsequent game starts are once again broken.
If I disable the early window, then it works fine no matter how often I restart the game. Interestingly enough, enabling the early window again after starting at least once without it breaks it on the first start with the early window instead of the second one.

fleet dome
#

The hell is going on. The only difference would be that I am on a slightly older driver version hm.

lunar saffron
#

Apex also mentioned running into Fabulous being broken last night

#

@marsh mural are you using an Nvidia GPU and, if so, which driver version are you using?

#

Btw, this is what the loading overlay looks like for me after handover when the early window is enabled harold

fleet dome
#

uuuuuuuuh

#

what the

#

And no GL debug logs with this one either?

lunar saffron
#

I do get GL errors for that: [01:04:44] [Thread-3/INFO] [mojang/GlDebug]: OpenGL debug message: id=1281, source=API, type=ERROR, severity=HIGH, message='GL_INVALID_VALUE error generated. Invalid offset and/or size.'

#

That's where this ^ stacktrace comes from

fleet dome
#

Hmmmm

marsh mural
#

but the issue with fabulous i was having fixed after i disabled early display in the config like you mentioned xfact

#

-# in ./config/fml.toml
left image - earlyWindowControl=true
right image - earlyWindowControl=false

marsh mural
proven compass
#

what is this you're working on?

#

I didnt realize neo was injected into rendering so much

lunar saffron
#

We're trying to understand how the early progress window manages to break Fabulous mode rendering on certain systems

proven compass
#

thinkies the screen that only shows at the beginning of launch affects gameplay rendering?

lunar saffron
#

It shouldn't but somehow it manages to fuck up the GL state or the GPU driver to such an extent that it does break something

proven compass
#

love that

marsh mural
#

huh thats interesting, the glass isnt rendering with level geo but my placement renderer renders it fine
-# the glass your seeing is my placement renderer, its adjacenet to the same block in world
the only thing im rly doing diferent to vanilla render is using my own entityTranslucent render type (which is a copy of vanillas with no depth test)
and using a vertext consumer wrapper to apply my own alpha to the render (similar to creates ghosting)

lunar saffron
#

The thing you are doing differently is that you're rendering directly to the main render target. The thing that is specifically broken is texture-to-texture blitting, which is why specifically Fabulous mode and the glowing entity outline are broken.

floral mesa
#

Has anyone tested on Linux/Mesa already or is it worthwhile for me to try?

lunar saffron
#

Another test subject certainly won't hurt

lunar saffron
#

@fleet dome I may or may not have found the issue. The VBO that should be bound is 1, the VBO GlState thinks is bound is 1 but the actual VBO bound at this moment is 3. This is captured from a breakpoint in the GL debug message handler

fleet dome
#

Yeah something like that sounds likely, question is: why? did I grab the GL state wrong?

lunar saffron
#

You only grab and snapshot the GL state in DisplayWindow#render() which is only called from NeoForgeLoadingOverlay after the handover is completed. This GL error happens in DisplayWindow#renderThreadFunc() though which does not capture and snapshot anything

#

I found the culprit and the reason why it worked previously: RenderSystem.initRenderer() prepares and uploads the RenderSystem.QUAD_VERTEX_BUFFER that's used for certain full-screen blits. The underlying buffer has, to absolutely nobody's surprise, the buffer ID 3. This didn't happen on 25w09a because this buffer was previously created on demand instead of eagerly on renderer init

#

Doing this (first and last line added by me) in RenderSystem.initRenderer() fixes it.

fleet dome
#

ah yes, well not exactly what we want to do ig. πŸ˜„

#

but alright explanation found at least

lunar saffron
#

Now it also makes perfect sense why specifically Fabulous mode and the glowing entity outline get rekt by this: the former is a post-processing shader which uses the RenderSystem.QUAD_VERTEX_BUFFER via PostPass and the latter uses it via RenderTarget#blitAndBlendToTexture()

lunar saffron
#

The only thing that still really confuses me is why it worked fine on the first game startup after restarting the driver or entire PC

fleet dome
#

That that is also very confusing (and why did it work for me) πŸ˜„

gleaming pendant
#

ok let's have a look

lunar saffron
gleaming pendant
#

ah yeah I checked that it builds but then I realized I forgot to gen patches

#

heh

#

it will be for after The Rebaseℒ️

lunar saffron
#

πŸ‘Œ

gleaming pendant
#
    Port to 1.21.5-pre3

    Co-authored-by: Apex <[email protected]>
    Co-authored-by: coehlrich <[email protected]>
    Co-authored-by: embeddedt <[email protected]>
    Co-authored-by: Matyrobbrt <[email protected]>
    Co-authored-by: Minecraftschurli <[email protected]>
    Co-authored-by: Sara Freimer <[email protected]>
    Co-authored-by: Sebastian Hartte <[email protected]>
    Co-authored-by: Technici4n <[email protected]>
    Co-authored-by: XFactHD <[email protected]>

btw quite some people contributed to this port πŸ˜„

gleaming pendant
#

(I only checked the primary authors not the commit messages 🀷)

drifting finch
#

Very nice work!

gleaming pendant
#

doesn't look too bad

lunar saffron
#

Speaking of contributors: maty still hasn't fixed the gametest registration in the test framework screm

gleaming pendant
#

yeah well that will come for later then

#

we still have two rejects from a few weeks ago kek

lunar saffron
#

Yeah, those two are particularly fun...

gleaming pendant
#

I'm not touching them

#

if someone has issues with fluids they can feel free to have a look

lunar saffron
#

Part of one of the rejects is related to the damage pipeline and shield blocking. I would not be surprised if that missing hunk would cause a crash with the damage container stack because there might be a push or pop in that hunk harold But nobody has tested taking damage yet, so nobody has run into that potential issue yet

oblique tusk
#

one day I should work on porting

#

but there's all this other stuff to be done

gleaming pendant
#

as usual these patches will need to be reapplied by hand; marking that down for now

#

ok I made a mistake, let's start again

oblique tusk
#

file an issue so I can assign maty to it and occassionally join in on the stabs

gleaming pendant
lunar saffron
#

Is there any reason to not disallow narrowing access?

gleaming pendant
lunar saffron
#

I'm aware of that transformer but do we actually have any case where that means narrowing a field's access?

gleaming pendant
#

it looks like the BucketItem#getFluid method is gone πŸ€”

lunar saffron
#

That's already the case in 1.21.4. The transformer in question isn't used on BucketItem anymore since the registry order allows passing the Fluid directly instead of wrapped in a supplier

gleaming pendant
#

ok this one still exists

lunar saffron
#

Hmm, unfortunate

limpid crypt
#

Is the patch for Sheep.java correct?

lunar saffron
#

Yes

gleaming pendant
lunar saffron
#

True

gleaming pendant
#

apparently I missed a compilation failure coming from the rc1 port

lunar saffron
#

Yeah, I'm fixing that right now

gleaming pendant
#

I was gonna force-push it πŸ€”

#

I guess it doesn't matter; just keep in mind that there likely won't be a further squash

lunar saffron
#

Ideally a patch that doesn't just use LevelRenderer.BrightnessGetter.DEFAULT πŸ˜„

gleaming pendant
#

no patch no

dark wasp
lunar saffron
gleaming pendant
#

alright, pushed

#

thanks

lunar saffron
#

πŸ‘Œ

lunar saffron
gleaming pendant
#

ah yes forgot to gen patches harold

#

fixed

lunar saffron
#

Thank you

unkempt lynx
#

java 24 is currently sobbing

#

not sure if this is in scope for Neo to "fix"

thin cairn
#

Mojang will remove it eventually

#

It doesn't do any harm atm

#

getSecurityManager is just implemented as return null; now

olive rover
#

wasnt the latest 22

#

awh shit java upgrade again

olive rover
fallow merlin
#

I don't think that matters afaik

MC is currently using Java 21

#

And not much Neo can do about it afaik

gleaming pendant
#

Well we could patch out the SecurityManager

fleet dome
#

we could

#

but we don't have to for 1.21.5 release πŸ˜›

gleaming pendant
#

Yeah 🀷

fallow merlin
#

Yea

fleet dome
#

@drifting finch Well I meant that as: the API to build/modify a pipeline object in isolation is not related to the system that applies such transformations based on some registered/idempotent transform

#

i.e. having the pipeline->builder methods is useful outside of that, too.

river canopy
#

I'm copying this code I wrote as part of the discussion we were having on the pipeline modification stuff:

RenderPipeline.Builder modifyPipeline(RenderPipeline.Snippet originalState, RenderPipeline.Builder builder) {
    if (originalState.xyz())
        return builder.withSnippet(COOL_CHANGES);
    return builder;
}
drifting finch
#

So you would need to have some identifier applied no?

fleet dome
#

Yes since that API doesn't exist and needs to be built

#

No, not applied

drifting finch
#

Well not applied

fleet dome
#

the transformation itself is an opaque Function<RenderPipeline, RenderPipeline>

drifting finch
#

But collected

#

Ahhh

#

Yeah

#

Okey

#

Understood

fleet dome
#

which needs to have a contract attached to it: idempotency

drifting finch
#

It would wrap the API we are discussing here

fleet dome
#

and then we need to build a registry for those

fleet dome
#

depending on what it is doing

drifting finch
#

But it would need to be idempotent and identifieable

fleet dome
#

We just need to set in stone: idempotency. Since our code would only ever call this function once per pipeline (based on its referential equality)

river canopy
#

I think UnaryOperator is expected to be indempotent

fleet dome
#

Yes, hence the need for a client-side registry of those, I think

#

java.util.function interfaces have no contract on what the functions actually do

river canopy
#

Interesting, doesn't Stream require a bunch of the functions/etc passed in to be indempotent?

fleet dome
#

We should be very explicit about it, since we're baking in the assumption

#

Well tbh, it wouldn't even matter all that much

#

the transform would only ever be called once

#

(for an input pipeline)

river canopy
#

Right

fleet dome
#

even if the function wasn't idempotent. it might just not do what the modder expects

#

if they thought they could do a if (Math.random()) < 0.2 { different pipeline state }

#

My idea was then to:

RenderSystem.pushPipelineManipulator(REGISTRY_KEY)
guiGraphics.renderItem(....)
RenderSystem.popPipelineManipulator(REGISTRY_KEY)

river canopy
#

Ah, I see now

fleet dome
#

It'd internally build a cache key out of the manipulator stack keys

#

There's essentially one central point at which a render pass gets created

river canopy
#

I see why you were thinking RenderPipeline->RenderPipeline rather than builder->builder

#

My thought was to have it be a one-and-done thing in the builder's build() method

fleet dome
#

You'd need a cache: Map<Pair<List<ResourceKey>>, RenderPipeline>, RenderPipeline>

river canopy
#

But that wouldn't work if you wanted to render one item with, for example, inverted colors, and then one without

#

(at least, my one-and-done approach wouldn't)

fleet dome
#

Oh, yeah no this needs to be ambient state to essentially "wrap" render calls

#

you could wrap the push/pop into a :

RenderSystem.renderModified(STENCIL_MANIPULATOR_KEY, () -> {
   guiGraphics.renderItem(...);
});

But the lambda allocations are always a bit... eh

river canopy
#

Yucky, but I'm not entirely sure if there's a better way that isn't just passing the pipeline all the way down

fleet dome
#

You can't pass a pipeline all the way down

#

You can offer both, but the lambda will incur allocations

#

re: pipeline passing.

if you just want to override stencil state, for example, you just don't know what the other state of the effective pipeline is going to be. since you cannot know which pipelines will be used as part of the guiGraphics.renderItem() call.

drifting finch
fleet dome
#

Imagine special item renderers, for example. they could use any pipeline they wanted to even multiple!

#

That's why you need that Function<RenderPipeline, RenderPipeline>

#

There are ways to build easier APIs on top of that, btw.

river canopy
fleet dome
#

If you simply want to override a few states, you can have that in a RenderPipeline.Snippet

#

And we can offer a simple factory method for a manipulator that takes in the snippet

#

and creates essentially a manipulator like this: pipeline -> RenderPipeline.builder(pipeline).withSnippet(snippet).build()

drifting finch
#

Yeah that would be great

river canopy
#

But then we'd need to patch everything to accept this modifier parameter all the way down

#

at the very least, if it's something like UnaryOperator, there's the andThen/compose methods to make applying them in order a little easier

#

We could then probably make it RP.Builder->RP.Builder and have the usage site manually convert it to/fro if a modifier was passed

river canopy
#

Oh?

fleet dome
#

well there's two problems: a) i am using renderItem just as an example here, there's an arbitrary number of render methods that you'd want to be able to wrap
b) The GL render system permanently caches the compiled GL pipeline state for any RenderPipeline it ever sees

river canopy
#

Oof

fleet dome
#

That's why the manipulators must be registered and have identity

river canopy
#

Well, I guess that means a LRU cache is worthless then

#

I don't think they need to be registered and have identity if it's just a set of modifier functions called in order

drifting finch
#

It is easy to fuck up else causing the GL System to create a new permanent cache entry on every single call

#

Sometimes multiple times per frame

#

That is a memory leak of epic proportions if multiple modders do this

river canopy
#

I imagine that the performance impact of such a mistake would be noticable even in dev environments, though

drifting finch
#

Depends on the usage and the place of the modification

#

So, not always.....

#

We already missed it here once

#

Took xfact trying it out for his blocks to notice

river canopy
#

Just to confirm, this GL cache is based on the object identity of RenderPipeline, right?

drifting finch
#

Correct

river canopy
#

Mkay

drifting finch
#

Create a new one, create a new cache entry

river canopy
#

I don't disagree that it's a problem to leak memory; I'm just not entirely sure the ambient state approach is necessary to avoid it though

#

Though I do admit it would make it a lot easier to make it "automagic" if multiple mods are interacting without requiring every modder to be diligent about passing their modifiers along

fleet dome
#

oh Orion already said that πŸ˜…

#

Yes, what Orion said πŸ˜„

river canopy
#

Yeah, I see the problem you're talking about

fleet dome
#

It's also 1000 times easier to debug if you can see that the active render pipeline was "entity/whatever modified by ae2:stencil_stuff"

drifting finch
#

Been disconnected with this port. But kept up with the concepts and issues so I at least knew that

river canopy
#

It wouldn't be a lambda anymore, but we could go for a half-way approach with some sort of PipelineModifierBuilder which lets you insert/preinsert named modifiers, but I guess at that point it's basically the same as the ambient state but as a parameter

#

hmmm

#

My main issue is that I'm just not a fan of ambient state, especially considering how Vulkan is setup and how the GL abstraction stuff seems to be setup for Vulkan in the future

drifting finch
#

It is not actually ambient state though

#

That is the point

river canopy
drifting finch
#

It is ambient through the CPU side of the engine, but as soon as the pipeline is actually used by the engine to call the GPU it is a concrete static final object

river canopy
#

Yeah, that's true

drifting finch
#

So any renderer would never notice it

#

Because that is what the cache is for

river canopy
#

But I think we should respect that on the CPU side too

drifting finch
#

But that cache is also our issue

fleet dome
#

And unrelated to the cache

drifting finch
fleet dome
#

Without ambient state you cannot modify render passes that are being created by some other renderer you call

drifting finch
#

So I am good with it

fleet dome
#

Whether that ambient state is a stack on the rendersystem or a threadlocal doesn't really matter

drifting finch
#

Given that this api in particular will not be used by renderer mods but by content creators

#

So I am okey with that API not following the vk/metal/rendering architecture

fleet dome
#

This has really nothing to do with VK/metal

river canopy
drifting finch
#

No it does mot

#

But that is my point

fleet dome
#

you are calling some arbitrary method

#

that may create multiple render passes

#

maybe 10 stack frames down

river canopy
#

I'm saying that renderItem(...) as an example should accept a parameter which describes how to modify the render passes, and then the modder would flow that back up to wherever the most logical place is for them - e.g. if Screen#render got the same treatment, they'd just pass the parameter through

fleet dome
#

I am heavily opposed to that

#

That is just one method that may render something

#

And it's called in a thousand places

river canopy
#

Yes, I agree it's a lot of changes to make, but given everything I know about rendering, it "feels" more right to me compared to the ambient state

drifting finch
#

Not to me in my opinion

fleet dome
#

I don't see how this is rendering related

#

This is applied and resolved before anything is written into the fake "command buffer"

river canopy
#

Rendering doesn't start and finish at the command buffer; you've got the context and the whole pipeline

fleet dome
#

Sure, but this is not really different from a bunch of other context issues all over software engineering

#

be it tracing, correlation ids, rpc deadlines, etc. etc.

#

It's never nice to do this

river canopy
#

Yeah, that's fair

fleet dome
#

but it's practical

#

pragmatic?

#

eh, you know what I mean

river canopy
#

Yeah, and I agree

#

I was just hoping that there was a better way, but I can't think of one

fleet dome
#

Well it was my initial idea but got reality checked by Xfact πŸ˜„

river canopy
#

I may not be an old man, but I feel a "old man yells at xfact" meme is appropriate here

river canopy
lunar saffron
#

I personally would significantly prefer the lambda approach over separate push/pop methods.
Another idea, inspired by a discussion on the Fabric Discord about this exact push/pop mismatch problem with PoseStacks, would be to return an AutoClosable object from the "apply pipeline modifier" method (can even be a re-used object, avoiding any additional allocations) which is used with try-with-resources and pops the stack when it's closed

drifting finch
#

The closing of the batch object (which is an AutoCloseable) triggers the internal updates, to modeldata, models, structural outputs etc

#

It is a very nice pattern, but still allocates now and then, and is annoying if you have to stack multiple of them on top of each other or inside of each other which can make the code unreadable.

The lambda would shine better there

#

In my opinion

lunar saffron
#

The lambda would also have to be nested unless we provide an overload that accepts multiple modifiers (which I don't see much of a point in, just make it one modifier at that point), so the visual clutter is similar. As for allocations: in this particular case the AutoClosable object can be re-used since it doesn't actually hold any state, it just calls pop on the stack

river mural
lunar saffron
#

Another thought regarding this modifier idea: is there any practical benefit to having the modifiers be arbitrary functions? If we instead limit the API to only accept RenderPipeline.Snippets, then we can avoid the builder altogether for singular modifiers by applying the snippet in a direct pipeline->pipeline copy and only have to create a single builder when applying multiple modifiers instead of having to go pipeline->builder->pipeline->builder->pipeline. The snippets could then also be part of the cache key instead of having to register modifiers and putting their keys in the cache key

lunar saffron
fleet dome
#

You have to be able to inspect which pipeline it is you are getting

#

And be able to return it unmodified

lunar saffron
#

Right, that's unfortunate. Would have been far too easy πŸ˜„

fleet dome
#

I.e. maybe you can only handle block vertex format

#

(not that I have checked whether the pipeline even encodes that)

lunar saffron
#

It does

fleet dome
#

It's not unfortunate, it's better imho

limpid crypt
#

Are we allowed to report bugs?

fleet dome
#

I want the registry also to avoid mistakes and get better debugging

drifting finch
lunar saffron
#

That's fair, yeah

drifting finch
#

You are allowed to properly report bugs, with reproduction etc

#

Not just random screenshots of things that does not work

lunar saffron
drifting finch
#

But if people start reporting stuff with just a screen shot, or a single line, along the contents of: "This does not work"

fleet dome
#

Since it's relatively expensive

drifting finch
#

I considered it okey for now

lunar saffron
fleet dome
#

That is once per frame if I am not mistaken

#

Tbh doesn't matter for the loading screen probably

drifting finch
#

So it really does not matter

#

THis is a simple and well understandable solution

fleet dome
#

They never read the state from gl

drifting finch
#

Which is more important to me

lunar saffron
fleet dome
#

That is what is slow heh

drifting finch
#

But you know

#

This suffices for this particular usecase

#

If it where me I would pin this screen to scenematic 24 FPS

fleet dome
#

It does yeah

drifting finch
#

And the rest is not something I would care for

fleet dome
#

Once per frame doesn't matter

limpid crypt
#

Is it normal that when the player uses elytra, the eye height is not updated? (I think it's not a Minecraft Vanilla bug)

drifting finch
#

And track the reason in the code

#

Then report it properly, with links to the code and a way to reproduce it

limpid crypt
drifting finch
fleet dome
#

How do you even find this stuff

limpid crypt
trail fable
# limpid crypt

is that vanilla or Neo, what is the exact difference, etc. etc.

#

please, can you just make complete issue reports

#

personally, I disregard any issue reports like this on my repo until I have the proper info

limpid crypt
#

ok, wait

#

Well... Discord isn't the best place to make bug reports, I'll make a bug report on Github

drifting finch
#

Yeah lolo, I am going to says this once: Write a proper bug report, or I will mute you from this thread, and the github org. We have told you this now so many times that I can not count it on one hand, and the way you are reporting stuff and asking for stuff, is always incomplete. That incompleteness causes us a lot time where we are chaising our tails, not supporting the community or helping the community forward.

So here is my official last warning for you: Start properly reporting stuff, or we will start taking counter meassures.

merry falcon
#

What are you even doing???

lunar saffron
drifting finch
#

So be my guest πŸ˜„

lunar saffron
#

Done

drifting finch
#

Thank you very much for you time to fix this!

lunar saffron
#

The fix was trivial for how much it took to find the culprit πŸ˜„

drifting finch
#

For sure

#

Still you fixed it D:

fleet dome
lunar saffron
#

Yup. But, the sync gl debug config once again saved the day

limpid crypt
drifting finch
#

So I am going to say, not even by a longshot

trail fable
#

yeah, I can't see the difference either

lunar saffron
#

The issue is the view vector (the blue line that's only visible on the Neo screenshot), not the eye height

true turret
limpid crypt
#

oh

drifting finch
#

Which still indicates to me: This issue is not sufficient

trail fable
#

the view vector being wrong is curious

merry falcon
#

Could be a symptom of a larger issue. Worth investigation

drifting finch
#

For sure

#

But the issue is not sufficiently well described

#

At least for one made on a snapshot

merry falcon
# limpid crypt oh

Basically the red line is eye height. Blue line is the look vector for the entity (where it is looking)

#

Wonder if size command affects this. Or swimming

drifting finch
#

Might also just be a rendering issue

#

The heads seems to be aligned properly

trail fable
#

either way, worth investigating, but the bug report needs improvement

fleet dome
true turret
#

and works counter to the design of RenderPipeline

fleet dome
#

Which doesn't matter at the moment

#

But if we redesign it, we should not half ass it since the invest is very high for that use case alone

true turret
#

instead of a globally applied modifier snippet, could a map of (base) RenderPipeline -> modifier RenderPipeline.Snippet be whats pushed?

#

ehh, well, that doesnt solve the identity issue

drifting finch
#

Nope it does not...

#

Sadly

true turret
#

Its not the fastest thing, but we could hash the RenderPipeline except its name

#

if done ahead of time in the constructor, there would be no performance impact for any statically created pipelines

drifting finch
true turret
#

yes, doing thats what i meant to do

#

ie: make a record out of it, but ignore the "location" field, because the GpuDevice doesnt really need to care about that

drifting finch
#

Unsure about that

true turret
#

its used for error messages and debug labels, functionality/what-will-render it doesn't matter

#

^ one it hits the GpuDevice, PostPass does something with it and shader pre-warming also uses it to check that everything got compiled

drifting finch
#

Right now though, your idea feels a bit "depth-less"

#

Like yes it fixes the identity issue

#

But I seem to miss how this fixes the identity issue

#

Well

#

Yes it fixes it by making the Device etc properly cache the stuff

#

And not rely on object identity i guess

#

Which would open up a much easier path to "mutability" of the pipeline

true turret
#

which means we can safely dynamically (allow mods to) create/transform RenderPipelines

drifting finch
#

As you could just transform an existing pipeline

#

and with it the new instance would get a new proper identity

#

And that identity is the same between all pipelines and modification combinations that result in that pipeline setup i guess

#

@fleet dome or @lunar saffron is anyone of you aware of whether you researched this kind of approach (patching in a proper equals / hashcode, either pre-computed in the constructor, or on the fly), and if yes why was it not chosen, if not what do you think of this approach.....?

true turret
#

i'd suggest pre-computed or lazily-computed to avoid re-computing it for static untransformed pipelines in the general case

drifting finch
#

99% of pipelines will be immediatly used

true turret
#

multi-step pipeline transforms

drifting finch
#

Unless the situation arises where once modder transforms an already transformed pipeline

#

Yeah

#

But how often does that happen

true turret
#

thats the only case where it will make a difference, and transformed in the first place is likely to be relatively rare

lunar saffron
drifting finch
true turret
#

immediate downsides i can think of are that it creates more garbage and requires computing the identity properly (which also might be slow)

lunar saffron
#

This took far too long but I found the reason why the view vector is wrong: beds, or more specifically the entity's "bed orientation".

drifting finch
#

Wtf, what have beds todo with the view vector?

lunar saffron
#

LivingEntity#getBedOrientation() is supposed to return null when the entity is not in a bed. However, our patch to support custom beds that are not BedBlocks returned UP in those cases. This caused the player renderer to overwrite the eye height (which is later used as an offset for rendering the view vector) with that of the player in a standing pose, regardless of the player's actual pose

drifting finch
#

Oef

lunar saffron
#

Looking at the porting PR failures, I just noticed that we are currently not doing any mod loading in GameTestMainUtil.runGameTestServer() which is called from the gametest server Main

trail fable
#

damn

lunar saffron
#

Next order of business: vanilla now stores a "started cleanly" flag in the Options. Right after the options are initially loaded, that flag is set to false and the options are written to the file. This causes modded keybinds to be wiped from the options since mod loading only begins significantly later. I'm not sure there is any good way to solve this other than moving mod loading before the init of Options and either firing the RegisterKeyMappingsEvent right after Options init and reloading the relevant parts of the options file or firing the event right from the Options constructor before the initial loading

oblique tusk
#

release date for 1.21.5: March 25

#

per Minecraft Live

gleaming pendant
#

As expected

oblique tusk
lunar saffron
fleet dome
#

Und ne das war noch ErkΓ€ltungsbachwirkungen

#

Alles fine aber fast 40min beim.superkato in dem Kabuff da.runzustehem war scheisse

lunar saffron
#

Wrong channel kek

oblique tusk
#

I see the phrase "40 min". combined with German, I can only presume it's talking about the DB

#

not the SQL kind either

drifting finch
#

superkato....

#

That is a name i know from a restaurant

#

Not sure if that is what he is refering to

oblique tusk
fleet dome
#

and RenderPipelines are large

#

So I don't really see a point in undoing that part of mojangs design

#

which is based on renderpipelines being long-lived static objects

#

I already outlined how we can add a modifier system

#
  1. registry for PipelineMutator (which would be Function<RenderPipeline, RenderPipeline>)
  2. our stack in RenderSystem (or command encoder) takes in ResourceKey<PipelineMutator>
  3. we cache eterenally in one of the rendersystem classes: Reference2ObjectMap<ResourceKey<PipelineMutator>, Reference2ObjectMap<RenderPipeline, RenderPipeline>>
  4. when the stack isn't empty, it becomes a trivial:
setPipeline(RenderPipeline p) {
  for (var transform in stack) {
    p = transformCache.computeIfAbsent(transform, ignored -> new Reference2ObjectMap()).computeIfAbsent(p, transform);
  }
  ... continue on as before
}

Just from memory / pseudocode, that's how I'd do it

drifting finch
#

Then we are out of luck

fleet dome
#

No that's not luck πŸ˜…

#

It's good they do this

#

it's much faster

drifting finch
#

Yeah true

fleet dome
#

They do a if (this.lastPipeline == pipeline) { noop, no state changes }

#

that is extremely fast

drifting finch
#

Yep

true turret
#

if (this.lastPipeline.identity == pipeline.identity) would also be equally quick

#

once that identity is computed

lunar saffron
gleaming pendant
#

I say move mod constructor earlier and fire an event immediately before the init of Options

fleet dome
#

ONCE AND FOR ALL!

#

πŸ˜„

#

(let me quickly check where the options are loaded)

true turret
fleet dome
#

Okay it's in the Minecraft ctor, so finally moving it to before that will solve this too

#

I'd say let's just finally do that in 1.21.5

gleaming pendant
#

But why would that happen?

fleet dome
#

Why would what happen?

oblique tusk
#

i'm tempted to ask someone to file an issue on the repo for that, so we have a record of it happening and why

true turret
#

multiple identical piplines?

fleet dome
#

That can obviously happen

#

But I don't like the complexity of introducing interning

#

Every patch is paid for in sweat and blood on the next snapshot

true turret
gleaming pendant
true turret
#

no

#

they are manually interned by mojang not creating multiple identical ones

fleet dome
#

Mojang just public static final's their pipelines and uses object identity

gleaming pendant
#

We might be able to make the ctor private and inject a factory method instead? To intern new instances

fleet dome
#

I am honestly not too concerned about this at the moment

#

We don't actually have to

gleaming pendant
#

Well I should actually look at this heh

fleet dome
#

We can intern them ourselves transparently

#

Oh yes, wait, forget it

#

RenderPipeline have an ID

#

we're not going to intern anything πŸ˜„

#

I'd rather have the ID reflect the transform if possible

lunar saffron
fleet dome
#

I have to check that, gimme a bit

#

Ok so you dont need to actually put that after the render thread init

#

and we need a bit more plumbing

#

gimme a sec

#

We're back on the main repo now, right?

lunar saffron
#

Yes

lunar saffron
fleet dome
#

Sooo

#

Is this the point at which we kill those

#

and move them from FML to NF

#

*with the exception of FMLConstructModEvent funnily enough

gleaming pendant
#

why is that needed now? πŸ˜›

#

btw we still have 3 days to split neoforge if we want to pursue that

fleet dome
#

Ah wait, I actually mistook those for the ones we're going to add to

fleet dome
#

We should still move those, they're not in the right spot there

#

unless we actually go ahead and do the fabric loader thing of splicing in the event emission in FML itself

#

rather than patch it in NF

proven compass
#

split neo? wouldnt that be best for a major version

fleet dome
#

every minor is a major

#

*for neoforge

gleaming pendant
#

it mostly just means moving a lot of files πŸ˜›

trail fable
#

this is getting out of hand

gleaming pendant
#

that's not what split means πŸ˜›

trail fable
#

I know, but let me make my jokes stabolb

fleet dome
#

He just wants to split the word

#

Neo Forge

trail fable
#

I already contribute nothing else harold

fleet dome
#

And change it everywhere in the code πŸ™‚

drifting finch
#

We are not going to split now

#

The architecture and design for the split is not documented and discussed among the maintainers

#

We can do that for the next version

trail fable
fleet dome
#

eh Orion, I think it was discussed to death really

#

What Tech is talking about is just the source set split in NF itself

#

not the artifacts

drifting finch
#

Yes

#

I know

#

Hence the point

#

It needs to happen

fleet dome
#

and how that has to work is prescribed by Mojangs split upstream

drifting finch
#

But not now

fleet dome
#

it has to happen at a breaking point

drifting finch
#

Yep

fleet dome
#

and we cant postpone it forever

#

well we can, but we shouldn't

drifting finch
#

I suggest one not 3 days before a release.....

gleaming pendant
#

tbh most of the work was already done by me a few months ago

fleet dome
#

It's always going to go like this with the level of participation in the ports

#

so next time, we'll be in exactly the same situation πŸ˜„

drifting finch
merry falcon
#

How much of a breaking change for modder is 1.21.5 right now?

How much extra work will the split in Neo add?

gleaming pendant
fleet dome
#

The split is not visible to modders

merry falcon
#

All internal stuff?

gleaming pendant
#

the split in Neo adds 0.1% of work (just we need to change a few APIs that are mixing client and common code)

drifting finch
#

The split produces the same artifacts externally

fleet dome
#

This is about forcing us to consider the split sources

gleaming pendant
#

the biggest issue with the split is that all client files get moved to a different folder

gleaming pendant
drifting finch
gleaming pendant
#

the split has to be a separate commit that is added after the port

drifting finch
#

You are right....

fleet dome
#

Well okay, if you're renaming stuff package-wise then modders may have to account for package moves, yes

drifting finch
#

I hate this

merry falcon
#

With the minimal work exposed to modders, I’m fine with a split starting for 1.21.5

gleaming pendant
#

I think the only move was ModelData to move it out of client

fleet dome
#

but there's no toolchain changes in moddev, for example

drifting finch
#

I don't want to make such a massive internal infrastructural change in a handfull of days

#

Because it can not get properly reviewed

#

And processed

#

On the other hand....

#

Does this need to happen before a release....

#

Maybe

merry falcon
#

Neo will be beta for 1.21.5

drifting finch
#

Maybe not

fleet dome
#

+536 βˆ’335 is honestly not that much

drifting finch
#

But infrastructurally and process wise it is much bigger.

gleaming pendant
#

that's the bigger issue

drifting finch
#

And that

gleaming pendant
#

the patches are indeed slim

drifting finch
#

It is

fleet dome
#

Maybe I am not seeing something

#

The risk seems low, tbh

drifting finch
#

It is a massive change as to how we have worked for over 15 years

fleet dome
#

We already know upstream is split

drifting finch
#

So yes

fleet dome
#

and have tried to design APIs with that in mind

drifting finch
#

Whether upstream or fabric or somebody else has this design is an indicator

fleet dome
#

so the risk of suddenly being in a situation where Mojang starts mixing client and common code

#

is slim

drifting finch
#

It is still and will always a massive shift in how we operate and work

fleet dome
#

and the risk mitigation is to just merge the shit together again

drifting finch
#

We need to do it

fleet dome
#

I mean tech, your stuff compiled, didn't it?

#

So we couldn't have been too far off from a working split NF

gleaming pendant
#

yes it compiled; I did some testing but more testing is appreciated

merry falcon
haughty spade
#

is there anything that makes this change urgent?

fleet dome
#

Since the only work factor I see beside upstream suddenly throwing a wrench in it by unsplitting is that we need to ensure our APIs actually work in split sources

haughty spade
#

not just interesting or wanted, but actually blocking future improvements

drifting finch
#

But that does not change the fact that the change is not urgent (it has worked for the last few years, and it will likely work for at least another couple of months, if not years)

fleet dome
gleaming pendant
#

we cannot offer a split workspace to moddevs if neoforge itself is not split

#

because it means that the patched MC sources are not properly split anymore, because of NeoForge's patches

fleet dome
#

well yes, that's the subsequent change that can happen later but requires this move

gleaming pendant
#

so the idea would be we split NeoForge now in a way that is not really visible to external users then figure out how the external users want to benefit from that later

merry falcon
# drifting finch Yes, totally argee

I would argue the workflow of putting client stuff in client place is a workflow mindset we should have been thinking about all this time and only breaking from that for legacy Neo things in current codebase. Splitting would bring the codebase in line of how we all operate within our own mods and what mindset we try to do in Neo

drifting finch
gleaming pendant
#

what tooling is required?

drifting finch
fleet dome
#

well you need to do it now to develop the tooling later

drifting finch
oblique tusk
#

is this being pushed to be done before 1.21.5 releases? why not after?

fleet dome
#

to clarify, Orion and me are talking about the tooling to later provide split artifacts for moddev downstream

drifting finch
gleaming pendant
gleaming pendant
#

ALL client files are moved to a different directory

drifting finch
#

I would do it after in a proper pr

oblique tusk
#

we do have a breaking changes window for a reason

gleaming pendant
#

it's a shitshow for PRs tbh

fleet dome
#

the dirctory move isn't actually breaking

oblique tusk
#

and a dedicated pull request and review workflow

fleet dome
#

but it's a nightmare for PRs

drifting finch
#

It is a nightmare for existing PRs

fleet dome
#

you can rebase and manually conflict resolve all PRs once you merge this if you had any PRs prior

drifting finch
#

That is true

#

But that is something we can deal with probably

fleet dome
#

so honestly doing this even a day or two after releasing the first 1.21.5 version will cause a ton of unnecessary work

oblique tusk
#

at the moment, since we have the porting branch in the main repo now, what stops us from just having the PR made against the porting branch and reviewing that? (and when 1.21.5 releases, retargeting to 1.21.x)

fleet dome
#

I still don't understand what the risk is for such a mechanical move?

fleet dome
gleaming pendant
#

(the porting branch won't get further rebases BTW, it will become the 1.21.x branch as is later)

#

(precisely so we have a few days to land larger refactors that should not be part of the squashed port commit)

oblique tusk
#

my mindset is trying to separate things that must be done during a port and gets collated into the single uber-port-commit
vs what can be done as a PR that's merged in the minutes after the porting PR, so we have record

fleet dome
drifting finch
#

From the way he frased it I understood it differently

merry falcon
fleet dome
#

it's proposed to be one of the first commits past that to make PRs for 1.21.5 be based on that

drifting finch
#

If it is a separate PR

#

From a separate branch then yeah go ahead

fleet dome
#

That's how I understood it

oblique tusk
#

then I see no problem if so, since we can then review it properly

fleet dome
#

I mean the current thing is a PR too

drifting finch
#

But that removes the 3 day deadline

floral mesa
#

It still needs to be the first PR merged after the main port to avoid a bunch of manual labor

drifting finch
gleaming pendant
#

it can be merged before 3 days since there won't be further squashes but yes

drifting finch
#

The time is simply not long enough

#

To do a proper review

fleet dome
#

I think you are overstating the impact Orion

drifting finch
#

I might be

merry falcon
fleet dome
#

Or I am underestimating it

#

πŸ˜„

drifting finch
#

But that is the entire point

#

I don't know

#

Because there is no pr

fleet dome
#

My understanding of what's being done is: MOST of our code was already split source ready

floral mesa
#

hot take: why do we need a day one release

drifting finch
#

And stating that it has to be merged in 3 days is not a good sign

merry falcon
#

Run tech’s PR and make sure it doesn’t blow up?

floral mesa
#

this isn't going to be a major version for packs

haughty spade
#

okay so,

  • I don't personally care for split sources, and I would rather not have to think about split sources in my mods
  • I'm not very active as a maintainer right now so neodev-side breaks I trust your word.
  • As a mod developer, I would hope that this change happening on neodev side does not break my existing project setup. I don't mind some package renames and class/field refactoring, I can adapt to those changes.
  • I don't believe right now is the moment to apply those changes, in a hurry, right before 1.21.5 release on tuesday
  • I would like major breaks to be ready or mostly-ready before releases, so that we can reduce as much as possible the breaking changes window (I already "hate" that it stays open for more than 1 month sometimes)
merry falcon
drifting finch
#

That was not testable in a larger setup

#

Not the kind of PR I am talking about

gleaming pendant
#

it does move files

#

and it should be usable in userdev, hopefully (maybe with minimal changes, I forgot if I tested that or not)

fleet dome
#

So what that PR should be doing as far as I understand:

  • Do the plumbing to buildSrc/ no one reads anyway
  • Fix any patches that were not split source ready
  • Split our own code into client & main
gleaming pendant
#

look at the file count

fleet dome
drifting finch
#

Why is the diff count so small

#

Oog

#

Ffs

gleaming pendant
#

I guess a moved file counts as a diff of 0 πŸ˜…

fleet dome
drifting finch
#

Nvm

#

I have always looked over that PR because I thought it was missing the files

merry falcon
#

lol

fleet dome
#

@haughty spade An unsplit userdev is just a client userdev, as far as I understand it πŸ˜…

drifting finch
#

I am going to look at it later today

#

I will let you guys know here if I am okey with the three day timeline then

#

Eating dinner first

fleet dome
#

I was always surprised by how little tech actually had to change about the build plumbing to get this working at all lol

drifting finch
#

Yeah

fleet dome
#

I suppose that's @OnlyIn heuristics for ya

haughty spade
drifting finch
#

Yep

fleet dome
#

WAKE ME WHEN I CAN RIDE GHASTS

haughty spade
#

whatever version modpacks will use is whatever version people port mods to

floral mesa
#

Mods are never all ported to every minor version

haughty spade
#

and we shouldn't be the ones deciding this

floral mesa
#

and that seems guaranteed to happen while mods are developed by hobbyists with varying levels of free time

haughty spade
#

there are reasons to delay a port that is otherwise ready so that breaking changes can be incorporated

#

but honestly? split sources are not one, IMO

fleet dome
#

Hm, I disagree with that

merry falcon
#

It’s not delaying giga

fleet dome
#

Not that we're delaying πŸ˜„

haughty spade
#

they are not required at all for anything other than some convenience. so while nice, I would disagree with delaying a release so that split sources can be merging

merry falcon
#

The port happens but the pr should be merged quickly after if we can get it reviewed properly in time

haughty spade
#

sorry for not being specific enough

fleet dome
#

@glass wagon Can we maybe remove mcp/client/Start.java from the "inject" fileset we publish in Neoform? Are you really using that outside of the NeoForm dev environment?

drifting finch
#

No

#

Ng does not even inject it

#

If I remember properly

gleaming pendant
#

there was some "exclude" system maybe?

#

I think I remember sth like that

fleet dome
#

NF does, I thought NG does too. But I think it doesn't even work properly outside of NeoForm dev-env now

#

since it uses a special asset.json that nothing else produces

#

Funnily it also breaks in NeoForm for me since it references client-classes πŸ˜„

#

But gets injected into the server-dist too

haughty spade
#

anyhow to rephrase: I think it's a good change so long as it doesn't make modder's lives harder (which seems to be the intention so that's fine),
I just don't think we need to rush this.
if it is ready by monday evening, then I would say go ahead
if it isn't quite ready yet, I would say release 1.21.5 branch as soon as it's ready, and in the announcement post, warn people of this upcoming change so they don't all rush to release something that will break in 24 hours

floral mesa
#

Why release only to release something else 24 hours later

#

πŸ˜•

haughty spade
#

because we can start porting and testing and bugfixing

#

and by we I mean the community at large

merry falcon
#

People can start porting work to work on Mc changes first

floral mesa
#

I guess

drifting finch
#

Because that is what we do?

haughty spade
#

everyone that doesn't want to use unofficial builds

drifting finch
#

We release several times a week

fleet dome
proven compass
#

does this reduce the size of the server jar

fleet dome
#

The modder-facing stuff is minimal

#

no

#

it does not change the jars at all

floral mesa
# drifting finch Because that is what we do?

I meant more for this special case, that it seemed a bit wasteful to release a version knowing a planned major breaking change will follow within 24 hours. Usually we don't have a breaking change planned immediately after the initial release

proven compass
#

thonk ur including client classes in the server jar even when u split?

fleet dome
#

almost no one publishes split jars for mods

drifting finch
proven compass
#

neo has an actual server jar tho

floral mesa
#

fair

gleaming pendant
#

the question is really whether we can get it reviewed on time

fleet dome
#

Well except for some of the moved classes, which TBH we could just move outside of the PR

#

moved not in file-system sense

#

in package sense

drifting finch
fleet dome
#

let me actually chekc what he is moving package-wise

merry falcon
drifting finch
fleet dome
#

Oh. let me guess, that's actually really shit to see in the GH UI πŸ˜„

haughty spade
drifting finch
haughty spade
#

vanilla-wise that is

fleet dome
#

wellllllllllllllllllll

drifting finch
#

It is a full client jar

fleet dome
#

don't ask too much

#

you might be disturbed by the answers you get πŸ˜„

drifting finch
#

The binary patches for the server jar patch all client classes back in

haughty spade
#

we patch-in all the client classes into the server, and then refuse to load them??

drifting finch
#

So that the side stripper can check for the annotation at runtime

fleet dome
#

you dont have the libs

drifting finch
#

Indeed minus the libs

#

But the jar is the same

haughty spade
#

that seems ugly somehow :P

fleet dome
#

and we're going to stop doing that at some point if we resume work on the manifest-based splitting

drifting finch
#

Yeah

#

We want to eventually

#

Track the manifest of the jar what classes of the client we can and can't koad

haughty spade
#

our server patch should only include and apply classes that are not OnlyIn(CLIENT)

merry falcon
#

how much faster will it make Neo? 10 milliseconds?

drifting finch
#

But no

#

Because the only way to get a nice error

haughty spade
#

it's not about fast, it's about not including hundreds of mojang classes in the patch

drifting finch
#

Is to have the underlying class loader load the class

#

And then have the transformer see the annotation and throw

#

Which is suboptimal...... For the lack of a better word

#

Sharte has a good idea to use the manifest to store the data

#

A d then throw based of that

#

Which would help a lot here

haughty spade
#

yeah that would be nice

#

or even a separate file

#

doesn't need to bloat the manifest

drifting finch
#

Meh

#

I liked his solution

#

It was neat and tidy and matched existing jvm infra

#

So I don't care

gleaming pendant
fleet dome
#

It specifically has per-file attributes

#

and you get it as the first entry of the jar always

#

which means if you do a ZipInputStream based splitting, you have it avaiable immediately

haughty spade
#

hm true

#

it still feels wrong to shove hundreds of additional lines into it

fleet dome
#

(Although to be honest, we should probably not do that if we can avoid it, since local file headers in ZIP files are an attack vector)

#

The manifest parser is optimized for this

#

don't forget that the official Mojang manifest has digests for every file in the jar

haughty spade
#

ew

#

I'll admit I have never looked

fleet dome
#

Well... that's how jar signing works

haughty spade
#

yeah

#

but well

#

I hate how jar signing works

fleet dome
#

Me too πŸ˜„

haughty spade
#

so every time someone reminds me, I go "ew"

drifting finch
#

That concept still baffles me

#

It is a step above 0

#

Which is better then nothing at all

fleet dome
#

It's essentially dead

#

after webstart died

drifting finch
#

True

#

That said

fleet dome
#

I'd not be surprised if they remove it

drifting finch
#

Lets not waste time on this

merry falcon
#

Doesn’t forge and Neo try to do jar signing or did we rip it out?

fleet dome
#

it doesn't do anything

floral mesa
fleet dome
#

we drop it

#

FART does, IIRC. Or rather, there are multiple places that drop it πŸ˜„

#

But *ART has code for doing it since that's a logical place to do it. When you remap the .class files, their digest is obviously no longer the same

haughty spade
#

IMO jar signing is done wrongly

#

there should be a file at the end of the zip, that includes entries for every previous file in the zip, including the manifest

gleaming pendant
#

I think the discussion has diverged for long enough πŸ˜›

haughty spade
#

and signs the whole list of files, such that additional files are also tested for :p

#

yeah XD

drifting finch
#

@gleaming pendant I kind of like the PR, and we can get it reviewed.

However I am not sure I like the concept of NeoForgeProxy.

I wonder if it is possible to handle this better through a part of the FML Mod Construction logic

#

I was thinking about how to instantiate this better

#

We might want to consider some other process that other mods can eventually also implement

#

It is reviewable

#

in 3 days though

#

Again I just don't know if the internal setup of the Proxy is something I like

gleaming pendant
#

yeah the Proxy is simply my go-to solution in these cases but it might not be the best way

drifting finch
#

Yeah mine too

gleaming pendant
#

if we do go for a proxy as the standard solution (also in mods) we should ideally offer a helper to instantiate it automatically

drifting finch
#

And that made me realise

#

That if we are all doing this

#

It might not be the best architectural solution to go with

drifting finch
#

I do that for all kinds of things

#

My API has this logic

#

My PROXY has this logic

#

It is infuriating

#

But to solve this properly

#

We really kind of need some form of DI that is more substantial then what we have now in FML

gleaming pendant
#

API is a bit different; I suppose you can't see the internals from the API so you have to reflect them?

drifting finch
#

And take DI here in the softest sense

drifting finch
#

Sometimes I use reflection

#

What ever suits the situation the best

#

I would really like to offer modders the ability to say:

I need IModProxy injected into the constructor

#

And the platform figures out whether it should be the client instance or the server instance

#

That pattern

#

It happens so much through out all of our code bases

#

And we never tackled the annoyance with it

gleaming pendant
#

well it is once per mod and a few (ugly) lines

drifting finch
#

Sure

#

But if we now start using it ourselves

#

Might as well at least think about a better mechanism

#

And whether it is worth implementing

gleaming pendant
#

yes

drifting finch
#

(It should not stop this PR though)

#

As the Proxy is declared internal

#

But you know

#

Food for thought

gleaming pendant
#

your API-needs-to-talk-to-impl example is a bit different though since the selection criterion is different

drifting finch
#

Ah no you have it backwards

#

My API never has this problem

#

I have two API surface implementations

#

One for client

#

One for server s

#

So my APIs behavior is the same as the proxy

#

Just another instance

gleaming pendant
#

ah it's simply not called proxy but it uses the same idea of having one impl per dist?

drifting finch
#

Correct

#

I don't need it everywhere

#

But sometimes I do

#

Like we do all here with the proxy

#

In most cases we don't need it

#

But sometimes for some method constructs we need it

gleaming pendant
#

what I had in mind was more of an annotation, e.g.

@SideImplementation(value = NeoForgeCommonProxy.class, dist = Dist.CLIENT)
public class NeoForgeClientProxy extends NeoForgeCommonProxy {

and then

ModLoader.findImplementation(NeoForgeCommonProxy.class);

or whatever

drifting finch
#

That is exactly what I was thinking too

gleaming pendant
#

I just worry that we create something way more complicated than the reflection we are trying to replace

drifting finch
#

Maybe

#

I had the same thought

#

But having something like this plumbed into the modconstructor logic

#

Would be soooo nice

#

Potentially with a global scope

#

Where you can just request the API etc of other mods through the mod constructor

#

That would result in a very nice and flexible api

#

That ties mods together

#

And allows them to easier work with and for each other

fleet dome
#

IDK I never liked the idea of calling it a proxy

fleet dome
#

πŸ˜„

#

I really like that we got away from the annotation magic for this

#

And essentially moved to split mod entrypoint

#

Unless we do go with DI

#

like actual DI

drifting finch
#

But java is shit for this

#

It really is

gleaming pendant
#

but I prefer to have it final

drifting finch
#

Me too

#

That is my point

fleet dome
#

well, final on what though

gleaming pendant
#

final

drifting finch
#

I like it final on the instance

#

So that it can't be messed with

fleet dome
#

static final? final?

drifting finch
#

mine are not final

#

They are static

#

Because I need to construct and set the API and PROXY from the mod constructor

gleaming pendant
#

I like it static and final πŸ˜„

drifting finch
#

Mee tooo

#

But alas

#

It should not block the PR

#

But we should discuss our infrastructure in this area

limpid crypt
#

I just had a crash in the port, but I have no idea how I caused it.

weak lichenBOT
oblique tusk
#

well, first off, what were you doing immediately before it crashed

merry falcon
#

Let’s start with that

#

Some emissive entity was rendering

fleet dome
#

No that's a red herring

#
    at TRANSFORMER/[email protected]/net.minecraft.client.renderer.MultiBufferSource$BufferSource.endBatch(MultiBufferSource.java:87) ~[%23204!/:?] {re:classloading,pl:runtimedistcleaner:A}
    at TRANSFORMER/[email protected]/net.minecraft.client.renderer.MultiBufferSource$BufferSource.getBuffer(MultiBufferSource.java:57) ~[%23204!/:?] {re:classloading,pl:runtimedistcleaner:A}
    at TRANSFORMER/[email protected]/net.minecraft.client.renderer.entity.layers.LivingEntityEmissiveLayer.render(LivingEntityEmissiveLayer.java:47) ~[%23204!/:?] {re:classloading,pl:runtimedistcleaner:A}
#

It's flushing a previous draw when the emissive layer is trying to get its buffer

limpid crypt
#

oh ok

fleet dome
#

Did you have a Warden or Creaking near you?

#

Or what else has emissive layers

oblique tusk
#

I still need you to answer the question, Lolo

limpid crypt
fleet dome
#

Warden

merry falcon
#

Well consider a warden was around, you were doing something

oblique tusk
#

I don't think summoning a Warden into the world counts as doing nothing

limpid crypt
#

OH

#

There's a Warden in my world

fleet dome
#

I mean

#

you summoned it

#

300 milliseconds before your game crashed πŸ˜„

oblique tusk
#

I can literally see the log saying that you summoned a Warden in the milliseconds immediately before you crashed

#

so please, tell me why that counts as "nothing"

merry falcon
#

Answer carefully lolo lol

limpid crypt
#

Yes, it was to reproduce the bug

fleet dome
#

... which bug

#

this bug?

#

You know, your report would be more useful if you just said
"I ran /summon <blahfasel> and it just crashed like this:"

oblique tusk
#

so you were fully aware you were doing something
...yet you said you were doing nothing before it crashed?

#

please tell me how that makes sense

drifting finch
#

Lolo, I warned you earlier today that you should only report stuff you can reproduce and with the steps

#

And not here

#

But on github

#

I also said that was your last warning

#

Now you are in luck tonight

#

As I am in a decent enough mood

#

So you get another shot

#

But if I see bullshit reporting like this again I will mute you here and on the github org

#

Do we understand each other?

limpid crypt
#

ok ok

#

sorry

drifting finch
#

Good

limpid crypt
#

When I sent the crash report, I didn't know what caused the bug, but I saw after sending the log file that it was caused by the Wardens

drifting finch
#

You posted before thinking

#

So think and read first

#

Before posting next time

limpid crypt
#

I'll report it on Github

drifting finch
#

@oblique tusk We might want to make an Uber ticket that holds all other issues found before release

#

Like a TODO, do this before 1.21.5 release kind of thing

#

Where his tickets are sub-tickets to handle

#

So we have some kind of overview of it all

#

Do you concur?

fleet dome
#
for (int i = 0; i < 12; i++) {
    GpuTexture gputexture = RenderSystem.getShaderTexture(i);
    if (gputexture != null) {
        renderpass.bindSampler("Sampler" + i, gputexture);
    }
}

Jeez what the hell mojang πŸ˜„

drifting finch
#

tf am I looking at?

floral mesa
#

This is not new

drifting finch
#

Do they not know which textures are bound in the shader......

fleet dome
#

They do that on every draw

floral mesa
#

They have been doing this since 1.17

fleet dome
#

Well, not really

#

the pass now should actually know

#

due to the pipeline

drifting finch