https://linen.dev logo
t
Biome.BIG_TREE_FEATURE is a protetced static final
WorldGenBigTree
shared by every biome in the JVM.
generate
keeps its state in instance fields. if we freeze giant oak tree generation on the async thread, and then populate a chunk chunk with the main thread while stopping a big tree from generating, a failed
validTreeLocation
call overwrites
world
and
basePos
. when
generateLeadNodeBases
runs on the async thread, it re-reads
basePos
, but
foliageCoords
is old position. when the async tree generates,
limb
creates a giant branch from the new position to the old one (confirmed). because it also sets
world
, it should be able to place blocks cross world and could potentially carry the async line across worlds (unconfirmed). credit @Matthew Bolan
Similar unconfirmed bug:
BiomeDecorator
is shared between biomes of the same type. During population, it places ores trees flowers etc. To decide on placement, it reads
chunkPos
at the start of each placement, and then on every placement after. If the main thread starts decorating a chunk while the async chunk is already underway, it should to overwrite
chunkPos
and cause the async thread to place items in the main thread's chunk.
c
why do you have to call it that
t
that's what it is.
other global mutable states reachable from population: - BlockRedstoneWire.canProvidePower - IntCache - StructureStrongholdPieces.structurePieceList - totalWeight - Entity.nextEntityID - NextTickListEntry.nextTickEntryID - BlockFurnace.keepInventory
g
why is this an open problem?
c
it just is
@Glaeos @Matthew Bolan maybe we should talk here so this conversation never gets buried in general chat
m
I think the thread should be renamed to reflect Glaeos's contribution btw
c
ok what should i name it
m
I still want a stupid name for it
g
most of threadstone is buried in general chat lmao
m
idk yet
c
but we could have less
Glathew Bolan Big Log
g
at some point I want to start going through it and cataloguing all of the important stuff
I’ve had to search through this server for stuff so many times
c
id like to pin a few things too but only admins currently have that permission
i am a certain fraction of an admin
anyway
so where were we
g
yeah I’m trying to find some kind of wordplay too
there must be a good name
I like “big tree wormhole” for cross world
m
Async line "branching" would be funny if it was descriptive at all
c
The Bolan-Glaeos Branching Factor
m
realistically its just gonna get named "Log" or somethign
g
perfect
c
ok, now that the name is settled, does this make everything we need for s setup ready
m
no I think there's still ideas to brainstorm
like have you guys looked into just lagging an async line much?
I get that we want update multiplication for word tearing and stuff, but if I just want to lag it for a few seconds without ITT are there known techniques?
c
Some thing to keep in mind when researching this: We obviously cant use tile ticking blocks, because it becomes a not so async line because it just gets scheduled to happen.
m
by quickly toggling the redstone power flag you could keep them alive for a little while in 1.13 where there is no itt iirc
m
I think my big branch thing is actually already a solution
c
what is your big branch thing?
explain as if i have the iq of a dying ant
m
well as the failsafe, if the branch doesn't fire to the intended target, have it fire to a target some long distance away that we've preplanned
c
aha
m
just placing the logs should be enough to lag the async line a long time if there's enough logs
c
but dont we need to lag the async line to do the logs?
m
well you could have multiple branches I think?
unsure
c
yes
m
that would take me looking at the code, Glaeos would know
c
the speedrunner got that
m
as did Glaeos
but the question is if you can change basePos during that iteration
c
think its time i just look at the code?
m
Copy code
java
void generateLeafNodeBases()
    {
        for (WorldGenBigTree.FoliageCoordinates worldgenbigtree$foliagecoordinates : this.foliageCoords)
        {
            int i = worldgenbigtree$foliagecoordinates.getBranchBase();
            BlockPos blockpos = new BlockPos(this.basePos.getX(), i, this.basePos.getZ());

            if (!blockpos.equals(worldgenbigtree$foliagecoordinates) && this.leafNodeNeedsBase(i - this.basePos.getY()))
            {
                this.limb(blockpos, worldgenbigtree$foliagecoordinates, Blocks.LOG);
            }
        }
    }
