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