Ir para conteúdo

Yan Oliveira

Moderador
  • Total de itens

    2187
  • Registro em

  • Última visita

  • Dias Ganhos

    57

Histórico de Reputação

  1. Upvote
    Yan Oliveira recebeu reputação de BrunooMaciell em [Tutorial] Criando Novos Pokemons Para Pda [Iniciantes]   
    Você sabe o nome da base que está usando? Baixou ela recentemente?
  2. Thanks
    Yan Oliveira recebeu reputação de Jhony Araujo em Clicar no item e ganhar montaria (10.0)   
    De nada bro ☺️, só não esquece de colocar o ID da montaria porque coloquei XXX pois não sei qual o id da que quer, se não trocar vai dar erro no script.
     
    Qualquer problema só me avisar.
  3. Upvote
    Yan Oliveira recebeu reputação de BrunooMaciell em [Resolvido] (Pedido) Script   
    Vai no remere's, abre o seu mapa e vai no baú onde está os pokémons, depois adicione o seguinte actiondId em todos os baús: 18777 (Pode ser outro de sua preferência, mas tem que ser o mesmo para todos os baús).
     
    Agora em Data/Actions/Scripts crie um arquivo chamado start.lua e adicione todo o seguinte código dentro: 
    local starterpokes = { ["Bulbasaur"] = {x = 1009, y = 1009, z = 7}, ["Charmander"] = {x = 1012, y = 1009, z = 7}, ["Squirtle"] = {x = 1015, y = 1009, z = 7}, } local itens = { [2394] = 20, [2152] = 10, [12346] = 5, [12344] = 5, } local btype = "Icone" local storage = 77477 local cities = { ["Saffron"] = 1, ["Cerulean"] = 2, ["Lavender"] = 3, ["Fuchsia"] = 4, ["Celadon"] = 5, ["Viridian"] = 6, ["Pallet"] = 7, ["Pewter"] = 8, ["Vermilion"] = 9, ["Cinabar"] = 10, } ---------------------------------------- CÓDIGO ------------------------------------ function onUse(cid, item, frompos, item2, topos) if getPlayerStorageValue(cid, storage) < 1 then local pokemon = "" for a, b in pairs (starterpokes) do if isPosEqualPos(topos, b) then pokemon = a end end if pokemon == "" then return true end doPlayerSendTextMessage(cid,22,"Boa escolha. Divirta-se!") addPokeToPlayer(cid, pokemon, 0, nil, btype, true) setPlayerStorageValue(cid, 8955, 1) nome_pokemon = pokemon for i, j in pairs(itens) do doPlayerAddItem(cid, i, j) end doPlayerSetTown(cid, cities["Saffron"]) -- COLOCA O NOME DA CIDADE QUE QUER QUE SEJA CIDADE NATAL doSendMagicEffect(getThingPos(cid), 29) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) doSendMagicEffect(getThingPos(cid), 40) doSendMagicEffect(getThingPos(cid), 7) setPlayerStorageValue(cid, storage, 1) return true else doPlayerSendTextMessage(cid, 27, "Você já escolheu seu pokémon!") return true end return TRUE end E salve o arquivo com a codificação ANSI, senão vai aparecer caracteres inválidos no chat porque coloquei palavras com acento.
     

     
    *OBS: Criei um novo arquivo para manter o outro como backup e para ficar mais organizado. E também com um nome melhor rs.
     
    Agora em Data/Actions/ abra o Actions.xml, procure por essa tag:
    <action actionid="1740" event="script" value="IniciasPokes.lua"/> E comente ela (Em xml é <!-- -->), e embaixo adicione essa tag:
    <action actionid="18777" event="script" value="start.lua"/> <!-- COLOQUE O ID DA ACTIONID DO REMERES -->  
    Não esquece de adicionar os outros pokémon na tabela, eu deixei só 3 para teste, adicione o restante com suas devidas localizações.
     
    Eu testei aqui e deu certo, e não esqueça de salvar o actionId pelo remere's.
     
    Testa e me fala.
  4. Thanks
    Yan Oliveira recebeu reputação de Jhony Araujo em Clicar no item e ganhar montaria (10.0)   
    Sim amigo, você criou o post na seção errada, o certo seria em Pedidos de Script já que quer um script, e essa seção é para pessoas que tem um script existente e precisa de suporte.
     
    Mas vamos lá, vai em Data/Actions/Scripts e crie um arquivo recebe_montaria.lua e adicione o código dentro:
    local id_montaria = XXXX -- AQUI COLOCA O ID DA MONTARIA local repetir = false -- AQUI É UMA CONDIÇÃO PARA SABER SE O PLAYER PODE RECEBER NOVAMENTE A MONTARIA, CASO ELE SÓ POSSA USAR O ITEM 1 VEZ, DEIXE FALSE, SENÃO TRUE local storage = 36587 -- STORAGE PARA SABER SE O PLAYER JÁ USOU O ITEM ANTES local level = 1 -- NÍVEL MÍNIMO PARA USAR O ITEM function onUse(cid, item, frompos, item2, topos) if getPlayerLevel(cid) < level then doPlayerSendTextMessage(cid, 27, "You need to be at least level " ..level.. " or more to use this item.") return true end if (getPlayerStorageValue(cid, storage) < 1) and (not repetir) then doSendMagicEffect(getThingPos(cid), 29) doPlayerAddMount(cid, id_montaria) doPlayerSendTextMessage(cid, 27, "Congratulations! You received a mount " ..getItemNameById(id_montaria).. ".") doRemoveItem(item.uid) setPlayerStorageValue(cid, storage, 1) return true elseif (getPlayerStorageValue(cid, storage) > 0) and (not repetir) then doPlayerSendTextMessage(cid, 27, "You have already used the item before.") return true end if repetir then doSendMagicEffect(getThingPos(cid), 29) doPlayerAddMount(cid, id_montaria) doPlayerSendTextMessage(cid, 27, "Congratulations! You received a mount " ..getItemNameById(id_montaria).. ".") doRemoveItem(item.uid) return true end return true end end agora vai em Data/Actions e abra o Scripts.xml e adicione a seguinte tag dentro:
    <action itemid="2278" event="script" value="recebe_montaria.lua"/> <!-- COLOCA O ID DO ITEM ALI ONDE PEDE -->  
    Coloque o ID da montaria na variável onda ta "XXXX".
     
    Como você não deu muitas informações do item, se pode usar mais de uma vez ou não, eu deixei para usar só 1 vez, mas caso queira usar mais, só mudar a variável repetir para true, senão deixa false. (Seria bom avisar se quer que repita ou não, porque com a condição que deixei deixo o código um pouco poluído, ai sabendo como você quer, eu deixo o código limpo caso não possa repetir.)
     
    Também coloquei uma verificação de nível, mas deixei 1 para que todos possa usar, mas caso queira especificar, só mudar na variável level.
     
    Testa e me fala, eu fiz de cabeça e não consigo testar porque não tenho nenhuma base de Tibia aqui.
  5. Upvote
    Yan Oliveira recebeu reputação de Samukajoga em npc pra resetar storage   
    Eu fiz com NPC, caso queira com item só falar que faço também.
     
    Vai em Data/NPC e crie Resetador.xml (crie como codificação ANSI porque usei acentuação, mas caso use inglês, pode deixar no UTF-8 mesmo) e adicione o código dentro:
     
    <?xml version="1.0" encoding="UTF-8"?> <npc name="Resetador" script="Resetador.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1"> <health now="150" max="150"/> <look type="1421" head="114" body="119" legs="114" feet="114" corpse="2212"/> <parameters> <parameter key="message_greet" value="Olá |PLAYERNAME|, o que você procura aqui? Diga {help} ou {ajuda} para mais informações."/> </parameters> </npc> Agora em Data/NPC/Scripts crie o arquivo Resetador.lua (crie como codificação ANSI porque usei acentuação, mas caso use inglês, pode deixar no UTF-8 mesmo) e adicione o código dentro:
    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) if(not npcHandler:isFocused(cid)) then return false end -- VARIÁVEIS -- local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid msg = string.lower(msg) local level = 100 local storages = {100008, 100009, 100010} ----------------------------------- [ DIALOGO COM NPC] --------------------------------- if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') then selfSay("Se você for nível "..level.. " ou mais eu posso resetar todas as quests que você já fez. Gostaria de reseta-lás?", cid) talkState[talkUser] = 1 return true elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then if getPlayerLevel(cid) >= level then for i = 1, #storages do if getPlayerStorageValue(cid, storages[i]) > 0 then doSendMagicEffect(getPlayerPosition(cid), 28) doPlayerSendTextMessage(cid, 27, "Todas as quests foram resetadas com sucesso. Agora você pode fazê-las novamente.") setPlayerStorageValue(cid, storages[i], 0) return true else selfSay("Todas as quests já foram resetadas.", cid) return true end end talkState[talkUser] = 0 end return true elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não')) and talkState[talkUser] == 1 then selfSay("Ok então.", cid) talkState[talkUser] = 0 return true end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Eu fiz bem básico mesmo para ver se é assim que quer. Deixei a frase como storage porque não sei se irá adicionar o código em server online e os players não vão saber o que é storage, então deixei como quest a mensagem. Deixei apenas uma verificação para falar com npc se o player possuir nível 100 ou mais. Caso queira o NPC com mais validações só falar.
     
    As storages que quiser resetar, adicione na tabela storages, deixei 3 de exemplo lá.
     
    Testei aqui e está funcionando, mas qualquer problema me fala.
     
  6. Upvote
    Yan Oliveira recebeu reputação de BrunoMaciel em (Pedido) NPC   
    - Começando pelo NPC de Task de item
     
    Vai em Data/NPC e crie o arquivo Breno.xml e adicione o código dentro:
    <?xml version="1.0" encoding="UTF-8"?> <npc name="Breno" script="Breno.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1"> <health now="150" max="150"/> <look type="1421" head="114" body="119" legs="114" feet="114" corpse="2212"/> <parameters> <parameter key="message_greet" value="Olá |PLAYERNAME|, em que posso ajudar? Diga {help}, {ajuda} ou {task} para mais informações."/> </parameters> </npc> Agora em Data/NPC/Scripts crie o arquivo Breno.lua (com codificação ANSI) e adicione o código dentro:
     
    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) if(not npcHandler:isFocused(cid)) then return false end -- VARIÁVEIS -- local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid msg = string.lower(msg) local storage = 150000 local storage_start = 150001 local id_item = 12163 -- ID DO ITEM QUE O NPC PEDE local quantidade_item = 100 -- QUANTIDADE DE ITENS QUE O NPC PEDE local id_item_recebido = 16563 -- ID DO ITEM QUE RECEBE AO COMPLETAR A TASK local quantidade_item_recebido = 1 -- QUANTIDADE DE ITENS QUE RECEBE AO COMPLETAR A TASK ----------------------------------- [ DIALOGO COM NPC] --------------------------------- if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'task') then if getPlayerStorageValue(cid, storage) == 1 then selfSay("Você já completou minha task.", cid) talkState[talkUser] = 0 return true else selfSay("Preciso que você me traga " ..quantidade_item.. " " ..getItemNameById(id_item).. " Você trouxe?", cid) talkState[talkUser] = 1 return true end elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then if getPlayerStorageValue(cid, storage_start) < 1 then setPlayerStorageValue(cid, storage_start, 1) return true end if getPlayerItemCount(cid, id_item) >= quantidade_item then doPlayerRemoveItem(cid, id_item, quantidade_item) selfSay("Parabéns! Você trouxe " ..quantidade_item.. " " ..getItemNameById(id_item).. " que eu precisava. Receba sua recompensa.", cid) doPlayerAddItem(cid, id_item_recebido, quantidade_item_recebido) doSendMagicEffect(getPlayerPosition(cid), 29) setPlayerStorageValue(cid, storage, 1) talkState[talkUser] = 0 return true else selfSay("Você ainda não trouxe " ..quantidade_item.. " " ..getItemNameById(id_item).. " que eu preciso.", cid) talkState[talkUser] = 0 return true end return true elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não')) and talkState[talkUser] == 1 then if getPlayerStorageValue(cid, storage_start) < 1 then selfSay("Ok, fale comigo novamente caso queira fazer minha task.") talkState[talkUser] = 0 return true else selfSay("Então vá buscar os itens que eu pedi.") talkState[talkUser] = 0 return true end return true end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())  
    - Agora é o NPC da Task que derrota Pokémon
     
    Vá em Data/NPC e crie o arquivo Brime.xml e adicione o código dentro:
    <?xml version="1.0" encoding="UTF-8"?> <npc name="Brime" script="Brime.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1"> <health now="150" max="150"/> <look type="1421" head="114" body="119" legs="114" feet="114" corpse="2212"/> <parameters> <parameter key="message_greet" value="Olá |PLAYERNAME|, eu recompenso jogadores que aceitam meus desafios. Diga {help}, {ajuda} ou {task} para mais informações."/> </parameters> </npc>  
    Agora em Data/NPC/Scripts crie o arquivo Brime.lua (com codificação ANSI) e adicione o código dentro:
    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) if(not npcHandler:isFocused(cid)) then return false end -- VARIÁVEIS -- local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid msg = string.lower(msg) local nome_poke_task = "Scyther" local quantidade_pokemon = 50 local storage_npc = 120000 local storage_task = 110000 local storage_start = 121000 -- RECOMPENSAS -- local id_item = 12545 local quantidade_item = 1 local exp = 500000 ----------------------------------- [ DIALOGO COM NPC] --------------------------------- if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'task') then if getPlayerStorageValue(cid, storage_task) == 1 then -- VERIFICA SE TERMINOU A TASK selfSay("Você já completou minha missão.", cid) talkState[talkUser] = 0 return true else selfSay("Preciso que você derrote alguns {"..nome_poke_task.."} para mim. Você aceita este desafio?", cid) talkState[talkUser] = 1 return true end elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim') or (msgcontains(msg, 'ok'))) and talkState[talkUser] == 1 then if getPlayerStorageValue(cid, storage_start) < 1 then setPlayerStorageValue(cid, storage_start, 1) return true end if getPlayerStorageValue(cid, storage_npc) == 1 then selfSay("Parabéns! Você completou minha tarefa. Receba sua recompensa.", cid) doPlayerAddExp(cid, exp) doPlayerAddItem(cid, id_item, quantidade_item) doSendAnimatedText(getThingPos(cid), exp, 27) doSendMagicEffect(getPlayerPosition(cid), 29) setPlayerStorageValue(cid, storage_task, 1) talkState[talkUser] = 0 return true else if getPlayerStorageValue(cid, storage_npc) < 0 then selfSay("Vá derrotar todos os " ..quantidade_pokemon.. " " ..nome_poke_task.. " para mim.") setPlayerStorageValue(cid, storage_npc, 0) talkState[talkUser] = 0 return true elseif getPlayerStorageValue(cid, storage_npc) == 0 then selfSay("Você ainda não derrotou todos os " ..quantidade_pokemon.. " " ..nome_poke_task.. ". Vá derrotar os " ..nome_poke_task.. " restante antes de falar comigo.") talkState[talkUser] = 0 return true end return true end return true elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não')) and talkState[talkUser] == 1 then if getPlayerStorageValue(cid, storage_start) < 1 then selfSay("Ok, fale comigo novamente caso queira fazer minha task.", cid) talkState[talkUser] = 0 return true else selfSay("Então vá completar sua tarefa.") talkState[talkUser] = 0 return true end return true end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())  
    Agora em Data/Creaturescripts/scripts crie o arquivo task_npc.lua (com a codificação ANSI do arquivo pelo fato de ter acentuação no português) e adicione o código dentro:
    local storage_npc = 120000 local storage_contador = 120001 local pokemon = { [1] = {name = "Scyther", count = 50}, } local restante local nome = pokemon[1].name function onKill(cid, target) for _, t in ipairs(pokemon) do local quantidade = t.count if getCreatureName(target) == nome then if getPlayerStorageValue(cid, storage_npc) == 0 then if getPlayerStorageValue(cid, storage_contador) == quantidade then doPlayerSendTextMessage(cid, 27, "Não há mais " ..nome.. " para derrotar.") setPlayerStorageValue(cid, storage_contador, getPlayerStorageValue(cid, storage_contador) + 1) setPlayerStorageValue(cid, storage_npc, 1) return true elseif getPlayerStorageValue(cid, storage_contador) < quantidade then -- AS STORAGES COMEÇAM COM -1, ENTÃO NESSA PARTE EU APENAS DEFINO COMO 0 PARA NA LINHA SEGUINTE JÁ IR PARA 1. NÃO COLOQUE RETURN NESSE LAÇO PORQUE VAI ENCERRAR O ESCOPO E NÃO VAI CONTAR CORRETAMENTE -- if getPlayerStorageValue(cid, storage_contador) < 0 then setPlayerStorageValue(cid, storage_contador, 0) end setPlayerStorageValue(cid, storage_contador, getPlayerStorageValue(cid, storage_contador) + 1) restante = quantidade - getPlayerStorageValue(cid, storage_contador) doPlayerSendTextMessage(cid, 27, "Faltam " ..restante.. " " ..nome.. " para derrotar.") return true end elseif (getPlayerStorageValue(cid, storage_npc) < 0) or (getPlayerStorageValue(cid, storage_npc) > 0) then return true end return true end return true end end Agora em Data/Creaturescripts abra o creaturescripts.xml e adiciona a tag:
    <event type="kill" name="task_npc" script="task_npc.lua"/> E por último em Data/Creaturescripts/Scripts abra o Login.lua e adicione a tag na parte de eventos:
    registerCreatureEvent(cid, "task_npc")  
  7. Upvote
    Yan Oliveira recebeu reputação de Olan trein em [Resolvido] Poder ter +de uma box para abrir   
    @Olan trein
     
    Substitua seu código por esse:
     
    local id_box = 15266 local storage_time = 100001 local storage = 100000 local addons = {14953,14954,14956,14996,14997,14998,14955} local quantidade = 10 function onUse(cid, item, frompos, item2, topos, pos) local randomChance = math.random(1, #addons) if item.itemid == id_box then if (getPlayerStorageValue(cid, storage) <= 10) and (getPlayerStorageValue(cid, storage_time) <= os.time()) then doPlayerAddItem(cid, addons[randomChance], quantidade) doSendMagicEffect(getCreaturePosition(cid), 28) doPlayerSendTextMessage(cid, 19, "Você ganhou " .. quantidade.. " " ..getItemNameById(addons[randomChance])) if getPlayerStorageValue(cid, storage) < 0 then setPlayerStorageValue(cid, storage, 0) end setPlayerStorageValue(cid, storage, getPlayerStorageValue(cid, storage) + 1) if getPlayerStorageValue(cid, storage) >= 10 then setPlayerStorageValue(cid, storage_time, os.time() + (3*60*60)) end return true else doPlayerSendTextMessage(cid, 27, "Você já abriu todas as 10 boxes possíveis dentro do tempo. Agora é necessário esperar 3 horas.") return true end return true end end Assim como pediu, ele consegue abrir 10 boxes no máximo dentro do período de 3 horas, depois que abrir as 10, é necessário esperar 3 horas.
     
    Eu testei aqui e funcionou, testa ai e me fala se der algum problema.
  8. Upvote
    Yan Oliveira recebeu reputação de gabneitor em Ajuda no Recompensa por Nv por favor!   
    Obrigado pelas palavras amigo ! ?
     
    Descobriu qual era o problema então? Mas se quiser pegar esse último vai funcionar também.
  9. Amei
    Yan Oliveira deu reputação a gabneitor em Ajuda no Recompensa por Nv por favor!   
    Foi por isso não man, acabei de testar aqui de novo, toda vez que me manda um código novo eu crio um novo personagem e coloco a beira do nível pra upar no primeiro funcionou já então ta de boa!! vlw ai mano vc é D+ vou concentrar em outro probleminha aqui agr kk'
  10. Amei
    Yan Oliveira recebeu reputação de gabneitor em Ajuda no Recompensa por Nv por favor!   
    De nada! Que bom que funcionou.
     
    Eu também coloquei efeito ao alcançar tal nível, mas esqueci que geralmente nos server, já tem no script de up efeito de nível. Vê se achar que está ruim (ou duplicado) e quiser que eu tire, só falar.
  11. Upvote
    Yan Oliveira recebeu reputação de gabneitor em Ajuda no Recompensa por Nv por favor!   
    Substitui todo seu código por esse:
     
    local id_crystal_coin = 3043 -- ID CRYSTAL COIN local id_montaria_donkey = 13 -- ID MONTARIA DONKEY local id_plague_mask = 13925 -- ID PLAGUE MASK local id_plague_bell = 13926 -- ID PLAGUE BELL local id_soft_boots = 6132 -- ID SOFT BOOTS local id_montaria_crystal_wolf = 16 -- ID MONTARIA CRYSTAL WOLF -- TABELA PARA ADDON CITIZEN DE ACORDO COM SEXO DO PLAYER -- local addon_citizen = { [0] = 136, [1] = 128 } function onAdvance(cid, skill, oldlevel, newlevel) if getPlayerLevel(cid) >= 20 and getPlayerStorageValue(cid, 99963) < 1 then doPlayerAddItem(cid, id_crystal_coin, 2) -- ADICIONA CRYSTAL COIN doPlayerAddOutfit(cid, addon_citizen[getPlayerSex(cid)], 3) -- ADICIONA ADDON CITIZEN FULL DE ACORDO COM SEXO DO PLAYER doSendMagicEffect(cid, CONST_ME_POFF) -- EFEITO AO UPAR doPlayerSendTextMessage(cid, 19, "You have received 2 Crystal Coin and the addon Citizen Full for advancing to level 20.") -- MENSAGEM setPlayerStorageValue(cid, 99963, 1) -- STORAGE PARA NÃO FICAR UPANDO MAIS ASSIM QUE ESTIVER NO LEVEL OU SUPERIOR return true elseif getPlayerLevel(cid) >= 50 and getPlayerStorageValue(cid, 99964) < 1 then doPlayerAddMount(cid, id_montaria_donkey) -- ADICIONA MO0NTARIA DONKEY doSendMagicEffect(cid, CONST_ME_POFF) doPlayerSendTextMessage(cid, 19, "You have received Donkey mount for advancing to level 50.") setPlayerStorageValue(cid, 99964, 1) return true elseif getPlayerLevel(cid) >= 80 and getPlayerStorageValue(cid, 99965) < 1 then doPlayerAddItem(cid, id_plague_mask, 1) -- ADICIONA PLAGUE MASK doPlayerAddItem(cid, id_plague_bell, 1) -- ADICIONA PLAGUE BELL doSendMagicEffect(cid, CONST_ME_POFF) doPlayerSendTextMessage(cid, 19, "You have received Plague Mask and Plague Bell for advancing to Level 80.") setPlayerStorageValue(cid, 99965, 1) return true elseif getPlayerLevel(cid) >= 100 and getPlayerStorageValue(cid, 99966) < 1 then doPlayerAddItem(cid, id_soft_boots, 1) -- ADICIONA SOFT BOOTS doSendMagicEffect(cid, CONST_ME_POFF) doPlayerSendTextMessage(cid, 19, "You have received Soft Boots for advancing to Level 100.") setPlayerStorageValue(cid, 99966, 1) return true elseif getPlayerLevel(cid) >= 150 and getPlayerStorageValue(cid, 99969) < 1 then doPlayerAddMount(cid, id_montaria_crystal_wolf) -- ADICIONA MONTARIA CRYSTAL WOLF doSendMagicEffect(cid, CONST_ME_POFF) doPlayerSendTextMessage(cid, 19, "You have received the Crystal Wolf mount for advancing to Level 150.") setPlayerStorageValue(cid, 99967, 1) return true end return true end  
    Eu peguei os ID da montaria, addon citizen e crystal coin em outros scripts porque eu não conheço muito do tibia então não sei qual os id. Mas qualquer coisa, só trocar os id nas variáveis. 
     
    Também tirei o Balance porque você não comentou dele, então não sei se era para continuar com ele ou não no código, mas se era para ele continuar, só me avisar que coloco novamente.
     
    Testa e me fala se der algum problema.
  12. Upvote
    Yan Oliveira recebeu reputação de New'gadu em Pvp enforce wodbo   
    De acordo como conversamos no privado, estou mandando o código como pediu.
     
    Vai em Data/Creaturescripts/Scripts e crie um arquivo chamado pvp_enforced.lua e adicione o código dentro:
    local exp -- EXP function onKill(cid, target, lastHit) if isPlayer(cid) and isPlayer(target) then if getPlayerLevel(cid) <= 200 then exp = 200000 doSendAnimatedText(getPlayerPosition(cid), exp, 215) doPlayerAddExperience(cid, exp) doSendMagicEffect(getThingPos(cid), 27) return true elseif getPlayerLevel(cid) > 200 and getPlayerLevel(cid) <= 400 then exp = 300000 doSendAnimatedText(getPlayerPosition(cid), exp, 215) doPlayerAddExperience(cid, exp) doSendMagicEffect(getThingPos(cid), 27) return true else exp = 400000 doSendAnimatedText(getPlayerPosition(cid), exp, 215) doPlayerAddExperience(cid, exp) doSendMagicEffect(getThingPos(cid), 27) return true end return true else return true end return true end Agora em Data/Creaturescripts abra o creaturescripts.xml e adicione a tag:
    <event type="kill" name="pvp_enforced" script="pvp_enforced.lua"/> Agora em Data/Creaturescripts/Scripts ou Agora em Data/Creaturescripts/Scripts/Player procure o arquivo login.lua e adicione a tag na parte de eventos:
    registerCreatureEvent(cid, "pvp_enforced") Testa e me fala se deu algum problema.
  13. Upvote
    Yan Oliveira recebeu reputação de New'gadu em Box   
    Olá amigo, primeiramente, coloque um título mais intuitivo no tópico para ficar mais fácil e legível de outras pessoas procurar.
     
    Vá em Data/Actions/Scripts e crie um arquivo.lua chamado box_itens.lua (na codificação coloque como ANSI para evitar problemas com acentuações) e adicione o seguinte código dentro do arquivo:
    local id_table_item = {2392, 12162, 12338} -- ID DO ITEM (ADICIONE NESSA TABELA TODOS ITENS) local level = 1 -- LEVEL MÍNIMO local id_box = 12338 -- ID DA BOX local quantidade_item = 1 -- QUANTIDADE DE ITEM(S) function onUse(cid, item, frompos, item2, topos) if item.itemid == id_box then -- VERIFICA SE CLICOU NA BOX, ALTERAR O ID DA BOX NA VARIÁVEL if getPlayerLevel(cid) >= level then -- VERIFICA SE O PLAYER TEM O NÍVEL NECESSÁRIO. DEIXEI COMO 1 CASO NÃO QUEIRA QUE TENHA VERIFICAÇÃO DE NÍVEL, POIS O NÍVEL MÍNIMO É 1. QUALQUER COISA SÓ ALTERAR NA VARIÁVEL for i = 1, #id_table_item do doPlayerAddItem(cid, id_table_item[i], quantidade_item) -- SETAR O ID DO ITEM NA TABELA E QUANTIDADE NA VARIÁVEL end doSendMagicEffect(getThingPos(cid), 27) -- EFEITO AO ABRIR A BOX doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Parabéns, você recebeu " ..#id_table_item.. " itens. Confira em sua bag.") -- MENSAGEM PARA O PLAYER QUE PEGA A QUANTIDADE TOTAIS DE ITENS QUE EXISTE DENTRO DA TABELA doRemoveItem(item.uid, 1) -- REMOVE A BOX DA BAG DO PLAYER else doPlayerSendCancel(cid,"Você dever ser no mínimo nível "..level.." para abrir a box.") -- MENSAGEM CASO NÃO TENHA NÍVEL end return true end end Depois vá em Data/Actions e abra o arquivo actions.xml e adicione a tag dentro:
    <action itemid="ID DA BOX" event="script" value="box_itens.lua"/> <!-- COLOCAR O ID DA BOX ONDE ESTÁ "ID DA BOX" --> Adicione todos os IDs dos itens dentro da tabela.
     
    Só lembrando que como eu já fiz para você anteriormente um script de box, nesse script você precisa colocar uma box diferente (id), pois a outra bag já está registrada e se colocar as duas vai dar problema.
     
  14. Upvote
    Yan Oliveira recebeu reputação de New'gadu em Box por %   
    Sobre vir o valor repetido, foi erro meu, falta de atenção, pois como deixei a variável fora da function onUse ele deixava sempre o valor que gerou randomico fixo. Eu tinha criado a váriavel dentro do escopo, mas ai deixando organizado, comentado e legível para você acabei colocando fora da função. Estarei mandando corrigido.
     
    Sobre o seu pedido, eu não acho que vale a pena fazer desse jeito, porque você vai fazer um esforço para duas coisas que na verdade é uma, pois como é aleatório, como você vai saber a porcentagem que vai sair? Não tem como entendeu? De qualquer forma vai ser aleatório, então eu sugiro que deixa a quantidade de itens aleatoriamente direto igual eu fiz. E nem estou falando isso para não precisar fazer, pois se quiser posso tentar fazer, mas a questão é que vai gastar esforço com uma coisa sem necessidade.
     
    Mas reflita sobre o que falei e veja se vai aceitar o meu conselho ou se vai querer como pediu inicialmente.
     
    Estou mandando o código corrigido, pode testar que agora virá valores aleatórios normal. Mandarei até uma print que testei para comprovar. Substitua o código por esse:
    local id_item = 2392 -- ID DO ITEM local level = 1 -- LEVEL MÍNIMO local id_box = 12338 -- ID DA BOX function onUse(cid, item, frompos, item2, topos) local quantidade_item = math.floor(math.random(1, 100)) -- GERA A QUANTIDADE DO ITEM RANDOMICAMENTE if item.itemid == id_box then -- VERIFICA SE CLICOU NA BOX, ALTERAR O ID DA BOX NA VARIÁVEL if getPlayerLevel(cid) >= level then -- VERIFICA SE O PLAYER TEM O NÍVEL NECESSÁRIO. DEIXEI COMO 1 CASO NÃO QUEIRA QUE TENHA VERIFICAÇÃO DE NÍVEL, POIS O NÍVEL MÍNIMO É 1. QUALQUER COISA SÓ ALTERAR NA VARIÁVEL doPlayerAddItem(cid, id_item, quantidade_item) -- SETAR O ID DO ITEM NA VARIÁVEL doSendMagicEffect(getThingPos(cid), 27) -- EFEITO AO ABRIR A BOX if quantidade_item > 1 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Parabéns, você recebeu " ..quantidade_item.. " " ..getItemNameById(id_item) .."s") -- MENSAGEM PARA O PLAYER NO PLURAL CASO SEJA A QUANTIDADE MAIOR QUE 1 else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Parabéns, você recebeu " ..quantidade_item.. " " ..getItemNameById(id_item)) -- MENSAGEM PARA O PLAYER NO SINGULAR SE A QUANTIDADE FOR 1 end doRemoveItem(item.uid, 1) -- REMOVE A BOX DA BAG DO PLAYER else doPlayerSendCancel(cid,"Você dever ser no mínimo nível "..level.." para abrir a box.") -- MENSAGEM CASO NÃO TENHA NÍVEL end return true end end Print:

     
    Como pode ver fiz o teste, cliquei 4x na box e veio quantidades diferentes nas 4 vezes. Testa ai e me fala.
     
    (Fazendo um adendo, eu troquei no código a função math.abs para math.floor porque o abs pode pegar número real, e o floor só pega inteiro, outro erro meu rs. Também acrescentei uma verificação para caso a quantidade de itens seja maior que um ele fala o nome do item no plural, e com 1 no singular.)
  15. Thanks
    Yan Oliveira recebeu reputação de kamus9629 em Pedido de NPC que da quests paralelas   
    Sobre o pedido do tópico, começando pelo primeiro NPC, vá em Data/NPC e crie um arquivo Carl.xml (lembrando que coloquei o nome do arquivo do mesmo nome do npc, caso queira mudar nome do npc sugiro mudar o do arquivo para ficar fácil de fazer manutenções futuras), após criar adicione o seguinte código dentro: 
    <?xml version="1.0" encoding="UTF-8"?> <npc name="Carl" script="Carl.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1"> <health now="150" max="150"/> <look type="516" head="10" body="15" legs="20" feet="25"/> <parameters> <parameter key="message_greet" value="Olá |PLAYERNAME|, o que você procura?"/> </parameters> </npc> Agora vá em Data/NPC/Scripts e crie um arquivo Carl.lua e adicione o seguinte código dentro:
    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) if(not npcHandler:isFocused(cid)) then return false end -- VARIÁVEIS -- local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid msg = string.lower(msg) local nome_segundo_npc = "Joey" local storage = 9999 ----------------------------------- [ DIALOGO COM NPC] --------------------------------- if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'missao') then if getPlayerStorageValue(cid, storage) == 1 then selfSay("Você deve falar diretamente com o NPC " ..nome_segundo_npc, cid) talkState[talkUser] = 0 return true else selfSay("Você gostaria de fazer a missão do NPC " ..nome_segundo_npc.. " ?", cid) talkState[talkUser] = 1 return true end elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then selfSay("Agora você está autorizado para fazer a missão do NPC "..nome_segundo_npc.. "!", cid) setPlayerStorageValue(cid, storage, 1) talkState[talkUser] = 0 return true elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não') or msgcontains(msg, 'nao')) and talkState[talkUser] == 1 then selfSay("Ok, fale comigo novamente caso queira fazer a missão do NPC " ..nome_segundo_npc.. ".", cid) talkState[talkUser] = 0 return true end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())  
    Segundo NPC:
     
    Agora iremos criar o segundo NPC, vá em Data/NPC e crie um arquivo Joey.xml e adicione o código dentro:
    <?xml version="1.0" encoding="UTF-8"?> <npc name="Joey" script="Joey.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1"> <health now="150" max="150"/> <look type="1421" head="114" body="119" legs="114" feet="114"/> <parameters> <parameter key="message_greet" value="Olá |PLAYERNAME|, em que posso ajudar? Diga {help}, {ajuda} ou {missão} para mais informações."/> </parameters> </npc> E vá em Data/NPC/Scripts, crie um arquivo Joey.lua e adicione o código dentro:
    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) if(not npcHandler:isFocused(cid)) then return false end -- VARIÁVEIS -- local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid msg = string.lower(msg) local nome_primeiro_npc = "Carl" local nome_terceiro_npc = "Peter" local id_item = 12163 local quantidade_item = 100 local id_item_recebido = 16563 local quantidade_item_recebido = 1 ----------------------------------- [ DIALOGO COM NPC] --------------------------------- if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'missao') then if getPlayerStorageValue(cid, 9999) == 1 then -- STORAGE DO PRIMEIRO NPC, OU SEJA, VERIFICA SE FALOU COM PRIMEIRO NPC. if getPlayerStorageValue(cid, 10000) == 1 then -- VERIFICA SE JÁ FEZ A MISSÃO DO SEGUNDO NPC selfSay("Você já fez minha missão, agora você deve falar diretamente com o NPC " ..nome_terceiro_npc.. ".", cid) talkState[talkUser] = 0 return true else selfSay("Preciso que você me traga " ..quantidade_item.. " seeds. Você trouxe?", cid) talkState[talkUser] = 1 return true end else selfSay("Você deve falar com o NPC " ..nome_primeiro_npc.. " para conseguir fazer minha missão.", cid) talkState[talkUser] = 0 return true end elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then if getPlayerItemCount(cid, id_item) >= quantidade_item then doPlayerRemoveItem(cid, id_item, quantidade_item) selfSay("Você me trouxe as " ..quantidade_item.. " que eu precisava. Agora você consegue falar com o NPC " ..nome_terceiro_npc.. ".", cid) doPlayerAddItem(cid, id_item_recebido, quantidade_item_recebido) doSendMagicEffect(getThingPos(cid), 29) setPlayerStorageValue(cid, 10000, 1) talkState[talkUser] = 0 return true else selfSay("Você não trouxe a quantidade de seeds que eu preciso. Me traga " ..quantidade_item.. " seeds para prosseguir com a missão.", cid) talkState[talkUser] = 0 return true end return true end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())  
    Terceiro NPC
     
    Agora com o terceiro e último NPC, vá em Data/NPC e crie um arquivo Peter.xml e adicione o código dentro:
    <?xml version="1.0" encoding="UTF-8"?> <npc name="Peter" script="Peter.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1"> <health now="150" max="150"/> <look type="1413" head="114" body="119" legs="114" feet="114" corpse="2212"/> <parameters> <parameter key="message_greet" value="Olá |PLAYERNAME|, o que você procura aqui? Diga {help}, {ajuda} ou {missão} para mais informações."/> </parameters> </npc> E vá em Data/NPC/Scripts e crie um arquivo Peter.lua e adicione o código dentro:
    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) if(not npcHandler:isFocused(cid)) then return false end -- VARIÁVEIS -- local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid msg = string.lower(msg) local nome_segundo_npc = "Joey" ----------------------------------- [ DIALOGO COM NPC] --------------------------------- if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'missao') then if getPlayerStorageValue(cid, 10000) == 1 then -- VERIFICA SE FALOU COM SEGUNDO NPC if getPlayerStorageValue(cid, 10001) == 1 then -- VERIFICA SE TERMINOU A TASK selfSay("Você já completou minha missão.", cid) talkState[talkUser] = 0 return true else selfSay("Preciso que você derrote alguns {Charmanders} para mim. Você quer fazer essa missão?", cid) talkState[talkUser] = 1 return true end else selfSay("Você deve falar com o NPC " ..nome_segundo_npc.. " para conseguir fazer minha missão.", cid) talkState[talkUser] = 0 return true end elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim') or (msgcontains(msg, 'task'))) and talkState[talkUser] == 1 then local id_item = 12545 local quantidade_item = 1 local exp = 10000 if getPlayerStorageValue(cid, 10002) == 1 then selfSay("Você completou minha missão! Receba sua recompensa.", cid) doPlayerAddExp(cid, exp) doPlayerAddItem(cid, id_item, quantidade_item) doSendAnimatedText(getThingPos(cid), exp, 27) setPlayerStorageValue(cid, 72451, 1) talkState[talkUser] = 0 return true else if getPlayerStorageValue(cid, 10002) < 0 then selfSay("Vá derrotar todos os {Charmanders} para mim.") setPlayerStorageValue(cid, 35000, 0) talkState[talkUser] = 0 return true elseif getPlayerStorageValue(cid, 10002) == 0 then selfSay("Você ainda não derrotou todos os {100 Charmanders}. Termine a missão primeiro antes de falar comigo.") talkState[talkUser] = 0 return true end return true end return true elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não')) and talkState[talkUser] == 1 then selfSay("Ok, fale comigo novamente caso queira fazer minha missão.", cid) talkState[talkUser] = 0 return true end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())  
    Agora é a configuração da task.
     
    Vá em Data/Creaturescripts/Scripts crie um arquivo chamado task_peter.lua e adicione o código dentro:
    local nome_terceiro_npc = "Peter" local storage_npc = 10002 local storage_contador = 10003 local pokemon = { [1] = {name = "Charmander", count = 100}, } local nome = pokemon[1].name local restante function onKill(cid, target) for _, t in ipairs(pokemon) do local quantidade = t.count if getCreatureName(target) == nome then if getPlayerStorageValue(cid, storage_npc) == 0 then if getPlayerStorageValue(cid, storage_contador) == quantidade then doPlayerSendTextMessage(cid, 27, "Não há mais " ..nome.. " para derrotar.") doPlayerSendTextMessage(cid, 20, "Parabéns! Você concluiu a task do " ..nome_terceiro_npc) setPlayerStorageValue(cid, storage_contador, getPlayerStorageValue(cid, storage_contador) + 1) setPlayerStorageValue(cid, storage_npc, 1) return true elseif getPlayerStorageValue(cid, storage_contador) < quantidade then -- AS STORAGES COMEÇAM COM -1, ENTÃO NESSA PARTE EU APENAS DEFINO COMO 0 PARA NA LINHA SEGUINTE JÁ IR PARA 1. NÃO COLOQUE RETURN NESSE LAÇO PORQUE VAI ENCERRAR O ESCOPO E NÃO VAI CONTAR CORRETAMENTE -- if getPlayerStorageValue(cid, storage_contador) < 0 then setPlayerStorageValue(cid, storage_contador, 0) end setPlayerStorageValue(cid, storage_contador, getPlayerStorageValue(cid, storage_contador) + 1) restante = quantidade - getPlayerStorageValue(cid, storage_contador) doPlayerSendTextMessage(cid, 27, "Faltam " ..restante.. " " ..nome.. "s para derrotar.") return true end elseif (getPlayerStorageValue(cid, storage_npc) < 0) or (getPlayerStorageValue(cid, storage_npc) > 0) then return true end return true end return true end end  
    Agora vá em Data/Creaturescripts e abra o creaturescripts.xml e adicione o evento:
    <event type="kill" name="task_peter" script="task_peter.lua"/>  
    E por último, vá em Data/Creaturescripts/Scripts ou Data/Creaturescripts/Scripts/Player (dependendo da base tem essa divisão de diretório) e procure pelo arquivo login.lua e procure pela parte dos registros de evento e adicione após o último a linha:
    registerCreatureEvent(cid, "task_peter")  
    Explicação:
     
    Pelo que entendi o primeiro NPC não pedirá nada, só dará acesso ao player, então para o player falar com o segundo NPC ele tem que falar com o primeiro antes! Eu deixei também o valor das storages em sequência para ficar mais fácil de alterar, e deixei o segundo com o valor 10000 como pediu. 
     
    Eu tinha feito os scripts faz tempo haha, mas eu estava testando na base DXP e nela não funciona o evento onKill, não da erro mas não funciona haha, ai perdi um tempinho até descobrir kk. Mas está ai a série de missão de npc.
     
    Testei aqui e todos os NPCs estão funcionando normalmente e a task do creaturescript está funcionando normal também, mas qualquer problema me fale.
  16. Thanks
    Yan Oliveira deu reputação a DuuhCarvalho em Tutorial Básico Creaturescripts   
    Creaturescripts, são scripts executados ao * logar, atacar , morrer, matar, etc.. *


    Funções usadas para começar um script em Creaturescripts:
    onLogin(cid) -- Ao logar. onLogout(cid) -- Ao deslogar. onAdvance(cid, skill, oldLevel, newLevel) -- Ao upar. onStatsChange(cid, attacker, type, combat, value) -- Ao peder ou ganhar life, mana ou condições. onDirection(cid, old, current) -- não sei. onOutfit(cid, old, current) -- Não sei. (creio que ao usar outfit).. onSendMail(cid, receiver, item, openBox) -- Ao enviar carta. onReceiveMail(cid, sender, item, openBox) -- Ao receber uma carta. onTradeRequest(cid, target, item) -- Ao dar trade. onTradeAccept(cid, target, item, targetItem) -- ao aceitar trade. onJoinChannel(cid, channel, users) -- Ao entrar em um chat. onLeaveChannel (cid, channel, users) -- Ao sair do chat. onLook(cid, thing, position, lookDistance) -- Ao dar look onThink(cid, interval) -- Executado em Determinado tempo. onTextEdit(cid, item, newText) -- Ao escrever em item (book) onReportBug(cid, comment) -- ao Reportar bug. onAreaCombat(cid, tileItem, tilePosition, isAggressive) onPush(cid, target) -- Ao puxar. (criatura) onTarget(cid, target) -- Não sei (creio que ao seguir ou atacar) onFollow(cid, target) -- Ao seguir. (acompanhar) onCombat(cid, target) -- Parecido com onAttack. (qualquer tipo de ataque) onAttack(cid, target) -- Ao Atacar. onCast(cid, target) -- Ao lançar feitiço ou runa . onKill(cid, target, lastHit) -- Ao matar. onDeath(cid, corpse, deathList) -- Ao morrer. onPrepareDeath(cid, deathList) -- Antes de morrer. Exemplos de Scripts :

    onPrepareDeath:
    function onPrepareDeath(cid, lastHitKiller, mostDamageKiller) if (getCreatureSkullType(cid) >= 4) then if (getPlayerSlotItem(cid, CONST_SLOT_NECKLACE).itemid == 7890) then doCreatureSetDropLoot(cid, false) end return true end return true end Antes de morrer (quanto estiver morrendo)
    Se estiver com skull maior ou igual a 4 então
    se estiver usando o item 7890 então
    o player não vai perder loot ao morrer.
     
     
    onAdvance:
    function onAdvance(cid, skill, oldLevel, newLevel) if getPlayerLevel(cid) >= 200 then if getPlayerStorageValue(cid, 12345) <= 0 then doPlayerAddItem(cid, 2160, 100) doPlayerSendTextMessage(cid, 22, "Parabéns, você atingiu level 200 e ganhou 1kk de bonus!") doSendMagicEffect(getCreaturePosition(cid), 11) setPlayerStorageValue(cid, 12345, 1) end end return true end Ao upar level 200 então
    Se a storage 12345 do player for menor ou igual a 0 então
    Adicionar 100 itens com id 2160 ao player ( adiciona 1kk ao player)
    Manda uma mensagem "Parabéns, você atingiu level 200 e ganhou 1kk de bonus"
    Mandar efeito 11 na posição do player
    Mudar valor da storage 12345 para 1.
     

    onLogin:
    function onLogin(cid) doPlayerSendTextMessage(cid, 22, "Bem Vindo!") return true end Ao logar
    Mandar mensagem "Bem Vindo" ao player.
     

    onDeath:
    function onDeath(cid, corpse, killer) local name = "Demon" if isMonster(killer[1]) and isPlayer(cid) and getCreatureName(killer[1]) == name then doRemoveCreature(killer[1]) end return true end Ao morrer
    Se quem matou foi um monster e quem morreu foi um player, e o nome do monster que matou foi "Demon" então
    Remover o monster ("Demon")
    (scrip by Zipter)
     
     
    onKill:
    function onKill(cid, target, lastHit) if isPlayer(cid) and isPlayer(target) then doPlayerAddItem(cid, 2160, 20) end return true end Ao matar
    Se foi um player que matou outro player então
    adicionar 20 crystal coins(id 2160) ao player que matou
     
     
    Para adicionar seu script ao server:

    1ª Vá em data / creaturescripts / script, crie um Arquivo.lua e cole seu script dentro.

    2ª Adicione a tag: em creaturescripts.Xml..
    <event type="preparedeath" name="forever amulet" event="script" value="aol.lua"/> Type = o tipo de função
    kill, death, login, preparedeath, joinchannel, reportbug, think ...

    name = Nome do Evento

    valu = Nome do Arquivo.lua


    3ª adicione a tag : em data/creaturescripts/scripts/login.lua..
    (obs: se seu script for de função onLogin não precisa adicionar essa tag)
    registerCreatureEvent(cid, "forever amulet") Entre " " , coloca o nome do Evento (o mesmo que você colocou em creaturescripts.Xml.




    É isso pessoal ! Não usei exemplo de todas as funções porque são muitas !



     
  17. Thanks
    Yan Oliveira recebeu reputação de raulcdj em Sistema Quest em Janela   
    Tutorial refeito em: https://www.xtibia.com/forum/topic/251549-quest-log-em-janela/?tab=comments#comment-1759135
               
  18. Upvote
    Yan Oliveira recebeu reputação de Ayron5 em Posição   
    Testa e me fala se continua com erro:
     
    SNAKE = { _VERSION = "1.0", itemid = 1739, freeglobalstorage = 28103, itemFood = 6394, controlpos = {x=1024,y=1062,z=12}, exitpos = {x=1023,y=1053,z=13}, centerpos = {x=1023,y=1061,z=13}, timer = function(cid,n,pos_,time) local pos_ = pos_ or {{SNAKE.centerpos}} setGlobalStorageValue(SNAKE.freeglobalstorage,cid) if not isPlayer(cid) then SNAKE.clean() return end for i,pos in pairs(pos_) do SNAKE.find_and_delete(pos[1]) if i == 1 then pos[2] = SNAKE.copypos(pos[1]) pos[1] = getPosByDir({x=pos[1].x,y=pos[1].y,z=pos[1].z,stackpos=255},getCreatureLookDir(cid)) else pos[2] = SNAKE.copypos(pos[1]) pos[1] = pos_[i-1][2] end local ret,p,walk = SNAKE.check(pos[1]) if ret == 1 or ret == 3 then addEvent(doTeleportThing,1000,cid,SNAKE.exitpos) addEvent(doCreatureSay,1100,cid,'Points '..(#pos_-1)..'.') SNAKE.clean() setGlobalStorageValue(SNAKE.freeglobalstorage,0) return end if ret == 2 then doRemoveItem(p.uid,-1) if p.itemid == SNAKE.itemFood then pos_[#pos_+1] = {pos[2],pos[2]} for i=1,5 do addEvent(doSendMagicEffect,100*i,pos[1],29) end SNAKE.generateFood() end end doCreateItem(SNAKE.itemid,1,pos[1]) end local plpos = getCreaturePosition(cid) local generated = {} for i = 0,3 do generated = getPosByDir({x=SNAKE.controlpos.x,y=SNAKE.controlpos.y,z=SNAKE.controlpos.z},i) end for i,pos in pairs(generated) do if SNAKE.samepos(plpos,pos) then doTeleportThing(cid,SNAKE.controlpos,false) end addEvent(doSendMagicEffect,100,pos,56,cid) end addEvent(SNAKE.timer,time,cid,n,pos_,time) end copypos = function(p) return {x=p.x,y=p.y,z=p.z,stackpos=p.stackpos} end samepos = function(p1,p2) if p1.x == p2.x and p1.y == p2.y then return true end return false end generateFood = function() local pp = {x=SNAKE.centerpos.x+math.random(-6,6),y=SNAKE.centerpos.y+math.random(-4,4),z=SNAKE.centerpos.z} for i = 1,5 do addEvent(doSendMagicEffect,100*i,pp,30) end doCreateItem(SNAKE.itemFood,1,pp) end clean = function() for y = -4,4 do for x = -6,6 do local pp = {x=SNAKE.centerpos.x+x,y=SNAKE.centerpos.y+y,z=SNAKE.centerpos.z} for i = 250, 255 do pp.stackpos = i local p = getThingFromPos(pp) if p.itemid ~= 0 then doRemoveItem(p.uid,-1) doSendMagicEffect(pp,15) end end end end end check = function(pos) for i = 1,10 do pos.stackpos = i local p = getThingFromPos(pos) if p.itemid == SNAKE.itemid then return 1,p,true elseif not SNAKE.isWalkable(pos) then return 3,p,false elseif p.itemid ~= 0 then return 2,p end end return false end find_and_delete = function(pos) for i = 0,255 do pos.stackpos = 255-i local p = getThingFromPos(pos) if p.itemid == SNAKE.itemid then return doRemoveItem(p.uid,1) end end end isWalkable = function(pos, creature, proj, pz)-- by Nord if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end if getTopCreature(pos).uid > 0 and creature then return false end if getTileInfo(pos).protection and pz then return false, true end local n = not proj and 3 or 2 for i = 0, 255 do pos.stackpos = i local tile = getTileThingByPos(pos) if tile.itemid ~= 0 and not isCreature(tile.uid) then if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then return false end end end return true end }  
  19. Upvote
    Yan Oliveira recebeu reputação de Yan Liima em Funçoes   
    Assim como te falei no outro tópico, coloque um nome sugestivo e mais claro do seu problema.
     
    E também como falei lá no outro tópico, mande prints para ver como está o client para ver se está nele o problema.
  20. Upvote
    Yan Oliveira recebeu reputação de GniusP em doCreatureSetNick AJUDA   
    Quando acontece esse ocorrido, aparece algum erro na distro?
  21. Upvote
    Yan Oliveira recebeu reputação de GniusP em Bau que da item com action   
    Essa action que você quer é o ID dela?
  22. Thanks
    Yan Oliveira recebeu reputação de GniusP em [Resolvido] Alavanca que diminui vida do player   
    Vai em data/actions/scripts e crie um arquivo chamado alavanca_hp.lua (ou algum nome que preferir) e adicione o seguinte código dentro:
    function onUse(cid, item, frompos, item2, topos) local hp_antigo = getCreatureHealth(cid) + 200 -- Pega a vida atual do player antes de clicar na alavanca local hp_alavanca = math.floor(200 - getCreatureHealth(cid)) -- HP que o jogador terá ao clicar na alavanca if item.itemid == 1945 or item.itemid == 1946 then -- Aqui o ID da alavanca que clica para ficar com 200 de vida if getCreatureHealth(cid) > 200 or getCreatureMaxHealth(cid) > 200 then -- Verifica se tem mais de 200 de vida ou se a vida máxima é maior que 200 if getPlayerStorageValue(cid, 45000) == -1 then -- Verifica se o player não tem a storage ao clicar na alavanca doCreatureAddHealth(cid, hp_alavanca) -- Deixa o HP do player com 200 de vida doSendMagicEffect(getThingPos(cid), 27) -- Efeito ao clicar na alavanca setPlayerStorageValue(cid, 45000, 1) -- Adiciona a Storage return true else doPlayerSendTextMessage(cid, 27, "Você não pode usar a alavanca com" ..hp_alavanca.. " ou menos de vida!") return true end else doPlayerSendTextMessage(cid, 27, "Você não pode clicar na alavanca porque tem 200 ou menos de vida.") return true end return true end if item.itemid == 12176 then -- Aqui é o ID da 2º alavanca, que reseta o HP do player como estava antes if getPlayerStorageValue(cid, 45000) == 1 then -- Verifica se tem storage doCreatureAddHealth(cid, hp_antigo) -- adiciona o novo HP ao player doSendMagicEffect(getThingPos(cid), 29) -- efeito doPlayerSendTextMessage(cid, 27, "Seu HP foi restaurado para "..hp_antigo.. " de vida.") setPlayerStorageValue(cid, 45000, -1) -- Remove a storage para voltar a clicar novamente return true end end end Agora vai em data/actions/actions.xml e adicione a tag:
    <action itemid="1945;12176" script="alavanca_hp.lua" /> <!-- Lembrando que tem que colocar os id das 2 alavancas, só substituir ali pelos seus id --> E vai em data/npc/scripts/heal.lua (ou o arquivo.lua que cura os pokémons ao falar com a Nurse) e adicione o seguinte código dentro da função onCreatureDisappear(cid, pos)
    if getPlayerStorageValue(cid, 45000) then setPlayerStorageValue(cid, 45000, -1) return true end Lembrando que esse código é para o caso do player clicar na alavanca que tira vida, mas não clicar na que recupera, então ao falar com a Nurse, ele perde a storage para conseguir clicar na alavanca novamente.
     
    Eu não consegui testar muito, pois estou com pouco tempo, mas testei e está ficando sempre com 200 de vida ao clicar na alavanca, mas não testei direito se ele recupera a quantidade de vida exata que estava antes de clicar na alavanca que tira vida. Teste e me diga se é isso que quer.
  23. Amei
    Yan Oliveira recebeu reputação de GamerGoiano em Sistema Quest em Janela   
    Tutorial refeito em: https://www.xtibia.com/forum/topic/251549-quest-log-em-janela/?tab=comments#comment-1759135
               
  24. Thanks
    Yan Oliveira recebeu reputação de Gerson Monteiro em É possível criar um Poketibia em C ?   
    Tranquilo. Não, o jogo também foi feito em C++, e utiliza Lua com os scripts.
  25. Upvote
    Yan Oliveira deu reputação a Caronte em [Apostila] Lib 000-Const   
    Olá pessoal, venho mais uma vez trazer um tutorial simples, e tentar explicar tudo claramente, esse tutorial pode ficar grande dependendo do desenrolar dele, pois é um pack de tutoriais, então vou usar spoilers para ajudar na formatação do tópico.




    Nota: as informações usadas abaixo, podem ser tanto usadas com o nome, quanto com o número, e podem ser encontradas na pasta lib no arquivo 000-const





    Coordenadas:
    Tutorial feito e formatado por @Caronte.

     

    Combate:  

    Tutorial feito e formatado por @Caronte.



    Slots:

    Tutorial feito e formatado por @Caronte
    Participação: @Night Wolf
     

    Const_ani e Const_me:  


    Tutorial feito e formatado por @Caronte.

     
    [titulo][/titulo]


     
    Os assuntos do tópico poderão se diminuídos ou aumentados de acordo com o desenrolar do tempo,
    gostaria de apoio, e não me incomodaria se alguém se propusesse fazer algum tutorial, eles serão supervisionados por mim e formatados por mim, para serem postados neste tópico.



  • Quem Está Navegando   0 membros estão online

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