Ir para conteúdo

Featured Replies

Postado

.Qual servidor você utiliza como base? 

OTServBR12 (TFS 1.3)

 

Qual o motivo deste tópico? 

Estou tentando implementar um sistema onde, o player ao entrar no teleporte, irá ser transportado para um tile especifico, correspondente ao training monk livre.

Se o training monk estiver ocupado, isso é, tiver outra pessoa, ele será transportado para outro trainer. Se todos estiverem ocupados, o player não será transportado.

 

O problema: O script funciona, porém toda vez que um player é transportado para um tile, outro player não será transportado mais para esse tile novamente, mesmo ele estando livre.

Em outras palavras: O slot do treiner é ignorado pelo script após uma pessoa ser teletransportado pra ele, como se o script tivesse uma "memória".

Ou seja se uma pessoa entrar e sair no teleporte dos trainers, cada vez ela será transportada para um slot diferente, até ela ter sido transportada para todos eles, e não restar nenhum, a partir desse momento, o script sempre detecta que todos os slots estão ocupados (só que na verdade estão todos livres).

A unica maneira de resolver esse problema é reiniciando o servidor.

 

Eu acredito que a solução seria alguma função especial para resetar o script toda vez que o player usa o teleporte, porém não sei como implemento

 

 

data/movements/trainers.lua

Quote

local config = {
    leftTopCorner = {x = 31841, y = 32731},
    rightDownCorner = {x = 31895, y = 32755},
    zPos = 7,
    tileItemId = 11063, --tile item id for scanner, where you want to teleport player, ez to change for tile with uid if someone need
}

local function findFirstEmpty()
    for x = config.leftTopCorner.x, config.rightDownCorner.x do
        for y = config.leftTopCorner.y, config.rightDownCorner.y do
            local tmpPos = {x=x, y=y, z = config.zPos};
            local t = Tile(tmpPos)
            if t ~= nil then
                if(t:getThing():getId() == config.tileItemId and not t:getTopCreature()) then
                    return tmpPos
                end
            end
        end
    end
    return false
end


function onStepIn(creature, item, position, fromPosition)
    local player = creature:getPlayer()
    if not player then
        return true
    end
    local availableTrainingSlot = findFirstEmpty()
    if(availableTrainingSlot) then
        player:teleportTo(availableTrainingSlot)
		player:sendTextMessage(MESSAGE_INFO_DESCR, "LeftTopCorner: X=".. config.leftTopCorner.x .."Y=".. config.leftTopCorner.y .." RightDownCorner: X=".. config.rightDownCorner.x .." Y= ".. config.rightDownCorner.y .." pronto")
        --player:sendTextMessage(MESSAGE_INFO_DESCR, "Treiner stamina regeneration engaged.")
    else
        player:sendTextMessage(MESSAGE_INFO_DESCR, "No available treiner slots.")
    end
    return true
end

 

 

Só explicando oque o script faz: Ele pega duas posições distintas, e varre todos os tiles entre elas, quando ele acha um tile com ID: 11063 que esteja vazio, ele teleporta o player para essa posição.

 

Postado

@Serpente Tenta assim:

function onStepIn(creature, item, position, fromPosition)
    local player = creature:getPlayer()
    if not player then
        return true
    end
    if findFirstEmpty() then
        player:teleportTo(availableTrainingSlot)
		player:sendTextMessage(MESSAGE_INFO_DESCR, "LeftTopCorner: X=".. config.leftTopCorner.x .."Y=".. config.leftTopCorner.y .." RightDownCorner: X=".. config.rightDownCorner.x .." Y= ".. config.rightDownCorner.y .." pronto")
        --player:sendTextMessage(MESSAGE_INFO_DESCR, "Treiner stamina regeneration engaged.")
    else
        player:sendTextMessage(MESSAGE_INFO_DESCR, "No available treiner slots.")
    end
    return true
end

 

Postado
  • Autor

image.thumb.png.adb1106d82c7e19a3b44ce8b0dda65a2.png

 

Troquei por

 

function onStepIn(creature, item, position, fromPosition)
    local player = creature:getPlayer()
    if not player then
        return true
    end
    if findFirstEmpty() then
        player:teleportTo(findFirstEmpty())
        player:sendTextMessage(MESSAGE_INFO_DESCR, "Treiner stamina regeneration engaged.")
    else
        player:sendTextMessage(MESSAGE_INFO_DESCR, "No available treiner slots.")
    end
    return true
end

 

Parou de dar erro, porém, mesmo problema do código original =/

Editado por Serpente (veja o histórico de edições)

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo