Compare commits

..

2 Commits

Author SHA1 Message Date
epCode eb39dcf605 Add working system 2024-06-02 15:57:04 -06:00
epCode 70b6636568 EEA first commit 2024-05-28 16:14:50 -06:00
29 changed files with 686 additions and 228 deletions

View File

@ -64,12 +64,9 @@ Use the `/giveme` chat command to obtain them. See the in-game help for
an explanation. an explanation.
## Installation ## Installation
To run the game with the best performance and support, we recommend the latest This game requires [Minetest](http://minetest.net) to run (version 5.4.1 or
stable version of [Minetest](http://minetest.net), be we always make an effort later). So you need to install Minetest first. Only stable versions of Minetest
to support one version behind the latest stable version. In some cases, older are officially supported.
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"
``` ```
7. **Tag and push to the tag:** 5. **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
``` ```
8. Update version in game.conf to the next version with -SNAPSHOT suffix: 6. Update version in game.conf to the next version with -SNAPSHOT suffix:
``` ```
git commit -m "Post-release set version 0.88.0-SNAPSHOT" git commit -m "Post-release set version 0.87.0-SNAPSHOT"
``` ```
9. Push the above to a new branch, and make the release PR. Merge to finalize release process. 7. Push the above to a new branch, and make the release PR. Merge to finalize release process.
### Release via ContentDB ### Release via ContentDB
@ -68,100 +68,46 @@ git commit -m "Post-release set version 0.88.0-SNAPSHOT"
## Hotfix Release ## Hotfix Release
### Before releasing The below is not up-to-date. At the next hotfix the process should be finalized and updated.
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
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. When hotfixing, you should never release new features. Any new code increases risk of new bugs which has additional testing/release concerns.
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**.
### Release process #### Prepare feature branch and fix
1. Update CREDITS.md if it is needed * 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)
2. Update version in game.conf
3. If you've changed CREDITS.md, run the script: `git checkout -b hotfix_bug_1_branch`
```
lua tools/generate_ingame_credits.lua * 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)
4. Make a commit for the above:
``` #### Update version and tag the release
git add game.conf
git commit -m "Set version for hotfix v0.87.1" * 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):
```
or, if credits got updated: * Update version in game.conf to hotfix version and commit it. Example: version=0.82.1
```
git add CREDITS.md * Tag it, push tag and branch:
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 tag 0.82.1
git push origin 0.82.1
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.
### Release via ContentDB Note: If you have to do more than 1 hotfix release, can do it on the same release branch.
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,13 +671,6 @@ 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

@ -149,6 +149,16 @@ function mcl_mobs.register_mob(name, def)
head_yaw = def.head_yaw or "y", -- axis to rotate head on head_yaw = def.head_yaw or "y", -- axis to rotate head on
horizontal_head_height = def.horizontal_head_height or 0, horizontal_head_height = def.horizontal_head_height or 0,
wears_armor = def.wears_armor, -- a number value used to index texture slot for armor wears_armor = def.wears_armor, -- a number value used to index texture slot for armor
-- use: armor_transforms = {arm_right = {"arm_right_bone_name", pos}}
-- or if you need rotation as well: armor_transforms = {arm_right = {"arm_right_bone_name", pos, rot}}
armor_transforms = def.armor_transforms or {
head = {"Head", vector.zero()},
chest = {"Body", vector.zero()},
arm_right = {"Arm_Right", vector.zero()},
arm_left = {"Arm_Left", vector.zero()},
leg_right = {"Leg_Left", vector.zero()},
leg_left = {"Leg_right", vector.zero()}
},
stepheight = def.stepheight or 0.6, stepheight = def.stepheight or 0.6,
name = name, name = name,
description = def.description, description = def.description,
@ -342,17 +352,6 @@ 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