Idk java behavior that well. If basePos updates during this.limb, the next limb will use the new basePos?
surely
g
yes, the leaf nodes recheck the base pos, so you can have other failed big trees placements between them
but they absolutely cannot be successful attempts because that will crash the async line immediately
nvm I forget it makes a new list
m
ye
g
they actually can be successful attempts then
m
I'm actually more concerned by this.heightLimit slowly reducing as the player loads chunks lmao
that's so sad
your world gets more and more boring as you play longer
have to restart server for big trees again
g
yeah if it reads
this.basePos
you can assume it will be the new one if the async thread has lagged for a while
m
gotcha, there's some kind of cache?
g
that access is susceptible to compiler optimisation and cpu caching
m
i c
c
i looked at the code and i understand now
g
in fact if you get unlucky with the jit it could theoretically pull the basePos access out of the loop altogether
but I’d be very surprised if it truly did that
m
me too
c
i doubt it would ever happen as well
m
anyway so long as short trees can still generate 2+ branches I think we can do this trick at a bare minimum
but it would be better to have some simpler and less destructive form of lag
g
actually I don’t think the compiler can do that because it cannot prove that the limb call would not change the basePos on the same thread
so it will definitely reread it
otherwise it would violate program correctness
m
yeah I already did this exploit with no async lines right
c
you definitely don't require one it just makes it an inconsistent race condition
m
in principle if I just chain off of a limb in my world I get a proof that the limb call can change basePos on the same thread.
c
but with the async line its an arbitrarily long window
m
There's no race condition without the async line, and its consistent
you just need to do the chunk loading off of the tree
c
i mean with just an async load
m
nothing async at all
c
oh
ok
g
we lag the async thread for long enough that it’s practically guaranteed
c
i joined last stream late
yea
m
the async stuff is used for skipping the chunk loading line
BTW
I think the teleporting population thing can be fun maybe
we shouldn't forget that
g
what do you think of calling this the “dendro star”
c
hm
g
im a star wars guy what can i say
m
BiomeDecorator has
protected BlockPos chunkPos;
, but there's just one BiomeDecorator per biome I think
g
what can you do with that? can you just move population anywhere mid way through?
m
to same biome
g
hm
m
An immediate funny thing that might be possible is to move the end pillars
g
yeah that would be good
but async lines in the end..
m
I should be worried that it might affect my peaceful run actually
c
not impossible at all
m
this doesn't need async lines a priori
g
oh yeah true
m
they're just a really nice convenience
g
also if there was any way to get the big tree generator to run in another dimension we could use the wormhole to change dimension
I doubt that’s possible though isn’t population hardcoded
m
yeah I didn't see it
c
its not
possible
m
wait
are there trees in the end? Am I stupid?
Copy code
java
package net.minecraft.world.biome;

import net.minecraft.entity.monster.EntityEnderman;
import net.minecraft.init.Blocks;

public class BiomeEnd extends Biome
{
    public BiomeEnd(Biome.BiomeProperties properties)
    {
        super(properties);
        this.spawnableMonsterList.clear();
        this.spawnableCreatureList.clear();
        this.spawnableWaterCreatureList.clear();
        this.spawnableCaveCreatureList.clear();
        this.spawnableMonsterList.add(new Biome.SpawnListEntry(EntityEnderman.class, 10, 4, 4));
        this.topBlock = Blocks.DIRT.getDefaultState();
        this.fillerBlock = Blocks.DIRT.getDefaultState();
        this.theBiomeDecorator = new BiomeEndDecorator();
    }

    /**
     * takes temperature, returns color
     */
    public int getSkyColorByTemp(float currentTemperature)
    {
        return 0;
    }
}
c
does chorus fruit somehow count
m
In Biome
Copy code
java
    protected static final WorldGenBigTree BIG_TREE_FEATURE = new WorldGenBigTree(false);
and in Biome Decorator
Copy code
java
    protected int treesPerChunk;
    protected float extraTreeChance = 0.1F;
