https://linen.dev logo
1.21.4 Async Updates Applications
# open-problems
@Mikarific Here's your open thread.
I hope your 1.21 threadstone endeavors succeed.
k
O/
yeah we got async updates in 1.21.4
m
And now we need to find applications?
k
yes
we searched and couldn't find much
m
Cool! I know nothing about 1.21.4
m
@katie! <3 @Savva @Dapple
it's very different to what you're used to there's only one "block update queue", so all block updates queued on the main thread are executed on the async thread
s
updates arent recursive anymore
thats the biggest difference
k
yes, no ITT or similar either 😔
s
and also there is almost nothing happening instantly now (not just lack of itt, almost every regular instant event was moved to a tile tick or a block event etc)
m
"so all block updates queued on the main thread are executed on the async thread" Very very cool.
k
its interesting but does mean you cant easily race block updates against one another
also probably there's a chance for CMEs there but I havent checked
m
But the main thread can probably execute tile ticks, block events, entities or tile entities while the async thread goes through the block updates list, right?
m
async thread can't see block entities, so any block update that reads a block entity will see null instead whilst the async thread has the queue
k
yes
m
Very nice.
k
it is theoretically possible to get multiple async threads in the updater but the race window is tiny
c
interesting
does redstone power flag exist in new versions?
k
yes
m
yes!
c
because we could maybe turn that off if so
k
I mean you can do that with an update suppressor no?
m
we're also beholden to 1.19 update skipping mechanics, eventually whatever's keeping the thread alive (technically wrong, the thread is always alive, it's just normally... yknow... doing it's networking job instead of processing block updates) will update skip
c
its not that simple
you can do it in 1.18
s
current promising search vectors - 1) race condition in simultaneous start/finish of 2 update queues 2) creating an async queue which is spammed by an integer limit of updates from the main thread, this will break down its logic and cause (among other effects) the updates to become recursive again 3) generating a loot table of a chest cart asyncly (async update comp which reads detector rail which has a mineshaft cart on it) 4) creating an exponential line. Currently the approach is to build a thing simmilar to 1.16+ instant reset instant buds (the ones with the dust on the trapdoor), but instead of the instant reset on the same thread, they are reset asyncly on the main thread. This approach should work, just an engineering problem (also its only useful if the 2-nd idea works, cus exponential lines only make sense if the updates are recursive) 5) race in piston code that allows to move any block (combined with dust experients, we can place any block on a block update call, which will allow us to create a b36 of any block that is already in the world) 6) the async thread cant access block entities from the level, so it interacts with some blocks like banners and comparators weirdly, but thats only interesting for practical stuff 7) when the async thread reaches update skipping limit, while it processes its backlog, all of the other updates in the world on any thread cant be scheduled, thus level behaves exactly like during update freezing for couple minutes 8) because the update queue is lifo, some updates at any time can get stuck in the backlog 9) rpf 10) palette corruption might work, but all writes have thread lock, so it has to be a read during upsize or during palette being reloaded from disk or smth
c
what are the async block updates actually in btw?
k
netty io thread
m
^
c
are they just breaking a floating comparator?
k
ye its a comparator update from an async loot table fill
m
i wrote a very quick and dirty mod that makes them artificially for testing purposes
c
ok
m
from powering a beacon because how else would you implement it
k
the code for dungeon generation checks if a block is air, and if it is then it spawns a chest and then spawns the loot table, but if you break the chest and leave the block entity w/ a suppressor, then it puts the loot table into the existing chest
m
Is the mod published anywhere? We might find some interesting things just by experimenting with it.
k
this was found by dapple
c
btw, if update multiplication is ever needed, you must not use much redstone components like observers or repeaters or comparators the normal way
m
Thanks
m
it's basically just this mixin
Copy code
java
@Inject(method = "neighborChanged", at = @At("HEAD"))
    private void beaconPowered(BlockState state, Level level, BlockPos blockPos, Block block, @Nullable Orientation orientation, boolean bl, CallbackInfo ci) {
        Block beacon = state.getBlock();
        if (!(state.getBlock() instanceof BeaconBlock)) return;

        if (level.hasNeighborSignal(blockPos)) {
            MinecraftServer server = level.getServer();
            if (server == null) return;

            EventLoopGroup eventLoopGroup;
            if (Epoll.isAvailable() && server.isEpollEnabled()) {
                eventLoopGroup = ServerConnectionListener.SERVER_EPOLL_EVENT_GROUP.get();
            } else {
                eventLoopGroup = ServerConnectionListener.SERVER_EVENT_GROUP.get();
            }

            eventLoopGroup.next().execute(() -> {
                try {
                    level.updateNeighbourForOutputSignal(blockPos, beacon);
                } finally {
                    server.getPlayerList().broadcastSystemMessage(Component.literal("Asynchronous block updates terminated."), false);
                }
            });
        }
    }