@ -16,9 +16,11 @@ local function get_armor_texture(armor_name)
return "blank.png" return "blank.png"
end end
local seperator = string.find(armor_name, ":") local seperator = string.find(armor_name, ":")
return "mcl_armor_"..string.sub(armor_name, seperator+1, -1)..".png^" return "mcl_armor_"..string.sub(armor_name, seperator+1, -1)..".png"
end end
--[[
-- Old texture function
function mob_class:set_armor_texture() function mob_class:set_armor_texture()
if self.armor_list then if self.armor_list then
local chestplate=minetest.registered_items[self.armor_list.chestplate] or {name=""} local chestplate=minetest.registered_items[self.armor_list.chestplate] or {name=""}
@ -55,6 +57,152 @@ function mob_class:set_armor_texture()
self.object:set_armor_groups(armor_) self.object:set_armor_groups(armor_)
end end
end end
]]
minetest.register_entity("mcl_mobs:armor_piece", {
visual = "mesh",
mesh = "mcl_mobs_armor_head.obj",
textures = {get_armor_texture("mcl_armor:helmet_diamond")},
_kill_on_detach = true,
_armor = true,
pointable = false,
physical = false,
collide_with_objects = false,
collisionbox = {0,0,0,0,0,0},
on_detach = function(self)
if self.object:get_pos() and not self.object:get_attach() and self._kill_on_detach then self.object:remove() return end
end,
on_activate = function(self)
minetest.after(0.2, function() -- if we are disconnected from anything unless made to, self destruct
if self and self.object and self.object:get_pos() then
if self.object:get_pos() and not self.object:get_attach() and self._kill_on_detach then self.object:remove() return end
end
end)
end,
}) -- specific piece selected at spawn
-- Adds a piece of armor (entity) into the worl based on it's name
function mcl_mobs.add_armor_piece(itemname, r_l, pos)
local obj = minetest.add_entity(pos or vector.zero(), "mcl_mobs:armor_piece") -- armor piece
tex = get_armor_texture(itemname) -- texture
local mesh = ""
-- choose correct model based on name
if string.find(itemname, "chestplate") then
if r_l then
if r_l == "r" then
mesh = "mcl_mobs_armor_arm_right.obj"
else
mesh = "mcl_mobs_armor_arm_left.obj"
end
else
mesh = "mcl_mobs_armor_chest.obj"
end
elseif string.find(itemname, "boots") or string.find(itemname, "leggings") then
if r_l then
if r_l == "r" then
mesh = "mcl_mobs_armor_leg_right.obj"
else
mesh = "mcl_mobs_armor_leg_left.obj"
end
end
elseif string.find(itemname, "helmet") then
mesh = "mcl_mobs_armor_head.obj"
end
obj:set_properties({textures = {tex}, mesh = mesh, visual_size = size or vector.new(1,1,1)})
return obj
end
--[[
minetest.register_globalstep(function(dtime)
for _,player in ipairs(minetest.get_connected_players()) do
mcl_mobs.add_armor_piece("mcl_armor:helmet_diamond", nil, player:get_pos())
end
end)]]
--new armor texture function
function mob_class:set_armor_texture()
if self.armor_list then
local chestplate=minetest.registered_items[self.armor_list.chestplate] or {name=""}
local boots=minetest.registered_items[self.armor_list.boots] or {name=""}
local leggings=minetest.registered_items[self.armor_list.leggings] or {name=""}
local helmet=minetest.registered_items[self.armor_list.helmet] or {name=""}
local no_armor
if helmet.name=="" and chestplate.name=="" and leggings.name=="" and boots.name=="" then
no_armor = true
end
for _,obj in ipairs(self.object:get_children()) do --destroy old armor entities
if not obj:is_player() and obj:get_luaentity()._armor then
obj:set_detach()
end
end
local tforms = self.armor_transforms
if chestplate.name ~= "" then
local armor_chest = mcl_mobs.add_armor_piece(chestplate.name, false)
local armor_right = mcl_mobs.add_armor_piece(chestplate.name, "r")
local armor_left = mcl_mobs.add_armor_piece(chestplate.name, "l")
armor_chest:set_properties({visual_size = self.armor_transforms.chest[4] or vector.new(1,1,1)})
armor_right:set_properties({visual_size = self.armor_transforms.arm_right[4] or vector.new(1,1,1)})
armor_left:set_properties({visual_size = self.armor_transforms.arm_left[4] or vector.new(1,1,1)})
armor_chest:set_attach(self.object, self.armor_transforms.chest[1], self.armor_transforms.chest[2], self.armor_transforms.chest[3] or vector.zero())
armor_right:set_attach(self.object, self.armor_transforms.arm_right[1], self.armor_transforms.arm_right[2], self.armor_transforms.arm_right[3] or vector.zero())
armor_left:set_attach(self.object, self.armor_transforms.arm_left[1], self.armor_transforms.arm_left[2], self.armor_transforms.arm_left[3] or vector.zero())
end
if leggings.name ~= "" then
local armor_right = mcl_mobs.add_armor_piece(leggings.name, "r")
local armor_left = mcl_mobs.add_armor_piece(leggings.name, "l")
armor_right:set_properties({visual_size = self.armor_transforms.leg_right[4] or vector.new(1,1,1)})
armor_left:set_properties({visual_size = self.armor_transforms.leg_left[4] or vector.new(1,1,1)})
armor_right:set_attach(self.object, self.armor_transforms.leg_right[1], self.armor_transforms.leg_right[2], self.armor_transforms.leg_right[3] or vector.zero())
armor_left:set_attach(self.object, self.armor_transforms.leg_left[1], self.armor_transforms.leg_left[2], self.armor_transforms.leg_left[3] or vector.zero())
end
if boots.name ~= "" then
local armor_right = mcl_mobs.add_armor_piece(boots.name, "r")
local armor_left = mcl_mobs.add_armor_piece(boots.name, "l")
armor_right:set_properties({visual_size = self.armor_transforms.leg_right[4] or vector.new(1,1,1)})
armor_left:set_properties({visual_size = self.armor_transforms.leg_left[4] or vector.new(1,1,1)})
armor_right:set_attach(self.object, self.armor_transforms.leg_right[1], self.armor_transforms.leg_right[2], self.armor_transforms.leg_right[3] or vector.zero())
armor_left:set_attach(self.object, self.armor_transforms.leg_left[1], self.armor_transforms.leg_left[2], self.armor_transforms.leg_left[3] or vector.zero())
end
if helmet.name ~= "" then
local armor_right = mcl_mobs.add_armor_piece(helmet.name, "r")
armor_right:set_properties({visual_size = self.armor_transforms.head[4] or vector.new(1,1,1)})
armor_right:set_attach(self.object, self.armor_transforms.head[1], self.armor_transforms.head[2], self.armor_transforms.head[3] or vector.zero())
end
local armor_
if type(self.armor) == "table" then
armor_ = table.copy(self.armor)
armor_.immortal = 1
else
armor_ = {immortal=1, fleshy = self.armor}
end
for _,item in pairs(self.armor_list) do
if not item then return end
if type(minetest.get_item_group(item, "mcl_armor_points")) == "number" then
armor_.fleshy=armor_.fleshy-(minetest.get_item_group(item, "mcl_armor_points")*3.5)
end
end
self.object:set_armor_groups(armor_)
end
end
function mob_class:check_item_pickup() function mob_class:check_item_pickup()
if self.pick_up and #self.pick_up > 0 or self.wears_armor then if self.pick_up and #self.pick_up > 0 or self.wears_armor then