I see nowhere extraTreeChance is lowered
and then also in BiomeDecorator
Copy code
java
int k1 = this.treesPerChunk;

        if (random.nextFloat() < this.extraTreeChance)
        {
            ++k1;
        }

        for (int j2 = 0; j2 < k1; ++j2)
        {
            int k6 = random.nextInt(16) + 8;
            int l = random.nextInt(16) + 8;
            WorldGenAbstractTree worldgenabstracttree = biomeIn.genBigTreeChance(random);
            worldgenabstracttree.setDecorationDefaults();
            BlockPos blockpos = worldIn.getHeight(this.chunkPos.add(k6, 0, l));

            if (worldgenabstracttree.generate(worldIn, random, blockpos))
            {
                worldgenabstracttree.generateSaplings(worldIn, random, blockpos);
            }
        }
And in Biome:
Copy code
java
public WorldGenAbstractTree genBigTreeChance(Random rand)
    {
        return (WorldGenAbstractTree)(rand.nextInt(10) == 0 ? BIG_TREE_FEATURE : TREE_FEATURE);
    }
I think the end generates trees
only these 1/10 extra trees, and then 1/10 will be big
time to test on superflat
c
actually wait
trees can generate in the end they just dont ever spawn
same with ores
m
No trees on superflat, but why? Maybe superflat uses a different biome decorator
c
if you place grass and repopulate you sometimes see a tree
it doesn't do any population other than villages
m
Oh I forgot to turn that on in the preset
one sec
c
use overworld preset
g
no way
c
wha
g
if they don’t ever actually spawn that’s perfect
as long as the attempt happens
c
i found this out when i build an ore generator contraption
lol
but yes
g
so the wormhole has a multiplayer use
I mean there’s still no end itt
c
microwave method!!!
g
does the nether do big tree attempts
c
good question
g
that would be pretty big no
because then you can do ow and nether with one setup
just need a nether itt switch
c
if the end does the why wouldnt the nether
let me look
m
I still can't confirm in superflat, but if you've seen this in the actual end I'd maybe believe it?
idk
from the code I posted above I think they should spawn in the end
but idk
c
they do
ive seen it
looks to me like the nether should generate trees
just fails every time since no dirt or grass
I deleted the chunks in between the dirt and got nothing
c
hmm
m
could just be unlucky though, population is the same for 20 chunks in a row I think
c
is that the void biome
m
at least for ores that is the case
The End
c
oh
g
anyone who has an ide setup for 1.12 server
m
the end only gets biomes in 1.13
g
just put a breakpoint inside the generator
and fly around the end
c
i do but i dont want to get up to go on my pc rn because im ill lol
but i can tell you how if you dont know
g
ok I can do it on my laptop in 20 mins probably
c
ok
m
I can just mod it to print tree attempted
easy
one sec
c
oh yeah
m
I could be missing something in the code but like
c
think maybe im misremembering?
m
I remember the ores for sure but no trees
c
ok maybe i misremembering
m
I remember ores too but no trees. But ore attempts repeat every chunk for sections ~20 chunks long and wide
m
yeah, the trees spawning will be like 1/10
so your test is not that convincing maybe
c
ok i must be misremembering then
m
so you might need to fly for 2000 chunks straight before you find a section where the 1/100 for big trees wins
yes
m
My superflat has me worried
Oh
m
why use superflat and not normal world
m
Easy
Anyway I found the problem
unfortunately
Copy code
java
public class BiomeEndDecorator extends BiomeDecorator
Copy code
java
protected void genDecorations(Biome biomeIn, World worldIn, Random random)
    {
        this.generateOres(worldIn, random);
        WorldGenSpikes.EndSpike[] aworldgenspikes$endspike = getSpikesForWorld(worldIn);

        for (WorldGenSpikes.EndSpike worldgenspikes$endspike : aworldgenspikes$endspike)
        {
            if (worldgenspikes$endspike.doesStartInChunk(this.chunkPos))
            {
                this.spikeGen.setSpike(worldgenspikes$endspike);
                this.spikeGen.generate(worldIn, random, new BlockPos(worldgenspikes$endspike.getCenterX(), 45, worldgenspikes$endspike.getCenterZ()));
            }
        }
    }
