217 lines
7.2 KiB
Lua
217 lines
7.2 KiB
Lua
--todo: make hand get texture from skin
|
|
--local modpath = minetest.get_modpath("fl_player")
|
|
--local texture_list = minetest.get_dir_list(modpath .. "/textures")
|
|
|
|
fl_player = {}
|
|
|
|
local animations = {
|
|
stand = {x=0, y=79},
|
|
lay = {x=162, y=166},
|
|
walk = {x=168, y=187},
|
|
mine = {x=189, y=198},
|
|
walk_mine = {x=200, y=219},
|
|
sit = {x=81, y=160},
|
|
swim = {x=246, y=279},
|
|
swim_atk = {x=285, y=318},
|
|
fly = {x=325, y=334},
|
|
fly_atk = {x=340, y=349},
|
|
fall = {x=355, y=364},
|
|
fall_atk = {x=365, y=374},
|
|
duck_std = {x=380, y=380},
|
|
duck = {x=381, y=399},
|
|
climb = {x=410, y=429},
|
|
}
|
|
|
|
fl_player.animations = animations
|
|
fl_player.ignore = {}
|
|
|
|
local data_table = {}
|
|
local key_table = {}
|
|
|
|
for _, sn in pairs(minetest.get_dir_list(minetest.get_modpath("fl_player").."/textures")) do
|
|
local nn = string.split(string.split(sn, "_")[2],".")
|
|
table.insert(data_table, {_texture = sn, name = nn[1], get_preview = function() return "" end})
|
|
key_table[sn] = 1
|
|
end
|
|
|
|
local function get_player_skin(player)
|
|
if player:get_meta():get("skin") and key_table[player:get_meta():get("skin")] then
|
|
return player:get_meta():get("skin")
|
|
end
|
|
return "character_Jonathon.png"
|
|
end
|
|
|
|
minetest.register_on_joinplayer(function(player)
|
|
player:get_meta():set_int("vanish", 0)
|
|
player:set_properties({
|
|
mesh = "fl_character.b3d",
|
|
textures = {get_player_skin(player), "[combine:16x16", "[combine:16x16"},
|
|
visual = "mesh",
|
|
visual_size = {x = 1, y = 1, z = 1},
|
|
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
|
stepheight = 0.6,
|
|
eye_height = 1.47,
|
|
})
|
|
--patch this
|
|
player:set_local_animation(
|
|
{},
|
|
{},
|
|
{},
|
|
{},
|
|
30
|
|
)
|
|
end)
|
|
|
|
minetest.register_globalstep(function(dtime)
|
|
for _, player in pairs(minetest.get_connected_players()) do
|
|
local pcontrols = player:get_player_control()
|
|
|
|
player:set_bone_position(
|
|
"Head",
|
|
vector.new(0, 6.35, 0), vector.new(-math.deg(player:get_look_vertical()), 0, 0)
|
|
)
|
|
|
|
if fl_player.ignore[player:get_player_name()] then return end
|
|
|
|
if math.floor(player:get_properties().eye_height * 100) ~= 147 and not pcontrols.sneak then
|
|
player:set_properties({
|
|
eye_height = 1.47,
|
|
})
|
|
--this allows mods to set this int so that this doesnt reset nametag on them
|
|
if player:get_meta():get_int("vanish") <= 0 then
|
|
player:set_properties({
|
|
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
|
})
|
|
player:set_nametag_attributes({
|
|
text = player:get_player_name(),
|
|
color = {a = 255, r = 255, g = 255, b = 255},
|
|
})
|
|
end
|
|
end
|
|
|
|
if pcontrols.sneak then
|
|
if pcontrols.jump then
|
|
player:set_animation(animations["stand"], 15)
|
|
if player:get_meta():get_int("vanish") <= 0 then
|
|
player:set_properties({
|
|
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
|
})
|
|
player:set_nametag_attributes({
|
|
text = player:get_player_name(),
|
|
color = {a = 255, r = 255, g = 255, b = 255},
|
|
})
|
|
end
|
|
elseif pcontrols.up or pcontrols.down or pcontrols.left or pcontrols.right then
|
|
player:set_animation(animations["duck"], 15)
|
|
player:set_properties({
|
|
eye_height = 1.3,
|
|
--collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.5, 0.3},
|
|
})
|
|
if player:get_meta():get_int("vanish") <= 0 then
|
|
player:set_properties({
|
|
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
|
})
|
|
player:set_nametag_attributes({
|
|
text = " ",
|
|
color = {a = 0, r = 255, g = 255, b = 255},
|
|
})
|
|
end
|
|
else
|
|
player:set_animation(animations["duck_std"], 15)
|
|
player:set_properties({
|
|
eye_height = 1.3,
|
|
--collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.5, 0.3},
|
|
})
|
|
if player:get_meta():get_int("vanish") <= 0 then
|
|
player:set_properties({
|
|
collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3},
|
|
})
|
|
player:set_nametag_attributes({
|
|
text = " ",
|
|
color = {a = 0, r = 255, g = 255, b = 255},
|
|
})
|
|
end
|
|
end
|
|
elseif pcontrols.up or pcontrols.down or pcontrols.left or pcontrols.right then
|
|
if pcontrols.LMB or pcontrols.RMB then
|
|
player:set_animation(animations["walk_mine"], 30)
|
|
else
|
|
player:set_animation(animations["walk"], 30)
|
|
end
|
|
elseif pcontrols.LMB or pcontrols.RMB then
|
|
player:set_animation(animations["mine"], 30)
|
|
else
|
|
player:set_animation(animations["stand"], 30)
|
|
end
|
|
end
|
|
end)
|
|
|
|
--disable global step before testing using this command
|
|
--[[
|
|
minetest.register_chatcommand("set_anim", {
|
|
params = "<animation>",
|
|
description = "set player animation",
|
|
func = function(name, param)
|
|
if not animations[param] then
|
|
return minetest.chat_send_player(name, "'" .. param .. "' is not a valid animation!")
|
|
end
|
|
|
|
minetest.get_player_by_name(name):set_animation(animations[param], 30)
|
|
minetest.chat_send_player(name, "animation " .. param .. " set")
|
|
end,
|
|
})
|
|
--]]
|
|
|
|
--[[skins]]--
|
|
|
|
--needs to fake support skinsdb for i3 support
|
|
--[[
|
|
data structure dump of skins.get_skinlist_for_player(name) seems to be
|
|
{
|
|
license = "", --license
|
|
format = "", --1.0 or 1.8
|
|
_texture = "", --texture filename
|
|
_key = "", --texture name without .png
|
|
author = "" --author name
|
|
_sort_id = number, seems to be 5000?
|
|
name = "", --seems to be texture name with character_ and .png stripped from filename
|
|
__index = {
|
|
set_skin = function,
|
|
set_meta = function,
|
|
get_preview = function,
|
|
get_key = function,
|
|
set_preview = function,
|
|
is_applicable_for_player = function,
|
|
get_texture = function,
|
|
apply_skin_to_player = function,
|
|
get_meta = function,
|
|
get_meta_string = function,
|
|
set_texture = function,
|
|
__index = circlar reference,
|
|
}
|
|
}
|
|
--]]
|
|
|
|
skins = {}
|
|
|
|
function skins.get_skinlist_for_player(name)
|
|
return data_table
|
|
end
|
|
|
|
function skins.set_player_skin(player, skin_entry)
|
|
--minetest.chat_send_all(skin_entry._texture)
|
|
player:get_meta():set_string("skin", skin_entry._texture)
|
|
player:set_properties({
|
|
textures = {get_player_skin(player), "[combine:16x16", "[combine:16x16]"},
|
|
})
|
|
end
|
|
|
|
function skins.get_player_skin(player)
|
|
local skin = player:get_meta():get("skin") or "character_Jonathon.png"
|
|
local nn = string.split(string.split(skin, "_")[2],".")
|
|
return {name = nn[1], _texture = skin}
|
|
end
|
|
|
|
function skins.get_preview()
|
|
return ""
|
|
end |