Ir para conteúdo

Líderes

Conteúdo Popular

Exibindo conteúdo com a maior reputação em 01/19/13 em todas áreas

  1. Tonynh

    Entrevista com o Diretor Anyur!

    Faaaaala galera! Sentiram saudades das minhas entrevistas? =p Venho trazer hoje, uma entrevista com o nosso recém promovido a direção do fórum, Anyur! Nesta entrevista, vocês poderão conhecer um pouco mais sobre o nosso diretor, e saber também um pouco mais sobre os planos dele para 2013! Espero que gostem da entrevista, e boa leitura! Olá Anyuuur! Estes dias você esteve me entrevistando, mas hoje, chegou a minha vez de te entrevistar! =p Vamos começar com a entrevista! Para começarmos poderia nos dizer o seu nome e sua idade? - Me chamo Gabriel Couto, tenho 17 anos! Como você conheceu o jogo Tibia, e o que te trouxe ao XTibia? - O jogo eu conheci em 2004, faz um bom tempo, quando um amigo meu me mostrou como jogar, como era o jogo, etc. O Fórum eu conheci há um bom tempo, 2006 provavelmente, procurando coisas para OTServer mesmo, pois eu e um grupo de um amigos queríamos abrir um servidor na época! Como todos sabemos, você dedicou a maior parte do seu tempo ao mapping. O que mais te chamou a atenção para praticar e conhecer o mapping? - Acho mapping muito legal, e comecei com isso pois tinha um servidor em 2010 e eu que fazia áreas novas, então tomei gosto pelo mapping. Além disso, não me dou bem com códigos, etc, então não gosto de estudar programação e afins, só de dar umas editadas em script, algo de php, então não me dedico à isso! Você já esteve na colaboração, moderação, coordenação, e agora você entrou como Diretor. Como você está se sentindo? Você sente que vem fazendo um bom e satisfatório trabalho até agora? - Cara, estou bem feliz por ter sido promovido, mas a ocasião não foi tão legal, com a saída do Won! Eu esperava já isso, pois eu já estava em alguns testes há alguns dias, fazendo relatórios de equipe, mas a saída dele foi inesperada pra todo mundo! Mas com 1 dia, não deu pra fazer muita coisa, mas já estou fazendo algo, coloquei uma nova pessoa (já era da equipe) na seção de aprovação de downloads, já vou marcar uma reunião em breve, etc, estou querendo levar o fórum de volta ao que era antes. Como coordenador de mapping, você tinha muitos planos para a seção. Mas e agora na direção, como ficarão estes planos e projetos? - Bom, eles vão continuar pois eu continuo como responsável na seção! Mas agora estou contando com a ajuda de uma pessoa, que agora, está se tornando pública essa informação, que é você mesmo, que vai dividir algumas tarefas comigo na seção Qual a sua visão sobre o atual XTibia em termos de organização, e equipe em geral? - Essa coisa de organização é polêmica hahaha, deve gerar algumas respostas bem desagradáveis, talvez, mas vamos lá. Cara, comparando com outros fóruns, como a otland (vários tópicos fora de seção, principalmente em mapping), eu acho que não estamos mal, mas é claro, não estamos perfeitos. Nenhuma comunidade grande vai ter organização de tópicos perfeita, por maior que seja a equipe, pois isso é impossível. Mas nossa equipe trabalha bem, em geral, e vai aumentar a organização agora, novos membros estarão entrando na nossa moderação (hoje são colaboradores), e assim, vamos atingir um nível melhor. Mas, é claro, nada é perfeito e nunca vai ser. O que você acha que precisa melhorar dentro da comunidade, e como melhorar isso? - Acho que algumas seções específicas precisam melhorar, como a de Tibia Global e Spriting, que precisam de mais visualizações. Para melhorar, vamos ter que traçar metas nessas seções para aumentar primeiramente a visualização delas, para podermos formar uma equipe nelas, e então, pensar em melhorar de verdade! Agora que entrou na direção, acredita que os usuários podem e vão esperar mais de você? O que você acha disso? - Claro, agora mudam muitas das minhas antigas obrigações no fórum, e isso inclui contato direto com os interesses de todos os usuários e dos membros da equipe. Isso é bem legal e espero não decepcionar. Além disso, podem esperar o Addict de volta, farei vocês sentirem falta dele Como diretor do XTibia, quais os seus planos para o futuro? Pretende trazer boas e grandes mudanças? - Primeiramente, estabilizar a equipe, estabilizar algumas brigas internas, que são inevitáveis. Depois disso, pretendo sim mudar algo no XTibia, quero investir na publicidade de tópicos, no portal, no facebook, pois eles que são, hoje, os pontos-chave do fórum. Fazendo uma estimativa de chutômetro, talvez 80% dos nossos visitantes a cada 30 minutos não são registrados, e eu quero diminuir isso, quero procurar algo que incentive os nossos só visitantes a se cadastrarem no fórum. Vamos ver o que conseguimos Para você, qual a seção mais promissora do fórum? Por que? - Cara, sinceramente, vou responder a que mais está crescendo atualmente É justamente a sua seção que eu acho no momento a mais promissora. Ela está ressurgindo das cinzas e você usa bem o portal para atrair público à ela, e o número de tópicos e acessos vem crescendo cada vez mais! E qual a seção com mais deficiência atualmente? E o que fazer para melhorá-la? - Acho que a seção de Spriting deve ser a mais deficiente, pois tem pouco conteúdo, poucos tópicos, poucos membros ativos. Estou buscando mais um estagiário (conversarei com o tal em breve) para tentar chamar atenção da área. Vou usar o portal para chamar atenção e também vou me aliar com esses estagiários, que hoje é somente o SmiX e esse provável que deverá vir em breve, para tentar algum concurso, algo que aumente o público! Quais são os planejamentos para as seções? Tem algum? - Bom, estou aguardando poder fazer a reunião geral em breve, com todos os coordenadores, ver as ideias deles e apresentar as minhas. Mas de início, quero ouví-los e fazer propostas para que juntos, em equipe, possamos por em prática as ideias. Qual o membro que você mais se identifica aqui dentro do fórum? Ele pode ser da equipe ou não. - Bom, a maior parte dos meus amigos são da equipe ou ex-equipe, e acho que são quatro com que me identifico bastante, que são Lordfire e Brund, amigos já de um bom tempo, e mais recentes, que são você, Tonynh, e o Won Helder. Do seu ponto de vista, qual membro da equipe você tem mais expectativas e na sua opinião, exerce o cargo melhor que os demais? - Bem difícil a pergunta de ser respondida, mas crio muitas expectativas em algum dos nossos colaboradores, principalmente WH47, nosso destaque agora, com certeza, e Oneshot, que possui um potencial enorme de conteúdo de programação e scripting. O que você acha da seção OFF-Topic? (Principalmente o Barzinho do Éks). - Acho a seção bem legal, venho tentando interagir mais com o pessoal de lá, tentar me tornar colega deles, para que eu possa trabalhar lá também O bar tem essa especificidade, que é a dificuldade em moderar quando não se é de lá, então, antes que eu possa fechar tópicos que mereçam ser fechados (alguns com certeza são), quero me tornar colega deles para que não haja problemas Finalizando as perguntas, gostaria de deixar uma mensagem para os usuários que irão ler esta entrevista? - Sim, saibam que estou aqui para ajudar vocês e tentar realizar seus desejos e ideias para o fórum, e também, em alguns anos, Addict será esquecido dos comentários e seu nome dará lugar ao Anyur. Abraços. FIM DA ENTREVISTA Obrigado Anyur pela ótimas respostas! E é isso pessoal, espero que tenham gostado da entrevista! MIAU! É ISSO AI!
    6 pontos
  2. AlexandreKG

    Comandos Para PhotoShop!

    Bom caros amigos,venho por meio deste tutorial para informar os comandos de PhotoShop!Espero que todos prestem a atenção nos nomes,pois facilitará muito na hora de fazer algum trabalho no photoshop.Conhecendo o nome e as ferramentos você se identificará mais facil,quando for fazer algo. F1 - Abre a ajuda do PhotoShop. F5 - Mostrar ou não paleta de prédefinições de Pincéis. F6 - Mostrar ou não paleta de cores. F7 - Mostrar ou não paleta de camadas,canais e desmarcadores F8 - Mostrar ou não paleta de navegador,informações ... F9 - Mostrar ou não paleta de histórico ou ações.. Tab - Mostrar ou não todos os componentes da tela. Shift + Tab - Mostrar ou não todos os componentes da tela.(Excessão barra de ferramentas!) Mantenha o dedo pressionado a tecla SHIFT M - Letreiro retangular V - Mover L - Laço,Laço poligonal,Laço magnético W - Varinha mágica C - Corte desmarcado K - Fatia J - Pincel para recuperação de manchas B - Pincel S - Carimbo Y - Pincel do histórico E - Borracha G - Degradê R - Desfoque O - Subexposição A - Seleção de Marcador T - Texto P - Caneta U - Retângulo N - Observações I - Conta Gotas H - Mão Z - Zoom D - Cores de primeiro plano e Plano de fundo Padrão Comandos abaixo não precisam mais ficar com o dedo pressionado no SHIFT X - Alterar cores de primeiro plano e plano de fundo padrão Q - Alternar entre modo padrão F - Alternar para modo de tela padrão Atalhos para Arquivo CTRL+N - Novo CTRL+O - Abrir CTRL+ALT+0 - Procurar CTRL+ALT+SHIFT+O - Abrir Como CTRL+W - Fechar ALT+CTRL+W- Fechar todas SHIFT+CTRL+W - Fechar e ir para o Bridge CTRL+S - Salvar SHIFT+CTRL+S - Salvar como ... ALT+SHIFT+CTRL+S - Salvar para Web F12 - Reverter CTRL+ALT+SHIFT+I - Info sobre arquivo CTRL+SHIFT+P - Configurar página CTRL+ALT+P - Imprimir com visualização CTRL+P - Imprimir CTRL+ALT+SHIFT+P - Imprimir uma cópia CTRL+Q - Sair Editar Menu Ctrl+Z - Desfazer Ctrl+F - Repetir filtro Ctrl+Shift+Z - Avançar uma etapa Ctrl+Alt+Z - Retroceder uma etapa Ctrl+Shift+F - Atenuar Ctrl+X ou F2 - Recortar Ctrl+C ou F3 - Copiar Ctrl+Shift+C - Copiar mesclado Ctrl+V ou F4 - Colar Ctrl+Shift+V - Colar em Ctrl+T - Transformação livre Ctrl+Shift+T - Transformar novamente Ctrl+Shift+K - Configuração de cores Ctrl+Alt+Shift+K - Atalhos no teclado Ctrl+K - Mudar preferências Atalhos para imagem Ctrl+L - Niveis Ctrl+Shift+Alt+E - Aplicar imagem Ctrl+Shift+L - Niveis automaticos Ctrl+Alt+Shift+L - Contrastes automaticos Ctrl+Shift+B - Cores automaticas Ctrl+M - Curvas Ctrl+B - Equilibrios de cores Ctrl+U - Matiz/saturação Ctrl+Shift+U - Remover saturação Ctrl+I - Inverter Ctrl+Alt+Y - Tamanho da imagem Atalhos para camada Ctrl+Shift+N - Nova camada Crtl+J - Nova camada por cópia Ctrl+Shift+J - Nova camada por corte Ctrl+Alt+G - Criar/soltar máscara de corte Ctrl+G - Agrupar camadas Ctrl+Shift+G - Desagrupar camadas Ctrl+Shift+] - Trazer para o primeiro plano Ctrl+] - Trazer para frente Ctrl+[ - Enviar para trás Ctrl+Shift+[ - Enviar para o plano de fundo Ctrl+E - Mesclar camadas Ctrl+Shift+E - Mesclar camadas visiveis Atalhos de seleção Ctrl+A - Selecionar tudo Ctrl+D - Cancelar seleção Ctrl+Shift+D - Selecionar novamente Ctrl+Shift+I ou Shift+F7 - Inverter seleção Ctrl+Alt+A - Selecionar todas as camadas Ctrl+Alt+D ou Shift+F6 - Difusão Créditos: Mozark001 - Por organizar e criar o tópico
    2 pontos
  3. Vamos começar do zero, então. Orientação a Objetos, é um tipo de programação, onde você desenvolve o código, como "ações" de algo, um objeto. Essas "ações" podem ser chamadas, de maneira grossa, de métodos. Lua não é uma linguagem tipada como C++, certo? Tão pouco é uma linguagem orientada a objetos. Mas existe um sistema da biblioteca Lua que dá a possibilidade de desenvolver Lua orientada a objetos - este é o sistema que chamamos de meta-tabelas. As funções de meta-tabelas, são simplesmente, funções que transformam tabelas normais da linguagem Lua em objetos. Para aprofundar, precisamos, primeiro, de algumas definições da POO, ou, programação orientada a objetos. Classe - Classe é a definição que usamos para um grupo de objetos com características em comum. Tomando como exemplo, cachorros, são várias raças, mas todos tem características em comum, certo? Latem, uivam, têm pelos, quatro patas... logo, pegaremos a classe dos cachorros. Objeto - É um integrante de uma classe, tomando o exemplo anterior, vamos considerar um objeto como um Rottweiler. Atributos - Uma definição de fácil compreensão para atributos - são as características de um objeto. Métodos - São as ações de um objeto, o que o objeto "sabe fazer", em poucas palavras. Agora em Lua, vamos pensar na classe do nosso exemplo anterior, te disse que a biblioteca das meta-tabelas transforma tabelas em objetos. Continuo a explicação daqui a pouco, abraços.
    2 pontos
  4. Amigo Piabeta, até agora eu não modero a seção de websites - também porque não posso. Até agora você não moderava o barzinho. Estava bom assim, não achas?
    2 pontos
  5. estilo de programação é estilo de programação... meu "tab" tem 4 espaços em vez de 8, assim como também não vejo problema nenhum em fazer algo do tipo: if x <= 0 then return false end acho mais bonito uma função assim: function myFunctionName() do que: function my_function_name() mas o que eu sempre fiz foi seguir o padrão do tibia, que separa palavras usando letras maiúsculas
    2 pontos
  6. Olá, meu nome é Cristofer Martins, sou programador e gameDesigner e atualmente faço parte da equipe Digimon Adventure Online. Estou aqui para apresentar o meu Spr Editor, que desenvolvi para a equipe por que outros editores não eram funcionais/simples o suficiente. Alem disso, vi que não há sprite editores para as novas versões do Tibia, dificultando a inserção/remoção/edição/exportação de Sprites dos novos arquivos SPRs.Alem disso, um outro motivo foi que tive uma pessima experiencia com o Demonic Editor, tentei exportar as Sprites do nosso SPR para uma pasta umas 20 vezes e sempre dava algum erro no meio do caminho. Por isso desenvolvi um Editor eu mesmo. Preview: Funções( no menu ): -Add: Adiciona n sprites ao editor. Basta clicar no add que irá aparecer a janela para você seleciona todas as sprites que você quiser( multi seleção ). Essas sprites serão adicionadas no final da lista de sprites. OBS: As imagens devem ser PNG e o fundo das sprites deve ser transparente, e não rosa, como é de costume. -Replace: Substitui n sprites no editor. Selecione com Ctrl ou até com o Shift as sprites no editor que você quer substituir, depois clique no menu em Replace. Irá aparecer uma janela aonde você seleciona as imagens PNG para serem substituidas. As sprites serão substituidas na sequencia, a primeira Sprite selecionada no editor vai ser substituida com a primeira imagem selecionada na pasta. O progresso do replace pode ser visto na barra de progresso. -Delete: "Deleta" n sprites da lista.Selecione com Ctrl ou até com o Shift as sprites no editor que você quer deletar, depois clique no menu em Delete. Essas IDs das sprites que são deletadas vão aparecer "" e o ID delas, elas são sprites vazias, sem conteudo que você substiuir com novas imagens e assim aproveitar essas IDS que não estão servindo para nada. Export: Exporta n Sprites. Basta selecionar com Ctrl ou com Shift ou clicando na sprite que o editor irá exportar essa sprite com fundo transparente. Você pode facilmente exportar todas as sprites para uma pasta ou apenas aquelas que lhe interessam. O progresso da exportação pode ser visto na barra de progresso. Clear: Limpa a lista de sprites e remove as imagens da memoria. Util para criar um arquivo SPR do zero, por exemplo. Exemplo multi select( para deletar, substituir ou exportar ): Abas Extract/Compile Extract: Nessa aba você clica em SPR file para abrir o arquivo SPR, escolhe a versão dessa SPR ali no "menu" do lado daonde tá escrito "version" e clica em Extract. O programa vai começar a extrair as sprites e adiciona-las a lista( as vezes a lista fica estatica basta clicar nela que ela atualiza com as sprites novas ) e o progresso da extração pode ver na barra de progresso. Compile: Nessa aba você compila as Sprites da lista para um arquivo SPR. Para isso basta clicar em "save" e escolher o arquivo SPR que vai ser salvo, escolher a versão desse arquivo SPR como feito em Extract e clicar em "Compile!". O progresso da compilação pode ser visto na barra de progresso. Outros Search by ID: Pesquisa uma sprite pelo ID. Caso essa id exista na lista, a lista se move até a a sprite. Download: SPREditor Scan: Virus Total Caso você encontre algum bug, reporte nesse topico por favor. Aceito sugestões. Caso exista alguma versão que não seja aceita no editor e você tem a signiture(assinatura) do arquivo spr, poste aqui que eu atualizo o version.ini.
    1 ponto
  7. • Styller Yourots {Editado} (8.60) • Mapa Base: Styller Yourots 0.7.5(Editado por Leonardo) Bem galera, tô dando uma atualizado no server do LeozeraRox e colocando aqui pra vcs. Espero que curtem. • Informações: Editado por Rodrigo 25/08/10 -- ADD TELEPORTS PRAS HUNTS E QUESTS. -- Novo Visual do Templo. -- Novo Visual do DP. -- ADDONS AGORA POR ITENS. -- Adicionado Comando Para Comprar VIP: !buyvip. -- Adicionado NPC Morpheu (que troca 100 Giant Spider Silk por 10 Spool of Yarn). -- Adicionado NPC A Sweaty Cyclops (que troca itens de addons que não caí de bichos por equipamento). -- Obsidian Knife e Blessed Wooden Stakeedit Funcionando. -- Canivete funcionando e Adicioando nNPC que o vende. -- Nargor Editado. -- VIP Quest (em Nargor). -- Adicionando VIP Itens. -- Novas Áreas adicionadas como: dwarf, lizard, minotaur, tortoise, quara, wasp, chicken, dwork, djins, entre outras... -- Editado itens.xml. -- Editado pasta npc. -- Editado loot dos bichos. -- Adicionado Poção que dobra sua xp por 30 minutos (vendido na área VIP). -- Ao usar uma potion o empty vial some. -- Adicionado camas nas casas. Editado por Rodrigo 12/09/10 -- NOVOS VIPS ITENS: E AGORA VENDIDOS NA NPC MAD -- Novo Templo. -- Cidades Editadas. -- Bugs das casas arrumados. -- Bug da NPC A Sweaty Cyclops arrumado. -- ADD Quest Yalahar. -- Algumas edições no mapa. -- E muito mais... ACC GOD 2/2 • Fotos: :colors: • Teleports • Novo Templo • Novo Dp • NPC Taiki • NPC Edgar • NPC Morpheu • The Horned Fox • Nova Área Demon • Galinheiro • Nova Área GS • Nova Área Quara • Nova Área Tortoise • Nova Área Tumba • Cyclops DOWNLOAD :star: Servidor: 4shared • Download do Server (SEM AS DLLS E DISTRO): http://www.4shared.com/account/file/mET7pfso/Styller_Yourots_Editado_20_Sem.html • Scan VirusTotal: Clique Aqui. • Download DLLS E DISTRO: http://www.4shared.com/file/rWVICf9r/Dlls_e_Distro.html • Scan VirusTotal: Clique Aqui. • Créditos BOM JOGO :lolz:
    1 ponto
  8. Gears

    Anti Hacker

    Bom pessoal o antigo anti hacker do fireelement foi editado e o conteudo removido link : http://www.xtibia.com/forum/topic/170739-creaturescripts-anti-hack/ Então resolvi repostar esse system que um amigo meu tinha guardado aqui vamos lá? P:Oque ele faz? R:Bom se uma pessoa não estiver autorizada a logar na acc do god ela leva ban e a acc é deletada rs. Vamos ao script Em data/creaturescripts/creaturescripts.xml adicione isso: <event type="login" name="AntiHack" event="script" value="antihack.lua"/> Em data/creaturescripts/scripts crie um arquivo com o nome de antihack.lua e adicione isso function onLogin(cid) local p = { name = {"ADM"}, -- Liberar jogador por nome: {"ADM", "gears"} ip = {"127.0.0.1"}, -- Liberar jogador por IP: {"127.0.0.1", "10.0.0.1"} time = 0.5 -- Tempo que vai kickar o player, em segundos } if getPlayerGroupId(cid) >= 5 then if isInArray(p.ip, doConvertIntegerToIp(getPlayerIp(cid))) == false then if isInArray(p.name, getCreatureName(cid)) then doPlayerSendTextMessage(cid, 22, "Welcome!") else doPlayerSendTextMessage(cid, 22, "Você não está autorizado a logar nessa account.") addEvent(doRemoveCreature, p.time*1000, cid) end end end return true end Configurando: name = {"ADM"}, -- Liberar jogador por nome: {"ADM", "gears"} ip = {"127.0.0.1"}, -- Liberar jogador por IP: {"127.0.0.1", "10.0.0.1"}-> Sei que terá perguntas sobre essa parte, então só libere para o seu ip fixo, ou seja o 127.0.0.1 mas se vc tiver um ip no no-ip tambem serve time = 0.5 -- Tempo que vai kickar o player, em segundos, kickaria o player em 5 milésimos de segundo Vamos a parte onde o player leva delete na account : function onLogin(cid) function onDeletAcc(cid) pid = getPlayerGUID(cid) doRemoveCreature(cid) db.executeQuery("DELETE FROM players WHERE `id` = "..pid) db.executeQuery("DELETE FROM accounts WHERE `id` = "..pid) end local p = { name = {"ADM"}, -- Liberar jogador por nome: {"ADM", "gears"} ip = {"127.0.0.1"}, -- Liberar jogador por IP: {"127.0.0.1", "10.0.0.1"} time = 0.5 -- Tempo que vai kickar o player, em segundos } if getPlayerGroupId(cid) >= 5 then if isInArray(p.ip,doConvertIntegerToIp(getPlayerIp(cid))) == false then if isInArray(p.name, getCreatureName(cid)) == true then doPlayerSendTextMessage(cid, 22, "Welcome!") else doBroadcastMessage("WARNING! "..getCreatureName(cid).." Tentou entrar nessa conta sem permissão , fale com o god!") addEvent(onDeletAcc, p.time*1000, cid) end end end return true end Créditos:Fireelement (Criação do anti hack) Vodkart ( Criação do ban acc) Gears(Edição em uma pequena parte do script e achar e postar esse conteudo ) Bjos
    1 ponto
  9. Automatic Raids.xml <?xml version="1.0" encoding="UTF-8"?> <mod name="Automatic Raids" version="1.0" author="Vodkart And xotservx" contact="xtibia.com" enabled="yes"> <config name="raids_func"><![CDATA[ days = { ["Monday"] = { ["21:30"] = {nome = "Orshabaal", pos = {fromPosition = {x=184, y=55, z=7},toPosition = {x=188, y=58, z=7}},m = {"5 Fire Devil", "2 Orshabaal"}, Time = 15}, ["21:33"] = {nome = "Dragon", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}},m = {"100 Dragon"}, Time = 20} }, ["Sunday"] = { ["10:08"] = {nome = "Demon", pos = {fromPosition = {x=202, y=11, z=7},toPosition = {x=204, y=12, z=7}}, m = {"1 Demon"}, Time = 15}, ["10:46"] = {nome = "Hydra", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}}, m = {"7 Hydra", "4 Cyclops"}, Time = 20} } } ]]></config> <globalevent name="AutomaticRaids" interval="60" event="script"><![CDATA[ domodlib('raids_func') function onThink(interval, lastExecution) if days[os.date("%A")] then hours = tostring(os.date("%X")):sub(1, 5) tb = days[os.date("%A")][hours] if tb then function removeCreature(tb) for x = ((tb.pos.fromPosition.x)-10), ((tb.pos.toPosition.x)+10) do for y = ((tb.pos.fromPosition.y)-10), ((tb.pos.toPosition.y)+10) do local m = getTopCreature({x=x, y=y, z= tb.pos.fromPosition.z}).uid if m ~= 0 and isMonster(m) then doRemoveCreature(m) end end end end doBroadcastMessage("The invasion of " .. tb.nome .. " started") for _,x in pairs(tb.m) do for s = 1, tonumber(x:match("%d+")) do pos = {x = math.random(tb.pos.fromPosition.x, tb.pos.toPosition.x), y = math.random(tb.pos.fromPosition.y, tb.pos.toPosition.y), z = tb.pos.fromPosition.z} doSummonCreature(x:match("%s(.+)"), pos) end end addEvent(removeCreature, tb.Time*60*1000, tb) end end return true end ]]></globalevent> </mod> Configuração: days = { ["Monday"] = { ["21:30"] = {nome = "Orshabaal", pos = {fromPosition = {x=184, y=55, z=7},toPosition = {x=188, y=58, z=7}},m = {"5 Fire Devil", "2 Orshabaal"}, Time = 1}, ["21:33"] = {nome = "Dragon", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}},m = {"100 Dragon"}, Time = 2} }, ["Tuesday"] = { ["10:44"] = {nome = "Demon", pos = {fromPosition = {x=184, y=55, z=7},toPosition = {x=188, y=58, z=7}}, m = {"5 Demon", "8 Fire Devil"}, Time = 1}, ["10:46"] = {nome = "Hydra", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}}, m = {"7 Hydra", "4 Cyclops"}, Time = 2} } } ["DIA"] = { ["HORA DA INVASÃO"] = {nome = "NOME DA INVASÃO", pos = {começo e final da área}, monster = {"MONSTROS"}, Time = para remover os monstro} } O dia da invasão é colocada entre " " e somente dia em inglês e a primeira letra maiúscula, exemplo: "Saturday" Depois são as hora da invasão, que é colocada entre " " e somente a hora e minuto, segundos não precisa exemplo: "15:00" As Posições estão entre { } adicionando as posições x, y e z, é o começo e final da área exemplo: pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}} fromPosition -- começo da área onde vai acontecer a raid toPosition -- final da área onde vai acontecer a raid Os monters tem um modo especial de configurar, vc coloca entre { }, e cada monstro entre " ", e entre as " " vc adiciona "QUANTIDADE MONSTRO", e para adicionar mais tipos de monstro se separa por virgulas, exemplo: {"40 Water Elemental", "5 Cyclops"} Time é uma função extra, é para caso ninguém participe do evento os monstros não fiquem pelo mapa, e é em minutos, exemplo: Time = 15
    1 ponto
  10. guitar123

    Refugia Jack(8.60)

    Olá galera! Venho hj aki postar meu primeiro tópico, espero que gostem! Mapa Refugia Subwat editado por Jacksonsns O que mudou? O templo foi modificado. Foram adicionados novos tps Novos treiners A area de teleports foi completamente modificada Aqui vai algumas imagens: Download: http://www.4shared.com/rar/4RNEg-6W/Refugia_86.html Scan: https://www.virustotal.com/file/5a6ac95f69e215e51a263ca35eb629e60ac69eaf0b656fc115fa18e27758de26/analysis/1358487516/ SENHA DO GOD account:god senha:GOD Créditos: Subwat (Gean Riot) Jacksonsns Refugia.com.br GOSTOU??/ + REP AE PLIZ!!
    1 ponto
  11. Obs.: Eu sei que esse tutorial é quase uma trilogia, mas não desanime, tente ler até o final, você pode aprender muita coisa nova! Se você não quer ler tudo, pule a parte de escopo e identação, pois é a parte mais complexa. Recomendo voltar depois e tentar entender identação e escopo. Você está jogando Tetris quando um desconhecido te chama e pede para arrumar um script dele que não está funcionando direito. Aparentemente, os players estão ficando irritados porque o servidor está respondendo "Hell, world!" para eles, quando deveria estar respondendo "Hello, world!". Você diz "tudo bem", o cara te manda o script, e você se depara com isso: _,__,___,____=string.char,print,type,"fu" .."nction"if(___(__)==____)then __(_(0x48 ,0x65,0x6c,0x6c,0x2c,0x20,0x77,0x6f,0x72, 0x6c,0x64,0x21)) --[[Hello, world!]] end Se você sentiu um pingo de vontade de ler o código, exceto por curiosidade, seu nome é Mock. O erro mais comum que eu vejo sendo cometido por iniciantes não é nada relacionado à sintaxe, lógica da programação ou consumo excessivo de fungos pluricelulares. É a elegância (Ou melhor dizendo, a falta dela). Não me interessa se seu código deixa o Tibia 4D com Intel® Tesselated 256x Clockwise Polygoned RealExtreme™ Greener Foliage e nunca deu um bug. Se ele não for no mínimo agradável de ler, eu vou jogar fora, e sentir pena da lixeira. 90% das vezes que eu digo para algum iniciante deixar o código mais bonito, eles me respondem que "só eu vou ler mesmo, cara, não vou ficar me preocupando com isso". Isso é a mesma coisa que limpar a bunda sempre com o mesmo papel porque você não é homossexual e não precisa da* * *****. Nas outras 10% das vezes, a pessoa fica offline e nunca mais aparece. Devaneios à parte, vamos ao que interessa: Por que a característica mais importante de um código é a elegância, e como deixar seu código elegante? Começando do princípio: Para escrever um código, o programador precisa ter na cabeça a abstração de uma solução para o problema em mente. Se você não entendeu, isso apenas significa que se você quer escrever um script que faça X coisa, você tem que ter na cabeça uma ideia para fazer a coisa X acontecer através de um código. Se você é distraído por algo, ou para de programar na metade do código, ou está com muito sono, essa ideia vai se perdendo e você tem que pensar nela novamente depois. Veja o problema do "Hello, world!" acima. Imagine que aquele código é seu, e você achou que ele estivesse funcionando, mas agora percebeu o bug e quer consertar. Só que já faz tempo que você fez o script e não tem mais em mente a ideia que usou para escrever ele à muito tempo atrás. A ideia se perdeu, e o único modo de relembrar ou descobrir a ideia de um código é, bem, lendo ele... Se você ainda tem a ideia em mente, ler um código como aquele ali em cima é muito fácil: parece óbvio para você o que ele faz, pois afinal, você acabou de escrevê-lo! Só que não é bem assim que funciona se você já não lembra de como fez o código, vai ser muito difícil ler um código grande todo mal-feito como aquele ali em cima, e o trabalho de arrumar o código é muito mais complexo. Caso você estivesse na situação de ter que arrumar o código do "Hello, world!", qual código você iria preferir arrumar? O de cima ou este aqui: print("Hell, world!") O problema piora se você não sabe como arrumar o bug e precisa de ajuda de alguém. Se você enviar um código todo mal-feito para alguém te ajudar, é bem provável que a pessoa nem vá ler seu código, dar uma desculpa e se safar de ter que ver tamanha aberração (Aos que estão se perguntando: sim, eu faço isso). Ou seja, enfie na cabeça de uma vez por todas que mesmo que seu código jamais vá ser lido por outra pessoa, é importante que você faça ele de forma elegante. É muito chato ter que enfeitar o código depois que ficou pronto? Você está fazendo algo muito errado! Se você faz o código todo para depois deixar bonitinho, fique sabendo que essa é uma péssima ideia. Você não tem que deixar bonito depois de pronto, e nem antes de começar, você tem que ir aplicando a elegância justamente enquanto escreve o código! Não faz sentido escrever um código feio para depois enfeitar. É a mesma coisa que parir o Hitler e deixar ele mais bonitinho com maquiagem e lacinhos. Acostume-se à escrever um código naturalmente bonito. A parte que realmente interessa: Como deixar seu código bonito! Identação A primeira coisa que me vem em mente quando alguém fala em código bonito é a identação. Identação é o espaço horizontal que separa as linhas de código da borda da esquerda. Veja um exemplo de código identado abaixo. Em azul é o espaço da identação, geralmente feito com a tecla tab: Além de mais bonito, fica extremamente mais simples ler um código identado. Ela é tão importante que na linguagem Python a identação não somente é obrigatória, como também é parte da sintaxe. Existem muitos iniciantes por aí que não sabem identar, mas adicionam espaços antes das linhas para copiar o código de outra pessoa e acabam fazendo tudo errado. Isso atrapalha tanto quanto um código não identado, se não piorar. Escopo Para aprender a identar corretamente, primeiro você deve entender o que é um escopo. A explicação abaixo não serve apenas para embelezar seu código, mas também é um conceito fundamental para programar, não apenas em Lua, mas em diversas outras linguagens de programação, então é importante que você leia mesmo se quiser fazer códigos feios (Afinal, a opção é sua, só não sei por que você chegou até aqui no tutorial se quer fazer um código feio). Escopo tem tudo à ver com variáveis locais e globais. A definição informal de escopo é: Até que ponto as variáveis locais podem ser alcançadas. Obviamente você não vai decorar isso, então vamos explicar de um jeito que você entenda: Quando você declara uma variável dessa forma em Lua, ela é uma variável global: x = 1 Significa que ela pode ser acessada de qualquer lugar no seu código! Emocionante, não é? Não. Você não deveria estar fazendo isso à não ser em casos muito, muito especiais, e só quando você sabe o que está fazendo. Variáveis globais tem seus usos, mas são perigosas se você não usá-las corretamente. Isso acontece porque variáveis globais podem dar conflito com outras variáveis. E pior, em um lugar que não tem nada a ver com a paçoca. Por exemplo, você tem dois scripts completamente diferentes: Um deles é uma alavanca que abre uma porta e o outro é uma pedra que teleporta. Completamente diferentes. Exceto por uma coisa: ambos possuem a variável "pos", e o inútil escritor desses scripts cometeu o grandíssimo erro de não usar variáveis locais quando necessário. Veja: alavanca_que_abre_uma_porta.lua: pos = {x=100, y=100, z=7} pedra_que_teleporta.lua: pos = {x=200, y=200, z=8} Quando o Lua abre o primeiro script, ele registra a variável global "pos" com o valor 100x100x7. Quando o Lua abre o segundo script, ele registra novamente essa variável com o valor 200x200x8. O resultado é bem óbvio, existe apenas uma variável "pos" usada pelos dois scripts com o valor 200x200x8, que é válida para a pedra que teleporta, mas completamente inválida para a alavanca que abre uma porta! Para criar uma variável local, basta adicionar a palavra "local" antes do nome da variável. Tornando a variável "pos" local, vão existir duas variáveis locais "pos", uma para cada script, e cada uma com seu valor: alavanca_que_abre_uma_porta.lua: local pos = {x=100, y=100, z=7} pedra_que_teleporta.lua: local pos = {x=200, y=200, z=8} Problema resolvido. Agora mesmo que as variáveis possuam o mesmo nome, cada script tem a sua, e elas não irão conflitar, pois cada uma tem seu valor. Variáveis globais tem seus usos. Por exemplo, caso você precise trocar informações entre dois scripts diferentes. Porém, se precisar usar variáveis globais, escolha um nome que você tem certeza absolutíssima de que não causará conflito com nenhuma outra variável. Mas isso não é tudo o que há para falar sobre variáveis locais. Elas possuem uma propriedade muito interessante, veja: if true then local var = "Hello, world!" end print(var) O que você acha que o print vai escrever? Se você disse "Hello, world!", você errou. E errou feio. O print vai escrever "nil". Curioso, não? Na verdade, é algo muito óbvio. A variável "var" é local, e foi criada dentro do "if". Isso significa que ela é local dentro do if, e que fora dele, ela não existe. Quando o "if" atinge seu "end", todas as variáveis locais dentro dele são destruídas. Em outras palavras, o print não consegue encontrar a variável "var", pois ela só existe dentro do "if"! Agora vamos ver um caso diferente: if true then local var = "Hello, world!" if true then print(var) end end O que você acha que o print escreve? Você provavelmente acertou essa, agora. A resposta é "Hello, world!". A variável local existe, sim, apenas dentro do primeiro "if". Porém, o segundo if está dentro do primeiro, então a variável var continua existindo. Ela só será destruída quando o primeiro "if" atingir seu "end". Vamos complicar as coisas um pouquinho. local x = 10 if true then local var = "Hello, world!" if true then local var = "Goodbye, world!" print(var) print(x) end print(var) end Uma variável local "x", duas variáveis locais "var", três valores diferentes, três prints. O que você acha que cada um escreve? A resposta é: o primeiro escreve "Goodbye, world!", o segundo escreve "10", e o terceiro escreve "Hello, world!". Epa, mas pera aí, a segunda "var" não dá conflito com a primeira, reescrevendo o valor dela? Não. Isso acontece porque a primeira "var" continua existindo no primeiro "if" quando a segunda é criada no segundo "if". Os prints vão escrever o valor da "var" mais próxima do escopo deles. Escopo, como disse antes, é até onde as variáveis locais são alcançadas. Imagine os escopos como degrais de uma pirâmide. Um escopo mais alto pode alcançar todos os degrais mais baixos que ele na pirâmide, mas não consegue alcançar os mais altos. Se fôssemos dar números aos escopos do código acima: Escopo global (Fora dos dois "if"s). Dentro do primeiro "if". Dentro do segundo "if". E por que o segundo print escreveu o "x" do primeiro escopo? Porque é como se Lua fosse descendo os degraus dos escopos até achar o que procura. Se não achar, retorna "nil". Por isso, também, o primeiro print escreve a segunda "var", e não a primeira. Vamos complicar mais uma vez: if true then local var = "Hello, world!" if true then var = "Goodbye, world!" print(var) end print(var) end E agora, o que cada print escreve? O primeiro escreve "Goodbye, world!", e o segundo... também! Observe bem, a segunda "var" não tem a palavra "local" antes! Você deve estar pensando que a segunda "var" é global, mas esse não é o caso. Se eu colocar mais um print, fora dos dois "if"s, ele vai escrever "nil"! Mas que magia negra está acontecendo aqui agora? É bem simples. Quando a palavra "local" é usada, você está dizendo à Lua "crie uma variável local aqui!". Quando você não usa, você está dizendo "substitua o valor da variável no escopo mais próximo por este valor!", e então Lua vai procurar a variável "var" no escopo mais alto (mais próximo ao topo, onde o código está), e substituir seu valor. Se nessa descida da piramide Lua não encontrar a variável que você quer, então ela criará uma variável global! Ou seja, naquele código acima, se não existisse o primeiro "var", o segundo "var" seria global! A última coisa que você precisa saber sobre escopo é que todo todo "repeat", "while", "do", "for", "if", "elseif", "else" e "function" abre um novo escopo, e todo "end" e "until" (No caso do "repeat") fecha o escopo mais alto da "pirâmide", destruindo todas as suas variáveis locais. Voltando à identação Agora que você já sabe usar variávies locais em toda sua maestria... Okay, eu sei, talvez ainda esteja confuso demais e você não tenha entendido tudo, mas não se preocupe! Talvez demore um tempo para você assimilar o que é o escopo e variáveis locais, e como aproveitar isso no seu código, isso vem com a prática. Mas continue acompanhando, pois identação é uma coisa muito simples! A vantagem imediata da identação é que você consegue enxergar exatamente quais são os escopos. Fica simples ver que tal print está dentro de tal "if", já que o print está com um nível a mais de identação. Antes que você comece a sair por ai distribuindo espaços aos seus códigos, há algumas coisas a considerar sobre a identação. A identação pode ser feita com "hard tabs", espaços ou "soft tabs". A identação com um hard tab é exatamente um caractere de tab. É quando você aperta a tecla tab do teclado (Fica em cima do "caps lock", representada por duas setinhas) e o seu editor adiciona um único caractere. A identação por espaços usa a tecla de espaço ao invés do tab para adicionar o espaçamento. É praticamente inviável, já que pra adicionar uma identação adequada você teria que apertar a tecla espaço umas 12 vezes. Os soft tabs são uma mistura dos dois estilos. Quando você aperta a tecla tab, ao invés de adicionar um único caractere de tab, o editor adiciona um determinado número de espaços. É como se você apertasse a tecla de espaço várias vezes. Muitas pessoas preferem usar soft tabs, muitas outras preferem hard tabs. Isso é um debate que dá longas horas de discussão para programadores experientes. Cada um tem suas vantagens e desvantagens. Vantagens do Hard Tab: Seu tamanho pode ser alterado editando as preferências do editor de texto. É mais fácil controlar o nível de identação, uma vez que é composto de um único caractere. Desvantagens do Hard Tab: Alguns editores zoam o caractere de tab, tornando a identação totalmente errada, mesmo que tenha sido feita corretamente. Esse é o caso do OTScriptLive!, muito usado para programar para Open Tibia. Se você usa OTScriptLive!, considere trocar de editor. Existem muitas alternativas ótimas, como SciTE, Notepad++, gedit... Vantagens do Soft Tab: Já que é composto de espaços, é garantido que o código seja exibido da mesma forma em todos os editores. Não tem o problema de editores que zoam a identação, como no Hard Tab. Desvantagens do Soft Tab: Seu tamanho não é variável. O arquivo fica maior, já que cada caractere usado no hard tab corresponde a quatro ou oito caracteres do soft tab (dependendo do tamanho adotado). Por ser composto de espaços, é extremamente chato remover níveis de identação. A escolha é sua. Se você usa OTScriptLive!, recomendo trocar agora mesmo de editor, pois você não terá suporte a soft tabs e os hard tabs são destroídos pelo programa, tornando a identação correta um desastre. Você terá que fazer a identação com espaços. Eu, particularmente, prefiro hard tabs. É muito mais natural. A maioria dos projetos open source usam soft tabs para garantir que o código fique idêntico em todos os editores, e para um projeto aberto assim, com várias pessoas mexendo, até faz sentido. Mas na minha opinião, isso traz uma série de problemas. Independente de qual for sua decisão, siga sempre esta regra: Nunca, jamais, misture caracteres de tab com espaços. Chega disso, vamos logo aprender a identar! A identação, diferente do que você deve estar pensando, é uma coisa ridiculamente simples. Tudo se baseia em usar um espaçamento para separar os escopos. A cada escopo criado, adiciona-se um tab a mais à cada linha seguinte. A cada escopo fechado, remove-se um tab de cada linha seguinte. Veja: Cada setinha representa um caractere de tab. Toda vez que um escopo novo é aberto (por um "function", "for" ou "if"), as próximas linhas recebem um tab a mais. Toda vez que um escopo é destruído (por um "end"), todas as próximas linhas, incluindo a linha do end, recebem um tab a menos. Se seguirmos essa regra, dá pra perceber que no escopo global (nível 1), as linhas terão 0 tabs. Em um escopo de nível 2, terão 1 tab, e assim por diante. Há um caso especial: "else" e "elseif". Eles funcionam como se abrissem um novo escopo, ou seja, as linhas seguintes recebem o tab adicional, porém a linha do "else" e "elseif" não. Veja: O "segredo" da identação é sempre adicionar mais um tab depois de "repeat", "while", "do", "for", "if", "elseif", "else" e "function" e colocar um tab a menos depois de "end" e "until". Outro ponto importante da identação é a de tabelas verticais. Quando você fizer uma tabela que se extende verticalmente, idente seus valores. Nunca coloque o caractere de abertura ({) e fechamento (}) em uma linha que contém um valor, e não idente a linha desses caracteres. Veja: Isso é tudo sobre identação. Não deixe para identar depois que o código estiver pronto! Quando você pular uma linha, já adicione os tabs necessários e continue escrevendo. A maioria dos editores adicionam estes tabs automaticamente se você habilitar a opção, mas apesar de ser uma questão de gosto, não recomendo usar este recurso. Se você chegou até aqui e acha que entendeu (A parte de identação ao menos, não vou te culpar se você não entendeu sobre escopo), então você agora sabe identar! Yay! Nem tudo é identação... Se você achou que identação é a unica coisa que torna um código elegante, se enganou. Porém, daqui pra frente, as coisas serão bem mais simples. Código Frankstein não é legal. Se você usa variáveis com nomes em português, pode ir parando com Lua agora mesmo e vá programar em G-Portugol. Apesar de ter sido criada no Brasil, a sintaxe de Lua é em inglês e, portanto, não misture inglês com português. Se você não sabe inglês, já passou da hora de começar a aprender. Quem é esse pokémon? Use nome de váriáveis auto-explicativos, e nunca abrevie, à não ser que a abreviação seja comumente usada, como "tmp" ao invés de "temporary". Ninguém é obrigado a ficar adivinhando o que aquela sua variável "cntplr1" ou "hahahalol" significa. Como faz essa mágica? Eu acho comentários muito idiotas. Diversos programadores vivem dizendo "explique cada linha de código com um comentário". Isso simplesmente não faz sentido, o código está bem ali. Como disse Linus Torvalds, "Talk is cheap, show me the code". Se o negócio foi bem escrito, qualquer programador que se preze vai entender... Ou não. Existem algumas gambiarras que você precisa comentar. Quando fizer algo que não é tão óbvio assim só de ler o código, comente. Isso é comum em números mágicos, por exemplo: radius = radius + 0.5 Por que aquele " + 0.5" está ali? O que ele faz de especial? Isso não dá pra descobrir apenas lendo o código, então comente e explique suas magias negras. Volte para a segunda série. Isso é um caso sério. Muito sério. Aprendemos na segunda série a sempre usar espaço depois de vígula, mas parece que tem gente que ainda insiste em fazer errado. Custa tanto assim fazer isso: doSetCreatureOutfit(cid, outfit, -1) Ao invés disso: doSetCreatureOutfit(cid,outfit,-1) ? Sempre. Use. Espaços. Depois. Da. Vírgula. Sim, eu já estou cansado disso. Maria vai com as outras. Se todo mundo usa o nome de variável "cid" para identificar o Creature ID de algo, siga a moda e use também. Fica confuso tentar entender um código que usa "banana" ao invés de "cid", que é o que todo mundo já está acostumado. Não use parenteses em condicionais! Os estadunidenses começaram com uma mania chata de colocar parenteses em condicionais, tipo isso: if (x == 10) then Parece que não entenderam muito bem que Lua é Lua, C++ é C++. Não faça isso, à não ser quando estritamente necessário pra evitar ambiguidade em uma condição muito grande. Faça do jeito que Lua foi feito para ser usado: if x == 10 then The KISS Principle. KISS é uma sigla inglesa para a frase "Keep It Simple, Stupid!", que significa mais ou menos isso: "Faça as coisas da forma mais simples, seu estúpido!". Nunca faça gambiarra quando não é necessário. Sempre faça as coisas da forma mais simples, pois é mais fácil de arrumar bugs e facilita a leitura. Número de linhas não indica qualidade de código! Esqueça essa história de que quanto menos linhas, melhor. Número de linhas nunca foi indicador de qualidade de código, então JAMAIS, e eu vou dizer denovo, JAMAIS coloque mais de uma coisa na mesma linha. É sério. Nunca faça algo assim: if x <= 0 then return false end Sempre separe cada comando em uma linha, assim: if x <= 0 then return false end Programe como se quem ler seu código fosse um serial killer com complexo de fofura. Não preciso explicar, apenas faça isso. Use vírgula no último elemento de uma tabela vertical. Veja: local messages = { "123", "456", "789", } O último elemento, "789", possui uma vírgula no final, mesmo sendo o último elemento da tabela. Sempre faça isso em tabelas verticais, tanto para manter a consistência visual, quanto para evitar que você adicione outro elemento depois e esqueça de colocar a virgula, ocasionando um erro. Não se preocupe, Lua aceita essa sintaxe, mas apenas faça isso em tabelas verticais. Linhas vazias são importantes também. Deixe algumas linhas em branco para separar partes do código. Elas ajudam bastante na visibilidade. E o mais importante de tudo: Siga um padrão. Adote um padrão de estilo e siga ele! Se você usa espaço em um lugar, mas não usa em outro, pode ir parando com isso. Sempre mantenha seu código dentro de um padrão que te deixe confortável. Não misture as coisas. Se você fez de um jeito, faça sempre desse jeito. Eis o meu padrão de estilo para a linguagem Lua. Você pode seguí-lo se quiser, ou seguir o seu próprio, mas o importante é que seu estilo tenha uma razão para cada coisa e que você se sinta confortável com ele, e use-o sempre, em todas as ocasiões, quebrando-o apenas em situações muito, muito especiais. Skyen Hasus' Lua Coding Style Guide Este é meu estilo de código para Lua. Todas as regras aqui foram pensadas antes de serem criadas, então ouso dizer que é um estilo consistente. Use o syntactic sugar para declarar funções. Faça assim: function foo() Ao invés de: foo = function() Não use espaços para separar o nome da função dos parênteses da lista de argumentos. Faça assim: function foo() Ao invés de: function foo () Não use espaços no início ou no final de parenteses, chaves ou colchetes. Faça assim: function foo(bar, baz) x = {"a", "b"} x[1] Ao invés de: function foo( bar, baz ) x = { "a", "b" } x[ 1 ] Use sempre um espaço antes e depois de operadores binários (dois valores: +, -, *, /, %, =, ==, <=, et cetera...). Faça assim: x = a + b * c Ao invés de: x=a+b*c A exceção para a regra acima são tabelas de uma linha só. Faça assim: x = {x=100, y=100, z=7} Ao invés de: x = {x = 100, y = 100, z = 7} Nunca use espaço depois de um operador unário (um só valor: único caso é o operador de negatividade, -). Faça assim: x = -a Ao invés de: x = - a Use sempre aspas para strings de uma linha só e [[]] para string de múltiplas linhas. Faça assim: msg = "And he said: \"Hello, world!\"..." Ao invés de: msg = 'And he said: "Hello, world!"...' Use a notação lower_underscore para nome de variáveis e funções. Todas as letras são minusculas e espaços são separados por underscore (_). Faça assim: function long_function_name() long_variable_name = 1 Ao invés de: function longFunctionName() longVariableName = 1 Use a notação CamelCase para nome de classes. (Apenas quando usar orientação à objetos!) Faça assim: Class = {} Ao invés de: class = {} Tabs tem tamanho de 8 caracteres! Faça assim: if true then this_tab_is_8_characters_wide = true end Ao invés de: if true then this_tab_is_4_characters_wide = true end Não use a notação multilinha de comentários. Use a notação de única linha em todas as linhas. Faça assim: -- Hello -- World Ao invés de: --[[ Hello World ]] Finalmente o fim. Foi um "tutorial" bem longo, mas espero que ajude muita gente à escrever códigos mais legíveis. Se você tem alguma dúvida, ou quer ver se sua identação está correta, ou quer discutir uma regra de estilo, ou ficou confuso em alguma parte e precisa de uma explicação melhor, ou achou algum erro, ou precisa de alguma dica, poste aqui! E não menospreze a beleza de um código, porque a beleza é o fator mais importante. Algo bem escrito é mais fácil de consertar e manter do que algo mal-escrito. Acostume-se a aplicar as suas regras de estilo conforme programa, e não depois que está tudo pronto. E acima de tudo, use um bom editor de texto! (Sério, parem de usar OTScriptLive!) (E coloquem espaços depois de vírgulas!!)
    1 ponto
  12. Tutoriais para criação de site Como criar um website para seu otserv - Por RaizenUrameshi http://youtu.be/jo8dna--Y7o Instalando website Gesior no seu OTServer Instalando ModernACC Instalando WampServer http://youtu.be/IhR0Pvp4WfA Tirando Bugs do Gesior AAC Créditos : Mozark001 - Por organizar tudo,e pegar os tutoriais. Criadores dos videos. Obrigado a todos que viram o topico,e que isto sirva para solucionar suas dúvidas. Atenciosamente,Mozark001. Parte 2
    1 ponto
  13. Slicer

    Simplificar Função

    Ola galera, cabei de fazer essa funçao aki... oq ela faz: ela deve limitar o tamanho de uma string ah no maximo 30~31 letras, caso passe disso ela acresenta um '\n' pra fazer o resto da string ir pra proxima linha... eu tive q fazer essa funçao pois no OTClient a janela da funaço doShowTextDialog(...) nao faz essa limitaçao e entao n da pra ver o resto da string caso ela passe dessas 30~31 letras... queria saber se alguem consegue diminuir essa funçao de algum jeito... pois achu q ela pode ta um pouco grande d+ e bem 'pesada'... e tb pra fins de aprendizado... aki um exemplo de test:
    1 ponto
  14. SmiX

    Premium Caugtch - By SmiX

    Olá galerinha, hoje vou ajudar vocês a otimizarem seus respectivos otservidores de pokémon, de base PDA. Como o título já está falando tudo, vamos a instalação. Como quase todo mundo usa a base do slicer vou usar o dele. Vá em: (data/actions/scripts/catch.lua) e substitua tudo por isso: local chance_premium = 200 -- Mude aqui a chance de capiturar local ballcatch = { [2394] = {cr = 3, on = 24, off = 23, ball = 11826, send = 47, typeee = "normal"}, [2391] = {cr = 6, on = 198, off = 197, ball = 11832, send = 48, typeee = "great"}, [2393] = {cr = 10, on = 202, off = 201, ball = 11835, send = 46, typeee = "super"}, [2392] = {cr = 15, on = 200, off = 199, ball = 11829, send = 49, typeee = "ultra"}, } function onUse(cid, item, frompos, item3, topos) local item2 = getTopCorpse(topos) if item2 == null then return true end if getItemAttribute(item2.uid, "catching") == 1 then return true end if getItemAttribute(item2.uid, "golden") and getItemAttribute(item2.uid, "golden") == 1 then return doPlayerSendCancel(cid, "You can't try to catch a pokemon in the Golden Arena!") --alterado v1.6 end local name = string.lower(getItemNameById(item2.itemid)) name = string.gsub(name, "fainted ", "") name = string.gsub(name, "defeated ", "") local x = pokecatches[doCorrectPokemonName(name)] -------------------------------------------------------------------------------- local storage = newpokedex[doCorrectPokemonName(name)].stoCatch --edited brokes count system if getPlayerStorageValue(cid, storage) == -1 then setPlayerStorageValue(cid, storage, "normal = 0, great = 0, super = 0, ultra = 0, saffari = 0") end -------------------------------------------------------------------------------- if not x then return true end local owner = getItemAttribute(item2.uid, "corpseowner") if owner and isCreature(owner) and isPlayer(owner) and cid ~= owner then --alterado v1.5 doPlayerSendCancel(cid, "You are not allowed to catch this pokemon.") return true end ----------------------------------------------------- newidd = ballcatch[item.itemid].ball typeee = ballcatch[item.itemid].typeee ----------------------------------------------------- local catchinfo = {} if isPremium(cid) then catchinfo.rate = ballcatch[item.itemid].cr + chance_premium else catchinfo.rate = ballcatch[item.itemid].cr end catchinfo.catch = ballcatch[item.itemid].on catchinfo.fail = ballcatch[item.itemid].off catchinfo.newid = newidd catchinfo.name = doCorrectPokemonName(name) catchinfo.topos = topos catchinfo.chance = x.chance doSendDistanceShoot(getThingPos(cid), topos, ballcatch[item.itemid].send) doRemoveItem(item.uid, 1) local d = getDistanceBetween(getThingPos(cid), topos) addEvent(doSendPokeBall, d * 70 + 100 - (d * 14) , cid, catchinfo, false, false, typeee) --edited brokes count system addEvent(doSendMagicEffect, (d * 70 + 100 - (d * 14)) - 100, topos, 3) return true end Funciona assim: Se um player for premium ele terá a chance de catch da ball + a chance premium, ou seja; Ele usa uma pokeball e é premium ele terá 3+200 = 203% de capiturar ;D, só precisa mudar a chance de premium lá em cima para seu gosto, deixei 200 pra teste ^}^. Só isso, fui....
    1 ponto
  15. rogeriocene

    SUBWAT KAMIKAZE V25

    Oque Ha De Novo? - Foi adicionado Shadow Set -Foi Adicionado Demonic Set , E quest Demonic -Foi adicionado King Set -Adicionei Um Shop Por Alavanca -Adicionei Vip2 (shadow vip) -Adicionei Segunda promotion , Shadow knight , Shadow Druid , Shadow Paladin , Shadow sorcerer -Adicionado Npc que vende Segunda promotion -City Shadow VIp -New HUntes -Removi Areas Inuteis do mapa ..Obs> Area que ngm usava e assim deixei o ot mais leve -Novos Monstros -Novos eventos -Todas Vocaçao estao balanceadas -New visual do templo -Novo Group 7 , E um adm Mais poderoso que pode ficar de ghost para gods -Cms,gms nao pode ficar de ghost .. AGORA VAMOS VER ALGUMAS IMAGENS TEMPLO SHOP SHADOW VIP CURTIU O MAP??DA UM +REP AE NUM CUSTA NADA.. E COMENTEM POR FAVOR PARA O TOPICO SUBIR.xD SE TIVEREM DUVIDAS PODEM POSTAR QUE EU ESTAREI AJUDANDO.. DOWNLOAD: http://www.4shared.c...izado2013.html? SCAN: https://www.virustot...sis/1358620343/
    1 ponto
  16. gonorreiaswat

    Residentibia [Showoff]

    Sugestão até engraçada, mas pretendo sim dar uma função a ela. Estou tentando gravar um vídeo demonstrando algumas coisas que fiz, porém, está dificil'
    1 ponto
  17. Muuricha

    Erro Na Vip

    Primeiramente AFF Segundo execute esse comando na sua database ALTER TABLE `accounts` ADD viptime INT(15) NOT NULL DEFAULT 0; Não sabe como executa comando? Abra o sqlitestudio ,extraia sua DB Aperte Alt + E Cole o comando Por fim aperte F9
    1 ponto
  18. LuckOake

    onEquip/login erro

    O brun123 tinha feito um fix uma vez, tá ai: local blockDoubleExecution = {} function onEquip(cid, item, slot) if blockDoubleExecution[cid] then blockDoubleExecution[cid] = nil return true else blockDoubleExecution[cid] = true end local forc = getPlayerStorageValue(cid, 23222) setPlayerStorageValue(cid, 23222, forc + 1) return true end function onDeEquip(cid, item, slot) local forc = getPlayerStorageValue(cid, 23222) setPlayerStorageValue(cid, 23222, forc - 2) return true end
    1 ponto
  19. vai no seu firewall e desblokea,procura no youtube ou na seção de rede e infraestrutura aki do forum.
    1 ponto
  20. Gears

    Stocks para Photoshop

    Eai pessoa , hoje está atualizando meus recursos e sai procurando varias stock's/render/c4d e achei varias coisas legais , mas nesse tópico apenas irei postar um pack de stock's que achei mt legal Preview Download : http://www.4shared.com/rar/CJht7QYA/1_Stock_Pack_-_juniorm.html? e claro os créditos : Junior bye bye
    1 ponto
  21. Gabrieltxu

    Exelia template

    Fala ai galera do Xtibia Hj Venho Postar um template de Tibia para Modern acc feito pelo Meu Amigo u.u Bom Uma Print do Template: Creditos:Thesak Download: http://www.mediafire.com/?3kjei3vil734dcd não tenho mais nada a falar desse template então OK u.u Espero que Gostem u.u Fuiz ! xD
    1 ponto
  22. Como você quer eu não sei, mas eu conheço um programa que faz isso melhor, ele é chamado WinRap, esconde qualquer programa seu, e também esconde ele mesmo, caso você queira ele também desabilita o Gerenciador de tarefas, é muito util, eu uso ele. ps: é muito leve e não precisa de instalação
    1 ponto
  23. beto06

    [Mapping] Mostre suas Idéias

    alavanca secreta créditos: eu e aund
    1 ponto
  24. Anyur v1d4 l0k4, lembro quando era moderador, uahsduhasd. Parabéns cara
    1 ponto
  25. Parece ser um bom servidor Matheus, eu só não jogo porque estou cansado de servidores globais auhahu Se for para jogar um map global, prefiro jogar no servidor oficial. Mas, boa sorte com o servidor =p E estou no aguardo do Denko ^^
    1 ponto
  26. Overpower

    [PACK] Renders Onepiece And IzumaEleven

    Bom,esse Segundo pack de Renders,é de OnePiece e de InazumaEleven,creio que o Inazuma,sejá pouco conhecido,mais são renders bem legais =] Vamos para as Informações do Pack. 36 Renders de Inazuma Eleven. 47 Renders de One Piece. 83 Renders ao Total. Renders de Boa Qualidade para Trabalhos. Conteúdo somente com 27MB. Senha para descompactação do Arquivo é UchihaSasuke Preview. Download. 4Shared; ' UchihaSasuke #2 RenderPack. Créditos : UchihaSasuke
    1 ponto
  27. Slicer

    alguem em ajuda aqui =X

    tb n intendi mas acredtio q eh soh mudar aki ms.. manaLabel:setText(mana .. ' / ' .. maxMana) tpw.. manaLabel:setText('Ola?'..mana .. ' / ' .. maxMana)
    1 ponto
  28. Pode ser o id do usuario,tenta abrir o gerenciador de tarefas e veja quantos usuarios tem,se tiver 2 um desconectado e um ativo voce com o direito em cima do que ta desconectado e poe conectar.se voltar ao normal é o id do usuario (o pc inicia padrao no id 0 mas pelo acesso remoto ele pula pro id 1 ou seja 2 usuarios)
    1 ponto
  29. Valeu parceiro ajudou demais, pena que nao posso dar REP+. Quando eu puder eu te do beleza? Valeu mesmo
    1 ponto
  30. 11366 Id do item que o npc pede 15407 Id da recompensa créditos: Leoxtibia
    1 ponto
  31. gustavo121

    Erro Modern Acc, Rep+

    Amigo eu estarei postando meu status.php para que veja se você consiga arrumar este Erro se não consiguir me avise estarei tentando te ajudar. Você pode estar baixando meu status.php Clicando Aqui Agora se não resolver deve ser problema no otserver.
    1 ponto
  32. O usuário Mozark001 aqui do fórum postou um ModernACC editado por ele mesmo,contém sistemas instalados e tudo mais basta conferir clicando aqui! Tem muitos tutoriais de website aqui no forum então recomendo que você de uma olhada na seção Tutorias de websites nesta seção voce poderia encontrar muitas utilidades para seu website! Indo na seção Pedidos e dúvidas la você tira suas dúvidas e faz pedidos de sistemas e etc. Mais isto tudo que falei acima na categoria de Websites.
    1 ponto
  33. Bom vou responder suas perguntas de maneira organizada! 1ª) É possivel criar e administrar um OTServer de grande porte sozinho? Entendi de duas formas: 1°Se voce quer abrir um server e hostear em casa,pode sim porém voce precisa ter uma internet boa e um pc de qualidade tambem.Se pretende que tenha sucesso é claro. 2°Se voce está se referindo a abrir um server e se tiver grande sucesso se pode administrar sozinho,por mim não há problema.Basta ser responsavel e honesto aos players. 2ª) Em relação ao dedicado?Bom ele serve nada mais nada menos que para hostear seu server 24 horas online. Por onde começar?Bom,você pode comprar um barato para nao gastar dinheiro atoa.E fazer um teste. É Dificil usa-lo?Não,não que seja dificil mas voce precisa saber entrar e saber usar a configuração inicial dele.Existe varios tutoriais no xtibia referente a isso,basta procurar. Se meu servidor encher rapidamente e o dedicado não suportar?Bom se seu servidor tiver muitos players e começar a dar lag,voce pode por um maximo de players,que após isso nao poderão entrar mais. 3ª) Estou lidando no Global Extreme da OTProjects, mais como posso por online um servidor que não roda em minha casa? hahaha Bom,este servidor parece ser bem completo e requer um sistema bom.O aconselhavel seria voce começar com um server básico e um VPS Basico,ja que está iniciando em OTServ. 4ª) É possivel trocar apenas o mapa desse servidor? Já que notei que é muito pesado. É possivel sim porém você tem que pegar um mapa da mesma versão do server. 5ª) AlguÉm tem uma recomendação de por aonde começar? (qual o servidor, site, mapa etc. Desde que seja global) Bom,eu recomendo voce usar ModernACC é muito mais pratico e facil de se usar.Gesior precisa instalar e arruma muita coisa.Servidor procure um 8.54 para começar e adquirir expêriencia. 6ª) Duvida noob haha, o que É distro? Distro:É o executavel do seu server,quando clicar e executar ele irá ligar seu servidor online. Provavelmente você virá com uma dúvida,oque é Source. Source:São documentos onde fica os códigos em C++,que fazem as funções para se jogar um OTServ.Depois de compiladas por um programa chamado Dev-CPP/Dev-C++ ,elas se transformam em um executavel que chamamos de Distro/Executavel. Bom espero ter ajudado...
    1 ponto
  34. AlexandreKG

    Minhas Sign [+Iniciante]

    Minhas Signs Novas que fis com tutoriais iniciantes.
    1 ponto
  35. Overpower

    Sign + Avatar

    Irei fazer em alguns minutos entregarei. #Tai Pelo motivo da imagem que você passou ser ruim, a render ficou ruim Me desculpe errei o tamanho, mais acho que vale né?
    1 ponto
  36. LuckOake

    Terror

    Olá Sim, eu sei que eu não tô ajudando muita aqui na seção esses dias, mas tudo tem um motivo, que já expliquei pro Caotic. Mas pra dar uma descontraída, eu trouxe um sisteminha aqui pra vocês, que originalmente eu achei na OTLand, mas como tava meio pogado, além do que tinha gente reclamando de que não funcionava (comigo mesmo não funcionou) e ainda precisava de biblioteca adicional, fiz um novo com a mesma ideia, mas de uma maneira mais clean e funcional. O que é: Um sistema pra "assustar" os players. O GOD fica de Ghost e usa o comando, então é mandado várias falas ao redor dele. Vocês entenderão melhor na ScreenShot. Script (terror.lua): Tag (talkactions.xml): <talkaction access="5" words="/terror" script="terror.lua"/> Imagens: Utilização: /terror Frase,Quantidade de mensagens,TALKTYPE ID OBS: O TALKTYPE ID é opcional, mas deve ser colocado em números. Créditos: LuckOake -- Pelo Script Colandus -- Pela base
    1 ponto
  37. ThiagoMartinsMR

    Naruto Of War - Now ( 7.81)

    Praticamente todas que existe no anime e são marcantes.
    1 ponto
  38. skelt

    [Arquivado]Projeto

    Boa tarde a todos, estou aqui pelo seguinte motivo, tenho um grande projeto em mente e preciso de um Webdesigner, quero que levem isso a sério, pois se algum Webdesigner fuleiro pedir o cargo e não der conta do recado, será sim removido no mesmo instante. Não estou recrutando outros cargos por enquanto, então não insistam por favor. Posso parecer mesquinho dizendo essas coisas, mas o projeto tem tudo para dar certo, é inovador e precisa ser levado a sério. Caso esteja interessado no cargo de Webdesigner e tem certeza que pode lidar com tal cargo, por favor entre em contato pelo meu perfil daqui do fórum mesmo. Grato, Thainan Librelon.
    -1 pontos
Líderes está configurado para São Paulo/GMT-03:00
×
×
  • Criar Novo...