k
our setup is to open the chest and then set the loot table (since otherwise opening the container populates the loot table), then scrolling a bundle sends the packet which populates the chest
m
there's also a mixin which does a chat message any time an async block update happens
m
I'll probably make the proper mod as either a fork of carpet TIS addition or something similar
k
why fork instead of just adding ur own rule lol
m
because i think it makes more sense to PR this to there
instead of maintaining my own mod lmao
k
fiar
carpet api is quite simple though
m
am aware, lol
c
this thread is on is one that is quite important to minecraft right?
m
It seems like there are still palettes (Linear, Hashmap, Global) in 1.21. Even though I doubt word tearing exists, I do think you can get a palette corruption if you upsize the palette while another thread is modifying blocks.
k
not really
it handles player packets but nothing else
c
word tearing doesnt exist in 1.16+ iirc
m
theres more than one thread that handles player packets
k
yeah there's one per cpu thread
m
Yes, but upsizing palettes is still possible and possibly chaotic
k
worst case you have to relog
s
the entries arent spread into different longs and the writes have thread lock
m
we're using one of them
c
yes thats been tested before
m
Tested in 1.21.4?
c
1.21.8 but its definitely the same
k
the palette change is atomic but you can probably still do something with it
t
Oh yay already public \o/
c
i threw together a mod that made async observer lines and also took away tile ticks from observers and made them update multiply
k
falling block is regrettably gone
s
^ noone checked reading the palette while its being loaded/saved
c
around 1.18
but you can do weird stuff with palettes
s
same for enderman
k
lol i never thought about enderman
s
also silverfish
(they dont work)
c
if netty io thread crashes does the game function properly still
k
yeah
well I mean
depends how you crash it i guess
if you just throw an exception I think it'll be eaten and the thread will survive bc its being called from bundle packet handling
if you kill the thread nothing much happens, if you kill all of them you cant join but you can just restart server to get them back
c
oh is this multiplayer only
k
no
m
i mean we don't have a singleplayer setup yet, but it should be possible
k
well I don't think it would be at least, I imagine it should work but you might not be able to send packets anymore
worst case just open to lan to spawn more netty threads
c
oh if there is multiple netty io threads we should be good and can turn off rpf
k
there's one per cpu thread iirc
I get 8 on my machine so
m
If there's stuff like this in 1.21.4 I wonder what hasn't been found yet in 1.12
c
i haven't thought this through completely but i think its possible
m
To elaborate on the survival setup: - place a bunch of data in a chunk with a dungeon. you want the loading of this chunk to be slow so you win the race, also set this chunk up to be regenerated (you can do this in a few ways) - Have a player die, stay on the respawn screen - use [Entity ID Suppression](

▾

) to spawn an entity with the same entity id as the player - click respawn, the player is now dead on the server but alive on the client - walk over to the chest on a chunk border with a dungeon that hasn't generated yet - create a small lag spike on the server - open the chest (make sure theres a bundle in it before you do this) - before the gui opens (you have time due to lag spike), click on a respawn anchor which explodes the chest - suppress the chest breaking so the player stays in the chest - allow the dungeon chunk to load, it will put loot into the chest - scroll in the bundle to generate the loot, since the player is not ticking (due to being dead), the loot won't have generated by this point - loot table populates on netty io thread, profit
k
I'm not super up on 1.12 threadstone, whats the point of turning off rpf
like what do you gain
interestingly the loot table being set is also async
unfortunately it doesnt emit updates
but that does happen in new versions too
s
easy bud reset for all instant lines within the setup
c
i think big tree was aggressively fixed in 1.13
so thats not possible
g
well this is a very interesting development
c
very
g
considering world gen was rewritten, and it doesn’t exist in 1.8 either, very likely
c
not just that even
iirc they rewrote its code because of some bug report
@Marpace i think told me this
g
I looked into big tree bug reports a while ago too yeah
m
Yeah I sent the report in some channel here earlier
c
i remember that it was aggressively fixed
bird tearing alternative if we find another illegal item method
can i have pin perms
m
I will say there’s a soft “deadline” of finding things of april first, since I will be making the well produced more “public” youtube video on whatever we manage to find
m
You now have pin perms, even though I think I can perfectly handle pinning the few messages that need pinning
c
thanks
k
I checked briefly and I believe the entity manager doesn't have any locks, so maybe some opportunities there
m
I will not let you bury this in discords until april
k
unlucky mika myren's gonna post a video before you
m
I'm not going to post a video without your permission, unless you plan to not make a video until april
m
this is a tragedy
d
Mika how fast can you edit with your animation library
k
this setup also involves 1.21.4 chunk regeneration, also found by dapple
d
Ehh
I found depth boxes
k
eh thats chunk regeneration though
d
But I honestly wonder if just doing it with book boxes is better
k
nah its so much more annoying lol
x
what changed in 1.21.5 to break this?
k
they fixed the bug with the packet in 1.21.5
s
@Dapple go read the cart idea
m
to be fair dapples method requires starting in 1.21.0 and updating
k
ya but theyre useful in every version lol
m
eh i’m not fast, but i’m not like… a turtle either
i care more about quality of the video than i do about getting it out quickly
for reference for everyone else, i've been working on an animation library as an extention of specifically made for minecraft explainy videos it does nice 3D renders and things https://cdn.discordapp.com/attachments/1555590693332713513/1555602297130848356/project.mp4?backend=b2&ex=6ac11f09&is=6abfcd89&hm=5d3d3e836b47997051aa9dc103a135b3c6149433556f82671fae1b8b1796be11&
d
Do you think we can get a video out by december
What’s the cart idea? Can you direct me
c
if enough people are interested sure
s
in pins, third point
m
message has been deleted
ill just forward it
s
no thats not the one
generating a loot table of a chest cart asyncly (async update comp which reads detector rail which has a mineshaft cart on it)
m
i wasn't done forwarding the multiple messages i was going to
but yeah
message has been deleted
d
I mean if mika can
m
im not sure it's worth doing so until we have a catalog of at least one thing that's somewhat interesting that we can do with the block updates
d
pretty sure it just duplicates the loot, and loot generation seemed pretty safe in vanilla
don’t quote me though
j
I believe we can fuck the blockstate palette by modifying it at the same time with an async and the main thread
s
what if the main thread places an item into the cart while async line generates it
j
Word tearing isn't possible sine 1.16 afaik
s
doesnt that cause a race with components or smth
writes have a lock
d
no
c
ive done this in 1.21.8 with a mod before
d
the only race is if an item gets mutated then copied
I sent the snippet
let me foreward it rq
m
and what happened when you did it?
c
you can get blockstate linking
j
Fuck
d
message has been deleted
m
Can you show your setup for that? Getting blockstate linking in 1.21.4 would be very cool
c
i can get that later
d
the components get added then validated
if a separate thread copies the itemstack at the right time, you could probably get items with incorrect/illegal components
speculation but I think it’s possible
m
implemented slightly differently to how you normally do it
it's a comparator update
m
Ah, I need to put a floating comparator next to it. Ok
m
it's calling updateNeighbourForOutputSignal on the nettyio thread, so put a comparator next to the beacon
it'll call out in chat when you get one
s
the thread is also very slow
k
it must have reduced thread priority or something
m
But the comparator needs to be floating, right? It won't instantly execute its tile tick, it can only pop off.
s
yes
m
yes, floating comparator
k
I guess it would schedule the tt asynchronously
c
put it on a trapdoor
k
that doesnt work anymore
m
Can I get pseduo-floating comparators by flicking trapdoors in this version, or do I need to setblock them everytime?
m
it's harder to do that now than it used to be, can't just open a trapdoor under one
c
and send it to the mainthread
oh
k
you have to setblock them, use an update suppressor, do it with headless pistons, or use a variant of comparator duping
m
there's two easy ways headless piston failed retraction and comparator dupe i'll send you a setup in a second please hold
k
personally I would just setblock it
s
we already have a contraption to keep the thread alive, but i deleted mc so cant send the schem
m
Yeah, for testing purposes I will just setblock it
k
sponge dong
s
the idea is to lag the async thread with sponge updates while the main thread schedules new sponge updates every so often for the async thread to execute
the downside is that it's a comparator dupe
if you don't like duping
k
people who care:
i like this less just because it's harder to reset
k
easy to reset in gmc tbf
m
yeah yeah just setblock the comparator
m
How can you get blockstate linking, when there is a thread lock causing exceptions if multiple threads write to the same subchunk at the same time?
c
i need to look at my setup and mod to know
k
I imagine getting barrier from structure is potentially possible
m
in block form, at least
k
yeah
c
@Mikarific can u make a mod with a palette command with size, bits?
m
If on the main thread I instantmine a block with a silk touch pickaxe, but the async thread upsizes the palette in such a way that the main thread reads out bedrock instead of the mined block at the right time, can I get a bedrock item?
m
at this point I should just make a git repo and open it up to PRs
c
i dont have a fabric/cactuscreative_fab_mdk/1.21.4
m
but yeah sure
k
silk touch doesnt work like that anymore
m
This would be a race condition involving read out instead of writing, so it might work
sad
m
not right this second but yeah
k
everything is loot tables now, stuff with silk touch just checks the enchant
c
to this day there is a race condition in rabbits eating carrots
its less useful in new versions because loot tables
k
whats the race condition
they can only eat carrots seemingly
c
let me look at the code
m
i talked to the guy who added rabbits once nice guy, he moved on to work on helldivers 2
k
from
Rabbit$RaidGardenGoal
Copy code
java
public void tick() {
    super.tick();
    this.rabbit
        .getLookControl()
        .setLookAt(
            (double)this.blockPos.getX() + 0.5, (double)(this.blockPos.getY() + 1), (double)this.blockPos.getZ() + 0.5, 10.0F, (float)this.rabbit.getMaxHeadXRot()
        );
    if (this.isReachedTarget()) {
        Level level = this.rabbit.level();
        BlockPos blockPos = this.blockPos.above();
        BlockState blockState = level.getBlockState(blockPos);
        Block block = blockState.getBlock();
        if (this.canRaid && block instanceof CarrotBlock) {
            int i = blockState.getValue(CarrotBlock.AGE);
            if (i == 0) {
                level.setBlock(blockPos, Blocks.AIR.defaultBlockState(), 2);
                level.destroyBlock(blockPos, true, this.rabbit);
            } else {
                level.setBlock(blockPos, (BlockState)blockState.setValue(CarrotBlock.AGE, i - 1), 2);
                level.gameEvent(GameEvent.BLOCK_CHANGE, blockPos, Context.of(this.rabbit));
                level.levelEvent(2001, blockPos, Block.getId(blockState));
            }

            this.rabbit.moreCarrotTicks = 40;
        }

        this.canRaid = false;
        this.nextStartTick = 10;
    }
}
c
its somewhere here i think but im on mobile and cant see
k
I guess you could replace it with a lower tier of carrot but it does check if its a carrot still
s
ye it calls destroy by position
no you can replace it with any block
c
no
you can replace it with anything
s
but its not much different from a piston creating a b36 of any block
d
Not possible though right?
Like without redstone experiments
s
depends on existence of palette corruption
d
There is a direct call with a banners cached state, but I believe the only caller is pickblock
k
unfortunate
pick block is serverside but I think the code can only ever give you items if youre in gmc
d
If there’s another caller though maybe it’s possible
I didn’t check extensively
m
oh we haven’t explained the update freezing yet
nvm savva did (#7)
k
the game doesn't have much global state anymore unfortunately
m
If you can get two threads to execute redstone dust code at the same time, you could get permasuppressed redstone dust. But I'm not sure I can get the main thread to do redstone dust update code while the async thread has taken over the update queue.
c
historically, this destroyBlock call would happily drop whatever was there by the time it was called but loot tables make that not work https://cdn.discordapp.com/attachments/1555590693332713513/1555612851140567160/IMG_5105.png?backend=b2&ex=6ac128dd&is=6abfd75d&hm=a6f47ba40796106f6b399fc3a63cfd69562b269fb8076fe2c73db58e11986b11&
k
in theory you can get multiple threads in the updater but I don't know how feasible it is
we also found you can prevent the server ticking entirely while still having players online which might be useful for something
new versions stop all server code and go to just ticking player connections if nobody is online for a certain amount of time (60s by default), but you can convince the server nobody is online with update suppression, which results in a weird state where nothing happens except your packets (no chunk unloading etc)
s
you can get any amount of threads as long as you overflow the update counter in the queue
k
I guess
that seems challenging though lol
2.1B updates is a lot
s
they arent 2.1B updates
they are 2.1B calls for an update
from the main thread
k
idk if thats any easier tbf
cos you have to schedulet hem all without doing any updates no?
s
thats like a couple minutes worth of update spamming on the main thread
k
I guess if you have some kind of update doubler
s
just pre schedule
like literally imagine a portal frame with a bunch of droppers with pre scheduled tile ticks
k
thats a good point
s
or falling sand entities being ready to land
k
I mean the thing is a lot of stuff still needs updates to work no?
I feel like it would be ideal to get the async thread to do something that isnt block updates lol
but idk if that exists rly
s
try generating a chunk i dunno
async line can : - break a nether portal, - schedule TT, BE, etc, - create obby from liquid - create water from frosted ice ? - cause a sponge to remove water blocks - send a light update - schedule more block updates - can generate a loot table or generally access the contents of a chest minecart
mb async update adds an entry in an unsafe structure which reuslts in it containing garbage, lets say it addds a new entity which makes the entity list upsize in a weird way so now its full of garbage. Then the main thread calls tick method on garbage and it just happens to be a bit by bit copy of a chest cart full of command blocks with 0 health
i have no idea how java works in this regard
k
the remaining entities would probably just be null
unless its some unsafe list implementation which would be very odd
m
It's very hard to get garbage data in java. Upsizing a list on an async thread is not enough for that.
k
blockentity
blockState
corruption is an interesting avenue potentially
lots of stuff unchecked casts it but I don't know if any of that is useful really
m
Yeah, maybe. But the "bit by bit copy of a chest cart full of command blocks" is not something that has a realistic chance of happening in java
I absolutely think we should try asyncly upsizing lists, like entity list or tile entity list. But we can't expect true garbage data, like you could maybe get in C
k
yeah definitely not
k
banner erased
wow
s
message has been deleted
d
no cauldrons needed
r
Well this seems fun
Finally an excuse to learn about modern versions
c
agreed
m
i’m interested in your 1.21.8 palette corruption
i’m not entirely convinced it’s possible yet
i may be missing something
c
i will find the setup when i find it
its probably in some backups folder on my d drive or something
m
it’s all very different from what you’re used to i’ve been having to learn about 1.12 more myself lately, so this is my excuse to learn about old versions
r
Btw, that animation library you showed off earlier in the thread seems very cool. Is that released somewhere yet? Would love to help push it along, I've got use cases of my own for something like that
m
It’s not published anywhere at all atm
it’s… not really that mature
i’m kinda making it purely for myself
r
Fair enough
m
i may throw that into a public git repo and let people help if they’d want to
Since the majority of people in this thread are coming from a background of 1.12.2 threadstone, I’m going to try and list the most notable differences from it. It’s worth noting that I’m not super familiar with 1.12.2 threadstone so I’m trying my best here. Differences: - Block updates are not recursive anymore. - Block updates use a LIFO queue system, introduced in 1.19 to patch StackOverflow based update suppression. There’s a limit of 1 million chained block updates before the rest of them will be skipped. - One block update queue exists per dimension, so if the async thread is currently what’s processing block updates, any new block updates will just get added to that queue from the main thread and executed asynchronously on the async thread. For as long as async block updates exist, main thread block updates don’t. - ITT no longer exists. - Any thread that isn’t the main thread cannot see block entities at all, getBlockEntity will return null. - Word Tearing is not possible anymore because values are not split across longs. Similarities: - The redstone power flag still exists. This is incomplete, I’ll try and update it as I think of things.
c
Here's some information about threadstone in the past btw: https://github.com/Threadstone-Wiki/Threadstone-Wiki
I made myself an MDK for 1.21.4, and have started work on a new mod: "New Version Threadstone Utils"
I want to add fake itt and some other stuff
m
Can I make a git repo for a carpet addition for threadstone stuff in 1.21.4 and we can all contribute to it?
k
i dont really see what fake itt would accomplish
m
I'll polish up the stuff from my quick and dirty mod to make it less shit and make a few carpet rules
k
given that you cant use it in an actual context
m
makes it easy to throw async updates into things for testing purposes ig
then you can make a real setup later to get the same update there without ITT
what's MDK stand for?
c
mod dev kit
k
somewhat antiquated term lol
it used to be when you wanted to make a forge mod or such you downloaded a template project called the MDK that you would modify to your liking
not so much of a thing anymore we just call it an example mod lmao
m
riiight i thought that was MCP?
c
i just have a folder that has the names of a bunch of loaders with mdks for each version
m
idk i never did mod dev from versions that old
k
MCP was a specific MDK
m
ic ic
k
sort of a forge precursor kinda deal
c
shut up bro i started modding in a way older version
k
gg youre old now
but nah I understood what you meant
m
i did a few forge mods back in 1.8 but i never learned the term
m
What exactly is the version range on this?
k
1.21.2-1.21.4
m
1.21.2 - 1.21.4
shit
im slow
im getting whipped and nae nae'd by katie
k
the relevant mechanic was added in 1.21.2 and the issue is fixed in 1.21.5
m
😔 it barely doesn't overlap with sound suppression
c
sure but i will still make this on the side since in the past it takes way too long to get merged
m
if we get an exception in
getChunk
we can reintroduce it
m
true!
I was interested to see if anything like that is possible because the synchronous parts of getChunk have always seemed cursed to me
m
fair enough, i just figure that if we make a specific addition for this it's easier to keep things updated as a small group if it was just me i'd fork TIS carpet or something but it seems like others want in so our own carpet addition mod makes some sense
k
I would just make your own ngl, gonna be easier to understand and incase TIS has some mixins that cause us issues would be nice to have something minimal
m
in fact, if sound suppression did still work, the setup to get the async update would be way easier
k
would it
oh because shulker box
m
mhm
and we avoid the like... multi-hour wait of EID
k
its a bit of a shame we have to do EID suppression to get a new update lol
m
but mostly bc shulker box
k
since the removed player will be timed out after the setup runs so you cant reuse them
m
if sound suppression still existed that would mean shulker box can inherit the nbt data of a chest still, which means we can just do a dungeon regen once and get ungenerated dungeon loot in a box and reuse the boxes over and over for the updates
but alas, we don't live in that world and must actually regenerate a dungeon every time we want an async update
k
ya unfortunately no non-cancer-inducing way to get shulker without block in this version lol
yeah the more i think about it the more sense this makes
c
1.21.4 seems to have a 15 bit registry palette
(this is in getChunk on the ServerChunkManager)
for anyone interested heres 1.21.4 registry palette
k
what even determines the order of this thing
I would assume its just the order of Blocks
im not really sure how you would do palette corruption in this version ngl
m
pin worthy?
c
We cant do word tearing so idk if its really helpful
i just put it incase someone finds some use case for knowing those
m
fair 'nough
c
im so not used to Brigadier for commands
m
oh right you're pre-brigadier
i knew someone who used brigadier for a discord bot 😭
c
the 1.12.2- way im used to
k
monkeys bot
I have also done it
brigadier is nice
c
i need to adapt
k
interesting?
so you can race gets against sets i suppose
m
if there's something that literally just does get & set then this could maybe cause corruption
so I guess if word tearing a getBlockState call is useful anywhere that's a possibility?
c
whats getBlockState's source code again?
k
uhh it is actually
you could do it to piston code right?
and then it would move a block and place it again
c
do we have anything that can keep the update alive?
k
from the async thread
c
yes
m
yes
c
show
k
message has been deleted
sponge dong
there is sloped rails in the dorito
m
throw the update into something slow, long enough to start an observer clock, observer clock just keeps adding things to the queue
k
yea sort of anything slow works ngl;
turns out sponges are slow
m
inside the sponge dorito is sloped rails
k
you can also just load chunks, thats pretty slow
if you freeze the main thread somehow then chunk loads are extremely slow as well i suppose
m
message has been deleted
inside dorito
c
so you can keep the async thread in there but there isnt anything you can do with it?
m
we haven’t found much
k
wdym?
the update queue is last-in-first-out so if you queue a new update it will be executed immediately and then return to the dorito
m
eventually the “dorito” update skips, and for the period while it’s going through the backlog of updates in the queue nothing else can be scheduled, it’s “update freezing”
k
we dont really have any uses for async threads currently though
theyre kinda hard to use bc no ITT and only one update queue
m
I think the piston pulling could be viable?
c
well i meant is there a way i can get the update to last long like by making more or something
m
like for blockstate corruption
k
yeah good find
im not really sure i understand what you mean
m
is that not what we just showed you?
c
what can i do with the sponge contraption
if i wanted async updates
k
it takes a while to process updates when theyre in the dorito, so if you build an observer clock pointing into it the async thread will stay alive
m
remember, all updates are async for as long as the async thread is the thing executing the queue
k
because it gets updates scheduled faster than it can process them
c
ah
ok
m
the dorito just throws more shit into the queue to keep that the case
faster than the queue can drain
make sense?
c
yea
is there a litematic of that
k
its just a bunch of rails and sponges lol
c
its more i dont know how many i need
m
eventually you hit 1 million chained updates, and it’ll skip the rest after this happens, but before the backlog of updates that never happened (due to us constantly putting more in the queue) finishes, no block updates can be scheduled at all
i can’t get you a litematic rn
but yeah
k
this async tech is sort of hard to find uses for because you cant race updates against eachother without some ultra bullshit, and you can't instant schedule anything anymore, and world access is well locked
c
how many rails need to get turned on and off inside the sponges?
k
idk try like 30
less if you just build a faster clock i guess
m
until it’s slow enough™ for your liking
k
probably also depends on your hardware
m
is there anything that could significantly slow down main thread chunk access similar to cluster chunks?
hmm, it caches the chunk in a list of 4, which probably covers most of what I would want to slow down piston code
m
you could also make more than one dorito
k
cluster chunks? lol
they should work just fine in this version
m
well it seems like they might not
k
well, other than the last chunk cache i suppose
m
mhm, I don't think it can help too much with race conditions then
k
its a shame that code has a thread check, would be interesting to swap chunks in the world with that lol
m
we really need a better name than “dorito” but that’s the shape and color of the first one LMAO
k
well, if you force any kind of chunk load the cache will be emptied but I suppose it would depend on what exactly your goal is
m
THAT WOULD BE SO COOL!!!! Mojang release an emergency patch for 1.21.4 that removes that check thx
m
like… “thing that processes slow updates such that it adds more to the queue than the async thread can execute in that time”
c
that looks nothing like a doritos color
k
it looks a bit like an original flavor dorito
m
I want to slow down during the getBlockState calls in piston code, as that would help for making blockstate corruption more feasible
k
I suppose you could have a slime structure extend across a chunk border?
m
I might be completely wrong about this when I consider it again
like how would it help?
the race condition is in the palette access, not in the piston code itself
k
that's a rather good point lol
m
it would probably be good to find something to actually do tearing with as well lol
it's just any sort of state change on block update, which is limiting, but surely something can happen from that
k
word tearing doesn't exist anymore since values are never split across multiple values in the backing array
m
ah
k
i guess the bit manipulation was inefficient or something
m
that makes sense, idk why they're stored in longs then lol
or wait
ohhhh
it packs multiple into the long but never across longs
k
yeah
m
that’s worth putting in my differences message
k
I am not sure how you would perform a race condition with this code actually:
Copy code
java
protected T get(int i) {
    PalettedContainer.Data<T> data = this.data;
    return data.palette.valueFor(data.storage.get(i));
}
this is the palette code we get to race with
m
no we can race that against a set call
but it does nothing interesting
you're right
I thought that they were split across longs which would do something
k
well I suppose there is a teeny, tiny race condition there
but it is probably impossible to actually hit
m
something productive we could do is find a more efficiently slow thing like we want to use the fewest number of block updates possible to cause the most amount of time required to process said updates that way the queue skips after more time, and we have more time where block updates are async
k
Copy code
java
protected get(I)Ljava/lang/Object;
    // parameter  i
    ALOAD 0
    GETFIELD net/minecraft/world/level/chunk/PalettedContainer.data : Lnet/minecraft/world/level/chunk/PalettedContainer$Data;
    ASTORE 2
    ALOAD 2
    GETFIELD net/minecraft/world/level/chunk/PalettedContainer$Data.palette : Lnet/minecraft/world/level/chunk/Palette;
    ALOAD 2
    GETFIELD net/minecraft/world/level/chunk/PalettedContainer$Data.storage : Lnet/minecraft/util/BitStorage;
    ILOAD 1
    INVOKEINTERFACE net/minecraft/util/BitStorage.get (I)I (itf)
    INVOKEINTERFACE net/minecraft/world/level/chunk/Palette.valueFor (I)Ljava/lang/Object; (itf)
    ARETURN
oh wait they do an atomic
this.data
read anyway, not sure how I missed that lol
function literally has two lines and I didnt read one of htem 🧠
meh, this is somewhat worthwhile but you could always just make another async thread ngl
they arent that hard to make
m
with EID being required to make one, this is quite annoying
k
yes but if there's fuck all to do with them it doesnt matter lol
m
fair
c
the sponge dorito method doesnt slow my game too much
m
i’m wondering if the hardware of my server was just that shit
i knew it was shit
c
can i run many of them
m
but i didn’t know that it was that shit
yes
we also didn’t check why sponge was so slow, it’s possible it was like… lithium or something
k
its pretty shit
m
but generally the idea is that you need a “slow thing” to throw them into
k
just put 1.21.4 on prototech/kiwitech snapshot server 🙏
nobody will notice anyway
m
ngl i can just ask jkm for a wave cmp LMAO
this is why something really efficiently slow would be nice
we want one block update to take as much time as possible so we can use fewer of them
k
I mean literally just a line of dust that goes through 5 chunks will be pretty slow
thats why the sponges are slow I suspect
they call
getChunk
a lot which schedules to main thread (which takes a while)
c
running 55 of them seems to work
m
yeah that’s… gonna skip really fast
k
meh
just crank up your max update chain length for now, we can find slower updater setups at a later time when we have actual uses
m
oh yeah there’s just a setting for this to go above 1 million, that’s just the default in server.properties
i’m not sure how to change it on singleplayer?
k
if you can change it it would be in your options.txt
c
and now after making an async update all updates are async?
k
yes, there is one updater and all updates go to it
if the async thread is processing it then all shape/neighbor updates will go there
m
no, you need to run the async update before the doritos start running
k
oh, yeah
m
otherwise the async update is added to the existing queue and executed main thread
c
and keep it alive while i flick those all on?
k
preferably yes
its not, so you cant change it in vanilla
probably theres a carpet rule to
m
you can change it in vanilla, on a server
but not singleplayer
k
I felt that it was implied from context that i meant singleplayer but yes
m
fair enough
k
read through the
CollectingNeighborUpdater
code if you wish but basically there's a variable storing the current scheduled count, and the neighbor updates will just be scheduled if the counter is >0
only if its <=0 will it start running the queue
hence savva's idea to overflow the counter to get two updaters running at once
m
there is only ever one queue, you need to start the queue async and keep it alive if there’s already a queue, the update will get queued async but executed on the main thread which is bad
c
how am i supposed to do that if the only way to keep it alive is with the dorito
k
well you run the initial update into a dorito or several and then start the rest
m
throw the original update into something slow as shit and start the rest before it finishes
k
or just something else slow, yes
like a rail into an unloaded chunk with a bunch of NBT or such
m
the doritos are also just “something slow as shit”
there’s 100% better “slow as shit” things we just didn’t spend much time on that
k
it is possible for updates to be straight up deleted btw
m
yes, while a dorito is keeping them alive sometimes updates just won’t happen
k
Copy code
java
private void runUpdates() {
    try {
        while(!this.stack.isEmpty() || !this.addedThisLayer.isEmpty()) {
            for(int i = this.addedThisLayer.size() - 1; i >= 0; --i) {
                this.stack.push((CollectingNeighborUpdater.NeighborUpdates)this.addedThisLayer.get(i));
            }

            this.addedThisLayer.clear();
            CollectingNeighborUpdater.NeighborUpdates neighborUpdates = (CollectingNeighborUpdater.NeighborUpdates)this.stack.peek();

            while(this.addedThisLayer.isEmpty()) {
                if (!neighborUpdates.runNext(this.level)) {
                    this.stack.pop();
                    break;
                }
            }
        }
    } finally {
        this.stack.clear();
        this.addedThisLayer.clear();
        this.count = 0;
    }
}
the async thread is in this code so if the
for
loop starts then any updates scheduled before it finishes just disappear
c
AH
I GOT IT
and i can keep it alive with just one dorito i guess
k
seemingly the network threads are pretty slow
m
ah so it’s not just my server being god awful
that’s good
yeah just on their own they’re pretty slow, it helps
k
btw the default thread count is the amount of available processor cores times 2
m
we’re only using one of those threads
k
you can override it with a system property tho
m
if you have it correctly you can break a banner with a block update and it’ll lose its data
k
thats a fun way to test
m
that’s how i’ve been testing yeah
and yeah in this state sometimes updates just don’t happen but they more often do it’s weird
k
ig its bc if you hit the race condition they disappear
m
^
c
wdym with a block update
k
put it on a block and then punch the block
m
place a banner on a block and break the block
c
didnt work
my chat is spamming update terminated tho
m
ah, that shouldn't happen
thats from this mixin
terminated happens when async updates are no longer happening
c
why is it spamming it
m
i implemented the beacon thing really terrribly
k
probably you have a beacon somewhere that's being updated
c
oh LOL
i did
m
any block update a beacon recieved while powered attempts to update nearby comparators async
k
I suspect you put a rail next to a beacon
c
no its stupider
i had it on my observer clock
k
🧠
m
when that attempt is done it says "terminated"
what you want is one "async update achieved at XYZ" message
then terminated should not happen
until like way later when it skips or something
remember the mod i made is implemented differently to 1.12.2 beacon carpet rule
it updates nearby comparators when a beacon is powered
the beacon itself is not giving off updates
its implemented that way because thats how the survival update happens aswell
k
yknow mika how does this thing even work
surely in order to update the beacon the main thread must be running the updater
so sometimes this shit just doesnt work if the netty thread gets to the task too quickly
m
you press a button next to a beacon or something, it gets powered, the beacon gives off a async comp update, then you don't use the beacon anymore?
k
yeah but the button updates the beacon, so the main thread is running an updater
m
wait why does this work
lol
k
bc the netty thread is sort of slow
so the updater is already done when it gets around to the comp update
m
oh LMAO
k
but sometimes it wont and the main thread will end up running the update instead lol
m
maybe this should be implemented differently xD
k
genuis
m
well at least you know if the update worked?
because if this situation happened the "async update achieved at XYZ" chat message doesn't happen
so my quick and dirty mod isn't uselesS
k
lol
I mean most of the time it should work but it is kind of stupid
I was thinking about it earlier because I couldn't work out why it would work
m
anyways... you want a floating comparator next to a beacon then power the beacon and run something off of the comparator
if you get "async update achieved at XYZ" then its good
c
what do you mean by point it into a dorito btw
k
BUD some rails in a dorito such that the comparator update depowers/powers them
m
so in this you see how there's two of the doritos?
c
oh i see
m
one has a comparator pointing into it
k
its a shame that the experimental redstone updater isnt a thing because it has a bunch of extremely-permasuppression-shaped internal state
m
and the rail is budded so that the comparator breaking will make all the rails inside power
then shortly after the comparator is broken the observer clock is started which keeps that queue alive
if it doesn't stay alive add more observer dorito
or run the initial async comp into block updates that are slower to let the observers take over before that finishes
given that we can't use any block updates to create the block update, how should this mod be implemented actually?
i guess we can deliberately wait until the queue doesn't exist to start the queue async?
thats an option
I'll probably do that in my proper actually decent mod
k
personally I would probably make an observer on top of a beacon or something
or like
observer out of beacon?
¯\_(ツ)_/¯
m
how does that help?
like you place the beacon and it???
k
well you update the beacon and it schedules it
cos the observer is a scheduled tick
m
oh ig?
k
or something
i dunno just spitballing, i think doing it from a scheduled tick is the most obvious way though
m
i think i prefer this?
k
idk seems kinda annoying to do
probably you could just give the beacon a scheduled tick method lol
and make the update schedule it
m
eh it's probably just an accessor
idk im not in front of that code rn
k
just seems like more work than the beacon option in my opinion but yeah no idea
m
anyways what we have works for now
it's just braindead
m
why observer clock so far?
that comp update looks fine
c
so i didnt power my beacon or have to take sponge off
m
why not put the button on the side of piston here?
press button, it'll power the beacon and start the clock
whoops i left ping on sorry katie
c
i always get [20:13:50] [Render thread/INFO]: [System] [CHAT] Asynchronous comparator update achieved at [14, 55, 1]. [20:13:50] [Render thread/INFO]: [System] [CHAT] Asynchronous comparator update achieved at [14, 55, 1]. [20:13:50] [Render thread/INFO]: [System] [CHAT] Asynchronous comparator update achieved at [14, 55, 1]. [20:13:50] [Render thread/INFO]: [System] [CHAT] Asynchronous block updates terminated. [20:13:50] [Render thread/INFO]: [System] [CHAT] Asynchronous block updates terminated.
m
yeah the lever is causing more than one update i think
copy this setup into the doritoes
comparator on the outer-most block, button on the side of piston, observer clock
oh your "doritos" are weirdly not dorito shaped
ugh i really need to get you a schem
i might be able to do that from my laptop
k
poor cactus 😭
i dont have a schem unfort
m
you can log onto our CMP and take one if you're more available than me
lol
k
oh its on cmp?
m
yeah?
otherwise imma try from a trackpad
aw fuck i left my computer at home on the CMP with autoreconnect installed
c
can't you make some mod to add an async update to the queue
m
wait i can kick it
thats what my mod does?
c
oh right
i meant something else but forgot what i meant so
c
ok
ill try it
m
should be able to paste the schem and press button lol
unless my server is just shittier than your hardware which is uhm... likely
c
AH
YES
m
try the banner!
c
white banner
m
big
you got it now
eventually that dorito thing will skip and you'll be in update freezing land for a few minutes
that's a fun state to be in
you'll see when the skip happens in game logs
and yknow, you'll notice
but update freezing land is fun to be in
c
i made a piston clock and my stick piston turned into a normal one
m
!!!
k
lol I guess that makes sense
c
the redstone power flag gets very fucked up with this
k
probably you can also turn end gateways into main island ones
and pig spawners
m
wait lmao
thats funny
c
looks like im now in update freezing state
m
have fun in update freezing land
yeah we totally need a more efficient thing to keep it alive
that was quick
c
oh wtf update freezing is kind of useful
my pether nortal survived relog
m
yeah it’s nice
yeah none of those updates ever get scheduled
anything you make in that period will stick around
c
i want to get permasuppressed redstone dust
im not sure its possible because i think mxi told me it was 1.8 something to 1.13. something
m
try a dripleaf tower next time you're there
k
permasuppressed dust doesn't exist in this version afaik
only with experimental
c
only 3 observer clocks work at once in the world
includes the dorito
m
permasuppressed redstone dust only existed because the hashset was a part of the Block data right? If so yeah it doesn't work in this version
the hashset is local to the method now
m
i don't think that's actually whats happening?
c
new application: piss your friends off by stopping their flying machine
m
im missing the understanding on what is actually happening there, i've noticed it too that observer clocks just stop, but surely it's not that lol
wait like 7 hours to perform EID just to do that 🔥
m
is it some race condition with the scheduled ticks?
c
im back in update freezing state
m
dripleaf tower!
send a screenshot lmao
c
nvm im not
updates just stopped for a bit
m
oh you experienced one of the "yeah updates are just unreliable" things
^ this
c
new versions are more fun than i remember
m
^
sometimes™ updates just disappear
c
i wanna go there for real im turning on my half eaten doritos
oh
my async thread died
m
terminated?
did it skip?
c
no
the banners dont work
m
check logs
either it skipped or ran into an exception
c
[20:42:04] [Render thread/ERROR]: Not a list: 2975 [20:43:06] [Server thread/ERROR]: Too many chained neighbor updates. Skipping the rest. First skipped position: -16, 56, -1
m
both show something in logs
thats a skip
c
yeaa
m
so anyways gl finding stuff ig
sticky piston -> regular piston conversion is cool ig
c
give me update freezing again
i wanna offend people with a nether portal
m
lol
c
the updates are being really weird
i can play a game of "How many holes can you put in a portal"
m
are you gambling?
c
not yet
m
gambling based on this race where updates don't happen before the update freezing state i mean
c
its not a game i can rng manipulate
k
it's the race condition probably
if one of the observer updates disappears the clock will just stop
m
oh yeah that would also work
m
oh that explains it actually
k
I actually can't think of a way to implement a clock that does not have this problem tbh
c
hopper
m
why is the dorito able to stick around actually?
m
but the comparator reading it
m
god we REALLY need a better generic name than dorito
k
wdym?
c
this async update stuff might be weirder than the ghost dimension
m
it's got an observer clock feeding into it
surely that will get lost?
k
well the clock can stop
m
dunno about that one
c
finally update freezing
m
dripleaf tower!
m
I would definitely say it is
k
maybe I'm misunderstanding you Mika but the dorito itself can't lose updates because it's being scheduled on the async thread
but the clock could definitely stop
m
i mean the clock going into it yeah
im considering that part of "the dorito"
the clock the feeds the dorito more shit to queue
c
fuck
i need a new screenshot
m
why?
m
👀
c
just an offensive nether portal
m
oh
oh
c
wait wtf
m
you made a swastika didn't you
c
my offensive nether portal is breaking
it turned into ?.!
m
im right.
c
there is not even gaps
anyway
are dripleaf towers not possible without update freezing?
k
why we making swastikas in the big 26 lmao
m
pov: you're a 2b2t player
c
i cant play 2b2t
i
hi! I'll have to read all, t's very interesting.
c
my async updates died and so did my update freezingf
m
i
this is a carpet addition mod?
m
no it’s just a very quick and dirty and slightly broken mixin
i
xd okay
m
i’m gonna make a better carpet addition tonight
i
nice
c
how do you make those
k
iirc there is a fabric carpet example mod
c
is there some mdk i need to download and customize
or "example mod"
but with it i can just make it like a normal project with mixin and everything except i just have carpet api?
k
ye
it's just a fabric mod with carpet dependency
c
oh
any documentation i can look at? im not familiar with fabric carpet api
k
look at the example carpet addon lol
c
where.
c
ty
x
hasn't changed since 1.16 lol
k
yeah it's ancient
c
put it on github so we all can contribute as needed
m
i will don’t worry lol
these people are still playing 1.12.2 it’s not ancient for them
c
1.16 is still new
m
slime blocks still feel new to me
TMCC calls me a boomer for having designed a shitty gold farm in 1.10 once
c
i started playing in like 2017 or something in 1.12
k
I was playing modded 1.6.4
c
i think i played on my grandma's iphone 5
m
i don’t have alive grandparents lol
c
i have 4
m
.5?
i
How does the async dorito keep updates running? It's pretty funny lol. I didn't quite understand the part about the update freezing; do the updates freeze when the game processes a million asynchronous updates? Or did I misunderstand the messages? Sorry, I'm reading this using a translator and my English level lol.
c
ignore that man
m
my great grandmother lived to see all her children die
she was 102
and really liked dr pepper
c
i thought this server was about minecraft
m
oh yeah
k
are you aware of update skipping?
c
infernal iirc does versions even older than 1.12
m
There is only one block update queue. We start the queue async so that all block updates are executed on the async thread. The observer clock then add more things to the queue faster than the async thread can drain the queue, keeping it running.
i
yes
k
yeah so the async thread hits the update skipping limit, so future updates are just ignored
but it's still processing the queue so until it finishes no updates can be scheduled
i
I imagine this happens if you activate an update skipper with an asynchronous update, or simply when generating too many?
Okay, I understand. Thanks mika
m
because of the “add more things faster than it can drain” nature, once update skipping happens there’s still things in the queue to process, and that takes time. For as long as it’s still going through the backlog of things in the queue, more updates can’t be scheduled at all.
i
The line connected to the observer clock is what maintains the asynchronous update sent by the comparator? as I understand it
it's for the rail placement helper
m
correct
m
nevermind
i
And would it be better to use redstone dust instead of rails? I imagine you've already tested that, but I'm just asking.
I gather the sponges are there for a reason, based on what I read above.
k
redstone power flag is sketchy
m
it doesn't even work, it makes a new rail placement helper every time a rail updates
k
the sponge code looks at a very large number of blocks to find water and looking at blocks is laggy when done async
m
What katie said. Also, it can be anything that’s slow. Ideally we want as few updates as possible to be as slow as possible.
k
yeah it turns out sponges are slow but there's no particular reason to use the dorito
it's just the first thing we found
i
Is there any better option than Doritos? It would be cool to have the NicNac Skipper, lol.
m
nicnac is optimized for the opposite of what we want
k
most likely there's a better option we don't know about
m
imagine doing async just to make a skipper smaller
m
efficient use of time
k
you know now that I think about it how does the dungeon population even work
i
Oh, okay. Sorry
k
the loot table is set by an IO worker
surely it shouldn't be able to see the block entity??
m
it seems to be synchronous actually
feature generation generally
i
When it receives an update, the async update automatically dies; it's funny.
m
wait nvm
hmm I wonder
k
ahh it gets the chunk itself interesting
m
sorta
I think it does something to make sure there's no race conditions with modifying chunks at the same time as the main thread?
I don't know if it's a copy of the chunk then that gets resynced?
c
btw, what were you guys doing when you discovered this
m
nope
m
so katie literally just came to me like "hey wanna find 1.21.2 falling block and publish it"
c
and then you found the netty stuff?
m
well katie knew about the network thread getItem() call and had a theory about turning it into a loot gen but no method to do it
c
at some point i want to get a survival friendly setup for the async update going
m
later, dapple wanted to use async in 1.13 (with end ship item frame for async line) to get a corrupted palettedcontainer to bring it to the latest version, and i went "yknow, i know about a potential for an async update in 1.21.2-1.21.4 from katie" and we looked for a way to turn that
getItem()
into a loot gen dapple came up with the idea to use a dungeon in 1.21.0 to generate a loot table into an air block state chest block entity (you can place a shulker there and break it with a piston in 1.21.0 to get the ungenerated dungeon loot in a box, doesn't work in 1.21.1+ due to sound suppression fixes) the idea was then (in 1.21.4) to strand a shulker box with air block state, place a loot box there, and scroll in a bundle to get the update. the issue was just... lack of ways to strand a shulker in 1.21.4... eventually katie and me and dapple found the setup we have now
c
how long did that take
m
idk a few weeks?
c
this is like the backdoor team version 2
m
the backdoor team?
c
they did original falling block
manhattan project kind of thing
m
> dapple came up with the idea to use a dungeon in 1.21.0 to generate a loot table into an air block state chest block entity to be fair, i was looking a lot into dungeons as well, i even checked if getting a chest to generate in the same spot as a spawner in an earlier version (which creates a spawner with chest including loot table block entity data) could let me get the shulker box (the theory was to suppress the xp orb creation when breaking the spawner, the xp spawns way too late for that to work) but dapple ended up finding the actual way
like including an EID overflower?
c
yeah
but that parts not the hard part
m
we don't even have that lol
c
isnt it just constantly load a chunk with a bunch of entities in it?
m
the testing has been done with carpet TIS to manipulate the entity id yknow, so we don't have to wait 12 hours for a chance at an async update
basically yeah
load it as border
c
yeah thats just normal eid suppression
doesn't putting more entities in the chunk speed it up more!
m
to an extent
very hardware dependant
eventually you'll have so many entities that the chunk never finished unloaded by the time it tries to load again
and at that point you're just... not incrementing at all
c
what if you use multiple chunks
m
so how many entities you can have depends a lot on disc read/write of the server you're using
this is more efficient
it's good to spread
i usually do, it can lower the time
c
like 10k in like 50 chunks
m
i make different eid setups depending on what server im making it for
bc one server might need less entities because more would not increment
but other servers might be able to use more entities and do it faster
you have to find the right balance for your hardware
when SB737 did it on lifesteal smp, i asked for a server on a copy of their hardware for the build so i could optimize the time down for him
got it down to like 6 hours on their hardware
and i gave him a massive fuck off buffer so that it'd be hard to miss the suppression lmao
c
you need 4294967295 right?
m
yeah
i
I activated a sculk near the async line
c
whats sculk again
m
!!!
c
is it the slimy black stuff
m
does that mean sound suppressor?
c
NoSuchElementException
interesting
what even is sound suppression
m
gotta deobfuscate that stacktrace to figure out where that came from
m
it's happening on the async thread though
m
exception in sculk sensor vibration
m
it's in the neighbor updator
c
what exception is it
m
uhhhh normally illegal arg i think?
c
there is many types of exception and i want to collect them all
really?
m
it's patched in 1.21.1
m
no in 1.21.1
m
sorry
m
1.21.0 has it
m
meant 1.21.1
mistypd
m
ok so two threads must have been going through the runUpdates
m
wait that shouldn't be possible
m
because that's the only place where queue gets removed from
m
i mean it is but the race window is tiny
m
uhh wait is there another way?
m
you know what a sculk sensor is?
c
the warden thing
m
oooh maybe an issue in a sixway update entry?
c
with the amethyst sometimes
m
yeah the "calibrated" ones are better to work with
c
theres a normal one and a calculated one
oh
calibrated
wtf
i
illegal argument
m
somewhat new redstone component, it like "listens" for shit basically sound suppression is when every time it hears something that's an exception extremely dangerous suppressor because it's real easy to crash your game
but very powerful too
you can like... suppress on armor equip to get shadow items of armor
c
woah
m
not the most useful though because you need armor stands with hands to get shadow items past 1.20.2 right?
m
it hears literally anything, footsteps, block placement, block breaking, everything
you can do it with armor!
c
and the exception actually happens in the player phase?
m
yes
it does
c
wow
m
if we get an exception in getChunk we can revive sound suppressors
m
which just about might qualify for being useful!
m
because they do a check for wool blocks because it can't hear things through wool
m
yeah... like I said... that's not happening
m
yeah it's uh... unlikely
c
its more likely than using this for getting illegal items or anything
m
ok running a sculk sensor directly into a suppressor might explain it
(powered rail on lapis ore is carpet TIS addition's update suppressor simulator)
m
well not exactly
i
skipper simulator
c
what does tis stand for
i
is a lapis deepslate ore
m
TIS? trinity something? idfk some chinese tech mc thing
c
i remember some addon having emerald ore as a suppressor
i
That’s just to cancel the updates; in fact, the sculk never activates the rail—it only sends an update.
m
oh ic ic
m
it's still an exception with the ArrayDeque
hmm yeah I can't think of an explanation of this other than two threads racing through runUpdates
m
m
unless something weird happens while upsizing an ArrayDeque that I don't know about?
and like the main thread upsizes it while the other thread is reading it?
m
something something chinese tech mc name
i
m
i think it’s like equivalent of being called “Carpet WaveTech Additions” or “Carpet Prototech Additions” but for some chinese tmc group
c
prototech uses normal 1.12 carpet
m
yeah yeah ok
those are just examples using well known tmc server names
i don’t mean to imply they exist
tho i actually think wavetech does have an additions mod
c
i thought about making one for prototech
im like 1/2 of a member there so i decided not to
m
hmmm I think it might have somehow confused the ArrayDeque such that it got a null value from uninitialized memory
m
(this is how i feel about wavetech why am i allowed there i’m too dumb for this shit)
c
im a trial member that will probably be kicked out any day now
m
why did wavetech give me full member i don’t deserve this
c
(i annoyed 2 members and an admin too much)
m
anyways uh async block updates go brrr
c
can we start some survival setup
m
no actually it seems they don't
m
every survival setup looks different
c
i want to have a working setup ready just so if we find something cool we can attach it
m
depends on the dungeon you use
c
a basic one so if this goes public people know how to start making theirs
m
attach what? surely you’d just throw it into a dorito and do updates elsewhere which are just also async?
c
right
d
I also did the eid thingy which took a while to figure out
i
I can't seem to replicate it; I really think it was just luck—I walked over the sculk and the exception occurred.
d
But mika figured out lazy linking as a better alternative
c
the ones in 1.12 use async lines which until very recently were always attached to the setup, until some big tree stuff came
m
we don’t even do that anymore, we use eid for server death but client alive, which katie figured out
technically katie mentioned it before me but i just misunderstood her for like 2 days like an idiot
yeah you uh… don’t need that
like make an observer clock… anywhere… for as long as that’s running it’s shitting out async updates
c
we can take them as far as we want
d
just not cross dimensional
m
^
c
ofc
d
can I get a tldr
like any discoveries
m
idk did we really find anything?
ig cactus got a sticky piston to become a regular one
d
Mika side question
how do you fit in sleep
you have been online for like 26 hours a day
m
thread was made at like 7 in the morning for me or something
c
mika doesnt need sleep sleep needs mika
m
i’m likely sleeping soon
no i do need sleep sometimes
d
trial spawner rendering is broken
fun fact
m
but my sleep is irregular and unpredictable
d
unfortunate
c
i want to try to generate some structures with this on
m
i might be awake all night and sleeping all day and i might be a normal person are wake up in the morning and sleep at night it’s not at all synced to the time a day takes to… happen
m
but get chunk calls run synchronously?
d
infernal I think your crash was from the sculk sensor update being already cleared
m
oh I guess you can get any block updates triggered during structure generation to run async
d
so it ran stack.pop on an empty ArrayDeque
m
but what would clear it?
d
what would that do
c
i just wanted to see if other blocks had much effect
i
i love it
m
can I put in a guess?
c
yes
m
I think it will brick
c
it doesnt brick from what i can tell it just isnt working with my inputs
nevermind
there is now a random 16 on a 64 bit shift register
oh no
its an 9223372036854775824
m
it's the equivalent of irradiating for a minecraft computer
c
like putting it in a particle accelerator at MIT
m
ooh this is... interesting
m
cosmic ray bit flip
m
put minecraft in minecraf then run with async upates
c
the atomicfrontier video myren reacted to its like that
m
get unobtainables in minecraft in minecraft
oh also just learned that ores place inside of the paletted container without locking it
which maybe possibly could do something
c
oh
m
(I doubt)
m
i had irl friends send me that and i sent them myrens video back
c
will you start the new mod soon
m
yeag
m
ah I didn't see the chunk section lock when looking at acquire somehow???
m
don't worry savva missed it too
c
"suppress the chest breaking so the player stays in the chest" do explosions breaking blocks happen in the player phase in new versions?
m
respawn anchor does
end crystal would also work
tnt would not
c
end crystals?
they brought the player phase back to that?
in 1.11 they exploded in the player phase too iirc
welp that confirms nothing can be done with it
m
this is why im so curious what cactus's 1.21.8 palette corruption could possibly be
they said they had one apparently
c
i think placing the redstone would immediately turn it back on
are you doing the async update stuff
m
that may be the “updates are just… lost sometimes” thing
c
yup im using an actual redstone dust update skipper in the async line
c
i don't think its rpf being disabled
since placing redstone turns it back on
unless you got some sort of race condition
anyway ima go sleep
c
yea makes sense
v
Don't know if anyone has already come up with it or if I have documented it, but here's an old idea from 1.13 threadstone research: Build a registry palette subchunk, and create a word tearing setup for the block waterlogged petrified oak slab. Place a block of dry sponge next to the word tearing position, and repeatedly update the sponge on an async thread. This will execute the dry sponge's "detect and absorb water" code on the async thread, giving the possibility of a dirty read, where the main thread has written one but not both longs in the word tearing position, thus reading out a waterlogged petrified oak slab. In this case, the sponge will remove the water from this block, thus solidifying that dirty read, placing a dry petrified oak slab in the world. This allows you to obtain a petrified oak slab item, if everything goes according to plan. I think it also allows placing illegal blocks that are waterloggable. (I think in newer versions, you can waterlog barrier blocks, so maybe that's another thing to look into.)
Now I haven't tested it in 1.13 research, and things have changed a lot between 1.13 and 1.21.4, so this may fail. However it is a valuable thing to look into.
If you place the word tearing position on a chunk border, then no concurrent block writes will ever occur in the same subchunk, thus circumventing the concurrency detection in subchunk writes.
m
In 1.21.4 there is no word tearing as it just packs as many words as it can into a long, then leaves empty space
v
oh
I see
m
Yeah :(
It would require something like somehow causing a problem while resizing and reading, which doesn't seem possible
s
i checked the get call the other day
it doesnt seem to have any race against the set
m
Yeah seems like it
I thought word tearing was possible still at that point lol
It should have a race against the collecting block positions to pull like you mentioned before though
s
that would defeat the purpose of the sponges, they are there not just because they are laggy, but because they lag without sending updates, so the thread doesnt immediately update skip itself
needs way more sponges
then remove some sponges, the more often teh async line can process updates, the sooner it can pick up the main thread updates, the less likely they are to get stuck in the backlog
thats at least version 5
piston conversion is because of the common state in the piston base, its a bool that determines which piston it should be
so you should be able to convert them both ways
g
wow this was a lot of text
the dorito thing and the update queue is really cool actually
afaik in 1.13 we don’t really have a way to sustain an async thread because the only non-itt exponential line we have is the unreliable rpf one
so even though there’s still no itt here the update queue makes it possible to sustain a thread and get it to do updates we want
btw re the 1.16 removal of word tearing, iirc mojang cited that change as being done to optimize piglin pathfinding
m
we really need a better name than “dorito”
g
but the funny thing is I benchmarked the two a while ago and the unpadded version (split longs) was notably faster
albeit a maybe poor benchmark and maybe mojang’s impl just sucks
but the explanation I have is my benchmark was memory-bound and tighter packing naturally gives better cache locality
the nether portal contraption we use in 1.12 for lag in a somewhat similar way is known as the “warcrime”, I think “dorito” can pass lmao
anyway is it true that the palette reads are still unsynchronized in the same way as in 1.13? mojang still doesn’t understand volatility?
oh I was also going to mention about the “slow netty threads”, you are submitting to the netty event loop right? that will always incur some overhead due to netty internals (involving synchronization) plus if the threads are all busy it will have to wait, or if they aren’t busy and are just asleep selecting they have to wake up, etc
m
they are unsynchronized but it seems unexploitable so 🤷 they get away with it
m
I mean… for a generic name like for “something that makes processing as few block updates as possible as slow as possible” not specifically “this dorito shaped thing that does that”
something better than it surely exists
and when we design that we can’t call it a “dorito” because it may not be yellow/orange and triangle shaped
g
eh you’re overthinking it
a name will stick
look at radiators
🫩
second one became "sponge dorito"
so yknow ig it could be worse
g
lmao
m
I just read the entire thread and possibly understanded half of it.
I think I didn´t fully understand why do you need the updates to be "as slow as posible". If you want to get to the state of Update Freezeing by accumulating updates on the async thread, why does the speed matter there?
m
the goal isn't to update freeze
the queue has a limit of 1 million things that can be added to it before it just stops (and you get update freezing)
we don't want to hit that 1 million limit, we want to get there as slowly as possible
and we also want to have as many block updates as we can to actually use towards our goals of... yknow... anything we want to throw async block updates at
so ideally, we want to keep adding new block updates to the queue, because otherwise the queue will empty and the block updates will no longer be async
but we want to add as few block updates as possible because we want to get to the 1 million limit as slowly as possible, giving us more time with which all block updates that happen in the dimension are async
m
ooohh ok
my bad
k
end crystal does not work because dead client didn't get chunk sync
so you can't see it to hit it lol
but it would work if you could punch it
m
oh... right
ok i want y'alls opinion
i wanted to call this kind of threadstone "Thrundlestone" yknow, because threadstone? bundles? thrundlestone? it's a name so bad it wraps back around to being the best possible name katie, dapple, and savva all shot me down thoughts?
m
I will die for thrundlestone
k
well mika you got one supporter
m
YAY
thank you matthew bolan i will use this as justification to call the carpet extension "Carpet Thrundlestone Addition"
i
Bundlestone
m
shrimply a worse name, that is
i
Nice name
m
Thrundlestone sounds to me to something that would exists in Rick and Morty
m
Wtf
But the queue drains extremely slowly in the video, is that caused by the async thread having low priority?
k
whenever the async thread wants to get a block it calls
getChunk
, which schedules a task to the main thread if the current thread isn't the server thread
so in effect
getBlockState
calls from async threads are extremely slow since they have to wait for the main thread to process its tasks
it happens that sponges ask for a lot of blocks in order to do the water search so theyre pretty slow
m
In what phase does the main thread handle those getchunk calls? At the end of the tick?
k
idk could happen whenever, the main thread processes tasks whenever it has nothing better to do
at the end of the tick yes but also other times, like if its waiting for a chunk to be generated or loaded from disk
m
What I don't get is how instant updates work normally with this list system. If only 1 thread can run the updates from the list at a time, how does something as simple as depowering a rail line actually work?
Strange
k
the most recent update is processed first
im not sure i fully understand your question, though
m
Yes, but how do the updates get added to the list in the first place? Maybe I'm 1.12 minded but I think what happens there is that something depowers, that sends out additional updates, which causes the depowering of the next rail etc
k
ya you get it
say you have a rail line, you update rail #1 and it queues the update on the next rail, then that update queues the next one, etc
m
So it constantly switches between scheduling updates for processing and actually processing those updates, which can then schedule more updates?
k
ehh
how much of an understanding of java do you have
m
I can read the code and understand it
Can't really write it tho
k
okay good
so the updater calls the update method on the rail block right
m
Yes
k
and then the rail block calls
level.updateNeighborsAt
or similar
because the updater is already handling an update, the new update is put into a queue
when the rail code returns, the updater sees it has more updates to process and runs those
this continues until the updater runs out of items in the queue
s
literally a dfs implementation but with on-heap stack structure instead of the function call stack
m
Ah so in the async case it is always already processing an update, adding it to the list which the async thread is processing
k
exactly yes
m
And multiple threads interacting with the list doesn't cause any issues?
k
it definitely could but the race window is quite small
k
at least put a bundle on it
m
good point
c
i mean i like it
i like that
m
get fucked savva
c
be nice to savva
savva is just not a real thrundlestoner
m
yeah we're all ~~thrundle~~stoners
c
maybe to become a thrundlestoner you have to start as a threadstoner and then earn the undle
no
because you are not a threadstoner
but are a thrundlestoner
m
to become a thrundlestoner you have to start as a stoner and then earn the thrundle
c
so anyone can become a thrundlestoner because they play minecraft and have probably built a castle out of cobblestone sometime
anyway
any new developments while i was asleep
@Mikarific btw, when you make the carpet addon repo do you not like really invasive changes? some of the stuff I want like fake itt is pretty invasive mixins
k
I don't really understand why you would want fake itt
also is it really lol
surely just mixin scheduled tick to instant execute?
c
Well
I would imagine it to be quite invasive
but then again im not very familiar with the code
k
it's like one mixin
c
ok
m
it's a carpet addon, the philosophy is that installing it changes absolutely nothing about the game until you change one of the carpet rules, which can be as invasive as you want so long as nothing is different from vanilla when the rules are at their default values, idc
c
ok
m
how do you refer to carpet for 1.12.2? like is it just called "carpet 1.12.2"?
c
carpet
vastech carpet
threadstone carpet
woven
many different forks
m
I'm writing the carpet rule description for
asyncBeaconUpdates
and want to specify that it's different to the one you'd normally be used to if you're used to 1.12.2 threadstone
k
"1.12.2 carpetmod"
m
(because the beacon doesn't emit updates, it emits updates on neighboring comparators, to reflect the fact that that is the initial update we get in practice in survival)
i may add a seperate carpet rule for making it act like 1.12.2 carpet
c
12asyncBeaconUpdates sounds carpety enough to me
m
aha, carpet tis addition refers to it as
carpetmod112
so imma do that
c
do we know the exact code that caused sound suppression
k
probably can just diff 1.21.0 and 1.21.1
c
i don't want to so i was wondering if we already knew
k
I checked
the sculk sensor code is actually unchanged so I believe it's just that they ask for the direction property on
getBlockState()
which throws if the property doesn't exist
m
Alright I wrote a much better asyncBeaconUpdates carpet rule
k
did you do the scheduled tick thing
m
nope
i check if
count
is 0, if it is, it just runs the update on a netty io thread immediately
if it's not, it waits for the
finally
block in
runUpdates
(after
count
is 0) and only then runs the update
im also keeping track of beacon powered state lmao
so not literally any block update to a beacon makes an async update
you have to actually power it and it has to have been not powered before the update
d
the getphase method
it used to check the actual blockstate in the world and now checks the blockentities stored blockstate
pretty sure we can race to make sound suppression but it doesn’t survive chunk reload
c
well, i think it might be our best bet for a use case
Is wet floor possible with this?
m
I can't believe we would have that many async beacon updates!
c
what else will you add
m
i added dungeon manipulation loggers
because the survival setup requires a good dungeon
c
is generation manipulation possible?
m
like fucking with the RNG of the dungeons? yes
c
most rng manipulation is fixed, excluding void claiminh that villagers teades can be rng manipulated
m
you can break blocks under the floor of the attempted dungeon to entirely change where the chests will be
k
I mean
most RNG manipulation is possible?
just not world rng
and a lot of stuff is world seed based now
m
you have to do this in the chunk you're like... not regenerating
c
dont they place inside the chunk that generates?
well
i guess borders
m
dungeons are unique and weird because they aren't structures
c
they definitely don't get placed the same way as in 1.12
m
so rn i have implemented Rules:
asyncBeaconUpdates
asyncBeaconUpdatesUpdatesDirectly
dungeonLoggerExcludeNonViable
Loggers:
asyncBlockUpdates
dungeon
asyncBeaconUpdatesUpdatesDirectly
acts like you're used to in 1.12.2
requires
asyncBlockUpdates
to also be true
c
can you add a palette command
m
dungeonLoggerExcludeNonViable
won't log spawners that aren't close enough to a chunk border, and won't log chests that aren't in a different chunk to the spawner (and at least one block away from the border because you need that)
c
i want palette size and bits
m
how does carpet 1.12.2 implement that
i'll try and match it
c
take a look at the ornithe carpet one
since it's supposed to be similar to fabric
(its not similar enough)
k
i swear its literally identical lol
isnt it just fabricloader with old mappings
c
legacy fabric mappings are more similar to yarn in my opinion
m
i used yarn for so fucking long until katie convinced me to switch
c
legacy fabric is better
k
mojmap best
m
i think i've got everything I want in it for now?
c
i really think it sucks they discontinued yarn. i made some mods for exploiting on minecraft servers and now i have to do some stupid stonecutter shit
seems good to me. i can add palette command myself
k
yarn has been dead for ages lol
c
mojmap sucks ass
k
nah
mojmap best
m
i'll add it, i just want to match whatever you're used to for that
c
mojmap is catshit
i refuse to say otherwise
carpet has it
m
whats the command in carpet tho
c
/palette
i only really care about size and bits
actually posInfo mayyyy be nice
fill is useless
I doubt it'll be of much use, but oh well, I'm sending it just in case it's helpful.
c
how do you code that kind of bug
m
i put the exact mixin of the quick and dirty mod here
m
you're probably block updating a beacon that has a comparator near it somewhere
oh wait
lmao
i see the issue
with the old very quick and dirty logger implementation, it literally just logs if any comparator update is sent on a thread that isn't the main thread
not specifically the start of the queue
i
(I removed the beacon that was nearby, and it keeps happening)
m
yeah because you have a comparator being updated somewhere on an async queue
literally any comparator update on an async thread sends the chat message in that quick and dirty mod
i
That makes sense.
With this in mind, could this be used to create more than one line in Survival mode? Or does that not make sense? I'm just going by what I see; I don't know how it works internally.
m
no
i
c
@Mikarific what are the exact conditions for a valid dungeon for this?
m
spawner near a chunk border, chest at least one block away from a chunk border, spawner and chest in different chunks
c
spawner how close
m
depends on the size of the dungeon room
can be against the chunk border, can be a block away
c
no more than a block?
m
yeah
c
if i can find an example and you say its right ill make a program to find the nearest valid dungeon in a given seed
k
theyre very common tbh
m
> to find the nearest valid dungeon in a given seed pick literally any random chunk, that chunk will probably have like at least two viable dungeons regardless of seed, the nearest valid dungeon is almost certainly in chunk 0, 0
it's more rare for a chunk to not have any viable dungeons than it is for a chunk to have viable dungeons
because remember, we're regenerating the chunk, we can force a dungeon to spawn where it previously didn't in the vanilla world gen so as long as there was an attempt at a good spot, we can use it
and each chunk has like a lot of attempts
its not like the caves have to line up or anything
hell the testing server i set up for katie and dapple and savva and i doesn't even spawn any natural dungeons, the only ones that exist are ones we force to generate
i just used the chunk at 1000, 1000, arbitrarily, it had a few perfectly fine dungeons
c
so world gen is more similar to 1.12 then i thought then
k
this case is quite specific
almost every other aspect of worldgen is quite different
m
@CactusCreative i gave you some scaffolding to make the /palette command on top of, imma just let you implement that im publishing to github rn
feel free to PR
/carpet fakeInstantScheduling
if you want too
c
ok
k
I really dont think we should add that ngkl
I feel it gives false hopes for setups since it isnt a vanilla feature lol
m
i don't see the harm? it's not like super different from shitting out async update in other ways from other things
carpet has some really stupid shit in it
like chainstone is an option in carpet
the beauty of carpet is that you can add whatever the fuck option and the philosophy is always such that everything is disabled by default
k
yeah but nobody is wiring this shit with chainstone
i dont see the point
m
i don't see the point in adding it myself, as i wouldn't use it but i have nothing against it being added
k
I am against it being added personally
I can't imagine a useful way to use it for this
m
yeah i don't see the use either
i think the appeal is the ability to shit out updates at a big rate in one spot
k
I feel like you could just add a carpet rule to make the async thread never exit the loop or something instead ngl
like if thats the only goal yk
m
yeah that might be better
k
idk though depends what cactus wants it for i suppose
m
if you want async updates to come out of an observer you can literally just make an observer clock
i could see the reason why you'd want instant observers tho, you don't want to be held back by the tick loop processing tile ticks, because maybe the race you're going for requires an update that you keep missing simply because your observer block updates are missing the race window every time
k
surely you should just make a setup that actually works then lol
c
Btw, this whole thing might have an application namely multithreaded cpus
nono
it doesnt
because of the stupid make everything async shit
k
making a CPU that depends only on block updates is rather challenging tbh
m
well sure, but like what if you wanna test if an async update can even do the thing™ in the first place before you make a real setup to hit it in practice?
k
rail based instant logic is beautiful though I should work on that more
I guess
m
having a "shit out a bunch of updates at this one spot"-ifier could be nice for that
k
if you think thats bad wait for
:downloadAssets
c
i know but i need to fix my internet before i get to that
i turned it off and then on again and speed checker says 37.0 Mbps download instead of the 0.6something a second ago
new palette unlocked SingleValuePalette
now it goes SingleValuePalette linear hashmap and then registry
c
palette command done finally
@Mikarific i made pr
s
it should be helpful for designing the contraption which overflows the update counter
not for overflowing, but for keeping the line alive after upates become recursive
we can have an update independent update spammer with the instant flowing water, to break/restart the flow we cant use clocks, but we can use falling blocks to cut/uncut the flow a bunch of times
falling blocks on their own or nether portals arent enough cus they arent resetable
also scheduling b36 to move a batch of entities across a detector rail with comparators reading from it
or just generally creatnig 50k entities which fly across 10k block long detector rail line, this should be very doable
so, the plan: -async update chain is split into 2 branches, first goes to a dorito, second one to the exponential line. -after the async chain gets stuck in the dorito, we let it accumulate some backlog (lets say 10k updates) -then we run the 50k entities thing on the main thread for [int limit-10k updates - the amount the async lime has already processed], which : A) makes the update queue skip B) almost but not completely overflows the update counter then the async line continues in the dorito, up untill it hits the overflow (has to come before it runs out of backlog). when this happens, itll start performing updates recursively, in doing so itll eventually finish the backlog, and one of the oldest things on the backlog, is the fork to the branch with the exponential line. thus the recursive async chain is stuck in the exponential line. problems - if any update chain actually finishes in the dimension, itll reset the counter and ruin the thing, so we cant have shit on main thread good thing - in this state w should be able to start multiple new async chains
This is useful for 1) creating multiple async lines without hitting a tight race condition 2) having updates be recursive, which can be useful for some exploit like block entity swapping or something
m
Wait so if the update counter on the queue overflows, the block updates happen normally, without using the queue? Or they just happen in a way that allows for scheduling recursively?
m
they pretty much happen normally without using the queue for an integer limit number of updates.
That's because it tracks how "deep" it, and checks if that is greater than 0 and if it is, it just adds the updates to the queue to be processed later
m
Yes I know they happen normally on the queue, but to get 2 async lines you can't have a queue right
Ah
That makes sense now
m
mhm I wasn't very clear with that first message lol
m
So you get thread 1 out of the queue by overflowing, then you can get thread 2 into the queue code etc
m
mhm
at least that's what I think the plan is, I'm not like enough of a real part of this
s
counter is one per dimension, so all update chains become recursive (untill any one of them finishes or terminates)
how is there not a gamerule / carpet rule for max chained neighbor updates? like i would expect carpet or carpet tis to have added that i might have to
@Savva @Dapple @katie! <3 i replaced the shitty async update generator mod and the old dungeon manip mod with the carpet addition on our CMP the readme has the docs for how to use it if you wanna read that
oh! @CactusCreative you should PR your name to fabric.mod.json under authors, and write docs in the readme about the palette command
g
there kind of is in 1.12, there’s something like “limitITTupdates”
m
“max chained neighbor updates” is a vanilla thing since 1.19, like inherently it can’t exist in 1.12 because it doesn’t have update skipping and the queue system
it’s a server.properties setting
that’s the “1 million limit” that you get before the rest of the updates in the queue are skipped, on a server you can increase/decrease that limit in the server.properties
carpet has carpet rules for changing other server.properties settings, like render/simulation distance, so i’m surprised the same doesn’t exist for that setting
j
I remembered that I am an admin here
I created #1556364240171049070
c
why
m
that was my question
why
j
Cause threads are only visible to people who a) are already in the thread b) actively look through threads (barely anyone)
I suggest that we move to the channel
c
i think its only necessary to create a full channel if it's significant enough like rsp was
j
It just makes sense
The hell you mean, we have async lines in 1.21.4, this is incredibly significant
s
(just leave the link to the thread in the channel and lock it )
m
they don't do anything yet tho
c
I'll atleast give it it's own category since public is kind of full of channels that can kind of be merged
By significant i mean interesting, this isn't interesting until we have applications
m
^ this imo
j
That channel isn't for archiving
k
meh, no reason to not make a channel i reckon
j
It's for chatting
And development
Just like general was also used for development
m
is this channel considered dead now? should it be archived?
c
@Glaeos @Matthew Bolan @rpm0618 since you guys chatted here i think i should tell yall to go to #1556364240171049070 instead of here
I won't lock this thread but please move there!
2 Views