--[[ Illarion Server This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . ]] local housing = require("housing.propertyList") local gmlectern = require("gm.gm_lectern") local treasure = require("scheduled.spawn_treasure") local houseUtility = require("housing.utility") local M = {} local listAllTilesOfCategory local persistentTiles = {} function listAllTilesOfCategory(user, category, page) local title = "Persistent tiles: "..category local description = "Select one of the persistent tiles to teleport to it." local persistentTilesOfCategory = {} if category == "All" then persistentTilesOfCategory = persistentTiles else for _, persistentTile in pairs(persistentTiles) do if category == persistentTile.cat or category == persistentTile.more then table.insert(persistentTilesOfCategory, persistentTile) end end end if not page then page = 0 end local callback = function(dialog) local success = dialog:getSuccess() if not success then return end local selected = dialog:getSelectedIndex()+1 for index = 1+(page*10), 10+(page*10) do local persistentTile = persistentTilesOfCategory[index] if index == selected then user:warp(persistentTile.pos) end end if selected == 11 then listAllTilesOfCategory(user, category, page+1) end end local dialog = SelectionDialog(title, description, callback) for i = 1+(page*10), 10+(page*10) do local persistentTile = persistentTilesOfCategory[i] if persistentTile then dialog:addOption(0, "Pos: "..tostring(persistentTile.pos).." Category: "..persistentTile.cat.." Details: "..persistentTile.more) end end if (((page+1)*10) + 10) < #persistentTilesOfCategory then dialog:addOption(0, "Next page") end user:requestSelectionDialog(dialog) end local function selectProperty(user) local title = "Persistence Tracker" local description = "Select a property you want to view the persistent tiles of" local callback = function(dialog) local success = dialog:getSuccess() if not success then return end local selected = dialog:getSelectedIndex()+1 for index, property in ipairs(housing.propertyTable) do if index == selected then listAllTilesOfCategory(user, property[1]) end end end local dialog = SelectionDialog(title, description, callback) for _, property in ipairs(housing.propertyTable) do dialog:addOption(0, property[1]) end user:requestSelectionDialog(dialog) end local function coordBelongsToHousing(coord) local houses = housing.properties for _, house in pairs(houses) do if coord.x >= house.lower.x and coord.x <= house.upper.x and coord.y >= house.lower.y and coord.y <= house.upper.y and coord.z >= house.lower.z and coord.z <= house.upper.z then return true, house.name end end for _, house in pairs(housing.propertyTable) do local deed = house[3] local name = house[1] if coord == deed then return true, name end end return false end local function coordBelongsToScripts(coord) local scriptPositions = { {pos = gmlectern.pos, info = "GM Lectern"}, {pos = treasure.pos, info = "Treasure respawn tracker"}} for _, thePos in pairs(houseUtility.townManagmentItemPos) do table.insert(scriptPositions, {pos = thePos, info = "Town management tool"}) end for _, thePos in pairs(scriptPositions) do if coord == thePos.pos then return true, thePos.info end end return false end local function openListOfScannedTiles(user) local title = "Persistent Tile Categories" local description = "Select what category of persistent tiles you are interested in." local callback = function(dialog) local success = dialog:getSuccess() if not success then return end local selected = dialog:getSelectedIndex()+1 local category = false if selected == 1 then category = "All" elseif selected == 2 then selectProperty(user) elseif selected == 3 then category = "Scripts" elseif selected == 4 then category = "Unknown" end if category then listAllTilesOfCategory(user, category) end end local dialog = SelectionDialog(title, description, callback) dialog:addOption(0, "All") dialog:addOption(0, "Housing") dialog:addOption(0, "Scripts") dialog:addOption(0, "Unknown") user:requestSelectionDialog(dialog) end local function scanArea(user, layer) if not layer then layer = user.pos.z else layer = tonumber(layer) end local coordsToCheck = {} for x = 0, 1024 do for y = 0, 1024 do local coordToCheck = position(x, y, layer) if world:isPersistentAt(coordToCheck) then local category = "Unknown" local details = "Unknown" local isHousing, propertyName = coordBelongsToHousing(coordToCheck) if isHousing then category = "Housing" details = propertyName end local isScript, info = coordBelongsToScripts(coordToCheck) if isScript then category = "Scripts" details = info end table.insert(coordsToCheck, {pos = coordToCheck, cat = category, more = details}) end end end for _, coordToCheck in pairs(coordsToCheck) do local insertNewCoord = true for _, persistentTile in pairs(persistentTiles) do if persistentTile.pos == coordToCheck.pos then insertNewCoord = false --already scanned before break end end if insertNewCoord then table.insert(persistentTiles, coordToCheck) end end openListOfScannedTiles(user) end local function selectLayer(user) local callback = function (dialog) if not dialog:getSuccess() then return end local input = dialog:getInput() if (string.find(input,"(%d+)") ~= nil) then local _, _, layer = string.find(input,"(%d+)") scanArea(user, layer) end end user:requestInputDialog(InputDialog("Persistence Tracker", "Input the layer you want to scan. It must be a number." ,false, 255, callback)) end function M.listPersistenceInArea(user) local option1 = "View the list of already scanned tiles.(No lag)" local option2 = "Scan your current layer for persistent tiles(Will cause lag)" local option3 = "Specify a layer to scan for persistent tiles(Will cause lag)" local title = "Persistence Tracker" local description = "Since the last reload, "..#persistentTiles.." persistent tiles have been scanned and added to the list." local callback = function(dialog) local success = dialog:getSuccess() if not success then return end local selected = dialog:getSelectedIndex()+1 if selected == 1 then openListOfScannedTiles(user) elseif selected == 2 then scanArea(user) elseif selected == 3 then selectLayer(user) end end local dialog = SelectionDialog(title, description, callback) dialog:addOption(0, option1) dialog:addOption(0, option2) dialog:addOption(0, option3) user:requestSelectionDialog(dialog) end return M