Soporte ✅ Script de puerta/door

T

Tibiarl2

Invitado
Hola a toda la comunidad! vengo a pedir un script ya que no tengo conocimiento como para hacerlo, lo que necesito es que una puerta pida XXX objeto al entrar y se pueda usar cada 24 horas, yo encontrado pero creo que el script es antiguo y por eso no funciona.

lo instalado de la siguiente manera data/scripts/actions creas un archivo llamado door_event_test.lua y ahora ponemos el script


Código:
local aid_of_door = 5143 -- ActionID of all VIP Doors.
local ITEMID_OF_ITEM = 37317
local COUNT_OF_ITEM = 1

-- DO NOT EDIT BELOW THIS LINE
function onUse(cid, item, fromPosition, itemEx, toPosition)
   if(item.actionid == aid_of_door) then
      local stor = getPlayerStorageValue(cid, item.uid)
      if(stor < 1 or (stor+3600) <= os.time()) then
         local ret = doPlayerRemoveItem(cid, ITEMID_OF_ITEM, COUNT_OF_ITEM)
         if(ret) then
            setPlayerStorageValue(cid, item.uid, os.time())
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Entrastes Viembenido.")
            if(not doorEnter(cid, item, toPosition)) then return false end
         else
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Deves terner 60 Tokens.")
         end
      else
         if(not doorEnter(cid, item, toPosition)) then return false end
      end
   end
   return true
end

function doorEnter(cid, item, toPosition)
 
   local mob = getTopCreature(toPosition); if(mob.uid > 0) then return false end
   doTransformItem(item.uid, item.itemid + 1)
   doTeleportThing(cid, toPosition)
   return true
end

Pd: gracias por quien ayude y salu2
usando el servidor de 12.86 de esta comunidad

encontrado un script de alex este
Código:
local c = {
    ['item'] = 37317,  --- ID of the item
    ['cost'] = 1,  ---  Price
    ['amount'] = 1,  ---  Item Quantity
    uniqueID = 30000  ---  Unique Id , do not forget add it on remeres map editor and on the end of this script
}

local leverBuy = Action()
function leverBuy.onUse(player, item, fromPosition, itemEx, toPosition)
  local cid = player:getId()
    if player:removeMoneyNpc(c.cost) then
            doPlayerAddItem(cid, c.item, c.amount)
            doPlayerSendTextMessage(cid, 25,"You bought ".. c.amount .."x ".. getItemName(c.item).." for ".. c.cost .." gold")
    else
            player:sendTextMessage(MESSAGE_TRADE, "You do not have enough money!")
    end
  item:transform(c[item.itemid])
    return true
end

leverBuy:uid(30000) -- Unique id added on Remeres map editor
leverBuy:register()

a este script solo le faltaría tiempo de 24 horas y solucionar el error de consola

Código:
scriptInterface: [Scripts Interface]
scriptId: [C:\Canary_realmap_1286\data\scripts\actions\MysteryBox - copia.lua:callback]
timerEvent: []
 callbackId:[]
function: []
error [...realmap_1286\data\scripts\actions\MysteryBox - copia.lua:11: attempt to call method 'removeMoneyNpc' (a nil value)
stack traceback:
        [C]: in function 'removeMoneyNpc'
        ...realmap_1286\data\scripts\actions\MysteryBox - copia.lua:11: in function <...realmap_1286\data\scripts\actions\MysteryBox - copia.lua:9>]
[2022-28-05 19:54:49.176] [error] Lua script error:
scriptInterface: [Scripts Interface]
scriptId: [C:\Canary_realmap_1286\data\scripts\actions\MysteryBox - copia.lua:callback]
timerEvent: []
 callbackId:[]
function: []
error [...realmap_1286\data\scripts\actions\MysteryBox - copia.lua:11: attempt to call method 'removeMoneyNpc' (a nil value)
stack traceback:
        [C]: in function 'removeMoneyNpc'
        ...realmap_1286\data\scripts\actions\MysteryBox - copia.lua:11: in function <...realmap_1286\data\scripts\actions\MysteryBox - copia.lua:9>]
 
