Ir para conteúdo

marcot

Membro
  • Registro em

  • Última visita

Tudo que marcot postou

  1. Você pode pegar o target atual do player com: target = getCreatureTarget(cid) E depois setar uma outfit temporária pra esse target com: doSetCreatureOutfit (target, fninja, 500) Dentro do código ficaria algo como: 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 getPlayerSex(cid) == 0 then doSetCreatureOutfit(cid, mninja, 500) else doSetCreatureOutfit(cid, fninja, 500) end if getPlayerSex(target) == 0 then doSetCreatureOutfit (target, enemy_mninja, 500) else doSetCreatureOutfit (target, enemy_fninja, 500) end return doCombat(cid, combat, var) end
  2. Mas nesse script em específico não tem nada relacionado a uma outfit
  3. Mas a parte de monstros e NPCs está fixada dentro de uma string, então quem for adicionar o script teria que mudar isso manualmente.
  4. Pelo que vi no script as criaturas são fictícias, tudo que o jogador recebe está dentro do proprio script. Eu só criei as variáveis contendo tudo aquilo pra só ter uma só ativação no código, já que ela se repetia de forma desnecessária. Caso queira criar outras transformações, basta incrementar o range do random no começo da execução e configurar os parâmetros do vetor (addHealth, addMana, creatureName, say, creatureOutfit) dentro do próprio script (podendo seguir o exemplo dos demais).
  5. @Micheel15 Eu dei uma testada no meu TFS aqui, só dá uma conferida pra ver se é isso mesmo que você quer. Qualquer coisa que você quiser que adicione é só pedir, farei o que estiver no meu alcance. Script: playerOriginalOutfit = nil skill = nil magic = nil local function bloodCall (cid, times) if isPlayer (cid) then if times == 0 then doCreatureChangeOutfit(cid, playerOriginalOutfit) return true else doCreatureAddHealth(cid,(12*getCreatureMaxHealth(cid)/100)+(skill*6)+(magic*2)) doCreatureAddMana(cid,(12*getPlayerMaxMana(cid)/100)+(skill*6)+(magic*2)) doSendMagicEffect(getCreaturePosition(cid), 51) addEvent (bloodCall, 1 * 2000, cid, times - 1) end end end local Speed = createConditionObject(CONDITION_HASTE) setConditionParam(Speed, CONDITION_PARAM_TICKS, 30000) setConditionFormula(Speed, 0, 6000, 0, 6000) function onUse(cid, item, frompos, item2, topos) chronos = { lookType = 251,lookHead = getCreatureOutfit(cid).lookHead, lookBody = getCreatureOutfit(cid).lookBody, lookLegs = getCreatureOutfit(cid).lookLegs, lookFeet = getCreatureOutfit(cid).lookFeet, lookAddons = getCreatureOutfit(cid).lookAddons } hazus = { lookType = 194,lookHead = getCreatureOutfit(cid).lookHead, lookBody = getCreatureOutfit(cid).lookBody, lookLegs = getCreatureOutfit(cid).lookLegs, lookFeet = getCreatureOutfit(cid).lookFeet, lookAddons = getCreatureOutfit(cid).lookAddons } kazard = { lookType = 262,lookHead = getCreatureOutfit(cid).lookHead, lookBody = getCreatureOutfit(cid).lookBody, lookLegs = getCreatureOutfit(cid).lookLegs, lookFeet = getCreatureOutfit(cid).lookFeet, lookAddons = getCreatureOutfit(cid).lookAddons } skill = getPlayerSkill(cid,0) magic = getPlayerMagLevel(cid) Blood = math.random(1,3) -- Exhausted Settings -- local exhausted_seconds = 30 -- Segundos que o blood vai demorar para usar denovo local exhausted_storagevalue = 4850 -- Storage Value do exhausted local exhausted_seconds2 = 1 -- How many seconds local exhausted_storagevalue2 = 9893 -- Storage Value local exhausted_seconds3 = 2 -- How many seconds local exhausted_storagevalue3 = 8162 -- Storage Value local exhausted_seconds4 = 1 -- How many seconds local exhausted_storagevalue4 = 6245 -- Storage Value local exhausted_seconds5 = 15 -- How many seconds local exhausted_storagevalue5 = 15555 -- Storage Value -- Exhausted Settings END -- if getPlayerSoul(cid) <= 49 then doPlayerSendTextMessage(cid,20,'Desculpe, você não tem Souls suficiente.') return true end if(os.time() < getPlayerStorageValue(cid, exhausted_storagevalue)) then doPlayerSendTextMessage(cid,20,'Você não pode usar um blood of gods durante o efeito de outro.') return true end if(os.time() < getPlayerStorageValue(cid, exhausted_storagevalue2)) then doPlayerSendCancel(cid,"Você está muito cansado.") return true end if(os.time() < getPlayerStorageValue(cid, exhausted_storagevalue3)) then doPlayerSendCancel(cid,"Você está muito cansado.") return true end if(os.time() < getPlayerStorageValue(cid, exhausted_storagevalue4)) then doPlayerSendCancel(cid,"Está esgotado.") return true end if(os.time() < getPlayerStorageValue(cid, exhausted_storagevalue5)) then doPlayerSendCancel(cid,"Você está muito cansado.") return true end blood_configs = { [1] = { addHealth = 15 * getCreatureMaxHealth (cid) / 100, addMana = 15 * getCreatureMaxHealth (cid) / 100, creatureOutfit = chronos, creatureName = "Chronos", say = "Grr! Chronos back!", }, [2] = { addHealth = 10 * getCreatureMaxHealth (cid) / 100, addMana = 10 * getCreatureMaxHealth (cid) / 100, creatureOutfit = kazard, creatureName = "Kazard", say = "Nhe hehe!", }, [3] = { addHealth =10 * getCreatureMaxHealth (cid) / 100, addMana = 10 * getCreatureMaxHealth (cid) / 100, creatureOutfit = hazus, creatureName = "Hazus", say = "My hands are burning!", }, } if (os.time() >= getPlayerStorageValue(cid, exhausted_storagevalue)) and (os.time() >= getPlayerStorageValue(cid, exhausted_storagevalue2)) and (os.time() >= getPlayerStorageValue(cid, exhausted_storagevalue3)) and (os.time() >= getPlayerStorageValue(cid, exhausted_storagevalue4)) then doCreatureAddHealth (cid, blood_configs[Blood].addHealth) doCreatureAddMana (cid, blood_configs[Blood].addMana) playerOriginalOutfit = getCreatureOutfit(cid) doCreatureChangeOutfit(cid, blood_configs[Blood].creatureOutfit) doSendMagicEffect (getCreaturePosition(cid), 12) doPlayerSendTextMessage (cid, 20, "Voce usou um Concentrated Demoniac Blood e se transformou em um ".. blood_configs[Blood].creatureName .. ". (Revitalization Ativado).") doSendAnimatedText (getCreaturePosition(cid), blood_configs[Blood].say, TALKTYPE_ORANGE_1) end addEvent (bloodCall, 1 * 2000, cid, 15) setPlayerStorageValue (cid, exhausted_storagevalue, os.time() + exhausted_seconds) doPlayerAddSoul(cid,-50) doRemoveItem(item.uid,1) return true end Tentei retirar algumas linhas de código que se repetiam bastante, então não sei se é exatamente isso.
  6. Sim, essa linha é a que define o dano. Nesse link aqui tem a explicação aproximada: Eles seriam basicamente os parâmetros utilizados para definir o dano da sua skill. Note que caso queira que o ML influencie no damage você terá que trocar o COMBAT_FORMULA_SKILL para COMBAT_FORMULA_LEVELMAGIC.
  7. Vai em data/actions/actions.xml, procura pelo ID da pokeball usada no catch e olhe qual o nome do script que ela utiliza. Abra o script e procure e dá um ctrl+f na mensagem exibida quando captura um pokémon, e aí adiciona a chamada da função. A função vai verificar se o evento está ativo (caso seja para todos do servidor) OU verificar se o jogador está participando (caso seja para players em específico), em seguida soma um no storageValue da pessoa.
  8. Tenta adicionar uma função que quando der catch, verifique se a pessoa está no evento, se tiver aumenta um contador no storage value. No final do seu evento, vai ser pelo script do proprio evento, passa no personagem de cada um verificando o storage value.
  9. Acredito que para acionar algo a partir da captura você não mexe com onKill, mas com o próprio sistema de catch.
  10. Basta fazer na moda antiga, vá em data/weapons/weapons.xml troque o value = "default" da TAG da wand por valor = "suaWand.lua" e crie a o script por você mesmo, não é muito diferente de uma skill. Você pode copiar um dos scripts que costumam ficar na pasta data/weapons/scripts e modificar da forma que quiser.
  11. Aqui está o script corrigido: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) setCombatArea(combat,createCombatArea({{1}, {0}, {0}, {2}})) local combat_2 = createCombatObject() setCombatParam(combat_2, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat_2, COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) setCombatParam(combat_2, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatFormula(combat_2, COMBAT_FORMULA_LEVELMAGIC, -1, -10, -1, -20, 5, 5, 1.4, 2.1) setCombatArea(combat_2,createCombatArea({{1}, {0}, {0}, {2}})) function onCastSpell(cid, var) direction = getCreatureLookDirection(cid) if direction == SOUTH then doCombat (cid, combat, var) elseif direction == NORTH then doCombat (cid, combat_2, var) else return false end return true end Para cada IF que você inicia você tem que ter um END fechando, e você pode usar e abusar das constantes setadas no global, você não precisa usar as direções como números.
  12. Você quer remover ou quer modificar (como é o caso quando fazem aquelas pontes de rookgard)?
  13. É possível traduzir com um programa que edita o hexadecimal dele, se bem me lembro o nome do programa era XVI32, você procura o texto que quer substituir e escreve por cima, basicamente (com muito cuidado para não ir além do espaço permitido e acabar crashando o client). Tem ainda um outro programa que muda outras coisinhas do client (incluindo ícone), mas me esqueci do nome, faz muito tempo que não abro otserver. Quanto ao link existem alguns programas da comunidade que já fazem a troca do link, um deles é o Tibia Customizer (by Colex).
  14. Vou dar uma olhada e já edito. [EDIT] @Danxi aparentemente eu esqueci de encerrar o script quando dava o erro, tanto que são exibidas as duas mensagens: 22:30 You need helds with the same tier. 22:30 You received your new held item. Para consertar basta colocar esta linha: return false Depois da mensagem de erro: doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You need helds with the same tier.") Irei atualizar no tópico inicial, desculpe pelo transtorno.
  15. Não faz sentido, o stackpos 255 corresponde ao item mais acima do stack de um SQM, se ele imprime o chão então teoricamente não tem nada acima dele. Troque o stackpos para 1 e certifique-se se a posição está realmente correta (a mesma posiçao que você deu look e apareceu que possui 3 slots)
  16. Poderia dizer os ids de todos os itens nesse SQM, incluindo o piso, na ordem em que estão? Acredito que o erro esteja na configuração do stackpos
  17. Você poderia adicionar isto doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Item selecionado: " .. container.itemid) depois da linha container = getThingFromPos(config.chestPos) e mandar o que apareceu?
  18. Creio que o script acima ainda deve ser complementado. Nunca testei, mas o que acontece com o addEvent quando o jogador estiver offline? E os jogadores que logarem depois da hora exata do evento, ainda receberão o bônus? (não sei se o dono quer este segundo, mas faria sentido existir)
  19. Esse if é responsável apenas por ver se os 3 helds dentro da máquina são do mesmo tier, independente se for de 1 a 7
  20. @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:
  21. Estou tentando fazer. Mais tarde edito com o resultado. Todos helds devem possuir a mesma chance de drop ou não?
  22. Hmm... Estou interessado na resolução desse script, em como vai ter a checagem do horário (quando chegar na hora certa o script ser executado) sem ficar verificando o tempo todo (o que gera um processamento desnecessário).
  23. Acho que nem vale muito a pena, muita gente usa adblock hoje em dia. E não existe a possibilidade do ad a ser exibido ser de outro jogo online, que teoricamente seria seu concorrente (mesmo que nao seja plataforma tibia)?
  24. Esses dias tava sem nada pra fazer e resolvi botar num servidor que fico editando aqui um sistema meio doido e sem proposito, mas quem curtir a ideia... Consiste basicamente em dar um damage periódico em jogadores que ficam parados (por mais de 5 segundos no mesmo sqm) na neve sem roupa Norseman/Norsewoman, como se fosse um dano de congelamento...
  25. Se quiser eu posso mudar o script pra não ser necessariamente o player parado no mesmo SQM para tomar dano, mas a permanência dele em qualquer SQM da área com o actionID. Tente com essa tag: <movevent type="StepIn" actionid="9999" event="script" value="vocation_damage.lua"/>

Informação Importante

Confirmação de Termo