View File

@ -0,0 +1,37 @@
# Blender 4.0.2
# www.blender.org
o arm_left
v 1.248355 7.302495 1.300000
v -1.251645 0.002496 1.300000
v -1.251645 7.302495 -1.300000
v -1.251645 0.002496 -1.300000
v 1.248355 0.002496 -1.300000
v 1.248355 7.302495 -1.300000
v 1.248355 0.002496 1.300000
v -1.251645 7.302495 1.300000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vt 0.750000 0.375000
vt 0.812500 0.375000
vt 0.812500 0.500000
vt 0.750000 0.500000
vt 0.687500 0.375000
vt 0.687500 0.500000
vt 0.687500 0.000000
vt 0.625000 0.000000
vt 0.625000 0.375000
vt 0.750000 0.000000
vt 0.812500 0.000000
vt 0.875000 0.000000
vt 0.875000 0.375000
s 0
f 6/1/1 3/2/1 8/3/1 1/4/1
f 4/5/2 5/1/2 7/4/2 2/6/2
f 2/5/3 8/7/3 3/8/3 4/9/3
f 4/5/4 3/7/4 6/10/4 5/1/4
f 5/1/5 6/10/5 1/11/5 7/2/5
f 7/2/6 1/11/6 8/12/6 2/13/6

View File

@ -0,0 +1,37 @@
# Blender 4.0.2
# www.blender.org
o arm_right
v 1.249876 0.007618 -1.300000
v -1.250124 7.307617 -1.300000
v 1.249876 7.307617 -1.300000
v -1.250124 0.007618 1.300000
v -1.250124 7.307617 1.300000
v -1.250124 0.007618 -1.300000
v 1.249876 7.307617 1.300000
v 1.249876 0.007618 1.300000
vn -0.0000 -0.0000 1.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vt 0.812500 0.375000
vt 0.875000 0.375000
vt 0.875000 0.000000
vt 0.812500 0.000000
vt 0.750000 0.375000
vt 0.750000 0.000000
vt 0.687500 0.375000
vt 0.687500 0.000000
vt 0.625000 0.375000
vt 0.625000 0.000000
vt 0.687500 0.500000
vt 0.750000 0.500000
vt 0.812500 0.500000
s 0
f 4/1/1 8/2/1 7/3/1 5/4/1
f 6/5/2 4/1/2 5/4/2 2/6/2
f 1/7/3 6/5/3 2/6/3 3/8/3
f 8/7/4 1/9/4 3/10/4 7/8/4
f 1/7/5 8/11/5 4/12/5 6/5/5
f 2/5/6 5/12/6 7/13/6 3/1/6

