Ir para conteúdo

Master Teleporter


Nostradamus

Posts Recomendados

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.

Editado por Nostradamus
Link para o comentário
Compartilhar em outros sites

  • 4 weeks later...

Nem comento.

Simplesmente Perfeito.

 

Nostradamus e seus scripts haha

 

Não é para menos também né.

 

Não é atoa que ele é:

Programador PHP/C/C++/JAVA/LUA

Scripter oficial da OpenTibia Team, criadora do OpenTibia.

 

 

uhasuhsahusa

 

Parabens ai nostra.

 

Fui

 

ps:

Pena que é só para sql's version =/

Editado por Skulls
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...