1100 Commits

Author SHA1 Message Date
tchncs
907cb3be8c add 3d_armor to submodules 2016-05-25 22:52:40 +02:00
tchncs
82a31236be add worldedit to submodules 2016-05-25 22:03:46 +02:00
tchncs
92ee60e6c7 update submodule farming 2016-05-25 15:34:48 +02:00
Auke Kok
e0cb3fce02 Default: Convert saplings to use node timers
Each sapling is given a single node timer that is between
2 and 4 days of game play time (40-80 minutes). If you walk out
of the zone, and come back later, the tree will always grow
to full if the timer has elapsed.

Because trees.lua is all functions, it needs to be parsed before
nodes.lua, since that references some of its functions. Hence,
change the order of parsing here. Otherwise saplings would not
grow to full.
2016-05-25 03:27:08 +01:00
Auke Kok
70ef7864c1 Farming: Convert plants to use node timers
This PR requires @minetest/minetest#3677

Farming and plant growth has traditionally in minetest been
implemented using ABM's. These ABM's periodically tick and cause
plants to grow. The way these ABM's work has several side effects
that can be considered harmful.

Not to mention a comprehensive list of downsides here, but ABM's
are chance-dependent. That results in the chance that some nodes
potentially never get processed by the ABM action, and others get
processed always. One can easily find this effect by planting a large
field of crops, and seeing that some nodes are fully grown really
fast, and some just won't make it to fully grown status even after
hours or play time.

One could solve the problem by making the ABM's slower, and giving them
a 100% of action, but this would cause the entire field to grow a step
instantly at ABM intervals, and is both ugly, and a large number of
node updates that needs to be sent out to each client. Very un-ideal.

With NodeTimers though, each node will see a separate node timer event,
and they will likely not coalesce. This means that we can stop relying
on chance to distribute plant growth, and assign a single timer event
to grow the plant to the next phase.  Due to the timer implementation,
we won't ever miss a growth event, and we can re-scehdule them until
the plant has reached full size.

Previously, plants would attempt to grow every 9 seconds, with a
chance of 1/20. This means typically, a plant would need 9*20 seconds
to grow 1 phase, and since there are 8 steps, a typical plant growth
would require 9*20*8 ABM node events. (spread out over 9*8 ABM actual
underlying events per block, roughly).