View File

@ -0,0 +1,152 @@
# Blender 4.0.2
# www.blender.org
o chest
v 2.200000 -0.001495 1.200000
v 2.200000 -0.001495 -1.200000
v 2.200000 7.098505 -1.200000
v -2.200000 7.098505 -1.200000
v -2.200000 7.098505 1.200000
v 2.200000 7.098505 1.200000
v -2.200000 -0.001495 -1.200000
v -2.200000 -0.001495 1.200000
v -4.168111 7.701634 1.681621
v 1.741822 -7.664789 4.169018
v 1.718504 -7.797035 3.407457
v -6.641035 -6.323022 3.407457
v 4.191429 6.227620 1.681621
v -6.617718 -6.190779 4.169018
v 4.168111 6.095374 0.920061
v -4.191429 7.569388 0.920061
v -4.191429 6.227621 1.681620
v 6.617716 -6.190779 4.169018
v 6.641035 -6.323024 3.407457
v -1.718504 -7.797033 3.407457
v 4.168111 7.701632 1.681621
v -1.741822 -7.664789 4.169018
v 4.191429 7.569387 0.920061
v -4.168111 6.095377 0.920061
v 2.190794 0.007711 1.190794
v 2.190794 0.007711 -1.190793
v 2.190794 7.089298 -1.190794
v -2.190794 7.089298 -1.190794
v -2.190794 7.089298 1.190793
v 2.190794 7.089298 1.190793
v -2.190794 0.007711 -1.190793
v -2.190794 0.007711 1.190794
v -4.160896 7.689532 1.674153
v 1.734052 -7.655836 4.158352
v 1.711289 -7.784933 3.414925
v -6.630116 -6.314117 3.414925
v 4.180511 6.218716 1.674153
v -6.607354 -6.185023 4.158352
v 4.157747 6.089618 0.930726
v -4.183659 7.560435 0.930726
v -4.180511 6.218717 1.674152
v 6.607353 -6.185023 4.158352
v 6.630116 -6.314119 3.414925
v -1.711289 -7.784931 3.414925
v 4.160896 7.689529 1.674153
v -1.734053 -7.655836 4.158352
v 4.183659 7.560434 0.930727
v -4.157747 6.089621 0.930726
vn 1.0000 -0.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn 0.0302 0.1710 0.9848
vn -0.0302 -0.1710 -0.9848
vn 0.1710 0.9698 -0.1737
vn 0.9848 -0.1736 -0.0000
vn -0.9848 0.1736 -0.0000
vn -0.1710 -0.9698 0.1736
vn -0.0302 0.1710 0.9848
vn 0.0302 -0.1710 -0.9848
vn -0.1710 0.9698 -0.1736
vn 0.9848 0.1736 -0.0000
vn -0.9848 -0.1736 -0.0000
vn 0.1710 -0.9698 0.1736
vn -0.1710 -0.9698 0.1737
vn 0.1710 0.9698 -0.1736
vt 0.250000 0.375000
vt 0.250000 0.000000
vt 0.312500 0.000000
vt 0.312500 0.375000
vt 0.312500 0.500000
vt 0.437500 0.375000
vt 0.437500 0.500000
vt 0.562500 0.375000
vt 0.562500 0.500000
vt 0.437500 0.000000
vt 0.500000 0.000000
vt 0.500000 0.375000
vt 0.625000 0.375000
vt 0.625000 0.000000
vt 0.032859 0.558649
vt 0.032859 0.998468
vt 0.362724 0.998468
vt 0.362724 0.558649
vt 0.039157 0.992309
vt 0.039157 0.656118
vt 0.060169 0.656118
vt 0.060169 0.992309
vt -0.003415 0.501261
vt 0.368238 0.501261
vt 0.368238 0.563203
vt -0.003415 0.563203
vt 0.368238 0.996797
vt -0.003415 0.996797
vt -0.003415 0.934855
vt 0.368238 0.934855
vt 0.394691 0.498800
vt 0.394691 0.994336
vt 0.363720 0.994336
vt 0.363720 0.498800
vt 0.032859 0.558649
vt 0.362724 0.558649
vt 0.368238 0.934855
vt -0.003415 0.934855
vt 0.368238 0.501261
vt -0.003415 0.501261
vt -0.003415 0.563203
vt 0.368238 0.563203
vt 0.394691 0.498800
vt 0.363720 0.498800
s 0
f 6/1/1 1/2/1 2/3/1 3/4/1
f 6/5/2 3/4/2 4/6/2 5/7/2
f 8/7/3 7/6/3 2/8/3 1/9/3
f 4/6/4 3/4/4 2/3/4 7/10/4
f 7/10/5 8/11/5 5/12/5 4/6/5
f 6/13/6 5/12/6 8/11/6 1/14/6
f 13/15/7 9/16/7 14/17/7 10/18/7
f 15/15/8 11/18/8 12/17/8 16/16/8
f 9/19/9 13/20/9 15/21/9 16/22/9
f 13/23/10 10/24/10 11/25/10 15/26/10
f 14/27/11 9/28/11 16/29/11 12/30/11
f 10/31/12 14/32/12 12/33/12 11/34/12
f 21/16/13 17/35/13 22/36/13 18/17/13
f 23/16/14 19/17/14 20/36/14 24/35/14
f 17/20/15 21/19/15 23/22/15 24/21/15
f 21/28/16 18/27/16 19/37/16 23/38/16
f 22/39/17 17/40/17 24/41/17 20/42/17
f 18/32/18 22/43/18 20/44/18 19/33/18
f 30/1/5 27/4/5 26/3/5 25/2/5
f 30/5/3 29/7/3 28/6/3 27/4/3
f 32/7/2 25/9/2 26/8/2 31/6/2
f 28/6/6 31/10/6 26/3/6 27/4/6
f 31/10/1 28/6/1 29/12/1 32/11/1
f 30/13/4 25/14/4 32/11/4 29/12/4
f 37/15/8 34/18/8 38/17/8 33/16/8
f 39/15/7 40/16/7 36/17/7 35/18/7
f 33/19/19 40/22/19 39/21/19 37/20/19
f 37/23/11 39/26/11 35/25/11 34/24/11
f 38/27/10 36/30/10 40/29/10 33/28/10
f 34/31/20 35/34/20 36/33/20 38/32/20
f 45/16/14 42/17/14 46/36/14 41/35/14
f 47/16/13 48/35/13 44/36/13 43/17/13
f 41/20/18 48/21/18 47/22/18 45/19/18
f 45/28/17 47/38/17 43/37/17 42/27/17
f 46/39/16 44/42/16 48/41/16 41/40/16
f 42/32/15 43/33/15 44/44/15 46/43/15

