Tutorial Script a Revscript ( para TFS 1.x )

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
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,

Código:
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:
Código:
local zBless = TalkAction ("!Bless")
Entonces esto sera la funcion que añadiremos arriba del todo de nuestro script, quedaría asi:
Código:
local zBless = TalkAction ("!Bless")

function onSay(cid)

    local player = Player(cid)

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

    local player = Player(cid)

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

Código:
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;
Código:
zBless:separator(" ")
zBless:register()

Y entonces quedaría así:
Código:
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.
 
Última edición:

neowtwo

Miembro
LV
19
 
Awards
18
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()
 

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
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.
 

neowtwo

Miembro
LV
19
 
Awards
18
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?
 

neowtwo

Miembro
LV
19
 
Awards
18
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()
 

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38

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.
Código:
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()
 
Arriba