Postado Maio 3, 2020 5 anos .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 Maio 3, 2020 5 anos @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 Maio 3, 2020 5 anos Autor 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 Maio 3, 2020 5 anos 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.