commit 1fd42583dd242a3d536f3be1ac375ffd9eb21a68 Author: whosit Date: Tue Apr 1 05:18:43 2025 +0300 works? diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..d1d8a6b --- /dev/null +++ b/init.lua @@ -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") diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..780d7f8 --- /dev/null +++ b/mod.conf @@ -0,0 +1 @@ +depends = live \ No newline at end of file diff --git a/module.lua b/module.lua new file mode 100644 index 0000000..9e2ca6b --- /dev/null +++ b/module.lua @@ -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 +)