Ir para conteúdo
Propaganda

gutinha

Administrador
  • Total de Posts

    87
  • Registro em

  • Última visita

  • Dias Ganhos

    18

Tudo que gutinha postou

  1. Qual o sentido de fazer na source? Toda vez que for adicionar um efeito em uma outfit vai ter q compilar o servidor inteiro só pra isso?
  2. Salve rapaziada, vou trazer um evento bag por talkactions. O script é ativado por globalevents, então você pode definir horários para o evento ser ativado. O script está bem "cru", da pra deixar ele mais legível e melhor, mas pro básico já serve. Instalação Feito isso, está instalado.
  3. Salve rapaziada, trazendo um mod pra vcs agr. O mod funciona da seguinte forma, toda vez que um jogador for trocar itens pelo trade vão ficar salvo os IDS dos itens que foram trocados e os nomes dos players. É mais pra você ter uma "segurança" por assim dizer, dos trades dos jogadores. Instalação Feito isso o sistema está instalado. Créditos: Vodkart
      • 13
      • Like
      • Thanks
  4. Salve rapaziada, o sistema funciona da seguinte forma. Ao derrotar um pokémon selvagem, existe uma chance do seu corpo emitir uma aura, basta você passar por cima dele para receber novamente a mesma experiência dada pelo pokémon. Em creaturescript, procure por pokeexp.lua Agora em movements/movements.xml Feito isso está instalado, só reiniciar o servidor e testar. Créditos: Sukito/Gristony
  5. Salve rapaziada, tá ai um tutorial básico sobre sql e as funções LUA que são usadas em OTServers. Definição Primeiramente, deve ser útil uma definição de banco de dados: são, fundamentalmente, conjuntos de informações armazenadas em tabelas. Para OTServers, são onde todas as informações sobre as contas e personagens são guardadas. SQL (Structured Query Language) é uma linguagem que é usada por quase todos os bancos de dados (no nosso caso, todos). Quando você envia comandos em SQL para o seu banco de dados, você pode modificá-lo ou extrair valores dele. Query (queries no plural) são consultas ou comandos que são enviadas para o banco de dados. Introdução Para nós, scripters, às vezes é fundamental tirar informações ou mudar valores dos personagens que só estão disponíveis no banco de dados, para isso existe uma biblioteca de funções que já vem com os servidores, a biblioteca db (de database, que significa banco de dados em inglês). Dela, usaremos principalmente duas funções: db.getResult Retorna os valores que foram selecionados em uma query db.query --ou db.executeQuery Executa uma query usada para modificar informações no banco de dados. Essa função se chama db.executeQuery na maioria dos servidores, mas também pode ser utilizada como db.query em outros. Em ambos os casos, a query deverá ser usada entre aspas. Queries em SQL Primeiramente, devemos saber como executar queries diretamente no banco de dados. Para isso, acesse seu banco de dados. Assim que você abrir o banco de dados. Abra a árvore do banco de dados e selecione a tabela players clicando duas vezes. Você verá a estrutura do banco de dados, com os nomes das colunas e o tipo de dados de cada uma (INT, INTEGER, VARCHAR, BOOLEAN, etc). Lá estarão todos os jogadores cadastrados no servidor, com várias informações. Essa é a aba importante para nós. 1. SELECT Depois disso, vamos tentar executar um primeiro comando no banco de dados: abra uma query no banco de dados de vocês e escreva. SELECT * FROM players Então, execute e veja o resultado. O que deve acontecer é aparecer toda a tabela players que você já havia visto. Perceba como, em geral, SQL é uma linguagem bem direta: a query que você enviou para o banco de dados significa: SELECIONE * DE jogadores E ela faz isso, com a exceção de que * significa todos os dados da tabela. OBS.: Apesar de quase toda query de SQL estar nesse padrão, ela é uma linguagem que não é case sensitive, logo select * from players Dá no mesmo. Mas fica menos legível, assim utilizamos letras maiúsculas para as palavras-chave dos comandos e letras minúsculas para os nomes de tabelas e colunas. Vamos testar outra query, um pouco mais complicada: SELECT name, level FROM players Dessa vez não selecionamos todos os dados da tabela, apenas o nome e o level de cada jogador. A sintaxe do comando SELECT é: SELECT nome_da_coluna_1, nome_da_coluna_2,..., nome_da_coluna_n FROM nome_da_tabela Assim teremos como retorno os valores dessas colunas para cada elemento da tabela. Tente selecionar apenas o nome e a posição (x, y e z) de cada jogador e confira abaixo. SELECT name, posx, posy, posz FROM players Complicando um pouco mais, vamos ordenar a tabela players por level: SELECT * FROM players ORDER BY level DESC Adicionamos a palavra-chave ORDER BY e DESC. A primeira significa 'ordene por' e a segunda, 'decrescente'. Ou seja, ordenamos nossa tabela com base na coluna level de maneira decrescente. Se você ocultar o DESC, a ordem natural vai ser crescente. Agora vamos filtrar nossos resultados: SELECT name, level FROM players WHERE level > 100 ORDER BY level DESC Assim obtemos apenas os jogadores com level maior que 100 e ordenados de maneira decrescente pelo level. A palavra-chave WHERE significa 'onde' e introduz uma condição para os resultados. Complicando ainda um pouco mais, vamos fazer a mesma coisa, mas para os jogadores com level entre 100 e 200 (sem contar nenhum dos extremos). SELECT name, level FROM players WHERE level > 100 AND level < 200 ORDER BY level DESC Portanto podemos usar AND e OR para escolher melhor os resultados. Para selecionar os extremos, podemos usar os operadores '>=' (maior ou igual) e '<=' (menor ou igual) ou simplesmente: SELECT name, level FROM players WHERE level BETWEEN 100 AND 200 2. UPDATE Nesse ponto, eu recomendo que você faça um backup do banco de dados, caso você mexa em algo e não saiba reverter, possa trocar facilmente. Esse é o comando em SQL para alterar informações em uma tabela. Vamos começar com um exemplo simples: mudar o nome de uma guilda. Faremos isso usando o comando UPDATE, cuja sintaxe é: UPDATE nome_da_tabela SET nome_da_coluna = valor Para mudar o nome de uma guilda, precisamos usar o UPDATE, mas se fizermos: UPDATE guilds SET name = 'Gutinha Supremacy' Estaremos mudando o nome de todas as guildas do servidor para 'Gutinha Supremacy' (as aspas devem estar presentes sempre que a informação que você está tratando é do tipo string, ou seja, um texto). Agora tente mudar apenas o nome da guilda Ownage para Gutinha Supremacy. Confira abaixo: UPDATE guilds SET name = 'Gutinha Supremacy' WHERE name = "Ownage" Atualize a tabela guilds e perceba que agora a última guilda listada se chama Gutinha Supremacy. Perceba que a maioria das tabelas tem uma coluna id. Essa é uma coluna importante para reconhecer cada elemento da tabela. OBS: Prefira sempre trabalhar com números do que com textos. Agora vamos mudar o nome e a mensagem de uma guild: UPDATE guilds SET name = "Gutinha Supremacy", motd = "Seja bem vindo!" WHERE id = 2 Agora mudamos, com um UPDATE só, a mensagem (motd) e o nome da guilda com id 2. Em alguns casos, queremos acrescentar e não mudar o valor de alguma coluna. Podemos fazer como o exemplo abaixo, no qual todos os jogadores serão promovidos, desde que já não o sejam. UPDATE players SET vocation = vocation + 4 WHERE vocation <= 4 3. INSERT INTO Esse é o comando em SQL para inserirmos dados em uma tabela. Para criar um jogador, por exemplo, podemos utilizar esse comando assim: INSERT INTO players VALUES (1, "Char de Teste", 0, 1, 1, 8, 3, 150, 150, 4200, 114, 92, 0, 0, 0, ...) Ou seja, estamos inserindo na tabela players os valores 1, "Char de Teste" , 0, 1, 1, 8, 3, 150, 150, 4200, 114, 92, 0, 0, 0, etc. Esses valores são inseridos na ordem das colunas, então 1 é o id, "Char de Teste" é o nome e assim por diante. Essa é uma das formas de se usar o comando INSERT INTO, mas existe outra: INSERT INTO nome_da_tabela (coluna1, coluna2, coluna3, ...) VALUES (valor_da_coluna1, valor_da_coluna2, valor_da_coluna3, ...) 4. ALTER TABLE Esse é um comando um pouco mais complicado porque sua sintaxe varia bastante dependendo do banco de dados. Em OTServers, esse comando é usado principalmente para acrescentar uma coluna em uma determinada tabela. Por exemplo, para criar um sistema VIP pelo banco de dados, poderíamos usá-lo. Sua sintaxe fica assim: ALTER TABLE nome_da_tabela ADD nome_da_coluna tipo_de_dado //(restrições e padrões) O tipo de dado define quais dados são aceitáveis como valores da coluna. Por exemplo, uma coluna que conterá nomes deve ter como tipo de dado varchar(255). Esse é um padrão que eu vejo nos servidores e significa que serão aceitos caracteres variáveis com comprimento de até 255. Para um número, use INT (que significa inteiro). Acho que são só esses dois tipos de dados que são comumente usados quando se trata de OTServers. As restrições são valores que não serão aceitos na coluna, como NOT NULL (para não aceitar valores nulos e facilitar posteriores tratamentos de erros), enquanto padrões são valores que serão inseridos automaticamente na coluna, se nenhum outro for especificado. Por exemplo, ao criar um jogador, vários valores tem padrão (default) 0. Não faz sentido um jogador começar com skull diferente disso, né? Ambas as restrições como valores padrão são opcionais. Exemplo: ALTER TABLE players ADD vip_time INT NOT NULL DEFAULT 0 É possível criar colunas, mas nem sempre é possível deletá-las diretamente. 5. COMANDOS COMPOSTOS Para introduzir essa seção do tutorial, tente esse exercício: selecione o valor do storage 2308 para algum jogador no seu banco de dados. SELECT value FROM player_storage WHERE player_id = (SELECT id FROM players WHERE name = "NomeAqui") AND key = 2308 Esse comando é mais complicado que os outros pois ele combina dois SELECTs. Perceba que não é possível selecionar o valor do storage diretamente pelo nome, mas é possível determinar o storage pelo id e o id pelo nome. Então temos que acessar a tabela players para selecionar o id do jogador e depois, com esse id, selecionar o valor do storage 2308. Comandos dentro de outros comandos devem ser usados entre parênteses. Também não podemos ver o skill de um jogador diretamente. Temos que saber seu id e, na tabela player_skills, comparar o número do skill com o id do jogador. Para obtermos os skills de um jogador, podemos executar o seguinte: SELECT skillid, value FROM player_skills WHERE player_id = (SELECT id FROM players WHERE name = "NomeAqui") Assim conseguindo obter os skills e seus valores do jogador. Tente mudar o valor do storage com key 2308 do jogador para 10. Confira abaixo. UPDATE player_storage set value = 10 WHERE key = 2308 and player_id = (SELECT id FROM players WHERE name = "NomeAqui") Queries SQL em LUA Agora, vamos voltar ao nosso mundo de scripting LUA. Agora que já sabemos como usar as queries, vamos aplicá-las: que tal criar um ranking com o TOP 10 do seu servidor em uma talkaction? Primeiramente, vamos definir a query SQL que usaremos: queremos os nomes e os levels dos 10 maiores levels do servidor. Tente criar a sua e compare: SELECT name, level FROM players ORDER BY level LIMIT 10 Sim, existe uma palavra-chave nova nessa query que não foi apresentada anteriormente. LIMIT define um limite de valores retornados. Assim impedimos que nossa lista fique maior do que os 10 que queremos mostrar. Agora precisamos escolher a função que vamos usar no script. Voltando ao início do tutorial, percebe-se que o SELECT deverá ser associado ao db.getResult. Portanto, nossa função principal do script deve ser: db.getResult("SELECT name, level FROM players ORDER BY level DESC LIMIT 10") Colocando isso numa talkaction: Explicando: Primeiramente salvamos nossos resultados em uma variável chamada query. Para isso, usamos o db.getResult citado anteriormente. Em seguida, criamos uma variável list, uma tabela vazia, que será utilizada para manipular os resultados. A checagem para saber se algum resultado foi obtido pela query é usar o query:getID(). Se ele for maior que -1, então existem resultados obtidos. Começamos um loop repeat para analisar cada linha do resultado Para pegar o "name" da linha de resultado que temos na query, utilizamos o query:getDataString("nome_da_coluna") e salvamos na variável name. Fazemos o mesmo para uma variável level, lembrando que o tipo de dado será Int (inteiro), então utilizamos query:getDataInt("nome_da_coluna") Insere na tabela list um texto do tipo: Eternal Oblivion - level: 300, de acordo com a linha atual do resultado O método query:next() retorna a próxima linha do resultado se houver ou nil. Assim, passamos pra próxima linha ou terminamos o loop Com o texto formado, utiliza-se a função doShowTextDialog para enviar para o jogador que usou a talkaction, juntando (concatenando) a tabela com os resultados com uma quebra de linha ("\n") Liberamos os resultados armazenados pela query e fechamos o script. E assim você acabou de criar uma talkaction com o ranking dos jogadores do seu servidor com base no level! Então essa é a base necessária para se acessar o banco de dados através de scripting. O resto depende da sua criatividade. Fontes Consultadas W3Schools Créditos: Omega
      • 6
      • Like
      • Thanks
  6. gutinha

    [SQL] Tutorial Básico

    Salve rapaziada, vou trazer um tutorial bem básico de SQL. Esse tutorial pode ser usado para MySQL também, pois o MySQL como o próprio nome já dá enfase, usa uma interface em SQL - que é uma linguagem, não confunda SQL com SQLite Studio ou MySQL. Primeiramente tenho que explicar o que é: SQL - (Structured Query Language) Linguagem de Consulta Estruturada, é uma linguagem de banco de dados, ou seja, serve para guardar, consultar e editar quase quaisquer dados. No seu arquivo .sql que fica na sua pasta \schemas, contém uma database salva através de vários QUERYS, como eu disse antes, querys são parte da interface do SQL, e com eles, você pode jogar num MySQL que abrirá magicamente, ou simplesmente executará os querys preenchendo sua database. Exemplo de arquivo .SQL: Uma database quase sempre contém uma ou mais tabelas. Cada tabela é identificada por um nome ( Exemplo: "Clientes" ou "Pedidos"). Tabelas contém gravações (rows) com data dentro deles. Querys - query, pode ser traduzido para: pergunta, questão, dúvida. Eles são usados em tudo dentro da linguagem, tudo que você faz com seus dados na database, é um query que roda no interpretador. Cada tabela contém colunas, e cada coluna, contém dados, e o conjunto de dados forma a sua database, através da organização de linhas e colunas. Vou explicar melhor na prática: Sintaxe - é todo o conjunto de comandos de uma linguagem. que serve para montar a lógica. Umas das sintaxes do SQL: SELECT //Extrai dados da database UPDATE //Atualiza dados da database DELETE //Deleta dados de uma database INSERT INTO //Insere novos dados dentro da database CREATE DATABASE //Cria uma nova database ALTER DATABASE //Altera uma database CREATE TABLE //Cria uma nova tabela ALTER TABLE //Modifica uma tabela DROP TABLE //Deleta uma tabela CREATE INDEX //Cria um index DROP INDEX //Deleta um index DISTINCT //Usa-se junto com SELECT para distinguir o que selecionar WHERE //Usa para impor condições AND //Usa para somar condições OR //Usa para subtrair condições No link, temos um interpretador de query com uma database. No canto direito "You Database:" você pode visualizar os dados e restaurar, restaure quando você fizer alguma merda (como deletar ou alterar algo sem querer). Lá dentro, escreva isto, e aperte "Run SQL >>" , o interpretador irá rodar/executar o query. SELECT * FROM Customers; Essa expressão acima, seleciona * (todos os dados) da tabela Customers (poderia ser tabela Accounts ou Players), que contém várias rows/fileiras (um total de 91), vamos diminuir utilizando outro comando, para diminuir a quantidade de informação: SELECT * FROM Customers WHERE CustomerID < 4; Feito isso, o resultado ficará: Para explicar o que é o que: Quando usamos um QUERY para selecionar, seguimos o seguinte padrão: SELECT coluna FROM tabela WHERE coluna=1; //Ou SELECT ContactName FROM Customers WHERE Address="Obere Str. 57" Isso vai selecionar direto "Maria Anders" pois os endereços são únicos... Essa situação pode ser usada no tibia por exemplo, para selecionar o noivo ou noiva no marriage system, já que eles precisam ser colocados no banco de dados. Os storages não são nada mais nada menos do que dados da database, que são chamados e alterados através de querys, por LUA ou C++ etc. Vale lembrar pessoal que para usar um query em LUA, é só usar a função: db.query("SELECT * FROM `accounts`") --o query dentro foi somente um exemplo. Fontes: [Hidden Content] [Hidden Content] - É uma opção em português. Créditos: Caronte
      • 6
      • Like
  7. Salve rapaziada! Me pediram no privado perguntando sobre Opcodes, como no começo eu tive bastante dificuldade de entender, estou fazendo este tutorial para explicar o básico. Opcodes são a comunicação entre o cliente e o servidor sem fazer alterações na source. Na source você poderia usar sockets, que são pacotes de informação, diretamente sem usar funcionalidades do jogo como meio de transmissão, já o opcode utiliza recursos in game para fazer essa comunicação. Exemplo: No módulo game_skills, no arquivo skills.lua, você pode notar a utilização do seguinte código: Essa linha, serve para registrar o uso do opcode número 102, estamos dizendo ali, que quando recebermos uma solicitação por opcode, sentido Servidor > Cliente, sendo essa de número 102, deverá ser acionada a função onPokemonSkillChange. Em outra parte do mesmo skills.lua, temos o seguinte código: Repare que a parte destaca: g_game.getProtocolGame():sendExtendedOpcode(102, 'refresh'), faz o envio de uma solicitação de sentido Cliente > Servidor, com o número 102 que é o id de identificação da opcode e na frente a string 'refresh', ou seja, um valor para o servidor conseguir enxergar o que deve ser feito. Para entender melhor vamos ao Servidor e olhar onde é tratada essa chamada do Cliente. No Servidor, em data/creaturescripts/scripts/opcodes/opcode.lua, temos o seguinte código: Repare nas partes que eu destaquei, irei explica-las abaixo: Vamos ver o que essa função faz? em data/lib/106-main functions.lua, temos a definição daquela função, que é: Basicamente, está função preenche uma tabela com as informações sobre insígneas, coins, qtd capturas do player e envia de volta ao Cliente através do comando: return doSendPlayerExtendedOpcode(cid, opcodes.OPCODE_SKILL_BAR, table.concat(str)) lembrando que o opcodes.OPCODE_SKILL_BAR nada mais que que o número 102 e o table.concat(str) é o buffer, ou seja, um parâmetro da função doSendPlayerExtendedOpcode com os dados que serão enviados ao Cliente. Espero que todos tenham entendido. Créditos: maykeldoido
  8. Salve rapaziada, mais um script simples ai. A cada 1hora logado no servidor o jogador ganha 1 ponto que é armazenado em uma storage. Ao atingir 15 pontos ele ganha 1 dia de vip grátis. O script pode ser adaptado ao seu critério. Código:
      • 7
      • Like
      • Thanks
  9. Tópico Aprovado! Somos gratos por sua contribuição, com certeza será útil para toda a comunidade! ❤️ REP+
  10. Não precisa registrar nada no .xml, o código vai ficar dentro do look.lua que já existe lá
  11. Salve rapaziada, vou disponibilizar aqui pra vocês o laatido, ele serve pra aumentar a quantidade de ram que a distro no windows lê (normalmente 2gb) ele aumenta para 4gb. Resolve muitos problemas de crash no servidor ao carregar o mapa. Acredito que tenha ele ai na internet mas é chatinho de achar, então vou deixar aqui fácil pra todo mundo. Download
  12. Salve rapaziada, vim trazer o módulo do otp pra quando você der look na porta da casa aparecer as informações. Baseado na PXG. Requisitos: Ter opcodes no servidor. Feito isso, não esqueça de registrar o módulo no client em game_interface, registre como - game_house Exemplo de como vai ficar Download Créditos: Michyalex
  13. Salve rapaziada, vim trazer o módulo do otp pra quando você der look na porta da casa aparecer as informações. Requisitos: Ter opcodes no servidor. Download do módulo Exemplo de como irá ficar: Créditos: Marshmello
  14. 51 downloads

    House look otp
  15. Poh, consegue ser mais específico? Tipo, são várias pessoas em uma posição específica? Em uma área O de xp é double exp?
  16. Aprovado! Movido para Suporte Website > Erro ao instalar TFS 0.4 + Gesior (2019)
  17. Salve rapaziada, script feito pra TFS 0.3.6 1° Passo
  18. O apk está na pasta raiz do client. Procura por .apk que acha
  19. Salve rapaziada, vim trazer um mod que em x outfit solta x efeito ao andar. Instalação Exemplo de como fica Caso o seu dê erro na função onMove, basta implementar ela seguindo o tutorial aqui Créditos: Michyaraque
  20. Opa, venho trazer uma função que pode ser usado em jogadores, monstros ou npcs, funciona quando uma criatura anda. 1° Passo 2° Passo 3° Passo Como usar
  21. Salve rapaziada, achei essas sprites guardadas aqui no pc, tinha pegado na época que o jogo tava online, como não irei usar vou disponibilizar pra vocês. Tem bastante coisa legal Imagens Download Créditos: PokeMemories
  22. 121 downloads

    Scan: https://www.virustotal.com/gui/file/942238498f317fbec3f52f86cfc5c6d50f64da46df4468dcd9ca2a1e9a2977be?nocache=1
  23. Salve, uma base nova ai pra vocês. com um potencial bem legal essa base. Videos do servidor. Source já adaptada pro ubuntu 20.04 Downloads
  24. Hi, have you seen this? [Hidden Content]
×
  • Criar Novo...