Merge branch 'master' into modlib-b3d

master
Lars Mueller 2021-10-10 13:18:26 +02:00
commit 5f14d96eec
2 changed files with 37 additions and 3 deletions

View File

@ -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")

View File

@ -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