Jump to content

LuuBluum

Members
  • Posts

    21
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by LuuBluum

  1. Right now out of the large number of ground storage options out there, there are none for small rocks. I don't know about you but small rocks tend to be the item that tends to accumulate in my inventory more often than not. So, simple suggestion: ground storage for small rocks. Nothing fancy, just a pile of rocks.

    • Like 5
  2. Ah, fair enough. I suppose it'd require other changes to make it more cohesive with plaster-before-metal as a concept. Oh well; I suppose I'd be better off doing things like this with mods of my own.

  3. Right now lime, oddly enough, requires metal production (hammers) to produce and doesn't require anything beyond crushing some limestone. However, this seems both oddly limiting (lime certainly was produced before metalworking) and also just not really able to get the sort of volume of lime production that existed back in the day. After all, quicklime was both useful in plaster and mortar. Also of course realism concerns (lime requires cooking limestone, not crushing) but that's more of just an added perk to this proposal rather than the underlying goal.

     

    So, doing this would be simple enough. Dig a reasonably large pit in dirt, line the sides in cobblestone so the dirt doesn't fall in (or not; all that matters are that the sides are fireproof). Leave a hole in one of the sides of the bottom that leads out to open air, so the fire can burn without issue of airflow. Line the bottom with firewood blocks, cover on top with limestone (just the straight stones. I don't recall if stone piles are a thing but they'd probably have to be made a thing for this, but that seems reasonable as a way to store stones?), light fire through the bottom channel hole, and then simply let burn until the stones start to glow red. Takes a few days, ideally would require some stoking of the fire but that can be omitted for the sake of making it easier to do. Then the fire is simply left to burn out and the stones to cool off. What's left, besides a bunch of ash, is a bunch of brittle rocks that, if broken up (can be done by hand, or just make it that when collecting the burned rocks you just get lime powder in inventory) and mixed with water, turn into quicklime.

     

    Putting it simply, rather than have lime be the product of smashing limestone with a metal hammer, replace it with something that's a mix of a firepit and a charcoal pit that can be done without the need for metal tools. Neater, more realistic, and brings the benefit of lime without needing metal tools first.

  4. Another option is to simply have berry regrowth time be more reflective of actual berry regrowth time, which is to say roughly once or twice a year. Though I think that would only realistically be an option once fruiting trees are also added.

    • Like 7
  5. 3 minutes ago, Streetwind said:

    Grass plants have a chance to spawn whenever the texture of a dirt block changes.

    Freshly placed dirt blocks have no grass texture at all. Then, over time, their texture can go from patchy to sparse to full. Sometimes it skips a step, sometimes it does every step. Sometimes it happens quickly, sometimes it takes a while.

    Everytime the texture changes, it has a chance (but not a guarantee) to spawn a grass plant on top of it. If there already is one, the black texture can still continue to change, but it will obviously not spawn new grass, as it is already there. But if the grass plant is harvested, a new one might spawn at the next texture change.

    Once the dirt block has reached its final, full grass texture, it will never change again, and therefore, never spawn grass again. Unless you dig it up and place it back down so it starts texture-less again.

    Also, fallow farmland has a small chance of spawning grass over time. If you want a steady supply of grass without having to regularly dig up dirt, make a giant field, and don't plant anything on it. Doing the dirt thing generates gradd much faster, though.

     

    Ah, you are actually right on that. I guess that's to prevent tall grass spam, since otherwise over time fields of grass would become completely overgrown with tall grass.

     

    Perhaps that really means that we just need more wildlife to eat the ever-growing tall grass?

    • Like 2
  6. 39 minutes ago, Marlin said:

    How does it grow?

     

    Simple.

            public override void OnServerGameTick(IWorldAccessor world, BlockPos pos, object extra = null)
            {
                base.OnServerGameTick(world, pos, extra);
    
                GrassTick tick = extra as GrassTick;
                world.BlockAccessor.SetBlock(tick.Grass.BlockId, pos);
                if (tick.TallGrass != null && world.BlockAccessor.GetBlock(pos.UpCopy()).BlockId == 0)
                {
                    world.BlockAccessor.SetBlock(tick.TallGrass.BlockId, pos.UpCopy());
                }
            }

    Whenever it receives a server game tick, and specifically is told to grow grass in that tick, then it grows grass. Of course, that begs the question: when should it receive a server game tick?

    
            public override bool ShouldReceiveServerGameTicks(IWorldAccessor world, BlockPos pos, Random offThreadRandom, out object extra)
            {
                extra = null;
    
                if (offThreadRandom.NextDouble() > growthChanceOnTick) return false;
    
                if (growOnlyWhereRainfallExposed && world.BlockAccessor.GetRainMapHeightAt(pos) > pos.Y + 1)
                {
                    return false;
                }
    
                bool isGrowing = false;
    
                Block grass;
                BlockPos upPos = pos.UpCopy();
                
                bool lowLightLevel = world.BlockAccessor.GetLightLevel(pos, EnumLightLevelType.MaxLight) < growthLightLevel;
                if (lowLightLevel || isSmotheringBlock(world, upPos))
                {
                    grass = tryGetBlockForDying(world);
                }
                else
                {
                    isGrowing = true;
                    grass = tryGetBlockForGrowing(world, pos);
                }
    
                if (grass != null)
                {
                    extra = new GrassTick()
                    {
                        Grass = grass,
                        TallGrass = isGrowing ? getTallGrassBlock(world, upPos, offThreadRandom) : null
                    };
                }
                return extra != null;
            }

    Which is to say, first it rolls a die to see whether it should even grow, based on growth chance. Then it checks whether it should be getting rain and, if it should, whether it does. If all of that is met, it then checks  whether or not the grass should grow or die (die if smothered or in darkness, grow otherwise). If in fact it should, then it does.

     

    So, if you want grass to grow, make sure it is exposed to rain and not smothered, and is in good lighting. Then wait.

  7. 4 hours ago, caffeine9999 said:

    @redram have you guys considered opensourcing the engine (but not assets)? That way  you could have some free contributions and focus more on new content. I, for one, would dedicate some time to improve the engine and fix some bugs

    I'd have to dig up quotes, but from what I gather almost every change to the game made at the moment is made to the components that are open-sourced. Specifically, the "essentials" mod and the "survival" mod, which both work as mods on the engine base. With the mod patching system, you can make mods that do whatever changes you want to the game, fixes or otherwise. Hell, I imagine if you presented it to the devs they might even just pull said "fix" mods directly into the base mod, with some credit in the changelog.

     

    Though of course, it can't hurt to ask the devs themselves about that directly; I'm just someone who spent a lot of time reading the code for fun.

    • Like 1
  8. 5 hours ago, Dachantenne said:

    Just a quick question: What is meant with

    Is halite really completely removed? If so: Why?!

    Or should it be "halite [...] dry stone", which would be a special kind of halite (?)

    Dry stone is an alternate form of cobblestone, made with a stone brick in the middle instead of clay. It seems that that, specifically, was removed, rather than the stones themselves.

    • Thanks 1
  9. On 7/31/2021 at 3:36 AM, Elias Heyndrickx said:

    Perhaps you could break leaves but over time they would regrow? Would make it easier to get sticks and eventually get some seeds and plant more trees. Not sure if this is feasible computationally.

    Depending on the implementation this would be perfectly fine. If it's just "branchy leave blocks can fill adjacent empty blocks with leaves", that'd be both easy (you'd just override whether or not branchy leaves should receive server ticks on that condition, and when they do fill a random empty adjacent spot with a leaf) and computationally lightweight (every single dirt block in the game is constantly getting server ticks (or checking whether they should) to work out whether grass should grow on them, and performance hasn't slowed to a crawl; clearly it isn't that costly). Hell, could even apply this to branchy leaf block or leaf blocks adjacent to branchy leaf blocks, etc.

     

    Though I suggest perhaps a lower limit, lest forests become incomprehensible overnight with all their leaves.

  10. I like the idea of the materials that you use for construction actually having significance beyond aesthetics. I just think that this is probably both too mild and too inconvenient at the same time. The two-step downgrade, with the potential to repair the "damaged" door with a stick, and a damaged door breaking just yielding a stick or two (not sufficient to rebuild the door), alongside a lower chance of this happening, would be more functional to me.

     

    Then again, I'm also the type that would prefer (slow!) degrade of building blocks exposed to particular elements depending on the block, with the option to repair. It'd be interesting to leave a base behind and watch it be overtaken by the elements, y'know?

    • Like 1
  11. 7 hours ago, Brady_The said:

    Agreed. It's a nice door I prefer to use in some places, due to the better fit of the rough look, but it breaks a bit too often. Logically it would make more sense that the door would break after a certain amount of uses, instead of having a percentage chance of breaking. A door is a door, if properly constructed it should have a life span directly related to the material used to construct it and not just randomly fall off the hinges.

    For what it's worth, this is doable but not quite as easy as it sounds. In VintageStory, blocks don't have any sort of "memory" without a blockentity. This can be cheated a little bit (use block variants and orientations in clever ways), but generally speaking any time you want a block to store any amount of data other than its mere existence, you need a block entity. Doors do a cheat with this- when you open a door, it literally replaces the closed door with an open door. The code as it stands simply provides a chance, on that interaction, to instead break the door. Having it do a "count" system would require a block entity to keep track of the number of times you interacted with the door, which would be... well, not that much work, but it wouldn't be quite as easy as just modifying a value in a JSON to be, say, 5% instead of 10%.

     

    The idea of having there be a "it's about to break" version of the door is easier, but still requires some effort. Namely, the "bad roll, break" portion of the door-opening code would have to also check for a "if being broken from opening and there's a value of 'broken door to replace with', replace, if not then break" condition. Then of course you need to model the "about to break" door and all of that.

     

    Probably just easier to modify the percentage in the JSON. In blocktypes\wood\door:

    		breakOnTriggerChanceByType: {
    			"door-log-*": 0.10
    		}

    Modify that to be whatever percentage you want it to be. You'd be spending more time setting up the boilerplate for a mod than you would be making the change.

    • Thanks 1
  12. So, few things to note since I've been staring at tree code as of late. Firstly, the world generation of trees is actually quite nuanced and complex. Specifically, it actually is doing a grow-and-branch iteration that goes in arbitrary directions. The tree code isn't actually working in block logic, but gets simplified down to block logic to embed into the game once the tree is generated. Secondly, every single one of those details evaporates into the ether the moment those blocks are placed- trees, in the game, do not exist. Axes do some basic logic (break everything upward in a vertical square cone starting from the base, only cut the same kind of tree, only progress from log to branch and from branch to leaf) to ensure they "cut down a tree", but there's nothing coming from the tree itself there.

     

    In terms of what's "easier to implement", the first suggestion (random-chance unique leaf blocks) would actually be easier. Hell, I could tell you how to implement it right now. There's a function, 

            public int GetLeaves(float width)
            {
                return leavesByLevel[Math.Min(leavesByLevel.Length - 1, (int)(width * leafLevelFactor + 0.5f))];  // width < 0.1f ? leavesBlockId : leavesBranchyBlockId
            }

    The array is indexed rather simply- the first entry is a leaf block, the second a branchy leaf block. Simply check if that value works out to be 0, and add logic to account for the random chance to have one of those "guaranteed seed" leaf blocks. Take the logic of this function:

            internal bool TriggerRandomOtherBlock()
            {
                return rand.Value.NextDouble() < otherBlockChance * config.treeBlocks.otherLogChance;
            }

    Replicate it, except now with "otherLeafChance". Apply that function similarly to how TriggerRandomOtherBlock() is called here:

            public virtual int getBlockId(float width, TreeGenBlocks blocks, TreeGen gen)
            {
                return
                    width < 0.3f || NoLogs ? blocks.GetLeaves(width) :
                        (blocks.otherLogBlockCode != null && gen.TriggerRandomOtherBlock() ? blocks.otherLogBlockId : blocks.logBlockId)
                ;
            }

    Additionally, you will want to replicate this statement for your new leaf type, inside ResolveBlockNames:

                if (otherLogBlockCode != null)
                {
                    int otherLogBlockId = api.WorldManager.GetBlockId(otherLogBlockCode);
                    if (otherLogBlockId == -1)
                    {
                        api.Server.LogWarning("Tree gen tree: No block found with the blockcode " + otherLogBlockCode);
                        otherLogBlockId = 0;
                    }
                    this.otherLogBlockId = otherLogBlockId;
                }

    Then there's just the standard boilerplate stuff for introducing a new block that you'd do. Of course, I say all of this without having written a mod myself, but from what I gather everything I pointed out is the functionality of resin blocks in pine trees, and how to extend that same logic to leaves. You'd similarly have to update all the tree JSONs to include the desired variables, of course.

     

    The alternative, the "chance counter that increases until a success", is actually much harder. Generally speaking, tracking persistent stuff like that is a lot harder than it seems. The best you could manage there is specifically tying it to breaking trees with an axe, because that specifically nabs every block in the "tree" in a loop during the breaking process. Just modify the while loop in OnBlockBrokenWith. The problem is that you have no way to know whether or not a block actually dropped its given drop this way, so even then you can't count successful drops, just total sum of broken leaves.

    • Like 2
    • Cookie time 1
    • Mind=blown 3
  13. At least taking a look at the API and whatnot, if wolves are spawning right next to you then that is a bug- they should, at a minimum, spawn at least 18 blocks away. Additionally, they are blocked from spawning too close to block light sources- anything brighter than light level 7, and they should not spawn. If they are spawning regardless, this is a bug.

     

    These restrictions also apply to drifters, though drifters are barred from spawning due to any light brighter than light level 7, not just block lighting. A torch has light level 14, meaning that no drifters should be spawning within roughly 7 blocks (by Manhattan distance, presumably) of a torch. If they are, this is a bug.

    • Like 1
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.