Introdução
Esse é um sistema que consiste na administração pelo usuário (gamemaster, gods e etc) de locais, ou seja, a fácil ida de um local a outra que pode ser (ou não) distante e com isso, facilitar a vida de todo mundo.
Instruções
O script se trata de uma talkaction, e a sintaxe dela é o seguinte:
-
!set "Nome do local
-
!unset "Nome do local
-
!teleport "Nome do local
Além disso, é requerido que se crie uma tabela no banco de dados para guardar-se os nomes de cada local.
Tabela: Teleports
Campos: pos, name
Observações
O script utiliza-se da biblioteca LuaSQL, presente no servidor The Forgotten Server. Portanto, só funcionará em tal versão (a não ser que você tenha uma versão com tal biblioteca).
O script não foi testado, mas tenho 90% de certeza de que irá funcionar.
Estou liberando talk código, pois desenvolvi o mesmo usando apenas tabelas para mim mesmo, e que seria interessante para fins didáticos à se compreender o uso de LuaSQL.
Código
talkactions.xml
<talkaction words="!set" script="teleporter.lua" /> <talkaction words="!unset" script="teleporter.lua" /> <talkaction words="!teleport" script="teleporter.lua" />
teleporter.lua
local ITEM_TELEPORT = 1387 dofile('./config.lua') env = assert(luasql.mysql()) connect = assert(env:connect(mysqlDatabase, mysqlUser, mysqlPass, mysqlHost, mysqlPort)) Waypoint = { -- pos here should be a table (e.g: {x = 10, y = 10, z = 10} set = function (pos, name) if (string.find(name, '^[a-zA-Z0-9 -_]+$')) then debugPrint('[Waypoint System] Wrong characteres to the name of waypoint.') return FALSE end local cursor = assert(connect:execute("SELECT * FROM `teleports` WHERE `pos` = " .. pos .. ";")) if (cursor:numrows() > 0) then local query = assert(connect:execute("UPDATE `teleports` SET `pos` = " .. pos .. " WHERE `name` = " .. name .. ");")) return TRUE else local query = assert(connect:execute("INSERT INTO `teleports` (`pos`, `name`) VALUES (" .. pos .. ", " .. name .. ");")) return TRUE end end, unset = function (pos) local cursor = assert(connect:execute("SELECT * FROM `teleports` WHERE `pos` = " .. pos .. ";")) if (cursor:numrows() > 0) then local query = assert(connect:execute("DELETE FROM `teleports` WHERE `pos ` = " .. pos ";")) return TRUE else return FALSE end end, get = function (name) local cursor = assert(connect:execute("SELECT * FROM `teleports` WHERE `name` = " .. name .. ";")) local arr = {} if (cursor:numrows() > 0) then cursor:fetch(arr) position = arr[1] return position else return FALSE end end } onSay = function (cid, words, param) local playerPos, playerDir = getCreaturePosition(cid), getPlayerLookDir(cid) if (string.find(param, '^[a-zA-Z0-9 -_]+$')) then if (words == "!set") then Waypoint.set(playerPos, param) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "New waypoint: " .. param .. " ( " .. playerPos .. ").") elseif (words == "!unset") then Waypoint.unset(playerPos) else local posTo = Waypoint.get(param) local pos if (playerDir == NORTH) then pos = {x = playerPos.x , y = playerPos.y + 1, z = playerPos.z, stackpos = 253} elseif (playerDir == SOUTH) then pos = {x = playerPos.x, y = playerPos.y - 1, z = playerPos.z, stackpos = 253} elseif (playerDir == EAST) then pos = {x = playerPos.x + 1, y = playerPos.y, z = playerPos.z, stackpos = 253} elseif (playerDir == WEST) then pos = {x = playerPos.x - 1, y = playerPos.y, z = playerPos.z, stackpos = 253} else debugPrint('[Waypoint System] Wrong direction spoted.') end local doCreateTeleport(ITEM_TELEPORT, pos, posTo) --doTeleportThing(cid, position) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Teleported to waypoint " .. param .. " ( " .. posTo .. ").") end end end
Créditos
Os créditos são totalmente meus, Nostradamus.