Postado Fevereiro 6, 2023 2 anos Boa tarde galera do tk, estou precisando de uma ajuda, o sistema funciona da seguinte forma é uma estatua que voce clica e é teleportado pra x local para fazer a quest em 3 sqm só na vertical, ai ao clicar você é teleportado nasce um monstro na sua frente ( obs: caso alguem tente entrar na quest não vai conseguir, caso tente aparece uma mensagem na parte de baixo ( nao no chat ) avisando que tem jogador la dentro. ) Ai apos matar o monstro atras dele tem outra estatua que quando vc clica vc ganha x item e é teleportado para cima novamente! Esta quest é possivel entrar sempre porém o item só ganha uma vez! TFS 0.3.6 Editado Fevereiro 6, 2023 2 anos por Straikar (veja o histórico de edições)
Postado Fevereiro 15, 2023 2 anos Em 06/02/2023 em 17:21, Straikar disse: Boa tarde galera do tk, estou precisando de uma ajuda, o sistema funciona da seguinte forma é uma estatua que voce clica e é teleportado pra x local para fazer a quest em 3 sqm só na vertical, ai ao clicar você é teleportado nasce um monstro na sua frente ( obs: caso alguem tente entrar na quest não vai conseguir, caso tente aparece uma mensagem na parte de baixo ( nao no chat ) avisando que tem jogador la dentro. ) Ai apos matar o monstro atras dele tem outra estatua que quando vc clica vc ganha x item e é teleportado para cima novamente! Esta quest é possivel entrar sempre porém o item só ganha uma vez! TFS 0.3.6 fiz um script que da pra colocar mais de um monstro e recompensas pra cada um no mesmo script vá em: data/actions/actions.xml <action actionid="ACTIOND-ID-DA-ESTATUA;ACTIONID;ACTIONID" script="questVertical.lua" /> INSIRA TODOS os actions ID das estatus, tanto das de entrada (clica pra entrar na sala), como as de recompensa ps: se for em sequencia, tipo 5001,5002,5003... só é necessário colocar o primeiro e o ultimo, ex: 5001-5003, porém PRESTE BASTANTE ATENÇÃO! Agora vá em: data/actions/scripts/questVertical.lua (caso não exista pode criar e excluir os scripts antigos dessa quest) e copie esse código dentro: --[[ SCRIPT FEITO POR FEETADS - TIBIAKING ]]-- --[[straikar - 15/02/23]]-- / discord: FeeTads#0246 local config = { -- actions ID da estatua da entrada [25486] = {storage_timer = 5341352, posPlayer = {x = 1000, y = 1000, z = 7}, monster_name = "Papao", posMonstro = {x = 1000, y = 1000, z = 7}, posSaida = {x = 1000, y = 1000, z = 7}, fromP={x = 931, y = 1270, z = 9}, toP={x = 936, y = 1276, z = 9}}, [25487] = {storage_timer = 5341353, posPlayer = {x = 1001, y = 1001, z = 7}, monster_name = "Papao2", posMonstro = {x = 1001, y = 1001, z = 7}, posSaida = {x = 1001, y = 1001, z = 7}, fromP={x = 931, y = 1270, z = 9}, toP={x = 936, y = 1276, z = 9}}, -- caso queira colocar outros, só repetir ^ e mudar a storage, o action id e as posições etc.. use_cooldown_global = false, -- se vc colocar true aqui, TODAS as salas de quest onde o player tentar entrar, vão ter o mesmo cooldown ou seja 1 sala a cada 5 mins, se for false, pode entrar em outra sala logo em seguida storage_timer_global = 5341350, -- storage de exaust pra entrar de novo exaust_entrar_denovo = 5 * 60, -- 5*60 = 5 minutos need_level = 100, -- level necessário para entrar / caso não precise coloque 1 ou 8 remover_player_tempo = true, -- remover o player depois de tanto tempo la dentro? / evita o player ficar la trapando o dia todo remover_timer = 10*60, -- quando tempo la dentro pra remover? / 10*60 = 10 minutos } local REWARD = { --[action id] = {rewards = {{item, quantidade}, {item, quantidade}}}, -- pode colocar quantas rewards quiser [5032] = {storage_reward = 5441400, rewards = {{2160, 1}, {2148, 100}, {2152, 50}}}, [5033] = {storage_reward = 5441401, rewards = {{2160, 1}}}, -- quando diminuir a quantidadede recompensa, ceritifique que deixou certo a quantidade de {} pra n bugar o script repetir_reward = false, -- ganhar a recompensa sempre que fizer a quest? teleportar_final = {x=1000,y=1000,z=7}, -- pra onde teleportar quando ele clicar na estatua de recompensa? (normalmente eh o templo) } -- função de tempo local function getTimeString(self) local format = { {'dia', self / 60 / 60 / 24}, {'hora', self / 60 / 60 % 24}, {'minuto', self / 60 % 60}, {'segundo', self % 60} } local out = {} for k, t in ipairs(format) do local v = math.floor(t[2]) if(v > 0) then table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or '')) end end local ret = table.concat(out) if ret:len() < 16 and ret:find('segundo') then local a, b = ret:find(' e ') ret = ret:sub(b+1) end return ret end -- FUNÇÃO PARA KICKAR O PLAYER DA SALA APÓS TANTO TEMPO local function removePlayersTime(frompos, topos) for x = frompos.x, topos.x do for y = frompos.y, topos.y do local remove, clean = true, true local pos = {x = x, y = y, z = frompos.z} local m = getTopCreature(pos).uid if m ~= 0 and isPlayer(m) then doTeleportThing(m, getTownTemplePosition(1)) end end end return true end -- FUNÇÃO PARA REMOVER O BOSS AO KICKAR O PLAYER DA SALA local function verificaBoss(frompos, topos) for x = frompos.x, topos.x do for y = frompos.y, topos.y do if isMonster(getThingFromPos({x = x, y = y, z = frompos.z, stackpos = 253}).uid) then doRemoveCreature(getThingFromPos({x = x, y = y, z = frompos.z, stackpos = 253}).uid) end end end end local function give_reward(cid, entregar) local text = 'você recebeu ' -- string que salvará o nome das recompensas if entregar then -- existe as rewards? for i=1, #entregar do doPlayerAddItem(cid, entregar[i][1], entregar[i][2]) -- adiciona os item ao player text = text..entregar[i][2]..getItemNameById(entregar[i][1])..entregar[i][1] > 1 and "s" or "" if i == #entregar then text = text.."." -- caso seja o ultimo coloca ponto final else text = text..", " -- se não, bota virgula end end doPlayerSendTextMessage(cid, 22, text) end return true end local saveEvent = {} -- evento pra checkar o player na sala de espera function onUse(cid, item, frompos, itemEx, topos) local check = {} local actionID = item.actionid if config[actionID] then -- checa o cooldown e se pode entrar na sala if config.use_cooldown_global then if getPlayerStorageValue(cid, config.storage_timer_global) - os.time() > 0 then doPlayerSendCancel(cid, 'Aguarde, você ainda não pode entrar, está com cooldown de'..getTimeString(getPlayerStorageValue(cid, config.storage_timer_global) - os.time())..'.') return true end else if getPlayerStorageValue(cid, config[actionID].storage_timer) > 0 then doPlayerSendCancel(cid, 'Aguarde, você ainda não pode entrar, está com cooldown de'..getTimeString(getPlayerStorageValue(cid, config[actionID].storage_timer) - os.time())..'.') return true end end if #getPlayersInArea(config.[actionID].fromP, config.[actionID].toP) > 0 then doPlayerSendCancel(cid, 'Aguarde, tem jogadores la dentro.') return true end if getPlayerLevel(cid) < config.need_level then doPlayerSendCancel(cid, 'Você não tem o level necessário.') return true end -- caso tenha o level, e não tenha player la dentro, então faz a quest acontecer verificaBoss(config.[actionID].fromP, config.[actionID].to) -- remove o boss do antigo player caso haja doTeleportThing(cid, config[actionID].posPlayer) -- teleporta o player pra posição doCreateMonster(config[actionID].monster_name, config[actionID].posMonstro, false, true) -- cria o monstro na posição if config.remover_player_tempo then -- se remover o player depois de tanto tempo for true saveEvent[getPlayerGUID(cid)] = addEvent(function() removePlayersTime(config.[actionID].fromP, config.[actionID].toP) end, config.remover_timer * 1000) -- remover o player depois do tempo end if config.use_cooldown_global then setPlayerStorageValue(cid, config.storage_timer_global, os.time() + config.exaust_entrar_denovo) -- cooldown caso seja de todas as salas / n mexer else setPlayerStorageValue(cid, config[actionID].storage_timer, os.time() + config.exaust_entrar_denovo) -- cooldown pra entrar de novo / n mexer end return true end -- ESTATUA DE RECOMPENSA if REWARD[actionID] then -- caso tenha clicado na estatua de recompensa local entregar = REWARD[actionID].rewards if getPlayerStorageValue(cid, REWARD[actionID].storage_reward) == -1 then -- caso nunca tenha recebido a recompensa give_reward(cid, entregar) else -- caso ja tenha recebido if REWARD.repetir_reward then -- checa se pode repetir a recompensa give_reward(cid, entregar) else -- se não só da a mensagem q ja recebeu doPlayerSendTextMessage(cid, 22, "Você já recebeu sua recompensa.") end end doTeleportThing(cid, REWARD.teleportar_final) -- teleporta o player pra posição quando clicar na estatua de recompensa stopEvent(saveEvent[getPlayerGUID(cid)]) -- para o evento de jogar ele pro templo saveEvent[getPlayerGUID(cid)] = nil end return true end
Postado Fevereiro 16, 2023 2 anos Autor Não deu certo no actions.xml esta assim <action actionid="5001;5002" script="desafio2.lua" /> e na script assim local config = { -- actions ID da estatua da entrada [25486] = {storage_timer = 5341352, posPlayer = {x = 940, y = 1274, z = 9}, monster_name = "Papao", posMonstro = {x = 940, y = 1273, z = 9}, posSaida = {x = 941, y = 1277, z = 9}, fromP={x = 938, y = 1270, z = 9}, toP={x = 942, y = 1276, z = 9}}, [25487] = {storage_timer = 5341353, posPlayer = {x = 1001, y = 1001, z = 7}, monster_name = "Papao2", posMonstro = {x = 1001, y = 1001, z = 7}, posSaida = {x = 1001, y = 1001, z = 7}, fromP={x = 931, y = 1270, z = 9}, toP={x = 936, y = 1276, z = 9}}, -- caso queira colocar outros, só repetir ^ e mudar a storage, o action id e as posições etc.. use_cooldown_global = false, -- se vc colocar true aqui, TODAS as salas de quest onde o player tentar entrar, vão ter o mesmo cooldown ou seja 1 sala a cada 5 mins, se for false, pode entrar em outra sala logo em seguida storage_timer_global = 5341350, -- storage de exaust pra entrar de novo exaust_entrar_denovo = 5 * 60, -- 5*60 = 5 minutos need_level = 100, -- level necessário para entrar / caso não precise coloque 1 ou 8 remover_player_tempo = true, -- remover o player depois de tanto tempo la dentro? / evita o player ficar la trapando o dia todo remover_timer = 10*60, -- quando tempo la dentro pra remover? / 10*60 = 10 minutos } local REWARD = { --[action id] = {rewards = {{item, quantidade}, {item, quantidade}}}, -- pode colocar quantas rewards quiser [5002] = {storage_reward = 5441400, rewards = {{2160, 1}}}, [5033] = {storage_reward = 5441401, rewards = {{2160, 1}}}, -- quando diminuir a quantidadede recompensa, ceritifique que deixou certo a quantidade de {} pra n bugar o script repetir_reward = false, -- ganhar a recompensa sempre que fizer a quest? teleportar_final = {x=1000,y=1000,z=7}, -- pra onde teleportar quando ele clicar na estatua de recompensa? (normalmente eh o templo) } -- função de tempo local function getTimeString(self) local format = { {'dia', self / 60 / 60 / 24}, {'hora', self / 60 / 60 % 24}, {'minuto', self / 60 % 60}, {'segundo', self % 60} } local out = {} for k, t in ipairs(format) do local v = math.floor(t[2]) if(v > 0) then table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' e ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or '')) end end local ret = table.concat(out) if ret:len() < 16 and ret:find('segundo') then local a, b = ret:find(' e ') ret = ret:sub(b+1) end return ret end -- FUNÇÃO PARA KICKAR O PLAYER DA SALA APÓS TANTO TEMPO local function removePlayersTime(frompos, topos) for x = frompos.x, topos.x do for y = frompos.y, topos.y do local remove, clean = true, true local pos = {x = x, y = y, z = frompos.z} local m = getTopCreature(pos).uid if m ~= 0 and isPlayer(m) then doTeleportThing(m, getTownTemplePosition(1)) end end end return true end -- FUNÇÃO PARA REMOVER O BOSS AO KICKAR O PLAYER DA SALA local function verificaBoss(frompos, topos) for x = frompos.x, topos.x do for y = frompos.y, topos.y do if isMonster(getThingFromPos({x = x, y = y, z = frompos.z, stackpos = 253}).uid) then doRemoveCreature(getThingFromPos({x = x, y = y, z = frompos.z, stackpos = 253}).uid) end end end end local function give_reward(cid, entregar) local text = 'você recebeu ' -- string que salvará o nome das recompensas if entregar then -- existe as rewards? for i=1, #entregar do doPlayerAddItem(cid, entregar[i][1], entregar[i][2]) -- adiciona os item ao player text = text..entregar[i][2]..getItemNameById(entregar[i][1])..entregar[i][1] > 1 and "s" or "" if i == #entregar then text = text.."." -- caso seja o ultimo coloca ponto final else text = text..", " -- se não, bota virgula end end doPlayerSendTextMessage(cid, 22, text) end return true end local saveEvent = {} -- evento pra checkar o player na sala de espera function onUse(cid, item, frompos, itemEx, topos) local check = {} local actionID = item.actionid if config[actionID] then -- checa o cooldown e se pode entrar na sala if config.use_cooldown_global then if getPlayerStorageValue(cid, config.storage_timer_global) - os.time() > 0 then doPlayerSendCancel(cid, 'Aguarde, você ainda não pode entrar, está com cooldown de'..getTimeString(getPlayerStorageValue(cid, config.storage_timer_global) - os.time())..'.') return true end else if getPlayerStorageValue(cid, config[actionID].storage_timer) > 0 then doPlayerSendCancel(cid, 'Aguarde, você ainda não pode entrar, está com cooldown de'..getTimeString(getPlayerStorageValue(cid, config[actionID].storage_timer) - os.time())..'.') return true end end if #getPlayersInArea(config.[actionID].fromP, config.[actionID].toP) > 0 then doPlayerSendCancel(cid, 'Aguarde, tem jogadores la dentro.') return true end if getPlayerLevel(cid) < config.need_level then doPlayerSendCancel(cid, 'Você não tem o level necessário.') return true end -- caso tenha o level, e não tenha player la dentro, então faz a quest acontecer verificaBoss(config.[actionID].fromP, config.[actionID].to) -- remove o boss do antigo player caso haja doTeleportThing(cid, config[actionID].posPlayer) -- teleporta o player pra posição doCreateMonster(config[actionID].monster_name, config[actionID].posMonstro, false, true) -- cria o monstro na posição if config.remover_player_tempo then -- se remover o player depois de tanto tempo for true saveEvent[getPlayerGUID(cid)] = addEvent(function() removePlayersTime(config.[actionID].fromP, config.[actionID].toP) end, config.remover_timer * 1000) -- remover o player depois do tempo end if config.use_cooldown_global then setPlayerStorageValue(cid, config.storage_timer_global, os.time() + config.exaust_entrar_denovo) -- cooldown caso seja de todas as salas / n mexer else setPlayerStorageValue(cid, config[actionID].storage_timer, os.time() + config.exaust_entrar_denovo) -- cooldown pra entrar de novo / n mexer end return true end -- ESTATUA DE RECOMPENSA if REWARD[actionID] then -- caso tenha clicado na estatua de recompensa local entregar = REWARD[actionID].rewards if getPlayerStorageValue(cid, REWARD[actionID].storage_reward) == -1 then -- caso nunca tenha recebido a recompensa give_reward(cid, entregar) else -- caso ja tenha recebido if REWARD.repetir_reward then -- checa se pode repetir a recompensa give_reward(cid, entregar) else -- se não só da a mensagem q ja recebeu doPlayerSendTextMessage(cid, 22, "Você já recebeu sua recompensa.") end end doTeleportThing(cid, REWARD.teleportar_final) -- teleporta o player pra posição quando clicar na estatua de recompensa stopEvent(saveEvent[getPlayerGUID(cid)]) -- para o evento de jogar ele pro templo saveEvent[getPlayerGUID(cid)] = nil end return true end
Postado Fevereiro 18, 2023 2 anos Em 15/02/2023 em 21:22, Straikar disse: Não deu certo Não deu certo pq vc botou nome errado ou o arquivo no lugar errado, o próprio erro te falou isso. "no such file or directory" vc colocou no XML que o arquivo ta na raiz do actions data/actions/scripts/desafio2.lua < ele ta exatamente nesse diretório? pq a distro falou que não, se tiver dentro de pasta coloque o diretório correto <action actionid="5001;5002" script="PASTA/desafio2.lua" /> << caso esteja dentro de alguma pasta se atente a arrumar os action ID dentro do arquivo pois vai dar erro caso você n arrume. como esta no script -- actions ID da estatua da entrada [25486] = {...}, [25487] = {...}, mude esse action pro action da primeira estatua SE ATENTE BEM AOS ACTIONS
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.