Ir para conteúdo

Allangod

Cavaleiro
  • Total de itens

    185
  • Registro em

  • Última visita

Histórico de Reputação

  1. Upvote
    Allangod deu reputação a Night Wolf em Acrescentar àrea spell   
    onde tá
    for i = 1, 60 do doSendMagicEffect(random(pos), eff, cid) end deixa assim:
    for i = 1, 60 do doSendMagicEffect(random(pos), eff, cid) doSendMagicEffect({x = pos.x + 2, y = pos.y - 1, z = pos.z}, 189, cid) doSendMagicEffect({x = pos.x - 2, y = pos.y - 1, z = pos.z}, 188, cid) end  
  2. Upvote
    Allangod deu reputação a Caronte em Spell de travar   
    Vou fazer, pera aí...

    Fiz:
     

     
    crie um arquivo.lua em (spells/scripts)

     
    Adicione essa tag em (spells.xml)
    <instant name="travarr" words="trave" lvl="0" mana="0" prem="0" selftarget="1" exhaustion="20000" needlearn="0" script="arquivo.lua"> </instant> Não se esqueça de alterar a tag, como você quiser, coloquei o tempo de exhaust de 20 segundos na tag.
     

    Use com sabedoria.

    AAAA, só adicionando, na minha sincera opinião, 5x5 é muito, uma magia potente dessa, deveria ser no máximo 2x2.
  3. Upvote
    Allangod deu reputação a meubk em Vocation especial   
    local item = {2323, 1} -- id do item, quantidade local vocations = {77} function onKill(cid, target, lastHit) if isPlayer(target) and isInArray(vocations, getPlayerVocation(cid)) then doPlayerAddItem(cid, item[1], item[2]) end return true end Cria um arquivo .lua coloca na pasta creaturescripts coloca a tag no creaturescripts.xml do tipo "kill" e adiciona no login.lua de acordo com o nome
  4. Upvote
    Allangod deu reputação a meubk em Spell life   
    amigo desculpe a demora, tive q baixar o tfs 8.54 e fazer testes, mas agora esta 100%, segue abaixo o mod:
    <?xml version="1.0" encoding="UTF-8"?> <mod name="SpellLife" enabled="yes" author="Miiller" forum="XTibia.com"> <!-- Configs and Functions --> <config name="SpellLifeConfig"><![CDATA[ config = { vocationIds = {76}, -- quais vocação pode usar level = 100, -- que level é preciso para usar cooldownSeconds = 60, -- quantos segundos é preciso esperar para usar novamente emptyStorage = 54154, -- uma storage que não esteja sendo usada no seu servidor otherEmptyStorage = 54155, -- outra storage que não esteja sendo usada no seu servidor durationSeconds = 10, -- quanto tempo durara a spell effect = 10 -- qual efeito mostrara conforme esta sobre o efeito da spell } function startSpellLife(cid, seconds) if not isCreature(cid) then return true end if seconds == config.durationSeconds then doPlayerSetStorageValue(cid, config.emptyStorage, 1) end if getPlayerStorageValue(cid, config.emptyStorage) == -1 then doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) return true end if seconds == 0 then doPlayerSetStorageValue(cid, config.emptyStorage, -1) return true end doSendMagicEffect(getThingPos(cid), config.effect) addEvent(startSpellLife, 1000, cid, seconds-1) end ]]></config> <!-- configure abaixo o id do item --> <action itemid="2525" event="script"><![CDATA[ domodlib('SpellLifeConfig') function onUse(cid, item, fromPosition, itemEx, toPosition) if not isInArray(config.vocationIds, getPlayerVocation(cid)) then return doPlayerSendCancel(cid, "Sua vocação não pode usar esta spell.") end if getPlayerLevel(cid) < config.level then return doPlayerSendCancel(cid, "É necessário level " .. config.level .. " para usar esta spell.") end if exhaustion.check(cid, config.otherEmptyStorage) then return doPlayerSendCancel(cid, "É necessário esperar " .. config.cooldownSeconds .. " segundos para usar esta spell novamente.") end exhaustion.set(cid, config.otherEmptyStorage, config.cooldownSeconds) startSpellLife(cid, config.durationSeconds) doRemoveItem(item.uid, 1) return true end ]]></action> <creaturescript type="statschange" name="SpellLife" event="script"><![CDATA[ domodlib('SpellLifeConfig') function onStatsChange(cid, attacker, type, combat, value) if type == STATSCHANGE_HEALTHLOSS then if getCreatureHealth(cid) - value <= 0 then if getPlayerStorageValue(cid, config.emptyStorage) == 1 then doCreatureAddHealth(cid, getCreatureMaxHealth(cid)) doPlayerSetStorageValue(cid, config.emptyStorage, -1) return false end end end return true end ]]></creaturescript> <creaturescript type="login" name="SpellLifeLogin" event="script"><![CDATA[ function onLogin(cid) registerCreatureEvent(cid, "SpellLife") return true end ]]></creaturescript> </mod>
  5. Upvote
    Allangod deu reputação a Lucas CP em Erro na spell   
    Tenta mudar o if:
     
     
  6. Upvote
    Allangod deu reputação a zipter98 em Spell de revidar ataque   
    Na spell, troque:
    setPlayerStorageValue(cid, config.storage, 1)
    por:
    setPlayerStorageValue(cid, config.storage, os.time() + 10)
    No creatureevent, troque:
    if getPlayerStorageValue(cid,config.storage) == 1 and isCreature(attacker) then
    por:
    if getPlayerStorageValue(cid, config.storage) > os.time() and isCreature(attacker) then
    E remova a linha:
    setPlayerStorageValue(cid,config.storage, 0)
  7. Upvote
    Allangod recebeu reputação de Deadpool em Spell que sobe   
    Bom, eu tenho o Fly system (Mock) no meu servidor e gostaria de uma spell que ao usá-la, o jogador "voaria para o andar de cima" (Igual ao fly system mesmo) e explodisse um efeito em área no lugar onde ele estava, e em seguida voltar ao andar de baixo.
    Seria como se ele taca-se fogo no chão e voa-se para não ser atingido.
    Obrigado.
  8. Upvote
    Allangod deu reputação a tibiaa4e em Pasta Data - A Magia Do Npcs   
    Pasta Enciclopédia com todos os links de outros tutoriais !

    Lista de Tutoriais

    Tutorial de NPCs

    Bem depois de um tempinho sem fazer nada de otserver devido a falta de tempo (dinheiro, paciencia e felicidade)
    resolvi dar uma apertada para terminar o que ja era para ter sido feito a tempos...

    Então devido a pedidos de amigos no MSN, resolvi sair da ordem inicial dos tutoriais, até porque vejo mais necessario
    um tutorial de npc do que outros.

    Esse tutorial irá servir para quem gostar de fazer certo NPCs mais complexos com storages, varias missões e tudo mais.
    Usando como base o Jiddo system apenas para comprar e vender itens, pois não gosto de usar sistemas que facilitam

    Pois não criam scripters e sim preguiçosos, ainda mais quando o sistema é abandonado ai você se lasca

    O npc é dividido em duas partes :
    - Arquivo XML : Responsavel pelo visual e algumas propriedades dele (pelo jiddo system)
    - Arquivo Lua : Responvasel pelas falas e vendas (Lua puro)

    Visual do Npc

    Bem primeiro vamos explicar o visual de um npc,
     
    <npc name="Bonifacius" script="data/npc/scripts/default.lua" walkinterval="25" floorchange="0" access="5" level="1" maglevel="1"><health now="150" max="150"/><look type="128" head="97" body="100" legs="115" feet="114" corpse="2212"/></npc>

    Explicando parte a parte

    Name : Nome dele que aparecerá para todos.
    script: Arquivo lua do script dele
    walkinterval: De quanto em quanto milessegundos ele irá caminhar.
    floorchange: Se ele irá subir escadas ou cair em buracos.
    access: O valor de acesso dele, caso ele tenha um acesso 5 poderá usar todo os comandos de GODS.
    level,maglevel: É tosco, você pode fazer ele soltar magias (nunca tentei) e no caso isso contaria.
    Health Now: Sangue que terá
    max: Maximo de health (ja fizeram npc com life media)
    look type: Tipo de roupa dele, Caso queira ele como objeto use look typeex.
    head,body,legs,feet: Cor da cabeça,corpo,calça e pé do npc.
    corpse: Corpo caso ele morra (LOL não dá...)

    Esse é a base do arquivo xml do npc. Caso você queirá enfiar tosquisses pelo Jiddo System fica mais ou menos assim:
     
    <?xml version="1.0" encoding="UTF-8"?><npc name="Bonifacius" script="data/npc/scripts/default.lua" walkinterval="25" floorchange="0" access="5" level="1" maglevel="1"><health now="150" max="150"/><look type="128" head="97" body="100" legs="115" feet="114" corpse="2212"/><parameters><parameter key="module_shop" value="1"/><parameter key="shop_buyable" value="banana,2676,2;grapes,2681,3;melon,2682,8;orange,2675,5;pumpkin,2683,10;cheese,2696,5;egg,2695,2;cookie,2678,2;meat,2266,5"/><parameter key="message_greet" value="What you doing soldier ? Take your weapon and go war!"/><parameter key="message_walkaway" value="Hey Hey, where you go ?"/><parameter key="message_farewell" value="Bye bye brave soldier. Remember, peoples without head, don't transform in undeads."/><parameter key="message_alreadyfocused" value="You are drunked ? You talk really talk to me ?"/></parameters></npc>  
    <parameters><parameter key="module_shop" value="1"/><parameter key="shop_buyable" value="banana,2676,2;grapes,2681,3;melon,2682,8;orange,2675,5;pumpkin,2683,10;cheese,2696,5;egg,2695,2;cookie,2678,2;meat,2266,5"/><parameter key="message_greet" value="What you doing soldier ? Take your weapon and go war!"/><parameter key="message_walkaway" value="Hey Hey, where you go ?"/><parameter key="message_farewell" value="Bye bye brave soldier. Remember, peoples without head, don't transform in undeads."/><parameter key="message_alreadyfocused" value="You are drunked ? You talk really talk to me ?"/></parameters>

    Esse é um exemplo basico de npc vendedor, que não faz muita coisa.

    module_shop : Quer dizer que ao falar trade ele irá abrir a janela tosca de venda de itens.
    shop_buyable : Isso faz tudo que tiver ai ele vender sendo a sintaxe


    parameter key="shop_buyable" value="nome inutil (inutil mesmo não serve para nada),id do produto,preço;

    Podendo você adicionar milhares e milhares, unico porém de você adicionar pelo XML é que não há possibilidade de fazer
    a venda por backpack (pelo menos até a versão que testei)

    message_farewell Mensagem de despedida

    Essas message tem alguns tipos explicados abaixo :
     
    greet - mensagem de boas vindasfarewell - Mensagem de despedidabuy - Mensagem de confirmação de compraonbuy - Sei la o0bought - Mensagem de compra confirmadasell - Mensagem de confirmação de vendaonsell - sei la o0sold - Mensagem venda confirmadamissingmoney - Que você ta liso (sem nada)needmoney - Que você não tem dinheiro suficientemissingitem - Falta o item necessarioneeditem - Que você não te o item ou não tem a qtd suficienteneedspace - Que falta espaço na bp para o itemneedmorespace - Que prescisa de mais alguns espaçosidletimeout - Que você demoro e perdeu a vezwalkaway - Saiu da visão deledecline - Que desistiu da açãosendtrade - Quando abre a janela de tradenoshop - Que ele não tem janela de trade para mostraroncloseshop - Que você fechou a janela de tradealreadyfocused - Que tu deu um tapa na pantera, ou seja, ele já está falando com vocêplacedinqueque - Para você ter paciencia que já será atendido

    Tudo isso acima deverá estar depois de message_ e as mensagens em default você poderá encontrar em npc/lib/npcsystem/npchandler.lua
    Se você fazer asneira lá os npcs não funfam cuidado o0

    Ainda há o npc de barco, muito simples :
     
    <parameter key="travel_destinations" value="desert,1594,835,5,180;edron,931,825,6,90;"/>

    Sintaxe
    value="nome da cidade ,coordenada x,coordenada y,coordenada z ,valor;"

    Da para você fazer tudo do LUA no XML, porém eu acho estranho e apenas frescura do Jiddo e dos Developers do TFS (não sei developer em Português)
    Caso seja curioso olhe nos arquivos bankmax.xml, merchant.xml e postman.xml que estão em npc/lib


    Bem a parte XML já acabo, ou seja, ela é muito simples.


    NPCS EM LUA

    Aqui é a parte legal do npc na qual até certos scripters novos fazem coisas desnecessarias ou que pioram...

    A base do arquivo usando Jiddo System é
     
    local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endnpcHandler:addModule(FocusModule:new())

    Ou seja npcs, que aquilo que mostrei no xml é suficiente você pode direcionar para o default.lua

    Eu disse que npcs feitos no XML, a opção de compra por backpack não é possivel

    Então para faze-la em um npc Lua ficará assim :
     
    local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endlocal shopModule = ShopModule:new()npcHandler:addModule(shopModule)shopModule:addBuyableItem({'health potion'}, 7618, 45, 1, 'health potion')shopModule:addBuyableItem({'mana potion'}, 7620, 50, 1, 'mana potion')shopModule:addBuyableItemContainer({'bp hp'}, 2000, 7618, 900, 1, 'backpack of health potions')shopModule:addBuyableItemContainer({'bp mp'}, 2001, 7620, 1000, 1, 'backpack of mana potions')npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new())

    Nesse exemplo o npc vende health potion,mana potion e bp dos respectivos.

    Sendo a sintaxe
     
    shopModule:addBuyableItem({'nome inutil'}, id preço, quantidade ou sub tipo, 'nome inutil')

    Esse nome só serve para você não se perder, pois ao dizer trade ele aparecerá o nome do item pelo items.xml
    e não o que voce falou

    Sintaxe da backpack
     
    shopModule:addBuyableItemContainer({'nome'}, id da backpack, id, preço, sub tipo ou quantidade (caso seja agrupavel), 'nome inutil')

    Ai sempre virá uma bp cheia dos item especificado. Caso não saiba ao clicar com o direito no TRADE e usar buy with backpack virá com isso ai


    Essa é a parte facil até agora tentarei pensar aqui 25 minutos um jeito de explicar muita coisa xD


    NPCS de Missões

    Bem aqui ensinarei a fazer npcs de missões, isso mesmo até mesmo aqueles de post office, paradox (que eu até ja fiz)
    Como sempre ensinarei a logica, ou seja, darei conhecimento não ideias
     
    local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction creatureSayCallback(cid, type, msg)if(not npcHandler:isFocused(cid)) thenreturn falseendlocal talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cidif msgcontains(msg, 'rainbow') or msgcontains (msg, 'perch') thenif getPlayerStorageValue(cid,30013) == 8 thenselfSay('Yeah. But peguins, stoled my last crate of this. Please go lair of this plague and take again my itens. You go ?', cid)talkState[talkUser] = 1elseselfSay('You are a lier. Leave here!', cid)endelseif msgcontains(msg, 'mission') thenif doPlayerRemoveItem(cid,7707,1) == 1 thenselfSay('Congratulations. Give this for Willard.', cid)setPlayerStorageValue(cid,30013,10)talkState[talkUser] = 0elseselfSay('You don\'t have nothing!', cid)endelseif talkState[talkUser] == 1 thenif msgcontains(msg, 'yes') thenselfSay('Great. Later report me asking mission.', cid)setPlayerStorageValue(cid,30013,9)talkState[talkUser] = 0elseselfSay('You don\'t have nothing!', cid)endendreturn trueendnpcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new())

    Esse npc ai é um simples de quest, você pode se basear nele para seu primeiro npc
    Vamos explicar umas coisas importantissimas

    talkState = Isso ai é a genialidade, a cada passo você pode mandar o player para um estagio. Se você leu meus tutos
    percebeu que ele é um vetor, mais por que ? Porque, ao ser uma variavel ele é armazenada no servidor certo ?
    Então se não fosse um vetor, o npc falando com dois ao mesmo tempo poderia se confudir e ferrar tudo literalmente

    Se você dominar o talkState dominará 50% de npcs de missões

    Storages = Isso também é indispensavel nos npcs, é sempre bom reservar uns para cada missão
    Para se ela tiver varias etapas você não se confudir, Ou usar o mesmo value para poder aproveitar no questlog (explicado no tutorial SUper Quests)


    O npc acima ele é 4º npc da minha quest global do meu otserver de testes.
    Ignore os erros de Inglês.
     
    if msgcontains(msg, 'rainbow') or msgcontains (msg, 'perch') thenif getPlayerStorageValue(cid,30013) == 8 thenselfSay('Yeah. But peguins, stoled my last crate of this. Please go lair of this plague and take again my itens. You go ?', cid)talkState[talkUser] = 1elseselfSay('You are a lier. Leave here!', cid)end

    Aqui ao você falar rainbow ou perch ele começa a girar essa parte do script.
    Ou seja no caso eh msgcontains se você falar
     
    Sou gay rainbow e você é bobo,feio e chato

    Ele irá entender normalmente, e rodará o script.
    Caso fosse msg ai sim teria quer ser certinho (até maiscula e miniscula acho que ele duvidaria)

    No caso ele checa o storage 30013 se tem o valor 8, caso tenha ele fala aquela frase enorme e muda seu talkstate para 1
    Se não tiver o storage com valor 8, ele te ofende. Esse storage 8 é adicionado no npc anterior.

    Se você tiver tudo certo ele tem pergunto algo, porém isso só será checado no talkstate 1
     
    elseif talkState[talkUser] == 1 thenif msgcontains(msg, 'yes') thenselfSay('Great. Later report me asking {mission}.', cid)setPlayerStorageValue(cid,30013,9)talkState[talkUser] = 0elseselfSay('You don\'t have nothing!', cid)end

    Se você falar yes, ele manda você ir no penguim hell para você pegar os treco para ele. E te coloca o storage 30013 com valor 9
     
    O valor do storage é fico importante depois da criação do quest log, pois nele os avanços da mesma missãoSó pode ser feito pelo mesmo storage. Lembrando que depois do tfs 0.3.0 beta 1 , é possivel adicionar palavras no valorPodendo ser :setPlayerStorageValue(cid,30013,"estagio 1")

    E veja que ele manda você falar mission quando completar
     
    Palavras entre { } de npcs fazem ele falar em palavras negriras

    Vamos supor (não supositorio), que você completou ela e falo mission para ele. O que iria checar ?
     
    elseif msgcontains(msg, 'mission') thenif doPlayerRemoveItem(cid,7707,1) == 1 thenselfSay('Congratulations. Give this for Willard.', cid)setPlayerStorageValue(cid,30013,10)talkState[talkUser] = 0elseselfSay('You don\'t have nothing!', cid)end

    Se você fala mission, ele automaticamente remoe o item 7707 (dado na quest) e parabeniza você. Dando o storage 30013 com valor 10
    O valor necessario para o npc anterior voltar a falar com você. Caso você seja caloteiro ele já te desmente.


    Bem simples, não ? Claro que esse npc é minisculo. Porém ja da para seguir como base. OLhe a evolução dele

     


    Assim já para ter uma ideia de um npc maior...
    É só seguir essa base...

    Vamos criar um passo a passo para que não compreendeu.

    NPCs tutoriais

    Situação : O npc Valdemar quer que você entregue uma carta a irmã dele chamada Clarice.

    Pense. Ele irá dar uma carta, e algo que controle se você ja recebeu a carta. Porque se você deu calote uma vez
    Que não se repita, ou seja, um storage value. Que será o 2411 (bem masculo)
     
    local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction creatureSayCallback(cid, type, msg)if(not npcHandler:isFocused(cid)) thenreturn falseendlocal talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cidif msgcontains(msg, 'mission') thenif getPlayerStorageValue(cid,2411) == -1 thenselfSay('Entregue essa carta a minha irmã Clarice.', cid)setPlayerStorageValue(cid,2411,1)doPlayerAddItem(cid,8370,1)elseselfSay('Eu ja te dei a carta, aguardo resposta', cid)endendreturn trueendnpcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new())

    Ai checamos se ele já fez a quest. No caso se tiver -1 (que nunca fez) ele poderá começa-la.
    E dará a carta ao player (item 8370 nem sei o que é)

    Ok. Essa parte ta montada, ele dá a carta.

    Situação : A NPC Clarice está cantarolando em sua casa, quando você chega com uma carta de seu irmão.
    Ela recebe de bom grado porém prescisa provar que recebeu. Porém seu jogador não sabe que existe storage value, então
    Você poderá enviar outra carta ou inventar que ela irá falar com ele.
     
    local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction creatureSayCallback(cid, type, msg)if(not npcHandler:isFocused(cid)) thenreturn falseendlocal talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cidif msgcontains(msg, 'letter') thenif getPlayerStorageValue(cid,2411) == 1 thenselfSay('Ah você relmente tem a carta de meu amado irmão?', cid)talkState[talkUser] = 1elseselfSay('Ah seu fanfarao saia daqui', cid)endelseif talkState[talkUser] == 1 thenif msgcontains(msg, 'yes') thenif doPlayerRemoveItem(cid,8013,1) == 1 thensetPlayerStorageValue(cid,2411,2)selfSay('Obrigada. Agora eu irei falar com ele sobre o assunto', cid)talkState[talkUser] = 0elseselfSay('Você não tem a carta dele', cid)endelseselfSay('Então porque veio aqui ?', cid)endendreturn trueendnpcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new())

    Veja que ela é a prova de erros. Primeiro ao falar letter ela checa se você tem o storage com valor 1 (Ou seja, se você falo com ele)
    Se não falou ela já te manda pescar, se houver, ela já mete pergunta se você tem a carta
    Caso não já te manda pescar
    Caso sim ela tenta pergunta se voce tem a carta
    Caso diga não ela te manda pescar também,
    Caso fale sim ela tenta tirar sua carta, caso você tenha ela te agradece e coloca o storage com valor 2
    Caso não tenha ela diz que você não tem a carta
     
    Manda pescar é um jeito delicado de mandar você ir tomar suco no orificio...
    Vamos suport, que você aceitou e entregou a carta tudo certinho

    Você deve voltar ao Valdemar para ele te dar algo não ?

    Situação : Você ja deu uma de carteiro e agora quer receber sua recompensa, então ao Oscar, Porém ele não é trouxa
    E como ele sabe se você ja fez tudo ?
    Uma dica começa com S e termina com orage...
     
    local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)local talkState = {}function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction creatureSayCallback(cid, type, msg)if(not npcHandler:isFocused(cid)) thenreturn falseendlocal talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cidif msgcontains(msg, 'mission') thenif getPlayerStorageValue(cid,2411) == -1 thenselfSay('Entregue essa carta a minha irmã Clarice.', cid)setPlayerStorageValue(cid,2411,1)doPlayerAddItem(cid,8370,1)elseselfSay('Eu ja te dei a carta, aguardo resposta', cid)endelseif getPlayerStorageValue(cid,2411) == 2 thenselfSay('Parabens. Você fez o pedido certinho! Receba sua recompensa!!!', cid)setPlayerStorageValue(cid,2411,3)doPlayerAddItem(cid,2160,1)elseselfSay('Termine o serviço!', cid)endreturn trueendnpcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)npcHandler:addModule(FocusModule:new())

    Vejam que eu usei a mesma palavra missão e adicionei um else.
    Se ele tiver o storage com valor 2 e falar missão, obviamente ele fez tudo e como é a ultima missão
    Não necessita fazer perguntas retoricas (sem resposta), então ele já da sua recompensa e ja fecha seu storage com 3
     


    Caso você não tenha storage -1 e nem 2 só pode ser 1 (no caso dessa quest) então ele manda você termina o serviço

    PELO AMOR DE DEUS, SEMPRE ESTRUTURE SEU SCRIPT, SE NÃO VOCÊ IRÁ SE CONFUDIR COM ESSE SHOW DE ELSE E IF.

    Isso é a vantagem de se usar o Jiddo System, pois diminuiu a confusão. Porém como ja disse, é coisa de preguiçoso
    Mais cada um com o seu né...

    Aqui acaba o npc de missões. Eu expliquei apenas a parte dos ifs e elseifs. Isso é simples, agora depende de sua capacidade
    e criatividade. Melhor maneira de aperfeiçoar ? fazendo varios!!!

    Eu odeio npcs, quase morri de raiva de ter que fazer esses (serio ) Espero que aproveitem xD


    Funções de NPcs

    Se você leu esse tuto até aqui, é porque não entendeu nada, ou seu interesso muito, por npcs.
    Lembra dos npc base ?
     
    local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endnpcHandler:addModule(FocusModule:new())

    Se você observar ele tem 4 funções ai que nem foram usadas.

    onCreatureAppear(cid) : Ela faz uma ação quando o player entrar em seu raio de ação
    onCreatureDisappear(cid) : Ela faz uma ação quando o player sai do seu raio de ação.
    onCreaturesay(cid) : Quando o player fala algo.
    onThink(cid) : Seria ao pensar ao achar, não tenho certeza do que faz, porém é uma função muito usada.
    onCreatureMove(creature, oldPos, newPos) : Quando a criatura se move de um lugar para outro.


    Pelo que você ja perceberam eu odeio npcs, então não usei muitas dessas funções. No tfs tem o npc cityguard que ataca todos os red skull
    que aparecem em seu raio.
     
    local target = 0local prevTarget = 0local maxChaseDistance = 20local origPos = 0local origDir = NORTHlocal lastAttack = 0local followTimeout = 10local function isSkulled(cid)local skullType = getPlayerSkullType(cid)if(skullType >= 3) thenreturn trueendreturn falseendlocal function goToOrigPos()target = 0lastAttack = 0selfFollow(0)doTeleportThing(getNpcCid(), origPos)endlocal function updateTarget()if(isPlayer(target) == FALSE) thengoToOrigPos()elseif(not isSkulled(target)) thentarget = 0selfSay("Now, behave in the future.")endif(target == 0) thenlocal list = getSpectators(getNpcPos(), 8, 8, false)for i=1, table.getn(list) dolocal _target = list[i]if(_target ~= 0) thenif(isPlayer(_target) == TRUE and isSkulled(_target)) thenif(selfFollow(_target)) thentarget = _targetif(target ~= prevTarget) thenselfSay("We do not tolerate people like you here!")endprevTarget = targetbreakendendendendendendfunction onCreatureAppear(cid)if(cid == getNpcCid()) then--Wake up callorigPos = getNpcPos()--origLook = getCreatureDir(cid)endendfunction onCreatureDisappear(cid)if(target == cid) thengoToOrigPos()endendfunction onCreatureMove(creature, oldPos, newPos)--endfunction onThink()updateTarget()if(target == 0) thenreturnendlocal playerPos = getCreaturePosition(target)local myPos = getNpcPos()if(myPos.z ~= playerPos.z) thengoToOrigPos()returnendif(math.abs(myPos.x - origPos.x) > maxChaseDistance or math.abs(myPos.y - origPos.y) > maxChaseDistance) thenselfSay("I'll catch you next time.")goToOrigPos()returnendif(lastAttack == 0) thenlastAttack = os.clock()endif(os.clock() - lastAttack > followTimeout) then--To prevent bugging the npc by going to a place where he can't reachselfSay("You got me this time, but just wait.")goToOrigPos()returnendif( (math.abs(playerPos.x - myPos.x) <= 1) and (math.abs(playerPos.y - myPos.y) <= 1)) thendoTargetCombatHealth(getNpcCid(), target, COMBAT_LIFEDRAIN, -200, -300, CONST_ME_BLOCKHIT)lastAttack = os.clock()endend

    Vamos estuda-lo e aprender juntos!!!
     
    function onCreatureAppear(cid)if(cid == getNpcCid()) then--Wake up callorigPos = getNpcPos()--origLook = getCreatureDir(cid)endend

    Quando a criatura aparece ele chama a função getNpcCid que checa o player que o npc está focado.
    Ai a variavel origPos vira a coordenada que ele está no momento
     
    function onCreatureDisappear(cid)if(target == cid) thengoToOrigPos()endend

    Quando o player sai da tela, ele verifica se o target (player que ele está focado também!?) é um player
    Se for ele volta para a posição anterior
     
    local function isSkulled(cid)local skullType = getPlayerSkullType(cid)if(skullType >= 3) thenreturn trueendreturn falseend

    Essa função seria a base do npc, ele segue apenas players com skull. Poderiamos mudar essa função para ele seguir apenas
    player druids ? Claro!!!

    Como é um tutorial mudar o nome da função iriamos que remodelar todo o script (enche o saco) vamos apenas mudar dentro da função
     
    local function isSkulled(cid)local vocType = getPlayerVocation(cid)if(vocType== 2) or (vocType == 6) thenreturn trueendreturn falseend

    Mudando só isso os druid iriam sofrer na mão desses npcs xD
    Da para fazer ele atacar apenas monstros ? (acho que sim)
     
    local function isSkulled(cid)local idType = isPlayer(cid)if (idType ~= 1) thenreturn trueendreturn falseend

    No caso se for diferente de 1 ele arrebenta de magia. Teste essas modificações.
    Porém a ideia base é entender as funções e não só modifica-las.

     


    Bem a função updateTarget faz ele apenas fixar a target (alvo) players com skull white ou red.
    Então deixe ela para outro dia.

    Vamos verificar a onThink
     
    function onThink()updateTarget()if(target == 0) thenreturnendlocal playerPos = getCreaturePosition(target)local myPos = getNpcPos()if(myPos.z ~= playerPos.z) thengoToOrigPos()returnendif(math.abs(myPos.x - origPos.x) > maxChaseDistance or math.abs(myPos.y - origPos.y) > maxChaseDistance) thenselfSay("I'll catch you next time.")goToOrigPos()returnendif(lastAttack == 0) thenlastAttack = os.clock()endif(os.clock() - lastAttack > followTimeout) then--To prevent bugging the npc by going to a place where he can't reachselfSay("You got me this time, but just wait.")goToOrigPos()returnendif( (math.abs(playerPos.x - myPos.x) <= 1) and (math.abs(playerPos.y - myPos.y) <= 1)) thendoTargetCombatHealth(getNpcCid(), target, COMBAT_LIFEDRAIN, -200, -300, CONST_ME_BLOCKHIT)lastAttack = os.clock()end

    Explicando cada if.

    - Primeiro ele checa se ele tem target, se não tiver recomeça o ontarget
    - Segundo se ele verifica se o player está no mesmo andar que ele (coordenada z) se não tiver volta pro começo
    - Terceiro ele verifica se o player está muito longe (distancia maxima especificada acima), caso esteja ele fala
    mais ou menos "te pego na proxima" e volta pro seu respawn.
    - Quarto Ele muda seu ultima attack para o tempo atual do servidor
    - Quinto Ele verifica se ja passou o "tempo de descanso dele)
    - Se o tiver na posição certa de ataque, ele mete o sabugo no player espacando ele. Até o player morrer ou fugir.


    Entederam a logica ? Não !? Tudo bem. Vai treinando...
    Sinceramente esse npc é o mais complexo que ja vi.
    Eu entendi ele, porém não tenho animo de refaze-lo xD


    Espero que tenham gostado do tutorial, eu usei esse ultimo npc para vocês conseguirem entender que npc é complicado
    E pegar outros como exemplo é normal e muito util. Porém nunca levem creditos por aquilo que não fizeram.

    Duvidas, ofensas, reclamações ou elogios postem sem medo. Eu disse o que quis aqui e ouvirei tudo também

    Terminei isso as 01 e 07 minutos (ou Seja 02 e 07 ) acabo o horario de verão tenho + 1 hora pra dormir.

    Bom proveito!!
    E esperem os proximos que virão
  9. Upvote
    Allangod deu reputação a Akzs em Limite de outfit   
    ve na outfit.h
  10. Upvote
    Allangod deu reputação a Tony em [Pedido] Faça seu pedido!   
  11. Upvote
    Allangod deu reputação a lucasromero em Botando cooldown nessa spell   
    Testa ae.
  12. Upvote
    Allangod deu reputação a caotic em Clone copiando look   
    function onLook(cid, thing, position, lookDistance) local nome = "Clone das Sombras" if isMonster(thing.uid) and getCreatureMaster(thing.uid) and getCreatureName(thing.uid) == nome then local string = " "..getCreatureName(getCreatureMaster(thing.uid)).." Level-"..getPlayerLevel(getCreatureMaster(thing.uid)).." Vocation - "..getPlayerVocationName(getCreatureMaster(thing.uid)).."" doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, string) return false end return true end
     
    Coloque a tag em creaturescripts.xml:
     
    <event type="look" name="clone" event="script" value="clone.lua"/>
     
    Registre o evento em login.lua:
     
    registerCreatureEvent(cid, "clone")
  13. Upvote
    Allangod deu reputação a Slicer em Ao atacar mudar outfit   
    pra soh mudar quando ta perto coloca..

    if getDistanceBetween(getPlayerPosition(cid), getPlayerPosition(target)) > 1 then return true end
     
    tony
    da sim pra usar tabelas pra isso...
  14. Upvote
    Allangod deu reputação a Oneshot em Ao atacar mudar outfit   
    local outfits = { [136] = 137, [128] = 129, } function onAttack(cid, target) local tmp = getCreatureOutfit(cid) if outfits[tmp.lookType] then tmp.lookType = outfits[tmp.lookType] doSetCreatureOutfit(cid, tmp, 900) end return true end
     

    registerCreatureEvent(cid, "AttackAnimation")
     

    <event type="attack" name="AttackAnimation" event="script" value="attackanimation.lua"/>
     
    Testado e funcional.
     
    Coloquei como exemplo, se o jogador está com a outfit Citizen, muda para Hunter por 900 milissegundos, ficaria bem mais realista se mudasse conforme o attackspeed do jogador, mas não existe uma função que retorne o attackspeed.
     
    Abraços.
  15. Upvote
    Allangod deu reputação a SmiX em Editar essas spell ajuda   
    sugura ai:
     
     
  16. Upvote
    Allangod deu reputação a SmiX em Talkaction para saber que missao eu estou   
    tag:

    <talkaction words="/infomission" event="script" value="nome do arquivo.lua"/>
     
     
    script:

    function onSay(cid, words, param) if param ~= "" then return false end local storages = { [1] = "You are in mission 1.", [2] = "You are in mission 2.", [3] = "You are in mission 3.", storage = 2124, questName = "SmiX Quest", } if(getPlayerStorageValue(cid, storages.storage) < 0) then return doPlayerSendTextMessage(cid, 27, "You do not have to:"..storages.questName..".") and true end doPlayerSendTextMessage(cid, 27, "--Status Quest--\n"..storages[getPlayerStorageValue(cid, storages.storage)]..".") end
  17. Upvote
    Allangod deu reputação a Slicer em Spell de ilusão Ajuda Vodkart   
    local function random(pos) return {x = pos.x+math.random(-4, 4), y = pos.y+math.random(-4, 4), z = pos.z} end local function sendEff(cid, eff, t) if t > 0 and isCreature(cid) then local pos = getPlayerPosition(cid) for i = 1, 60 do doSendMagicEffect(random(pos), eff, cid) end addEvent(sendEff, 1000, cid, eff, t-1) end end local eff = 21 --efeito local time = 15 --por qnts segs vai aparecer o efeito function onCastSpell(cid, var) local target = getCreatureTarget(cid) if not isCreature(target) then doPlayerSendCancel(cid, "You need a target.") return false end sendEff(target, eff, time) return true end
    oia essa eu realmente n sei se vai da certo kkk
    qlqr coisa, se ficar muito efeito sei la.. tenta diminuir aki..

    for i = 1, 60 do
    diminui, ou aumenta sei la, o 60 ali..
  18. Upvote
    Allangod deu reputação a Slicer em Spell que teleporta o target   
    testa ae
  19. Upvote
    Allangod deu reputação a Slicer em Spell de copiar roupa do inimigo   
    erro meu..

    local taget = getCreatureTarget(cid)
    troca por isso..

    local target = getCreatureTarget(cid)
  20. Upvote
    Allangod deu reputação a caotic em Colocar NPC para teleportar se tiver storage   
    local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) local pos = {x=1039, y=1072, z=7} -- Local da hunt local posreturn = {x=1039, y=1072, z=7} -- Posiçao onde o player sera teleportado quando acabar o tempo local money = 400000 --- Quanto de dinheiro sera removido config = { time = 1, ---Tempo que ele vai ficar na hunt sabendo que cada numeral equivale a um minuto----- str = 2124, --- Storage que ele necessita msg = "Você não pode entrar" --- Mensagem que irá aparecer se ele não tiver a storage } function doReturnPos() doTeleportThing(cid, posreturn) setGlobalStorageValue(24688, 0) setGlobalStorageValue(24686, none) setPlayerStorageValue(cid, 28680, 0) end if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if msgcontains(msg, 'chuunin') then if getPlayerStorageValue(cid, config.str) ~= 1 then doPlayerSendTextMessage(cid,22, config.msg) return true end if getGlobalStorageValue(24688) == 1 then doPlayerSendTextMessage(cid,22,"O player "..getGlobalStorageValue(24686).." esta fazendo o teste") return true end if not doPlayerRemoveMoney(cid, money) then doPlayerSendTextMessage(cid,22,""..getPlayerName(cid).." precisa de "..money.." para fazer o chuunin teste") return true end doPlayerRemoveMoney(cid, money) doPlayerSendTextMessage(cid,22,"Obrigado "..getPlayerName(cid).." foi teleportado.") doTeleportThing(cid, pos) setGlobalStorageValue(24688, 1) setGlobalStorageValue(24686, getPlayerName(cid)) setPlayerStorageValue(cid, 28680, 1) addEvent(doReturnPos, config.time*60*1000) else selfSay('Diga chuunin', cid) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
  21. Upvote
    Allangod deu reputação a Slicer em Colocar para NPC remover item   
    tenta ae..
  22. Upvote
    Allangod recebeu reputação de iFaxBR em [Spell] Narutibia   
    Vá em spells/scripts, crie um arquivo .lua chamado jutsunarutibia e coloque isso dentro
     
     
     
    Para você editar a força voce troca a força e o efeito, voce troca aqui
     
     
    Agora vai em spells.xml e coloca essa tag dentro:
     
     
  23. Upvote
    Allangod deu reputação a HidekiKty em Usar spell só se tiver pisando no sqm (ajuda Vodkart)   
    Use esse script no lugar da sua spell:

    local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_EFFECT, 35) setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_NONEDAMAGE) setCombatParam(combat1, COMBAT_PARAM_HITCOLOR, 204) function onGetFormulaValues(cid, level, maglevel) min = -((level*1 + maglevel*1.6) + 125) max = -((level*1 + maglevel*1.8) + 125) return min, max end setCombatCallback(combat1, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_EFFECT, 19) setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat2, COMBAT_PARAM_HITCOLOR, 204) function onGetFormulaValues(cid, level, maglevel) min = -((level*5.4 + maglevel*6.4)) max = -((level*5.5 + maglevel*6.5)) return min, max end setCombatCallback(combat2, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") local arr1 = { {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, } local arr2 = { {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, } local area1 = createCombatArea(arr1) local area2 = createCombatArea(arr2) setCombatArea(combat1, area1) setCombatArea(combat2, area2) local function onCastSpell1(parameters) return isPlayer(parameters.cid) and doCombat(parameters.cid, combat1, parameters.var) end local function onCastSpell2(parameters) return isPlayer(parameters.cid) and doCombat(parameters.cid, combat2, parameters.var) end function onCastSpell(cid, var) if getPlayerStorageValue(cid, 8585) >= 1 then return false end local parameters = { cid = cid, var = var} addEvent(onCastSpell1, 100, parameters) addEvent(onCastSpell2, 100, parameters) return true end
     
    Abra a pasta data/movements/scripts e crie um arquivo chamado spelltile.lua
    Adicione o script:

    local stor = 8585 function onStepIn(cid, item, frompos) if getPlayerStorageValue(cid, stor) <= 0 then setPlayerStorageValue(cid, stor, 1) end end function onStepOut(cid, item, frompos) if getPlayerStorageValue(cid, stor) >= 1 then setPlayerStorageValue(cid, stor, 0) end end
    Em data/movements abra o arquivo movements.xml
    Adicione as tags:

    <movevent type="StepIn" actionid="8585" event="script" value="spelltile.lua"/> <movevent type="StepOut" actionid="8585" event="script" value="spelltile.lua"/>
  24. Upvote
    Allangod deu reputação a MaXwEllDeN em Usar spell só se tiver pisando no sqm (ajuda Vodkart)   
    Exatamente isso xD
  25. Upvote
    Allangod deu reputação a brun123 em Remover Summon Do Inimigo   
    Spell que remove os summons que tem o mesmo nome do mestre (precisa estar atacando algum summon dele ou o verdadeiro):
     

    function onCastSpell(cid, var) local target = getCreatureTarget(cid) if not isCreature(target) then doPlayerSendCancel(cid, "You need a target.") return false end local master = getCreatureMaster(target) if not isPlayer(master) then doPlayerSendCancel(cid, "This spell works only against players.") return false end if #getCreatureSummons(master) > 0 then local function doRemoveSummon(creature) if isCreature(creature) then doSendMagicEffect(getThingPos(creature), CONST_ME_POFF) doRemoveCreature(creature) end end local success = false for _, sid in pairs (getCreatureSummons(master)) do if getCreatureName(sid) == getCreatureName(master) then addEvent(doRemoveSummon, _ * 95, sid) success = true end end end return success end
     
    Spell que indica a posição do verdadeiro:
     

    function onCastSpell(cid, var) local target = getCreatureTarget(cid) if not isCreature(target) then doPlayerSendCancel(cid, "You need a target.") return false end local master = getCreatureMaster(target) if not isPlayer(master) then doPlayerSendCancel(cid, "This spell works only against players.") return false end local function revelar(cid, target, times) if not isCreature(cid) or not isCreature(target) or times <= 0 then return end doSendMagicEffect(getThingPos(target), CONST_ME_TUTORIALSQUARE, cid) doSendMagicEffect(getThingPos(target), CONST_ME_TUTORIALARROW, cid) addEvent(revelar, 450, cid, target, times - 1) end revelar(cid, master, 10) return true end
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...