View File

@ -0,0 +1,51 @@
# Blender 4.0.2
# www.blender.org
o head
v 2.300000 -0.000170 -2.300000
v 2.300000 4.599828 2.299999
v -2.300000 4.599828 2.299999
v 2.300000 -0.000170 2.300000
v -2.300000 4.599828 -2.300000
v 2.300000 4.599828 -2.300000
v -2.300000 -0.000170 -2.300000
v -2.300000 -0.000170 2.300000
v 2.286139 0.013690 -2.286139
v 2.286139 4.585968 2.286139
v -2.286139 4.585968 2.286139
v 2.286139 0.013690 2.286139
v -2.286139 4.585968 -2.286140
v 2.286139 4.585968 -2.286140
v -2.286139 0.013690 -2.286139
v -2.286139 0.013690 2.286139
vn 1.0000 -0.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vt 0.500000 0.750000
vt 0.500000 0.500000
vt 0.625000 0.500000
vt 0.625000 0.750000
vt 0.750000 0.750000
vt 0.750000 1.000000
vt 0.625000 1.000000
vt 0.875000 0.750000
vt 0.875000 1.000000
vt 0.750000 0.500000
vt 0.875000 0.500000
vt 1.000000 0.750000
vt 1.000000 0.500000
s 0
f 2/1/1 4/2/1 1/3/1 6/4/1
f 5/5/2 3/6/2 2/7/2 6/4/2
f 1/8/3 4/9/3 8/6/3 7/5/3
f 5/5/4 6/4/4 1/3/4 7/10/4
f 3/8/5 5/5/5 7/10/5 8/11/5
f 2/12/6 3/8/6 8/11/6 4/13/6
f 10/1/5 14/4/5 9/3/5 12/2/5
f 13/5/3 14/4/3 10/7/3 11/6/3
f 9/8/2 15/5/2 16/6/2 12/9/2
f 13/5/6 15/10/6 9/3/6 14/4/6
f 11/8/1 16/11/1 15/10/1 13/5/1
f 10/12/4 12/13/4 16/11/4 11/8/4

View File

