#1.20.2
1 messages ยท Page 6 of 1
Is there source for DefaultMethods somewhere? I can try to figure out why it goes funky
Ah, found the upstream repo
Just forked it
@fallow sundial Your forking action fails on archived repos: https://github.com/neoforged/actions/actions/runs/6227276275/job/16901566092#step:7:14
So it's a workaround for stupid groovy 3 fuckery from what I can tell, unless I've drastically misunderstood it
No that is correct ๐
Ah, yeah, I see
Is there anything in that class you actually need groovy for? Or could you make that one a Java class?
Otherwise, hmm
Okay, idea: before any method invocation on this, what happens if you cast this to the interface type then call it?
DSL stuff can be in java though
As long as it's a Java class in the groovy source set
But yeah, I'd see if that casting thing works
My suspiscion is that that annotation and the way groovy 3 handled type inference for this don't play nice
Because the transformer is being run at canonicalization... Yeah, that's my best guess
yeah okay after looking through how that works my best guess is that it's trying and failing to find the method because it's looking for it on the wrong thing.
If a cast doesn't fix it I'm not sure what would, other than making one of the methods static or something
Or adding a "correct this" step to the transformation
The cast did it ๐
Lovely. Groovy 3 really sucks
I'm still salty that Gradle didn't upgrade to Groovy 4 in Gradle 8

