forked from VoxeLibre/VoxeLibre
Compare commits
2 Commits
Author | SHA1 | Date |
---|---|---|
epCode | eb39dcf605 | |
epCode | 70b6636568 |
|
@ -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
|
||||||
|
|
114
RELEASE.md
114
RELEASE.md
|
@ -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*)
|
|
||||||
|
|
|
@ -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
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Binary file not shown.
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -371,6 +363,7 @@ minetest.register_node("mcl_beacons:beacon", {
|
||||||
node = minetest.get_node({x=pos.x,y=y,z=pos.z})
|
node = minetest.get_node({x=pos.x,y=y,z=pos.z})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
if minetest.get_item_group(node.name, "glass") ~= 0 or minetest.get_item_group(node.name,"material_glass") ~= 0 then
|
if minetest.get_item_group(node.name, "glass") ~= 0 or minetest.get_item_group(node.name,"material_glass") ~= 0 then
|
||||||
beam_palette_index = get_beacon_beam(node.name)
|
beam_palette_index = get_beacon_beam(node.name)
|
||||||
end
|
end
|
||||||
|
@ -433,15 +426,6 @@ 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",
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
})
|
})
|
||||||
|
|
|
@ -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
|
||||||
})
|
})
|
||||||
|
|
|
@ -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 },
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
Loading…
Reference in New Issue