The problem was pointed out by Josh
(gitlab.com/krazy-j) in merge request !22.
Apparently MT is not very smart about marking
mapblocks dirty to send to clients based on
calling mt.set_node(), i.e. it will mark them
dirty presumptively even if you set the node to
the same value it had already been.
This behavior can be confirmed by registering
an ABM against a common node like grass and
setting action = minetest.set_node. This
causes every mapblock containing that node
to be invalidated every interval, causing a big
spike in the packets received each interval
that you can clearly see on the F5 graph.
Rather than just fixing it for the most easily
observed case (fire checks), add utlity functions
to check this for ALL node change situations,
and apply it more or less universally anywhere
that we are not certain that the node is being
changed and we don't need to worry about the
extra overhead cost of the check.
Note that we don't need a
nodecore.set_loud_check call, as set_loud was
only ever being used already in cases where
we were pretty sure we were actually changing
a node.
- New near_unloaded API that supports custom
distance parameter, map bounds check, and
some optimizations.
- Add area automatic unload check support to ABM
API and add to applicable ABMs, replacing many
old manual checks.
Note that the explicit unload check is only strictly
necessary when something will happen due to
a node NOT being present in the area, e.g. something
igniting due to absent coolant, or soaking quantity
being reset due to missing sources. In simple cases
where the absence of a thing causes the ABM to do
nothing, then the standard check can work because
the default action is to do nothing anyway.
Make sparks bias "downward" for igniting nearby
materials, making starting a fire on top of thatch
more useful, and making thatch a more useful
tinder material.
Some users may use filtering but not have the "clean transparent"
filter enabled in the Minetest engine config. Bake this filter
into all images to (1) avoid the consequences of this (i.e. black
halos), and (2) possibly speed up startup time (the filter will
converge immediately).
Lock more things behind prerequisite hints, even if
they're not absolutely strictly necessary to complete
in that order, if they would commonly be done in
that order. This reduces players being overwhelmed
by available hints very early in the game, and avoids
red herrings like "find lux" which can technically be
accomplished but yields no useful results until the
player can act on them.
- Unify logic for expanding nodenames/itemnames lists into indexes
of matching names, and comparing item names/defs to lists,
with group expansion and deferral.
- Add "autostart" option to DNTs which registers construction traps
and a patrol ABM automatically, use for some things that are a
good match.
- Note that some things are doing more complex logic in ABMs, such
as determining if a node is eligible, or custom timing logic;
leave these as-is for now.
Once again, you can dig any node given enough
time and patience, but now you no longer receive
the resources from that node, and the node goes
into a "displaced" state where you can move past
it but it will re-place itself as soon as you walk
away, similar to how scaling nodes work.
...similar to how loose items are.
- They're emphemeral/air-like anyway
- Prevent exploiting protection areas to make traps to
capture players or their items.
Hints themselves have not been tided up
much, but this makes the project of fixing the
hints for each mod a little more manageable
and breaks up the hard-to-navigate single
monolithic hints file in the old guide mod.
The old guide mod has now been completely
retired. Hints are now a full-fledged API-layer
standard feature.
- Move hint handling down to API layer
- Simplify stat data; old nc_stats counting can
be moved out to a separate mod. We only
need whether the player has seen or not.
- Invert inventory tab responsibility.
- Merge witness system in from crafting.
TODO:
- Redistribute hint registration responsibility
to individual mods.
- Test external mod compat.
- Retire old nc_stats and nc_guide systems.
- Add a way to reset hints.
Optics keep track of path dependency info
used in calculating state. When a node is
added/removed in the path via the mod API
(i.e. not schematics, vmanip, etc.) then the
nodes whose state decisions depended on
paths going through there are automatically
triggered for a recheck.
This should make things like furnace sand
auto-loaders respond snappily.
Granted, memory use with this approach is
a concern, but we will just have to monitor it
under normal usage patterns.
- Players no longer constantly glow in darkness.
- Players can now place light spots by scaling, faster
than actual climbing spots.
- Climbing spots appear if player continues placement
after light appears.
- Floor traversal mechanism is now obsolete.
This allows players to traverse dark caves reasonably
well, still, but only voluntarily, so darkness stealth
mechanics are possible again.
Lots of issues with players being unable to figure out traversal
of dark caves. Total darkness is probably too much of an ostacle
for players who haven't already learned how to avoid those kind
of circumstances.
- Storeboxes are now scalable.
- Standardize touch-hurt operation.
- Touch-hurt damage on scaling.
- Now possible to alter scaling time via scaling_time
group (percent of original scaling time)
- No day/night cycle, no sun/moon.
- Get rid of clouds too.
- Skybox is now 100% texture-packable.
- Natural light diminishes with depth.
Night-time no longer disrupts gameplay topside, but
skylights are no longer useful to an infinite depth and
artificial light is necessary for all deep mining.
This freezes many things that normally happen automatically
in the world, including most ABMs and AISMs, and a few other
custom step logic items like the player "hot potato" logic.
This can be used for "creative mode" purposes to setup a complex
build without it running itself away from you, and for texture
pack authors, to have time to see things that are normally
transient or difficult to observe because of the effects they have
on nearby things or players.
Treat all API mods as a "layer", and use the new
nc_api_all registration to indicate that a mod depends
on the NC API (which ALL NC mods assume they do).
This means that each non-API mod does not need to
worry about which API mods it really needs and which
it does not, nor will they need to be updated for any
internal API restructures.
This is a game, not a modpack, so all mods will be
loaded anyway, and we only care about order. That
means that we don't really need to worry about
having excess dependencies because any mod we
don't actually need will be needed by something that's
loaded anyway. If somebody wants to reuse a
component elsewhere, they're likely to need to do
some work to untangle it anyway, because of the
amount that NodeCore mechanics interact and
interdepend.
This created a ton of dependency inversions, which
necessitated moving a number of API functions up into
higher layers, and restructuring dependency lists for
a number of mods.
BOLO: non-deterministic load errors due to missed
dependencies.
Making hand dig everything broke logic that was
depending on things being "not hand diggable".
Continue to treat things as not-hand-diggable if they
would take a long enough time to dig.
Nodes cannot be scaled only if they are BOTH falling
nodes AND diggable by hand. Mostly this just means
sand cannot be scaled and needs to be dug out
instead.
If watching someone else scaling a cliff from a distance, you will not
see where the handholds are, but if you are nearby, you will be able to
see and share them.
- Prevent downgrading.
Should prevent player from falling when overhangers replaced.
- Allow hanging construction through other scaling nodes.
Should prevent full overhangs from being blocked by wall scaling.
- Repeat/hold place (right-click) with empty hand instead of pummel.
- Otherwise, works similarly to first generation.
- Scaling nodes can overwrite each other now (upgrade wall to ceiling).
- Visuals are now particle-based instead of texture, like Gen 2.
While this makes scaling a little easier to do, it still doesn't
fix the fundamental problem of scaling being distracting and too
easy to trigger accidentally.
The "pummel" version of scaling caused some confusion when one
player accidentally triggered it trying to figure out how to get
lode out of lode ore. The current one triggers accidentally all
the time just from tabbing out of a game with it running (e.g. it
isn't paused in multiplayer) leaving the character staring at a
wall. While such a player WOULD have opportunity to find
handholds in the wall, we aren't differentiating between a player
who's scrutinizing a surface from one staring off into space.
The scaling needs to be made harder to trigger accidentally, like
reinstating the need for an empty hand. Using a right-click
action may also help distinguish it from pummelng recipes.
Removing this from the alpha branch so players don't get too
accustomed to this functionality and then have it change AGAIN.
This reverts commit 943604cf9588a316dce19e0a60a4219b52c4d905.
- Remove pummel recipes. Now find handholds just by
staring at a particular spot. Being closer or better focused
helps.
- Use only particles instead of a facedir node, so facedir
isn't a problem when adjacent to multiple walls/ceilings.
- Automatically upgrade "wall" climbing to "overhang" climbing
when a ceiling is present.