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.
## Installation
To run the game with the best performance and support, we recommend the latest
stable version of [Minetest](http://minetest.net), be we always make an effort
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.
This game requires [Minetest](http://minetest.net) to run (version 5.4.1 or
later). So you need to install Minetest first. Only stable versions of Minetest
are officially supported.
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

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 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 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
@ -68,100 +68,46 @@ git commit -m "Post-release set version 0.88.0-SNAPSHOT"
## Hotfix Release
### 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.
The below is not up-to-date. At the next hotfix the process should be finalized and updated.
### 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 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
2. Update version in game.conf
3. If you've changed CREDITS.md, run the script:
```
lua tools/generate_ingame_credits.lua
```
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
* 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:
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
```
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_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
--------------------------

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
horizontal_head_height = def.horizontal_head_height or 0,
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,
name = name,
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))
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)
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"
end
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
--[[
-- Old texture function
function mob_class:set_armor_texture()
if self.armor_list then
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_)
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()
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)
if not v then return end
v = 0
local c_x, c_y = 0, 0
-- can mob be pushed, if so calculate direction
@ -311,6 +313,8 @@ end
function mob_class:set_yaw(yaw, delay, dtime)
if self.noyaw then return end
yaw = 0
if not self.object:get_yaw() or not self.object:get_pos() then return end
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.
local fx = (math_random(1,10000)-1) / 10000
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))
-- 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,
fear_height = 4,
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({
mesh = "vl_rover.b3d",
textures = { "vl_mobs_rover.png^vl_mobs_rover_face.png" },
visual_size = {x=10, y=10},
})
end
}) -- END mcl_mobs.register_mob("mobs_mc:rover", {
-- compat
mcl_mobs.register_conversion("mobs_mc:enderman", "mobs_mc:rover")
self.object:remove()
end,
})
-- End spawn
mcl_mobs:spawn_specific(

View File

@ -96,6 +96,15 @@ local skeleton = {
die_speed = 15,
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)
if math.random(100) == 1 then
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
texture = "vl_stalker_default.png"
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
texture = texture .. ")^vl_mobs_stalker_overlay_angry.png"
else
@ -132,11 +131,7 @@ mcl_mobs.register_mob("mobs_mc:stalker", {
self:boom(mcl_util.get_object_center(self.object), self.explosion_strength)
end
end
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
self.object:set_properties({textures={get_texture(self)}})
end,
on_die = function(self, pos, cmi_cause)
-- Drop a random music disc when killed by skeleton or stray
@ -180,18 +175,7 @@ mcl_mobs.register_mob("mobs_mc:stalker", {
floats = 1,
fear_height = 4,
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", {
description = S("Overloaded Stalker"),
@ -320,8 +304,26 @@ mcl_mobs.register_mob("mobs_mc:stalker_overloaded", {
--Having trouble when fire is placed with lightning
fire_resistant = true,
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({
visual_size = {x=2, y=2},
mesh = "vl_stalker.b3d",
@ -330,12 +332,9 @@ mcl_mobs.register_mob("mobs_mc:stalker_overloaded", {
AURA},
},
})
self.object:remove()
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(
"mobs_mc:stalker",

View File

@ -60,6 +60,14 @@ local zombie = {
head_pitch_multiplier=-1,
breath_max = -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},
collisionbox = {-0.3, -0.01, -0.3, 0.3, 1.8, 0.3},
visual = "mesh",

View File

@ -106,6 +106,11 @@ minetest.register_on_mods_loaded(function()
end
if def.groups.brewitem then
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)
nonmisc = true
end
@ -123,12 +128,14 @@ minetest.register_on_mods_loaded(function()
local stack = ItemStack(name)
local potency = def._default_potent_level - 1
stack:get_meta():set_int("mcl_potions:potion_potent", potency)
tt.reload_itemstack_description(stack)
table.insert(inventory_lists["brew"], stack:to_string())
end
if def.has_plus then
local stack = ItemStack(name)
local extend = def._default_extend_level
stack:get_meta():set_int("mcl_potions:potion_plus", extend)
tt.reload_itemstack_description(stack)
table.insert(inventory_lists["brew"], stack:to_string())
end
end
@ -137,17 +144,6 @@ minetest.register_on_mods_loaded(function()
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
local str = "mcl_enchanting:book_enchanted " .. ench .. " " .. def.max_level
if def.inv_tool_tab then

View File

@ -84,9 +84,6 @@ local pallete_order = {
pane_magenta_flat = 16,
pane_magenta = 16
}
local EFFECT_CONVERSIONS = {
strenght = "strength"
}
local function get_beacon_beam(glass_nodename)
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})
node = minetest.get_node({x=pos.x,y=y,z=pos.z})
end
if node.name == "mcl_beacons:beacon_beam" then
minetest.remove_node({x=pos.x,y=y,z=pos.z})
end
@ -215,30 +212,24 @@ local function effect_player(effect,pos,power_level, effect_level,player)
end
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_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 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
if effect_level == 2 and power_level < 4 then --no need to run loops when beacon is in an invalid setup :P
return
end
local beacon_distance = (power_level + 1) * 10
local beacon_distance = (power_level + 1) * 10
for _, player in pairs(minetest.get_connected_players()) do
if vector.distance(pos, player:get_pos()) <= beacon_distance then
if not clear_obstructed_beam(pos) then
effect_player(effect_string, pos, power_level, effect_level, player)
end
end
if vector.distance(pos, player:get_pos()) <= beacon_distance then
if not clear_obstructed_beam(pos) then
effect_player(effect_string, pos, power_level, effect_level, player)
end
end
end
end
@ -253,7 +244,8 @@ minetest.register_node("mcl_beacons:beacon", {
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("input", 1)
meta:set_string("formspec", formspec_string)
local form = formspec_string
meta:set_string("formspec", form)
end,
on_destruct = function(pos)
local meta = minetest.get_meta(pos)
@ -279,7 +271,7 @@ minetest.register_node("mcl_beacons:beacon", {
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local input = inv:get_stack("input",1)
if input:is_empty() then
return
end
@ -361,7 +353,7 @@ minetest.register_node("mcl_beacons:beacon", {
awards.unlock(sender:get_player_name(),"mcl:beacon")
input:take_item()
inv:set_stack("input",1,input)
local beam_palette_index = 0
remove_beacon_beam(pos)
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})
node = minetest.get_node({x=pos.x,y=y,z=pos.z})
end
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)
@ -433,19 +426,10 @@ minetest.register_abm{
apply_effects_to_all_players(pos)
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({
output = "mcl_beacons:beacon",
recipe = {
recipe = {
{"mcl_core:glass", "mcl_core:glass", "mcl_core:glass"},
{"mcl_core:glass", "mcl_mobitems:nether_star", "mcl_core:glass"},
{"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 str = ""
local stack
local oldparam2 = minetest.get_node(pos).param2
for i=1, inv:get_size("stand") do
stack = inv:get_stack("stand", i)
if not stack:is_empty() then
@ -348,7 +347,7 @@ local function on_put(pos, listname, index, stack, player)
else str = str.."0"
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)
--some code here to enforce only potions getting placed on stands
end

View File

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

View File

@ -654,7 +654,7 @@ end
minetest.register_alias("mcl_hoppers:hopper_item", "mcl_hoppers:hopper")
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",
nodenames = {"group:hopper"},
run_at_every_load = false,

View File

@ -63,8 +63,8 @@ local function set_doll_properties(doll, mob)
xs = doll_size_overrides[mob].x
ys = doll_size_overrides[mob].y
else
xs = (mobinfo.visual_size.x or 0) * 0.33333
ys = (mobinfo.visual_size.y or 0) * 0.33333
xs = mobinfo.visual_size.x * 0.33333
ys = mobinfo.visual_size.y * 0.33333
end
local prop = {
mesh = mobinfo.mesh,
@ -358,11 +358,6 @@ doll_def.on_activate = function(self, staticdata, dtime_s)
if mob == "" or mob == nil then
mob = default_mob
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)
self.object:set_velocity({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)
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)
else meta:set_string("mcl_potions:fatigue", "") end
meta:set_tool_capabilities()
meta:set_string("groupcaps_hash","")
mcl_enchanting.update_groupcaps(item)
if h_fac == 0 and f_fac == 1 then
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:fatigue", "")
meta:set_tool_capabilities()
meta:set_string("groupcaps_hash","")
mcl_enchanting.update_groupcaps(item)
end
end
@ -1834,10 +1832,6 @@ end
function mcl_potions.give_effect_by_level(name, object, level, duration, no_particles)
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
return mcl_potions.give_effect(name, object, 0, duration, no_particles)
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_acceleration({x=dropdir.x*-3, y=-9.8, z=dropdir.z*-3})
local ent = obj:get_luaentity()
ent._potency = stack:get_meta():get_int("mcl_potions:potion_potent")
ent._plus = stack:get_meta():get_int("mcl_potions:potion_plus")
ent._potency = item:get_meta():get_int("mcl_potions:potion_potent")
ent._plus = item:get_meta():get_int("mcl_potions:potion_plus")
ent._effect_list = def._effect_list
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_acceleration({x=dropdir.x*-3, y=-9.8, z=dropdir.z*-3})
local ent = obj:get_luaentity()
ent._potency = stack:get_meta():get_int("mcl_potions:potion_potent")
ent._plus = stack:get_meta():get_int("mcl_potions:potion_plus")
ent._potency = item:get_meta():get_int("mcl_potions:potion_potent")
ent._plus = item:get_meta():get_int("mcl_potions:potion_plus")
ent._effect_list = def._effect_list
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_usagehelp = how_to_throw,
inventory_image = "mcl_throwing_snowball.png",
stack_max = 64,
stack_max = 16,
groups = { weapon_ranged = 1 },
on_use = mcl_throwing.get_player_throw_function("mcl_throwing:snowball_entity"),
_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_usagehelp = how_to_throw,
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_dispense = mcl_throwing.dispense_function,
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
* Crash related to server restart while a player is dead by teknomunk
* 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