Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow overriding the loop flag on player_api.set_animation #3097

Merged
merged 2 commits into from
Jan 28, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions mods/player_api/api.lua
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ function player_api.set_model(player, model_name)
player_data.model = model_name
-- Clear animation data as the model has changed
-- (required for setting the `stand` animation not to be a no-op)
player_data.animation, player_data.animation_speed = nil, nil
player_data.animation, player_data.animation_speed, player_data.animation_loop = nil, nil, nil

local model = models[model_name]
if model then
Expand Down Expand Up @@ -116,20 +116,27 @@ function player_api.set_texture(player, index, texture)
player_api.set_textures(player, textures)
end

function player_api.set_animation(player, anim_name, speed)
function player_api.set_animation(player, anim_name, speed, loop)
local player_data = get_player_data(player)
local model = models[player_data.model]
if not (model and model.animations[anim_name]) then
return
end
speed = speed or model.animation_speed
if player_data.animation == anim_name and player_data.animation_speed == speed then
if loop == nil then
loop = true
end
if player_data.animation == anim_name
and player_data.animation_speed == speed
and player_data.animation_loop == loop
then
return
end
local previous_anim = model.animations[player_data.animation] or {}
local anim = model.animations[anim_name]
player_data.animation = anim_name
player_data.animation_speed = speed
player_data.animation_loop = loop
-- 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...)
Expand All @@ -146,7 +153,7 @@ function player_api.set_animation(player, anim_name, speed)
end
end
-- Set the animation seen by everyone else
player:set_animation(anim, speed, animation_blend)
player:set_animation(anim, speed, animation_blend, loop)
-- Update related properties if they changed
if anim._equals ~= previous_anim._equals then
player:set_properties({
Expand Down