Ir para conteúdo

getSearchString (Função da spell Exiva feita em Lua)


LuckOake

Posts Recomendados

Olá galera.

 

Devido a um pedido, refiz a função getSearchString das sources do TFS em Lua, e vou aproveitar e postar ela aqui, caso alguém vá a precisar um dia.

 

 

 

function getSearchString(fromPos, toPos, isFromCreature, isToCreature)
    isFromCreature = isFromCreature == nil and false or isFromCreature
    isToCreature = isToCreature == nil and false or isToCreature
    local DISTANCE_CLOSE,DISTANCE_FAR,DISTANCE_VERYFAR = 0,1,2
    local LEVEL_HIGHER,LEVEL_LOWER,LEVEL_SAME = 1,-1,0
    local DIR_N,DIR_S,DIR_E,DIR_W,DIR_NE,DIR_NW,DIR_SE,DIR_SW = 0,1,2,3,4,5,6,7,8
    local distance
    local direction
    local level
    local dx,dy,dz = fromPos.x - toPos.x,fromPos.y - toPos.y,fromPos.z - toPos.z
    
    if dz > 0 then
        level = LEVEL_HIGHER
    elseif dz < 0 then
        level = LEVEL_LOWER
    else
        level = LEVEL_SAME
    end
    
    if math.abs(dx) < 5 and math.abs(dy) < 5 then
        distance = DISTANCE_BESIDE
    else
        tmp = dx * dx + dy * dy
        if tmp < 10000 then
            distance = DISTANCE_CLOSE
        elseif tmp < 75625 then
            distance = DISTANCE_FAR
        else
            distance = DISTANCE_VERYFAR
        end
    end
    
    local tangent
    
    if dx ~= 0 then
        tangent = dy / dx
    else
        tangent = 10.
    end
    
    if math.abs(tangent) < 0.4142 then
        if dx > 0 then
            direction = DIR_W
        else
            direction = DIR_E
        end
    elseif math.abs(tangent) < 2.4142 then
        if tangent > 0 then
            if dy > 0 then
                direction = DIR_NW
            else
                direction = DIR_SE
            end
        else
            if dx > 0 then
                direction = DIR_SW
            else
                direction = DIR_NE
            end
        end
    else
        if dy > 0 then
            direction = DIR_N
        else
            direction = DIR_S
        end
    end
    
    local ss = ""
    
    if distance == DISTANCE_BESIDE then
        if level == LEVEL_SAME then
            ss = ss.."is "
            if toIsCreature then
                ss = ss.."standing "
            end
            
            ss = ss.."next to you"
        elseif level == LEVEL_HIGHER then
            ss = ss.."is above "
            if fromIsCreature then
                ss = ss.."you"
            end
        elseif level == LEVEL_LOWER then
            ss = ss.."is below "
            if fromIsCreature then
                ss = ss.."you"
            end
        end
    elseif distance == DISTANCE_CLOSE then
        if level == LEVEL_SAME then
            ss = ss.."is to the"
        elseif level == LEVEL_HIGHER then
            ss = ss.."is on a higher level to the "
        elseif level == LEVEL_LOWER then
            ss = ss.."is on a lower level to the "
        end
    elseif distance == DISTANCE_FAR then
        ss = ss.."is far to the"
    elseif distance == DISTANCE_VERYFAR then
        ss = ss.."is very far to the"
    end
    
    if distance ~= DISTANCE_BESIDE then
        ss = ss.." "
        if direction == DIR_N then
            ss = ss.."north"
        elseif direction == DIR_S then
            ss = ss.."south"
        elseif direction == DIR_E then
            ss = ss.."east"
        elseif direction == DIR_W then
            ss = ss.."west"
        elseif direction == DIR_NE then
            ss = ss.."north-east"
        elseif direction == DIR_NW then
            ss = ss.."north-west"
        elseif direction == DIR_SE then
            ss = ss.."south-east"
        elseif direction == DIR_SW then
            ss = ss.."south-west"
        end
    end
    
    return ss
end
 
function useExiva(cid, pid)
    return doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, getCreatureName(pid)..getSearchString(getCreaturePosition(cid), getCreaturePosition(pid), true, true))
end

 

 

 

Explicando os parâmetros da função getSearchString(fromPos, toPos, isFromCreature, isToCreature):

fromPos = posição inicial
toPos = posição do objeto procurado
isFromCreature = a posição inicial é uma posição de uma criatura? (true / false) [default = false]
isToCreature = a posição do objeto é uma posição de uma criatura? (true / false) [default = false]

E pra facilitar o uso, já aproveitei e fiz a função para usar o comando exiva: useExiva(cid, pid).

cid = o uid do player que usa
pid = o uid do player procurado

Ambas as funções estão no code.

 

Bom uso.

Editado por LuckOake
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...