Ir para conteúdo

marcot

Membro
  • Registro em

  • Última visita

Tudo que marcot postou

  1. Vá em data/movements/movements.xml e adicione a linha: <movevent event="StepIn" actionid="13541" script="outfit_tile.lua" /> Agora vá em data/movements/scripts e crie um arquivo chamado outfit_tile.lua e cole o seguinte código nele: local config = { actionID = 13541, outfit = {lookType = 75 , lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookAddons = 0}, -- Outfit time = 10 -- Tempo em segundos } function onStepIn(cid, item, pos) if isPlayer(cid) then if item.actionid == config.actionID then doSetCreatureOutfit(cid, config.outfit, config.time * 1000) end end end Para que funcione você deverá adicionar o actionID escolhido ao piso que você quer que execute o script, ou seja, terá que fazê-lo no Map Editor a princípio.
  2. Pelo que um amigo me disse as versões mais novas de Tibia você não consegue usar itens enquanto anda, só modificando a source.
  3. Eu estou achando que o que está bloqueando o uso enquanto anda não é o script, mas base C++.
  4. @Yamborghini Testa com esse script daqui: Em data/actions/scripts/ crie um arquivo chamado battle_royale.lua e cole dentro dele: local config = { uniqueID = 5000, -- Unique ID do ativador do evento (alavanca) maxPlayers = 1, -- Quantidade Z de jogadores necessaria entrada = { -- Z posicoes de entrada dos jogadores {x = 396, y = 1746, z = 9, stackpos = 253} }, saida = { -- Z posicoes de saida dos jogadores {x = 399, y = 1746, z = 9, stackpos = 253} }, timeSafe = 2000, -- timeSafe2 = 6000, -- Tempo para reduzir arenaMinPos = {x = 395, y = 1747}, -- Ponto inferior da arena (esquerda) arenaMaxPos = {x = 399, y = 1743}, -- Ponto superior da arena (direita) -- Deixar mesmos valores da arenaMinPos e arenaMaxPos safeMinPos = {x = 395, y = 1747}, safeMaxPos = {x = 399, y = 1743}, -- Dano causado pela playzone safeDamage_perTick = 2000, -- Efeito do dano causado pela playzone safeDamage_perTickEffect = 11, -- Configuracoes de Mensagens -- Mensagem exibida ao ser teleportado arenaMsg = "Voce foi enviado para a arena.", -- Mensagem exibida ao receber dano safeDmgMsg = "Voce sofreu dano pela playzone.", -- Lista de Itens "Airdrop" airdropID = 1740, listaItens = { -- Exemplo: {itemID, qt} {id = 2125, count = 1}, {id = 2195, count = 1} } } function onUse(cid, item, frompos, item2, topos) if item.uid == config.uniqueID then local players = {} -- Verifica se tem Z jogadores for i=1, config.maxPlayers do players[i] = getThingfromPos (config.entrada[i]) if isPlayer(players[i].uid) == FALSE then doPlayerSendTextMessage (cid, 22, "You need ".. config.maxPlayers .. " players.") return TRUE end end -- Teleporta os Z jogadores para a arena for i=1, config.maxPlayers do doSendMagicEffect(config.entrada[i], 2) doTeleportThing(players[i].uid, config.saida[i]) doPlayerSendTextMessage (players[i].uid, 22, config.arenaMsg) doSendMagicEffect(config.saida[i], 2) end addEvent (safeHurt, config.timeSafe2, players) addEvent (reduceSafe, config.timeSafe2, players) -- Adiciona um evento recursivo para reduzir a o tamanho da safe (reduceSafe) end return TRUE end function safeHurt (players) for i = 1, config.maxPlayers do player = players[i].uid if isInArena (player) then if isSafe (player) then else doPlayerSendTextMessage (player, 22, config.safeDmgMsg) doSendAnimatedText(getPlayerPosition(player), "-"..config.safeDamage_perTick, TEXTCOLOR_LIGHTBLUE) doPlayerAddHealth(player, -config.safeDamage_perTick) -- Dano da safe doSendMagicEffect(getPlayerPosition(player), 11) -- Efeito de dano da safe end end end addEvent (safeHurt, config.timeSafe2, players) return TRUE end function isInArena (player) -- Verifica se o jogador esta na arena playerPos = getPlayerPosition(player) if config.arenaMinPos.x <= playerPos.x and playerPos.x <= config.arenaMaxPos.x then if playerPos.y <= config.arenaMinPos.y and playerPos.y >= config.arenaMaxPos.y then return true end end return false end function isSafe (player) -- Verifica se o jogador esta na zona Safe playerPos = getPlayerPosition(player) if config.safeMinPos.x <= playerPos.x and playerPos.x <= config.safeMaxPos.x then if playerPos.y <= config.safeMinPos.y and playerPos.y >= config.safeMaxPos.y then return TRUE end end return false end -- Funcao utilizada para testes function isSafePos (playerPos) if config.safeMinPos.x <= playerPos.x and playerPos.x <= config.safeMaxPos.x then if playerPos.y <= config.safeMinPos.y and playerPos.y >= config.safeMaxPos.y then return TRUE end end return false end function reduceSafe (players) quadrante = math.random(1, 4) -- Nao consegui pensar num jeito pratico de reduzir a safe, entao vamos selecionar quadrantes da safe atual if quadrante == 1 then config.safeMinPos.y = (config.safeMinPos.y + config.safeMaxPos.y) / 2 config.safeMaxPos.x = (config.safeMinPos.x + config.safeMaxPos.x) / 2 elseif quadrante == 2 then config.safeMinPos.x = (config.safeMinPos.x + config.safeMaxPos.x) / 2 config.safeMinPos.y = (config.safeMinPos.y + config.safeMaxPos.y) / 2 elseif quadrante == 3 then config.safeMaxPos.x = (config.safeMinPos.x + config.safeMaxPos.x) / 2 config.safeMaxPos.y = (config.safeMinPos.y + config.safeMaxPos.y) / 2 else config.safeMaxPos.y = (config.safeMinPos.y + config.safeMaxPos.y) / 2 config.safeMinPos.x = (config.safeMinPos.x + config.safeMaxPos.x) / 2 end continue = FALSE -- Envia mensagem para todos os jogadores avisando a modificacao da safe for i=1, config.maxPlayers do if isInArena (players[i].uid) then local pos = getPlayerPosition(players[i].uid) doPlayerSendTextMessage (players[i].uid, 22, "Nova safe zone no quadrante ".. quadrante .. "!") continue = true end end airDropSpawn () if continue == true then -- Descomentar bloco se quiser checar a safe diminuindo --for i = config.arenaMaxPos.y, config.arenaMinPos.y do -- for j= config.arenaMinPos.x, config.arenaMaxPos.x do -- position = {x = j, y = i, z = 9} -- if isSafePos (position) then -- doSendMagicEffect(position, 35) -- else -- doSendMagicEffect(position, 36) -- end -- end --end addEvent (reduceSafe, config.timeSafe2, players) else return true end end function airDropSpawn () itemSorteado = math.random(1, #config.listaItens) airdrop = doCreateItem(config.airdropID, 1, {x = math.random(config.safeMinPos.x, config.safeMaxPos.x), y = math.random(config.safeMaxPos.y, config.safeMinPos.y), z = 9}) doAddContainerItem(airdrop, config.listaItens[itemSorteado].id, config.listaItens[itemSorteado].cont) end Depois, vá em data/actions/actions.xml e cole a seguinte linha: <action uniqueid="5000" script="battle_royale.lua" /> Como configurar os limites da arena: Estou sem o TFS 0.4 8.6, testei na distro Aries Server to Tibia 8.1 - Version 4.0 based on OTServ SVN Version 0.6.0 Como funciona:
  5. @dougshem procure quais são os scripts responsáveis por tal, então. Faça o seguinte: Vá para actions.xml e dê find do itemID do revive e da pokeball. Você terá algo assim: <action itemid="itemID" script="XXXX.lua" /> itemID é o id da Pokeball/Revive e XXXX é o caminho do script para sua respectiva função. Depois disso é só postar os scripts especificado pelo caminho do script que o @Gnius pediu. E esse server que você postou não é de pokémon, então é normal não achar...
  6. @Arrazado, Tente este script: Vá em data/actions/scripts/ e crie um arquivo X.lua (escolha um nome). Cole isto dentro do arquivo: local config = { uniqueID = 5000, -- Unique ID da alavanca playerA_pos = {x = 396, y = 1745, z = 9, stackpos=253}, -- Posicao do "Player A" que sera puxado error_msg = "Nao tem player do outro lado.", -- Mensagem de erro caso Player A nao esteja no SQM indicado playerA_posDestino = {x = 398, y = 1745, z = 9, stackpos=253} -- Posicao para a qual player A sera transportado } function onUse(cid, item, frompos, item2, topos) if item.uid == config.uniqueID and item.itemid == 1945 then player = getThingfromPos(config.playerA_pos) if player.itemid > 0 then doSendMagicEffect(config.playerA_pos, 2) doTeleportThing(player.uid, config.playerA_posDestino) doSendMagicEffect(config.playerA_posDestino, 2) else doPlayerSendTextMessage (cid, 22, config.error_msg) end doTransformItem(item.uid, item.itemid + 1) else doTransformItem(item.uid,item.itemid-1) end end Agora, vá em data/actions/actions.xml e cole isto: <action uniqueid="5000" script="X.lua" /> Caso não funcione, por favor, me mande sua versão do TFS. Espero ter ajudado!
  7. Vou tentar fazer aqui. Vai ter que ser tudo em um só script, porém, porque se não vai pesar muito. Não garanto que termino hoje a noite. Aproveitando, qual TFS está usando? [EDIT] Parte feita do script ate o momento, devo terminar amanhã se tudo der certo.
  8. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    Tenta esse aqui, eu usava no meu server 8.1, talvez dê certo. Pra ativar você tem que ter um item com o actionID no mapa e ativar quando o servidor iniciar. Vai em data/actions/scripts e cria um arquivo chamado tiles_effects.lua e cole isto nele: local velocidade = 3000 -- 3 segundos local function loop(valores) doSendMagicEffect({x=535, y=1574, z=7},31) -- Exemplo de efeito doSendAnimatedText({x=360, y=1672, z=6},"Cities!", TEXTCOLOR_LIGHTGREY) -- Exemplo de Texto addEvent(loop, velocidade, valore) -- Não remova isso end function onUse(cid, item, frompos, item2, topos) valore = {cid = cid, topos = topos} addEvent(loop, velocidade, valore) end Obs: Este script acima não pertence a mim, mas também não sei o nome do autor para dar os devidos créditos. E em data/actions/actions.xml cole isto: Onde XXXX é o actionid que você colocará no item que irá ativar o sistema. Para adicionar textos ou efeitos basta seguir os exemplos e adicioná-los no escopo da função "LOOP". doSendMagicEffect (posicao, efeito) doSendAnimatedText (posicao, texto, cor do texto)
  9. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    @Mateus Lagasse deu pra ver sim, os scripts não davam certo porque seu TFS é OTX, que aparentemente tem uma sintaxe dos scripts um pouco diferente dos demais. Tenta esse script: local config = { MESSAGE = "XXXX" -- mensagem exibida ao subir no sofa EFFECT = 36 -- efeito ao pisar } function onStepIn(creature, item, position, fromPosition) if creature:isPlayer() then position:sendMagicEffect(config.EFFECT) creature:sendTextMessage(MESSAGE_INFO_DESCR, config.MESSAGE) else return false end return true end Observações: Mantenha a mensagem entre aspas duplas ("exemplo").
  10. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    Olha nessa print, circulei em vermelho: TFS = The Forgotten Server
  11. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    Então o problema é sua versão do TFS , porque aqui funcionou normalmente. Qual sua versão?
  12. @Hokograma Com esse seu editor de PIC você não consegue extrair as imagens do PIC e editá-las (para depois recompilar)? Editando só aquele campo você mantém intacto o resto das coisas. Eu uso aqui o pic_editor_v21 by Trooper, mas não posso postar porque se não me engano o antivirus aponta ele como vírus. [EDIT] O programa extrai aquelas imagens ali de 0 a 6 a partir do tibia.pic e de pois disso é só alterar e pedir pra ele compilar o novo tibia.pic que aí já altera.
  13. Creio eu que dá pra você associar por este outro tibia.pic aqui: A mesma parte que tenho ali os itens em cinza/rosa (na parte superior, acima das barras de mana e HP) é a área que você deve modificar no seu, colocando os fundos de preferência).
  14. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    local config = { MESSAGE = "XXXX" -- mensagem exibida ao subir no sofa EFFECT = 36 -- efeito ao pisar } function onStepIn(cid, item, position, fromPosition) if isPlayer(cid) then doSendMagicEffect(position, config.EFFECT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, config.MESSAGE) end return true end Com esse aqui tem a mensagem, mas uma coisa não ficou muito clara pra mim em seu ultimo comentário. Você não quer que tenha que colocar no RME o actionID? Caso seja, troque o texto de movements.xml por: <movevent type="StepIn" itemid="1658" event="script" value="sofa.lua"/> Onde 1658 ali é o ID do sofá.
  15. Mano, se não me engano isso aí já vai entrar na parte da source, porque as versões mais antigas são bem limitadas por só ter actions, talkactions e movements.
  16. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    Eu testei nesse server:
  17. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    @Mateus Santosss acho que ele tá falando o sistema de Travel que nem o da PXG, que você fica montado numa Lapras (por exemplo) e vai andando SQM por SQM seguindo a rota. Eu pensei vagamente num jeito de fazer mas acho que ele ficaria pesado e provavelmente muito suscetível a bugs como o player deslogar no meio do caminho e ficar preso.
  18. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    @ZikaLord Mano, aparentemente está funcionando. Tenta instalar esse script aqui: Em data/talkactions/talkactions.xml cole isto: <talkaction words="!seal" script="seals.lua" /> Agora vá para data/talkactions/scripts e crie um arquivo chamado seals.lua. Dentro dele cole: local config = { maxSeals = 7 } function onSay(cid, words, param) local parametros = mysplit(param, " ") if #parametros == 1 then if parametros[1] == "local" then return showSeals (cid) else return 0 end elseif #parametros == 2 then number = tonumber(parametros[2]) if number > 7 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Selo invalido.") return TRUE end if number > 5 and isPremium (cid) then return teleportPlayerToSeal (cid, number) else if number <= 5 then return teleportPlayerToSeal (cid, number) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voce precisa ser premmy para ter acesso as duas ultimas posicoes.") end end return TRUE end end function showSeals (cid) local file = io.open ("./data/talkactions/scripts/seals/"..getPlayerName(cid) .. ".txt", "r") if file == nil then doShowTextDialog(cid, 2333, "Nenhum local marcado.") return TRUE end qt = tonumber(file:read("*l")) locations = {} for i=1, qt do locations[i] = {x = tonumber(file:read("*l")), y = tonumber(file:read("*l")), z = tonumber(file:read("*l"))} end text = createLocationString ( locations ) doShowTextDialog(cid, 2333, text) return TRUE end function teleportPlayerToSeal(cid, number) local file = io.open ("./data/talkactions/scripts/seals/"..getPlayerName(cid) .. ".txt", "r") if file == nil then doShowTextDialog(cid, 2333, "Nenhum local marcado.") return TRUE end qt = tonumber(file:read("*l")) locations = {} for i=1, qt do locations[i] = {x = tonumber(file:read("*l")), y = tonumber(file:read("*l")), z = tonumber(file:read("*l"))} end doSendMagicEffect (getPlayerPosition(cid), 2) doTeleportThing (cid, locations[number], false) doSendMagicEffect (getPlayerPosition(cid), 2) file:close() return TRUE end function createLocationString ( locations ) string = "" for i = 1, config.maxSeals do if locations[i] == nil then string = string .. "Local ".. i .. " - Nao existe\n" else string = string .. "Local ".. i .. " - " .. "Setado x = " .. locations[i].x .. ", y = " .. locations[i].y .. ", z = " .. locations[i].z .. "\n" end end return string end function mysplit(inputstr, sep) if sep == nil then sep = "%s" end local t={} ; i=1 for str in string.gmatch(inputstr, "([^"..sep.."]+)") do t[i] = str i = i + 1 end return t end Agora vá para data/actions/actions.xml e cole: <action itemid="XXXX" event="script" value="seal.lua" allowfaruse = "1" /> Onde XXXX é o ID do item que você vai usar para setar as posições. Agora vá em data/actions/scripts, crie um seal.lua e cole dentro dele: function onUse(cid, item, fromPosition, itemEx, toPosition) file1 = io.open ("./data/talkactions/scripts/seals/"..getPlayerName(cid) .. ".txt", "r") locations = {} qt = 0 if file1 == nil then qt = 0 else qt = tonumber(file1:read("*l")) for i=1, qt do locations[i] = {x = tonumber(file1:read("*l")), y = tonumber(file1:read("*l")), z = tonumber(file1:read("*l"))} end file1:close() end if qt > 7 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Maximo de selos atingidos.") return TRUE end local pos = toPosition locations[qt + 1] = {x = pos.x, y = pos.y, z = pos.z} local file = io.open ("./data/talkactions/scripts/seals/"..getPlayerName(cid) .. ".txt", "w") io.output(file) io.write(qt+1 .. "\n") for i=1, qt+1 do io.write(locations[i].x .. "\n" .. locations[i].y .. "\n" .. locations[i].z .. "\n") end file:close() return TRUE end Não tem cooldown porque esse é o primeiro script que faço em 8.6, daí não sei como o pessoal faz. [EDIT] Desculpa, esqueci de colocar o negocio da vocation, mas e so mexer no talkaction colocando um getPlayerVocation(cid) == X
  19. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    Por favor, tenta especificar melhor o que você está querendo. Pra mim, que não conheço nenhum dos dois servidores o pedido está totalmente vago...
  20. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    Eu ACHO que não vira fazer esse anel só com scripts não, teria que mexer na source do otserv.
  21. marcot postou uma resposta no tópico em Suporte Tibia OTServer
    Não entendi muito bem, você quer fazer um item que cria um warp? Por exemplo, dá use no item e em uma posição X, depois dá use no item e em uma posição Y e depois quando clicar em X você vai pra Y e vice-versa? O que você considera como "VIP" no seu servidor? Premmium ou StorageID?
  22. Script 1 consertado, com o bug especificado por PM com o doTeleportThing. local config = { horMin = {horas = 18, minutos = 30}, -- Horario de abrir horMax = {horas = 19, minutos = 30}, -- Horario de fechar successText = "Lets go there, little boy.", -- Texto enviado quando o player passa com sucesso failText = "Open at 18:30 and close at 19:30, come back later." -- Texto enviado quando o player nao consegue passar } function onStepIn(cid, fromPosition, item, pos) hor = {horas = tonumber(os.date('%H')), minutos = tonumber(os.date('%M'))} if isInInterval (cid, hor, config.horMin, config.horMax) == FALSE then doTeleportThing(cid, fromPosition) doPlayerSendCancel(cid, config.failText) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, config.successText) end return 1 end function isInInterval(cid, hor, horMin, horMax) if hor.horas == horMin.horas then if hor.minutos >= horMin.minutos then return TRUE end elseif hor.horas == horMax.horas then if hor.minutos <= horMax.minutos then return TRUE end elseif hor.horas > horMin.horas and hor.horas < horMax.horas then return TRUE end return FALSE end Agora, para os outros 2 scripts, do jeito que montei, precisaria salvar num arquivo a data em que o evento abriu pela ultima vez, mas mexer com arquivo pesa muito.
  23. Dentro da função de cast da spell você coloca funções como: doSetItemOutfit(getThingfromPos(poslook).uid, 2317, 1*15000) -- Ou doSetCreatureOutfit(cid, outfit, time)
  24. Mano, mais tarde posso tentar pq to no cel agora, mas acho que isso dai pode dar lag no server se for feito com script. Teria q fazer um movement que quando equipasse o item X ele adicionasse um evento que manda o /z e que verificasse se deve continuar ou nao recursivamente toda vez. Seria como se todo jogador pudesse criar um daquelas mensagens que spammam encima de tp. Eu recomendaria voce dar uma olhada na area de programacao se é possivel fazer isso pela source do ot na parte do c++.
  25. Os scripts 2 e 3 ficaram um pouco gambiarrados e não estou com meu desktop aqui pra fazer os devidos testes, mas a lógica creio eu que funcione: function onStepIn(cid, item, pos) -- Configuracoes globais teleportTo = {script1Pos = {x = , y = , z = }, script2Pos = {x = , y = , z = }, script3Pos = {x = , y = , z = }} actionIDs = {script1 = 13000, script2 = 13001, script3 = 13002} -- Fim das configuracoes globais if isPlayer(cid) then if item.actionid == actionIDs.script1 then executeScript1 (teleportTo) elseif item.actionid == actionIDs.script2 then executeScript2 (teleportTo) elseif item.actionid == actionIDs.script3 then executeScript3 (teleportTo) end end end function executeScript1 (teleportTo) -- Configuracoes Script 1 horMin = {horas = 18, minutos = 30} horMax = {horas = 19, minutos = 30} -- Fim das configuracoes Script 1 hor = {horas = os.date('%H'), minutos = os.date('%M')} if not isInInterval (hor, horMin, horMax) then doTeleportThing(cid, teleportTo.script1Pos) doPlayerSendCancel(cid,"Closed.") end end function executeScript2 (teleportTo) -- Configuracoes do Script 2 horMin = {horas = 19, minutos = 30} horMax = {horas = 21, minutos = 00} -- Fim das configuracoes do Script 2 hor = {horas = os.date('%H'), minutos = os.date('%M')} if not isInInterval (hor, horMin, horMax) then if not isTheDay () doTeleportThing(cid, teleportTo.script2Pos) doPlayerSendCancel(cid,"Closed.") end end end function executeScript3 (teleportTo) -- Configuracoes do Script 3 horMin = {horas = 21, minutos = 00} horMax = {horas = 22, minutos = 30} diasDisponiveis = {1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31} -- Fim das configuracoes hor = {horas = os.date('%H'), minutos = os.date('%M')} if not isInInterval (hor, horMin, horMax) then if not isInArray(diasDisponiveis, os.date("%d")) then doTeleportThing(cid, teleportTo.script3Pos) doPlayerSendCancel(cid,"Closed.") end end end function isInInterval(hor, horMin, horMax) if hor.horas == horMin.horas then if hor.minutos >= horMin.minutos then return TRUE end elseif hor.horas == horMax.horas then if hor.minutos <= horMax.minutos then return TRUE end elseif hor.horas > horMin.horas and hor.horas < horMax.horas then return TRUE end return FALSE end function isTheDay ( ) day = os.date( "%d") if (day % 2) == 0 then return TRUE else return FALSE end end Note que tem umas partes pra você completar (como posições, actionsID e etc.), mas qualquer erro que der só dar o toque que eu tento corrigir, pois como disse acima, estou sem meu desktop pra testar.

Informação Importante

Confirmação de Termo