Última edición por un moderador:
Solución
T
bueno algo e conseguido que se pueda usar la puerta cada 24 hora, pero tengo es sistema montado meda un poco de pereza cambiar el inicio por si alguien le vale la solución me deja pasar cada 24 horas pero no pide un itemp algo es algo xD aquí os dejo es script es el de alex

Código:
local config = {
    cooldown = 60 * 60 * 24, -- in seconds - (Make it 'seconds * minutes * hours' - its will be '60 * 60 * 20' for 20 hours) (player cooldown)
    cooldown_storage = false,
    level_req = 50, -- minimo level requerido
    lever_id = 5129, -- id  de la puerta
}

local player_positions = {
    [1] = {fromPos = Position(31826, 32651, 7), toPos = Position(31828, 32651, 7)} -----posicion donde pide estar y ser teletransportado
}

local monsters...

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
Hola, por tu primer script, prueba:

Código:
local aid_of_door = 5143 -- ActionID of all VIP Doors.
local ITEMID_OF_ITEM = 37317
local COUNT_OF_ITEM = 1
local backDor = Action()
-- DO NOT EDIT BELOW THIS LINE
function backDor.onUse(cid, item, fromPosition, itemEx, toPosition)
   if(item.actionid == aid_of_door) then
      local stor = getPlayerStorageValue(cid, item.uid)
      if(stor < 1 or (stor+3600) <= os.time()) then
         local ret = doPlayerRemoveItem(cid, ITEMID_OF_ITEM, COUNT_OF_ITEM)
         if(ret) then
            setPlayerStorageValue(cid, item.uid, os.time())
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Entrastes Viembenido.")
            if(not doorEnter(cid, item, toPosition)) then return false end
         else
            doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Deves terner 60 Tokens.")
         end
      else
         if(not doorEnter(cid, item, toPosition)) then return false end
      end
   end
   return true
end

function doorEnter(cid, item, toPosition)
 
   local mob = getTopCreature(toPosition); if(mob.uid > 0) then return false end
   doTransformItem(item.uid, item.itemid + 1)
   doTeleportThing(cid, toPosition)
   return true
end
backDor:aid(5143) -- ActionID puerta
backDor:register()

Por el segundo script, entendi que quieres el level shop system pero con 24h, eso no sabria hacerlo.
Hay que agregarle una linea del os.time() 3600 pero no se hacerlo.
 
T

Tibiarl2

Invitado
funciona bien pero me empuja la puerta de nuevo hacia atrás lo e probado e varias puertas la mejor seria una de gateexp por que las otras quedan abiertas use la que use creo que lo ideal seria una ubicación a la ora de dar un click y gracias!
 

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
funciona bien pero me empuja la puerta de nuevo hacia atrás lo e probado e varias puertas la mejor seria una de gateexp por que las otras quedan abiertas use la que use creo que lo ideal seria una ubicación a la ora de dar un click y gracias!
Bueno, la puerta para que la quieres ?

Tan simple como ponerle en ActionID un numero y agregar ese numero en algo , reward, chest, npc, como a storage,
playerSetStorage(8491, 1)
Entonces en la puerta AID: 8491, solo los que habran conseguido el reward, chest, npc, o lo que sea con aid 8491 podran pasar la puerta.
Es mas facil de esta forma pienso.
 
T

Tibiarl2

Invitado
haber tengo un evento en el servidor y nose como ponerle tiempo y que pida la moneda pense que una puerta seria mas rapido para que la gente no pueda hacer el evento todo el dia
 

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
haber tengo un evento en el servidor y nose como ponerle tiempo y que pida la moneda pense que una puerta seria mas rapido para que la gente no pueda hacer el evento todo el dia

Mira,

Copia este script en tu data/scripts ( si usas un TFS 1.3 con revscripts )


