Commit Graph

733 Commits

Author SHA1 Message Date
Auke Kok
12c763a6c7 TNT: Combine adjacent TNT into the explosion
This uses a vmanip to count adjacent tnt nodes and explodes them
all at once, using an inverse square law to recalculate the radius.
The maximum explosion becomes 125 nodes of tnt yielding a radius of
15 nodes, which does not break my machine and makes it return
in under a second.

This makes both bigger explosions and less stability issues.

The drop code has been simplified and now drops at all times a
reasonable amount of drops, never blanketing the area with drops,
even at the larges explosion level.

Particles are scaled up according to explosion size as well - a
bigger explosion will show bigger particles.

To scale the tnt:boom particle, we move it to the _effects() function.
2016-05-01 18:57:45 +01:00
Auke Kok
098ea0d10a TNT: Allow mods to override entity physics.
Introduces an `on_blast(luaobj, damage)` callback that mods can attach
to an entity def. The function will get called with the damage that
TNT would make.

The function should return three values:

  bool do_damage, bool do_knockback, table drops

do_damage allows the mod to tell the TNT code to perform damage on
the entity for the mod. The mod code should not do anything with
the entity HP. The entity should not be immortal. If false, then
the entity will not be damaged by the TNT mod.

do_knockback allows the mod to tell the TNT mod to perform an
entity knockback effect. If false, no knockback effect is applied
to the entity.

the drops table is a list of items to drop. It may be nil. E.g. {
"wool:red" }.

I've documented both on_blast() API methods in game_api.txt. It is
a better place than lua_api.txt.
2016-04-30 20:47:21 +01:00
Auke Kok
f14b411157 TNT: Fix multiple explosions erasing drops
Any second explosion near a first TNT explosion will punch all
entities found nearby, including item drops. This causes the
item pickup code to think the item was picked up, but by
a `nil` player, thus removing the item.

We query for the immortal entity group, and if the item is in
the immortal group, do not punch the item.
2016-04-30 20:47:21 +01:00
Foz
1a6298958e Default: Add function 'node_sound_gravel_defaults()' 2016-04-29 23:19:30 +01:00
paramat
fafbe2c268 Default: New grass and grass_side textures
Derived from Casimir's Voxelgarden texture
2016-04-29 23:19:30 +01:00
tenplus1
dc7cbdd5ab Beds: Quicker saves with tidy output
Tweaked the beds.save_spawns() function to compile list then output
to file with shortened co-ordinates containing 1 decimal place
2016-04-29 23:18:05 +01:00
Auke Kok
5cd4b5a231 TNT: make tnt:boom visual a particle, and larger
We reuse the tnt:boom texture for a particle that is added by the
on_construct() of tnt:boom, and has a short expiry time (0.2sec).
It is 3 nodes larged, centered on the explosion.

We then make tnt:boom airlike so it doesn't have a texture, and it's
the thing that emits lots of light (we could even make it exist a
bit longer).

The nice thing about particles is that the client is less susceptible
to lag and will always remove them as fast as possible, so this makes
the visual more constant and responsive.
2016-04-26 22:34:00 +01:00
Auke Kok
f62afa02b7 TNT: lower smoke particle count and speed.
The effect is similar, and the reduction in particles is a small
boost in responsiveness.

To compensate, I've lowered the spawner time and expiration length
as well.
2016-04-26 22:34:00 +01:00
Auke Kok
7a892c70e6 TNT: self-start boom removal timer. 2016-04-26 22:34:00 +01:00
Auke Kok
682d79b82a TNT: make tnt:burning a falling node.
This allows TNT to be used for e.g. traps (drop it from the
ceiling) or weird tnt effects with other explosions.
2016-04-26 22:34:00 +01:00
Auke Kok
8b384fb257 TNT: randomly vary ejecting velocity
We add a +/- 0.5 random value to the velocity vector of
ejecting nodes.

I've spotted a lot of nodes going exactly straight up if blowing
up sand above TNT. The extra variation looks less artificial.
2016-04-26 22:34:00 +01:00
Auke Kok
d6c33da355 TNT: Damage mobs, knock back players
We apply punch damage to mobs caught in the blast radius, as
this code previously only hurt players.

We "move" players back 1 node if they're caught in the blast, and
slightly up. We can't "eject" players due to missing API code to
support that, unfortunately.
2016-04-26 22:33:59 +01:00
Auke Kok
386dcdef06 TNT: Whitespace cleanup 2016-04-26 22:33:59 +01:00
Auke Kok
54b87e955d TNT: Add on_blast to all nodes with an inventory
Adds a minor helper function that allows efficient retrieval of
several inventories from a node inventory. We use this helper to
quickly retrieve the items in chests, vessel shelves, book shelves
and furnaces, and return these with the nodes itself to the TNT caller.

The TNT caller then performs the entity physics, and we don't need
to do anything else.

