Merge pull request 'Slightly lift your right arm when holding an item.' (#1345) from iliekprogrammar/MineClone2:hand into master

Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/1345
This commit is contained in:
epCode 2021-03-20 02:29:11 +00:00
commit c877d6e922
3 changed files with 68 additions and 56 deletions

@ -50,69 +50,69 @@ local alldirs=
-- 3 exptime variants because the animation is not tied to particle expiration time. -- 3 exptime variants because the animation is not tied to particle expiration time.
-- 3 colorized variants to imitate minecraft's -- 3 colorized variants to imitate minecraft's
local smoke_pdef_base = { local smoke_pdef_base = {
amount = 0.001, amount = 0.001,
time = 0, time = 0,
-- minpos = vector.add(pos, { x = -0.45, y = -0.45, z = -0.45 }), -- minpos = vector.add(pos, { x = -0.45, y = -0.45, z = -0.45 }),
-- maxpos = vector.add(pos, { x = 0.45, y = 0.45, z = 0.45 }), -- maxpos = vector.add(pos, { x = 0.45, y = 0.45, z = 0.45 }),
minvel = { x = -0.1, y = 0.3, z = -0.1 }, minvel = { x = -0.1, y = 0.3, z = -0.1 },
maxvel = { x = 0.1, y = 1.6, z = 0.1 }, maxvel = { x = 0.1, y = 1.6, z = 0.1 },
-- minexptime = 3 exptime variants, -- minexptime = 3 exptime variants,
-- maxexptime = 3 exptime variants -- maxexptime = 3 exptime variants
minsize = 4.0, minsize = 4.0,
maxsize = 4.5, maxsize = 4.5,
-- texture = "mcl_particles_smoke_anim.png^[colorize:#000000:(3 colourize variants)", -- texture = "mcl_particles_smoke_anim.png^[colorize:#000000:(3 colourize variants)",
animation = { animation = {
type = "vertical_frames", type = "vertical_frames",
aspect_w = 8, aspect_w = 8,
aspect_h = 8, aspect_h = 8,
-- length = 3 exptime variants -- length = 3 exptime variants
}, },
collisiondetection = true, collisiondetection = true,
} }
local smoke_pdef_cached = {} local smoke_pdef_cached = {}
local spawn_smoke = function(pos) local spawn_smoke = function(pos)
local min = math.min local min = math.min
local new_minpos = vector.add(pos, { x = -0.45, y = -0.45, z = -0.45 }) local new_minpos = vector.add(pos, { x = -0.45, y = -0.45, z = -0.45 })
local new_maxpos = vector.add(pos, { x = 0.45, y = 0.45, z = 0.45 }) local new_maxpos = vector.add(pos, { x = 0.45, y = 0.45, z = 0.45 })
-- populate the cache -- populate the cache
if not next(smoke_pdef_cached) then if not next(smoke_pdef_cached) then
-- the last frame plays for 1/8 * N seconds, so we can take advantage of it -- the last frame plays for 1/8 * N seconds, so we can take advantage of it
-- to have varying exptime for each variant. -- to have varying exptime for each variant.
local exptimes = { 0.75, 1.5, 4.0 } local exptimes = { 0.75, 1.5, 4.0 }
local colorizes = { "199", "209", "243" } -- round(78%, 82%, 90% of 256) - 1 local colorizes = { "199", "209", "243" } -- round(78%, 82%, 90% of 256) - 1
local id = 1 local id = 1
for _,exptime in ipairs(exptimes) do for _,exptime in ipairs(exptimes) do
for _,colorize in ipairs(colorizes) do for _,colorize in ipairs(colorizes) do
smoke_pdef_base.minpos = new_minpos smoke_pdef_base.minpos = new_minpos
smoke_pdef_base.maxpos = new_maxpos smoke_pdef_base.maxpos = new_maxpos
smoke_pdef_base.maxexptime = exptime smoke_pdef_base.maxexptime = exptime
smoke_pdef_base.animation.length = exptime + 0.1 smoke_pdef_base.animation.length = exptime + 0.1
-- minexptime must be set such that the last frame is actully rendered, -- minexptime must be set such that the last frame is actully rendered,
-- even if its very short. Larger exptime -> larger range -- even if its very short. Larger exptime -> larger range
smoke_pdef_base.minexptime = min(exptime, (7.0/8.0 * (exptime + 0.1) + 0.1)) smoke_pdef_base.minexptime = min(exptime, (7.0/8.0 * (exptime + 0.1) + 0.1))
smoke_pdef_base.texture = "mcl_particles_smoke_anim.png^[colorize:#000000:" ..colorize smoke_pdef_base.texture = "mcl_particles_smoke_anim.png^[colorize:#000000:" ..colorize
smoke_pdef_cached[id] = table.copy(smoke_pdef_base) smoke_pdef_cached[id] = table.copy(smoke_pdef_base)
mcl_particles.add_node_particlespawner(pos, smoke_pdef_cached[id], "high") mcl_particles.add_node_particlespawner(pos, smoke_pdef_cached[id], "high")
id = id + 1 id = id + 1
end end
end end
-- cache already populated -- cache already populated
else else
for i, smoke_pdef in ipairs(smoke_pdef_cached) do for i, smoke_pdef in ipairs(smoke_pdef_cached) do
smoke_pdef.minpos = new_minpos smoke_pdef.minpos = new_minpos
smoke_pdef.maxpos = new_maxpos smoke_pdef.maxpos = new_maxpos
mcl_particles.add_node_particlespawner(pos, smoke_pdef, "high") mcl_particles.add_node_particlespawner(pos, smoke_pdef, "high")
end end
end end
--[[ Old smoke pdef --[[ Old smoke pdef
local spawn_smoke = function(pos) local spawn_smoke = function(pos)
mcl_particles.add_node_particlespawner(pos, { mcl_particles.add_node_particlespawner(pos, {
amount = 0.1, amount = 0.1,
time = 0, time = 0,
@ -132,7 +132,7 @@ local spawn_smoke = function(pos)
length = 2.1, length = 2.1,
}, },
}, "high") }, "high")
-- ]] -- ]]
end end

