This commit is contained in:
whosit 2025-04-01 05:18:43 +03:00
commit 1fd42583dd
3 changed files with 147 additions and 0 deletions

10
init.lua Normal file
View File

@ -0,0 +1,10 @@
-- luacheck: globals live
local MODNAME = core.get_current_modname()
--local MODPATH = core.get_modpath(MODNAME)
local mod = {
MODNAME = MODNAME,
}
_G[MODNAME] = mod
live.load_module(MODNAME, "module")

1
mod.conf Normal file
View File

@ -0,0 +1 @@
depends = live

136
module.lua Normal file
View File

@ -0,0 +1,136 @@
---/eval live.load_module("player_dummy", "module")
local mod = ... or {}
local MODNAME = mod.MODNAME or "NONE"
local live = _G.live
if not live then
live = {
register_entity = core.register_entity,
register_on_leaveplayer = function(_, func)
core.register_on_leaveplayer(func)
end,
register_on_joinplayer = function(_, func)
core.register_on_joinplayer(func)
end,
}
end
local function tell(...)
core.chat_send_all(string.format(...))
end
local known_dummies = mod.known_dummies
if not mod.known_dummies then
known_dummies = {}
mod.known_dummies = known_dummies
end
live.register_entity(
":" .. MODNAME .. ":dummy",
{
initial_properties = {
visual = "mesh",
mesh = "mobs_mime_plantlike.obj",
textures = { "meh.png" },
use_texture_alpha = true,
hp_max = 1,
physical = true,
static_save = true,
},
on_activate = function(self, staticdata, dtime)
local data = minetest.deserialize(staticdata)
--tell("activate %s", dump(data))
if data then
if data.props then
self.object:set_properties(data.props)
end
-- self.nametag = data.nametag or ""
-- self.object:set_nametag_attributes({
-- text = self.nametag,
-- color = "#FFFFFF",
-- bgcolor = false,
-- })
end
end,
get_staticdata = function(self)
local props = self.object:get_properties()
local data = {
props = props,
}
return minetest.serialize(data)
end,
on_step = function(self, dtime)
--self.object:set_yaw(self.object:get_yaw() + 0.1)
-- local rot = self.object:get_rotation()
-- rot.y = rot.y + 0.01
-- self.object:set_rotation(rot)
self.time = (self.time or 0) + dtime
local override = self.object:get_bone_override('Head')
if not override.rotation then
override.rotation = {}
end
override.rotation.interpolation = dtime*2
override.rotation.vec = vector.new(0,0,(math.pi/5)*math.sin(math.pi*self.time*(123/60)))
self.object:set_bone_override('Head', override)
--error('aaa')
end,
on_death = function(self, killer)
tell("killed")
end,
}
)
function mod.make_clone(player)
local pos = player:get_pos()
if pos then
local o = core.add_entity(pos, MODNAME .. ":dummy")
local props = table.copy(player:get_properties())
if (not props.nametag) or props.nametag == "" then
props.nametag = player:get_player_name()
end
o:set_properties(props)
-- nametag
local attrs = table.copy(player:get_nametag_attributes())
if (not attrs.text) or attrs.text == "" then
attrs.text = player:get_player_name()
end
o:set_nametag_attributes(attrs)
-- animation
local range, speed, blend, loop = player:get_animation()
o:set_animation(range, speed, blend, loop)
-- yaw
o:set_yaw(player:get_look_horizontal())
return o
end
end
live.register_on_leaveplayer(
MODNAME .. ":leave",
function(player, _timed_out)
local o = mod.make_clone(player)
local player_name = player:get_player_name()
known_dummies[player_name] = o
end
)
live.register_on_joinplayer(
MODNAME .. ":join",
function(player, last_login)
local player_name = player:get_player_name()
local dummy = known_dummies[player_name]
if dummy and dummy:is_valid() then
local pos = dummy:get_pos()
if pos then
player:set_pos(pos)
end
dummy:remove()
end
end
)