Ir para conteúdo

Gpedro

Campones
  • Total de itens

    37
  • Registro em

  • Última visita

Histórico de Reputação

  1. Upvote
    Gpedro recebeu reputação de samlecter em Plágio é CRIME! Proteja seu Site!   
    conforme foi dito, este post é uma solução bem leiga de """proteger""" seu site.
     
    Ao invés de colocar um index.html que não vai adiantar de nada, devem seguir o que o Alayen disse sobre directory listing.
     
     
    Eu já até fiz um puta tópico sobre 10 Dicas de Segurança, mas acho que acabaram deletando na ultima "desativada" do XT. Mais está disponível na internet. Só procurar por "gpedro 10 dicas segurança" no Google.
     
    E complementando, para quem usa ModernAAC, sempre é bom evitar que o os arquivos .tpl,.ini e .log fiquem publicos. Para evitar vocês podem tirar a permissão de leitura-publico ou adicionar nas configurações do webserver ou .htaccess para dar deny nesses arquivos.
  2. Upvote
    Gpedro deu reputação a Mudrock em [GESIOR] Report BUG Real Position   
    Fala pessoal, estava negando na gringa e achei um sistema bem legal e decidi trazer totalmente em português para vocês

    espero que curtam


    Descriação


    O Player reporta o lugar usando o comando !report e você administrador

    pode adicionar points a ele pela ajuda ao servidor





    Imagen

























    Adicionando em seu servidor/Site









    Abra seu Data/Talkactions na pasta do seu servidor, e abra Talkactions.xml e adicione essa linha


    <talkaction words="!report" separator=" " script="adminreport.lua"/>

    Agora abra data/ Talkactions / Scripts em seu servidor e criar um novo arquivo chamado adminreport.lua e adicione este código dentro :


    function onSay(cid, words, param, channel)
    local storage = 6708 -- (You can change the storage if its already in use)
    local delaytime = 30 -- (Exhaust In Seconds.)
    local x = getPlayerPosition(cid).x -- (Do not edit this.)
    local y = getPlayerPosition(cid).y -- (Do not edit this.)
    local z = getPlayerPosition(cid).z -- (Do not edit this.)
    if(param == '') then
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Command param required.")
    return true
    end
    if (getPlayerStorageValue(cid, storage) <= os.time()) then
    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your report has been received successfully!")
    db.query("INSERT INTO `player_reports` (`id` ,`name` ,`posx` ,`posy` ,`posz` ,`report_description` ,`date`)VALUES (NULL , '" .. getPlayerName(cid) .. "', '" .. x .. "', '" .. y .. "', '" .. z .. "', '" .. param .. "', '" .. os.date() .. "')")
    setPlayerStorageValue(cid,storage,os.time()+delaytime)
    else
    doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have to wait 30 seconds to report again.")
    end
    return TRUE
    end

    Servidor Configurado!





    Adicionando em seu WebSite







    Agora vá para o site e va em htdocs/pages crie um novo arquivo chamado adminreport.php e coloque isso dentro


    <?PHP
    if($group_id_of_acc_logged >= $config['site']['access_admin_panel']) {
    $main_content .= '<center><h2><font color=red>Reports List</font></h2></center><br /><br />
    <center><table border="0" cellspacing="1" cellpadding="4" width="100%">
    <tr bgcolor="'.$config['site']['vdarkborder'].'">
    <td width="5%"><b><font color=white><center>#</font></center></b></td>
    <td width="10%"><b><font color=white><center>Name</center></b></font></td>
    <td width="20%"><b><font color=white><center>Position</center></b></font></td>
    <td width="40%"><b><font color=white><center>Description</center></b></font></td>
    <td width="20%"><b><font color=white><center>Date</center></b></font></td>
    </tr>';
    $i = 0;
    foreach($SQL->query('SELECT id, name, posx, posy, posz, report_description, date FROM player_reports GROUP BY name ORDER BY id DESC limit 20;') as $report)
    {
    $i++;
    $main_content .= '<tr bgcolor="' . (is_int($i / 2) ? $config['site']['lightborder'] : $config['site']['darkborder']). '">
    <td>
    <center>'.$i.'</center>
    </td>
    <td>
    <center><a href=?subtopic=characters&name='.$report['name'].'>'.$report['name'].'</a></center>
    </td>
    <td>
    <center>'.$report['posx'].', '.$report['posy'].', '.$report['posz'].'</center>
    </td>
    <td>
    <center>'.$report['report_description'].'</center>
    </td>
    <td>
    <center>'.$report['date'].'</center>
    </td>
    </tr>';
    }
    $main_content .='
    </table>
    <a href="?subtopic=adminreport&action=reward">Reward Players for reporting.</a>';
    if($action == "reward") {
    $player = stripslashes(ucwords(strtolower(trim($_REQUEST['character']))));
    $points = $_POST['points'];
    if(empty($player)) {
    $main_content .= '<form action="" method="post"><B>Enter Character Name:</B><input type="textbox" name="character"><br>
    <B>Enter Points Amount:</B><input type="textbox" name="points"><br><br><input type="submit" value="Submit">
    </form></center><form action="?subtopic=adminreport" method="post" ><input name="submit" type="submit" value="Close" title="Close"/></form>';
    } else {
    $player_data = $SQL->query("SELECT * FROM `players` WHERE `name` = '".$player."';")->fetch();
    $SQL->query("UPDATE `accounts` SET `premium_points` = `premium_points` + '".$points."' WHERE `id` = '".$player_data['account_id']."'");
    $main_content .= '<b><center>'.$points.' Premium Points added to the account of <i>'.$player.'</i> !</b></center><br>
    <form action="?subtopic=adminreport" method="post" ><input name="submit" type="submit" value="Close" title="Close"/></form>';
    }
    }
    } else {
    $main_content .= 'Sorry, you have not the rights to access this page.';
    }
    ?>

    então aberta index.php e adicione estas linhas






    case "adminreport";
    $topic = "adminreport";
    $subtopic = "adminreport";
    include("adminreport.php");
    break;

    Vá em htdocs/layouts/Seulayout/






    <a href='?subtopic=adminreport'>
    <div id='submenu_adminreport' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)' onMouseOut='MouseOutSubmenuItem(this)'>
    <div class='LeftChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div>
    <div id='ActiveSubmenuItemIcon_adminreport' class='ActiveSubmenuItemIcon' style='background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);'></div>
    <div class='SubmenuitemLabel'>Player Reports</div>
    <div class='RightChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div>
    </div>
    </a>

    Adicione esse comando em sua database






    CREATE TABLE IF NOT EXISTS `player_reports` (

    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` text NOT NULL,
    `posx` int(6) NOT NULL,
    `posy` int(6) NOT NULL,
    `posz` int(6) NOT NULL,
    `report_description` text NOT NULL,
    `date` text NOT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;


    Créditos : Mudrock
    DarkZ Shaoz
  3. Upvote
    Gpedro deu reputação a Alayen em Plágio é CRIME! Proteja seu Site!   
    Errado, tudo muito errado! Esse é certamente o pior jeito possível de se fazer uma página de erros, por n motivos:
    Não retorna um código de erro, ou seja, pra todos os efeitos é como se tivesse chegado na página desejada! Em nenhum momento está sendo explicitamente dito para não listar mais os arquivos, ou seja, NÃO faz o que diz
    Você precisa copiar e colar esse arquivo várias vezes, pra todos os diretórios que devem ser protegidos
    E tem mais, mas não precisa. O jeito CERTO de se fazer isso é DESABILITAR o directory listing/autoindex e, se quiser uma página custom, configurar o seu servidor web pra enviar uma página 404 diferente.
     
    1. Desabilitar directory listing/autoindex
    No Apache, basta incluir a seguinte linha no seu .htaccess na raiz do site ou então na configuração do virtual host:
    Options -Indexes Se já tiver uma linha de Options, basta colocar a flag -Indexes no final (e remover caso ela esteja lá sem o -)
     
    No Nginx, basta incluir a seguinte linha na configuração do site, preferencialmente no bloco mais externo possível (geralmente o bloco server, que abrange o site todo):
    autoindex off; 2. Alterar a página de 404
    No Apache, colocar a seguinte linha no .htaccess ou vhost:
    ErrorDocument 403 /403.html Mude o 404.html pra onde tiver seu HTML de erro.
     
    No Nginx:
    error_page 403 = /403.html; Em ambos os casos, / é a raiz do site, e não do sistema de arquivos.
     
    Do jeito CERTO, seu servidor vai responder de um jeito que o browser sabe que aquela página não existe, ainda vai ter a página personalizada, mas permite você controlar muito melhor o erro (você pode, por exemplo, fazer logs dos 403 e ver se alguém tá tentando invadir algo) e desabilita de verdade a listagem.
  4. Upvote
    Gpedro deu reputação a HadesBR em Yurots 1.2 (sem edição)   
    Yurots 1.2


    Não tem muito o que falar do server, mapa simples, Yurots versão 8.10 atualizado para versão 8.60 sem editar, A distro é TFS 0.4 mas coloquei o download só da pasta data caso queira usar outra,
    quem ja jogou conhece, quem não viu, vale a pena conferir. Ótimo para editar pois é bem leve, apesar de alguns bugs no mapa que são simples.






    Download completo



    Download (somente a pasta Data)





    Creditos:

    •TFS Team
    •God Bon
  5. Upvote
    Gpedro deu reputação a Nightz em [Linux] Bloqueando paises no CSF   
    Olá XTibianos!
     
    Esse tutorial ensina de maneira extremamente simples como bloquear completamente alguns países específicos no seu CSF.

    Vamos lá?

    1. Utilize o nano ou qualquer outro editor de texto para editar o arquivo de configuração do CSF:
    nano /etc/csf/csf.conf 2. Vá até a linha 721 (aproximadamente) e procure por CC_DENY:
    CC_DENY = "" 3. Acesse o site IPdeny para pegar o código do país que você deseja bloquear:

    + Clique aqui para acessar o site.

    -> Exemplo: Caso você queira bloquear a França:

    + Procure na página com o CTRL + F o nome do país em inglês.
    FRANCE (FR) [download zone file] Size: 21.09 KB Copie o código do país entre ( ), neste caso: FR.

    4. Cole o código do país na varíavel CC_DENY:

    + Para mais de um país, utilize a virgula.
    CC_DENY = "FR,CN" + No exemplo acima, estaríamos bloqueando a França e a China.

    5. Reinicie seu CSF.
    service csf restart Pronto! Você já está bloqueando completamente o acesso dos países configurados! Façam bom proveito
    (Esse tutorial foi completamente escrito por mim. Qualquer cópia deve ser previamente autorizada e conter os devidos créditos.)
  6. Upvote
    Gpedro recebeu reputação de duasrodas em Instalando Ambiente Gráfico VPS Linux   
    TL;DR
    apenas não use VNC. Questões de Segurança.
    não use interface gráfica, você estará consumindo mais memória RAM desnecessariamente.
  7. Upvote
    Gpedro deu reputação a OtservME em [Linux] Auto-Backup Database   
    Excelente tutorial Bruno, obrigado =)
     
    Uma dica que dou pra quem vai implementar esse script, é usar FTP externo pra envio
    sem necessidade de alterar esse script, como?
     
    1- Monte o diretório /backup via NFS pro FTP (Google tem script pronto fácil de encontrar pra isso)
    2- Mude o diretório no script acima para salvar em /backup
     
    Por que usar FTP externo? Já parou pra pensar que se o HD queimar e o RAID (se usar)
    falhar você perderia tudo mesmo tempo backup? Um backup externo é um plano B
    pra situações de catástrofe total. Lá na empresa, todos os servidores possuem 3x
    tipos de backup. Plano A, B, C
  8. Upvote
    Gpedro recebeu reputação de Alayen em ABRINDO OT SERV EM MAC!   
    apesar deste topico possuir mais de 30 dias, nao poderia deixar de comentar sobre isso.
     
     
    Linux veio do *nix, e o OSX tambem, tudo farinha do mesmo saco. o Linux e OSX sao bem parecidos. Praticamente tudo que roda em Linux tambem funcionar em OSX. No Linux (Debian based) voce utiliza apt-get, no OSX, vc pode utilizar o brew, por lá voce pode baixar todas as dependencias necessarias para compilar e rodar seu servidor. Se as pessoas fossem capazes de ler a documentação, conseguiriam resolver facilmente seus problemas: https://github.com/otland/forgottenserver/wiki/Compiling-on-Mac-OS-X
  9. Upvote
    Gpedro recebeu reputação de MaXwEllDeN em Instalando Ambiente Gráfico VPS Linux   
    TL;DR
    apenas não use VNC. Questões de Segurança.
    não use interface gráfica, você estará consumindo mais memória RAM desnecessariamente.
  10. Upvote
    Gpedro recebeu reputação de VictorWEBMaster em Necessidade MD5 SHA1 & PlainText   
    Peço desculpas por reviver o tópico, mas não consigo ver coisas mal feitas e ficar quieto.
     
    Está forma que você propôs a correção é um tanto inviável, até porque e se eu quisesse utilizar plain e passado algum tempo eu quisesse utilizar sha1? Aconteceria que iria surgir outros tópicos de ajuda sobre, a onde a correção seria adiciona isso que você deletou.
     
    A correção correta seria:
     
    config-and-functions.php
    $sqlitefile = $config['server']['sqliteDatabase']; $passwordency = ''; if(strtolower($config['server']['encryptionType']) == 'md5') $passwordency = 'md5'; if(strtolower($config['server']['encryptionType']) == 'sha1') $passwordency = 'sha1'; if(strtolower($config['server']['encryptionType']) == 'plain') $passwordency = 'plaintext'; function password_ency($password) { $ency = $GLOBALS['passwordency']; if($ency == 'sha1') return sha1($password); elseif($ency == 'md5') return md5($password); elseif($ency == 'plain') return $password; elseif($ency == '') return $password; } O problema é que o valor atribuído a variável responsavel por dizer o tipo de criptografia no config.lua não condiz com nenhuma das regras da função password_ency.
     
    Solução 01
    $passwordency = 'plain'; Solução 02
    $passwordency = ''; Solução 03
    elseif($ency == 'plaintext') Solução 04
    else ----
    Kind Regards,
    Gabriel Pedro.
  11. Upvote
    Gpedro recebeu reputação de Alexclusive em Necessidade MD5 SHA1 & PlainText   
    Peço desculpas por reviver o tópico, mas não consigo ver coisas mal feitas e ficar quieto.
     
    Está forma que você propôs a correção é um tanto inviável, até porque e se eu quisesse utilizar plain e passado algum tempo eu quisesse utilizar sha1? Aconteceria que iria surgir outros tópicos de ajuda sobre, a onde a correção seria adiciona isso que você deletou.
     
    A correção correta seria:
     
    config-and-functions.php
    $sqlitefile = $config['server']['sqliteDatabase']; $passwordency = ''; if(strtolower($config['server']['encryptionType']) == 'md5') $passwordency = 'md5'; if(strtolower($config['server']['encryptionType']) == 'sha1') $passwordency = 'sha1'; if(strtolower($config['server']['encryptionType']) == 'plain') $passwordency = 'plaintext'; function password_ency($password) { $ency = $GLOBALS['passwordency']; if($ency == 'sha1') return sha1($password); elseif($ency == 'md5') return md5($password); elseif($ency == 'plain') return $password; elseif($ency == '') return $password; } O problema é que o valor atribuído a variável responsavel por dizer o tipo de criptografia no config.lua não condiz com nenhuma das regras da função password_ency.
     
    Solução 01
    $passwordency = 'plain'; Solução 02
    $passwordency = ''; Solução 03
    elseif($ency == 'plaintext') Solução 04
    else ----
    Kind Regards,
    Gabriel Pedro.
  12. Upvote
    Gpedro recebeu reputação de Alexclusive em [Medalhas] RECEBA A SUA AQUI!   
    eu presto serviços e colaboro com a ekz. Por herança é valido?
  13. Upvote
    Gpedro recebeu reputação de Cell18 em Site Com Todas Versões Oficiais Do Gesior Acc Maker   
    atualização:
    o Gesior está recriando o AAC Maker e está no repositório da github
    https://github.com/gesior/Gesior2012
     
    Para acessar os arquivos, selecione a aba Branches
  14. Upvote
    Gpedro 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.
  15. Upvote
    Gpedro deu reputação a Piabeta Kun em Xtibia 2013: O que você mudaria?   
    O Xtibia está em uma boa fase, tirando alguns problemas que eu acho superfulospara o forum,porm eu tentaria inspirar o desenvolvimento de novos servidores, pois conteudos bons e atuais no xtibia estão escação relacionado a servidores.ecomo eu faria isso, cobrando dos coordenadores a produzir mais conteudo junto aos seus subordinados(principalmente os colaboradores) e fazer sistemas de "dual",como foi sugerido pelo iunix, de fazer junções entre seções como scripting e mapping,scripting e websites,designer e websites, programação e sprites, assim atrazendo novos conteudos para adicionar em novos servidores e afins!
     
    Logo depois eu faria uma limpeza geral no forum junto aos coordenadores emoderadores, para tirar de uma vez por todas os links quebrados e tutoriais ultrapassados e sem uso, assim facilitando a busca de todos,eu expandiria a area de derivadospara ser obsoleta assim como otserv é de designer e outros, tornando ainda mais facil a busca para otserv e derivados, pois uma das coisas mais chatas pra mim é ir em scripiting por exemplo procurar codigos e tutoriais de otserv e me deparar com milhares de coisas pra derivados, e assim també valorizando ainda mais a area de derivados que so tem a crescer!
     
    e faria valer as regras do forum, mesmo para membros mais novos,emanter sempre na mente dos novos usuarios que tem que postar em local certo e estar ciente das regras de cada area e suas punições!
     
    Esse é o resumodo que eu faria inicialmente!
    Obrigado pela atenção!
  16. Upvote
    Gpedro 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!!)
     

  17. Upvote
    Gpedro recebeu reputação de Piabeta Kun em Site Com Todas Versões Oficiais Do Gesior Acc Maker   
    atualização:
    o Gesior está recriando o AAC Maker e está no repositório da github
    https://github.com/gesior/Gesior2012
     
    Para acessar os arquivos, selecione a aba Branches
  18. Upvote
    Gpedro deu reputação a VictorWEBMaster em [GESIOR] VictorWEBMaster 2019v   
    REMOVIDO
  19. Upvote
    Gpedro recebeu reputação de VictorWEBMaster em [Gesior Aac] Bug Reports   
    Bug Records

    OU SIMPLESMENTE BUGPROGRESS

     

    Este sistema foi criado para auxiliar os criadores de servidores a gerenciar os problemas e bugs encontrados no servidor ou site. O objetivo desta página, é que você tenha uma gestão interna de progressos dos bugs, se já foi corrigido, esta sendo corrigido ou ainda não foi corrigido. A página é somente interna, somente para os administradores do site, porque se fosse aberto ao público e houvesse um bug grave de NPC, clone items, eles iriam visualizar a proveitar.

     

     



     
     
    VAMOS lá!
     
    Instalação em 5 passos
    Download
    bugreport by gpedro.zip


    Execute Z_BUG_LOGS.SQL em seu banco de dados
    Extraia BUGRECORDS.PHP E A PASTA IMAGES para a pasta www
    Abra o INDEX.PHP, procure por CHARACTERS.PHP e logo abaixo adicione:
     
    case "bugrecords"; $topic = "Bug Records"; $subtopic = "bugrecords"; include("bugrecords.php"); break;
     
    exemplo:

    case "characters"; $topic = "Characters"; $subtopic = "characters"; include("characters.php"); break; case "bugrecords"; $topic = "Bug Records"; $subtopic = "bugrecords"; include("bugrecords.php"); break;

    Se divirtam e aproveitem~

    OBSERVAÇÕES: ESTE SISTEMA DEVE SER DISTRIBUÍDO GRATUITAMENTE. CASO FOR POSTAR EM OUTROS FORUMS, PEDIR AUTORIZAÇÃO DE DISTRIBUIÇÃO PARA MIM.
  20. Upvote
    Gpedro deu reputação a jhon992 em Compra/venda De Ot? Nunca!   
    Vender coisas ripadas acho muito errado! Mais agora cobrar pelos serviços que se passa para fazer scripts bem elaborados acho que não é errado. Já que no mundo open tibia é assim, os administradores de servidores criam um determinado server, vai nos fóruns pega tudo de graça, e fica lucrando, as vezes lucrando muito e isso tudo é em cima daqueles que passaram trabalho fazendo algo... Oque acontece comprando algo relacionado a servidor? Você está investindo no seu próprio server com sistemas novos e diferentes fazendo assim o crescimento dos jogadores e consequentemente um maior numero de doadores deixando assim contente os administradores, jogadores e desenvolvedores. Esse é meu ponto de vista.
  21. Upvote
    Gpedro recebeu reputação de caotic em [Gesior Aac] Bug Reports   
    Bug Records

    OU SIMPLESMENTE BUGPROGRESS

     

    Este sistema foi criado para auxiliar os criadores de servidores a gerenciar os problemas e bugs encontrados no servidor ou site. O objetivo desta página, é que você tenha uma gestão interna de progressos dos bugs, se já foi corrigido, esta sendo corrigido ou ainda não foi corrigido. A página é somente interna, somente para os administradores do site, porque se fosse aberto ao público e houvesse um bug grave de NPC, clone items, eles iriam visualizar a proveitar.

     

     



     
     
    VAMOS lá!
     
    Instalação em 5 passos
    Download
    bugreport by gpedro.zip


    Execute Z_BUG_LOGS.SQL em seu banco de dados
    Extraia BUGRECORDS.PHP E A PASTA IMAGES para a pasta www
    Abra o INDEX.PHP, procure por CHARACTERS.PHP e logo abaixo adicione:
     
    case "bugrecords"; $topic = "Bug Records"; $subtopic = "bugrecords"; include("bugrecords.php"); break;
     
    exemplo:

    case "characters"; $topic = "Characters"; $subtopic = "characters"; include("characters.php"); break; case "bugrecords"; $topic = "Bug Records"; $subtopic = "bugrecords"; include("bugrecords.php"); break;

    Se divirtam e aproveitem~

    OBSERVAÇÕES: ESTE SISTEMA DEVE SER DISTRIBUÍDO GRATUITAMENTE. CASO FOR POSTAR EM OUTROS FORUMS, PEDIR AUTORIZAÇÃO DE DISTRIBUIÇÃO PARA MIM.
  • Quem Está Navegando   0 membros estão online

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