We disable TNT doing anything with bones.

We expose a bug in the code that drops the items - metadata was lost
entirely. This patch corrects that by properly copying the metadata
and creating the drops list inclusive metadata.
2016-04-26 22:33:59 +01:00
paramat
f32a3ff57c Farming: Add quiet sounds to seeds 2016-04-23 20:09:04 +01:00
kilbith
16fe1efcd8 Flowers: Fix waterlily node's duplication with stack of 1 2016-04-23 20:08:43 +01:00
KevDoy
fa43bd8a56 Default: New heart texture
Similar to before, add symmetry and slightly more rounded off
2016-04-23 20:01:09 +01:00
paramat
e426f64993 Fire: Higher chance of removing flammable nodes
Flammable nodes burn away quicker
2016-04-19 05:33:13 +01:00
paramat
ab7b7c7504 Flowers: Make flower spread a public function to enable override
Remove search for 'group:flora_block'
Enable flora spread on 'dirt with dry grass'
2016-04-19 02:58:03 +01:00
Auke Kok
80664f9f8a Doors: Use LBM instead of ABM to convert doors.
This works much more efficiently to replace old style doors.
2016-04-19 02:57:54 +01:00
paramat
0ca43e42bc Default: Create 'grass', 'dry_grass' groups, use in dirt conversion ABM 2016-04-18 01:52:03 +01:00
Auke Kok
33aa5e77dc Character: Fix boat leg wobble.
There was a small leg wobble in the sitting animation (visible
when sitting on the boat). This removes it.
2016-04-18 01:51:57 +01:00
paramat
f8e273da15 Boats: Increase maximum velocity to 5n/s 2016-04-16 19:27:47 +01:00
tenplus1
9ece86cc7a Flowers: Tweak flower and mushroom spreading
Tidy up position numbers and code
Check for flora group aswell
Improve node light check for mushroom growth
Shrooms grow in 3 and below light
2016-04-16 19:27:41 +01:00
Auke Kok
7d93272caa Change how dirt turns to dirt_with_(something)
This changes how dirt blocks turn to dirt_with -grass, -dry_grass
or -snow.

Previously, dirt that was sunlit would turn to dirt_with_grass no
matter what, but this happened without any context, so you could
get green patches of dirt_with_grass in the middle of a savannah or
even desert.

Dirt no longer turns to covered dirt unless it's within 1 node from
another dirt_with_grass or dirt_with_dry_grass or dirt_with_snow.
This makes dirt_with_grass "growback" a lot slower, since it now only
happens on the edges, but it retains the context nicely now.

If there is any dirt with a grass or dry grass plant, or snow on top,
and enough light, we'll convert it sporadically to dirt_with_grass
or dirt_with_dry_grass or dirt_with_snow.

This allows us to plant grass of our choice in a large dirt patch,
or in a region where otherwise that type of grass is not present.

This used to be done by 2 abms, but I've combined them in to a single
ABM that is ordered to run with maximum efficiency, solving for the
most common outcome first before attempting more complex checks.
2016-04-16 19:27:34 +01:00
Auke Kok
64fe69f382 Remove "grass under snow" from default:dirt_with_snow in darkness.
This is technically "dirt with grass" that's just under a snow
cover, so in darkness the grass on these nodes will also die,
turning it into dirt.

This doesn't convert dirt_with_snow under snow.
2016-04-16 19:27:34 +01:00
Auke Kok
a2d4e57716 Call nodeupdate on the entire blast zone
This will make sand and gravel blocks on top of TNT actually fly
in the air.

  https://youtu.be/4omndVZijLc
2016-04-16 19:27:16 +01:00
Auke Kok
8114c3dbab Limit entity speed to 250m/s.
Let's just call it "terminal" velocity.
2016-04-16 19:27:16 +01:00
Auke Kok
e6cef57661 TNT: Move timer start to on_create() for burning nodes.
We add on_create() handlers for both burning TNT and burning
gunpowder. Because gunpowder will explode TNT in 1 second,
and not 4, we need to modify the 4 second timer after we
make the TNT burning. Other mods can now place burning TNT
that will by default explode after 4 seconds.
2016-04-16 19:27:16 +01:00
Auke Kok
0736d30e33 TNT: Fix up nil derefs
I spotted two places where under stress (many explosions) luajit would
end up passing nil to these functions. I'm not entirely sure how,
but it seems good form to guard against it, which does make it
more robust. After this patch, I'm not able to crash the server. With
many explosions, it may still lag significantly, but always returns
in the end.
2016-04-16 19:27:16 +01:00
Auke Kok
da5f4a939e Fix API docs after various changes. 2016-04-16 19:27:16 +01:00
red-001
a84e2669c7 Restructure code to only check def once. 2016-04-16 19:27:16 +01:00
Auke Kok
ccee025ce3 Calculate blast intensity at all locations.
We define the blast intensity as the square of the tnt_radius, divided
by the square of the distance to the explosion center, where distance
is limited to 1 at the lower end.

