mirror of
https://github.com/minetest/minetest_game.git
synced 2024-12-22 15:00:18 +01:00
Override local_animation settings for certain animations
This makes the lay/sit animation work on the local client (in third-person).
This commit is contained in:
parent
6623dec567
commit
acc918436a
15
game_api.txt
15
game_api.txt
@ -462,6 +462,12 @@ The player API can register player models and update the player's appearance.
|
|||||||
* `player`: PlayerRef
|
* `player`: PlayerRef
|
||||||
* `textures`: array of textures. If nil, the default from the model def is used
|
* `textures`: array of textures. If nil, the default from the model def is used
|
||||||
|
|
||||||
|
* `player_api.set_textures(player, index, texture)`
|
||||||
|
* Sets one of the player textures
|
||||||
|
* `player`: PlayerRef
|
||||||
|
* `index`: Index into array of all textures
|
||||||
|
* `texture`: the texture string
|
||||||
|
|
||||||
* `player_api.get_animation(player)`
|
* `player_api.get_animation(player)`
|
||||||
* Returns a table containing fields `model`, `textures` and `animation`
|
* Returns a table containing fields `model`, `textures` and `animation`
|
||||||
* Any of the fields of the returned table may be nil
|
* Any of the fields of the returned table may be nil
|
||||||
@ -480,7 +486,14 @@ The player API can register player models and update the player's appearance.
|
|||||||
animation_speed = 30, -- Default animation speed, in keyframes per second
|
animation_speed = 30, -- Default animation speed, in keyframes per second
|
||||||
textures = {"character.png"}, -- Default array of textures
|
textures = {"character.png"}, -- Default array of textures
|
||||||
animations = {
|
animations = {
|
||||||
-- [anim_name] = {x = <start_frame>, y = <end_frame>, collisionbox = model collisionbox, eye_height = model eye height},
|
-- [anim_name] = {
|
||||||
|
-- x = <start_frame>,
|
||||||
|
-- y = <end_frame>,
|
||||||
|
-- collisionbox = <model collisionbox>, -- (optional)
|
||||||
|
-- eye_height = <model eye height>, -- (optional)
|
||||||
|
-- -- suspend client side animations while this one is active (optional)
|
||||||
|
-- override_local = <true/false>
|
||||||
|
-- },
|
||||||
stand = ..., lay = ..., walk = ..., mine = ..., walk_mine = ..., -- required animations
|
stand = ..., lay = ..., walk = ..., mine = ..., walk_mine = ..., -- required animations
|
||||||
sit = ... -- used by boats and other MTG mods
|
sit = ... -- used by boats and other MTG mods
|
||||||
},
|
},
|
||||||
|
@ -33,6 +33,8 @@ function player_api.register_model(name, def)
|
|||||||
for animation_name, animation in pairs(def.animations) do
|
for animation_name, animation in pairs(def.animations) do
|
||||||
animation.eye_height = animation.eye_height or def.eye_height
|
animation.eye_height = animation.eye_height or def.eye_height
|
||||||
animation.collisionbox = animation.collisionbox or def.collisionbox
|
animation.collisionbox = animation.collisionbox or def.collisionbox
|
||||||
|
animation.override_local = animation.override_local or false
|
||||||
|
|
||||||
for _, other_animation in pairs(def.animations) do
|
for _, other_animation in pairs(def.animations) do
|
||||||
if other_animation._equals then
|
if other_animation._equals then
|
||||||
if collisionbox_equals(animation.collisionbox, other_animation.collisionbox)
|
if collisionbox_equals(animation.collisionbox, other_animation.collisionbox)
|
||||||
@ -65,6 +67,8 @@ function player_api.set_model(player, model_name)
|
|||||||
if player_data.model == model_name then
|
if player_data.model == model_name then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
player_data.model = model_name
|
||||||
|
|
||||||
local model = models[model_name]
|
local model = models[model_name]
|
||||||
if model then
|
if model then
|
||||||
player:set_properties({
|
player:set_properties({
|
||||||
@ -74,15 +78,7 @@ function player_api.set_model(player, model_name)
|
|||||||
visual_size = model.visual_size,
|
visual_size = model.visual_size,
|
||||||
stepheight = model.stepheight
|
stepheight = model.stepheight
|
||||||
})
|
})
|
||||||
local animations = model.animations
|
-- sets local_animation, collisionbox & eye_height
|
||||||
player:set_local_animation(
|
|
||||||
animations.stand,
|
|
||||||
animations.walk,
|
|
||||||
animations.mine,
|
|
||||||
animations.walk_mine,
|
|
||||||
model.animation_speed or 30
|
|
||||||
)
|
|
||||||
-- sets collisionbox & eye_height
|
|
||||||
player_api.set_animation(player, "stand")
|
player_api.set_animation(player, "stand")
|
||||||
else
|
else
|
||||||
player:set_properties({
|
player:set_properties({
|
||||||
@ -94,7 +90,6 @@ function player_api.set_model(player, model_name)
|
|||||||
eye_height = 1.625,
|
eye_height = 1.625,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
player_data.model = model_name
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function player_api.get_textures(player)
|
function player_api.get_textures(player)
|
||||||
@ -127,12 +122,29 @@ function player_api.set_animation(player, anim_name, speed)
|
|||||||
if player_data.animation == anim_name and player_data.animation_speed == speed then
|
if player_data.animation == anim_name and player_data.animation_speed == speed then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local previous_anim_equals = (model.animations[player_data.animation] or {})._equals
|
local previous_anim = model.animations[player_data.animation] or {}
|
||||||
local anim = model.animations[anim_name]
|
local anim = model.animations[anim_name]
|
||||||
player_data.animation = anim_name
|
player_data.animation = anim_name
|
||||||
player_data.animation_speed = speed
|
player_data.animation_speed = speed
|
||||||
|
-- If necessary change the local animation (only seen by the client of *that* player)
|
||||||
|
-- `override_local` <=> suspend local animations while this one is active
|
||||||
|
-- (this is basically a hack, proper engine feature needed...)
|
||||||
|
if anim.override_local ~= previous_anim.override_local then
|
||||||
|
if anim.override_local then
|
||||||
|
local none = {x=0, y=0}
|
||||||
|
player:set_local_animation(none, none, none, none, 1)
|
||||||
|
else
|
||||||
|
local a = model.animations -- (not specific to the animation being set)
|
||||||
|
player:set_local_animation(
|
||||||
|
a.stand, a.walk, a.mine, a.walk_mine,
|
||||||
|
model.animation_speed or 30
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- Set the animation seen by everyone else
|
||||||
player:set_animation(anim, speed, animation_blend)
|
player:set_animation(anim, speed, animation_blend)
|
||||||
if anim._equals ~= previous_anim_equals then
|
-- Update related properties if they changed
|
||||||
|
if anim._equals ~= previous_anim._equals then
|
||||||
player:set_properties({
|
player:set_properties({
|
||||||
collisionbox = anim.collisionbox,
|
collisionbox = anim.collisionbox,
|
||||||
eye_height = anim.eye_height
|
eye_height = anim.eye_height
|
||||||
|
@ -7,11 +7,13 @@ player_api.register_model("character.b3d", {
|
|||||||
animations = {
|
animations = {
|
||||||
-- Standard animations.
|
-- Standard animations.
|
||||||
stand = {x = 0, y = 79},
|
stand = {x = 0, y = 79},
|
||||||
lay = {x = 162, y = 166, collisionbox = {-0.6, 0.0, -0.6, 0.6, 0.3, 0.6}, eye_height = 0.3},
|
lay = {x = 162, y = 166, eye_height = 0.3, override_local = true,
|
||||||
|
collisionbox = {-0.6, 0.0, -0.6, 0.6, 0.3, 0.6}},
|
||||||
walk = {x = 168, y = 187},
|
walk = {x = 168, y = 187},
|
||||||
mine = {x = 189, y = 198},
|
mine = {x = 189, y = 198},
|
||||||
walk_mine = {x = 200, y = 219},
|
walk_mine = {x = 200, y = 219},
|
||||||
sit = {x = 81, y = 160, collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.0, 0.3}, eye_height = 0.8}
|
sit = {x = 81, y = 160, eye_height = 0.8, override_local = true,
|
||||||
|
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.0, 0.3}}
|
||||||
},
|
},
|
||||||
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
||||||
stepheight = 0.6,
|
stepheight = 0.6,
|
||||||
|
Loading…
Reference in New Issue
Block a user