@ -96,6 +96,8 @@ minetest.register_globalstep(function(dtime)
local player_velocity = player:get_velocity() or player:get_player_velocity() local player_velocity = player:get_velocity() or player:get_player_velocity()
local wielded = player:get_wielded_item()
-- controls head bone -- controls head bone
local pitch = - degrees(player:get_look_vertical()) local pitch = - degrees(player:get_look_vertical())
local yaw = degrees(player:get_look_horizontal()) local yaw = degrees(player:get_look_horizontal())
@ -107,13 +109,19 @@ minetest.register_globalstep(function(dtime)
player_vel_yaw = limit_vel_yaw(player_vel_yaw, yaw) player_vel_yaw = limit_vel_yaw(player_vel_yaw, yaw)
player_vel_yaws[name] = player_vel_yaw player_vel_yaws[name] = player_vel_yaw
-- controls right and left arms pitch when shooting a bow or punching -- controls right and left arms pitch when shooting a bow
if string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") and controls.RMB and not controls.LMB and not controls.up and not controls.down and not controls.left and not controls.right then if string.find(wielded:get_name(), "mcl_bows:bow") and controls.RMB and not controls.LMB and not controls.up and not controls.down and not controls.left and not controls.right then
player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35)) player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch+90,-30,pitch * -1 * .35))
player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35)) player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3.5,5.785,0), vector.new(pitch+90,43,pitch * .35))
-- when punching
elseif controls.LMB and player:get_attach() == nil then elseif controls.LMB and player:get_attach() == nil then
player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch,0,0)) player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(pitch,0,0))
player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0)) player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0))
-- when holding an item.
elseif wielded:get_name() ~= "" then
player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(20,0,0))
player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0))
-- resets arms pitch
else else
player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0)) player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3,5.785,0), vector.new(0,0,0))
player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(0,0,0)) player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3,5.785,0), vector.new(0,0,0))

@ -106,14 +106,18 @@ minetest.register_entity("wieldview:wieldnode", {
if player then if player then
local wielded = player:get_wielded_item() local wielded = player:get_wielded_item()
local itemstring = wielded:get_name() local itemstring = wielded:get_name()
if self.itemstring ~= itemstring then if self.itemstring ~= itemstring then
local def = minetest.registered_items[itemstring] local def = minetest.registered_items[itemstring]
self.object:set_properties({glow = def and def.light_source or 0}) self.object:set_properties({glow = def and def.light_source or 0})
-- wield item as cubic
if armor.textures[self.wielder].wielditem == "blank.png" then if armor.textures[self.wielder].wielditem == "blank.png" then
self.object:set_properties({textures = {itemstring}}) self.object:set_properties({textures = {itemstring}})
else else -- wield item as flat
self.object:set_properties({textures = {""}}) self.object:set_properties({textures = {""}})
end end
self.itemstring = itemstring self.itemstring = itemstring
end end
else else