local book_animations = {["close"] = 1, ["opening"] = 2, ["open"] = 3, ["closing"] = 4} local book_animation_steps = {0, 640, 680, 700, 740} local book_animation_speed = 40 function mcl_enchanting.schedule_book_animation(self, anim) self.scheduled_anim = {timer = self.anim_length, anim = anim} end function mcl_enchanting.set_book_animation(self, anim) local anim_index = book_animations[anim] local start, stop = book_animation_steps[anim_index], book_animation_steps[anim_index + 1] self.object:set_animation({x = start, y = stop}, book_animation_speed) self.scheduled_anim = nil self.anim_length = (stop - start) / 40 end function mcl_enchanting.check_animation_schedule(self, dtime) local schedanim = self.scheduled_anim if schedanim then schedanim.timer = schedanim.timer - dtime if schedanim.timer <= 0 then mcl_enchanting.set_book_animation(self, schedanim.anim)local pos1=self.object:get_pos() end end end function mcl_enchanting.look_at(self, pos2) local pos1 = self.object:get_pos() local vec = vector.subtract(pos1, pos2) local yaw = math.atan(vec.z / vec.x) - math.pi/2 yaw = yaw + (pos1.x >= pos2.x and math.pi or 0) self.object:set_yaw(yaw + math.pi) end function mcl_enchanting.check_book(pos) obj_pos = vector.add(pos, mcl_enchanting.book_offset) for _, obj in pairs(minetest.get_objects_inside_radius(obj_pos, 0.1)) do local luaentity = obj:get_luaentity() if luaentity and luaentity.name == "mcl_enchanting:book" then if minetest.get_node(pos).name ~= "mcl_enchanting:table" then obj:remove() end return end end minetest.add_entity(obj_pos, "mcl_enchanting:book") end minetest.register_entity("mcl_enchanting:book", { initial_properties = { visual = "mesh", mesh = "mcl_enchanting_book.b3d", visual_size = {x = 12.5, y = 12.5}, collisionbox = {0, 0, 0}, physical = false, textures = {"mcl_enchanting_book_entity.png"}, }, player_near = false, on_activate = function(self) self.object:set_armor_groups({immortal = 1}) mcl_enchanting.set_book_animation(self, "close") mcl_enchanting.check_book(vector.subtract(self.object:get_pos(), mcl_enchanting.book_offset)) end, on_step = function(self, dtime) local old_player_near = self.player_near local player_near = false local player for _, obj in pairs(minetest.get_objects_inside_radius(self.object:get_pos(), 2.5)) do if obj:is_player() then player_near = true player = obj end end if player_near and not old_player_near then mcl_enchanting.set_book_animation(self, "opening") mcl_enchanting.schedule_book_animation(self, "open") elseif old_player_near and not player_near then mcl_enchanting.set_book_animation(self, "closing") mcl_enchanting.schedule_book_animation(self, "close") end if player then mcl_enchanting.look_at(self, player:get_pos()) end self.player_near = player_near mcl_enchanting.check_animation_schedule(self, dtime) end, })