@ -0,0 +1,64 @@
# Blender 4.0.2
# www.blender.org
o leg_left
v -1.200000 7.000000 -1.300000
v 1.200000 -0.000000 1.300001
v 1.200000 -0.000000 -1.299999
v -1.200000 -0.000000 -1.299999
v 1.400000 -0.099999 1.500001
v -1.200000 7.000000 1.300000
v -1.400000 3.475000 -1.500000
v 1.400000 3.475000 -1.500000
v -1.400000 3.475000 1.500000
v 1.200000 7.000000 1.300000
v 1.400000 -0.100001 -1.499999
v 1.400000 3.475000 1.500000
v 1.200000 7.000000 -1.300000
v -1.400000 -0.099999 1.500001
v -1.200000 -0.000000 1.300001
v -1.400000 -0.100001 -1.499999
vn -0.0000 1.0000 -0.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn -0.0000 -0.0000 1.0000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vt 0.125000 0.375000
vt 0.125000 0.500000
vt 0.062500 0.500000
vt 0.062500 0.375000
vt 0.187500 0.375000
vt 0.125000 0.000000
vt 0.187500 0.000000
vt 0.062500 0.000000
vt 0.250000 0.375000
vt 0.250000 0.000000
vt 0.000000 0.375000
vt 0.000000 0.000000
vt 0.187500 0.500000
vt 0.390625 0.839844
vt 0.390625 0.871094
vt 0.375000 0.871094
vt 0.375000 0.839844
vt 0.343750 0.839844
vt 0.359375 0.839844
vt 0.359375 0.785156
vt 0.343750 0.785156
vt 0.406250 0.839844
vt 0.390625 0.785156
vt 0.406250 0.785156
vt 0.375000 0.785156
vt 0.359375 0.871094
s 0
f 1/1/1 6/2/1 10/3/1 13/4/1
f 13/5/2 10/1/2 2/6/2 3/7/2
f 1/1/3 13/4/3 3/8/3 4/6/3
f 10/9/4 6/5/4 15/7/4 2/10/4
f 6/11/5 1/4/5 4/8/5 15/12/5
f 3/5/6 2/13/6 15/2/6 4/1/6
f 11/14/6 5/15/6 14/16/6 16/17/6
f 9/18/5 7/19/5 16/20/5 14/21/5
f 12/22/4 9/14/4 14/23/4 5/24/4
f 7/17/3 8/19/3 11/20/3 16/25/3
f 8/14/2 12/17/2 5/25/2 11/23/2
f 7/17/1 9/16/1 12/26/1 8/19/1

View File

@ -0,0 +1,64 @@
# Blender 4.0.2
# www.blender.org
o leg_right
v 1.200000 7.000000 -1.300000
v -1.200000 7.000000 1.300000
v 1.200000 -0.000000 -1.299999
v -1.200000 -0.000000 1.300001
v 1.400000 3.475000 -1.500000
v 1.400000 -0.099999 1.500001
v -1.400000 -0.099999 1.500001
v -1.200000 -0.000000 -1.299999
v -1.200000 7.000000 -1.300000
v -1.400000 3.475000 1.500000
v 1.400000 3.475000 1.500000
v -1.400000 3.475000 -1.500000
v -1.400000 -0.100001 -1.499999
v 1.200000 -0.000000 1.300001
v 1.400000 -0.100001 -1.499999
v 1.200000 7.000000 1.300000
vn -0.0000 1.0000 -0.0000
vn -0.0000 -1.0000 -0.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 -0.0000 -1.0000
vn -1.0000 -0.0000 -0.0000
vt 0.125000 0.375000
vt 0.062500 0.375000
vt 0.062500 0.500000
vt 0.125000 0.500000
vt 0.187500 0.375000
vt 0.187500 0.500000
vt 0.000000 0.375000
vt 0.000000 0.000000
vt 0.062500 0.000000
vt 0.250000 0.375000
vt 0.250000 0.000000
vt 0.187500 0.000000
vt 0.125000 0.000000
vt 0.390625 0.839844
vt 0.390625 0.785156
vt 0.375000 0.785156
vt 0.375000 0.839844
vt 0.359375 0.785156
vt 0.359375 0.839844
vt 0.406250 0.839844
vt 0.406250 0.785156
vt 0.343750 0.839844
vt 0.343750 0.785156
vt 0.375000 0.871094
vt 0.390625 0.871094
vt 0.359375 0.871094
s 0
f 1/1/1 9/2/1 2/3/1 16/4/1
f 8/5/2 3/1/2 14/4/2 4/6/2
f 16/7/3 14/8/3 3/9/3 1/2/3
f 2/10/4 4/11/4 14/12/4 16/5/4
f 1/1/5 3/13/5 8/9/5 9/2/5
f 9/5/6 8/12/6 4/13/6 2/1/6
f 12/14/6 13/15/6 7/16/6 10/17/6
f 5/17/5 15/16/5 13/18/5 12/19/5
f 10/20/4 7/21/4 6/15/4 11/14/4
f 11/22/3 6/23/3 15/18/3 5/19/3
f 13/14/2 15/17/2 6/24/2 7/25/2
f 5/17/1 12/19/1 10/26/1 11/24/1

