Merge branch 'master' into modlib-b3d
commit
5f14d96eec
15
Readme.md
15
Readme.md
|
@ -167,4 +167,17 @@ Head yaw restriction
|
|||
### `models`
|
||||
|
||||
Other models, same format as `default` model
|
||||
<!--modlib:conf-->
|
||||
<!--modlib:conf-->
|
||||
|
||||
## API
|
||||
|
||||
Minetest's `player:set_bone_position` is overridden so that it still works as expected.
|
||||
|
||||
### `character_anim.set_bone_override(player, bonename, position, rotation)`
|
||||
|
||||
The signature resembles that of `set_bone_position`. `bonename` must be a string. The following additional features are provided:
|
||||
|
||||
* Using it like `set_bone_position` by setting `rotation` and `position` to non-`nil` values and using `""` to set the root bone
|
||||
* *Setting only the bone position* by setting `rotation` to `nil` - bone rotation will then be model-animation-determined
|
||||
* *Setting only the bone rotation* by setting `position` to `nil` - bone position will then be model-animation-determined
|
||||
* *Clearing the override* by setting both `rotation` and `position` to `nil` ("unset_bone_position")
|
25
main.lua
25
main.lua
|
@ -46,6 +46,18 @@ end
|
|||
|
||||
players = {}
|
||||
|
||||
function set_bone_override(player, bonename, position, rotation)
|
||||
local name = player:get_player_name()
|
||||
local value = {
|
||||
position = position,
|
||||
euler_rotation = rotation
|
||||
}
|
||||
-- TODO consider setting empty overrides to nil
|
||||
players[name].bone_positions[bonename] = value
|
||||
end
|
||||
|
||||
-- Raw PlayerRef.set_bone_position
|
||||
local set_bone_position
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
local name = player:get_player_name()
|
||||
disable_local_animation(player)
|
||||
|
@ -56,6 +68,14 @@ minetest.register_on_joinplayer(function(player)
|
|||
look_horizontal = get_look_horizontal(player),
|
||||
bone_positions = {}
|
||||
}
|
||||
if not set_bone_position then
|
||||
local PlayerRef = getmetatable(player)
|
||||
set_bone_position = PlayerRef.set_bone_position
|
||||
function PlayerRef:set_bone_position(bonename, position, rotation)
|
||||
set_bone_override(self, bonename or "", position or {x = 0, y = 0, z = 0}, rotation or {x = 0, y = 0, z = 0})
|
||||
return set_bone_position(self, bonename, position, rotation)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
minetest.register_on_leaveplayer(function(player) players[player:get_player_name()] = nil end)
|
||||
|
@ -195,9 +215,10 @@ local function handle_player_animations(dtime, player)
|
|||
-- Replace animation with serverside bone animation
|
||||
disable_animation(player)
|
||||
for bone, values in pairs(bone_positions) do
|
||||
player:set_bone_position(bone, values.position, values.euler_rotation)
|
||||
local overridden_values = player_animation.bone_positions[bone]
|
||||
overridden_values = overridden_values or {}
|
||||
set_bone_position(player, bone, overridden_values.position or values.position, overridden_values.euler_rotation or values.euler_rotation)
|
||||
end
|
||||
player_animation.bone_positions = bone_positions
|
||||
end
|
||||
|
||||
if player_api then
|
||||
|
|
Loading…
Reference in New Issue