because plants are likely not growing to full for a very long time
due to statistics working against it (5% of the crops take 20x longer
than the median to grow to full, we'd be seeing ABMs fire possibly
up to 9*20*8*20 with a 95% confidence interval (the actual math
is likely off, but the scale should be correct). That's incredibly
wasteful. We'd reach those conditions easily with 20 plant nodes.

Now, after we convert to NodeTimers, each plant node will see exactly
8 NodeTimer events, and no more. This scales lineairly per plant.

I've tuned the growth rate of crops to be mature in just under 3
whole days. That's about 1hr of game time. Previously, about half
the crops would grow to full in under 2 days, but many plants would
still not be mature by the end of day 3. This is more consistent.

An additional problem in the farming mod was that the final fully-grown
plant was also included in the ABM, causing infinite more ABM's even
after the entire field had grown to completion.

Now, we're left with the problem that none of the pre-existing plants
have actual node timers started on them, and we do not want a new ABM
to fix this issue, since that would be wasteful.  Fortunately, there
is now an LBM concept, and we can use it to assure that NodeTimers
on crop nodes are properly started, and only have to do the actual
conversion once per block, ever.

We want to provide a fairly similar growth rate after this conversion
and as such I've resorted to modelling some statistical data. For this
I created a virtual 32x32 crop field with 9 steps (8 transitions)
as is the default wheat crop. We then apply a step where 1 in 20
plants in the field grows a step (randomly chosen) and count the
number of steps needed to get to 25%, 50, 75% and 95% grown.

The resulting data looks as follows:

25% - ~120 steps * 9 sec / abm = 1080s
50% - ~152 steps               = 1368s
75% - ~194 steps               = 1746s
95% - ~255 steps               = 2295s

Next, we want to create a model where the chance that a crop grows
is 100% every node timer. Since there will only be 8 steps ever,
we want the slowest crops to grow in intervals of ~ 2300 / 8 seconds
and the fastest 1/4 of crops to grow 1080 / 8 seconds intervals.
We can roughly compare this to a normal distribution with a median
of 1400 with a stddev of ~350 (thick fingering this one here).

The rest is a bit of thick-fingering to get similar growth rates,
taking into account that ABM's fire regularly so if they're missed
it's fairly painless, but our timers are going to be 1-2 minutes
apart at minimum. I calculate the timer should be around 150s
median, and experimented with several jitter ranges.

Eventually I settled for now on [80,200] with a redo of [40,80],
meaning that each growth step at minimum takes (80 to 200) seconds,
and if a negative growth condition was found (darkness, soil not
wet, etc), then the growth step is retried every (40 to 80) seconds.

The end result is a growth period from seed to full in ~ 2.25
minetest days. This is a little bit shorter than the current
growth rate but the chances you'll miss timer ticks is a bit
larger, so in normal gameplay it should be fairly comparable.

A side effect is that fields grow to full yield fairly quickly
after crops make it to mature growth, and no crops are mature
a very long time before the majority grows to full. The spread
and view over a growing field is also fairly even, there's no
large updates with plenty of nodes. Just a node here or there
every second or so in large fields.

Ultimately, we get rid of ABM rollercoasters that cause tens of
node updates every 9 seconds. This will help multiplayer servers
likely a lot.
2016-05-25 03:26:53 +01:00
tchncs
c8fc4cfb36 update submodules 2016-05-24 12:01:34 +02:00
Auke Kok
fc902a77de Boats: Lower boat collision box top
Standing on a boat makes you appear to "hover" over it since this
collision box is way too high. Lower it so that it's low enough
to look normal when walking on top of a boat
2016-05-23 08:37:58 +01:00
paramat
3e5f3f28d2 Vessels: Improve code style 2016-05-23 08:37:58 +01:00
paramat
d8daee7e47 Vessels: Make shelf open on 2 sides not impossible 4 sides
Make shelf facedir rotatable as is now required
2016-05-23 08:37:58 +01:00
Duane Robertson
7681682d28 Doors: Fix uninitialized state variable 2016-05-23 08:37:11 +01:00
tchncs
79e4ea3bf2 update submodules 2016-05-23 09:07:19 +02:00
tchncs
ad04e5ae0d update submodules 2016-05-22 23:33:14 +02:00
tchncs
8ef03465d1 update submodules 2016-05-22 23:05:42 +02:00
tchncs
f1ddb91275 update submodules 2016-05-22 22:43:37 +02:00
tchncs
3c9c69e5fe replace farming with submodule 2016-05-22 09:56:56 +02:00
tchncs
95adcfc97b update submodules mods/mobs_animal and mods/mobs_monster 2016-05-21 15:39:37 +02:00
Thomas--S
b9422ed44e Vessels: Smaller/improved textures, remove duplicated 'inv' textures
Removed unnecessary inventory textures
The drinking glass inventory texture now differs from
the node texture to be more clearly a drinking glass
Smaller textures to reduce size as nodes
2016-05-21 03:03:03 +01:00
red-001
b1e0864cf1 Creative: Reset 'start_i' to 1 when the inventory filter is changed 2016-05-21 03:02:10 +01:00
paramat
90f24e312d Default: Remove unnecessary infotexts for chests and signs 2016-05-21 03:01:10 +01:00
tchncs
bb93133ceb replace submodule mods/mobs_animal 2016-05-20 12:39:21 +02:00
tchncs
8578d16b76 add alias for moretrees:slab_acacia_planks, fixes #4 2016-05-19 23:36:55 +02:00
tchncs
7ac7661de1 update submodule mods/illuna 2016-05-19 23:18:25 +02:00
tchncs
ac7e46b74d add mobs_redo, mobs_animal, mobs_monster to submodules 2016-05-18 12:28:04 +02:00
tchncs
018c89a9d6 update submodule illuna 2016-05-16 00:26:42 +02:00
tchncs
482573ca32 update/fix submodule death_messages 2016-05-15 21:35:10 +02:00
tchncs
f70c1e91b1 remove obsolet submodule death_messagem add new death_messages module 2016-05-15 21:28:52 +02:00
tchncs
25aff14341 add wine mod to submodules 2016-05-15 15:51:24 +02:00
paramat
e7a55734d3 Tnt: Avoid divide-by-zero errors in calc_velocity() 2016-05-08 22:53:16 +01:00
tenplus1
b36b154257 Creative: Fix inventory crash after toggling creative mode in-game 2016-05-08 00:40:52 +01:00
tenplus1
3976dc6a5b Creative: Fix '-' glitch in playername
Fix the glitch when players use the '-' character in their username
on a server, causing creative inventory to not pass page 2
2016-05-07 02:13:00 +01:00
tenplus1
8ea031ef77 Creative: Add global variable creative.formspec_add
This pull adds a new global variable called creative.formspec_add
that will allow mods to add to the creative inventory screen
without the need to fork the mod altogether.  Simple solution
that works already for inventory_plus' BACK button
2016-05-07 02:07:55 +01:00
paramat
8c3f96d738 Stairs/default: Make sandstone(brick) groups consistent
Sandstone is crumbly = 1 cracky = 3 to be slowly diggable by hand
Sandstonebrick(stair/slab) is cracky = 2
2016-05-05 23:46:53 +01:00
Foz
8d3d558e42 Tnt: Fix bug in dropped item counting 2016-05-05 23:46:10 +01:00
paramat
de3adb5859 Default: Lower grass_side and snow_side textures
Half coverage for a more grassy appearance
Make snow_side universal by removing green pixels
Move KevDoy's heart texture credit to above sound credits
2016-05-05 23:42:10 +01:00
tchncs
69f284f950 merge minetest/minetest_game master 2016-05-02 11:11:05 +02:00
tchncs
f4fc4294b7 fix mergeconflicts 2016-05-02 10:16:25 +02:00
rubenwardy
acafe5ca86 Add give_initial_items API 2016-05-01 19:29:15 +01:00
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