local MyEntity = { initial_properties = { visual = "cube", visual_size = {x = 1, y = 1, z = 1}, collisionbox = { -0.45, -0.45, -0.45, 0.45, 0.45, 0.45 }, textures = {"bla-line-123456789.png", "bla-line-123456789.png", "bla-line-123456789.png","bla-line-123456789.png", "bla-line-123456789.png","bla-line-123456789.png"}, physical = true, damage_texture_modifier = nil, }, current_color = 0, frequency = 0.250, last_run = -1, message = "Default message", x = -1, y = -1, owner = nil, numbers = { true, true, true, true, true, true, true, true, true, } } ... function MyEntity:on_punch(hitter) local hitter_name = hitter:get_player_name() local hitter_pos = hitter:get_pos() local object_pos = self.object:get_pos() --minetest.log(("punched %s - %d x %d"):format(self.owner, self.x, self.y)) --minetest.chat_send_player(hitter_name, ("punched %s - %d x %d"):format(self.owner, self.x, self.y)) local face_pos = minetest.pointed_thing_to_face_pos(hitter, { above = { x=object_pos.x, y=object_pos.y+1, z=object_pos.z }, under = object_pos }) minetest.log(dump(face_pos)) self.last_run = self.last_run + 1 local adjusted_pos = vector.subtract(object_pos, face_pos) local number = -1 local updown = adjusted_pos.z local leftright = adjusted_pos.x local cutoff = 0.15 local cutoff_n = cutoff * (-1) if(leftright > cutoff and updown < cutoff_n) then number = 1 elseif(leftright < cutoff and leftright > cutoff_n and updown < cutoff_n) then number = 2 elseif(leftright < cutoff_n and updown < cutoff_n) then number = 3 elseif(leftright > cutoff and updown < cutoff and updown > cutoff_n) then number = 4 elseif(leftright < cutoff and leftright > cutoff_n and updown < cutoff and updown > cutoff_n) then number = 5 elseif(leftright < cutoff_n and updown < cutoff and updown > cutoff_n) then number = 6 elseif(leftright > cutoff and updown > cutoff) then number = 7 elseif(leftright < cutoff and leftright > cutoff_n and updown > cutoff) then number = 8 elseif(leftright < cutoff_n and updown > cutoff) then number = 9 end minetest.chat_send_all(("%s %d hpos %s opos %s fpos %s norm %s number: %d"):format(hitter_name, self.last_run, minetest.pos_to_string(hitter_pos, 3), minetest.pos_to_string(object_pos, 4), minetest.pos_to_string(face_pos, 4), minetest.pos_to_string(adjusted_pos, 4), number)) self:flipnumber(number) self:set_number_texture() local ray = minetest.raycast(object_pos, hitter_pos, true, true) local pointed_thing = ray:next() while pointed_thing do minetest.log(dump(pointed_thing)) local ip_pos = pointed_thing.intersection_point -- local face_pos = minetest.pointed_thing_to_face_pos(hitter, pointed_thing) local number = -1 local norm = vector.subtract(object_pos, ip_pos) -- local norm3 = vector.subtract(object_pos, face_pos) self.last_run = self.last_run + 1 minetest.chat_send_all(("%s %d hpos %s ippos %s norm %s number: %d"):format(hitter_name, self.last_run, minetest.pos_to_string(hitter_pos, 3), minetest.pos_to_string(ip_pos, 4), minetest.pos_to_string(norm, 4), number)) break end return true end