Tutorial Script a Revscript ( para TFS 1.x )

Alex

Administrator
Dev
Messages
2,352
Points
707
Hola a todos,

Hoy veremos como convertir un script TFS 1.0, 1.2 a Revscript TFS 1.3.
En principal, TFS 1.x porqué si es de una version antigua, algunas funciones son totalmente cambiadas, entonces aquí suponemos que habéis encontrado un script por internet, en el caso del ejemplo cogeremos, la talkaction !bless para TFS 1.2,

Code:
function onSay(cid)

    local player = Player(cid)
    local totalBlessPrice = getBlessingsCost(player:getLevel()) * 5 * 0.7

    if player:getBlessings() == 5 then
                player:sendCancelMessage("You already have been blessed!", cid)
            elseif player:removeMoney(totalBlessPrice) then
                player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have been blessed by all of eight gods!")
                for b = 1, 8 do
                    player:addBlessing(b, 1)
                end
                player:getPosition():sendMagicEffect(CONST_ME_HOLYAREA)

            else
                player:sendCancelMessage("You don't have enough money. You need " .. totalBlessPrice .. " to buy bless.", cid)
            end
end

En este caso, primero que todo, si lo queremos integrar a nuestro servidor y registrarlo en el mismo fichero, debemos primeramente saber de que se trata, en este caso es una talkaction, entonces para saber como empezar a modificarlo, iremos en nuestro servidor en data/scripts/talkaction y abriremos uno al azar.

Veremos que al principio del script tenemos:
Code:
local zBless = TalkAction ("!Bless")
Entonces esto sera la funcion que añadiremos arriba del todo de nuestro script, quedaría asi:
Code:
local zBless = TalkAction ("!Bless")

function onSay(cid)

    local player = Player(cid)

Luego iremos a buscar la función, donde empezara el script:
Code:
function onSay(cid)

    local player = Player(cid)

entonces después de la palabra
Code:
function
ya puede ser onSay, onUse u otros, añadiremos el nombre que hemos elegido al principio en
Code:
 local zBless
seguido de un punto antes del onSay;

Code:
function zBless.onSay(cid)

Después nos iremos al final del script ( si no hay otra function en el script, porqué en este caso le añadiremos también esa palabra con un punto antes del onSay ) registraremos el script;
Code:
zBless:separator(" ")
zBless:register()

Y entonces quedaría así:
Code:
local zBless TalkAction = ("!Bless")
function zBless.onSay(cid)

    local player = Player(cid)
    local totalBlessPrice = getBlessingsCost(player:getLevel()) * 5 * 0.7

    if player:getBlessings() == 5 then
                player:sendCancelMessage("You already have been blessed!", cid)
            elseif player:removeMoney(totalBlessPrice) then
                player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have been blessed by all of eight gods!")
                for b = 1, 8 do
                    player:addBlessing(b, 1)
                end
                player:getPosition():sendMagicEffect(CONST_ME_HOLYAREA)

            else
                player:sendCancelMessage("You don't have enough money. You need " .. totalBlessPrice .. " to buy bless.", cid)
            end
end

zBless:separator(" ")
zBless:register()

Y tendremos nuestro script registrado, haremos la prueba y funcionara, tomen nota como dicho eso es valido para un script TFS 1.0 o TFS 1.2 únicamente.
Siempre mirar de que se trata el script, Action, Movement, TalkAction u otro, coger un script de ejemplo en su propia carpeta y registrarlo idénticamente.
Puede que algún script no funcione, es muy raro, hasta aquí encontré solamente uno que no funcionaba, un estilo de scroll portal.

Esto es valido, también en el otro sentido, es decir si deseamos retrogradar un Revscript a Script, es possible hacerlo quitando todo lo que se ha añadido,
Hara falta únicamente, añadir las lineas en el fichero .xml en función del script elegido.


Otras funciones:

Para una Action será:
local nombreAction = Action()
En , la función on, seguido de un término ejemplo onUse, pondremos nombreAction.onUse
Y al final del script registraremos:
nombreAction:id(itemId) -- itemId el número del item
nombreAction:register()

Lo mismo si es un creatureEvent, o globalEvent, lo mejor es fijarse en un script existente para saber las 4 partes que incorporar.
Pueden haber algunos cambios ejemplo:
En un script informará y nos dará error 'doplayer...' significa que la función en el archivo compat.lua no existe por lo cual nos da un error, en ese caso habría que buscar la nueva función en el compat.lua o bien agregarla en el compat.lua la vieja función.
 
Last edited:
Hola Alex segui tus instrucciones, saque esto de una de las quest del tibia rl, lo pongo en actions pero me da error:

local stone1 Action = ()
function stone1.onUsePick(player, item, fromPosition, target, toPosition, isHotkey)

local stonePos = Position(822, 1033, 7)
if (toPosition == stonePos) then
local tile = Tile(stonePos)
local stone = tile:getItemById(1842)
if stone then
stone:remove(1)
toPosition:sendMagicEffect(CONST_ME_POFF)
addEvent(function()
Game.createItem(1842, 1, stonePos)
end, 20000)
end
end
end
end
end

stone1:register()
 
Hola Alex segui tus instrucciones, saque esto de una de las quest del tibia rl, lo pongo en actions pero me da error:
Hola,
Esto es una action por lo cual,
Antes del stone1:register() deberías de poner stone1:id(item id) en item id pon la id del item que al usar hará esa action.
 
Hola,
Esto es una action por lo cual,
Antes del stone1:register() deberías de poner stone1:id(item id) en item id pon la id del item que al usar hará esa action.
stone1.jpg

me sale este error, deveria poner algo entre los parentesis o los borro?
 
perdon eso no era, el error es este:
022-27-08 13:25:02.032] [error] stone1.lua
[2022-27-08 13:25:02.032] [error] ...ot pruebas\Otservbr_1584\data\scripts\actions\stone1.lua:19: 'end' expected (to close 'function' at line 3) near '<eof>'

lo que no lo entiendo porque si le pongo el end ahi es peor XD
local stone1 = Action()

function stone1.onUsePick(player, item, fromPosition, target, toPosition, isHotkey)
local stonePos = Position(822, 1033, 7)
if (toPosition == stonePos) then
local tile = Tile(stonePos)
local stone = tile:getItemById(1842)
if stone then
stone:remove(1)
toPosition:sendMagicEffect(CONST_ME_POFF)
addEvent(function()
Game.createItem(1842, 1, stonePos)
end, 20000)
end
end

stone1:id(9594)
stone1:register()
 

perdon eso no era, el error es este:
022-27-08 13:25:02.032] [error] stone1.lua
[2022-27-08 13:25:02.032] [error] ...ot pruebas\Otservbr_1584\data\scripts\actions\stone1.lua:19: 'end' expected (to close 'function' at line 3) near '<eof>'

lo que no lo entiendo porque si le pongo el end ahi es peor XD
Prueba, te faltaba end antes de empezar el próximo if.
Code:
local stone1 = Action()

function stone1.onUsePick(player, item, fromPosition, target, toPosition, isHotkey)
local stonePos = Position(822, 1033, 7)
if (toPosition == stonePos) then
local tile = Tile(stonePos)
local stone = tile:getItemById(1842)
end
if stone then
stone:remove(1)
toPosition:sendMagicEffect(CONST_ME_POFF)
addEvent(function()
Game.createItem(1842, 1, stonePos)
end, 20000)
end
end

stone1:id(9594)
stone1:register()
 
Top