When destroying nodes, we calculate the intensity for each node, and
only destroy the nodes when the intensity is 1.0 or larger. To avoid
perfectly spherical explosions, we make sure to retain a randomness
factor of 20%. This will make explosion edges jagged and not smooth,
but not too much.

We pass the calculated intensity to on_blast() functions as well,
except we take the jitter here out and make sure it's always 1.0
or larger.
2016-04-16 19:27:16 +01:00
Auke Kok
8c801529df TNT: Limit amount of stacks ejected.
We apply a log scale to the size of the stacks ejected, so that
in larger explosions we are getting larger stacks. For normal r=3
explosions, this gives stack sizes ~6-7 or so, but for r=10 explosions
it could end up giving stacks of 25+.V
2016-04-16 19:27:16 +01:00
Auke Kok
3ddff2fbea TNT: Chain reaction
With the new high res timer, we can make TNT much better create chain
reactions. This does exactly that.
2016-04-16 19:27:16 +01:00
Auke Kok
eafd1ebc43 TNT particles: use drops list smartly
The drops list already has quantities, so let's just select the one
with the highest quantity from it, and use that as tile. Fallback
tile will therefore only be used if explosion happens in air. Oh well.
2016-04-16 19:27:16 +01:00
Auke Kok
3623398b78 TNT: Spacing / codestyle fixes
- Fix spacing errors around = and ..
- Indentation fixes
- Break up long lines
2016-04-16 19:27:16 +01:00
red-001
b25889e742 Make TNT faster by using VoxelManip() for removing nodes. 2016-04-16 19:27:16 +01:00
red-001
9f4dc1412b Fix TNT mod calculate blast intensity.
Currently the TNT mod uses a dummy vaule of 1 for this.
2016-04-16 19:27:16 +01:00
red-001
cfef21f4d9 Add TNT API. 2016-04-16 19:27:16 +01:00
Auke Kok
8556dd30e2 TNT: add some depth to the explosion effect
We add a dirt-like particle (drawn from scratch, uses some
colors from default_dirt's palette) to spawn many particles
that have collision enabled around the center of the blast.

This has the effect of obscuring the center of the blast, as
that is a painfully visible empty area when the explosion happens,
as there's only a little spark.

The dirt particles bounce around the walls and floor a bit,
and disappear rapidly, well before the smoke particles disappear.

This is a nice visual distraction that obscures the sudden
appearance of the gaping hole, and makes it a whole lot more
believable.
2016-04-16 19:27:16 +01:00
Auke Kok
8cd049c224 Make TNT a bit more fun.
But not too much.

TNT is a bit underwhelming at the moment. We can make it a bit
more interesting by ejecting not just one or two itemstacks,
but a bunch of them. This code splits up the drops into
separate itemstacks that are 2-5 items together, which
results in generally roughly 10 itemstacks being ejected.

Since now we have multiple ejecta, it makes sense to tune
the ejecta velocities a bit better to get the appearance of
an actual explosion better. The items will not all start
with the same vertical velocity, since that would look
like fireworks. Instead we give them all a different vertical
speed.
2016-04-16 19:27:16 +01:00
Auke Kok
12d5ca2f48 Allow the on_blast API to pass an itemstack.
If the node is special and has an on_blast() handler, we need
to call it instead of getting node drops manually. However, we
do want to know if drops should be added for the special nodes,
so we modify the on_blast() handler code to allow the nodedef
handlers to pass back itemstacks. This could be used by e.g.
the doors mod to drop door items after a blast.

Since this API is documented in lua_api.txt, a separate PR will
be incoming to update the on_blast() documentation.
2016-04-16 19:27:16 +01:00
Auke Kok
3ecafbcfb4 Remove composed shelf side.
Don't compose the shelf side texture. The texture isn't transparent,
and unlikely to be in any case.
2016-04-14 02:46:03 +01:00
kilbith
082b36d3e7 Books: Split text per page relatively to number of lines 2016-04-14 02:45:57 +01:00
kilbith
7be008936e Flowers: Fix itemstack when waterlily is placed 2016-04-12 01:28:16 +01:00
tenplus1
6e1a329763 default: Strengthen obsidian glass Remove group 'oddly_breakable_by_hand' 2016-04-12 01:27:55 +01:00
kilbith
47b197e4d5 Flowers: Cleaning of waterlily's placement 2016-04-08 01:13:14 +01:00
paramat
be05441e77 Farming: Override dirt_with_dry_grass to enable cultivation 2016-04-08 01:13:05 +01:00
paramat
aadac1223d Default/mapgen: Denser rainforest, fewer logs 2016-04-08 01:12:56 +01:00