Ir para conteúdo

Garou

Membro
  • Registro em

  • Última visita

Tudo que Garou postou

  1. Ele está acusando que os arquivos em actions/scripts e talkactions/scripts estão sem suas funções primárias (ou seja vazios), melhor dar uma olhada.
  2. Garou postou uma resposta no tópico em Scripts tfs 0.4 (OLD)
    Este é um script criado pela Script Factory e pedido pelo membro underewarr. Se você tem um pedido a fazer ou uma ideia de script, não deixe de visitar: Script Factory Crie um arquivo chamado paralyze sword.lua em data/weapons/scripts/ e adicione o conteúdo abaixo: -- Paralyze Weapon -- Script Factory @ TibiaKing local duration = 3 * 1000 local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_BLOCKARMOR, true) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_FORMULA_SKILL, 1, 0, 1, 0) local condition = createConditionObject(CONDITION_PARALYZE) setConditionParam(condition, CONDITION_PARAM_TICKS, duration) setConditionFormula(condition, -0.9, 0, -0.9, 0) setCombatCondition(combat, condition) function onUseWeapon(cid, var) return doCombat(cid, combat, var) end Em weapons.xml, cole essa linha: <melee id="id_da_arma" level="100" unproperly="1" event="script" value="paralyze sword.lua"/> Se houver algum problema relacionado a duplicated item id, você precisará deletar a linha que estiver usando o id atribuido ao script.
  3. Para a soft boots, procure em seus items.xml pelo itemid 2640 e delete essa linha: <attribute key="duration" value="14400" /> Para a firewalker boots, procure em seu items.xml pelo itemid 9932 e delete essa linha: <attribute key="duration" value="3600" /> Retire também dos dois itens a linha que diz respeito ao atributo decayTo
  4. Garou postou uma resposta no tópico em Playground (Off-topic)
    Derivem o espaço e você acha a velocidade, derivem a velocidade e você acha a aceleração. Lpz também é cultura, véi...
  5. Garou postou uma resposta no tópico em Playground (Off-topic)
    Boa sorte. Não podemos agradar todos como disse o Kimoszin. Mas, enfim, o que tem a área de Suporte OTServ relacionado a despedidas? Moverei o tópico para o Playground
  6. Na verdade se a função doItemSetAttribute permitisse a edição desses atributos, eu com certeza faria algo desse tipo :/
  7. Nome: Perfect Upgrade System Tipo: Biblioteca, Action, Sistema Autor: Oneshot Essa é a versão final do Perfect Refine System ou Perfect Upgrade System criado por mim. É um sistema construído em cima de funções em POO (orientação a objetos), o que o torna muito versátil, possibilitando a outros programadores/scripters criarem seus próprios sistemas com base na biblioteca. A função do sistema é simples. Não passa de um sistema de refino, presente em todos os servidores, onde você usa um item em um equipamento e este fica mais forte e ganha um nome caracterizando o nível de força - bem clichê - mas muito interessante. Meu sistema é um pouco diferente dos outros, pois possui algumas características exclusivas, listadas abaixo: O nível máximo configurável é praticamente ilimitado O sistema funciona com armas de combate corpo-a-corpo, bows e crossbows. O refino pode falhar, não acontecendo nada, regredindo o nível ou resetando ele. Há um sistema nativo de broadcasts, que são enviados quando um jogador consegue refinar um equipamento até um certo nível ou maior. As chances são configuradas manualmente e sua randomização é muito precisa. Há dois modos de instalar o sistema em seu servidor, o primeiro é baixar a pasta com os scripts necessários e apenas copiar as chaves nos arquivos XMLs ou então seguir o curto tutorial de instalação. Crie um arquivo chamado upgradesystem.lua na pasta data/lib e copie o conteúdo abaixo: --[[ PERFECT UPGRADE SYSTEM 2.0 Criado por Oneshot É proibido a venda ou a cópia sem os devidos créditos desse script. ]]-- UpgradeHandler = { levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true}, [11] = {10, true, true}, [12] = {5, true, true} }, broadcast = 7, attributes = { ["attack"] = 2, ["defense"] = 1, ["armor"] = 1 }, message = { console = "Trying to refine %s to level +%s with %s%% success rate.", success = "You have upgraded %s to level +%s", fail = "You have failed in upgrade of %s to level +%s", downgrade = "The upgrade level of %s has downgraded to +%s", erase = "The upgrade level of %s has been erased.", maxlevel = "The targeted %s is already on max upgrade level.", notupgradeable = "This item is not upgradeable.", broadcast = "The player %s was successful in upgrading %s to level +%s.\nCongratulations!!", invalidtool = "This is not a valid upgrade tool.", toolrange = "This upgrade tool can only be used in items with level between +%s and +%s" }, tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, }, isEquipment = function(self) local weaponType = self:getItemWeaponType() return ((weaponType > 0 and weaponType < 7) or self.item.armor ~= 0) end, setItemName = function(self, name) return doItemSetAttribute(self.item.uid, "name", name) end, chance = function(self) local chances = {} chances.upgrade = (self.levels[self.item.level + 1][1] or 100) chances.downgrade = (self.item.level * 5) chances.erase = (self.item.level * 3) return chances end } function UpgradeHandler:new(item) local obj, ret = {} obj.item = {} obj.item.level = 0 obj.item.uid = item.uid for key, value in pairs(getItemInfo(item.itemid)) do obj.item[key] = value end ret = setmetatable(obj, {__index = function(self, index) if _G[index] then return (setmetatable({callback = _G[index]}, {__call = function(self, ...) return self.callback(item.uid, ...) end})) else return UpgradeHandler[index] end end}) if ret:isEquipment() then ret:update() return ret end return false end function UpgradeHandler:update() self.item.level = (tonumber(self:getItemName():match("%+(%d+)")) or 0) end function UpgradeHandler:refine(uid, item) if not self.item then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, self.message.notupgradeable) return "miss" end local tool = self.tools[item.itemid] if(tool == nil) then doPlayerSendTextMessage(uid, MESSAGE_EVENT_DEFAULT, self.message.invalidtool) return "miss" end if(self.item.level > #self.levels) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.maxlevel:format(self.item.name)) return "miss" end if(self.item.level < tool.range[1] or self.item.level >= tool.range[2]) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.toolrange:format(unpack(tool.range))) return "miss" end local chance = (self:chance().upgrade + tool.info.chance) doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_BLUE, self.message.console:format(self.item.name, (self.item.level + 1), math.min(100, chance))) if(tool.info.removeable == true) then doRemoveItem(item.uid, 1) end if chance * 100 > math.random(1, 10000) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_ORANGE, self.message.success:format(self.item.name, (self.item.level + 1))) if (self.item.level + 1) >= self.broadcast then doBroadcastMessage(self.message.broadcast:format(getCreatureName(uid), self.item.name, (self.item.level + 1))) end self:setItemName((self.item.level > 0 and self:getItemName():gsub("%+(%d+)", "+".. (self.item.level + 1)) or (self:getItemName() .." +1"))) for key, value in pairs(self.attributes) do if getItemAttribute(self.item.uid, key) ~= nil or self.item[key] ~= 0 then doItemSetAttribute(self.item.uid, key, (self.item.level > 0 and getItemAttribute(self.item.uid, key) or self.item[key]) + value) end end return "success" else if(self.levels[self.item.level][3] == true and (self:chance().erase * 100) > math.random(1, 10000)) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.erase:format(self.item.name)) self:setItemName(self.item.name) for key, value in pairs(self.attributes) do if self.item[key] > 0 then doItemSetAttribute(self.item.uid, key, self.item[key]) end end elseif(self.levels[self.item.level][2] == true and (self:chance().downgrade * 100) > math.random(1, 10000)) then doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.downgrade:format(self.item.name, (self.item.level - 1))) self:setItemName((self.item.level == 1 and self.item.name or self:getItemName():gsub("%+(%d+)", "+".. (self.item.level - 1)))) for key, value in pairs(self.attributes) do if getItemAttribute(self.item.uid, key) ~= nil or self.item[key] ~= 0 then doItemSetAttribute(self.item.uid, key, (self.item[key] + value * (self.item.level - 1))) end end else doPlayerSendTextMessage(uid, MESSAGE_STATUS_CONSOLE_RED, self.message.fail:format(self.item.name, (self.item.level + 1))) end return "fail" end end Crie um arquivo chamado upgrade.lua em data/actions/scripts e cole o conteúdo abaixo: function onUse(cid, item, fromPosition, itemEx, toPosition) if isCreature(itemEx.uid) then return doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE) end local obj = UpgradeHandler:new(itemEx) if(obj == false) then return doPlayerSendCancel(cid, UpgradeHandler.message.notupgradeable) end local status = obj:refine(cid, item) if status == "success" then --doSendAnimatedText(toPosition, "Success!", COLOR_GREEN) doSendMagicEffect(toPosition, CONST_ME_MAGIC_GREEN) elseif status == "fail" then --doSendAnimatedText(toPosition, "Fail!", COLOR_RED) doSendMagicEffect(toPosition, CONST_ME_POFF) else doSendMagicEffect(toPosition, CONST_ME_POFF) end return true end No arquivo actions.xml, cole a seguinte linha: <action itemid="8306" event="script" value="upgrade.lua"/> Para adicionar mais níveis de refino no sistema, edite a seguinte tabela: levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true} }, Por padrão, ela já está configurado como na maioria dos MMORPGs, 10 níveis de refino, com chances de sucesso, regressão e "quebra". Mas se você quiser, por exemplo, adicionar mais dois níveis, siga o modelo, sempre colocando uma vírgula no final com exceção da última linha da tabela: levels = { [1] = {100, false, false}, [2] = {90, false, false}, [3] = {75, false, false}, [4] = {60, true, false}, [5] = {45, true, false}, [6] = {30, true, false}, [7] = {25, true, false}, [8] = {20, true, true}, [9] = {15, true, true}, [10] = {10, true, true}, [11] = {10, true, true}, [12] = {5, true, true} }, O primeiro valor é chance de sucesso, o segundo se o item pode regredir na tentativa e o terceiro é se o item para "quebrar" (perder todo o nível de refino). Para criar novas ferramentas (itens) de refinar, configure a tabela abaixo: tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, }, Seguindo o mesmo esquema da tabela anterior, vírgulas em todas as linhas com exceção da última, seguindo o modelo abaixo. Por exemplo, uma ferramenta de ID 8303 que refine do level +6 ao +10, que dê 10% de chance bônus e que seja finita, eu faço assim: tools = { [8306] = {range = {0, 10}, info = {chance = 0, removeable = true}}, [8310] = {range = {6, 10}, info = {chance = 10, removeable = true}} }, Em breve vídeo de demonstração com sistema em funcionamento. Perfect Upgrade System.rar
  8. Olá, Adriano SwaTT Evite posts duplos, se você precisa acrescentar algo em seu post basta Editar ele.
  9. Garou postou uma resposta no tópico em Suporte & Pedidos
    Que nada, eu utilizei muito sua biblioteca para aprimorar minha orientação a objetos. Você é um excelente scripter e junto com os outros integrantes, vejo um grande futuro para o projeto. Abração
  10. jinzoooo, Vamos parar com o flood, beleza? Como é seu primeiro post no fórum, peço que leia atentamente as Regras Gerais. Caso isso ocorra novamente, terei que negativar você. Abraços, Lpz
  11. Garou postou uma resposta no tópico em Playground (Off-topic)
    Pô, véi, na boa, véi, porra, véi... Isso não se fala, véi... pelo menos não negasse a punheta véi...
  12. Garou postou uma resposta no tópico em Eventos de Scripting
    Pois é, iremos arranjar um juiz que será responsável por receber os scripts e criar o tópico da votação no dia de entrega.
  13. Garou postou uma resposta no tópico em Eventos de Scripting
    Lpz vs. Kimoszin Vamos resolver quaisquer diferenças entre nós com um simples duelo de scriptwriting em Lua, certo? Tema: Como combinado no chat - "Actions, qualquer uma." Entrega: Domingo, dia 18 de março.
  14. Quando você diz passar para o protocolo 8.6, significa que o script apresenta alguma incompatibilidade no distro Mix Yurots que você usa. Poderia me dizer qual essa incompatibilidade?
  15. Garou postou uma resposta no tópico em Suporte Bots
    Também é fora das regras o ato da moderação secundária. Quando encontrar algo fora das regras, apenas reporte o post ou tópico. Obrigado.
  16. Me diga qual o significado desse '5' para você, pois eu ainda não entendi o que ele faz aí. A função setPlayerStorageValue funciona assim: setPlayerStorageValue(cid, storage, value) Não há um quarto parâmetro.
  17. Garou postou uma resposta no tópico em Tutoriais sobre Scripting
    Interessante. Dá para complementar ainda mais esse tipo de quest com creaturescripts e um script de baú especial, ou seja, que só dá o item se o jogador matou o monstro. Para evitar os espertinhos que puxam a alavanca, pegam o item e... run to the hills!
  18. Um código bem simples, deve ser útil para os donos de servidores. Só acho estranho o uso de global storages, seria muito mais fácil usar uma coluna no banco de dados. Obrigado pela contribuição, underewarr. Observação: A propósito, estou movendo o tópico para a seção Globalevents, Spells & Creatureevent, pois isso não é um tutorial
  19. Olá, Jared Leto O valor da storage é o próprio 'os.time() + 600', talvez isso deve confundir você, pois não conhece o significado da função os.time(). Ela é usada para pegar o tempo do sistema em segundos, logo o que está sendo feito aí com a função setPlayerStorage, é pegar o tempo do sistema e acrescentar mais 600 segundos. Assim a storage poderia ser usada para verificar se 600 segundos já se passaram, ou seja: if os.time() > getPlayerStorageValue(cid, storage) then (...) end O bloco acima verifica se 600 segundos já passaram, se usarmos a função print() para mostrar os.time(), notaremos que o valor aumenta progressivamente de um em um segundo. Ou seja uma hora ele será maior que a storage que, antes, era 600 segundos maior. Fazendo assim que este if retorne true, executando o bloco de código Abraços.
  20. Garou postou uma resposta no tópico em Playground (Off-topic)
    Me obrigue
  21. Garou postou uma resposta no tópico em Playground (Off-topic)
    foda-se
  22. Garou postou uma resposta no tópico em Playground (Off-topic)
    Nada contra, mas evangélicos são engraçados.
  23. Garou postou uma resposta no tópico em Playground (Off-topic)
    Vale lembrar que é do mesmo criador de Code Geass. Eu recomendo Obs: Engraçado, nunca vi esse nome "Undertakers" e sim, "Funerária" e odeio essa mania de trocar o sobrenome pelo nome. O certo seria Ouma Shu e Yuzuriha Inori. .
  24. Garou postou uma resposta no tópico em Suporte & Pedidos
    Boa sorte com o projeto. Reconheci de cara que seria o Lwkass o scripter responsável por causa da magia Fira, que provavelmente usa a biblioteca criada por ele haha.
  25. Sim, há como, mas te daria um pouco de trabalho. local rooms = { [1000] = { from = {x = 886, y = 965, z = 7}, to = {x = 888, y = 968, z = 7}, inside = {x = 887, y = 968, z = 7} } } --[[ Para configurar novas salas, siga o modelo abaixo: local rooms = { [1000] = { from = {x = 886, y = 965, z = 7}, to = {x = 888, y = 968, z = 7}, inside = {x = 887, y = 968, z = 7} }, -- Não esqueça de separar cada um com uma vírgula [ACTION ID] = { from = {x = 0, y = 0, z = 0}, -- Coordenada do canto superior esquerdo da sala to = {x = 0, y = 0, z = 0}, -- Coordenada do canto inferior direito da sala inside = {x = 0, y = 0, z = 0} -- Coordenada para onde o jogador será teleportado } } ]]-- function onUse(cid, item, fromPosition, itemEx, toPosition) if rooms[itemEx.actionid] then if #getSpectatorsFromArea(rooms[itemEx.actionid].from, rooms[itemEx.actionid].to) == 1 then doTeleportThing(cid, rooms[itemEx.actionid].inside) else doPlayerSendCancel(cid, "Há alguém dentro da sala") end else doPlayerSendCancel(cid, "Você não deve usar este item aqui") end return true end E coloque no arquivo 050-functions.lua, da pasta data/lib, esta função: getSpectatorsFromArea(fromPosition, toPosition) A tag do actions.xml deve continuar a mesma

Informação Importante

Confirmação de Termo