Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 08/23/13 em %
-
Price System - Pokemons (PDA by Slicer)
xandeloko e 5 outros reagiu a Noninhouh por um tópico no fórum
Bom galera, primeiramente gostaria de dizer logo que eu testei no server do PDA by Slicer e tb eu ja tinha visto um topico com price system feito pelo ZerefShirou, porem ele so dava o price para itens... vamos logo aos scripts: Em /creaturescripts/scripts/look.lua procure por: substitua por: agora você so precisa fazer a tabela, va em /lib/configuration.lua e coloque no final, laaaaaa em baixo: ai é so ir colocando, lembrando, se vc n colocar o pokemon vai aparecer "Price: unsellable." print de como ta ake no meu: OBS: Se caso achem bugs, porfavor me avisem!!! OBS²: Se eu postei no lugar errado, desculpa, reportem para moverem para o local correto!!!6 pontos -
[Task System] Command 1.0 Versão testada: 8.6 + TFS usado: 0.4 Comandos disponíveis: !task list -- Mostra quais monstros podem ser "taskeados"; !task Troll -- Neste modelo, você coloca o nome do monstro que quer taskear; Eaaai galerinha XTibiana, beleza comunidade? Decidi fazer um sistema de Task bem legal, com recompensa de Exp, Money e é tudo via comandos. Vá em data/creaturescripts/scripts, crie um arquivo chamado taskSys.lua e adicione dentro: Na mesma pasta, abra o arquivo login.lua e adicione: registerCreatureEvent(cid, "taskSys") Em creaturescripts.xml você deve adicionar a seguinte tag: <event type="kill" name="taskSys" event="script" value="taskSys.lua"/> Muito bem, agora vá na pasta data/talkactions/scripts, crie um arquivo chamado taskSys.lua e adicione dentro: E no arquivo talkactions.xml você adiciona essa seguinte tag: <talkaction words="!task;/task" event="script" value="taskSys.lua"/> Agora volte para a pasta data e entre na pasta lib (data/lib), nele você deve criar um arquivo também com o nome de taskSys.lua e adicionar esta tabela dentro: Demonstração É isso aêe galerinha, espero que tenham gostado e boa sorte3 pontos
-
1 ponto
-
Alguns tutoriais de PDA Slicer
habatt reagiu a SamueLGuedes por um tópico no fórum
Galera hoje vou lhes mostrar alguns tutorias para PDA, que eu vi e alguns queriam saber. 1° Como configurar o exp do seu server. 2°como adicionar um novo fly, ride e etc, OBS: nao vou mostrar como adicionar no dat editor, eu irei ensinar como configurar ele no script: vá em data/lib/configuration.lua, e procure essa linha: 3° pokemons e items iniciais (creio que muitos ainda nao sabem como modificar) 4° Como adicionar uma nova ball para o PDA (ajuda do stylomaldoso) 5° Como aumentar e diminuir o Cauth do pokemon. 6° Golden arena: 7° como aumentar o drop de loots: 8° como aumentar a velocidade do player: 9° como modificar seu rme para poketibia. 10° como mudar o efeito do emoticon. 11° como deixar o pokemon passivo, ou agressivo. 12° como mudar a efetividade de um pokemon 13° como adicionar ou remover um pokemon do HeadButt 14° Como adicionar um Passive no Pokemon: Creditos: Slicer (pelo servidor que eu estou pegando essas informaçoes) Eu (por criar o tutorial) StyloMaldoso (por um tutorial que me ajudou) por enquanto é só esses tutoriais, se alguém tiver mais alguma duvida, pergunte aqui no tópico mesmo. OBS: se tiver faltando alguém nos créditos que eu não saiba, me avisem. Abraços, e comentem.1 ponto -
[9.70] GLOBAL COMPACTO TELEPORTS NOVO!
FrankUzumaki reagiu a mkbrabsolute por um tópico no fórum
--Global Compacto 9.70-- Olá XTIBIANOS, já trouxe o global Full da ChaitoSoft 9.8 e agora trago este excelente Global Compacto 9.70 com derivados créditos! OT: Global Compacto é uma variação de servidores Global Full, é um pouco de cada parte do mapa interligadas por teleports. O servidor possui várias hunt's e quest's para diversão dos player, o seu mapa é bem detalhado como qualquer Global. Em seu mapa á distribuídos 14 cidades, entre essas estão: Carlin, Thais, Venore, Port Hope, Darashia, Libert Bay, Yalahar, City Vip, entre outras... O mapa possui cerca de 3700 spaws com um total de mais de 8000 criaturas. E para completar o mapa possui mais de 1000 houses. Sistemas: O servidor possui a distro mais atual do TFS 0.4 para servidores [9.7], compilada com o melhor sistema de AntiDV, e War System! A nova atualização trouxe ao servidor vários novos sistemas e entre eles destacasse: Mount System e sistema de captura 100%, Market System 100%, todos os novos itens da versão, todas as novas spells, novos monsters e muito mais! O servidor possui mais de 20 quests bem trabalhadas e todas utilizando portas com leveis para influenciar o up level do player. Na sua ultima atualização foi implementado o sistema de trainer offline 100% igual ao do global incluindo o novo sistema 9.7 de treinar na cama. Servidor Acompanha TFS 0_4 REV - WINDOWS! PRONTO PARA RODAR! IMAGENS DO SERVIDOR: Segue abaixo o download e scan: Gostou? Não se esqueça de agradecer com um REP+! Dúvidas podem falar comigo estarei a disposição! Créditos: Soldoran Jhon Soft Gustavo Ferreira MKBRABSOLUTE1 ponto -
Muito bem, vá em data/talkactions/scripts, crie um arquivo chamado clans.lua e adicione dentro: local clans = { ["volcanic"] = {v = 1, p = 10}, ["seavell"] = {v = 2, p = 150}, ["orebound"] = {v = 3, p = 20}, ["wingeon"] = {v = 4, p = 5}, ["malefic"] = {v = 5, p = 3}, ["gardenstrike"] = {v = 6, p = 12}, ["psycraft"] = {v = 7, p = 8}, ["naturia"] = {v = 8, p = 30}, } function onSay(cid, words, param) local rank = clans[param] if not param or param == "" then return doPlayerSendTextMessage(cid, 20, "Você deve digitar o nome do clãn corretamente.") and true end if getPlayerItemCount(cid, 2145) < rank.p then return doPlayerSendTextMessage(cid, 20, "Os seus diamonds são insuficientes, você precisa ter ["..rank.p.."] diamonds.") and true end if getPlayerStorageValue(cid, 86228) == rank.v then doPlayerSendTextMessage(cid, 20, "Você já faz parte deste mesmo clãn, escolha outro, os disponíveis são:") for a, b in pairs(clans) do doPlayerSendTextMessage(cid, 20, "Clãn ["..a.."] - Preço: "..b.p.." diamonds.") end return true end doPlayerRemoveItem(cid, 2145, rank.p) setPlayerStorageValue(cid, 86228, rank.v) doPlayerSendTextMessage(cid, 20, "Você acaba de entrar para o clãn ["..param.."], relogue para obter alterações.") return true end Em talkactions.xml adicione a seguinte tag: <talkaction words="!clan;/clan;!rank;/rank" event="script" value="clans.lua"/> No código de primeira, você encontra uma tabela, onde v é o valor da storage e p é o preço do clãn. Caso queira adicionar mais basta seguir o exemplo conforme a tabela. #GoodLuck!1 ponto
-
TOMO NO CÚ NINGUÉM GOSTA DE TI JOBBY TU E UM FDP VOU CONTINUAR PARA QUE DE UMA QUANTIDADE BOA <3 BEEKI MEU GOSTOSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO1 ponto
-
Na boa viuroksasqdtiramosprecisamos vo te explica certinho , quero rep em SHUAHSUA , olha só baixe o Hex Editor , instale , após isso , abra o hex editor , vá em "open" e selecione o .exe de deixar seu servidor online , deve ser evolutions-xml.exe , ai vai ter 1 tela divida , clique em qualquer coisa da direita , e aperta CTRL + F , escreva o comando , de enter , aparecera na primeira letra do comando , que deve ser um "!" , ai vc tem q subscrever (escrever por cima) , vc n pode apagar nada , e tem quer ser a mesma quantia de letras/numeros no comando, após isso mude no commands.xml e então mude em npc por npc.Da trabalho , mas ninguem mais zoa seu servidor.1 ponto
-
Área errada ,reportado.1 ponto
-
Vc disse que nao tinha cara de nerd e o que e isso ai entao, kkkkkkkkkkkkkk.1 ponto
-
Ajuda com script de pescar monsters
AliceKillen reagiu a Avronex por uma questão
Nao faça isso cara, vou lhe explicar, onde estava "function onUse(cid, item, fromPos, itemEx, toPos)" representa o inicio do script, se voce coloca um "End" logo após ta falando pra ele que termina ali. Entao ele nao vai ler todo o resto entendeu? Entao teria que colocar o End depois de todo o script. Assim: function onUse(cid, item, fromPos, itemEx, toPos) d1 = { [0] = {pesca = 'Fish'}, [1] = {pesca = 'Jellyfish'}, [2] = {pesca = 'Manta Ray'}, [3] = {pesca = 'Northern Pick'}, [4] = {pesca = 'Shark'}, } d100 = { [0] = {pesca = 'Young Sea Serpent'}, [1] = {pesca = 'Quara Predator Scout'}, [2] = {pesca = 'Quara Constrictor Scout'}, [3] = {pesca = 'Quara Mantassin Scout'}, } d120 = { [0] = {pesca = 'Quara Hydromancer'}, [1] = {pesca = 'Quara Mantassint'}, } d150 = { [0] = {pesca = 'Sea Serpent'}, [1] = {pesca = 'Quara Predator'}, } local config = { waters = {4614, 4615, 4616, 4617, 4618, 4619, 4608, 4609, 4610, 4611, 4612, 4613, 7236, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4665, 4666, 4820, 4821, 4822, 4823, 4824, 4825}, } local skill = getPlayerSkillLevel(cid, 6) local playerpos = {x=getCreaturePosition(cid).x, y=getCreaturePosition(cid).y+1, z=getCreaturePosition(cid).z} if not (isInArray(config.waters, itemEx.itemid)) then return doPlayerSendCancel(cid, "You cannot fish here.") end doSendMagicEffect(toPos, CONST_ME_LOSEENERGY) doPlayerAddSkillTry(cid, 6, 1) if skill >= 1 then local random = math.random(0, 30) -- 1 VAI PESCAR TODAS AS VEZES PARA DEIXAR MAIS DIFICIL POE 30/40 if random <= 1 then doSummonCreature(d150[random].pesca, playerpos) return true end if skill >= 150 then local random = math.random(0, 15) -- 1 VAI PESCAR TODAS AS VEZES PARA DEIXAR MAIS DIFICIL POE 30/40 if random <= 1 then doSummonCreature(d150[random].pesca, playerpos) return true end elseif skill >= 120 then local random = math.random(0, 20) -- 1 VAI PESCAR TODAS AS VEZES PARA DEIXAR MAIS DIFICIL POE 30/40 if random <= 1 then doSummonCreature(d120[random].pesca, playerpos) return true end elseif skill >= 100 then local random = math.random(0, 25) -- 1 VAI PESCAR TODAS AS VEZES PARA DEIXAR MAIS DIFICIL POE 30/40 if random <= 3 then doSummonCreature(d100[random].pesca, playerpos) return true end end return true end end Se ajudei Rep++!1 ponto -
1 ponto
-
1 ponto
-
1 ponto
-
Eaai estudiosos de plantão, já estamos em um bom nível da Escolinha, e neste tópico irei postar as respostas dos alunos que entregaram os exercícios. Respostas dos alunos: Allan Harlen: Pablo Rodrigues: Thiago Carvalho: Matheus Ribeiro: Daniel Angel: É isso galerinha, a prova está chegando, aproveitem para estudar1 ponto
-
Pedido Spells azul em ot 8.60 como?
iuryxxt reagiu a Session Start por uma questão
, eu troquei em 1 server de war na magia exura, e healo azul... :1 ponto -
DarkXPoke (DXP)
Slicer reagiu a StyloMaldoso por um tópico no fórum
fera..você acha só porque voce sabe MUDA IP troca img de fundo, troca ip só por isso você acha que sabe mexe com otClient? Me desculpe mais quem assume 1 cargo de mexe com otclient é porque sabe cria novos script, cria janelas, etc no otClient Agora como você disse em 1 topico "Sei bota CDBAR".. mais pera quem crio o script? ah o slicer é so bota a pasta em mods e bota pra roda vai faze algo da vida porque fica tentando entra em 1 equipe que você não sabe administra um cargo 100% é feio bjs1 ponto -
se tem que ter as sources do teu executavel, a paradinha que bota o server online, le um tutorial de compilaçao. aki no xtibia tem de monte, so voce procurar que tu acha.1 ponto
-
1 ponto
-
[10.10] The Forgotten Server v1.0
brunacocenco reagiu a AninhaPaula por um tópico no fórum
Baixa essas 2 dll's e extrai na pasta do ot: http://pt.dll-files.com/msvcr110.dll.html http://pt.dll-files.com/msvcp110.dll.html1 ponto -
Qual o motivo desse bug?
Tony Araujo reagiu a Slicer por uma questão
te achu tao engraçado kkk... if not poke_spells[pokename] then print("ERROR: LIB -> OROCHIELF [POKEMON NOT EXIST]") return true end troca pra.. if not poke_spells[pokename] then print("ERROR: LIB -> OROCHIELF [POKEMON NOT EXIST]") return nil end1 ponto -
Erro talkaction (PARAM + SQL )
Session Start reagiu a Slicer por uma questão
mano tu ja coloco as variaveis na query... n precisa por denovo dentro da funçao... -alias achu q nem pode fazer isso em LUA- use soh assim... db.executeQuery(QUERY)1 ponto -
[ Goren ] Show-Off Sprites
Desnecessario reagiu a Nu77 por um tópico no fórum
Cara ela fico com muito pillow e falto um AA tambem... Aconselho dar uma estudada de como se forma os pixel para não cometer o efeito "borracha", fiz um edit aqui pra você da uma olhada...1 ponto -
PokeB - A revolução do Pokémon Tibia
lazarocp reagiu a Daniel Bighouse por um tópico no fórum
Já falei isso faz tempo... E o primeiro que será feito vai ser com level. Assim que tiver pronto será feito sem level, vai da ajuda que a galera vai dar para adicionar os sistemas no server.1 ponto -
[ Goren ] Show-Off Sprites
Lucasmml reagiu a Desnecessario por um tópico no fórum
1 ponto -
Sources Cast System
Alexclusive reagiu a RodriigoRobson por uma questão
Sources? Ta na Mao! eu peguei essas sources de um usuario de outro Forum de Otserver ! http://www.4shared.com/zip/kI0PsSLl/cast.html? obs: se nao funcionar tente usar esses 2 link 1 : http://www.4shared.com/zip/KQxCMCLT/Cast_System_96.htm link 2 :http://www.4shared.com/rar/RG9bBB2r/Sources_96_Cast.htm1 ponto -
[9.70] GLOBAL COMPACTO TELEPORTS NOVO!
Greenarronw reagiu a Alemaooxd por um tópico no fórum
REP+ Muito Aprovadooo! Gostei Muito!1 ponto -
Pasta Enciclopedia com todos os links de outros tutoriais ! http://www.xtibia.com/forum/Pasta-Data-Enc...r-E-t99746.html Tutorial de Lua (Intermediario) Bem aqui meu primeiro tuto como colaborador. Esse tutorial tenta melhorar seus conhecimentos sobre lua, facilitar os proximos scripts e até melhor entender alguns scripts mais avançados. Aqui terá algumas noções de for,while,repeat,vetores e o addevent que não vem do Lua mais achei apropriado explica-lo aqui. O problema é que para saber addevent tem que saber criar funções, e para isso é bom saber sobre escopos. O que sempre é ensinado após ou antes dos loopings. Então vamos fazer isso tudo junto. Escopo e variaveis locais Para melhor explicar os loopings, é bom você entender o que seria escopo e as variaveis locais. Praticamente escopo só serve para variaveis locais mesmo (pelo menos não lembro outro motivo pra ele). Veja esse exemplo if item.uid == 2300 then --inicio escopo 1 local escopo1 = 2500 queststatus = getPlayerStorageValue(cid,2300) if queststatus == -1 then --inicio escopo 2 local escopo2 = 3000 if playerCap >= itemWeight then --inicio escopo3 local escopo3 = 2000 doPlayerSendTextMessage(cid,24,"You have found a demon helmet.") doPlayerAddItem(cid,2493,1) setPlayerStorageValue(cid,2300,1) else doPlayerSendTextMessage(cid,24,"You have found a demon helmet. Weighing 29.50 oz it is too heavy.") end --fim escopo 3 else doPlayerSendTextMessage(cid,24,"The chest is empty.") end --fim escopo 2 end --fim escopo 1 No caso, usei essas variaveis locais, para tenta explicar o que é escopo. Cada variavel local indica o escopo existente. Escopo é um espaço do script, normalmente entre condicionais ou loopings. Os comentarios indicam inicio e fim de cada escopo. No caso de otserver, escopo não chega a ser muito util, porém ajuda nas outras linguagens e ensina como usar as variaveis locais. A importancia da variavel local, é fazer ela valer apenas no escopo, para não haver confusões de 2 scripts correntes usarem a mesma variavel e ferrar seu servidor. Laços de Repetição (looping) Os loopings, são condicionais usadas para facilitar certas ações, e não deixar os script com um tamanho gigantesco, os mais usados são o for,while e repeat. Em tese eles fazem a mesma coisa, que é repetir tudo que está dentro do escopo, porém cada uma tem seu jeito de fazer. For O for talvez seja o looping mais usado. O que ele faz é repetir todo seu escopo o numero de vezes mandando. Vou dar a sintaxe dele. for variavel = numero inicial, numero final do comandos end Em português estruturado : para variavel = numero inicial, numero final faça comandos fim Um exemplo pratico : for i= 1,24 do doPlayerAddItem(cid,2150,1) end Esse script acima vai adicionar 24x o item 2150 ao player. Então no caso você economizo no minimo 21 linhas. Claro que essa estrutura não serve so para isso. Lembrando que esse i não é obrigatorio, ele é a chamada variavel de controle. Até hoje não sei porque todo mundo usa i como variavel de controle do for. Você também pode fazer um for mais util do que esse, ao final do script mostrarei outros exemplo. while O meu looping favorito de se usar, também é muito utilizado. Ele repete o seu escopo, enquanto a condicional for verdadeira. Exemplo : while (variavel == 60) do comandos end Ou : enquanto (worldtime > 60) faça comandos fim Ai no caso enquanto a variavel for igual a 60 ele irá executar todos os comandos dentro dele. O while se assemelha um pouco ao if, pois deve se usar sinais matematicos tem o and e o or. Eu achei um exemplo na função : function getTibiaTime() local worldTime = getWorldTime() local hours = 0 while (worldTime > 60) do hours = hours + 1 worldTime = worldTime - 60 end return {hours = hours, minutes = worldTime} end Então enquanto o worldtime for menor que 60, ele irá pegar a hours e somar + 1, depois pegará o worldtime e diminuirá em 60 Ou seja ele irá contar as horas em 3 linhas. O que será uma tarefa impossivel sem um looping. E veja que faze-la no for também seria dificil, já que teriamos que saber que horas seria. O que seria anormal, pois para que saber a hora, se ja sabemos ??? repeat Esse ultimo looping e não menos importante, ele faz as repetições até que aconteça algo. repeat comandos until ( variavel == 1) Ou : repita comandos atéque (variavel == 1) Aqui nos meu ot ainda não achei nenhum com repeat, porém pode ser que ache algum util para ele. Dá para usar o exemplo do while aqui repeat hours = hours + 1 worldtime = worldtime - 60 until (worltime >60) Lembrando que o repeat não tem end, se vc colocar vai dar erro xD. Aqui você viu os três loopings mais importantes, e sem duvidas isso ajudará a compreender alguns scripts e até diminuir outros. Agora quando usar cada cabe a você decidir, já que cada um tem vantagens e desvantagens. Um exemplo é esse desafio. Adicionar Magic Plate armors no player até a capacidade acabar ou no maximo 30 delas. com for : for i=1,30 do if getPlayerFreeCap(cid) >= 85.00 then doPlayerAddItem(cid,2472,1) end end com while : while (cap >= 85.00) and (mag <=30) do cap = getPlayerFreeCap(cid) mag =mag+1 doPlayerAddItem(cid,2472,1) end com repeat : repeat cap = getPlayerFreeCap(cid) doPlayerAddItem(cid,2472,1) mag =mag+1 until (cap >= 85.00) and (mag <=30) Veja que no for eu nem tentei (até pq n lembrava maneira) de colocar até a capacidade acabar. Porém para adicionar um numero exato de itens ou sequencia ele é melhor que os outros. Porém o while e o repeat se dão melhor ao adicionar até a capacidade acabar. Agora que você ja entende, ou pelo menos ficou menos confuso, vou tentar explicar vetores. Vetores e Matrizes Alguns devem se perguntar que escremento é esse ? Entretanto, devem conhecer pelo nome array. Agora o vetor é uma variavel que armazena varias variaveis. Por exemplo imagine uma tabela do excel, as linhas seriam os vetores. Ou seja cada linha pode guardar varios dados. Já a matriz seria colunas e linhas, porém no otserver dificilmente ou nunca vc irá usar matriz, até porque LUA não prescisa declarar variavel e acho que matriz nem existe no LUA. Voltando aos vetores, existem algumas vantagens, ao usa-los. Muitos dizem que ocupa menos memoria ram, é verdade, porém ao menos que você tenha 2 mb de ram, não irá fazer diferença nenhuma. Eu acho a principal vantagem é poder deixar mais organizado e até facilitar a compreensão de scripts. Por exemplo vou mostrar um script de quando eu era iniciante. --function by ta4e-- --for tibia 7.92-- function onUse(cid, item, frompos, item2, topos) presente = math.random(1,11) pos = getPlayerPosition(cid) --surprise bag blue-- if presente == 1 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,2687,10) --cookie doRemoveItem(item.uid,1) elseif presente == 2 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6394,1) --cream cake doRemoveItem(item.uid,1) elseif presente == 3 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6280,1) --party cake doRemoveItem(item.uid,1) elseif presente == 4 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6574,1) --bar of chocolate doRemoveItem(item.uid,1) elseif presente == 5 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6578,1) -- party hat doRemoveItem(item.uid,1) elseif presente == 6 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6575,1) -- red baloon doRemoveItem(item.uid,1) elseif presente == 7 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6577,1) -- green baloon doRemoveItem(item.uid,1) elseif presente == 8 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6569,3) -- candy doRemoveItem(item.uid,1) elseif presente == 9 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6576,1) -- firework rocket doRemoveItem(item.uid,1) elseif presente == 10 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,6572,1) -- party trumpet doRemoveItem(item.uid,1) elseif presente == 11 then doSendMagicEffect(pos,27) doPlayerAddItem(cid,2114,1) -- piggy bank doRemoveItem(item.uid,1) end return 1 end Enormee e grotesco. Agora veja o que a SVN fez (roubou meu script ) diminuiu xD local bluePresent = {2687, 6394, 6280, 6574, 6578, 6575, 6577, 6569, 6576, 6572, 2114} local redPresent = {2152, 2152, 2152, 2153, 5944, 2112, 6568, 6566, 2492, 2520, 2195, 2114, 2114, 2114, 6394, 6394, 6576, 6576, 6578, 6578, 6574, 6574} function onUse(cid, item, fromPosition, itemEx, toPosition) local count = 1 if item.itemid == 6570 then local randomChance = math.random(1, 11) if randomChance == 1 then count = 10 elseif randomChance == 2 then count = 3 end doPlayerAddItem(cid, bluePresent[randomChance], count) elseif item.itemid == 6571 then local randomChance = math.random(1, 22) if randomChance > 0 and randomChance < 4 then count = 10 end doPlayerAddItem(cid, redPresent[randomChance], count) end doSendMagicEffect(fromPosition, CONST_ME_GIFT_WRAPS) doRemoveItem(item.uid, 1) return TRUE end Esse ainda funciona com a red. Tirando a parte da red surprise bag, os dois funcionam da mesma forma, porém para quem entende scripts o segundo é bem mais facil. Bem a sintaxe da matriz é muito facil. nome da matriz = {primeiro item,segundo item} Para usar deve se usar como se fosse a variavel mais o numero da "coluna". Por exemplo local itens = {"boots of haste","giant sword"} if math.random (1,3) == 1 then doPlayerAddItem(cid,itens[1],1) else doPlayerAddItem(cid,itens[2],1) end Veja se a sorte do player for 1 ele adiciona o item boots of haste, se for 2 ou 3 ele adiciona a giant sword. Claro que esse scripts não iria funcionar. Porém é so um exemplo para melhor explicar o bendito vetor. Porém acho que é mais comum você observar o vetor sendo usado para indicar varios itens ao inves de apenas um. local useWorms = FALSE local waterIds = {493, 4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625} function onUse(cid, item, fromPosition, itemEx, toPosition) if isInArray(waterIds, itemEx.itemid) == TRUE then if itemEx.itemid ~= 493 then if useWorms == FALSE or useWorms == TRUE and doPlayerRemoveItem(cid, ITEM_WORM, 1) == TRUE then if math.random(1, (100 + (getPlayerSkill(cid, SKILL_FISHING) / 10))) <= getPlayerSkill(cid, SKILL_FISHING) then doPlayerAddItem(cid, ITEM_FISH, 1) end doPlayerAddSkillTry(cid, SKILL_FISHING, 1) end end doSendMagicEffect(toPosition, CONST_ME_LOSEENERGY) return TRUE end return FALSE end Nesse caso o autor do script ele diminui varias linhas usando o vetor. if isInArray(waterIds, itemEx.itemid) == TRUE then No Português Estruturado : Se estiver no vetor (nome do vetor, uid ) == verdadeiro faça Ou seja tudo que tiver no vetor waterIds e for itemEx (item2) vai ser considerado. O vetor tem essas duas utilidades nos otserver, se você observar bem o seu uso vem sendo aumentado a algum tempo. E não domina-lo é um erro para grandes scripts. Um bom exemplo é meu script da arena que na versão 3.0 os três scripts de movements tinham 1200 linhas, na 4.0 com uso de umas funções e if melhorados diminui para 400. E na futura versão 4.0 Virarão torno de 80 linhas, com uso dos arrays e for. Funções Criar funções é uma coisa maravilhosa, se você costuma sempre incrementar algo no seu otserver é muito util saber criar algumas delas. Por exemplo todos esses doPlayerAddItem e doSetPlayerStorageValue são funções. Quem leu o segundo tutorial entendeu as funções de otserver. E pelo que me lembre expliquei que podemos dividir as funções em dois grupos. As retornam valores e as que não. Porém na verdade 99% das funções retornam valores, porém torno de 60% são erros. Por exemplo se vc manda o otserver adicionar um item que não existe ele retorna uma mensagem de erro. Porém essa mensagem é inutil para o script, só mostra que você esqueceu ou é burro (xD). Um exemplo de função que retorna o seu dinheiro no player. function getPlayerMoney(cid) return ((getPlayerItemCount(cid, ITEM_CRYSTAL_COIN) * 10000) + (getPlayerItemCount(cid, ITEM_PLATINUM_COIN) * 100) + getPlayerItemCount(cid, ITEM_GOLD_COIN)) end (Observe as frescuras da SVN de tentar deixar o script bom para iniciantes, e depois eles usam variaveis que só tem nas sources.) Se você gosta de frescura pode "socar" variaveis no global.lua com nomes para ser ids. Eu ja odeio isso xD. Voltando ao script, ao usar essa função, ele irá retornar a quantidade de din din que vc tem Sendo usada assim. dinheiro = getPlayerMoney(cid) doCreatureSay(cid,dinheiro,TALKTYPE_ORANGE2) Ou do jeito que você quiser, veja que essa função retorna algo. Espero que entendam essa parte. Agora a vantagem de fazer uma função ? Pode tirar a repetição de alguma coisa. Por exemplo : if item.uid == 2300 then queststatus = getPlayerStorageValue(cid,2300) if queststatus == -1 then if playerCap >= itemWeight then doPlayerSendTextMessage(cid,24,"You have found a demon helmet.") doPlayerAddItem(cid,2493,1) setPlayerStorageValue(cid,2300,1) else doPlayerSendTextMessage(cid,24,"You have found a demon helmet. Weighing 29.50 oz it is too heavy.") end else doPlayerSendTextMessage(cid,24,"The chest is empty.") end Cada bloco desse é uma quest do meu otserver, e pelo que contei aqui tenho 90. Imagine que lindo para eu me achar ? Criei so por diversão uma função. function doQuest(cid, item, count, storage, value, take) local itemWeight = getItemWeightById(item, 1) local playerCap = getPlayerFreeCap(cid) if getPlayerStorageValue(cid, storage) == -1 then if playerCap >= itemWeight then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a ' .. getItemNameById(item) .. '.') container = doPlayerAddItem(cid, item, count) setPlayerStorageValue(cid, storage, value) else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a ' .. getItemNameById(item) .. ' weighing ' .. itemWeight .. ' oz it\'s too heavy.') end else doPlayerSendTextMessage(cid,24,'The ' ..take.. ' is empty.') end end E agora cada linha de quest minha fica. if item.uid == 2300 then doQuest(cid,2493,1,2300,1,'chest') end Melhor ? O unico problema é que no TFS 0.3.0+ ela da um erro (O bau abre como chest, porém a quest é feita normalmente.) Essa é uma função media, porém se você leu todos meus tutoriais ja entende ela facinho. Mais vou explicar como fazer passo a passo ela. function doQuest(cid, item, count, storage, value, take) Aqui você indica como ela será usada no script. Os nomes não importam, o que importa é vc usar eles em todo o script o mesmo. A ideia aqui é pegar tudo que vc prescisa. Item : É o id do item que o bau irá dar. count : A quantidade desse item. storage : É o storage value adicionado. value : O valor do storage adicionado. take : O nome do lugar que vc pega. Claro que eu fiz uma que atendesse todas minhas necessidades. O value e o take podem ser facilmente excluidos. Depois que declarei todos os requesitos devemos passa a parte de como fazer. Veja que usei todas as variaveis, usadas na função aqui dentro. Uma das regras da programação é : A maquina é burra, você tem que dar passo a passo o que ela deve fazer. Ou seja não esqueça de nenhum passo nas funções. Um erro gravissimo é o cara esquecer de meter no cid no começo. Se vc esquecer quando for rodar no otserver, vai dar milhões de erros, e tudo porque você esqueceu o cid. Lembrando novamente que não importam os nomes, eu poderia fazer isso. function doQuest(macaco, lixo, quantidade, seila, tipo, ultima) Se eu colocasse esses nomes no motor dele, iria funcionar normalmente. E também você pode usar funções suas dentro de funções suas, que irão funcionar normalmente. O lugar mais adequado de coloca-las é no global.lua. Se vc usa the forgotten server coloque-as no funcitons.lua. Porém se você for mais alienado pode criar um arquivo para suas variaveis. É só adicionar no global.lua essa linha dofile('data/meuarquivo.lua') Isso se ele tiver na pasta data (de preferencia dentro dela.) Mais uma inutilidade que você aprende aqui. Depois dessa volta enorme que demos aqui. É hora de explicar o bendito addEvent. addEvent e stopEvent Bem essa parte tem até certos creditos ao tutorial do noobinhu, pois eu não sabia que tinha stopEvent. Porém eu vou explicar da minha maneira. Também ao meu grande amigo Soulblaster que foi que me ensino a base sobre isso. O dificil do addEvent é explicar como o cara deve fazer a função. Já que vcs devem saber, o resto é facil. A função do addEvent é fazer rodar uma função num certo tempo. Ao contrario do que muitos pensam (até eu), colocar uma função depois do addEvent não fará ela rodar após ele. exemplo : addEvent(lever1, 5000) doSendMagicEffect(xadrexpos,12) Esse doSend... rodará antes dos 5 segundos. Ou seja, tudo que tenha que rodar em 5 segundos deverá estar na função. Isso vale também para varios addEvents. addEvent(tp1, 1000,cid) addEvent(tp2, 1000,cid) addEvent(tp3, 1000,cid) addEvent(tp4, 1000,cid) No caso acima todos irão rodar juntos, já que ele não espera um acabar para rodar o proximo. addEvent(tp1, 1000,cid) addEvent(tp2, 2000,cid) addEvent(tp3, 3000,cid) addEvent(tp4, 4000,cid) Esse seria o efeito certo. Agora que dei os macetes, explicarei a sintaxe. addEvent(função,tempo em milessegundos,parametros) Milessegundos é 1000 = 1 segundo e assim vai, os parametros são os das funções. Se houver apenas 1 parametro coloque-o direto. Se houver varios deve ser colocar entre chaves. addEvent(tp1, 1000,{cid=cid, topos= topos} Ou fazer o que muitos fazem : p = {cid=cid,topos=topos} addEvent (tp1, 1000,p} Esse p também é opcional, e não sei pq o usam sempre... Isso é mais simples, e você deve usar todos os parametros da função. Lembra que falei que o nome não importa na função ? Aqui meio que importa já que você deve declarar tudo. É mais ou menos como se fosse usa-la em um script. Exemplo : p = {cid = cid, item = 2493, count = 1, storage = 2300, value = 1, take = "chest"} addEvent (doQuest, 3000 , p) Facil ? Eu acho que sim. O stopEvent é simples também stopEvent (função ) Nunca usei, será util se você colocar o addEvent em um looping ou sei lá. E digo mais que no tempo que comecei tivesse um tuto porco desse, eu acho que seria m scripter bem melhor. Bem espero que esse tutorial seja util ao todos que leram, qualquer duvida ou dificuldade reportem, se gostarem não deixem de comentar. Não sei se ficou muito bom (até pq são 02:43 mins da madrugada, e como não bebo e não tem coca-cola, tomei uns 30 copo de leite). E aguardem os proximos!!!1 ponto