net\minecraft\util\ArrayListDeque.java:16: error: types Deque<T> and List<T> are incompatible;
public class ArrayListDeque<T> extends AbstractList<T> implements Serializable, Cloneable, Deque<T>, RandomAccess {
^
both define reversed(), but with unrelated return types
Minecraft has a single compile error when attempting to compile with java 21
you'd think that could be resolved by defining the method to return an object that implements both interfaces
fun thing is that case is explicitly noted in the Sequenced Collections JEP's Risk and Assumptions section
Of particular concern are the covariant overrides of the
reversed()method onListandDeque. These are source and binary incompatible with existing collections that implement bothListandDeque. There are two examples of such collections in the JDK:LinkedListand an internal classsun.awt.util.IdentityLinkedList. TheLinkedListclass was handled by introducing a newreversed()covariant override onLinkedListitself. The internalIdentityLinkedListclass was removed as it was no longer necessary.
oh, is it a new method and therefore the problem is that existing subclasses don't override them?
specifically, existing subclasses of both List and Deque, but yes
what if the default implementation in List returned an object that implemented both interfaces
is it possible to have the default implementation return a narrower type than the interface declared method?
i feel like this could be solved by having List extend and default-implement all methods of Deque
why would the default impl. of an interface be returning a concrete type? it wouldn't make sense
besides, that alone wouldn't fix the problem, since the problem is that the subclass inherits two same-named methods with conflicting types
that's a possible solution, but it would be majorly modifying the framework by having two previously-unrelated interfaces be suddenly related
C# doesn't have this problem because each interface gets its own vtable
@mental carbon New NeoForm version for 1.20.2-rc2 that fixes a compile error that was introduced by java 21
Yeah, I am still on the mojmap migration on pre4
doesn't minecraft use java 17?
there's definitely a possibility that mojang may switch to the next java lts in 1.20.3/1.21
and that's 21
Yep
there's also a possibility of us to require neo to run on Java 21 if the new features (like virtual threads) prove to be useful for us
for our tools, sure, but for neo itself that is annoying for launcher reasons
the vanilla launcher doesn't have a means to request java 21
yet.
also javacheck.jar ... is that based on version or metadata?
I doubt .3 would bump to j21, perhaps next major. Its just gone GA, im sure there will be issues they have to resolve, I don't expect J21 to be immediately as stable as J17
.3 should release around january I think?
I would expect j21 to be stable by then. we'll see.
I guess not yet. If I was home I'd change that XD
[19:36:32] [Render thread/INFO]: [STDERR]: [LWJGL] [ThreadLocalUtil] Unsupported JNI version detected, this may result in a crash. Please inform LWJGL developers.
But doesn't crash when running neoform on java 21
that's vanilla or neo? cos forge/neo is known to crash like that in j20+ in dev
but it worked in the launcher with j20
Seems like lwjgl 3.3.2 fixes that
yeh
@dull bison I have an issue with the runtypes
If I look at the generated values right
Then it contains a lot of stuff that I can not find in the buildscript nor in the patcher project
https://github.com/FabricMC/fabric/issues/3327 this probably affects us too
PersistantState == SavedData, right?
Believe so - I ran into the same problem when porting ModernFix to snapshots
mhh
Yes
They made saveddata into a type registry?
<@&1067092163520909374> 1.20.2
https://www.minecraft.net/en-us/article/minecraft-java-edition-1-20-2
https://mdcfe.dev/mc-changes?ver=1.20.2
<@&1067092163520909374> OH NO
oh lawd it comin
IT'S OUT
orion is the setup still dependent on the custom neoform?
OH LAWD IT HERE
Hmm, is there a way for non-maintainers to get added to the Snapshow Alarm role yet?
Or does it still include access to internal channels or something?
I'll poke @stray scroll then. Consider yourself poked
consider yourself alarm'd
So handoutable?
i don't know of any issues with not having it handoutable
Doesn't seem to have given me access to anything it shouldn't, so should be fine
i planned in the past to make it a self-gettable role in the Server Guide thingy, but I need to thonk on it a tad more
So did I, then it gave access to an internal channel 
and that was swiftly fixed 
From memory people who've asked for it in the past
@true pivot, @daring ginkgo, @rich void, @dull bison
If you still want the Snapshot Alarm role, let me (or someone else) know
If it is fixed, yes please
I have it (got it through joining the porters)
Ah forgot about that
Still want it when possible ๐
me too
<#builds message>
Successfully scheduled reminder on <t:1695397261:F> (<t:1695397261:R>)!
Is that meant to be seen by others and not ephemeral?
"ephemeral", I think you'll find 
oh I was wondering wtf ater said
No I meant letter soup
So it's gonna break a lot of things going from 1.20.1 to 1.20.2.

yes.
while 1.20.2 is not a big update for the end user
it's one of those that have some tricky internal refactors
It's just like 1.19.3 and 1.19.4 all over again.
yes but with less user-facing changes
Oh yeah.
think more... 1.16.2
Are you talking on mojangs end or just because the fork is getting its feet under it
Mojang did the refactors, those in turn might have changes reflected in the API modloaders provide
mojang made tricky internal refactors
the fork also has caused some tricky internal refactors, but those are separate and shouldn't affect the modders much
the actual big breaking changes are either prompted by mojang, or just stuff that people had been begging lex to allow in forge but he didn't
Cool ok yeah that makes sense
like loottables aiui
I'm gonna do the approach of one mod JAR for multiple loader systems for 1.20.2.
My test pilot for 1.20.1 was a success.
I originally wanted to port the Forge version of one of my mods to NeoForge on 1.20.2 then realized that it'd be clever to go the Sinytra Connector route for ease of maintaining.
what's all changing in the big break?
I don't have a list. I'm sure the team will be writing an announcement once they are back from the porting mines
yeah
skimming over things it looks like the biggest change for mods is in networking w/ the configuring phase and chunk networking
networking's still on the TODO, iirc
so it seems like the "average tech mod" is probably fine?
In terms of vanilla changes, probably
yeah
Loot table or recipe stuff might need changing
are loot tables still not threadsafe
can I yeet people back into config?

Am I not threadsafe?
Can I, as a mod dev, send players back into the config phase
what for?
to config registry?
the server can, but I guess the question is if Neo is going to have an API for that, which I don't think would be a good idea.
I mean, I guess I can do this asynchronously
or I'll turn this into an actual datapack registry
It's probably a simple method call
Automatic NeoForm build worked
so uh
if we're removing mapping related machinery from the build system what does that mean for parchment
parchment doesn't (need to) use srg mappings
it has other ways to export the parameter / doc data, which we can still merge in
do note that Orion has been removing the mapping stuff and is the sysadmin(?) of the parchment team, so i trust him to know how to make it all wire up :P
ngl I lost the plot on what parchment actually is
mojang mappings don't include parameter names
so long as neogradle still does the vanilla recomp step on setup, there's no reason why parchment can't be made to run during that step
parchment is basically mojmaps + parameters and javadocs
so parchment adds them back
Ah ok
https://parchmentmc.org/ also has a succint summary of what Parchment is
ty
Yep yep, I made sure that parchment still works ๐
Already have a new naming channel for it implemented ๐
did you check SharedConstants
yeah i figured people smarter than me were already thinking about this, just wanted to make sure
better to double check
we are definitely getting a .3
yeah xD
luke made a good point, we need to make sure that lambda names aren't screwed up by recomp w/o mappings
They aren't
nothing really changed
All methods still get an ID
Just not a name
The names on binary levels stay the same
And hey, at least this way the lambda name will be the same in dev and production, which will be a huge bonus for writing mixins to lambdas
Yep
we have runsign
@fallow sundial
saved data w/o datafixer
๐ with message reply
asset hype!
๐
\o/
So yes
This is NGNexts DynamicProjects
So it can now properly do the arguments ๐
what's a dynamicProject?
It is the system that dynamically creates the projects and runtimes for minecraft loader development
Using the NGNext runtime engine
Okey <@&1149712382470393998> or <@&1128776937410670663> We are ready for community porting to 1.20.2 now, please let me know if you are interested!
misread that as community poker
wdym ready for porting?
We have ported the core of the systems to ngnext now
Are able to generate patches
And can do test runs now
So I need some help with the port
From pre4 to the release
I didn't realize no one was handling that
did you merge the changes from the main branch?
No I am about to
they could with ng6
No they could not
Because NG6 did not handle the fact that we did not have SRG anymore
It and the buildscript required significant changes
Which would have been comparable in time
Yeah it will be trivial to do from here
We need to port
And adapt the coremods
Since those also expect the SRG names to be present ๐
Is there not going to be a compat layer?
I understand. I'm not saying we need to keep generating SRG. More like maintain the data that already exists. But it would be so much nicer for modders if they didn't have to recompile their mods plus update their toolchain 
Sorry that is just how it works
The removal of SRG would have always happened on the version changes
And we need toolchain changes in those cases anyway (reobf is gone etc)
I'm saying we could put in more effort to make mods more compatible with such a drastic change
NGNext has the legacy module
Which provides some compatibility
So that buildscripts work somewhat
I am also not sure yet
I don't mind the large amount of work if it means easier reports and stuff from users and faster build times ๐
oh, and faster porting to newer versions down the line
Compatible in what sense?
Yeah what do you mean compatible?
A mod using mojmaps won't notice a difference
Outside at and mixin
I think he means stuff like ObfuscationReflectionHelper
?
And other toolchains that remap class names externally
That is the same category as mixin
You do not need ORH
You can just use the name
Orh stuff might break true.
But it's a pretty small subset
Orh deprecates completely
Mods that use it (and most do, because it was the most compatible option) will see a difference
that being, it no longer works
To support orh requires us to regenerate srg.
Which is probably quite a LARGE amount of work
Yeah but mixins and coremods suffer the same issue
For trivial benefits
runtime mojmaps make my whole asm remapping stuff obsolete, but that's good 
Lol
@tacit vale How do we deal with NGNext and publishing it?
?
I think he means mods built with srg that don't suffer from 1.20.1 changes
yeah runtime mojmaps means Json Things scripting will actually be viable
As what version? With something like a snapshot
I mean what maty suggested a while ago which is runtime remapping to moj for old mods
That's not gonna work and it's impossible to make it work
We need srg data, which won't exist
did you already change the modid?
Not sure
have we implemented the network configuration phase thingy
And my aliasing code isn't in either
Just not hte names.....
No it is just ported
Don't lose focus please orion
1.20.1 mcpconfig srg exists? 
I won't
there's no reason we can't keep srg data solely for the purpose of remapping. To clarify, I only mean keeping SRGs for things that still exist. As things are renamed/deleted, they would be removed from the compat srg file. So over time, it would go to zero, theoretically
I only mean keeping data that is still the same
But it's dragging around a dead horse
It's a lot of dead weight that's only getting deader and more mouldy
not really. it means a modder that isn't affected by 1.20.2 changes doesn't have to recompile
which is probably a lot of people
And who's going to audit it all to say "in" or "out"
what does that mean?
Well you assume we have runtime remapping to moj from srg
A tech that doesn't exist atm
And quite honestly is a LOT of work
it does not sound that complicated
w/o runtime remapping from 1.20.1 srg to moj then providing the forge mod id doesn't make sense anymore anyways
Agree matty
you add FART as a runtime transformer somewhere in the SJH pipeline during jar loading. You skip the remap if there is a flag in the manifest saying it was compiled and stayed in mojmap
if anything we should provide it but with a 0 version or something just so people don't claim it as we still use it in reg ids and all of that
No, that is the wrong way around. Sorry
there are no absolutes here. Explain your reasoning
not after the registry rewrite, the caps rewrite, and whatever the hell else comes in, lol
We should not make a system which requires modders that do it the right way, to have to ake special cases
Additionally will rewrite all of the core API anyway
1.20.2 is a breaking change anyway so we gotta recompile anyway
Plus the only modders that wouldn't have to recompile are those that (a) are unimpacted by all changes and (b) magically had the foresight to not set a max version on 1.20.1
and a recompile is a trivial effort anyway
I would at the bare minimum like to see being able to load mods from mods-neo.toml and skipping mods.toml if -neo is found first. This would still allow people to do mega jars if they want since we will be using different runtime data to forge
What would be the point though if the classes all use different mappings?
I guess if they're data only or use other mods APIs
A community porting? Interesting.
In which case why are you even specifying a forge dependency? Just leave it out and it'll work fine on either, if you're truly touching no vanilla classes/methods
JarInJar ๐
...oh right, people do that thing
The point of what
I'm still not quite sure how it would help because you'd have to special case the JiJ metadata file too
Having separate neo and forge mods.toml files
yes this is a horrible situation
ah I forgot that you cannot specify the entry point from mods.toml :/
mods compatible with both forge and neo in the same jar are virtually almost impossible
I'd just say break compat and call it a day
Otherwise you're going to be dragging this stuff around forever
only because of our choices 
touche
Isn't this a fine choice to make though?
Like, if you are going to eventually break compat in various ways, which just needs to happen because otherwise you're stuck with old stuff, its only going to get more annoying for modders the longer you wait
y'all can break whatever you want and I'll just wait to see the adoption and how it turns out
So do it now, while it's not painful
It just seems a bit backwards to add more remapping technology when the point is to get rid of it
Most multiloader modders will be fine because they make separate jars anyways
The "single mega jar" approach is less common than you'd think because it's a pain to set up, and because it has some annoying side effects like enormous jar sizes
The fundamental issue with any runtime remapping is what Orion pointed out - it requires mods to declare that they're Mojmaps somehow
Which, in the lack of a reobf step in NG, is not something you can really guarantee unless you try to reintroduce that sort of processing
What about mods compatible with Neo and Fabric in one jar?
There's layers of not good sadly
I mean, just as possible and painful as ever? This is unrelated to that entirely
(Which is quite easy)
Hmmm... I'm still interested to see how things will go!
No, it's not
fabrics remapper can still run 
no I'm not
With runtime Mojmaps, there's no guarantee that the jars used in production ever went through any NG post processing!
You literally add a flag to the manifest when compiling with ngnext that says mojmaps: true
No reobf??
Assuming not using the legacy module of course
How do you add that flag to the manifest though? How do you tell which tasks might generate jars that could be used on production? If you make people tell NG what tasks those are... good job, you've reintroduced the reobf style post processing
The other option is that you post process every jar task which... is not safe, to say the least
Honestly, I'll just point to this: #1136320550168436798 message
The longer you keep these systems around, and the more established neoforge is when you finally drop them, the more painful it will be for modders
Unless you plan on keeping them around indefinitely which... is honestly the exact issue old forge had in some ways
Stares at CraftPresence's mega-jar
Uncommon but some people do it
If we want to ensure that that's still possible, easiest way to do it is to change the net.minecraftforge package
Because then the Mod annotation will be a different class for neoforge and forge, and you could make a functional mega jar if you really wanted
that hasn't happened yet? it should
(I don't know if it has)
But yeah, that solves the issue you wanted to solve with your two mods.toml options if that happens
I raised a vote in my discord to see what my community wants, but I'd definitly like to see this as well.
Since if people need to recompile anyways, it would be better to migrate all the naming from forge to neo now rather then later, since long-term it'll be easier on everyone to do this now.
same with the modid if it hasn't happened yet
Yep, exactly my thoughts. Break it all at once to avoid pain in the future
It has the added advantage of making that sort of mega jar still possible with some gradle fuckery
exactly, Id definitly prefer it to just rip the baindaid off
as long as we provide a tsrg to s2s remap net.minecraftforge to net.neoforged.neoforge
Seems smart to me
Well even without that isn't it a simple find and replace?
No because different forge projects use that package as far as I know, like FML, that would end up in different packages after that change
Because the old forge proper stuff needs to be in a neoforge package within neoforged, but the old FML stuff will be in an FML package within neoforged
Shouldn't everything be switched to the neoforged domain?
Yes. Issue is that forge stuff is currently net.minecraftforge.<stuff> while FML is net.minecraftforge.fml. You can't fix all the forge stuff with a simple find and replace without fixing the FML stuff to the wrong thing (it should be net.neoforged.fml not net.neoforged.neoforge)
sorry for off-topic posting: Would a pull request adding a hook for Block#OnDestroyedByPistonReaction have any potential to be accepted?
regex find and replace 
Yes yes but at that point just do what Maty suggested to make it easy
Possibly, but you're likely to get more responses in #neoforge-github - this thread is meant for discussion of the work on porting to 1.20.2
@tacit vale As what do you want to start publishing builds of ngnext? Like versioning scheme etc?
I kind of need to know tonight
Since I want to finish the ports tomorrow
Okey
I will start publishing them then later tonight
That requires a fix to GradleUtils though
We need to make value source providers for the version I think
do we want to think about moving from TC to GH actions?
๐คท it doesn't matter to me if it is functionally equivalent
but it sounds like it would be easier to do later not in the middle of a port
For none of these projects it is actually needed
So lets only do that when and if we need to
And not now
k
how goes 20.2?
also, can we all agree that the "1." is superfluous from now on?
Starting on it
cool
we should start a "goals" list for 20.2 to be "ready"
which brainstorms are a requirement for 20.2? which are nice to have? What other things do we need to have?
the talk of backwards compat makes me think most people don't believe registries or caps overhauls are making it.
The talk of backwards compat is coming from externally to the project and can be ignored
You can't keep compat with removing something. It's called not removing it.
so, what do we want to aim to land vs needs more time to cook?
I get you the goals list for porting tomorrow morning
Still recovering from my missing nights of sleep
cool stuff. have a good night sir!
imo: events, registries, caps
for which of the two 
land these
the rest didn't get anything even close to a workable plan afaik?
Shadows also wanted to fix some reach stuff? That's also breaking but much smaller
if registries wants to get in then someone has to port/rebase it
and also that requires waiting for the actual base port to be ready
Step height stuff, reach is solidified i think
I've got a set of PRs id like to get in during the 20.2 BC window, though they're obviously not necessary this early on - but they are fairly breaking for resource stuff, and that's the replacement of grouped PackResources
They just need ported to .2 right?
so @fallow sundial and @dull bison You guys will need to redo the following commits:
Ill try and patch them over
Okey
I am patching GradleUtils now
And then I am going to push the first 7.0-SNAPSHOT to maven of NGNext
do I need to do anything specieal or is it enough to check out the ngnext branch?
Could not find net.neoforged:neoform:1.20.2-pre4-20230917.110507.
Yep
yea I will do it via diff to the source in the other branch
Okey
Also can you update to the rc1?
To solve the issue coehlrich just mentioned
yup
Just to the RC1
this one #builds message
I think so. @tranquil salmon That is the RC1 build with MojMaps correct?
yes
Then yes schurli
@tacit vale I have a question: I want to support Configuration Caches with NGNext, and the one thing that is currently in my way is GU, it executes native git, and that causes a problem since that not allowed during the configuration phase...........
What was the exact reason we switch away from JGit?
Interesting
It is still on JGit
What is Gradle then smoking
Okey I am going o ignore that error for now
And solve it later ๐
Okey test build of NGNext is now in progress
small problem with the setup ... when running setup and patches fail to apply it does not generate the src folder
1.20.2-rc1: 1 rejected hunks
JGit doesn't support worktrees
You need to run it with -pupdating=true
Yet, GU still uses JGit
Sadly some tests in NGNext are failing, need to check what the cause is, might just be the switch to mojmap, but then I will publish it ๐
gradlew :forge:setup -PUPDATING=true
I knew I saw it somewhere
Sadly that PR breaks gradles configuration cache
So we need to consider that
Still broken?
Okey I will need to check then hold on
Try org.gradle.updating
Actually JGit is the problem
Fuck
If that that does not work then I need to check later
for now I'll just manually extract the output jar
ah -PUPDATING does not work but adding updating=true to the gradle.properties works
should I re-add the source files to git?
No clue
it moved the class head down
get covers on it
unpackpatches or smth like that iirc
I cant run the game because intellij says the command line is too long
?
lol
the IDE run is broken I have to use the gradle task
enable that run option
we still need to remap the coremods
^
orion are you working on de-hardcoding the version in the root build.gradle?
TODO:
- fix coremods
- de-hardcode version
- add runconfigs for
- server
- datagen
- gametest
- fix testmods
Continue the update to the release
Before you tackle any of those
I am working on getting a release ready version of NGNext for the runs and the de-hardcoded version
step by step or directly from rc1 to release?
So focus on getting to the release, the coremods and the test mods
What ever you prefer
I do not care if we go straight to release now
We just needed a particular version that works for the port, and I chose pre4 for that
who's bored and wants to make a primer
I guess you mean unpackSourcePatches
I think we should add a better named task that just depends on the unpack task
I mean it is exactly what the task does
createSourcePatches creates the patches in a zip and unpackSourcePatches unpacks them into the patches dir
right...
but it doesn't give any hint to the fact that it also runs the create task
preparePatches
unpackPatches is correct
But we can create a dummy task
That is known as generatePatches
And internally put unpack as a dependency
Would allows us to wire up some tests to that as well
Nah I will take care of that
I am messing with the tests for NGnext anyway right now
And am prepping the release
@dull bison are you doing the update to release?
yes
ping me when ure done
Okey fixed the neoform unit test for ngnext
Waiting for the build to complete, which takes around 45 minutes
Had to disable the functional userdev tests
They were trying to run on an old MCF version which required remapping
Dangerous thing to disable :p
orion can we disable the compile task on the clean project (since that can not compile anyway)
for now I just have a
tasks.compileJava {
enabled = false
}
``` in the projects/clean/build.gradle
where -beta 
that probably needs to be fixed cos the beta system is currently based on the minor version component
and it will need to be provided externally
(currently as in, the forge code that neo forked)
that version is hardcoded in the build.gradle rn
@fallow sundial ping
ahem
I hard-coded to use legacyclasspath rather than writing out the file and using that. It'll need switching over to the file variant
intellij can shorten it by itself if you set the shortencommandline option to argsfile
you wanted ping so I ping
hmm, what should be the name of a FI that replaces the toboolbifunction in packets, can't name it handler because that's for the non-boolean one 
tho actually
maybe we shouldn't provide one that doesn't set any "handled" status
since it's otherwise quite invisible
is the boolean for the "handled, don't keep searching" flag?
oh based on the other messages, yes
tbh I don't see the point in returning a boolean or having to manually set the packet to handled
if there's a registered handler it should automatically be accepted as handled
yeah you have a point actually
if people don't want it handled they can mark it as not handled manually
That's quite a big API change
coremods are remapped
Yes
do we now or in 1.21? I thought it was said next major
1.21 doesn't make sense, we should stablize by then, not make the biggest break
@tacit vale @kindred fractal happy?
no more exception swallowing in networking
it yeetโข๏ธ
so
who wants to rename the package
maty
Maty wants to rename the package? Problem solved
should we do the rename before or after the big changes (caps, bus, regs)
makes the rebase more work tho
it's a "we have more work" vs "users and modders will have to suffer more"
and i'd rather pick the former when we can
let them suffer oh well
you didn't notice the disclaimer on the applications page?
it was with 0.0009 font
"you're going to suffer"
I did a port cycle I know that already
Repackage once we're ready to mainline, leave it to last
Don't do it in the middle of all the other work
Preferably we'd repackage as first action on mainline once we're merged
There's a huge amount we need to coordinate to do the repackage.
should also do a Ctrl+F for "Forge" to see if anything needs neoification
also, would FML need to be repackaged?
as long as we do it before we release
if we do it afterwards people will spend time for no reason
It'll happen before release
everything needs a repackage โจ
(but the public-facing ones need them first)
running with testmods and after that fix testmods (I know that some of them are broken)
There is no run yet for that
I need to make a run type
I know that is what that part is waiting on
I just realised that the forge:conditional recipe is no longer a thing 
Nope ๐
what
conditionals are now builtin to everything from a datapack
overlays?
alright
yeah but that wasn't the point of forge:conditional
in what version? 1.20.1? 1.20.2?
it was a conditional recipe with fallback
check the thread name
ah right
recipes have been supporting forge:conditions for ages
thing is, forge:conditional is theoretically easy
the problem is the orElse
I mean technically there could be an EMPTY recipe that fromJson could filter out
hmm
What do you mean? While decoding?
mhm
oh yeah null will definitely not work because of getOrThrow
Empty recipe is best because you can't turn it into a Codec<Optional<Recipe<?>>>
rate
RECIPE_SERIALIZERS.register("conditiona", ConditionalRecipe::new);
assuming this is a typo and should say"conditional"?
@dull bison rate my quality commit
hmm didn't whitelist .diff files in camelot
.patch neither? 
does anyone need conditional sounds 
I also can't say I love that solution?
Wait
What do you mean "forge:conditional" was a condition recipe with fallback?
That was not how I interpretted the serializer
conditional is a list of pairs of recipes and conditions
forge:conditional allows you to specify more than one pair of condition+recipe
the first passing one is used
and if none pass the recipe is skipped
yeah ^
the codec is the easy part
the part where it doesn't have to return a recipe is the less easy and less nice part
dummy recipe that matches never and returns air
it's not exactly a nice solution but some people may have use for serializers that mustn't return a recipe too
Can't we just kick back nulls in the recipe manager?
I can't work on 1.20.2 until eclipse is fixed or I'd go look
Codecs crap out on null
it's codecs
so your answer is "fuck no"
lol
optional time 
Unlikely, dynamic recipes have to return air to that method
same answer
the old system returned a null recipe in the serializer
now the serializer is codec-based so the cleanest way is to have a reference-compared singleton that acts as a "null" recipe
if you think about it it's basically a free patch as we already need to patch-in an optional in the recipe manager
That is what we did on the Conditional stuff
hmmm apparently was already a null check in 1.16.5
so either I am majorly brainfarting
I love this
it the thing I'm thinking of is way older
hmm actually
since recipe serializers aren't a registry<codec<T extends Recipe>> but rather use a recipeserializer interface
I have idea 
mhh yes quality comment

hmm
Your codec can get the context
actually
honestly the loading context should just be statically available
yes, there's a dangling comment :P
@dull bison Did we do that
this won't be a good idea now that I think about it
If you can find me a library that works, and allows me to generate them then I will add it in a heart beat
I don't know
If not then We need to write a context injector
I wanted to add a default Codec<Optional<T>> codec() to the serializer but then i realised that it would need to make a wrapper of codec() every time it's called and it would imply a third optional wrapper around recipes...
Isn't the problem with the current system that there is no spec or whatever and its all a pile of spaghetti
it is injected orion don't worry
Correct
Pick one
I don't care which one
Like I can go look but it seems unlikely to exist, lol
yeah... the empty recipe is better 
the more I look at recipes the more I want to send mojang a box of chocolates
as far as condition context goes, making it statically available will make it easier to write tag-loading codecs for things in the reload listener stage
as long as potions aren't handled by it don't
and a static context can be updated from the staged to real tags after load completes so it remains valid afterwards
yeah I'm keeping the initial solution, there's no way I'm making even more wrappers of codecs and of recipes
this is already very efficient (sarcasm for those that didn't notice it)
@fallow sundial Do you remember who found the official definition for the eclipse launch file?
I found a java class on eclipse's github
Link?
not sure if that's what you meant
#1133503211748212886 message
#modder-1โค20โค1-support message hmm
[Reference โค ](#modder-1โค20โค1-support message)Is it possible to not load a GLM when one other mod is loaded? I can't find such condition
this is going to be easy
you can do table-level which replaces it with the empty table or you can do pool-level
Thanks! This will be very useful. ESPECIALLY for screen opening networking
since sending a packet to open a screen and the screen opening itself w/ an exception is one of the things swallowed by this garbage
so I didn't know why my screen wasn't opening
Okey
Added support for server, data and gametest type runs
Now need to port over the args
can you push so I can think about testmods
hmm, good docs
I've been contemplating an auto-id-incrementing overload of the message builders
you bringing that up reminds me
someone brought up the idea of refactoring networking such that each packet gets sent in its own networking channel
so instead of SimpleChannel corresponding to a networking channel, which has multiple packets
each packet has its own networking channel
sooo
EventNetworkChannel
why is packetsNeedResponse a map...
@frail oriole 
oh I see why
I still have no idea what an event channel is
god this looks horrible
EventNetworkChannel is just the barebones skeleton for registering a channel in the FML networking registry
the idea is that you do what you want with the channel by listening to events fired for that channel
SimpleChannel handles those events automatically, and does the decoding of the message by ID (per IndexedMessageCodec) and dispatching the packet to the appropriate decoder and handler
better
Yeah, it's amazing what you can write when 10 years have passed
This code was all born around 1.6
Probably yes
It's for those that wanna bitbang
All this stuff was mostly written when Mojang moved from raw packet handling to netty. That change happened in 1.7 and getting this shit to even work was one of the most cursed coding experiences of my life. It's mostly just been ported forward and forward since then. There was a minor API paintjob in 1.13 but it's fundamentally the same code.
yes
IIRC mod channels were the cursed nested netty in 1.8..1.12?
Yeah
The API paintjob and rework moved them to the same Netty as Mc in 1.13
But the code is mostly the same. Just the plumbing changed a bit and simplified a lot
That's only been possible for 10 years schurli
no mods I have ever looked at used this and it's not documented
There was a third way, that used the events to present a raw byte interface. I removed it because no one used it
This was used by ic2
For at least one
But simple message is super easy and far far far harder to fuck up
this should simplify the boilerplate needed for messages
So not surprised it has never been used
I still wonder if I should have an overload that has an implicit id++
Records probably make a lot of this much easier
And lambdas
The API had to be java 6 compatible
Be careful of making change for change's sake tho
this simplemessage interface makes the only thing you need to configure the decoder, encoder and handlers are done automatically
just a little qol thing
Mod network code is often some of the stuff people write once and never change again
but it halved forge packet registration code 
not mandatory no
my mod, Concord, uses EventNetworkChannels, but only because it uses them as a carrier via the protocol version, and I don't use packets (yet)
had a bit of a realisation
@kindred fractal forge itself uses subclass dispatch event listeners....
and even better, it's in networking 

Well that will have to go
shouldn't be too hard to fix it, right?
i can already envision the refactors
which is giving me the itch to do the refactors 
but i shall resist and defer to maty
go go go
I'd keep as much stuff as possible for after the 1.20.2 port is finished
Unless that's already the case?
Did you rebase on top of the latest 1.20.1 commit yet? (Sorry (: )
So what needs doing on 20.2 atm? Orion?
hmmmmmm
what's the situation with eclipse and ngnext right now
pre4 to 20.2 i suspect
anyway. that was smooth as butter orion. AWESOME
Gradle invokes the "onAdded" callbacks (which we use to configure types and runs) before the one in the script
explain? where?
The configureRunType stuff in DynPro
ok
So that we know what kind of type it is
so none of the stuff in build.gradle is included in the run?
ah
So right now configureRunType runs first
cpw, about #project-talk message
how about https://github.com/neoforged/NeoForge/blob/1.20.x/docs/assets/neoforged_logo.png?
it's a window icon. not a banner platin
well, but resources/forge_logo.png is a banner
in theory neoforged.ico would work
yeah, but that was not the file it was actually loading. i hope. 
here's the ico as a png
so @mental carbon are you saying that in "configureRunType" the code in forge build.gradle for "runTypes" client hasn't happened, so you don't see the arguments yet?
Correct
so e.g. __arguments__ should have the contents from the build.gradle.
Yeah but it does not yet
hmmm
is there a second event once the construction is complete. 
That is the problem
like a postconfigure event
Does not exist
hmmm
could you lean on DelegatingDomainObjectContainer.configure and add one for yourself?
It already is
the configureClosure there on the "runTypes" object
That is the point
If you try to retarget the closure to your self and not the delegate you get an infinite recursion
And a SOE
not quite what i was suggesting. gimme a minute
I could create a manual post configuration callback
That gets leveraged when the type it self gets configured
That could work
yeah, i'm just trying to understand the call path here. but i think that you could do something like that
the closure in "configure" is the config block we need to have executed before we can "finish" right?
i was thinking to create wrapped closure that calls an event on our object afterward execute has been called.
these two lines are the problem right. they're backwards. but we can see the closure in the configure method, so we could wrap it.
so that we have a callback from configureAction.execute after the fact
The problem is, due to the way this works (with it technically being a dynamic method on the pogo class of the collection) we have no way of accessing that closure before it gets to that method
So there is no way to wrap it
i can see the same closure in configure on DelegatingDomainObjectContainer.
No that is not the same closure
That is the outer closure
There are two closures at play
hmmm
One for the collection aka runtypes {} and one for the actual type instance client {}
ok i see
That first one is accessible but useless to us
why is client not in our call path
The second is not
it's just in gradle's
Because it is a dynamic method
Groovies meta class is abused by gradle to make this possible
It injects a jitted method that calls that create method I screenshotted earlier with the closure
yeah. the same one i see
However that hit happens on the delegate
Not on our delegate wrapper
Which is the funny part
You would expect groovy to figure that out
DynamicObject for Type container
But it is intelligent enough because the outer configure call is made on the inner delegate
helpful
So what you are actually configuring in that outer closure is that inner delegate
Not the TypesImpl
yup
And that is a drawback of the system
Gradle can't generate you a custom collection like that
ok
It just is not support for hundreds of reasons
So what I did was I cheated
I wanted the same api
Without the implementation
And created the delegate system to deal with that
Well...m
That is now biting me in the arse
heh
There is a solution
Turn the delegator into a groovy class
And implement method missing myself
hmmm
Ide support is worse
Because idea has a special case for ndobc but that is already broken anyway
i'm looking at NamedDomainObjectContainerConfigureDelegate - the _configure method there is calling something that looks like it should be in our control
this._container is almost our stuff
but not quite grrr
hey orion
we could make this true somehow?
this is further down the call sequence.
false because of this
Ah
"new closurebackedaction"
Yeah but we can't get there
i realize that
I have some other tricks I can try
Like delayed configure
But I can only do those tomorrow morning
What for sure will work
Is an afterEval
Combined with a run reconfigure
hmmmm
target is typeimpl_decorated there
could we override configure(Closure) and do stuff?
We can, but not in the way you hope.....
It would cause a StackOverflow
Because that is the terminating type in the configuration tree
Which then, if you tried to configure yourself, creates a loop
I already tried creating a trait that would allow for post self configuration callbacks
But no dice
The compiler barft at me that I had an abstract method from the trait in the target type
That it did not know how to deal with
Yeah
It is a way for me to not have to write boiler plate code
It allows me to write a single "getIsClient" and have it generate all the needed code dynamically
From loooking into things further you're probably SOL w.r.t. eclipse runs, and will need to adapt whatever FG was using
oooof
See that is the problem
I'm looking through it now
The code that FG/NG uses, is completely not what is in spec
It even goes completely against the eclipse java application specification
I have no idea, I know I looked into this
And I remember looking through the eclipse colde
Eventually finding a class that deals with parsing a java application from the xml
i have a full typeimpl
How?
There's an unanswered question from 5 years ago https://stackoverflow.com/questions/49751875/how-to-create-a-launch-group-programmatically-in-eclipse-i-need-it-to-be-part-o
It mentions an extension point named org.eclipse.debug.ui.launchGroups that is also undocumented
So I'm pretty sure there is no spec
That is what FG6 uses
so just keep doing whatever FG was doing, lol
there is no document
Which I completely not understand
Then eclipse can use the buildship integration
Or write me a wrapper with tests
what are you talking about 
I am not touching that problem with a million mile long pole
what "buildship integration"
You can run the gradle task from within eclipse
that is worthless
In what way?
its just gradlew runClient from a terminal
You kidding?
did they unfuck it at some point?