m
yes
that is the problem, I just found it too
I vaguely remembered this, there was nothing interesting except veins
c
oh yeah i have got to be misremembering then
m
yeah I vaguely remembered from the 1.8 bedrock project
but I was sorta hopeful the spikes came before the trees or something
c
sad
m
sad
c
jinx
you owe me an async line
m
you said it later cactus
pretty sure that means that you owe bolan a big log
nope
marpace breaks the tie
c
aw man
ok
well
anyway i guess we have to stick with overworld
m
this also isn't even fun
the pos where it generates isn't based on chunkPos
so my glance at the code yesterday was wrong too
no teleporting the spikes 🙁
c
aw
m
we can only teleport lots of overworld population
c
welp
g
ah that’s a shame
c
have you started the survival friendly setup
m
no
c
oh
m
I need a few hours
c
ok
you just want to do the normal vsm setup and then do your stuff with the async line right?
m
ya a setup for rsp runs should be easy peasy
I think I can finish a run tonight if all goes well
c
do you think an easier to build vsm setup is worth it
not good but just easy to build vsm setup
like the diagonal line is kind of annoying
m
if the speedrun has to get an async line from scratch then we want the cheapest possible async line
it needs to go sub 2 hours to be clearly better than the RNG manip I think
c
sub 2 is a bit tricky
g
if you’re doing cross world the async line setup doesn’t matter
m
yeah
g
it’s creative
c
oh? i thought you were gonna add that to the time
m
we don't know yet
c
ok
m
I think its funnier if I do the run and then we find out
c
yeah that's true
m
I guess I need a way to tell the async line to fire
but probably redstone power flag makes that easy?
c
just time bomb it or use rpf
m
rpf?
c
now that i think of it we should get a better rpf setup
redstone power flag
m
i c
c
rpf, itt, if
m
I need itt on in my world anyway, so maybe I can arrange it to turn if on again?
c
if? what for
m
to tell async line it's go time
c
how would that work
m
I mean its just in principle possible I think
c
i think rpf makes more sense
m
you need some way for the async line to tell that if has been on for a long period of time
maybe it does
but I'm just saying that I'm building a machine to turn if on anyway
c
ok
m
if the setup world can detect that, its faster
c
if only?
ok
m
if and itt
c
if only is a little less easy
m
isn't it easier?
update suppress an ore
c
do they give any non observer updates
because using an observer crashes
m
update suppress a lake
it can replace rails, which will give updates
c
i personally use dungeons but lake sounds like it will work
it will work
m
lake's gonna be better for speedrun
c
yea
by a million miles
m
but irrelevant anyway
since I'm just saying that as part of the route right now
I turn on if and itt for a long period of time
if you can cook up something that tells your async line
"hey, you should die if instant falling turns on for a long period of time"
c
cross world still right
m
yes
c
see only the async line itself is able to be in the other world i think
m
ya
c
i cant put a piston if detector
m
ya u need something else
c
OH
CAN WE HAVE IT POWER REDSTONE?
IF SO, IN THE OTHER WORLD, WE FLICK A LEVER WITH REDSTONE ON IT
m
yeah I think that's what myren was saying last night
c
that crashes the async thread
m
does it also have a chance to permasuppress dust?
for free credits warp?
c
can you be in java 18
m
sure
c
then it has that chance
cooool
g
ha yeah you can totally do credits warp too
I mean it might break your rpf detector
but you could just permasuppress beforehand too
c
why do we even need an rpf detector if we do this
m
we don't
c
we have a switch that can brick the async line
m
ya
wait
we don't want it to brick
c
oh?
m
we want it to return to execution of the tree code
what myren was saying last night is that you use RPF to stop the blinking I think
like have redstone periodically
idk how RPF works so well so I'll shut up
c
another thing we could maybe using that method to kill a different async line that is keeping a certain chunk loaded somehow, and then make sure it is savestated and places liquid pockets. then, the other async line somehow loads it, turning off itt and un asyncing the async line so it continues population
let me explain that better
we have two async lines, one is doing the tree thing, the other is keeping a chunk loaded and also powering redstone. we kill that async line and then it stops being permaloaded. Then, the other async line loads it and turns off ITT. This makes the async observer line no longer async so the thread can peacefully finish populating the chunk, and then die.
does that make sense
m
yes
maybe you could even do it without the pocket somehow, if that chunk being kept loaded was savestated with something fun in it?
its a good idea
c
we want to turn off ITT completely
so we need a liquid pocket
m
do we want to do that?
another way it could work would be if say
the chunk load triggered a line which updated a dragon egg which broke the observers
c
async line suicide
thats so jank wtf
m
but itt is not so bad if its a setup world
c
its a setup world
m
well if its an untimed setup world
c
i hope it is
otherwise async line suicide is the option
m
probably more ideas are possible but I can do one of these two quickly
c
how would we drop the dragon egg with the chunk load thi
m
I'd still have it populate an ore/lake/something
so its not like I'm saving much
c
yeah
m
wait no
just have more of the observer line saved to disk
c
ohhhhhh i see where this is going
unloading the chunk removes a lot of the line?
m
step 1: build intact line through a chunk pointing to a dragon egg over itself.
step 2: savestate chunk
step 3: delete intact line
c
switch 1 and 2
m
no?
c
so the intact line wont stay?
m
its gonna get reloaded
c
oh
ok
m
step 4: second async line into the savestated chunk to keep it loaded, pointing into dust
step 5: get an async line into the original, now broke line
step 6: in another world, blink redstone dust. The chunk loading async line now dies, and the chunk gets unloaded. Now the other async line loads the chunk from disk, restoring its intact form. The signal can now propagate through to the dragon egg.
c
ahh
thats a great plan
m
yours would work too
I think all the 2 async line versions of this are about equal levels of difficult for me to build today though
c
i think we use mine only if we can use a creative setup world
i can do that myself later then
m
yeah I mean if setup world is timed uh oh
probably there is an easy 1 async line solution using rpf maybe
oh
maybe as my ITT crasher I can do something that can mess with rpf
2 birds with 1 stone
c
yeah you can
just make it so the redstone being updated by your banners loads the chunk
m
wait I have a really cursed idea
even with timed setup world
like from fresh instance of minecraft
c
lers hear it
m
I'm gonna have vsm in structure blocks lmaoooo
c
ahh
m
start game, make a new world, load my saved hotbars
place down vsm
c
saved hotbars are sooooo underrated
m
bahahaha
I can even be on peaceful in every world
c
but does the setup world have to be survival or does that slip through the cracks
m
shhh
I just want to make the rules crisis as funny as possible
c
oo
that's gonna be quite a quick run
g
the permasuppression setup doesn’t count towards time for credits warp right?
c
it does not
m
however the rules are subject to change and whimsy
g
so I say we just assume the creative world doesn’t count either lmao
c
we are reallllly pushing the limits with this
g
for a first run I would just have it set up beforehand
m
I'll do it with the structure blocks if that's not hard
I think it's not hard
c
i guess i can try and do it soon if i can fucking stand up
g
I haven’t read through your full plan with 2 lines
but are you going to try and do credits warp as well
m
I think we're gonna use rpf after all
g
or was that just so you can trigger the tree pop without going back to the other world
c
oh?
m
and then once the tree is done generating, pass it into something that blinks redstone dust
then we flick a lever
that should do everything with 1 line
g
this is definitely super dodgy rule-wise but you could just only get the line on the other world when your survival is ready
m
that is actually not allowed explicitly I believe
the current rules do not love cross world effects but severe ones thus far have been tolerated in glitched, however once you start your run you start your run and are not allowed to open any other world on the same instance
Sometimes for long segmented runs they look the other way on that latter point
but for something like this they would not
c
so you have to do thid in one sitting
sheesh
m
however I think the structure block thing is fairly easy to swallow if you time it
c
how do we pass it
m
the fact its a creative world is less easy to swallow
update order with the thing that originally populated the chunk
make sure the tree chunk doesn't place pockets
c
oh
m
and I'm only saying to do that for credits warp purposes
I will do this tonight, where can I learn how the redstone power flag works exactly?
c
mcdf wiki maybe
population suppression page i think has some info
doesnt this just brick the line
m
Well actually, I think I was overcomplicating things there a little, you could just do this at your word tearing setup I think
c
which tree actually, the speedrun world one?
maybe since this is now less about big log, we should move to #1534680551288602665
m
the one in setup world
c
oh
so we just can brick the line when we are done?
m
I don't want to brick it, I want to repair rpf and then permasuppress
that's just a way to get the permasuppression back
c
permasuppression bricks it tho
m
yay
what do I care
have end portal, have permasuppression
c
i dont think i understand
m
we get the end portal during the tree code
the async line is branched off a log
once we have the end portal we permasuppress now
c
ok i think im just confused
ok i think i will try and make the setup now!
i want to make the setup a bit smaller so it fits in the structure blocks or is easier to build in survival
wait @Matthew Bolan is it allowed to set your mouse dpi extremely high
g
I feel like if you are going to allow a creative world with structure blocks you may as well just allow having the world set up beforehand
m
yes
c
yay
m
well one of these is timed!
c
we dont need the stupid glass tower then
g
but you are just timing structure blocks, basically hardware dependent
c
do you guys want me to open a server or do you think just throwing the zip file around works well enough
g
anyway permasuppressing in the other world after you have word teared will be very difficult
m
I'll permasuppress in my word tearing world yeah
if that's so difficult
but why is it difficult in the other one
c
eh ill just do it
glaeos whats ur ign
g
glaeos
c
ok
g
how?
to permasuppress you need a lot of async lines to power redstone dust whilst a player also has the main thread powering it
the async lines and the main thread will repeatedly crash each other (main thread in the player phase) and if you get lucky you corrupt the redstone dust set in the right way to permasuppress
but this is not at all reliable
unless you permasuppress dust before the run it won’t be viable
assuming you don’t just get super lucky
m
you actually just need 1. Its a low chance but we high roll in this house
I get it like 1/10 times?
its only a few minutes of timesave but I think you gotta try
g
would that not just suck to run though
m
yes
g
like most runs are dead right before the fight
m
speedrunning is not about what's fun
its never about that
g
well you can just do the dragon normally
m
yeah
its just an extra little bit of gambling
g
ok in that case it’s worth a try
all you need to do is have the async line spam redstone dust after the tree population
m
Ye
g
then in the speedrun world you just break the observers to send it back
m
Hence my plan
g
alright then this is a cool part of the run
small chance to get a good time save
m
its all coming together
every rsp/threadstone strategy at once
g
it would be bad if it not working fully killed the run
but that’s not the case
m
cross world bullshit, population manipulation, async lines
g
well
to be fair
if you are using a creative world for the other setup
eh idk you’d have no main thread
I was thinking maybe you could actually run a proper permasuppression setup off the back
c
adequately-rely.tun.ply.gg
yall are opped
m
my current plan is to use the rpf to signal to the async line I'm ready
g
still wouldn’t be 100% odds but it would be much higher
c
we should build the setup near a big tree right
m
yeah do a big tree in like a plains biome or something
I think those should be a fairly reliable biome
keep in mind that the big trees shrink over time
like you have to restart the instance periodically to get consistent big trees
or pick a seed where the first big tree generated is height 5 or 6
m
yeah so this works, he'll just shrink over time. If you pull from the trunk it will be fine though I think.
c
so do i just want to take the async line off of that
m
we should pull from midway through the trunk?
so that it has more trunk to place in our world?
g
this is an interesting theory, because in my poc for wormhole the big tree I was using in the async line world became a lot bigger at one point
and stayed that big for all future attempts
m
I think its obvious from the code
heightLimit gets set only once
well
more than ocne
once
c
like do i make it so the setup asynchronous populates the chunk that places it, or do i just make a normal asnyc line setup that goes into it
m
but all subsequent times it can only decrease
to a lower bound of 6
or of 5 if it started at 5
so big trees as you play more minecraft get shorter
they start out all the same height
but if a world gen big tree has its height blocked
all subsequent trees become shorter
g
you could use the big tree to actually get the line yeah, could be neat or could be less convenient
m
this persists across worlds
only a game restart will restore
so long as you don't generate new big trees with their height blocked should be fine though
g
don’t know how to explain what I saw then
m
but a seed with height 17 big trees as the starting value might be good
did you restart your instance?
g
I did whilst testing but I’m pretty sure that happened without a restart
m
well look let me show the code
g
it’s not unlikely I’m just misremembering I don’t have any clip of it
I believe you that the code does that
m
Copy code
java
private boolean validTreeLocation()
    {
        Block block = this.world.getBlockState(this.basePos.down()).getBlock();

        if (block != Blocks.DIRT && block != Blocks.GRASS && block != Blocks.FARMLAND)
        {
            return false;
        }
        else
        {
            int i = this.checkBlockLine(this.basePos, this.basePos.up(this.heightLimit - 1));

            if (i == -1)
            {
                return true;
            }
            else if (i < 6)
            {
                return false;
            }
            else
            {
                this.heightLimit = i;
                return true;
            }
        }
Copy code
java
if (this.heightLimit == 0)
{
    this.heightLimit = 5 + this.rand.nextInt(this.heightLimitLimit);
}
g
I just remember thinking it was odd when I was doing attempts
m
the latter block only runs when heightLimit is 0
the former block can only set
i
to be as large as heightLimit itself I think
and never to 0 (or anything less than 6)
g
no itt if you do this though, you’d need an itt switch on top of it
I assume the return from
checkBlockLine
can only be as large as the tree is tall?
m
I think so, yes
Copy code
java
int checkBlockLine(BlockPos posOne, BlockPos posTwo)
    {
        BlockPos blockpos = posTwo.add(-posOne.getX(), -posOne.getY(), -posOne.getZ());
        int i = this.getGreatestDistance(blockpos);
        float f = (float)blockpos.getX() / (float)i;
        float f1 = (float)blockpos.getY() / (float)i;
        float f2 = (float)blockpos.getZ() / (float)i;

        if (i == 0)
        {
            return -1;
        }
        else
        {
            for (int j = 0; j <= i; ++j)
            {
                BlockPos blockpos1 = posOne.add((double)(0.5F + (float)j * f), (double)(0.5F + (float)j * f1), (double)(0.5F + (float)j * f2));

                if (!this.func_150523_a(this.world.getBlockState(blockpos1).getBlock()))
                {
                    return j;
                }
            }

            return -1;
        }
    }
returns
j
, we know
j <= i
,
i
is the greatest absolute value of all the coord differences
c
the big tree got smaller while i was testing
g
yeah checks out
ok maybe I had restarted then
forget about it unless it happens again
c
im gonba yse liquid pocket instead of radiator
m
I think plan is now to use the rpf flag to signal the line to return to tree generation
c
ok so what do i do for that
m
I think you should periodically interrupt the observer line with redstone components that won't work if rpf is corrupted
like every 10 observers
c
the only one that doesnt work is redstone dust
m
redstone dust will no longer bud power things
for example you could have a bud powered dispenser that places a water block next to an observer
I think
just don't end the line with one of those
c
ima let someone else mess with that
im just gonna make the async line genereator
but do i need to savestate that chunk
at all
m
probably something safer than the dispenser
you need to savestate the one that generated the tree , and if we want the setup reusable I guess you should savestate the whole population region
c
ok
m
for the speedrun not necessary but for things like the reloadable tree gun we probably want to savestate the whole population region
speedrun can be one time use
t
I was planning on indexing the server this weekend btw.
6 Views