Tutoriais sobre Scripting
Aprenda com os mestres da comunidade a desenvolver seus scripts, sistemas e domine a linguagem .lua!
- Esta área é para publicação de Tutoriais sobre criação de códigos Otserv.
- Ao ler um tutorial, dê reputação ao membro que o publicou e comente no tópico. Este pequeno incentivo faz com que membros continuem trazendo tutoriais e outros conteúdos ao fórum.
- Se o conteúdo não for seu, adicione Créditos!
- Por motivos de segurança é necessário que um membro da equipe Aprove o seu Tópico, dessa forma mantemos o fórum organizado e livre de conteúdos maliciosos, obrigado pela compreensão!
Procure pelo tipo de código:
280 tópicos neste fórum
-
Fala galerinha do TK, como estão ? Bom, vou ensinar a voces a como adicionar novas Outfits Bom, é simples e rapido, então vamos la 1º vá em data/xml/outfits.xml e abra-o e estarão assim [/font]<?xml version="1.0"?> <outfits> <outfit id="1"> <list gender="0" lookType="136" name="Citizen"/> <list gender="1" lookType="128" name="Citizen"/> </outfit> <outfit id="2"> <list gender="0" lookType="137" name="Hunter"/> <list gender="1" lookType="129" name="Hunter"/> </outfit> <outfit id="3"> <list gender="0" lookType="138" name="Mage"/> <list gender="1" lookType=…
- 7 respostas
- 4k visualizações
-
Bom galera, vejo que muita gente pede ajuda para adicionar coondown em magias, runas, actions, etc.. entao vim aqui ensianr como adicionar o tao procurado coondown Primeiramente abra seu script, e procure onde ele faz a funçao como: Na linha a baixo da funçao, adicione isto : 23006 é o storage do exaust, coloque diferente em cada magia/action/talkaction para nao interferir umas nas outras. 20 é o tempo em segundos para poder usar a magia/action/talkaction/ novamente. Após adicionar isto, e configura-lo, pule uma linha e pronto Espero ter ajudado!
-
- 2 respostas
- 964 visualizações
-
-
Ola galera do tibia king, bom esse topico ja havia sido feito mais estava muito grande e confuso resolvir edita-lo para melhor compreende-lo, bom como o Titulo ja diz eu irei ensinar como adicionar Wayfarer Addon Full nas versoes 8.60. (Desculpe-me pelos erros nas acentuaçoes pois meus acentos nao esta funcionando, n~~ao). Bom vamos la. Abra a pasta DATA>NPC>SCRIPTS> e crie um arquivo chamado wayfarer.lua e coloque isso dentro local focus = 0 local talk_start = 0 function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(cid, pos) if focus == cid then se…
- 2 respostas
- 1.4k visualizações
- 1 follower
-
ola! gostaria de alguem que possa ajudar alguns que estao começando a criar ot server . eu criei spell no spell creator mais as tags que ele gera como adiciono elas no ot server. segue as magias e desde ja agradeço. <instant name="teste" words="default" lvl="100" maglv="0" mana="0" exhaustion="30" prem="0" needlearn="0" blockwalls="0" aggressive="1" event="script" value="teste.lua"> </instant> -- SpellCreator generated. -- =============== COMBAT VARS =============== -- Areas/Combat for 0ms local combat0_Brush = createCombatObject() setCombatParam(combat0_Brush, COMBAT_PARAM_EFFECT, 226) setCombatParam(combat0_Brush, COMBAT_PARAM_TYPE, COMBAT_UN…
- 3 respostas
- 847 visualizações
-
Boa noite! Trago ao fórum um simples porém útil tutorial de manipulação dos valores da database. O uso da database me garante melhor organização das minhas variáveis, em comparação a storages. Por storages você está preso a valores numéricos. Via database, você pode atribuir nomes, utilizar strings, e organizar as variáveis em grupos. Responderei dúvidas conforme for possível. Para inserir uma linha nova em uma tabela db.executeQuery("INSERT INTO `accounts` (`id` ,`name` ,`password`)VALUES ('5', 'marcelo', 'druida');") Neste exemplo, será adicionado na tabela accounts, uma nova conta marcelo/druida. (na verdade a senha é encriptada, mas serve como exem…
-
- 6 respostas
- 1.1k visualizações
-
-
Bom pessoal eu estava sofrendo com um erro, que dava shutdown em meu server, ele não reiniciava, ficava só no shutdown o dia todo, então eu resolvi verificar esse código game.cpp, resolvi meu problema e venho compartilhar com vocês. Vá em game.cpp procure void Game::shutdown() até exit(1);#endif } e substitua entre ele por esse abaixo: void Game::shutdown() { std::clog << "Preparing"; Scheduler::getInstance().shutdown(); std::clog << " to"; Dispatcher::getInstance().shutdown(); std::clog << " shutdown"; Spawns::getInstance()->clear(); std::clog << " the"; Raids::getInstance()->clear(); std::clog << " server"; …
-
- 2 respostas
- 1.3k visualizações
- 1 follower
-
-
Boa noite pessoal ,eu gostaria de saber primeiramente como que eu faço pros players usarem os outfits com os 2 addons .. sem ter aquela coisa de addon doll . ou de ter q pegar em npc... como eu habilito os 2 addons?
-
- 3 respostas
- 1.6k visualizações
-
-
Fala galera do TK, como estão? Hoje trago a vocês um tutorial de como compilar o novo TFS 1.0 no Linux, Ubuntu / Debian. Ferramentas necessárias: Putty WinSCP Irei ensinar em instantes estará compilado, vamos lá: Primeiramente ao acessar seu putty/ssh vamos instalar na máquina as libs necessárias para rodar o TFS 1.0, vamos instalar: sudo apt-get install git cmake build-essential liblua5.2-dev libgmp3-dev libmysqlclient-dev libboost-system-dev Pós instalar as libs vamos fazer o download do TFS 1.0 (ATUALIZADO 10.41). Executaremos o seguinte comando: git clone https://github.com/otland/forgottenserver.git Pós feito o download iremos acessar a …
- 13 respostas
- 6.4k visualizações
-
Vim trazer hoje um tutorial bem útil para quem esta aprendendo a linguagem lua. Com a autorização do grande Jhon vou postar aqui um tópico desenvolvido por ele. Tutorial Básico sobre CreatureScripts CreatureScripts = São scripts que serão ativados após uma determinada ação criada pelo monstro ou personagem. Essas ações são determinadas como funções. Existem varias funções utilizadas para a criação de creaturescripts e estas são: onDeath(cid, corpse, killer)-- que é executada ao morrer. onPrepareDeath(cid, lastHitKiller, mostDamageKiller) -- semelhante a onDeath. onAttack(cid, target) -- executa ao atacar. onCombat(cid, target) -- se…
- 14 respostas
- 3.1k visualizações
- 1 follower
-
Olá pessoal! Nas etapas a seguir vou tentar descrever de uma forma clara e objetiva como compilar o servidor otserv global1051 com suporte ao mysql no Fedora 21, lembrando que não vou abordar a instalação de um servidor LAMPP e/ou configuração do Banco de Dados. Apenas a instalação dos pacotes necessário para compilar e as etapas. Requerimentos: Fedora 21 instalado ou virtualizado e devidamente atualizado; Poderes administrativos "root" para instalar os pacotes necessários; Conhecimento para acessar pastas usando o terminal (recomendado, mas é opcional, caso o seu gerenciador de arquivos tenha suporte de abrir terminal, no Nautilus é necessário ter instalado o n…
-
- 1 resposta
- 570 visualizações
-
-
Fala Pessoal Do Fórum Tibia King! Hoje Estou Aqui Para Mostrar a Vocês o Que é Memória RAM, Pra Que Serve e Como Mante-lá Limpa, Para Melhor Funcionamento De Seu Computador. Todos Sabem Que Ela é Essencial Para Um Bom Servidor Né? Então Vamos Lá! O QUE É MEMÓRIA RAM? a Memória RAM é a Memória Que Armazena Tudo o Que Você Acessou Recentemente No Computador. Ela Armazena Para Que o Próximo Acesso a Determinado Processo Ou Arquivo Seja Mais Rápido. Quanto Maior a Memória RAM, Maior o Número De "Processos" Suportados. PARA QUE SERVE A MEMÓRIA RAM? Se o Processador é o Cérebro Do PC Podemos Considerar a Memória RAM o Seu Coração, Ela Armazena Informações Para Que …
-
- 1 resposta
- 1.9k visualizações
-
-
Olá TibiaKing, Vou ensinar pra vocês como mecher no SQL Studio.. Vamos por a mão na massa e parar se nhênhênhê.. Primeiramente baixem o SQLite Studio (1.1.1 Última Versão). SQLite Studio 1.1.1 ( Site Oficial) Certo, primeiro vou dar uma introdução.. Pra que serve SQLite Studio? R: SQLite Studio, é os mais recentes editores de players, houses, accounts, etc.. É muito pesado o programa? Tem que instalar? R: Não, em ambas perguntas não. Não tem que instalar, e não é pesado.. Como eu mecho nisso? R: Vou lhe ensinar agora!! Bora, mão na massa!! Que Bom que estão empolgados!! 1.Abra o seu SQLite Studio 1.1.1 2.Adicio…
- 2 respostas
- 8.2k visualizações
-
Bom Galera, Sou Novo No ramo de scripts.. sou novo aki no tibiaking então vou postar.. cores Para Outfits De Npcs e Monster,Então Vamos la.. Obs: Nao Funciona Em Algum Monstros... Primeiro Vou Ensinar Como Mudar a Cor dos Npcs.. <look type="134" head="69" body="54" legs="32" feet="45" addons="3"/> VERDE: Numero Da Outfit PRETO: Cor Do Cabelo Azul-piscina: Cor Da Armadura Vermelho: Cor Da Legs ROSA: Cor Da Bota Looktype Do Monstro Ou Npc <look type="7" head="20" body="30" legs="40" Cinza: Numero Da Looktype Numero Das Cores Do Looktype: Bom Galera.. Foi Meu Primeiro Post Ai No Tibiaking.. Espero Que G…
- 6 respostas
- 13.9k visualizações
- 1 follower
-
Não me lembro bem mas acho que esse bug foi fixado só na versão 8.62, então pode ajudar muita gente... O comando !disband não funcionava direito, o player continuava na guild e acho que dava pra clonar items também. Os créditos vão para o slawkens. No arquivo ioguild.cpp, troque: bool IOGuild::disbandGuild(uint32_t guildId) { Database* db = Database::getInstance(); DBQuery query; query << "UPDATE `players` SET `rank_id` = '' AND `guildnick` = '' WHERE `rank_id` = " << getRankIdByLevel(guildId, GUILDLEVEL_LEADER) << " OR rank_id = " << getRankIdByLevel(guildId, GUILDLEVEL_VICE) << " OR rank_id = " << getRankIdByLevel…
-
- 3 respostas
- 815 visualizações
-
-
Bom dia! Trago estas três funções .lua que utiliza o player ID da database para retornar o Nome, vice-versa e o próprio ID Não consigo lhes dar exemplos de utilização, entretanto eu as utilizo. Estou certo que pode servir para alguém. • getPlayerNameById(id) • getPlayerIdByName(name) • getPlayerID(cid) Créditos a mim mesmo. Abraço!
-
- 2 respostas
- 1.2k visualizações
- 1 follower
-
-
Fala Galera, Hoje eu venho trazer um tutorial a vocês de um Painel de Controle Online para gerenciamento de seu OT. Com este exemplo, creio que vai inspirar muita gente a criar novas ferramentas. Minha intenção era vincular ao Gesior, porém, deixo por conta da imaginação de vocês. Pré-requisitos: Liberar a função "shell_exec" no seu PHP. Instalar os comandos sudo e screen. Vamos Começar... Faça login no seu servidor com o root. Entre com o comando em negrito: pico /etc/init.d/theforgottenserver e adicione isso: #!/bin/sh # # Startup and signals management script for TheForgottenServer # case "$1" in start) echo -n "Starting theforgottenserver…
-
- 3 respostas
- 1.9k visualizações
-
-
Bom isso e simples mais alguns novatos nao sabem Vamo usa snakebite rod como exemplo Vou mudar o efeito dela para ice e tirar o efeito tera va na pasta data/intens/intens.xml <item id="2182" article="a" name="snakebite rod"> <attribute key="description" value="It seems to twitch and quiver as if trying to escape your grip." /> <attribute key="weight" value="4300" /> <attribute key="weaponType" value="wand" /> <attribute key="shootType" value="smallearth" /> <attribute key="range" value="3" /> Mude pra <item id="2182" article="a" name="snakebite rod"> <attribute key="description…
- 13 respostas
- 8.2k visualizações
-
Tipo: Tutorial. Autor: Skymagnum(Skyforever). Encina: Como usar corretamente o addEvent sem bugs e erros no console. Creio que todos vocês conheçam a função addEvent senão vou explicar, ela funciona da seguinte maneira addEvent(function, seconds, ...). Bom se você usar a função doSendMagicEffect(position, effect) ela vai soltar o efeito na hora correto? com addEvent você pode fazer o efeito soltar depois se usar corretamente exêmplo de uso incorreto: addEvent(doSendMagicEffect, getThingPos(cid), 5 * 1000, 35) agora veremos do jeito certo: addEvent(doSendMagicEffect, 5 * 1000, getThingPos(cid), 35) . …
- 13 respostas
- 4.2k visualizações
-
Introdução Aula 1 O que é scripting? Do modo mais simples possível: scripting é o ato de programar. O nome scripting vem do nome "script". O que é um script? De um modo geral, um script é um bloco de código escrito em uma linguagem de programação interpretada, ou seja, ele precisa que alguma coisa leia ele e possa "traduzir" seu conteúdo. Lembre-se de que "script" não é um termo específico de Open Tibia Servers. O que é uma linguagem de programação interpretada? Os brasileiros falam português, ingleses falam inglês e chineses falam mandarim, e com isso o mundo é composto por várias línguas. No mundo da programação não é difer…
- 11 respostas
- 6.6k visualizações
- 1 follower
-
Boa Noite pessoal, dando continuidade a série de tutoriais hoje eu venho trazer mais alguns exemplos de como podemos trabalhar com os parâmetros (position, lastposition, from position e toposition) só que agora em uma action simples. 1° Eu Criei uma função para verificar uma área pré-determinada a procura de creatures, e salva-las em um array. function getCreatureInArea(pos, area) local centro = {} local uids = {} for y = 1, table.getn(area) do for x = 1, table.getn(area[y]) do if area[y][x] > 0 then centro.x = math.floor(table.getn(area[y])/2)+1 centro.y = math.fl…
-
- 1 resposta
- 571 visualizações
-
-
Aula 001 Movements- Explicação de parâmetros. Dentro das funções StepIn/StepOut temos alguns parâmetros que podem ser muito uteis para alguns tipos de scripts. Esses parâmetros são: position, lastPosition, fromPosition, toPosition 1° Parâmetro - position Esse parâmetro é o responsável por mostrar a posição de onde o script foi ativado, Toda vez que um player ou creature executar um movement StepIn/StepOut o parametro position vai marcar a exata posição de onde o script foi ativado. 2/3 ° Parâmetros - lastPosition, fromPosition Esses dois parâmetros tem a mesma função, que é registrar de onde o player ou creature que executou o script veio, To…
-
- 1 resposta
- 1.1k visualizações
-
-
Olá galerinha do TK... Recentemente em meu server estou com alguns problemas relacionados a spells... O problema é o seguinte... O Player X Usa uma spell de ataque no player Y porem se tiver mais de 1 player no mesmo sqm do player Y todos sofrerão o ataque mesmo se a spell usada pelo player X for uma spell de target... Alguns players sacaram esse problema e estão abusando fazendo pessoas pegarem red em Escadas que geralmente fica mais de 1 player no mesmo sqm... Talvez o problema seja facil de resolver mas eu não estou ligado como é... Esse bug eu posso consertar onde ? Na tag msm no spells.xml ? Por que acontece isso ? Uma magia de ataque target hitando todos que…
-
- 1 resposta
- 367 visualizações
-
-
Como funcionam os Scripts? Você já deve ter se perguntado como os scripts funcionam ou não. Por exemplo: Como o servidor sabe que quando eu apertar com o botão direito em um Health Potion ele terá que healar o player alvo? Em primeiro lugar devemos entender o que são callbacks. Do modo mais simples callback é algo que acontece devido a uma reação, é como a Terceira Lei de Newton que diz que toda ação gera uma reação, esse callback é a nossa reção, é uma função que vai ser executada assim que algo acontecer, no caso do Health Potion assim que ele for usado. Quando um item é usado ele provoca a chamada de um callback dessa função: functio…
- 8 respostas
- 2.5k visualizações
-
Olá galerinha TKbianos, Eu postei aqui, a tradução (as funções) que estão no config.lua, vejo muita pessoa com dúvidas que acha que precisa fazer script, mas naverdade essas dúvidas estão na cara de vocês, bem no config.lua! (Botei os necessários) Config.lua : accountManager = "no" (Utilização de account manager.) newPlayerChooseVoc = "yes" (Se o player pode escolher a vocação, caso esteja em "no" ele vai começar como "no vocation".) {newPlayerSpawnPosX = 155} {newPlayerSpawnPosY = 39} (Posição do player criado pelo account manager.) {newPlayerSpawnPosZ = 7} newPlayerTownId = 1 (ID da cidade [configurado no map editor].) newPlayer…
-
- 6 respostas
- 14.2k visualizações
-
-
Hoje é dia de brincadeira e iremos criar uma solução onde o app em modo cli verifica se o número é impar ou par. Abra um editor de texto de sua preferencia e então digite: import time # criando função par. def par(numeroPar): #Verifica se o resto do número passado no parametro é 0, se for 0 então retorna Par se não, retorna Ímpar if numeroPar %2 == 0: return ("%d - Par" %numeroPar) else: return ("%d - Ímpar" %numeroPar) print(par(4)) ''' ou também poderíamos fazer assim: Primeiro iremos pedir para o usuário digitar qualquer número quando o usuário digitar, verificamos se o número é par ou impar ''' digite_um_numero = int(input()) # caso o usuário digite um númer…
-
- 0 respostas
- 1.4k visualizações
-
-
Porque um OTServer em linux? Linux é tudo 100% melhor que Windows. Proteção, o Linux tem uma rígida proteção contra acessos indesejados, acessos maliciosos. O Linux tem um mega capacidade de proteção DDoS isso e se você tiver as configurações corretas,roda map de qualquer tamanho sem limite de 100 mb. Primeiramente Obtenha uma plano Linux VPS/DEDICADO em www.gamershost.com Download Necessario: SSH Secure Shell FileZilla FTP Sources TFS - Qualquer versao. Primeiramente entre em contato com suporte do seu VPS/DEDICADO e peça para adicionar: Ubuntu add: deb http://ubuntu.mirror.cambrium.nl/ubuntu/ lucid main universe Debian add: deb http:/…
- 19 respostas
- 8.9k visualizações
-
Galera acabei de criar um script que baixa e compila o OTserv no Linux, lembrando que está versão é apenas para a distribuição Debian/Ubuntu e suas derivadas... lembrando que eu irei atualizar o código daqui pra frente, então fiquem ligados no GitHub, para onbter o script mais recente... O script é apenas para os preguiçosos de plantão (Assim como eu), ele irá baixar e compilar o otserv automaticamente. O script apenas faz isso, ele não faz mágica, mas é uma boa Fique de olho no projeto oficial. Primeiro baixe os dois arquivos necessários para a compilação: Baixe Aqui Jogue os arquivos na pasta Home, sua pasta deverá ficar assim: Abra o termina…
-
- 2 respostas
- 1.2k visualizações
-
-
É, todos conhecem a "Mana Rune", então nem tenho muito o que fala... Então vamos lá.. A Imagem da Runa que será a "Mana Rune" está no spoiler abaixo. 1º Passo 2º Passo 3º Passo Ex: <item fromid="2275" toid="2285" article="a" name="spell rune"> <attribute key="weight" value="120" /> </item> Item FromID 2275 - ToID 2285, ou seja, da ID 2275 à ID 2285 todos os items serão chamados de "spell rune" como está na tag. P- Certo, então como procurá-la então? R- Simples... basta você procurar pelo nome do item, ou seja, procure por "spell rune". Nessa parte tem um porém... você tem que verificar se não há uma tag que comp…
- 21 respostas
- 8.5k visualizações
- 1 follower
-
Hoje estarei ajudando cria novas mount no servidor. Hoje ajudarei a colocar novas montarias no servidor tipo EX : Vulcongra. Para criar sua montaria e necessario saber o newtype do monstro e tem que ser de acordo com seu servidor nunca tente colocar monstro 10.10 no teu servidor se ele for 9.6 por que ira ficar dando debug. 1- Vamos na pasta do Servidor l Data l Xml l Mounts.xml. Abra e Vamos la colocar a nova montaria estarei ajudando em 9.6 Na montaria chamado Tarantula. 2- Adicione a tag seguinte. <mount id="28" clientid="219" name="Tarantula" speed="50" premium="no" /> Como vocês sabem tem que o MountId de acordo com a lista do s…
-
- 4 respostas
- 775 visualizações
-
-
Aleatório Olá, estou a um tempo parado e decidi postar este tutorial conceitual. O objetivo hoje é explicar como funciona a função math.random(...) em lua. O que é aleatório? Por conceito aleatório é aquilo que é escolhido independente de qualquer valor, ao acaso. Aplicação? Na prática, não existe aplicação exata ao conceito, entretanto, utilizamos fórmulas matemáticas para gerar valores que fogem um pouco do controle do usuário. Quando se utiliza math.random por exemplo, você está pedindo para a máquina gerar um número, definirei portanto esta atitude como semi-aleatória. Por que semi-aleatório? Simples, quando você utiliza math.random, o…
-
- 6 respostas
- 785 visualizações
-
-
| ~ | Editando opção infinita | ~ | | ~ | by Northon e OhGod | ~ | Como assim infinita? Editar se é infinita runas e arrows. | ~ | Mãos a obra! | ~ | Acesse a config.lua, que se encontra na pasta do seu otserv. Abra ela, é em seguida procure por isso: Quote -- remove ammunation? (bolts/arrows) removeammunation = "no" -- remove rune charges? (sd/hmm/gfb) removerunecharges = "yes" Edite as opções entre aspas, no caso acima ela não esta infinita. "yes" -> Não deixar infinita "no" -> Deixar infinita. Vai em arquivo > salvar.
-
- 2 respostas
- 887 visualizações
-
-
Launcher v1.0 by: Sticler Olá, Hoje vim trazer um Launcher feito por mim, ele Contém: Auto-Update Ou seja, ele vai ver se no seu client é da mesma versão que o host (veremos mais a frente) Launcher Ou seja, tem a opção de SITE, para ir para o SITE capitão óbvio SHOP, para ir para o SHOP do SITE, e Play v1.0 Tutorial Parte 1 Parte 2: Parte 3: Compilando: Parte 4: Então, hora de usar aquilo, deixe esta tela Exatamente Assim (Mudando apenas o nome do seu servidor) Agora, ponha o LAUNCHER na pasta do OTCLIENT/Clipsoft Agora, aonde tem Application main executable file, ponha o Launche…
-
- 10 respostas
- 3.7k visualizações
-
-
Bom, estarei ensinando como editar as mensagens que aparece em seu server enquanto jogas ele. vá em server - data - global events - e procure por msg.lua
- 1 resposta
- 595 visualizações
-
Ola pessoal do Tibiaking meu 1 post nesse forum Action: Pelo mapa você coloca um unique id na alavanca, vamos pegar por exemplo 5000(pode ser qualquer número, desde que já não seja usado no arquivo actions.xml você adiciona essa linha: Sendo que o nome do script é onde vai ficar as informações que vem abaixo: Ai em cima já tem tudo o que modificar explicado. Tá agora o cara foi teleportado para o outro lugar Nesse outro lugar você anda... ai tem outra sala com alguns bichos e uma alavanca, que ao puxar nasce o boss da quest. Vou explicar agora: No mapa na alavanca você coloca outro unique ID, por exemplo 5001(já que o 5…
- 13 respostas
- 2.7k visualizações
-
Bem amigos da rede globo, estou aqui para dar continuidade as aulas. E a aula de hoje é sobre Funções, suas utilizações e como criar. O que são? Bom, você jovem padawan já deve ter se deparado com algo assim em algum script: function doPlayerAddAddons(cid, addon) for i = 0, table.maxn(maleOutfits) do doPlayerAddOutfit(cid, maleOutfits[i], addon) end for i = 0, table.maxn(femaleOutfits) do doPlayerAddOutfit(cid, femaleOutfits[i], addon) end end Peguei essa função no arquivo lib/functions.lua Isso é uma função (dãa). As funções são blocos de instruções (comandos) que o servidor lê e executa. Você tem a liberdade de criar elas na pa…
-
- 1 resposta
- 1.8k visualizações
-
Quem Está Navegando 0
- Nenhum usuário registrado visualizando esta página.