Histórico de Curtidas
-
marcot recebeu reputação de Merascylla em [PEDIDO] Tile que da dano em x vocation@bismarkzika,
Qual é a condição a ser satisfeita para parar o damage? O jogador sair do piso??
Caso seja, aqui está o script:
Nome: [PEDIDO] Tile que da dano em x vocation
Distro utilizada nos testes: Aries Server to Tibia 8.1 - Version 4.0 based on OTServ SVN Version 0.6.0
Comportamento: Caso um jogador de uma das vocations especificadas na lista config.vocation pise no local indicado, um contador será inicializado e, a cada tickTime segundos o jogador receberá damagePerTick de dano caso permaneça neste local.
Em data/movements/movements.xml, adicione esta tag:
<movevent event="StepIn" actionid="9999" script="vocation_damage.lua" />
Em data/movements/scripts crie um arquivo chamado vocation_damage.lua e cole isto dentro dele:
-- [PEDIDO] Tile que da dano em x vocation by marcot local config = { vocation = {4}, -- Lista de Vocations afetadas pelo damage damagePerTick = 50, -- Dano recebido a cada tick tickTime = 5 -- Tempo do dano (segundos) } -- Main function onStepIn(cid, item, pos) if not isPlayer (cid) then return false end if isInArray(config.vocation, getPlayerVocation(cid)) then infos = { cid = cid, pos = getPlayerPosition(cid), } addEvent (damageCondition, config.tickTime * 1000, infos) end return true end -- Funcao para comparar duas coordenadas (Retorna true caso sejam iguais) function comparePositions (posA, posB) if posA.x == posB.x and posA.y == posB.y and posA.z == posB.z then return true end return false end -- Funcao responsavel pela condition do player receber dano function damageCondition (infos) if comparePositions (infos.pos, getPlayerPosition(infos.cid)) then doCreatureAddHealth (infos.cid, -config.damagePerTick) addEvent (damageCondition, config.tickTime * 1000, infos) end end
-
marcot recebeu reputação de brunei em (Resolvido)pedido script held fusion@Danxi
Eu testei um pouco o sistema e a princípio parece que funcionou. Gostaria que você testasse adequadamente e, caso encontre algum bug, me mande aqui nessa mesma página que vou tentar corrigir.
Nome:
Fusão de Held Item Testado em:
The Forgotten Server 0.4 Como instalar:
1) Cole a tag em data/actions/actions.xml 2) Crie um arquivo chamado "heldFusion.lua" em data/actions/scripts e cole o "script" dentro dele 3) Vá no map editor de sua preferência, crie um contêiner e um ativador (nos testes usei uma alavanca), guarde a posição do contêiner, pois será necessário na configuração do script. 4) Ainda no map editor, coloque o actionID 10001 no ativador Pronto! Tag:
<action actionid = "10001" event = "script" value = "heldFusion.lua" /> Script:
-- Held Fusion 0.1 by Marcot -- Se encontrou algum erro no script, favor enviar PM explicando os erros -- http://www.tibiaking.com/forum/profile/120572-marcot/ -- Configuracoes necessarias para o script local config = { quest = { -- Precisa fazer quest? (Nao mexa caso negativo) necessaria = false, -- Eh necessario fazer uma quest para liberar o sistema? storageID = 10001, -- Qual o storageID dessa quest? (caso true, anteriormente) }, chestPos = {x = 92, y = 114, z = 7, stackpos = 1}, -- Posicao do Bau (certifique-se que nao tenha nada encima dele) -- Tenha atencao para que a soma das chances dos helds em cada tier seja igual a 100 helds = { -- Item IDs e chance de vir o held [1] = { -- Array Tier 1 {ID = 2159, chance = 10}, {ID = 2160, chance = 80}, {ID = 2158, chance = 10}, }, [2] = { -- Array Tier 2 {ID = 2000, chance = 20}, {ID = 2001, chance = 20}, {ID = 2002, chance = 20}, {ID = 2003, chance = 20}, {ID = 2004, chance = 20}, }, [3] = { -- Array Tier 3 }, [4] = { -- Array Tier 4 }, [5] = { -- Array Tier 5 }, [6] = { -- Array Tier 6 }, [7] = { -- Array Tier 7 }, }, } function onUse(cid, item, fromPosition, itemEx, toPosition) if config.quest.necessaria and getPlayerStorageValue (cid, config.quest.storageID) == 0 then -- Erro caso a pessoa use a maquina sem ter feito a quest -- Valido apenas quando a opcao esta ativada doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don\'t have permission to use this machine.") return false end items = {nil, nil, nil} container = getThingFromPos(config.chestPos) for i = 0, 2 do items[i + 1] = getContainerItem (container.uid, i) if items [i + 1].itemid == 0 or items [i + 1].itemid == nil then -- Erro quando tem menos de 3 itens no bau doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need 3 held items to fuse.") return false end end heldType = {nil, nil, nil} for j=1, 3 do for i=1, 7 do for k = 1, #config.helds[i] do if config.helds[i][k].ID == items[j].itemid then heldType[j] = i end end end if heldType [j] == nil then -- Erro a ser exibido caso o jogador coloque algum item que nao seja um held na maquina doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "This machine works only to held items.") return false end end if heldType[1] ~= heldType[2] or heldType[2] ~= heldType[3] then -- Erro a ser exibido caso o jogador coloque helds de tiers diferentes doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need helds with the same tier.") return false elseif heldType[1] == 7 or heldType[2] == 7 or heldType[3] == 7 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You cannot fuse tier 7 held items.") return false end -- Sortear qual held vira for i = 1, 3 do doRemoveItem(items[i].uid, 1) end tierSorteado = heldType[1] + 1 numeroSorte = math.random(1, 100) itemIDSorteado = sorteiaValor (tierSorteado, numeroSorte) doPlayerAddItem(cid, itemIDSorteado, 1) -- Mensagem exibida ao fundir com sucesso doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You received your new held item.") return true end -- Função retirada de https://pt.stackoverflow.com/questions/147884/sorteio-aleat%C3%B3rio-mas-com-diferentes-probabilidades function sorteiaValor (tierSorteado, numeroSorte) x = numeroSorte for i = 1, #config.helds[tierSorteado] do x = x - config.helds[tierSorteado][i].chance if x <= 0 then return config.helds[tierSorteado][i].ID end end end
Caso queira personalizar as mensagens eu deixei comentários encima de cada mensagem explicando quando são executadas, desculpe pelo meu inglês fisk, só consigo ler, quando vou escrever é um desastre.
P.S.: Note que o script só olha os 3 primeiros itens de dentro do contêiner, portanto, cabe ao utilizador do script limitar o slot desse contêiner para 3.
[EDIT] Link para compreender a configuração do stackpos:
-
marcot recebeu reputação de Tibianomaxhue em (Resolvido)pedido script held fusion@Danxi
Eu testei um pouco o sistema e a princípio parece que funcionou. Gostaria que você testasse adequadamente e, caso encontre algum bug, me mande aqui nessa mesma página que vou tentar corrigir.
Nome:
Fusão de Held Item Testado em:
The Forgotten Server 0.4 Como instalar:
1) Cole a tag em data/actions/actions.xml 2) Crie um arquivo chamado "heldFusion.lua" em data/actions/scripts e cole o "script" dentro dele 3) Vá no map editor de sua preferência, crie um contêiner e um ativador (nos testes usei uma alavanca), guarde a posição do contêiner, pois será necessário na configuração do script. 4) Ainda no map editor, coloque o actionID 10001 no ativador Pronto! Tag:
<action actionid = "10001" event = "script" value = "heldFusion.lua" /> Script:
-- Held Fusion 0.1 by Marcot -- Se encontrou algum erro no script, favor enviar PM explicando os erros -- http://www.tibiaking.com/forum/profile/120572-marcot/ -- Configuracoes necessarias para o script local config = { quest = { -- Precisa fazer quest? (Nao mexa caso negativo) necessaria = false, -- Eh necessario fazer uma quest para liberar o sistema? storageID = 10001, -- Qual o storageID dessa quest? (caso true, anteriormente) }, chestPos = {x = 92, y = 114, z = 7, stackpos = 1}, -- Posicao do Bau (certifique-se que nao tenha nada encima dele) -- Tenha atencao para que a soma das chances dos helds em cada tier seja igual a 100 helds = { -- Item IDs e chance de vir o held [1] = { -- Array Tier 1 {ID = 2159, chance = 10}, {ID = 2160, chance = 80}, {ID = 2158, chance = 10}, }, [2] = { -- Array Tier 2 {ID = 2000, chance = 20}, {ID = 2001, chance = 20}, {ID = 2002, chance = 20}, {ID = 2003, chance = 20}, {ID = 2004, chance = 20}, }, [3] = { -- Array Tier 3 }, [4] = { -- Array Tier 4 }, [5] = { -- Array Tier 5 }, [6] = { -- Array Tier 6 }, [7] = { -- Array Tier 7 }, }, } function onUse(cid, item, fromPosition, itemEx, toPosition) if config.quest.necessaria and getPlayerStorageValue (cid, config.quest.storageID) == 0 then -- Erro caso a pessoa use a maquina sem ter feito a quest -- Valido apenas quando a opcao esta ativada doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don\'t have permission to use this machine.") return false end items = {nil, nil, nil} container = getThingFromPos(config.chestPos) for i = 0, 2 do items[i + 1] = getContainerItem (container.uid, i) if items [i + 1].itemid == 0 or items [i + 1].itemid == nil then -- Erro quando tem menos de 3 itens no bau doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need 3 held items to fuse.") return false end end heldType = {nil, nil, nil} for j=1, 3 do for i=1, 7 do for k = 1, #config.helds[i] do if config.helds[i][k].ID == items[j].itemid then heldType[j] = i end end end if heldType [j] == nil then -- Erro a ser exibido caso o jogador coloque algum item que nao seja um held na maquina doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "This machine works only to held items.") return false end end if heldType[1] ~= heldType[2] or heldType[2] ~= heldType[3] then -- Erro a ser exibido caso o jogador coloque helds de tiers diferentes doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need helds with the same tier.") return false elseif heldType[1] == 7 or heldType[2] == 7 or heldType[3] == 7 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You cannot fuse tier 7 held items.") return false end -- Sortear qual held vira for i = 1, 3 do doRemoveItem(items[i].uid, 1) end tierSorteado = heldType[1] + 1 numeroSorte = math.random(1, 100) itemIDSorteado = sorteiaValor (tierSorteado, numeroSorte) doPlayerAddItem(cid, itemIDSorteado, 1) -- Mensagem exibida ao fundir com sucesso doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You received your new held item.") return true end -- Função retirada de https://pt.stackoverflow.com/questions/147884/sorteio-aleat%C3%B3rio-mas-com-diferentes-probabilidades function sorteiaValor (tierSorteado, numeroSorte) x = numeroSorte for i = 1, #config.helds[tierSorteado] do x = x - config.helds[tierSorteado][i].chance if x <= 0 then return config.helds[tierSorteado][i].ID end end end
Caso queira personalizar as mensagens eu deixei comentários encima de cada mensagem explicando quando são executadas, desculpe pelo meu inglês fisk, só consigo ler, quando vou escrever é um desastre.
P.S.: Note que o script só olha os 3 primeiros itens de dentro do contêiner, portanto, cabe ao utilizador do script limitar o slot desse contêiner para 3.
[EDIT] Link para compreender a configuração do stackpos:
-
marcot recebeu reputação de carlosrina123 em [DXP]Bug held machine<action actionid="XXXX" script="held machine.lua"/> Onde XXXX é o numero do actionID que você colocou pro item no map editor.
Nenhum script sem tag é executado
-
marcot deu reputação a luanluciano93 em (Resolvido)[PEDIDO] Remover itens do tile através da alavancalocal ALTARES = { {POSITION = Position(106, 984, 6), ITEM_ID = }, -- posicao altar e item 1 {POSITION = Position(106, 985, 6), ITEM_ID = }, -- posicao altar e item 2 {POSITION = Position(106, 986, 6), ITEM_ID = }, -- posicao altar e item 3 {POSITION = Position(106, 987, 6), ITEM_ID = }, -- posicao altar e item 4 {POSITION = Position(106, 987, 6), ITEM_ID = }, -- posicao altar e item 5 {POSITION = Position(106, 987, 6), ITEM_ID = }, -- posicao altar e item 6 } local playerPosition = { Position(106, 987, 6), Position(106, 987, 6), Position(106, 987, 6), Position(106, 987, 6) } local newPosition = { Position(106, 987, 6), Position(106, 987, 6), Position(106, 987, 6), Position(106, 987, 6) } function onUse(player, item, fromPosition, target, toPosition, isHotkey) local ok = true for i = 1, #ALTARES do local tile = Tile(ALTARES[i].POSITION) if tile then local item = tile:getItemById(ALTARES[i].ITEM_ID) if not item then ok = false end end end if ok then local players = {} for _, position in ipairs(playerPosition) do local topPlayer = Tile(position):getTopCreature() if not topPlayer or not topPlayer:isPlayer() then player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) return false end players[#players + 1] = topPlayer end for i, targetPlayer in ipairs(players) do playerPosition[i]:sendMagicEffect(CONST_ME_POFF) targetPlayer:teleportTo(newPosition[i], false) targetPlayer:getPosition():sendMagicEffect(CONST_ME_ENERGYAREA) end for i = 1, #ALTARES do local tile = Tile(ALTARES[i].POSITION) if tile then local item = tile:getItemById(ALTARES[i].ITEM_ID) if item then item:remove() end end end else player:sendTextMessage(MESSAGE_INFO_DESCR, "Desculpe, você precisa colocar os items corretos nos altares.") player:getPosition():sendMagicEffect(CONST_ME_POFF) end item:transform(item.itemid == 1945 and 1946 or 1945) return true end
-
marcot recebeu reputação de koalla1235 em Por Level para dar use no ItemTenta adicionar estas três linhas de código logo depois daquela sequência de confugurações com aqueles local agua, local pedra, etc.
local levelMinimo = 100 if getPlayerLevel(cid) < levelMinimo then return doPlayerSendTextMessage(cid, 27, "Voce nao possui level para usar este item.") end
-
marcot recebeu reputação de Lyu em Aprendendo sobre funções LUAVou tentar explicar essa parte do CID de uma forma mais prática, demonstrando diferenças entre C e C++ e você pode tirar suas conclusões.
Considere o pedaço de código abaixo, escrito na linguagem C (usaremos short em vez de bool, porque é C)
struct Player { int id; short isPremmium; }; Nesse caso temos um tipo de dado Player, com um id e uma flag indicando se o jogador possui premmium.
Vamos agora declarar uma variável de tipo player:
struct Player jogador; jogador.id = 0; jogador.isPremmium = 0; Agora, uma função que verificaria se esse jogador possui premmium ou não, ficaria mais ou menos assim:
short isPremmium(struct Player jogador) { return jogador.isPremmium; } Por que o jogador foi passado como parâmetro? Oras, porque a função precisa dele para ter o acesso, variáveis globais não são uma boa prática!
Agora, vamos levar para um caso que não precisaria, na linguagem C++
Considere o código abaixo, correspondente ao anterior:
class Player { private: int id; bool isPremmium; public: Player(int id, bool isPremmy); bool isPremmium() { return this->isPremmium; } }; Nesse caso, para criar um jogador e verificar se ele tem premmium, teriamos o seguinte pedaço de código:
// Criando jogador de id=0 e não tem premmy Player* player = new Player(0, false); if (player->isPremmy()) { // Código } Note que, apesar de isPremmy não ter parâmetro, ainda temos a referência do objeto player criado na linha 2, anterior ao "isPremmy".
De uma forma ou outra, você precisa especificar qual é o jogador em questão, isso vem das próprias linguagens de programação!
Caso não tenha entendido muito bem algumas expressões utilizadas, recomendo dar uma estudada no básico de algumas linguagens como C/C++/LUA e ver outras partes teóricas como Programação Orientada a Objetos (é um conceito bem fácil de ser compreendido, depois que você entendeu o básico).
-
marcot recebeu reputação de bpm91 em (Resolvido)baú, item dentro da backpack, demon parchmentlocal cfg = { playerStorage = 60999, globalStorage = 60999, time = 60 * 60 * 24, -- Tempo em segundos positions = { {x=33060, y=31623, z=15}, {x=33066, y=31623, z=15}, {x=33060, y=31627, z=15}, {x=33066, y=31627, z=15} } } function isCooldownReady() return os.time() > getGlobalStorageValue(cfg.globalStorage) end function onUse(cid, item, frompos, item2, topos) if not isCooldownReady() then return true end for _, t in pairs(cfg.positions) do doSummonCreature("Demon", t) end setPlayerStorageValue(cid, cfg.playerStorage, 1) setGlobalStorageValue(cfg.globalStorage, os.time() + cfg.time) end No script acima eu coloco como valor de storage o tempo atual somado ao tempo (segundos) necessário para a quest poder ser ativada novamente.
Eu fiz uns testes bem básicos aqui com tempos pequenos (como de 10 segundos) e aparentemente funciona.
-
marcot recebeu reputação de bpm91 em (Resolvido)baú, item dentro da backpack, demon parchment@bpm91, outra coisa que eu esqueci de perguntar, você quer que o timer funcione de qual forma?
Cada player pode invocar os monstros uma vez por dia; Os monstros só podem ser invocados uma vez por dia, independente do jogador que o tenha feito; -
marcot recebeu reputação de bpm91 em (Resolvido)baú, item dentro da backpack, demon parchment@bpm91
Sobre o baú de quest, você tem certeza de que não está funcionando? Porque por padrão vem um script chamado walkback.lua em movements que possui justamente essa finalidade pelo que entendi aqui.
Sobre a parchment quest, existe algum script de gatilho para dar respawn nesses demons?
-
marcot recebeu reputação de bpm91 em (Resolvido)pegando key do bauEle está te dizendo aí que tentou chamar a função doSetItemActionId e disse que isso é um valor nil, porque se não me engano em LUA tudo que não tá criado é nulo.
Não sei qual base está utilizando, mas a função de setar um action id para o TFS 0.4 é essa:
doItemSetActionId(uid, aid) Onde uid é o unique id do item e aid possivelmente o id que você quer.
-
marcot recebeu reputação de ZoR em Aprendendo sobre funções LUAVou tentar explicar essa parte do CID de uma forma mais prática, demonstrando diferenças entre C e C++ e você pode tirar suas conclusões.
Considere o pedaço de código abaixo, escrito na linguagem C (usaremos short em vez de bool, porque é C)
struct Player { int id; short isPremmium; }; Nesse caso temos um tipo de dado Player, com um id e uma flag indicando se o jogador possui premmium.
Vamos agora declarar uma variável de tipo player:
struct Player jogador; jogador.id = 0; jogador.isPremmium = 0; Agora, uma função que verificaria se esse jogador possui premmium ou não, ficaria mais ou menos assim:
short isPremmium(struct Player jogador) { return jogador.isPremmium; } Por que o jogador foi passado como parâmetro? Oras, porque a função precisa dele para ter o acesso, variáveis globais não são uma boa prática!
Agora, vamos levar para um caso que não precisaria, na linguagem C++
Considere o código abaixo, correspondente ao anterior:
class Player { private: int id; bool isPremmium; public: Player(int id, bool isPremmy); bool isPremmium() { return this->isPremmium; } }; Nesse caso, para criar um jogador e verificar se ele tem premmium, teriamos o seguinte pedaço de código:
// Criando jogador de id=0 e não tem premmy Player* player = new Player(0, false); if (player->isPremmy()) { // Código } Note que, apesar de isPremmy não ter parâmetro, ainda temos a referência do objeto player criado na linha 2, anterior ao "isPremmy".
De uma forma ou outra, você precisa especificar qual é o jogador em questão, isso vem das próprias linguagens de programação!
Caso não tenha entendido muito bem algumas expressões utilizadas, recomendo dar uma estudada no básico de algumas linguagens como C/C++/LUA e ver outras partes teóricas como Programação Orientada a Objetos (é um conceito bem fácil de ser compreendido, depois que você entendeu o básico).
-
marcot recebeu reputação de esnio12 em (Resolvido)Dúvida com a função FORTestei no ambiente interativo de LUA
-- Input Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio > for i=10,0,-1 do >> print('Hello') >> end -- Output Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello A variável I começa com 10, o loop acaba em 0 e o incremento é de -1 a cada loop.
Note que repetiu o Hello 11 vezes.
-
marcot recebeu reputação de KotZletY em Codigos basicos de poketibias!Não conheço os callbacks dos ots de pokemon, mas uma sugestão que fica para o tópico é mexer um pouco nessa formatação.
Tenta colocar os códigos dentro de janelas de código pra ficar mais organizado, exemplo:
function onUse(cid, item, frompos, item2, topos) if getPlayerStorageValue(cid, storage) == -1 then -- se voce souber o basico de ingles ja entende o que quer dizer, se o player nao tiver a storage, entao adicionaremos o listado abaixo! doPlayerAddMoney(cid, 5000) AddPokeToPlayer(cid, pokemon, 0, nil, ball) elseif getPlayerStorageValue(cid,storage) >= 1 then -- se o player tiver a storage entao uma mensagem sera enviada pra ele doPlayerPopupFYI(cid, "Voce ja fez essa quest!") -- voce tambem pode usar doPlayerSendTextMessage(cid,24, "Voce ja fez essa quest!") end end Isso deixa o tópico bem mais fácil de ler, visto que a tela fica menos poluída ?
-
marcot recebeu reputação de Kevin Araujo em [Ajuda] Spell a frenteIsso aí você modifica no Spells.xml, tem que ter o Direction="1" na linha correspondente à magia
-
marcot recebeu reputação de Kynhuu em Procuro Aulas ou Instrutor para Server Poketibia@Kynhuu,
Bom, esse negócio de criar os sistemas é complicado, porque é possível desenvolver sistemas simples sem ter conhecimento de programação, mas conforme seus sistemas se tornam mais complexos, a história muda.
Os servidores de tibia, em geral, são implementados na linguagem de programação C++ e utiliza a linguagem LUA para os scripts. Ou seja, para você editar isso tudo, é bom você estudar LÓGICA DE PROGRAMAÇÃO e ir aprofundando nessas duas linguagens, conforme você for aprendendo.
Depois que você pegar o básico, pode dar uma pesquisada no youtube em tópicos como:
* Estruturas de Dados;
* Programação Orientada a Objetos (POO);
* Banco de Dados SQL;
Só adiantando que isso não é coisa que você vai aprender do dia pra noite, mesmo pessoas que trabalham com isso há anos ainda precisam continuar aprendendo, então não se preocupe se achar o processo de aprendizado lento.
Você pode tentar procurar materiais de universidades, também, visto que em diversos cursos de engenharia a programação é vista também.
-
marcot recebeu reputação de Alphazin em (Resolvido)pedido script held fusion@Danxi
Eu testei um pouco o sistema e a princípio parece que funcionou. Gostaria que você testasse adequadamente e, caso encontre algum bug, me mande aqui nessa mesma página que vou tentar corrigir.
Nome:
Fusão de Held Item Testado em:
The Forgotten Server 0.4 Como instalar:
1) Cole a tag em data/actions/actions.xml 2) Crie um arquivo chamado "heldFusion.lua" em data/actions/scripts e cole o "script" dentro dele 3) Vá no map editor de sua preferência, crie um contêiner e um ativador (nos testes usei uma alavanca), guarde a posição do contêiner, pois será necessário na configuração do script. 4) Ainda no map editor, coloque o actionID 10001 no ativador Pronto! Tag:
<action actionid = "10001" event = "script" value = "heldFusion.lua" /> Script:
-- Held Fusion 0.1 by Marcot -- Se encontrou algum erro no script, favor enviar PM explicando os erros -- http://www.tibiaking.com/forum/profile/120572-marcot/ -- Configuracoes necessarias para o script local config = { quest = { -- Precisa fazer quest? (Nao mexa caso negativo) necessaria = false, -- Eh necessario fazer uma quest para liberar o sistema? storageID = 10001, -- Qual o storageID dessa quest? (caso true, anteriormente) }, chestPos = {x = 92, y = 114, z = 7, stackpos = 1}, -- Posicao do Bau (certifique-se que nao tenha nada encima dele) -- Tenha atencao para que a soma das chances dos helds em cada tier seja igual a 100 helds = { -- Item IDs e chance de vir o held [1] = { -- Array Tier 1 {ID = 2159, chance = 10}, {ID = 2160, chance = 80}, {ID = 2158, chance = 10}, }, [2] = { -- Array Tier 2 {ID = 2000, chance = 20}, {ID = 2001, chance = 20}, {ID = 2002, chance = 20}, {ID = 2003, chance = 20}, {ID = 2004, chance = 20}, }, [3] = { -- Array Tier 3 }, [4] = { -- Array Tier 4 }, [5] = { -- Array Tier 5 }, [6] = { -- Array Tier 6 }, [7] = { -- Array Tier 7 }, }, } function onUse(cid, item, fromPosition, itemEx, toPosition) if config.quest.necessaria and getPlayerStorageValue (cid, config.quest.storageID) == 0 then -- Erro caso a pessoa use a maquina sem ter feito a quest -- Valido apenas quando a opcao esta ativada doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don\'t have permission to use this machine.") return false end items = {nil, nil, nil} container = getThingFromPos(config.chestPos) for i = 0, 2 do items[i + 1] = getContainerItem (container.uid, i) if items [i + 1].itemid == 0 or items [i + 1].itemid == nil then -- Erro quando tem menos de 3 itens no bau doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need 3 held items to fuse.") return false end end heldType = {nil, nil, nil} for j=1, 3 do for i=1, 7 do for k = 1, #config.helds[i] do if config.helds[i][k].ID == items[j].itemid then heldType[j] = i end end end if heldType [j] == nil then -- Erro a ser exibido caso o jogador coloque algum item que nao seja um held na maquina doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "This machine works only to held items.") return false end end if heldType[1] ~= heldType[2] or heldType[2] ~= heldType[3] then -- Erro a ser exibido caso o jogador coloque helds de tiers diferentes doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need helds with the same tier.") return false elseif heldType[1] == 7 or heldType[2] == 7 or heldType[3] == 7 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You cannot fuse tier 7 held items.") return false end -- Sortear qual held vira for i = 1, 3 do doRemoveItem(items[i].uid, 1) end tierSorteado = heldType[1] + 1 numeroSorte = math.random(1, 100) itemIDSorteado = sorteiaValor (tierSorteado, numeroSorte) doPlayerAddItem(cid, itemIDSorteado, 1) -- Mensagem exibida ao fundir com sucesso doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You received your new held item.") return true end -- Função retirada de https://pt.stackoverflow.com/questions/147884/sorteio-aleat%C3%B3rio-mas-com-diferentes-probabilidades function sorteiaValor (tierSorteado, numeroSorte) x = numeroSorte for i = 1, #config.helds[tierSorteado] do x = x - config.helds[tierSorteado][i].chance if x <= 0 then return config.helds[tierSorteado][i].ID end end end
Caso queira personalizar as mensagens eu deixei comentários encima de cada mensagem explicando quando são executadas, desculpe pelo meu inglês fisk, só consigo ler, quando vou escrever é um desastre.
P.S.: Note que o script só olha os 3 primeiros itens de dentro do contêiner, portanto, cabe ao utilizador do script limitar o slot desse contêiner para 3.
[EDIT] Link para compreender a configuração do stackpos:
-
marcot recebeu reputação de BilauX em Tile com tempo pra passarScript 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.
-
marcot recebeu reputação de r0bert0lol em (Resolvido)[PEDIDO] Spells Hiraishin Ni No Dan Seal e Hiraishin Ni No DanScript sem o bug de tirar o target e sem damage:
local config = { storageID = 49609, mark_time = 10 * 60, effectWhenTeleport = 339, -- Efeito ao teleportar effectWhenUsed = 152, } local errorMsg = { pz = "Seu alvo nao pode estar fora do PZ.", playerOnly = "Voce so pode usar este jutsu em players.", alreadyMarked = "Voce ja marcou um jogador.", } local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, 152) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) function onCastSpell(cid, var) if isPlayer(getCreatureTarget(cid)) then if getPlayerStorageValue (cid, config.storageID) <= 0 then setPlayerStorageValue(cid, config.storageID, 1) doPlayerSendTextMessage(cid,22, "Voce marcou o player ".. getCreatureName(getCreatureTarget(cid))) target = getCreatureTarget(cid) doSendMagicEffect(getPlayerPosition(target), 152) local struct = { left = config.mark_time * 3, player = cid, target = target, var = var } addEvent(teleportIsTrue, 333, struct) else doSendMagicEffect(getPlayerPosition(cid), 2) doPlayerSendCancel(cid, errorMsg.alreadyMarked) return false end else doSendMagicEffect(getPlayerPosition(cid), 2) doPlayerSendCancel(cid, errorMsg.playerOnly) return false end return doCombat(cid, combat, var) end function teleportIsTrue (struct) if struct.left ~= 0 then if getPlayerStorageValue (struct.player, config.storageID) == 2 then doTeleportThing(struct.player, getThingPosition(struct.target), true) setPlayerStorageValue(struct.player, config.storageID, 0) doSendMagicEffect(getPlayerPosition(struct.player), config.effectWhenTeleport) doPlayerSendTextMessage(struct.player,22, "Voce perdeu sua marcacao.") return TRUE end struct.left = struct.left - 1 addEvent (teleportIsTrue, 333, struct) elseif struct.left == 0 then doPlayerSendTextMessage(struct.player,22, "Voce perdeu sua marcacao.") setPlayerStorageValue(struct.player, config.storageID, 0) else return FALSE end end -
marcot recebeu reputação de Arthasz Walker em (Resolvido)pedido script held fusion@Arthasz Walker,
Desculpa, fiz um erro besta, nem lembrei que prices era um array kkk. Acho que dessa vez vai, desculpa mesmo não estar podendo testar no momento estou sem meu desktop com os arquivos de otserver
Tenta essa versão:
-- Configuracoes necessarias para o script local config = { quest = { -- Precisa fazer quest? (Nao mexa caso negativo) necessaria = false, -- Eh necessario fazer uma quest para liberar o sistema? storageID = 10001, -- Qual o storageID dessa quest? (caso true, anteriormente) }, chestPos = {x = 92, y = 114, z = 7, stackpos = 1}, -- Posicao do Bau (certifique-se que nao tenha nada encima dele) -- Tenha atencao para que a soma das chances dos helds em cada tier seja igual a 100 prices = { ["tier_1"] = 60000, ["tier_2"] = 150000, ["tier_3"] = 300000, ["tier_4"] = 700000, ["tier_5"] = 1000000, ["tier_6"] = 1500000, }, helds = { -- Item IDs e chance de vir o held [1] = { -- Array Tier 1 {ID = 2159, chance = 10}, {ID = 2160, chance = 80}, {ID = 2158, chance = 10}, }, [2] = { -- Array Tier 2 {ID = 2000, chance = 20}, {ID = 2001, chance = 20}, {ID = 2002, chance = 20}, {ID = 2003, chance = 20}, {ID = 2004, chance = 20}, }, [3] = { -- Array Tier 3 }, [4] = { -- Array Tier 4 }, [5] = { -- Array Tier 5 }, [6] = { -- Array Tier 6 }, [7] = { -- Array Tier 7 }, }, } function onUse(cid, item, fromPosition, itemEx, toPosition) if config.quest.necessaria and getPlayerStorageValue (cid, config.quest.storageID) == 0 then -- Erro caso a pessoa use a maquina sem ter feito a quest -- Valido apenas quando a opcao esta ativada doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You don\'t have permission to use this machine.") return false end items = {nil, nil, nil} container = getThingFromPos(config.chestPos) for i = 0, 2 do items[i + 1] = getContainerItem (container.uid, i) if items [i + 1].itemid == 0 or items [i + 1].itemid == nil then -- Erro quando tem menos de 3 itens no bau doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need 3 held items to fuse.") return false end end heldType = {nil, nil, nil} for j=1, 3 do for i=1, 7 do for k = 1, #config.helds[i] do if config.helds[i][k].ID == items[j].itemid then heldType[j] = i end end end if heldType [j] == nil then -- Erro a ser exibido caso o jogador coloque algum item que nao seja um held na maquina doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "This machine works only to held items.") return false end end if heldType[1] ~= heldType[2] or heldType[2] ~= heldType[3] then -- Erro a ser exibido caso o jogador coloque helds de tiers diferentes doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need helds with the same tier.") return false elseif heldType[1] == 7 or heldType[2] == 7 or heldType[3] == 7 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You cannot fuse tier 7 held items.") return false end if not doPlayerRemoveMoney(cid, config.prices["tier_"..heldType[1]]) then -- Se nao for possivel retirar a quantia de dinheiro do jogador, finalizar script doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need " .. config.prices.tier_..heldType[1] .. " gold to fuse tier ".. heldType[1].. " held items.") return false end -- Sortear qual held vira for i = 1, 3 do doRemoveItem(items[i].uid, 1) end tierSorteado = heldType[1] + 1 numeroSorte = math.random(1, 100) itemIDSorteado = sorteiaValor (tierSorteado, numeroSorte) doPlayerAddItem(cid, itemIDSorteado, 1) -- Mensagem exibida ao fundir com sucesso doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You received your new held item.") return true end -- Função retirada de https://pt.stackoverflow.com/questions/147884/sorteio-aleat%C3%B3rio-mas-com-diferentes-probabilidades function sorteiaValor (tierSorteado, numeroSorte) x = numeroSorte for i = 1, #config.helds[tierSorteado] do x = x - config.helds[tierSorteado][i].chance if x <= 0 then return config.helds[tierSorteado][i].ID end end end
-
marcot recebeu reputação de Heyron em Show OFF - Naruto LegendsConcordo, acho esses personagens muito pequenos, também, comparado ao tamanho das paredes e etc.
Acredito que o ideal seria padronizar, ou tudo 90 graus ou tudo 45
-
marcot recebeu reputação de Jeanzim em Dosetcreatureoutfit valendo rep+++Pode dar uma testada nessa versão do script?
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) setCombatParam(combat, COMBAT_PARAM_USECHARGES, true) local area = createCombatArea(AREA_SQUARE1X1) setCombatArea(combat, area) function onGetFormulaValues(cid, level, skill, attack, factor) local skillTotal, levelTotal = skill + attack, level / 5 return -(skillTotal * 0.5 + levelTotal), -(skillTotal * 1.5 + levelTotal) end setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") function onCastSpell(cid, var, target) mninja = {lookType = 117, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 3} fninja = {lookType = 117, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 3} enemy_mninja = {lookType = 117, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 3} enemy_fninja = {lookType = 117, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 3} target = getCreatureTarget(cid) if target == 0 then transformAroundPos (cid, nil, enemy_mninja, enemy_fninja) else transformAroundPos (cid, getCreaturePosition (target), enemy_mninja, enemy_fninja) end if getPlayerSex (cid) == 0 then doSetCreatureOutfit (cid, mninja, 500) else doSetCreatureOutfit (cid, fninja, 500) end return doCombat (cid, combat, var) end function transformAroundPos (cid, centerPos, male, female) for i = 0, 2 do for j = 0, 2 do initialPos = getCreaturePosition(getCreatureTarget(cid)) if centerPos == nil then initialPos = getEpicenterPos (cid) doSendMagicEffect (initialPos, 35) end initialPos.x = initialPos.x - 1 initialPos.y = initialPos.y - 1 thingPos = initialPos thingPos.x = thingPos.x + i thingPos.y = thingPos.y + j thingPos.stackpos = 255 thing = getThingfromPos(thingPos) thing = thing.uid if isPlayer (thing) then if getPlayerSex (thing) == 0 then doSetCreatureOutfit (thing, male, 500) else doSetCreatureOutfit (thing, female, 500) end elseif isCreature (thing) then doSetCreatureOutfit (thing, male, 500) end end end end function getEpicenterPos (cid) playerDirection = getCreatureLookDirection(cid) skillPos = getCreaturePosition (cid) if playerDirection == NORTH then skillPos.y = skillPos.y - 1 elseif playerDirection == EAST then skillPos.x = skillPos.x + 1 elseif playerDirection == SOUTH then skillPos.y = skillPos.y + 1 elseif playerDirection == WEST then skillPos.x = skillPos.x - 1 end return skillPos end
-
marcot recebeu reputação de Jeanzim em (Resolvido)Spell com posição heelpAcho que os principais pontos que você teria que trabalhar nesse script são a posição, já que a posição modificada é esta diagonal do personagem:
Para ser a posição à direita do personagem você incrementa somente a coordenada X.
Outro pronto é trabalhar no retorno dos callbacks LUA, quando você utiliza getPlayerTarget, caso o jogador tenha um target ele receberá um objeto, que no caso é o que ele está targetando, seja uma criatura, um player, etc. e você fez a seguinte comparação:
if target == false then Caso o jogador não tenha um target, a função retorna 0. Caso você tenha dúvidas sobre o que a função te retorna, dê um print para aparecer no console o que você possui na variável, isso também é bem útil no debug, pra saber se uma determinada parte do script está sendo utilizada ou não.
Exemplo :
No teste acima o jogador não tinha um target
Sempre que você abrir uma função/if/etc. deixe tudo que está dentro alinhado para a direita e certifique-se que o end está alinhado com com seu respectivo if ou function, isso facilita MUITO a leitura de um código. Exemplo tirado de uma source:
No código acima você consegue identificar claramente onde começa e termina um bloco, além de saber o que faz parte de cada um
-
marcot deu reputação a Kydrai em Dosetcreatureoutfit valendo rep+++@marcot É mais por curiosidade, mas vc pode usar o CALLBACK_PARAM_TARGETCREATURE ou CALLBACK_PARAM_TARGETTILE para pegar os targets ou os tiles que a spell atinge.
Um exemplo rápido:
function changeTargetOutfit(cid, target) if isPlayer(target) then doSetCreatureOutfit(target, {lookType = 117, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 3}, 500) end end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "changeTargetOutfit")
-
marcot recebeu reputação de
Yamborghiniem (Resolvido)[PEDIDO] "x" Bolt só funcionar com "x" CrossbowInfelizmente não estou sabendo corrigir o bug que ficou, quando o jogador fica com o bow na mão que não seja o correto ele ganha skill como se estivesse batendo normalmente. Eu tentei usar o comando de addSkillTry mas parece que ele buga quando tento um valor negativo.
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, 1) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 41) setCombatParam(combat, COMBAT_PARAM_HITCOLOR, 170) setCombatFormula(combat, COMBAT_FORMULA_SKILL, 1, 2, 1.2, 2) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, 31) setCombatParam(combat2, COMBAT_PARAM_DISTANCEEFFECT, 41) setCombatParam(combat2, COMBAT_PARAM_HITCOLOR, 170) setCombatFormula(combat2, COMBAT_FORMULA_SKILL, 0, -10000, 0, -13000) local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat3, COMBAT_PARAM_EFFECT, 31) setCombatParam(combat3, COMBAT_PARAM_DISTANCEEFFECT, 41) setCombatParam(combat3, COMBAT_PARAM_HITCOLOR, 170) setCombatFormula(combat3, COMBAT_FORMULA_SKILL, 0, -13000, 0, -15000) local condition = createConditionObject(CONDITION_PARALYZE) setConditionParam(condition, CONDITION_PARAM_TICKS, 5000) setConditionParam(condition, CONDITION_PARAM_SPEED, -400) setConditionFormula(condition, 0, 0, 0, 0) setCombatCondition(combat2, condition) local condition = createConditionObject(CONDITION_PARALYZE) setConditionParam(condition, CONDITION_PARAM_TICKS, 5000) setConditionParam(condition, CONDITION_PARAM_SPEED, -600) setConditionFormula(condition, 0, 0, 0, 0) setCombatCondition(combat3, condition) function onUseWeapon(cid, var) local rand = math.random(1,100) bowID = 13038 itemLeft = getPlayerSlotItem(cid, 6) itemRight = getPlayerSlotItem(cid, 5) if itemLeft.itemid ~= bowID and itemRight.itemid ~= bowID then flechas = getPlayerSlotItem(cid, 10) -- doPlayerAddSkillTry(cid, SKILL_DISTANCE, -1, true) -- BUGA A SKILL DO PERSONAGEM, NAO DESCOMENTAR doPlayerAddItem (cid, flechas.itemid, 1) return false end if rand <= 4 then doSendAnimatedText(getPlayerPosition(cid), "Critical!", TEXTCOLOR_BLACK) doCombat(cid, combat2, var) elseif rand <= 7 then doSendAnimatedText(getPlayerPosition(cid), "Critical!", TEXTCOLOR_BLACK) doCombat(cid, combat3, var) else doCombat(cid, combat, var) end end