View File

@ -201,6 +201,8 @@ end
function mob_class:set_velocity(v) function mob_class:set_velocity(v)
if not v then return end if not v then return end
v = 0
local c_x, c_y = 0, 0 local c_x, c_y = 0, 0
-- can mob be pushed, if so calculate direction -- can mob be pushed, if so calculate direction
@ -311,6 +313,8 @@ end
function mob_class:set_yaw(yaw, delay, dtime) function mob_class:set_yaw(yaw, delay, dtime)
if self.noyaw then return end if self.noyaw then return end
yaw = 0
if not self.object:get_yaw() or not self.object:get_pos() then return end if not self.object:get_yaw() or not self.object:get_pos() then return end
if self.state ~= PATHFINDING then if self.state ~= PATHFINDING then

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)
local distance = x * (MOB_SPAWN_ZONE_OUTER - MOB_SPAWN_ZONE_INNER) + MOB_SPAWN_ZONE_INNER 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,17 +491,20 @@ 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},
}) })
end self.object:remove()
}) -- END mcl_mobs.register_mob("mobs_mc:rover", { end,
})
-- 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

@ -96,6 +96,15 @@ local skeleton = {
die_speed = 15, die_speed = 15,
die_loop = false, die_loop = false,
}, },
wears_armor = 1,
armor_transforms = { -- scaled down armor becuase of the scaled up skeleton model
head = {"head", vector.new(0,-0.2,0), vector.new(0,180,0), vector.new(0.44,0.44,0.44)},
chest = {"body", vector.new(0,-0.5,0), vector.new(0,180,0), vector.new(0.44,0.44,0.44)},
arm_right = {"arm.right", vector.new(0,-0.5,0), vector.new(0,180,0), vector.new(0.33,0.33,0.33)},
arm_left = {"arm.left", vector.new(0,-0.5,0), vector.new(0,180,0), vector.new(0.33,0.33,0.33)},
leg_right = {"leg.right", vector.zero(), vector.new(0,180,0), vector.new(0.33,0.33,0.33)},
leg_left = {"leg.left", vector.zero(), vector.new(0,180,0), vector.new(0.33,0.33,0.33)}
},
on_spawn = function(self) on_spawn = function(self)
if math.random(100) == 1 then if math.random(100) == 1 then
self:jock_to("mobs_mc:spider", vector.zero(), vector.zero()) self:jock_to("mobs_mc:spider", vector.zero(), vector.zero())

View File

