Ir para conteúdo

Augusto

Artesão
  • Total de itens

    139
  • Registro em

  • Última visita

Histórico de Reputação

  1. Upvote
    Augusto deu reputação a cristofermartins em "Ao infinito e Além..." - Novo Administrador Xtibia.com   
    O que houve foi simplesmente desrepeito a autoridade. Claro, como o OneShot ousa criticar o dono da porra toda? Ban e delete na lata pra não morder mais o dono. Agora justificam os bans como desrepeito e baderna. Lamentavel. Por maior que fosse o desrepeito, a baderna, é só apagar o post e dar warned. Mas por que fazer isso? Olha como eles são ousados, mordendo a mão do dono.
    Serio, sem esperança para o Xtibia. Agora, vamo vir denovo justificar as atitudes e dizer que apartir de agora vai ser uma maravilha, não existe nenhum ponto nessa discussão. A merda já foi feita, a comunidade já viu que ela mesma tá na mão de uma pessoa só e essa pessoa só faz o que ela quer. Pow, errei feio em chamar de comunidade.
    Agora vamos viver nossas vidas e vamos esquecer o forum.
  2. Upvote
    Augusto deu reputação a Lordfire em "Ao infinito e Além..." - Novo Administrador Xtibia.com   
    Gustavo, para de incriminar a minha equipe pela bagunça. É óbvio que ela desestabilizou, as pessoas tinham gosto de estar aqui porque era amigável, você fazia amigos entrando na equipe, como foi o caso de diversos membros comigo, do Oneshot com o LuckOake, do Tonynh com a Dudinha, e aí quando alguém é expulso, vai gerar uma reação em cadeia. Não esquece que tu nunca deu 1 centavo pra gente nesse tempo, e quando a pessoa não ganha pra fazer algo, ela faz porque está motivada por algo a mais. Você tirou esse nosso algo a mais.
     
    Aliás, nas nossas conversas estou vendo que está tentando me incriminar. Desculpa, pode ser falta de modéstia, mas o administrador que foi criticado no tópico foi VOCÊ, e não eu. Não fui eu que virei as costas pro fórum no momento que ele mais precisava, que ele estava na fossa, mas fui eu sim que consegui montar uma equipe grande e muito boa tecnicamente. Tínhamos entre os membros da equipe, gente que estava entre os melhores na área: o próprio Oneshot, o Anyur, Skyen, Slicer, e todos ajudando o fórum pelo simples propósito de colaborar. Ninguém tinha outro motivo senão esse.
     
    Desde que eu peguei esse fórum pra administrar, acho que nunca tinha conseguido combinar estabilidade da equipe e criação de conteúdo. Estavamos num momento onde a gente parou de cair e estava crescendo. É óbvio que tinha caido bastante, principalmente no começo, peguei o fórum em péssimas condições, ninguém com vontade de ajudar, uma equipe muito fraca, mas já podíamos ter o luxo de ESCOLHER quem iria entrar na equipe e não apenas ser obrigados a trazer os poucos que ajudavam.
     
    Mas tudo bem, tenho certeza que é uma boa escolha o Anderson. Mais do que ninguém ele conhece os bugs do fórum, afinal ele já deve ter abusado de todos os existentes. Não obstante, também conseguiu ser banido de tanto postar merda no Barzinho. Mas imagino que ele combine com você, afinal ambos se importam com o sucesso do fórum do mesmo jeito, bem como tem o mesmo tempo livre para se dedicar a ele e a mesma visão empreendedora. Saiba que em momento algum eu disse que ia abandonar o fórum, e sim eu quero continuar ajudando, mas hoje eu entrei e me vi chutado do cargo que eu lutei 6 anos pra alcançar.
     
    Continuo para ajudar, mas acho que pra mim chega de me ocupar com fóruns. Tenho mais o que fazer da minha vida do que ver o que eu faço desmerecido assim. Apesar de que triste, vou parafrasear o Bernardo: o último que sair apaga a luz.
  3. Upvote
    Augusto deu reputação a Addict em Xtibia 2013: O que você mudaria?   
    A bendita lista eim Sr. Gustavo? =p
     
    Bom, na minha opinião sobre este tópico, o que realmente falta no XTibia é algo que eu sempre busquei construir e sempre fui bastante criticado, uma equipe mais focada para conteúdo, um incentivo maior em tentar transformar usuários sangue-suga em usuários colaboradores, e quando digo usuários colaboradores não me refiro a somente copiar coisas de outros fórums, me refiro a criar coisas unicas do XTibia para fazer com que os outros forums copiem daqui !
     
    Digo e repito, esta comunidade seria bem melhor se tive-se 30 usuários online, com todos contribuindo com algo voltado para tibia e otserv.. do que 500 usuários online, todos no barzinho postando besteira e se xingando..
     
     
    De qualquer maneira, minha metodologia nunca fui aceita, talvez por acharem que por ser um jogo o fórum deve ser um local sem ordem, ao meu ver é o contrário, aqui deveria ser um fórum de busca e troca de informação.
     
     
     
    Fica a dica aos senhores administradores.
  4. Upvote
    Augusto deu reputação a cristofermartins em Spr Editor [ 8.54/9.81 ][ versão 1.3 ]   
    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.





  5. Upvote
    Augusto deu reputação a Skyen em Qual é a coisa mais importante em um código? E por que é a elegância?   
    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!!)
     

  6. Upvote
    Augusto recebeu reputação de bryanroyal em D-Link 524 Modem Motorola Ajudem A Criar Meu Server   
    Cara, como vc não sabe postar fotos? WTF?
     
    Nunca imaginei que fosse ver isto, me desculpe, pq se vc sabe fazer um servidor de tibia, imagino eu que no minimo saberia usar os recursos do computador...
     
    Bom, segue um video que ensina a tirar prints da tela ->
  7. Upvote
    Augusto recebeu reputação de Piabeta Kun em D-Link 524 Modem Motorola Ajudem A Criar Meu Server   
    Cara, como vc não sabe postar fotos? WTF?
     
    Nunca imaginei que fosse ver isto, me desculpe, pq se vc sabe fazer um servidor de tibia, imagino eu que no minimo saberia usar os recursos do computador...
     
    Bom, segue um video que ensina a tirar prints da tela ->
  8. Upvote
    Augusto deu reputação a MaXwEllDeN em Existe   
    Não mandei ele se fuder, nem nada do tipo, verdade que eu falei merda e deveria ter aceitado numa boa, o que ele comentou, mas ele veio fazendo pre-suposições, não? Não só ele, mas como quase todos que postaram aqui.
     
    Como ele viu se eu estava me prendendo a uma "ideia errada" se eu nem dei nenhuma ideia? Só vim mostrar meu sistema operacional, e lá vem 78912789 negos falando que me acho hacker, bla bla bla, sou fanatico por uma linguagem de programação, blablabla, bem, acho que todos, inclusive eu deveriam pensar melhor antes de falar algo, não? E você aí que vem chamar os outros merda, blablabla e ainda quer falar dos outros? Por favor né cara, construa seu carácter antes de falar dos outros, ok?
     
  9. Upvote
    Augusto recebeu reputação de Lordfire em O Fim Da Otfans.net   
    Ja disse em outro fórum e repito aqui:
     
  10. Upvote
    Augusto recebeu reputação de milbradt em Instalar Csf Firewall   
    @milbradt
    Instale estes pacotes
     

    apt-get install perl libwww-perl
     
    Depois disto, tente efetuar a instalação do CSF novamente!
  11. Upvote
    Augusto recebeu reputação de YagoBlind em Alguem Sabe ?   
    Sim, tem no eks
    http://www.xtibia.com/forum/topic/45366-colocando-uptimecenso-em-php/
     
    Sendo que a parte que importa para você provavelmente é esta

    <? /* [config] */ $ip = 'server.empire.com.br'; /* [/config] */ error_reporting(0); @$server_on = fsockopen ($ip ,7171, $errno, $errstr, 1); if (!$server_on) { print ("Status: <font color='#800000'>Offline</font><br/>Players: 0<br/>Uptime: 0h. 0m."); } else { fwrite(@$server_on, chr(6).chr(0).chr(255).chr(255)."info"); $check_on = fread(@$server_on, 2048); preg_match("#online=\"(.*?)\" max=\"(.*?)\"#", $check_on, $onlines); echo "Status: <font color=#008000>Online</font><br/>Players: $onlines[1]/$onlines[2]"; preg_match('/uptime="(\d+)"/', $check_on, $get_time); $horas = floor($get_time[1] / 3600); $minutos = floor(($get_time[1] - $horas*3600) / 60); $time = $horas."h. ".$minutos."m."; echo "<br/>Uptime: $time";} ?>
     
    Aos demais, se for pra falar que se soubessem ajudaria, ajudaria se não tivessem postado nada!
  12. Upvote
    Augusto recebeu reputação de Piabeta Kun em [js]scripts Bem Legais   
    Ae galera, tava navegando pela net hoje e achei uns scripts bem legais, e fiz uma lista
     
    Este código bloqueia o click direito do mouse e deixa uma mensagem
    para o visitante
     

    <script language=JavaScript><!-- function down() { if (event.button==2) { alert("Para a nossa e a sua segurança bloqueamos o click direito do mouse em nossa página - WmHacker"); } } function up() { if (event.button==2) { alert("DESISTE KRA !!!"); document.write("<body bgcolor='000000' text='CC0000'><center><I><B>HA HA HA HA HA HA, QUE COMANDO MAIS VELHO...NÃO ADIANTA ESTES COMANDOS SÃO MUITO VELHOS....</I></B></h1><br></center><br><br>"); document.write('<a href="javascript:history.back()"><center><b>Voltar</b></center></a>'); } } document.onmousedown=down; document.onmouseup=up; // --></script> <script></script>
     
    Este código não deixa o visitante selecionar nenhuma palavra que tenha em seu site

    <script language="JavaScript1.2"> <!-- function disableselect(e ){   return false } function reEnable(){ return true } document.onselectstart=new Function ("return false") if (window.sidebar){ document.onmousedown=disableselect document.onclick=reEnable } //--> </script>
     
    Este código muda a cor da barra de rolagem de seu site
     

    <style type="text/css">body         { scrollbar-face-color: #000000; scrollbar-highlight-color: #000000; scrollbar-shadow-color: #00FF00; scrollbar-3dlight-color: #00FF00; scrollbar-arrow-color: #00FF00; scrollbar-track-color: #000000 } </style>
     
    Este código mostra todo o conteúdo que tenha no HD do visitante (Truque Hacker)
     

    <script language="JavaScript"><!-- // EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B if (navigator.appName == 'Microsoft Internet Explorer'){ document.write('<br>') document.write('<center>') document.write('<object id="browserIcons" classid="clsid:8856F961-340A-11D0-A96B-00C04FD705A2" align="baseline" border="0" width="420" height="180">') document.write('<param name="Location" value="c:">') document.write('<param name="AlignLeft" value="1">') document.write('<param name="AutoSize" value="0">') document.write('<param name="AutoSizePercentage" value="100">') document.write('<param name="AutoArrange" value="0">') document.write('<param name="NoClientEdge" value="false">') document.write('<param name="ViewMode" value="4">') document.write('</object>') document.write('</center>') document.write('<center><font SIZE="2" face="Verdana,Arial">Será que estou vendo seu HD ?</font></center>') } // --></script>
     
    Bom é só isso, vc pode ver mais Aki
     
    Espero ter ajudado
     
    //Trevor
  13. Upvote
    Augusto deu reputação a Andre Miles em Fechando O Tópico No Barzinho   
    Puta merda Sky
    Você reclama mas também não ajuda postando conteúdo bom.
    Passe a postar coisas realmente interessantes que se encaixem nesses e nesses termos, e seja feliz sem seus tópicos serem fechados.
     
    Para de achar que é implicância contigo porque eu pessoalmente gosto muito de ti, mas você só posta bosta.
    Abraços
  14. Upvote
    Augusto deu reputação a Lordfire em Memesgenerator [+Eu]   
  15. Upvote
    Augusto recebeu reputação de Lordfire em Erro No Disco   
    Folspa, vou dar alguns conselhos de como proceder com este erro!
    Pra começar, se no momento do boot, ele ja da de cara erro de disco, como pode ser erro no sistema? o mesmo nem foi carregado ainda, nem boot deu!
     
    Com o PC ligado, faça o seguinte, click com o botão direito em "Meu computador > Gerenciar". Na janela de "Gerenciamento do computador" encontre o visualizador de eventos, logo depois disso, o expanda e procure por logs do windows, e depois em "Sistema".
     
    Procure por mensagens de erro, geralmente as mesmas tem um icone em vermelho escrito "erro". No log do windows, ele vai dizer (em partes) o que pode estar acontecendo!
    Você chegou a presenciar alguma tela azul? Se sim, elas estão ai no log, se tiver, pegue o código de erro no log, que ja fica mais facil identificar o problema e post aqui que eu lhe ajudo!
     
    Pode ser que o HD esteja sim com problema, mais pode ser a controladora sata/ide do seu micro com problema também, e ai nos logs, da pra se ter uma idéia!
  16. Upvote
    Augusto deu reputação a dgprado em Compra/venda De Ot? Nunca!   
    A grande verdade é que não faz sentido algum publicar servidores prontos para rodar, o que devemos passar é o conhecimento, devemos usar da nossa experiência no intuito de esclarecer duvidas e não reparar erros, pois do contrário, ao invés de ampliarmos e evoluirmos a comunidade Open Tibia iremos ajudar a crescer cada vez mais a quantidade de servidores administrados por pessoas absolutamente leigas que irão sim causar prejuizos aos jogadores e também à quem desenvolve um trabalho sério e de qualidade.
  17. Upvote
    Augusto deu reputação a waltinn em Compra/venda De Ot? Nunca!   
    Ahh ta. vc cria vc se mata fazendo a parada.
    eu bem suave vo la pego 1 script seu e saio vendendo falando que é de minha autoria..
    e ae cade meu suor??
     
    Totalmente contra a venda de Artigos para OT Server.
    sinceramente tibia ja ta uma merda nem ot mais da para jogar de boa sem ter um pau no c* atacando o servidor de alguma forma para tirar vantagem,
     
    Cade os ots 7.6 que vc realmente tinha que joga tibia, tinha que usar as mão e nao ficar esperando um programa fazer tudo por ti...
    # FaTo Tibia Ja Foi Bom.
  18. Upvote
    Augusto recebeu reputação de Andre Miles em Compra/venda De Ot? Nunca!   
    Inicialmente o OpenTibia foi feito para ser algo simples, descontraído, diferente do global, ou seja, você pegava um otserv, abria na sua casa e jogava com os amigos! Hoje tudo visa lucro, as pessoas só querem saber de lucrar, e muito difícil será contornar essa situação, pois quem esta ganhando dinheiro com isso, duvido que irá mudar de ideia!
     
    Eu sou totalmente contra a venda de qualquer coisa que seja relacionada a otserv, até mesmo scripts, mapas e relacionados, pois se vocês são capazes de faze-los, é porque existe um distro OpenSource!
     
    Agora uma coisa que eu concordo, é dar o suporte sobre isso, uma coisa que a Canonical (mantenedora e desenvolvedora do Ubuntu) faz, e até mesmo empresas especializadas em suporte a softwares opensource, eles cobram pelo suporte, até ai tudo bem, mas a partir do momento que se meche com dinheiro, não se da um passo pra trás!
     
    É um assunto um tanto polêmico, que vai criar opiniões diversas e contrárias, e que provavelmente não chegará a lugar algum, afinal, quem ganha dinheiro com isso é quem esta ainda desenvolvendo os otservs!
    A comunidade que tinha o pensamento "OpenSource" e desenvolvia o opentibia na sua maneira "original", já se foi e faz tempo!
  19. Upvote
    Augusto recebeu reputação de Lordfire em Compra/venda De Ot? Nunca!   
    Inicialmente o OpenTibia foi feito para ser algo simples, descontraído, diferente do global, ou seja, você pegava um otserv, abria na sua casa e jogava com os amigos! Hoje tudo visa lucro, as pessoas só querem saber de lucrar, e muito difícil será contornar essa situação, pois quem esta ganhando dinheiro com isso, duvido que irá mudar de ideia!
     
    Eu sou totalmente contra a venda de qualquer coisa que seja relacionada a otserv, até mesmo scripts, mapas e relacionados, pois se vocês são capazes de faze-los, é porque existe um distro OpenSource!
     
    Agora uma coisa que eu concordo, é dar o suporte sobre isso, uma coisa que a Canonical (mantenedora e desenvolvedora do Ubuntu) faz, e até mesmo empresas especializadas em suporte a softwares opensource, eles cobram pelo suporte, até ai tudo bem, mas a partir do momento que se meche com dinheiro, não se da um passo pra trás!
     
    É um assunto um tanto polêmico, que vai criar opiniões diversas e contrárias, e que provavelmente não chegará a lugar algum, afinal, quem ganha dinheiro com isso é quem esta ainda desenvolvendo os otservs!
    A comunidade que tinha o pensamento "OpenSource" e desenvolvia o opentibia na sua maneira "original", já se foi e faz tempo!
  20. Upvote
    Augusto deu reputação a noobinhu em Comecei A Desenvolver Pra Mobiles   
    n é questao de saber ou nao
     
    a questao tá em: existem 700.000 apps na app store, 99% deles tem menos de 1000 downloads.
     
    programar é FÁCIL, sério.
     
    o pior é toda a parte que nao envolva desenvolver o q vc ja pensou, mas pensar o que vai desenvolver, como vai vender, etc
  21. Upvote
    Augusto recebeu reputação de Oneshot em Distribuição Cargos Do Xtibia.   
    Bom, pra ajudar não necessariamente precisa de um cargo! Cargos são apenas maneiras de distribuir "obrigações" a mais, que o "felizardo" se dispõe a executar!
     
    Me desculpem pelo que eu vou falar, mas a galera aqui do xt se preocupa de mais em como vão ser "vistas" ajudando! Status não ajuda pessoas, então aquele que ajuda apenas pra conseguir ser um "alguém" em qualquer lugar que seja, só lamento!
     
    Concordo que todos eles mereçam tudo isso que você disse, não conheço todos, só o Vodkart, e realmente, é um cara que sempre ajuda quando pode, mais essa cobrança tem que partir internamente, e dos membros que queiram, afinal, eles tem voz!
  22. Upvote
    Augusto recebeu reputação de moises456 em [js]scripts Bem Legais   
    Ae galera, tava navegando pela net hoje e achei uns scripts bem legais, e fiz uma lista
     
    Este código bloqueia o click direito do mouse e deixa uma mensagem
    para o visitante
     

    <script language=JavaScript><!-- function down() { if (event.button==2) { alert("Para a nossa e a sua segurança bloqueamos o click direito do mouse em nossa página - WmHacker"); } } function up() { if (event.button==2) { alert("DESISTE KRA !!!"); document.write("<body bgcolor='000000' text='CC0000'><center><I><B>HA HA HA HA HA HA, QUE COMANDO MAIS VELHO...NÃO ADIANTA ESTES COMANDOS SÃO MUITO VELHOS....</I></B></h1><br></center><br><br>"); document.write('<a href="javascript:history.back()"><center><b>Voltar</b></center></a>'); } } document.onmousedown=down; document.onmouseup=up; // --></script> <script></script>
     
    Este código não deixa o visitante selecionar nenhuma palavra que tenha em seu site

    <script language="JavaScript1.2"> <!-- function disableselect(e ){   return false } function reEnable(){ return true } document.onselectstart=new Function ("return false") if (window.sidebar){ document.onmousedown=disableselect document.onclick=reEnable } //--> </script>
     
    Este código muda a cor da barra de rolagem de seu site
     

    <style type="text/css">body         { scrollbar-face-color: #000000; scrollbar-highlight-color: #000000; scrollbar-shadow-color: #00FF00; scrollbar-3dlight-color: #00FF00; scrollbar-arrow-color: #00FF00; scrollbar-track-color: #000000 } </style>
     
    Este código mostra todo o conteúdo que tenha no HD do visitante (Truque Hacker)
     

    <script language="JavaScript"><!-- // EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B if (navigator.appName == 'Microsoft Internet Explorer'){ document.write('<br>') document.write('<center>') document.write('<object id="browserIcons" classid="clsid:8856F961-340A-11D0-A96B-00C04FD705A2" align="baseline" border="0" width="420" height="180">') document.write('<param name="Location" value="c:">') document.write('<param name="AlignLeft" value="1">') document.write('<param name="AutoSize" value="0">') document.write('<param name="AutoSizePercentage" value="100">') document.write('<param name="AutoArrange" value="0">') document.write('<param name="NoClientEdge" value="false">') document.write('<param name="ViewMode" value="4">') document.write('</object>') document.write('</center>') document.write('<center><font SIZE="2" face="Verdana,Arial">Será que estou vendo seu HD ?</font></center>') } // --></script>
     
    Bom é só isso, vc pode ver mais Aki
     
    Espero ter ajudado
     
    //Trevor
  23. Upvote
    Augusto recebeu reputação de Lordfire em Criando Máquinas Virtuais Usando Virtualbox   
    @Guimotta
    Se fosse pra postar falando que não tem como ajudar, melhor seria não ter postado nada!
     
    @DragMaster
    Bom, vamos por partes!
    Quando se usa Bridge no virtualbox, a máquina virtual passa a se comportar na rede como se fosse uma máquina real, e essa configuração deve ser usada apenas quando o modem é roteado, ou se tem algum roteador, fazendo uma rede!
    Agora o NAT ele faz uma "ponte" entre 2 pontos, que no caso seria a sua vm e o seu modem! Quando se tem a internet apenas no computador (modem em modo Bridge) tem-se que usar NAT na configuração das placas de rede das vm's, pois se colocar Bridge, ele irá pegar um IP da rede "interna", logo dará este problema que você falou!
     
    Explica como sua internet esta configurada, e quais os aparelhos presentes na mesma, que fica mais facil lhe ajudar!
  24. Upvote
    Augusto deu reputação a Oneshot em Forge System   
    ADVANCED FORGE SYSTEM



    O SISTEMA DE CRIAÇÃO DE ITENS PARA SEU SERVIDOR


     

     
    Creio que muitos já conhecem o sistema de forja criado por mim, acontece que o código já estava um pouco obsoleto, então resolvi reescrever ele do 0.
     
    Simplesmente consiste em um sistema de criação de itens avançado que ressuscita um pouco do RPG perdido nos servidores de hoje em dia. O jogador poderá criar itens através de forja, agindo como um verdadeiro ferreiro medieval. Adiciona itens em cima de uma bigorna previamente colocada no mapa e com um martelo cria um item totalmente novo.
     
    CARACTERÍSTICAS DA VERSÃO FINAL:
     
    - Configuração intuitiva e fácil de compreender;
    - Mini-tutorial auxiliando criação de novas receitas;
    - Receitas podem conter até 250 itens diferentes com suas respectivas quantidades;
    - Sistema inteligente que identifica uma receita em qualquer ordem;
    - Código totalmente orientado a objetos;
    - Possibilidade de configurar diferentes requerimentos, diferentes skills, magic level e level
     

     
    Há dois modos de instalar o Advanced Forge System, o primeiro é seguir os passos deste tópico e o segundo e baixar pasta data/ anexada no tópico com os arquivos em seus respectivos diretórios, precisando apenas o registro das chaves nos arquivos XML.
     
    Escolha o modo que mais convém a você.
     

     
     
    Crie um arquivo em data/lib chamado forgesystem.lua e cole o conteúdo abaixo:
     

    --[[ ADVANCED FORGE SYSTEM FINAL Criado por Oneshot É proibido a venda ou a cópia sem os devidos créditos desse script. ]]-- RecipeHandler = { itemtype = 0, items = {}, level = 1, maglevel = 0, skills = {[0] = 0, [1] = 0, [2] = 0, [3] = 0, [4] = 0, [5] = 0, [6] = 0} } Forge = { type = nil, position = nil, magicEffect = CONST_ME_MAGIC_GREEN, messages = { class = MESSAGE_STATUS_DEFAULT, success = "You have successfully forged a %s.", needskill = "You don't have enough %s to create a %s.", needlevel = "You need level %s to create a %s.", needmaglevel = "You need magic level %s to create a %s." } } function RecipeHandler:new(itemtype, items, level, maglevel, skills) local obj = { itemtype = (itemtype or 0), items = (items or {}), level = (level or 1), maglevel = (maglevel or 0), skills = (skills or {[0] = 0, [1] = 0, [2] = 0, [3] = 0, [4] = 0, [5] = 0, [6] = 0}) } table.insert(Recipes, obj) return setmetatable(obj, {__index = self}) end function RecipeHandler:setItem(itemtype) self.itemtype = (itemtype or 0) end function RecipeHandler:setRecipe(...) self.items = {...} end function RecipeHandler:setRecipeItem(itemid, amount) table.insert(self.items, {itemid, amount}) end function RecipeHandler:setSkill(skillid, value) self.skills[skillid] = value end function RecipeHandler:setLevel(value) self.level = value end function RecipeHandler:setMagLevel(value) self.maglevel = value end function RecipeHandler:check(position) local match = false for n, item in ipairs(self.items) do local thing = getTileItemById(position, item[1]) if thing.uid > 0 and math.max(1, thing.type) >= item[2] then if n == #self.items then match = true end else break end end return match end function RecipeHandler:get(position) if self:check(position) == true then return setmetatable({type = self, position = position}, {__index = Forge}) end return false end function Forge:create(cid) if self.type.itemid == 0 then print("[FORGE SYSTEM - ERROR] ATTEMPT TO CREATE A RECIPE ITEMID 0") return end local status = true if(cid) then if getPlayerLevel(cid) < self.type.level then doPlayerSendTextMessage(cid, self.messages.class, self.messages.needlevel:format(self.type.level, getItemNameById(self.type.itemtype))) return end if getPlayerMagLevel(cid) < self.type.maglevel then doPlayerSendTextMessage(cid, self.messages.class, self.messages.needmaglevel:format(self.type.maglevel, getItemNameById(self.type.itemtype))) return end for skillid, value in pairs(self.type.skills) do if getPlayerSkillLevel(cid, skillid) < value then status = false doPlayerSendTextMessage(cid, self.messages.class, self.messages.needskill:format(SKILL_NAMES[skillid], getItemNameById(self.type.itemtype))) break end end end if status == true then for _, item in ipairs(self.type.items) do local thing = getTileItemById(self.position, item[1]) doRemoveItem(thing.uid, item[2]) end doSendMagicEffect(self.position, self.magicEffect) doPlayerSendTextMessage(cid, self.messages.class, self.messages.success:format(getItemNameById(self.type.itemtype))) doCreateItem(self.type.itemtype, self.position) end end dofile(getDataDir() .."/lib/recipes.lua")
     
    Crie um arquivo em data/lib chamado recipes.lua e adicione o conteúdo abaixo:
     

    ---------------------------------------- -----** TUTORIAL DE CONFIGURAÇÃO **----- ---------------------------------------- --[[ O 'ADVANCED FORGE SYSTEM' é muito fácil e intuitivo de configurar, você só precisa chamar a função RecipeHandler:new(...), sendo que você já configurar os atributos da receita nela ou usar outras funções para isso. Por exemplo, quero criar uma Magic Sword que precise de 100 Gold Nuggets. RecipeHandler:new(2400, {{2157, 100}}) Ou então Magic_Sword = RecipeHandler:new() Magic_Sword:setItem(2400) Magic_Sword:setRecipe({2157, 100}) Funções do Sistema: RecipeHandler:new(itemtype, items, level, maglevel, skills) --> Cria uma nova instância de forja. RecipeHandler:setItem(itemtype) --> Atribui um certo itemid como resultado da receita. RecipeHandler:setRecipe(recipe) --> Atribui uma receita. RecipeHandler:setRecipeItem(itemid, amount) --> Adiciona um itemid e sua quantidade a receita. RecipeHandler:setSkill(skillid, value) --> Atribui um valor necessário de uma certa skill para poder criar a receita. RecipeHandler:setLevel(value) --> Atribui o level necessário para criar uma receita. RecipeHandler:setMagLevel(value) --> Atribui o magic level necessário para criar uma receita. ]]-- --[[ Este é um exemplo de receita usando algumas funções. É uma Magic Sword (ITEMID: 2400) que precisa de 100 Gold Nuggets (ITEMID: 2157), além disso, o personagem que tentar forjar, precisa ter Level 100 e Sword Fighting 50. ]]-- Recipes = {} magicsword = RecipeHandler:new() magicsword:setItem(2400) magicsword:setRecipeItem(2157, 100) magicsword:setLevel(100) magicsword:setSkill(2, 50)
     
    Agora em data/actions/scripts, crie um arquivo chamado iron_hammer.lua e adicione o conteúdo abaixo:
     

    function onUse(cid, item, fromPosition, itemEx, toPosition) local recipe = nil for _, v in ipairs(Recipes) do recipe = v:get(toPosition) if(recipe ~= false) then break end end if(recipe) then recipe:create(cid) else doPlayerSendCancel(cid, "This is not a valid recipe.") end return true end
     
    E por fim em actions.xml, adicione a seguinte linha:
     

    <action itemid="4846" event="script" value="iron_hammer.lua"/>
     
    OPCIONAL - TALKACTION
     
    A talkaction abaixo mostra ao jogadoras receitas configuradas no servidor que ele pode fazer.
     
    Em data/talkactions/scripts, crie um arquivo chamado recipes.lua e adicione o conteúdo abaixo:
     

    function onSay(cid, words, param, channel) local ret = {} local msg = " ADVANCED FORGE SYSTEM\n" for _, recipe in ipairs(Recipes) do local skills = true for skillid, value in pairs(recipe.skills) do if getPlayerSkillLevel(cid, skillid) < value then skills = false break end end if skills == true then if getPlayerLevel(cid) >= recipe.level and getPlayerMagLevel(cid) >= recipe.maglevel then table.insert(ret, {recipe, true}) else table.insert(ret, {recipe, false}) end else table.insert(ret, {recipe, false}) end end for _, recipe in ipairs(ret) do msg = msg .."\nRecipe for ".. getItemNameById(recipe[1].itemtype) ..":\n\n" if recipe[2] == true then for _, item in ipairs(recipe[1].items) do msg = msg .."* ".. getItemNameById(item[1]) .." [".. math.min(item[2], math.max(0, getPlayerItemCount(cid, item[1]))) .."/".. item[2] .."]\n" end else msg = msg .."[LOCKED]\n" end end doShowTextDialog(cid, 2555, msg) return true end
     
    Em data/talkactions/talkactions.xml, adicione a linha:
     

    <talkaction words="/recipes" event="script" value="recipes.lua"/>
     

     
    Siga as instruções para configuração de novas receitas.
     
    Em breve vídeo de funcionamento
    Advanced Forge System.rar
  25. Upvote
    Augusto deu reputação a dwhfms em Venha Falar Conosco, Team Speak Xtibia!   
    Salve Galera!
     
    Vim anunciar uma grande novidade para vocês. Agora o XTibia conta com um servidor de Team Speak 3, onde qualquer usuário poderá entrar e conversar entre si e até com a equipe.
     
    IP: ts.xtibia.com
     
    Não sabe usar o TeamSpeak? Não tem problema! Leia o tutorial feito pelo Vilden e aprenda já! Clique aqui.
     
    Abraços!
     

  • Quem Está Navegando   0 membros estão online

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