Postado Agosto 27, 2021 3 anos Então gente, eu tentei trazer um código do tsf 1x (que é para scanear o mapa) e funcionou perfeitamente, porém fica dando debug em algumas vezes e não sei o porque. O codigo oficial 1x: local distanceBetweenPositionsX = 8 local distanceBetweenPositionsY = 8 local addEventDelay = 100 local teleportsPerEvent = 3 local maxEventExecutionTime = 1000 local function teleportToClosestPosition(player, x, y, z) -- direct to position local tile = Tile(x, y, z) if not tile or not tile:getGround() or tile:hasFlag(TILESTATE_TELEPORT) or not player:teleportTo(tile:getPosition()) then for distance = 1, 3 do -- try to find some close tile for changeX = -distance, distance, distance do for changeY = -distance, distance, distance do tile = Tile(x + changeX, y + changeY, z) if tile and tile:getGround() and not tile:hasFlag(TILESTATE_TELEPORT) and player:teleportTo(tile:getPosition()) then return true end end end end return false end return true end local function sendScanProgress(player, minX, maxX, minY, maxY, x, y, z, lastProgress) local progress = math.floor(((y - minY + (((x - minX) / (maxX - minX)) * distanceBetweenPositionsY)) / (maxY - minY)) * 100) if progress ~= lastProgress then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Scan progress: ~' .. progress .. '%') end return progress end local function minimapScan(cid, minX, maxX, minY, maxY, x, y, z, lastProgress) local player = Player(cid) if not player then --print('Minimap scan stopped - player logged out', cid, minX, maxX, minY, maxY, x, y, z) return end local scanStartTime = os.mtime() local teleportsDone = 0 while true do if scanStartTime + maxEventExecutionTime < os.mtime() then lastProgress = sendScanProgress(player, minX, maxX, minY, maxY, x, y, z, lastProgress) addEvent(minimapScan, addEventDelay, cid, minX, maxX, minY, maxY, x, y, z, lastProgress) break end x = x + distanceBetweenPositionsX if x > maxX then x = minX y = y + distanceBetweenPositionsY if y > maxY then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Scan finished: ' .. os.time()) --print('Minimap scan complete', player:getName(), minX, maxX, minY, maxY, x, y, z) break end end if teleportToClosestPosition(player, x, y, z) then teleportsDone = teleportsDone + 1 lastProgress = sendScanProgress(player, minX, maxX, minY, maxY, x, y, z, lastProgress) --print('Minimap scan teleport', player:getName(), minX, maxX, minY, maxY, x, y, z, progress, teleportsDone) if teleportsDone == teleportsPerEvent then addEvent(minimapScan, addEventDelay, cid, minX, maxX, minY, maxY, x, y, z, progress) break end end end end local function minimapStart(player, minX, maxX, minY, maxY, x, y, z) player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Scan started: ' .. os.time()) --print('Minimap scan start', player:getName(), minX, maxX, minY, maxY, x, y, z) minimapScan(player:getId(), minX, maxX, minY, maxY, minX - 5, minY, z) end function onSay(player, words, param) if player:getGroup():getId() <= 4 then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Only GOD can scan map. Too low Player group.') return false end if player:getAccountType() < ACCOUNT_TYPE_GAMEMASTER then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Only GOD can scan map.Too low Account type.') return false end local positions = param:split(',') if #positions ~= 5 then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Command requires 5 parameters: /minimap minX, maxX, minY, maxY, z') return false end for key, position in pairs(positions) do local value = tonumber(position) if not value then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_ORANGE, 'Invalid parameter ' .. key .. ': ' .. position) return false end positions[key] = value end minimapStart(player, positions[1], positions[2], positions[3], positions[4], positions[1] - distanceBetweenPositionsX, positions[3], positions[5]) return false end Meu código 0.4x: local distanceBetweenPositionsX = 8 local distanceBetweenPositionsY = 8 local addEventDelay = 100 local teleportsPerEvent = 3 local maxEventExecutionTime = 1000 local function isWalkable(pos) -- by Nord / editado por Omega if tile and getTileThingByPos(tile) then if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false elseif isCreature(getTopCreature(pos).uid) then return false elseif getTileInfo(pos).protection then return false elseif hasProperty(getThingFromPos(pos).uid, 3) or hasProperty(getThingFromPos(pos).uid, 7) then return false end end return true end local function teleportToClosestPosition(cid, x, y, z) -- direct to position local tile = {x = x, y = y, z = z, stackpos=253} if not tile or not getTileThingByPos(tile) or not isWalkable(tile) or not doTeleportThing(cid, tile) then for distance = 1, 3 do -- try to find some close tile for changeX = -distance, distance, distance do for changeY = -distance, distance, distance do tile = {x = x + changeX, y = y + changeY, z = z} if tile and getTileThingByPos(tile) and isWalkable(tile) and doTeleportThing(cid, tile) then return true end end end end return false end return true end local function sendScanProgress(cid, minX, maxX, minY, maxY, x, y, z, lastProgress) local progress = math.floor(((y - minY + (((x - minX) / (maxX - minX)) * distanceBetweenPositionsY)) / (maxY - minY)) * 100) if progress ~= lastProgress then doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_ORANGE, 'Scan progress: ~' .. progress .. '%') doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_ORANGE, 'X = ' .. x .. 'Y = ' .. y) end return progress end local function minimapScan(cid, minX, maxX, minY, maxY, x, y, z, lastProgress) local player = isPlayer(cid) if not player then print('Minimap scan stopped - player logged out', cid, minX, maxX, minY, maxY, x, y, z) return end local scanStartTime = os.mtime() local teleportsDone = 0 while true do if scanStartTime + maxEventExecutionTime < os.mtime() then lastProgress = sendScanProgress(cid, minX, maxX, minY, maxY, x, y, z, lastProgress) addEvent(minimapScan, addEventDelay, cid, minX, maxX, minY, maxY, x, y, z, lastProgress) break end x = x + distanceBetweenPositionsX if x > maxX then x = minX y = y + distanceBetweenPositionsY if y > maxY then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'Scan finished: ' .. os.time()) --print('Minimap scan complete', player:getName(), minX, maxX, minY, maxY, x, y, z) break end end if teleportToClosestPosition(cid, x, y, z) then teleportsDone = teleportsDone + 1 lastProgress = sendScanProgress(cid, minX, maxX, minY, maxY, x, y, z, lastProgress) --print('Minimap scan teleport', player:getName(), minX, maxX, minY, maxY, x, y, z, progress, teleportsDone) if teleportsDone == teleportsPerEvent then addEvent(minimapScan, addEventDelay, cid, minX, maxX, minY, maxY, x, y, z, progress) break end end end end local function minimapStart(cid, minX, maxX, minY, maxY, x, y, z) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'Scan started: ' .. os.time()) --print('Minimap scan start', player:getName(), minX, maxX, minY, maxY, x, y, z) minimapScan(cid, minX, maxX, minY, maxY, minX - 5, minY, z) end function onSay(cid, words, param) if getPlayerGroupId(cid) <= 4 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'Only GOD can scan map. Too low Player group.') return false end local positions = string.explode(param, ",") if #positions ~= 5 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'Command requires 5 parameters: /minimap minX, maxX, minY, maxY, z') return false end for key, position in pairs(positions) do local value = tonumber(position) if not value then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'Invalid parameter ' .. key .. ': ' .. position) return false end positions[key] = value end minimapStart(cid, positions[1], positions[2], positions[3], positions[4], positions[1] - distanceBetweenPositionsX, positions[3], positions[5]) return false end Postei aqui, caso alguém possa ajudar a corrigir e postar em um local certo, mas fica ai pra quem quiser utiliza-lo. Créditos ao @Vodkart pela função isWalkable (mas se ele ver isso, será q ela é precisa? Pq continuou o debug :C) Tópico original: https://otland.net/threads/tfs-1-2-minimap-generator-map-scanner.262275/ Editado Agosto 27, 2021 3 anos por Lucce (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.