@ -35,8 +35,7 @@ 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 = texture:gsub("([\\^:\\[])","\\%1") -- escape texture modifiers texture = "([combine:16x24:0,0=" .. texture .. ":0,16=" .. texture .. texture_suff
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
@ -132,11 +131,7 @@ 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
local new_texture = get_texture(self) self.object:set_properties({textures={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
@ -180,18 +175,7 @@ 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"),
@ -320,8 +304,26 @@ 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,
})
_on_after_convert = function(obj) -- compat
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",
@ -330,12 +332,9 @@ mcl_mobs.register_mob("mobs_mc:stalker_overloaded", {
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

@ -60,6 +60,14 @@ local zombie = {
head_pitch_multiplier=-1, head_pitch_multiplier=-1,
breath_max = -1, breath_max = -1,
wears_armor = 1, wears_armor = 1,
armor_transforms = {
head = {"head", vector.zero()},
chest = {"body", vector.zero()},
arm_right = {"arm.right", vector.new(0,-0.9,0)},
arm_left = {"arm.left", vector.new(0,-0.9,0)},
leg_right = {"leg.right", vector.zero()},
leg_left = {"leg.left", vector.zero()}
},
armor = {undead = 90, fleshy = 90}, armor = {undead = 90, fleshy = 90},
collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.8, 0.3}, collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.8, 0.3},
visual = "mesh", visual = "mesh",

View File

@ -106,6 +106,11 @@ 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
@ -123,12 +128,14 @@ 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
@ -137,17 +144,6 @@ 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,9 +84,6 @@ 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
@ -162,7 +159,7 @@ local function remove_beacon_beam(pos)
minetest.get_voxel_manip():read_from_map({x=pos.x,y=y,z=pos.z}, {x=pos.x,y=y,z=pos.z}) minetest.get_voxel_manip():read_from_map({x=pos.x,y=y,z=pos.z}, {x=pos.x,y=y,z=pos.z})
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 node.name == "mcl_beacons:beacon_beam" then if node.name == "mcl_beacons:beacon_beam" then
minetest.remove_node({x=pos.x,y=y,z=pos.z}) minetest.remove_node({x=pos.x,y=y,z=pos.z})
end end
@ -215,30 +212,24 @@ local function effect_player(effect,pos,power_level, effect_level,player)
end end
local function apply_effects_to_all_players(pos) local function apply_effects_to_all_players(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local effect_string = meta:get_string("effect") local effect_string = meta:get_string("effect")
local effect_level = meta:get_int("effect_level") local effect_level = meta:get_int("effect_level")
local power_level = beacon_blockcheck(pos) local power_level = beacon_blockcheck(pos)
local new_effect_string = EFFECT_CONVERSIONS[effect_string] if effect_level == 2 and power_level < 4 then --no need to run loops when beacon is in an invalid setup :P
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
local beacon_distance = (power_level + 1) * 10 local beacon_distance = (power_level + 1) * 10
for _, player in pairs(minetest.get_connected_players()) do for _, player in pairs(minetest.get_connected_players()) do
if vector.distance(pos, player:get_pos()) <= beacon_distance then if vector.distance(pos, player:get_pos()) <= beacon_distance then
if not clear_obstructed_beam(pos) then if not clear_obstructed_beam(pos) then
effect_player(effect_string, pos, power_level, effect_level, player) effect_player(effect_string, pos, power_level, effect_level, player)
end end
end end
end end
end end
@ -253,7 +244,8 @@ 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)
meta:set_string("formspec", formspec_string) local form = 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)
@ -279,7 +271,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()
local input = inv:get_stack("input",1) local input = inv:get_stack("input",1)
if input:is_empty() then if input:is_empty() then
return return
end end
@ -361,7 +353,7 @@ minetest.register_node("mcl_beacons:beacon", {
awards.unlock(sender:get_player_name(),"mcl:beacon") awards.unlock(sender:get_player_name(),"mcl:beacon")
input:take_item() input:take_item()
inv:set_stack("input",1,input) inv:set_stack("input",1,input)
local beam_palette_index = 0 local beam_palette_index = 0
remove_beacon_beam(pos) remove_beacon_beam(pos)
for y = pos.y +1, pos.y + 201 do for y = pos.y +1, pos.y + 201 do
@ -370,6 +362,7 @@ minetest.register_node("mcl_beacons:beacon", {
minetest.get_voxel_manip():read_from_map({x=pos.x,y=y,z=pos.z}, {x=pos.x,y=y,z=pos.z}) minetest.get_voxel_manip():read_from_map({x=pos.x,y=y,z=pos.z}, {x=pos.x,y=y,z=pos.z})
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)
@ -433,19 +426,10 @@ 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",
recipe = { recipe = {
{"mcl_core:glass", "mcl_core:glass", "mcl_core:glass"}, {"mcl_core:glass", "mcl_core:glass", "mcl_core:glass"},
{"mcl_core:glass", "mcl_mobitems:nether_star", "mcl_core:glass"}, {"mcl_core:glass", "mcl_mobitems:nether_star", "mcl_core:glass"},
{"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"} {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}

View File

@ -340,7 +340,6 @@ 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
@ -348,7 +347,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, param2 = oldparam2}) minetest.swap_node(pos, {name = "mcl_brewing:stand_"..str})
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,7 +22,6 @@ 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 or 0) * 0.33333 xs = mobinfo.visual_size.x * 0.33333
ys = (mobinfo.visual_size.y or 0) * 0.33333 ys = mobinfo.visual_size.y * 0.33333
end end
local prop = { local prop = {
mesh = mobinfo.mesh, mesh = mobinfo.mesh,
@ -358,11 +358,6 @@ 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})
@ -395,11 +390,3 @@ 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,7 +1091,6 @@ 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)
@ -1400,7 +1399,6 @@ 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
@ -1834,10 +1832,6 @@ 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 = stack:get_meta():get_int("mcl_potions:potion_potent") ent._potency = item:get_meta():get_int("mcl_potions:potion_potent")
ent._plus = stack:get_meta():get_int("mcl_potions:potion_plus") ent._plus = item: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 = stack:get_meta():get_int("mcl_potions:potion_potent") ent._potency = item:get_meta():get_int("mcl_potions:potion_potent")
ent._plus = stack:get_meta():get_int("mcl_potions:potion_plus") ent._plus = item: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 = 64, stack_max = 16,
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 = 64, stack_max = 16,
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,15 +166,3 @@ 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