Borra esta parte:

local monsters = {
[1] = {pos = Position(31751, 31884, 11), name = "Spider King"},
[2] = {pos = Position(31793, 31885, 11), name = "Abyssal Hydra"},
[3] = {pos = Position(31834, 31886, 11), name = "Purple Dragon"}
}

dejandola asi:

local monsters = {
}


Local Position Players,
local player_positions = {
[1] = {fromPos = Position(32215, 32289, 6), toPos = Position(31746, 31889, 7)}
}

De donde hacia a donde, puedes seguir agregando [2]....
Y lo que haces tu evento lo configuras con palanca de 1-4 o 1-5 o 1-10 jugadores si quieres,

Y Aqui el tiempo:
cooldown = 60 * 60 * 24, -- in seconds - (Make it 'seconds * minutes * hours' - its will be '60 * 60 * 20' for 20 hours) (player cooldown)

Primera linea *24 = 24 h, bajalo para que sean 10, 10h, o 2h.

Con eso quitas el accesso en tu mapa al evento y lo pones con palanca y que aparezcan ahi dentro,
Ps: dentro agregas un teleport de salida y listo o bien , agregas un TP a un monstruo una vez matado ( script en el foro ).
 
T

Tibiarl2

Invitado
te voy a explicar un poco mas y mostrarte una foto Sin título.png

como decía el evento funciona bien da los premios al ultimo player la cosa es que se puede hacer todas las veces que quieras sin limite, he hay lo de la puerta si aun opinas que el script me puede funcionar me pongo a instalarlo ahora mismo, pero veo muchas funciones que no se si podrá valer, espero tu opinión

pd: si quieres que pase algún archivo del evento puedo mostrarlo no hay problema
 
Última edición por un moderador:

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
te voy a explicar un poco mas y mostrarte una foto Ver archivo adjunto 2724

como decía el evento funciona bien da los premios al ultimo player la cosa es que se puede hacer todas las veces que quieras sin limite, he hay lo de la puerta si aun opinas que el script me puede funcionar me pongo a instalarlo ahora mismo, pero veo muchas funciones que no se si podrá valer, espero tu opinión

pd: si quieres que pase algún archivo del evento puedo mostrarlo no hay problema

Digamos que el script que te mandé, es como el script de la palanca del evento.
Lo unico que tiene un storage y tiempo.
En ese caso, ahi en ese mapa que tienes, no hagas ninguna entrada en el mapa, solo una salida, quita la puerta ( porqué usar un item ? si lo puedes hacer con storage ).
Agregas las 4 gloowing switch y una palanca, ejemplo en thais ? De entrada al evento y pones el tiempo como indicado en el post anterior, acceden a esa isla por ejemplo 1 vez al dia y activan la palanca, listo.
Si quieres que sea cada 3h, pues en vez de 60 * 60 * 24 pones 60 * 60 * 3 y ya.

Pienso que es la manera más fácil de montarlo, el mapa lo dejas como lo tienes, remueves la puerta, remueves el accesso a esa isla ( donde esta el TP para ir también ) y agregas en vez del TP una palanca y 4 baldosas.
 
T

Tibiarl2

Invitado
bueno algo e conseguido que se pueda usar la puerta cada 24 hora, pero tengo es sistema montado meda un poco de pereza cambiar el inicio por si alguien le vale la solución me deja pasar cada 24 horas pero no pide un itemp algo es algo xD aquí os dejo es script es el de alex

Código:
local config = {
    cooldown = 60 * 60 * 24, -- in seconds - (Make it 'seconds * minutes * hours' - its will be '60 * 60 * 20' for 20 hours) (player cooldown)
    cooldown_storage = false,
    level_req = 50, -- minimo level requerido
    lever_id = 5129, -- id  de la puerta
}

local player_positions = {
    [1] = {fromPos = Position(31826, 32651, 7), toPos = Position(31828, 32651, 7)} -----posicion donde pide estar y ser teletransportado
}

