function MyEntity:on_punch(hitter, time_from_last_punch, tool_capabilities, dir, damage) local hitter_name = hitter:get_player_name() local hitter_pos = hitter:get_pos() local object_pos = self.object:get_pos() local face_dir = minetest.dir_to_facedir(dir) if not ( face_dir == 0 or face_dir == 2 ) then minetest.chat_send_player(hitter_name, ("face %d is not valid use one for the numbered/colored faces!"):format(face_dir)) return true end local ray = minetest.raycast(object_pos, hitter_pos, true, true) local pointed_thing = ray:next() pointed_thing = ray:next() while pointed_thing do minetest.log(dump(pointed_thing)) local ip_pos = pointed_thing.intersection_point local number = -1 local face_pos = minetest.pointed_thing_to_face_pos(hitter, { above = vector.add(object_pos, pointed_thing.intersection_normal), 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) local diff_to_prev = vector.subtract(adjusted_pos, self.previous_punch_facepos) if face_dir == 0 or face_dir == 2 then updown = adjusted_pos.y leftright = adjusted_pos.x end if face_dir == 2 then leftright = leftright * (-1) end 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 local msg = ("%s %d dir %d hpos %s opos %s fpos %s norm %s diff %s number: %d"):format(hitter_name, self.last_run, face_dir, 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), minetest.pos_to_string(diff_to_prev, 4), number) minetest.chat_send_player(hitter_name, msg) minetest.log(msg) self.previous_punch_facepos = adjusted_pos self:flipnumber(number) self:set_number_texture() pointed_thing = ray:next() end return true end