Compare commits

..

23 Commits

Author SHA1 Message Date
JoseDouglas26 2dafbae64b Hotfix for brewing stands rotation (#4371)
Reviewed-on: VoxeLibre/VoxeLibre#4371
Reviewed-by: teknomunk <teknomunk@protonmail.com>
Co-authored-by: JoseDouglas26 <josedouglas20002014@gmail.com>
Co-committed-by: JoseDouglas26 <josedouglas20002014@gmail.com>
2024-06-07 06:10:52 +00:00
the-real-herowl 65d6cb1d83 Merge pull request 'release/0.87.1' (#4357) from release/0.87.1 into master
Reviewed-on: VoxeLibre/VoxeLibre#4357
2024-06-02 02:01:07 +00:00
the-real-herowl acf72be89c Post-hotfix reset version 0.88.0-SNAPSHOT 2024-06-02 04:00:05 +02:00
the-real-herowl 1153a81b65 Update release notes for hotfix v0.87.1 2024-06-02 03:58:50 +02:00
the-real-herowl f423c1ea25 Set version for hotfix v0.87.1 2024-06-02 03:47:02 +02:00
the-real-herowl d8aeb4ce12 Updated hotfix process (#4356)
Reviewed-on: VoxeLibre/VoxeLibre#4356
Co-authored-by: the-real-herowl <wiktor_t-i@proton.me>
Co-committed-by: the-real-herowl <wiktor_t-i@proton.me>
2024-06-02 01:43:08 +00:00
the-real-herowl 21c182fc0e Fixed creative.lua invalidating iterator in loop (#4354)
Reviewed-on: VoxeLibre/VoxeLibre#4354
Co-authored-by: the-real-herowl <wiktor_t-i@proton.me>
Co-committed-by: the-real-herowl <wiktor_t-i@proton.me>
2024-06-02 00:33:29 +00:00
teknomunk ca033d0e8d Correctly refresh enchantment tool capabilities in mcl_potions haste/fatigue effects (#4355)
Reviewed-on: VoxeLibre/VoxeLibre#4355
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: teknomunk <teknomunk@protonmail.com>
Co-committed-by: teknomunk <teknomunk@protonmail.com>
2024-06-01 23:25:42 +00:00
teknomunk beccbacc73 Fix Stalker texture generation (#4343)
This fixes stalker texture generation when the stalker is standing on a node that uses a texture using a texture modifier.

Reviewed-on: VoxeLibre/VoxeLibre#4343
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: teknomunk <teknomunk@protonmail.com>
Co-committed-by: teknomunk <teknomunk@protonmail.com>
2024-06-01 20:23:38 +00:00
teknomunk ecf12b85cc Fix undefined global warning for variable distance in spawning code (#4348)
Fixes the warning about an undeclared global that occurs the first time a mob attempts to spawn.

Reviewed-on: VoxeLibre/VoxeLibre#4348
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: teknomunk <teknomunk@protonmail.com>
Co-committed-by: teknomunk <teknomunk@protonmail.com>
2024-05-31 09:54:59 +00:00
the-real-herowl f53bedc131 Merge pull request 'Fix beacon crash' (#4342) from teknomunk/MineClone2:fix-beacon-crash into master
Reviewed-on: VoxeLibre/VoxeLibre#4342
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
2024-05-30 11:19:19 +00:00
the-real-herowl 3e6ec9cf10 Fixed eye of ender crash (#4344)
This makes sure every loaded eye of ender gets its `_luck` parameter set.

Reviewed-on: VoxeLibre/VoxeLibre#4344
2024-05-30 11:17:19 +00:00
teknomunk 6c8771485c Fix variable name 2024-05-30 10:51:45 +00:00
teknomunk f621e3c1de Fix up formspecs on pre-0.87.0 beacons, fix typo 2024-05-30 10:51:45 +00:00
teknomunk 7d0f49a218 Fix typo 2024-05-30 10:51:45 +00:00
teknomunk 468c2bc68f Change to conversion table 2024-05-30 10:51:45 +00:00
teknomunk 2fc3d92550 Convert 'strenght' to 'strength' in beacons and guard against no effect string metadata set, fix whitespace in mcl_beacons/init.lua 2024-05-30 10:51:45 +00:00
teknomunk 95228500a9 Don't crash when name == nil 2024-05-30 10:51:45 +00:00
teknomunk c7e43e31d4 Convert crash to a warning 2024-05-30 10:51:45 +00:00
JoseDouglas26 067ad7b78b Change stack size for snowballs and eggs (#4312)
Reviewed-on: VoxeLibre/VoxeLibre#4312
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: JoseDouglas26 <josedouglas20002014@gmail.com>
Co-committed-by: JoseDouglas26 <josedouglas20002014@gmail.com>
2024-05-30 08:31:15 +00:00
teknomunk add9cbe3bc Fix mob spawner crash (#4337)
This fixes #4336 crash at login about mcl_mobspawners. Also adds an API call, `mcl_mobs.register_conversion` for converting one mob into another and updates rovers and stalkers to use this API call.

Reviewed-on: VoxeLibre/VoxeLibre#4337
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: teknomunk <teknomunk@protonmail.com>
Co-committed-by: teknomunk <teknomunk@protonmail.com>
2024-05-30 08:29:12 +00:00
teknomunk c4f4e7b6fc Fix crash that occurs when lingering or splash potions are used from a dispenser (#4335)
Reviewed-on: VoxeLibre/VoxeLibre#4335
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: teknomunk <teknomunk@protonmail.com>
Co-committed-by: teknomunk <teknomunk@protonmail.com>
2024-05-30 08:02:59 +00:00
teknomunk 6394371e4f Update minetest version support information (#4332)
Reviewed-on: VoxeLibre/VoxeLibre#4332
Reviewed-by: the-real-herowl <the-real-herowl@noreply.git.minetest.land>
Co-authored-by: teknomunk <teknomunk@protonmail.com>
Co-committed-by: teknomunk <teknomunk@protonmail.com>
2024-05-30 08:00:47 +00:00
18 changed files with 227 additions and 101 deletions

View File

@ -64,9 +64,12 @@ Use the `/giveme` chat command to obtain them. See the in-game help for
an explanation. an explanation.
## Installation ## Installation
This game requires [Minetest](http://minetest.net) to run (version 5.4.1 or To run the game with the best performance and support, we recommend the latest
later). So you need to install Minetest first. Only stable versions of Minetest stable version of [Minetest](http://minetest.net), be we always make an effort
are officially supported. to support one version behind the latest stable version. In some cases, older
versions might still be good enough but you would be missing out on important
Minetest features that enable important features for our game.
There is no support for running VoxeLibre in development versions of Minetest. There is no support for running VoxeLibre in development versions of Minetest.
To install VoxeLibre (if you haven't already), move this directory into the To install VoxeLibre (if you haven't already), move this directory into the

View File

@ -28,16 +28,16 @@ git commit -m "Updated release credits and set version for v0.87"
git add releasenotes/0_87-the_prismatic_release.md git add releasenotes/0_87-the_prismatic_release.md
git commit -m "Add release notes for v0.87" git commit -m "Add release notes for v0.87"
``` ```
5. **Tag and push to the tag:** 7. **Tag and push to the tag:**
``` ```
git tag 0.87.0 git tag 0.87.0
git push origin 0.87.0 git push origin 0.87.0
``` ```
6. Update version in game.conf to the next version with -SNAPSHOT suffix: 8. Update version in game.conf to the next version with -SNAPSHOT suffix:
``` ```
git commit -m "Post-release set version 0.87.0-SNAPSHOT" git commit -m "Post-release set version 0.88.0-SNAPSHOT"
``` ```
7. Push the above to a new branch, and make the release PR. Merge to finalize release process. 9. Push the above to a new branch, and make the release PR. Merge to finalize release process.
### Release via ContentDB ### Release via ContentDB
@ -68,46 +68,100 @@ git commit -m "Post-release set version 0.87.0-SNAPSHOT"
## Hotfix Release ## Hotfix Release
The below is not up-to-date. At the next hotfix the process should be finalized and updated. ### Before releasing
First, determine if the current state of the master branch is fine for the Hotfix.
In general, Hotfixes shouldn't contain new features to minimize the risk of regressions.
* If it hasn't been long since the release, and the only PRs merged so far are bugfixes and/or documentation changes,
it is certainly fine to use it as a base for the release.
* If there are some features merged, but they are aimed at fixing/alleviating important issues with the last released version, it may still be fine.
* If there are some simple QoL features merged that are irrelevant to the last release, it may still be fine to use it as a base for the Hotfix.
* If there are major features or large overhauls merged, it *most probably* is **not** fine to use as a base for the Hotfix.
If you decided that the current state of the master branch can be used as the Hotfix version, make sure that all the PRs merged since the last release
are in the Hotfix milestone and you are working on a clean branch based on the master branch, up-to-date with the one on the repo.
In this case, **skip** the following section.
### Prepare release branch ### Prepare release branch
When hotfixing, you should never release new features. Any new code increases risk of new bugs which has additional testing/release concerns. If you decided that the current state of the master branch shouldn't be used as the Hotfix version, you must prepare a release branch.
To mitigate this, you just release the last release, and the relevant bug fix. For this, we do the following:
* Create release branch from the last release tag, push it:
1. Create release branch from the last release tag, push it:
``` ```
git checkout -b release/0.82.1 0.82.0 git checkout -b release/0.82.1 0.82.0
git push origin release/0.82.1 git push origin release/0.82.1
``` ```
2. Cherry-pick the relevant commits from the master branch, or merge them from other (PR) branches.
3. Make sure your local copy of the branch contains all the relevant changes, **do not rebase**.
#### Prepare feature branch and fix ### Release process
* Create feature branch from that release branch (can review it to check only fix is there, nothing else, and use to also merge into master separately)
`git checkout -b hotfix_bug_1_branch`
* Fix crash/serious bug and commit
* Push branch and create pr to the release and also the master branch (Do not rebase, to reduce merge conflict risk. Do not delete after first merge or it needs to be repushed)
#### Update version and tag the release
* After all fixes are in release branch, pull it locally (best to avoid a merge conflict as feature branch will need to be merged into master also, which already changed version):
* Update version in game.conf to hotfix version and commit it. Example: version=0.82.1
* Tag it, push tag and branch:
1. Update CREDITS.md if it is needed
2. Update version in game.conf
3. If you've changed CREDITS.md, run the script:
``` ```
git tag 0.82.1 lua tools/generate_ingame_credits.lua
```
git push origin 0.82.1 4. Make a commit for the above:
```
git add game.conf
git commit -m "Set version for hotfix v0.87.1"
```
or, if credits got updated:
```
git add CREDITS.md
git add mods/HUD/mcl_credits/people.lua
git add game.conf
git commit -m "Updated release credits and set version for hotfix v0.87.1"
```
5. Add a section in the last releasnotes, like this:
```
## 0.87.1 hotfix
```
and describe the changes there
6. Make a commit for the releasenotes changes:
```
git add releasenotes/0_87-the_prismatic_release.md
git commit -m "Update release notes for hotfix v0.87.1"
```
7. **Tag and push to the tag:**
```
git tag 0.87.1
git push origin 0.87.1
```
8. If you are skipping some changes from the master branch (and thus are using a prepared master branch from the previous section),
push to the remote and skip the next two steps:
```
git push origin release/0.82.1 git push origin release/0.82.1
``` ```
9. If you're releasing master branch, update version in game.conf to the next version with -SNAPSHOT suffix:
```
git commit -m "Post-hotfix reset version 0.88.0-SNAPSHOT"
```
10. If you're releasing master branch, push the above to a new branch, and make the release PR. Merge to finalize release process.
Note: If you have to do more than 1 hotfix release, can do it on the same release branch. ### Release via ContentDB
1. Go to VoxeLibre page (https://content.minetest.net/packages/Wuzzy/mineclone2/)
2. Click [+Release] button
3. Enter the release tag number in the title and Git reference box. For example (without quotes): "0.87.1"
4. In the minimum minetest version, put the oldest supported version (as of 19/05/2024 it is 5.6), leave the Maximum minetest version blank
5. Click save. Hotfix is now live.
### After releasing
...inform people.
* Add a comment to the forum post with the release number and change log. Maintainer will update the main post with code link.
* Add a Discord announcement post and @everyone with link to the release issue and release notes, and describe briefly what the hotfix does.
* Add a Matrix announcement post and @room with content like above.
* Share the news on reddit + Lemmy. Good subs to share with:
* r/linux_gaming
* r/opensourcegames
* r/opensource
* r/freesoftware
* r/linuxmasterrace
* r/VoxeLibre
* r/MineClone2 (*for now*)

View File

@ -671,6 +671,13 @@ mob will spawn e.g.
mobs_animal:sheep_chance 11000 mobs_animal:sheep_chance 11000
mobs_monster:sand_monster_chance 100 mobs_monster:sand_monster_chance 100
Registering Mob Conversion
----------------
Sometimes you need to completely replace one mob with a different version. To do this, use:
mcl_mobs.register_conversion(old_name, new_name)
Rideable Horse Example Mob Rideable Horse Example Mob
-------------------------- --------------------------

View File

@ -342,6 +342,17 @@ function mcl_mobs.register_mob(name, def)
minetest.register_entity(name, setmetatable(final_def,mcl_mobs.mob_class_meta)) minetest.register_entity(name, setmetatable(final_def,mcl_mobs.mob_class_meta))
end -- END mcl_mobs.register_mob function end -- END mcl_mobs.register_mob function
function mcl_mobs.register_conversion(old_name, new_name)
minetest.register_entity(old_name, {
on_activate = function(self, staticdata, dtime)
local obj = minetest.add_entity(self.object:get_pos(), new_name, staticdata)
local hook = (obj:get_luaentity() or {})._on_after_convert
if hook then hook(obj) end
self.object:remove()
end,
_convert_to = new_name,
})
end
function mcl_mobs.get_arrow_damage_func(damage, typ) function mcl_mobs.get_arrow_damage_func(damage, typ)
local typ = mcl_damage.types[typ] and typ or "arrow" local typ = mcl_damage.types[typ] and typ or "arrow"

View File

@ -633,7 +633,7 @@ local function get_next_mob_spawn_pos(pos)
-- those further away from the player. -- those further away from the player.
local fx = (math_random(1,10000)-1) / 10000 local fx = (math_random(1,10000)-1) / 10000
local x = inverse_pwl(fx, SPAWN_DISTANCE_CDF_PWL) local x = inverse_pwl(fx, SPAWN_DISTANCE_CDF_PWL)
distance = x * (MOB_SPAWN_ZONE_OUTER - MOB_SPAWN_ZONE_INNER) + MOB_SPAWN_ZONE_INNER local distance = x * (MOB_SPAWN_ZONE_OUTER - MOB_SPAWN_ZONE_INNER) + MOB_SPAWN_ZONE_INNER
--print("Using spawn distance of "..tostring(distance).." fx="..tostring(fx)..",x="..tostring(x)) --print("Using spawn distance of "..tostring(distance).." fx="..tostring(fx)..",x="..tostring(x))
-- TODO Floor xoff and zoff and add 0.5 so it tries to spawn in the middle of the square. Less failed attempts. -- TODO Floor xoff and zoff and add 0.5 so it tries to spawn in the middle of the square. Less failed attempts.

View File

@ -491,20 +491,17 @@ mcl_mobs.register_mob("mobs_mc:rover", {
view_range = 64, view_range = 64,
fear_height = 4, fear_height = 4,
attack_type = "dogfight", attack_type = "dogfight",
}) _on_after_convert = function(obj)
-- compat
minetest.register_entity("mobs_mc:enderman", {
on_activate = function(self, staticdata, dtime)
local obj = minetest.add_entity(self.object:get_pos(), "mobs_mc:rover", staticdata)
obj:set_properties({ obj:set_properties({
mesh = "vl_rover.b3d", mesh = "vl_rover.b3d",
textures = { "vl_mobs_rover.png^vl_mobs_rover_face.png" }, textures = { "vl_mobs_rover.png^vl_mobs_rover_face.png" },
visual_size = {x=10, y=10}, visual_size = {x=10, y=10},
}) })
self.object:remove() end
end, }) -- END mcl_mobs.register_mob("mobs_mc:rover", {
})
-- compat
mcl_mobs.register_conversion("mobs_mc:enderman", "mobs_mc:rover")
-- End spawn -- End spawn
mcl_mobs:spawn_specific( mcl_mobs:spawn_specific(

View File

@ -35,7 +35,8 @@ local function get_texture(self)
if not texture or texture == "" then if not texture or texture == "" then
texture = "vl_stalker_default.png" texture = "vl_stalker_default.png"
end end
texture = "([combine:16x24:0,0=" .. texture .. ":0,16=" .. texture .. texture_suff texture = texture:gsub("([\\^:\\[])","\\%1") -- escape texture modifiers
texture = "([combine:16x24:0,0=(" .. texture .. "):0,16=(" .. texture ..")".. texture_suff
if self.attack then if self.attack then
texture = texture .. ")^vl_mobs_stalker_overlay_angry.png" texture = texture .. ")^vl_mobs_stalker_overlay_angry.png"
else else
@ -131,7 +132,11 @@ mcl_mobs.register_mob("mobs_mc:stalker", {
self:boom(mcl_util.get_object_center(self.object), self.explosion_strength) self:boom(mcl_util.get_object_center(self.object), self.explosion_strength)
end end
end end
self.object:set_properties({textures={get_texture(self)}}) local new_texture = get_texture(self)
if self._stalker_texture ~= new_texture then
self.object:set_properties({textures={new_texture, "mobs_mc_empty.png"}})
self._stalker_texture = new_texture
end
end, end,
on_die = function(self, pos, cmi_cause) on_die = function(self, pos, cmi_cause)
-- Drop a random music disc when killed by skeleton or stray -- Drop a random music disc when killed by skeleton or stray
@ -175,7 +180,18 @@ mcl_mobs.register_mob("mobs_mc:stalker", {
floats = 1, floats = 1,
fear_height = 4, fear_height = 4,
view_range = 16, view_range = 16,
})
_on_after_convert = function(obj)
obj:set_properties({
visual_size = {x=2, y=2},
mesh = "vl_stalker.b3d",
textures = {
{get_texture({}),
"mobs_mc_empty.png"},
},
})
end,
}) -- END mcl_mobs.register_mob("mobs_mc:stalker", {
mcl_mobs.register_mob("mobs_mc:stalker_overloaded", { mcl_mobs.register_mob("mobs_mc:stalker_overloaded", {
description = S("Overloaded Stalker"), description = S("Overloaded Stalker"),
@ -304,26 +320,8 @@ mcl_mobs.register_mob("mobs_mc:stalker_overloaded", {
--Having trouble when fire is placed with lightning --Having trouble when fire is placed with lightning
fire_resistant = true, fire_resistant = true,
glow = 3, glow = 3,
})
-- compat _on_after_convert = function(obj)
minetest.register_entity("mobs_mc:creeper", {
on_activate = function(self, staticdata, dtime)
local obj = minetest.add_entity(self.object:get_pos(), "mobs_mc:stalker", staticdata)
obj:set_properties({
visual_size = {x=2, y=2},
mesh = "vl_stalker.b3d",
textures = {
{get_texture({}),
"mobs_mc_empty.png"},
},
})
self.object:remove()
end,
})
minetest.register_entity("mobs_mc:creeper_charged", {
on_activate = function(self, staticdata, dtime)
local obj = minetest.add_entity(self.object:get_pos(), "mobs_mc:stalker_overloaded", staticdata)
obj:set_properties({ obj:set_properties({
visual_size = {x=2, y=2}, visual_size = {x=2, y=2},
mesh = "vl_stalker.b3d", mesh = "vl_stalker.b3d",
@ -332,9 +330,12 @@ minetest.register_entity("mobs_mc:creeper_charged", {
AURA}, AURA},
}, },
}) })
self.object:remove()
end, end,
}) }) -- END mcl_mobs.register_mob("mobs_mc:stalker_overloaded", {
-- compat
mcl_mobs.register_conversion("mobs_mc:creeper", "mobs_mc:stalker")
mcl_mobs.register_conversion("mobs_mc:creeper_charged", "mobs_mc:stalker_overloaded")
mcl_mobs:spawn_specific( mcl_mobs:spawn_specific(
"mobs_mc:stalker", "mobs_mc:stalker",

View File

@ -106,11 +106,6 @@ minetest.register_on_mods_loaded(function()
end end
if def.groups.brewitem then if def.groups.brewitem then
local str = name local str = name
if def.groups._mcl_potion == 1 then
local stack = ItemStack(name)
tt.reload_itemstack_description(stack)
str = stack:to_string()
end
table.insert(inventory_lists["brew"], str) table.insert(inventory_lists["brew"], str)
nonmisc = true nonmisc = true
end end
@ -128,14 +123,12 @@ minetest.register_on_mods_loaded(function()
local stack = ItemStack(name) local stack = ItemStack(name)
local potency = def._default_potent_level - 1 local potency = def._default_potent_level - 1
stack:get_meta():set_int("mcl_potions:potion_potent", potency) stack:get_meta():set_int("mcl_potions:potion_potent", potency)
tt.reload_itemstack_description(stack)
table.insert(inventory_lists["brew"], stack:to_string()) table.insert(inventory_lists["brew"], stack:to_string())
end end
if def.has_plus then if def.has_plus then
local stack = ItemStack(name) local stack = ItemStack(name)
local extend = def._default_extend_level local extend = def._default_extend_level
stack:get_meta():set_int("mcl_potions:potion_plus", extend) stack:get_meta():set_int("mcl_potions:potion_plus", extend)
tt.reload_itemstack_description(stack)
table.insert(inventory_lists["brew"], stack:to_string()) table.insert(inventory_lists["brew"], stack:to_string())
end end
end end
@ -144,6 +137,17 @@ minetest.register_on_mods_loaded(function()
end end
end end
-- Itemstack descriptions need to be reloaded separately, because tt invalidates minetest.registered_items iterators, somehow
-- (and pairs() uses said iterators internally)
-- TODO investigate the iterator invalidation, where does it happen?
for name, list in pairs(inventory_lists) do
for i=1, #list do
local stack = ItemStack(list[i])
tt.reload_itemstack_description(stack)
list[i] = stack:to_string()
end
end
for ench, def in pairs(mcl_enchanting.enchantments) do for ench, def in pairs(mcl_enchanting.enchantments) do
local str = "mcl_enchanting:book_enchanted " .. ench .. " " .. def.max_level local str = "mcl_enchanting:book_enchanted " .. ench .. " " .. def.max_level
if def.inv_tool_tab then if def.inv_tool_tab then

View File

@ -84,6 +84,9 @@ local pallete_order = {
pane_magenta_flat = 16, pane_magenta_flat = 16,
pane_magenta = 16 pane_magenta = 16
} }
local EFFECT_CONVERSIONS = {
strenght = "strength"
}
local function get_beacon_beam(glass_nodename) local function get_beacon_beam(glass_nodename)
if glass_nodename == "air" then return 0 end if glass_nodename == "air" then return 0 end
@ -218,7 +221,13 @@ local function apply_effects_to_all_players(pos)
local power_level = beacon_blockcheck(pos) local power_level = beacon_blockcheck(pos)
if effect_level == 2 and power_level < 4 then --no need to run loops when beacon is in an invalid setup :P local new_effect_string = EFFECT_CONVERSIONS[effect_string]
if new_effect_string then
effect_string = new_effect_string
meta:set_string("effect", effect_string)
end
if effect_string == "" or ( effect_level == 2 and power_level < 4 ) then --no need to run loops when beacon is in an invalid setup :P
return return
end end
@ -244,8 +253,7 @@ minetest.register_node("mcl_beacons:beacon", {
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("input", 1) inv:set_size("input", 1)
local form = formspec_string meta:set_string("formspec", formspec_string)
meta:set_string("formspec", form)
end, end,
on_destruct = function(pos) on_destruct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -363,7 +371,6 @@ minetest.register_node("mcl_beacons:beacon", {
node = minetest.get_node({x=pos.x,y=y,z=pos.z}) node = minetest.get_node({x=pos.x,y=y,z=pos.z})
end end
if minetest.get_item_group(node.name, "glass") ~= 0 or minetest.get_item_group(node.name,"material_glass") ~= 0 then if minetest.get_item_group(node.name, "glass") ~= 0 or minetest.get_item_group(node.name,"material_glass") ~= 0 then
beam_palette_index = get_beacon_beam(node.name) beam_palette_index = get_beacon_beam(node.name)
end end
@ -426,6 +433,15 @@ minetest.register_abm{
apply_effects_to_all_players(pos) apply_effects_to_all_players(pos)
end, end,
} }
minetest.register_lbm({
label = "Update beacon formspecs (0.87.1)",
name = "mcl_beacons:update_beacon_formspecs_0_87_1",
nodenames = { "mcl_beacons:beacon" },
action = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", formspec_string)
end
})
minetest.register_craft({ minetest.register_craft({
output = "mcl_beacons:beacon", output = "mcl_beacons:beacon",

View File

@ -340,6 +340,7 @@ local function on_put(pos, listname, index, stack, player)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local str = "" local str = ""
local stack local stack
local oldparam2 = minetest.get_node(pos).param2
for i=1, inv:get_size("stand") do for i=1, inv:get_size("stand") do
stack = inv:get_stack("stand", i) stack = inv:get_stack("stand", i)
if not stack:is_empty() then if not stack:is_empty() then
@ -347,7 +348,7 @@ local function on_put(pos, listname, index, stack, player)
else str = str.."0" else str = str.."0"
end end
end end
minetest.swap_node(pos, {name = "mcl_brewing:stand_"..str}) minetest.swap_node(pos, {name = "mcl_brewing:stand_"..str, param2 = oldparam2})
minetest.get_node_timer(pos):start(1.0) minetest.get_node_timer(pos):start(1.0)
--some code here to enforce only potions getting placed on stands --some code here to enforce only potions getting placed on stands
end end

View File

@ -22,6 +22,7 @@ minetest.register_entity("mcl_end:ender_eye", {
self._phase = 0 self._phase = 0
end end
end end
if not self._luck then self._luck = 0 end
end, end,
on_step = function(self, dtime) on_step = function(self, dtime)

View File

@ -654,7 +654,7 @@ end
minetest.register_alias("mcl_hoppers:hopper_item", "mcl_hoppers:hopper") minetest.register_alias("mcl_hoppers:hopper_item", "mcl_hoppers:hopper")
minetest.register_lbm({ minetest.register_lbm({
label = "Update hopper formspecs (0.60.0", label = "Update hopper formspecs (0.60.0)",
name = "mcl_hoppers:update_formspec_0_60_0", name = "mcl_hoppers:update_formspec_0_60_0",
nodenames = {"group:hopper"}, nodenames = {"group:hopper"},
run_at_every_load = false, run_at_every_load = false,

View File

@ -63,8 +63,8 @@ local function set_doll_properties(doll, mob)
xs = doll_size_overrides[mob].x xs = doll_size_overrides[mob].x
ys = doll_size_overrides[mob].y ys = doll_size_overrides[mob].y
else else
xs = mobinfo.visual_size.x * 0.33333 xs = (mobinfo.visual_size.x or 0) * 0.33333
ys = mobinfo.visual_size.y * 0.33333 ys = (mobinfo.visual_size.y or 0) * 0.33333
end end
local prop = { local prop = {
mesh = mobinfo.mesh, mesh = mobinfo.mesh,
@ -358,6 +358,11 @@ doll_def.on_activate = function(self, staticdata, dtime_s)
if mob == "" or mob == nil then if mob == "" or mob == nil then
mob = default_mob mob = default_mob
end end
-- Handle conversion of mob spawners
local convert_to = (minetest.registered_entities[mob] or {})._convert_to
if convert_to then mob = convert_to end
set_doll_properties(self.object, mob) set_doll_properties(self.object, mob)
self.object:set_velocity({x=0, y=0, z=0}) self.object:set_velocity({x=0, y=0, z=0})
self.object:set_acceleration({x=0, y=0, z=0}) self.object:set_acceleration({x=0, y=0, z=0})
@ -390,3 +395,11 @@ minetest.register_lbm({
respawn_doll(pos) respawn_doll(pos)
end, end,
}) })
minetest.register_on_mods_loaded(function()
for name,mobinfo in pairs(minetest.registered_entities) do
if ( mobinfo.is_mob or name:find("mobs_mc") ) and not ( mobinfo.visual_size or mobinfo._convert_to ) then
minetest.log("warning", "Definition for "..tostring(name).." is missing field 'visual_size', mob spawners will not work properly")
end
end
end)

View File

@ -1091,6 +1091,7 @@ function mcl_potions.update_haste_and_fatigue(player)
if f_fac ~= 1 then meta:set_float("mcl_potions:fatigue", 1 - f_fac) if f_fac ~= 1 then meta:set_float("mcl_potions:fatigue", 1 - f_fac)
else meta:set_string("mcl_potions:fatigue", "") end else meta:set_string("mcl_potions:fatigue", "") end
meta:set_tool_capabilities() meta:set_tool_capabilities()
meta:set_string("groupcaps_hash","")
mcl_enchanting.update_groupcaps(item) mcl_enchanting.update_groupcaps(item)
if h_fac == 0 and f_fac == 1 then if h_fac == 0 and f_fac == 1 then
player:set_wielded_item(item) player:set_wielded_item(item)
@ -1399,6 +1400,7 @@ function mcl_potions._reset_haste_fatigue_item_meta(player)
meta:set_string("mcl_potions:haste", "") meta:set_string("mcl_potions:haste", "")
meta:set_string("mcl_potions:fatigue", "") meta:set_string("mcl_potions:fatigue", "")
meta:set_tool_capabilities() meta:set_tool_capabilities()
meta:set_string("groupcaps_hash","")
mcl_enchanting.update_groupcaps(item) mcl_enchanting.update_groupcaps(item)
end end
end end
@ -1832,6 +1834,10 @@ end
function mcl_potions.give_effect_by_level(name, object, level, duration, no_particles) function mcl_potions.give_effect_by_level(name, object, level, duration, no_particles)
if level == 0 then return false end if level == 0 then return false end
if not registered_effects[name] then
minetest.log("warning", "[mcl_potions] Trying to give unknown effect "..tostring(name))
return false
end
if not registered_effects[name].uses_factor then if not registered_effects[name].uses_factor then
return mcl_potions.give_effect(name, object, 0, duration, no_particles) return mcl_potions.give_effect(name, object, 0, duration, no_particles)
end end

View File

@ -173,8 +173,8 @@ function mcl_potions.register_lingering(name, descr, color, def)
obj:set_velocity({x=dropdir.x*velocity,y=dropdir.y*velocity,z=dropdir.z*velocity}) obj:set_velocity({x=dropdir.x*velocity,y=dropdir.y*velocity,z=dropdir.z*velocity})
obj:set_acceleration({x=dropdir.x*-3, y=-9.8, z=dropdir.z*-3}) obj:set_acceleration({x=dropdir.x*-3, y=-9.8, z=dropdir.z*-3})
local ent = obj:get_luaentity() local ent = obj:get_luaentity()
ent._potency = item:get_meta():get_int("mcl_potions:potion_potent") ent._potency = stack:get_meta():get_int("mcl_potions:potion_potent")
ent._plus = item:get_meta():get_int("mcl_potions:potion_plus") ent._plus = stack:get_meta():get_int("mcl_potions:potion_plus")
ent._effect_list = def._effect_list ent._effect_list = def._effect_list
end end
}) })

View File

@ -65,8 +65,8 @@ function mcl_potions.register_splash(name, descr, color, def)
obj:set_velocity({x=dropdir.x*velocity,y=dropdir.y*velocity,z=dropdir.z*velocity}) obj:set_velocity({x=dropdir.x*velocity,y=dropdir.y*velocity,z=dropdir.z*velocity})
obj:set_acceleration({x=dropdir.x*-3, y=-9.8, z=dropdir.z*-3}) obj:set_acceleration({x=dropdir.x*-3, y=-9.8, z=dropdir.z*-3})
local ent = obj:get_luaentity() local ent = obj:get_luaentity()
ent._potency = item:get_meta():get_int("mcl_potions:potion_potent") ent._potency = stack:get_meta():get_int("mcl_potions:potion_potent")
ent._plus = item:get_meta():get_int("mcl_potions:potion_plus") ent._plus = stack:get_meta():get_int("mcl_potions:potion_plus")
ent._effect_list = def._effect_list ent._effect_list = def._effect_list
end end
}) })

View File

@ -293,7 +293,7 @@ minetest.register_craftitem("mcl_throwing:snowball", {
_doc_items_longdesc = S("Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing."), _doc_items_longdesc = S("Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing."),
_doc_items_usagehelp = how_to_throw, _doc_items_usagehelp = how_to_throw,
inventory_image = "mcl_throwing_snowball.png", inventory_image = "mcl_throwing_snowball.png",
stack_max = 16, stack_max = 64,
groups = { weapon_ranged = 1 }, groups = { weapon_ranged = 1 },
on_use = mcl_throwing.get_player_throw_function("mcl_throwing:snowball_entity"), on_use = mcl_throwing.get_player_throw_function("mcl_throwing:snowball_entity"),
_on_dispense = mcl_throwing.dispense_function, _on_dispense = mcl_throwing.dispense_function,
@ -306,7 +306,7 @@ minetest.register_craftitem("mcl_throwing:egg", {
_doc_items_longdesc = S("Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg."), _doc_items_longdesc = S("Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg."),
_doc_items_usagehelp = how_to_throw, _doc_items_usagehelp = how_to_throw,
inventory_image = "mcl_throwing_egg.png", inventory_image = "mcl_throwing_egg.png",
stack_max = 16, stack_max = 64,
on_use = mcl_throwing.get_player_throw_function("mcl_throwing:egg_entity"), on_use = mcl_throwing.get_player_throw_function("mcl_throwing:egg_entity"),
_on_dispense = mcl_throwing.dispense_function, _on_dispense = mcl_throwing.dispense_function,
groups = { craftitem = 1 }, groups = { craftitem = 1 },

View File

@ -166,3 +166,15 @@ One of our tools, the Python script allowing conversion of Minecraft resource pa
* Ghast fireball related crash by Araca * Ghast fireball related crash by Araca
* Crash related to server restart while a player is dead by teknomunk * Crash related to server restart while a player is dead by teknomunk
* Crashes related to the new effects API - by teknomunk and Herowl * Crashes related to the new effects API - by teknomunk and Herowl
## 0.87.1 hotfix
* Fixed crash when shooting potions from a dispenser - by teknomunk
* Fixed crash related to custom mobspawners - by teknomunk
* Fixed beacon crash - by teknomunk
* Fixed eye of ender crash - by Herowl
* Fixed Stalker texture generation - by teknomunk
* Correctly refresh enchanted tool capabilities - by teknomunk
* Fixed creative inventory misbehaving - by Herowl
* Fixed variable definition in mob spawning code - by teknomunk
* Updated documentation - by Herowl and teknomunk
* Increased stack size for snowballs and eggs - by JoseDouglas26