local monsters = {
}
local quest_range = {}

local firstDungeon = Action()

function doResetTheBossDukeKrule(position, cid_array)
 
    local tile = Tile(position)
 
    local item = tile and tile:getItemById(config.pulled_id)
    if not item then
        return
    end
 
    local monster_names = {}
    for key, value in pairs(monsters) do
        if not isInArray(monster_names, value.name) then
            monster_names[#monster_names + 1] = value.name
        end
    end
 
    for i = 1, #monsters do
        local creatures = Tile(monsters[i].pos):getCreatures()
        for key, creature in pairs(creatures) do
            if isInArray(monster_names, creature:getName()) then
                creature:remove()
            end
        end
    end
 
    for i = 1, #player_positions do
        local creatures = Tile(player_positions[i].toPos):getCreatures()
        for key, creature in pairs(creatures) do
            if isInArray(monster_names, creature:getName()) then
                creature:remove()
            end
        end
    end
 
    item:transform(config.lever_id)
end

function firstDungeon.onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if player:getStorageValue(config.cooldown_storage) >= os.time() then
        player:sendTextMessage(MESSAGE_INFO_DESCR, "Try Again in 24 Hours.")
        return true
    end
 
 
    local participants, pull_player = {}, false
    for i = 1, #player_positions do
        local fromPos = player_positions[i].fromPos
        local tile = Tile(fromPos)
        if not tile then
            print(">> ERROR: First Dungeon tile does not exist for Position(" .. fromPos.x .. ", " .. fromPos.y .. ", " .. fromPos.z .. ").")
            return player:sendCancelMessage("There is an issue with this quest. Please contact an administrator.")
        end
 
        local creature = tile:getBottomCreature()
        if creature then
            local participant = creature:getPlayer()
            if participant:getLevel() < config.level_req then
                return player:sendCancelMessage(participant:getName() .. " is not the required level.")
            end
 
            if participant.uid == player.uid then
                pull_player = true
            end
 
            participants[#participants + 1] = {participant = participant, toPos = player_positions[i].toPos}
        end
    end
 
 
    if not pull_player then
        return player:sendCancelMessage("You are in the wrong position.")
    end
 
    for i = 1, #monsters do
        local toPos = monsters[i].pos
        if not Tile(toPos) then
            print(">> ERROR: First Dungeon tile does not exist for Position(" .. toPos.x .. ", " .. toPos.y .. ", " .. toPos.z .. ").")
            return player:sendCancelMessage("There is an issue with this quest. Please contact an administrator.")
        end
        removeBoss()
        Game.createMonster(monsters[i].name, monsters[i].pos, false, true)
    end
 
    local cid_array = {}
 
    item:transform(config.pulled_id)
    player:setStorageValue(config.cooldown_storage, os.time() + config.cooldown)
    addEvent(doResetTheBossDukeKrule, config.duration * 60 * 60000,  toPosition, cid_array)
    return true
end

firstDungeon:uid(41392)
firstDungeon:register()

en el rme usáis este numero en la puerta 41392

después de hablar usado 20:54 Try Again in 24 Hours.
ahora mirando no creo que esto tenga que estar a sin
Código:
cooldown_storage = false,
811381 y quitar false no? XD
 
Última edición por un moderador:

Alex

Miembro del equipo
Webdesigner
LV
58
 
Awards
38
bueno algo e conseguido que se pueda usar la puerta cada 24 hora, pero tengo es sistema montado meda un poco de pereza cambiar el inicio por si alguien le vale la solución me deja pasar cada 24 horas pero no pide un itemp algo es algo xD aquí os dejo es script es el de alex

Código:
local config = {
    cooldown = 60 * 60 * 24, -- in seconds - (Make it 'seconds * minutes * hours' - its will be '60 * 60 * 20' for 20 hours) (player cooldown)
    cooldown_storage = false,
    level_req = 50, -- minimo level requerido
    lever_id = 5129, -- id  de la puerta
}

local player_positions = {
    [1] = {fromPos = Position(31826, 32651, 7), toPos = Position(31828, 32651, 7)} -----posicion donde pide estar y ser teletransportado
}

local monsters = {
}
local quest_range = {}

local firstDungeon = Action()

function doResetTheBossDukeKrule(position, cid_array)
 
    local tile = Tile(position)
 
    local item = tile and tile:getItemById(config.pulled_id)
    if not item then
        return
    end
 
    local monster_names = {}
    for key, value in pairs(monsters) do
        if not isInArray(monster_names, value.name) then
            monster_names[#monster_names + 1] = value.name
        end
    end
 
    for i = 1, #monsters do
        local creatures = Tile(monsters[i].pos):getCreatures()
        for key, creature in pairs(creatures) do
            if isInArray(monster_names, creature:getName()) then
                creature:remove()
            end
        end
    end
 
    for i = 1, #player_positions do
        local creatures = Tile(player_positions[i].toPos):getCreatures()
        for key, creature in pairs(creatures) do
            if isInArray(monster_names, creature:getName()) then
                creature:remove()
            end
        end
    end
 
    item:transform(config.lever_id)
end

function firstDungeon.onUse(player, item, fromPosition, target, toPosition, isHotkey)
    if player:getStorageValue(config.cooldown_storage) >= os.time() then
        player:sendTextMessage(MESSAGE_INFO_DESCR, "Try Again in 24 Hours.")
        return true
    end
 
 
    local participants, pull_player = {}, false
    for i = 1, #player_positions do
        local fromPos = player_positions[i].fromPos
        local tile = Tile(fromPos)
        if not tile then
            print(">> ERROR: First Dungeon tile does not exist for Position(" .. fromPos.x .. ", " .. fromPos.y .. ", " .. fromPos.z .. ").")
            return player:sendCancelMessage("There is an issue with this quest. Please contact an administrator.")
        end
 
        local creature = tile:getBottomCreature()
        if creature then
            local participant = creature:getPlayer()
            if participant:getLevel() < config.level_req then
                return player:sendCancelMessage(participant:getName() .. " is not the required level.")
            end
 
            if participant.uid == player.uid then
                pull_player = true
            end
 
            participants[#participants + 1] = {participant = participant, toPos = player_positions[i].toPos}
        end
    end
 
 
    if not pull_player then
        return player:sendCancelMessage("You are in the wrong position.")
    end
 
    for i = 1, #monsters do
        local toPos = monsters[i].pos
        if not Tile(toPos) then
            print(">> ERROR: First Dungeon tile does not exist for Position(" .. toPos.x .. ", " .. toPos.y .. ", " .. toPos.z .. ").")
            return player:sendCancelMessage("There is an issue with this quest. Please contact an administrator.")
        end
        removeBoss()
        Game.createMonster(monsters[i].name, monsters[i].pos, false, true)
    end
 
    local cid_array = {}
 
    item:transform(config.pulled_id)
    player:setStorageValue(config.cooldown_storage, os.time() + config.cooldown)
    addEvent(doResetTheBossDukeKrule, config.duration * 60 * 60000,  toPosition, cid_array)
    return true
end

firstDungeon:uid(41392)
firstDungeon:register()

en el rme usáis este numero en la puerta 41392

después de hablar usado 20:54 Try Again in 24 Hours.
ahora mirando no creo que esto tenga que estar a sin
Código:
cooldown_storage = false,
811381 y quitar false no? XD

Claro , en el calso que quieras un Storage, pondras 75465, el numero que quieras ( mientras esté disponible ) en tu servidor y, que no sea un storage usada en otra puerta.
El script no es mio, es de otra persona.
 
T

Tibiarl2

Invitado
vale y gracias por la paciencia esperare a mañana, si me deja usar cada 24 horas y intentare añadirle que pida el ítem y lo compartiré no funciono el script
 
Última edición por un moderador:
Arriba