Ir para conteúdo

Guild War System Tfs 0.4


cakes2196

Posts Recomendados

War System



 

 

• Nome: Guild War System

• Autor: Elf

• Versão Testada: 0.4_SVN

 

 

 

Bom, esse é meu primeiro post, então, deem um desconto aê.

 

Vamos ao que interessa...

 

 

 

 

 

Crie um arquivo chamado db.mysql e importe para sua database.

 

DB.MYSQL

CREATE TABLE IF NOT EXISTS `guild_wars` (
   `id` INT NOT NULL AUTO_INCREMENT,
   `guild_id` INT NOT NULL,
   `enemy_id` INT NOT NULL,
   `begin` BIGINT NOT NULL DEFAULT '0',
   `end` BIGINT NOT NULL DEFAULT '0',
   `frags` INT UNSIGNED NOT NULL DEFAULT '0',
   `payment` BIGINT UNSIGNED NOT NULL DEFAULT '0',
   `guild_kills` INT UNSIGNED NOT NULL DEFAULT '0',
   `enemy_kills` INT UNSIGNED NOT NULL DEFAULT '0',
   `status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
   PRIMARY KEY (`id`),
   KEY `status` (`status`),
   KEY `guild_id` (`guild_id`),
   KEY `enemy_id` (`enemy_id`)
 ) ENGINE=InnoDB;

  ALTER TABLE `guild_wars`
   ADD CONSTRAINT `guild_wars_ibfk_1` FOREIGN KEY (`guild_id`) REFERENCES `guilds` (`id`) ON DELETE CASCADE,
   ADD CONSTRAINT `guild_wars_ibfk_2` FOREIGN KEY (`enemy_id`) REFERENCES `guilds` (`id`) ON DELETE CASCADE;

  ALTER TABLE `guilds` ADD `balance` BIGINT UNSIGNED NOT NULL AFTER `motd`;

  CREATE TABLE IF NOT EXISTS `guild_kills` (
   `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   `guild_id` INT NOT NULL,
   `war_id` INT NOT NULL,
   `death_id` INT NOT NULL
 ) ENGINE = InnoDB;

  ALTER TABLE `guild_kills`
   ADD CONSTRAINT `guild_kills_ibfk_1` FOREIGN KEY (`war_id`) REFERENCES `guild_wars` (`id`) ON DELETE CASCADE,
   ADD CONSTRAINT `guild_kills_ibfk_2` FOREIGN KEY (`death_id`) REFERENCES `player_deaths` (`id`) ON DELETE CASCADE,
   ADD CONSTRAINT `guild_kills_ibfk_3` FOREIGN KEY (`guild_id`) REFERENCES `guilds` (`id`) ON DELETE CASCADE;

  ALTER TABLE `killers` ADD `war` INT NOT NULL DEFAULT 0;

 

 

 

Adicionem essas tags em, data/talkactions/talkactions.xml

Tag

<!-- Guild War System -->
 <talkaction words="/war" channel="0" event="script" value="war.lua" desc="(Guild channel command) War management."/>
 <talkaction words="/balance" channel="0" event="script" value="balance.lua" desc="(Guild channel command) Balance management."/>

 

 

 

Abra o arquivo global.lua, copie as querys e cole no arquivo start.lua ou init.lua data/globalevents/scripts

querys

db.executeQuery("DELETE FROM `guild_wars` WHERE `status` = 0 AND `begin` < " .. (os.time() - 2 * 86400) .. ";")
 db.executeQuery("UPDATE `guild_wars` SET `status` = 5, `end` = " .. os.time() .. " WHERE `status` = 1 AND `end` > 0 AND `end` < " .. os.time() .. ";")

 

 

 

Crie um arquivo chamado 101-war.lua em data/lib

101-war.lua

WAR_GUILD = 0
WAR_ENEMY = 1

 

 

 

Copie os arquivos balance.lua e war.lua para a pasta scripts data/talkactions/scripts

balance.lua

  local function isValidMoney(value)
     if(value == nil) then
         return false
     end

      return (value > 0 and value <= 99999999999999)
 end

  function onSay(cid, words, param, channel)
     local guild = getPlayerGuildId(cid)
     if(guild == 0) then
         return false
     end

      local t = string.explode(param, ' ', 1)
     if(getPlayerGuildLevel(cid) == GUILDLEVEL_LEADER and isInArray({ 'pick' }, t[1])) then
         if(t[1] == 'pick') then
             local money = { tonumber(t[2]) }
             if(not isValidMoney(money[1])) then
                 doPlayerSendChannelMessage(cid, '', 'Invalid amount of money specified.', TALKTYPE_CHANNEL_W, 0)
                 return true
             end

              local result = db.getResult('SELECT `balance` FROM `guilds` WHERE `id` = ' .. guild)
             if(result:getID() == -1) then
                 return false
             end

              money[2] = result:getDataLong('balance')
             result:free()

              if(money[1] > money[2]) then
                 doPlayerSendChannelMessage(cid, '', 'The balance is too low for such amount.', TALKTYPE_CHANNEL_W, 0)
                 return true
             end

              if(not db.executeQuery('UPDATE `guilds` SET `balance` = `balance` - ' .. money[1] .. ' WHERE `id` = ' .. guild .. ' LIMIT 1;')) then
                 return false
             end

              doPlayerAddMoney(cid, money[1])
             doPlayerSendChannelMessage(cid, '', 'You have just picked ' .. money[1] .. ' money from your guild balance.', TALKTYPE_CHANNEL_W, 0)
         else
             doPlayerSendChannelMessage(cid, '', 'Invalid sub-command.', TALKTYPE_CHANNEL_W, 0)
         end
     elseif(t[1] == 'donate') then
         local money = tonumber(t[2])
         if(not isValidMoney(money)) then
             doPlayerSendChannelMessage(cid, '', 'Invalid amount of money specified.', TALKTYPE_CHANNEL_W, 0)
             return true
         end

          if(getPlayerMoney(cid) < money) then
             doPlayerSendChannelMessage(cid, '', 'You don\'t have enough money.', TALKTYPE_CHANNEL_W, 0)
             return true
         end

          if(not doPlayerRemoveMoney(cid, money)) then
             return false
         end

          db.executeQuery('UPDATE `guilds` SET `balance` = `balance` + ' .. money .. ' WHERE `id` = ' .. guild .. ' LIMIT 1;')
         doPlayerSendChannelMessage(cid, '', 'You have transfered ' .. money .. ' money to your guild balance.', TALKTYPE_CHANNEL_W, 0)
     else
         local result = db.getResult('SELECT `name`, `balance` FROM `guilds` WHERE `id` = ' .. guild)
         if(result:getID() == -1) then
             return false
         end

          doPlayerSendChannelMessage(cid, '', 'Current balance of guild ' .. result:getDataString('name') .. ' is: ' .. result:getDataLong('balance') .. ' bronze coins.', TALKTYPE_CHANNEL_W, 0)
         result:free()
     end

      return true
 end

 

war.lua

local guild = getPlayerGuildId(cid)
function onSay(cid, words, param, channel)
     if(not guild or getPlayerGuildLevel(cid) < GUILDLEVEL_LEADER) then
         doPlayerSendChannelMessage(cid, "", "You cannot execute this talkaction.", TALKTYPE_CHANNEL_W, 0)
         return true
     end

      local t = string.explode(param, ",")
     if(not t[2]) then
         doPlayerSendChannelMessage(cid, "", "Not enough param(s).", TALKTYPE_CHANNEL_W, 0)
         return true
     end

      local enemy = getGuildId(t[2])
     if(not enemy) then
         doPlayerSendChannelMessage(cid, "", "Guild \"" .. t[2] .. "\" does not exists.", TALKTYPE_CHANNEL_W, 0)
         return true
     end

      if(enemy == guild) then
         doPlayerSendChannelMessage(cid, "", "You cannot perform war action on your own guild.", TALKTYPE_CHANNEL_W, 0)
         return true
     end

      local enemyName, tmp = "", db.getResult("SELECT `name` FROM `guilds` WHERE `id` = " .. enemy)
     if(tmp:getID() ~= -1) then
         enemyName = tmp:getDataString("name")
         tmp:free()
     end

      if(isInArray({"accept", "reject", "cancel"}, t[1])) then
         local query = "`guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild
         if(t[1] == "cancel") then
             query = "`guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy
         end

          tmp = db.getResult("SELECT `id`, `begin`, `end`, `payment` FROM `guild_wars` WHERE " .. query .. " AND `status` = 0")
         if(tmp:getID() == -1) then
             doPlayerSendChannelMessage(cid, "", "Currently there's no pending invitation for a war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
             return true
         end

          if(t[1] == "accept") then
             local _tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)
             local state = _tmp:getID() < 0 or _tmp:getDataInt("balance") < tmp:getDataInt("payment")

              _tmp:free()
             if(state) then
                 doPlayerSendChannelMessage(cid, "", "Your guild balance is too low to accept this invitation.", TALKTYPE_CHANNEL_W, 0)
                 return true
             end

              db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. tmp:getDataInt("payment") .. " WHERE `id` = " .. guild)
         end

          query = "UPDATE `guild_wars` SET "
         local msg = "accepted " .. enemyName .. " invitation to war."
         if(t[1] == "reject") then
             query = query .. "`end` = " .. os.time() .. ", `status` = 2"
             msg = "rejected " .. enemyName .. " invitation to war."
         elseif(t[1] == "cancel") then
             query = query .. "`end` = " .. os.time() .. ", `status` = 3"
             msg = "canceled invitation to a war with " .. enemyName .. "."
         else
             query = query .. "`begin` = " .. os.time() .. ", `end` = " .. (tmp:getDataInt("end") > 0 and (os.time() + ((tmp:getDataInt("begin") - tmp:getDataInt("end")) / 86400)) or 0) .. ", `status` = 1"
         end

          query = query .. " WHERE `id` = " .. tmp:getDataInt("id")
         if(t[1] == "accept") then
             doGuildAddEnemy(guild, enemy, tmp:getDataInt("id"), WAR_GUILD)
             doGuildAddEnemy(enemy, guild, tmp:getDataInt("id"), WAR_ENEMY)
         end

          tmp:free()
         db.executeQuery(query)
         doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. msg, MESSAGE_EVENT_ADVANCE)
         return true
     end

      if(t[1] == "invite") then
         local str = ""
                 tmp = db.getResult("SELECT `guild_id`, `status` FROM `guild_wars` WHERE `guild_id` IN (" .. guild .. "," .. enemy .. ") AND `enemy_id` IN (" .. enemy .. "," .. guild .. ") AND `status` IN (0, 1)")
                 if(tmp:getID() ~= -1) then
                         if(tmp:getDataInt("status") == 0) then
                                 if(tmp:getDataInt("guild_id") == guild) then
                                         str = "You have already invited " .. enemyName .. " to war."
                                 else
                                         str = enemyName .. " have already invited you to war."
                                 end
             else
                 str = "You are already on a war with " .. enemyName .. "."
             end

              tmp:free()
         end

          if(str ~= "") then
             doPlayerSendChannelMessage(cid, "", str, TALKTYPE_CHANNEL_W, 0)
             return true
         end

          local frags = tonumber(t[3])
         if(frags ~= nil) then
             frags = math.max(10, math.min(1000, frags))
         else
             frags = 100
         end

          local payment = tonumber(t[4])
         if(payment ~= nil) then
             payment = math.max(100000, math.min(1000000000, payment))
             tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)

              local state = tmp:getID() < 0 or tmp:getDataInt("balance") < payment
             tmp:free()
             if(state) then
                 doPlayerSendChannelMessage(cid, "", "Your guild balance is too low for such payment.", TALKTYPE_CHANNEL_W, 0)
                 return true
             end

              db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. payment .. " WHERE `id` = " .. guild)
         else
             payment = 0
         end

          local begining, ending = os.time(), tonumber(t[5])
         if(ending ~= nil and ending ~= 0) then
             ending = begining + (ending * 86400)
         else
             ending = 0
         end

          db.executeQuery("INSERT INTO `guild_wars` (`guild_id`, `enemy_id`, `begin`, `end`, `frags`, `payment`) VALUES (" .. guild .. ", " .. enemy .. ", " .. begining .. ", " .. ending .. ", " .. frags .. ", " .. payment .. ");")
         doBroadcastMessage(getPlayerGuildName(cid) .. " has invited " .. enemyName .. " to war till " .. frags .. " frags.", MESSAGE_EVENT_ADVANCE)
         return true
     end

      if(not isInArray({"end", "finish"}, t[1])) then
         return false
     end

      local status = (t[1] == "end" and 1 or 4)
     tmp = db.getResult("SELECT `id` FROM `guild_wars` WHERE `guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy .. " AND `status` = " .. status)
     if(tmp:getID() ~= -1) then
         local query = "UPDATE `guild_wars` SET `end` = " .. os.time() .. ", `status` = 5 WHERE `id` = " .. tmp:getDataInt("id")
         tmp:free()
         doGuildRemoveEnemy(guild, enemy)
         doGuildRemoveEnemy(enemy, guild)

          db.executeQuery(query)
         doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. (status == 4 and "mend fences" or "ended up a war") .. " with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
         return true
     end

      if(status == 4) then
         doPlayerSendChannelMessage(cid, "", "Currently there's no pending war truce from " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
         return true
     end

      tmp = db.getResult("SELECT `id`, `end` FROM `guild_wars` WHERE `guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild .. " AND `status` = 1")
     if(tmp:getID() ~= -1) then
         if(tmp:getDataInt("end") > 0) then
             tmp:free()
             doPlayerSendChannelMessage(cid, "", "You cannot request ending for war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
             return true
         end

          local query = "UPDATE `guild_wars` SET `status` = 4, `end` = " .. os.time() .. " WHERE `id` = " .. tmp:getDataInt("id")
         tmp:free()

          db.executeQuery(query)
         doBroadcastMessage(getPlayerGuildName(cid) .. " has signed an armstice declaration on a war with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
         return true
     end

      doPlayerSendChannelMessage(cid, "", "Currently there's no active war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
     return true
 end

 

 

 

 

Crie um arquivo chamado war.php na pasta do seu Website

war.php

<?php
 $main_content = "<h1 align=\"center\">Guild Wars</h1>
 <script type=\"text/javascript\"><!--
 function show_hide(flip)
 {
     var tmp = document.getElementById(flip);
     if(tmp)
         tmp.style.display = tmp.style.display == 'none' ? '' : 'none';
 }
 --></script>
 <table width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"4\">
 <tr>
 <td style=\"background: " . $config['site']['vdarkborder'] . "\" class=\"white\" width=\"150\"><b>Aggressor</b></td>
 <td style=\"background: " . $config['site']['vdarkborder'] . "\" class=\"white\"><b>Information</b></td>
 <td style=\"background: " . $config['site']['vdarkborder'] . "\" class=\"white\" width=\"150\"><b>Enemy</b></td>
 </tr>";

  $count = 0;
 foreach($SQL->query('SELECT * FROM `guild_wars` WHERE `status` IN (1,4) OR ((`end` >= (UNIX_TIMESTAMP() - 604800) OR `end` = 0) AND `status` IN (0,5));') as $war)
 {
     $a = $ots->createObject('Guild');
     $a->load($war['guild_id']);
     if(!$a->isLoaded())
         continue;

      $e = $ots->createObject('Guild');
     $e->load($war['enemy_id']);
     if(!$e->isLoaded())
         continue;

      $alogo = $a->getCustomField('logo_gfx_name');
     if(empty($alogo) || !file_exists('guilds/' . $alogo))
         $alogo = 'default_logo.gif';

      $elogo = $e->getCustomField('logo_gfx_name');
     if(empty($elogo) || !file_exists('guilds/' . $elogo))
         $elogo = 'default_logo.gif';

      $count++;
     $main_content .= "<tr style=\"background: " . (is_int($count / 2) ? $config['site']['darkborder'] : $config['site']['lightborder']) . ";\">
 <td align=\"center\"><a href=\"?subtopic=guilds&action=show&guild=".$a->getId()."\"><img src=\"guilds/".$alogo."\" width=\"64\" height=\"64\" border=\"0\"/><br />".$a->getName()."</a></td>
 <td class=\"white\" align=\"center\">";
     switch($war['status'])
     {
         case 0:
         {
             $main_content .= "<b>Pending acceptation</b><br />Invited on " . date("M d Y, H:i:s", $war['begin']) . " for " . ($war['end'] > 0 ? (($war['end'] - $war['begin']) / 86400) : "unspecified") . " days. The frag limit is set to " . $war['frags'] . " frags, " . ($war['payment'] > 0 ? "with payment of " . $war['payment'] . " bronze coins." : "without any payment.")."<br />Will expire in three days.";
             break;
         }

          case 3:
         {
             $main_content .= "<s>Canceled invitation</s><br />Sent invite on " . date("M d Y, H:i:s", $war['begin']) . ", canceled on " . date("M d Y, H:i:s", $war['end']) . ".";
             break;
         }

          case 2:
         {
             $main_content .= "Rejected invitation<br />Invited on " . date("M d Y, H:i:s", $war['begin']) . ", rejected on " . date("M d Y, H:i:s", $war['end']) . ".";
             break;
         }

          case 1:
         {
             $main_content .= "<font size=\"12\"><span style=\"color: red;\">" . $war['guild_kills'] . "</span> : <span style=\"color: lime;\">" . $war['enemy_kills'] . "</span></font><br /><br /><span style=\"color: darkred; font-weight: bold;\">On a brutal war</span><br />Began on " . date("M d Y, H:i:s", $war['begin']) . ($war['end'] > 0 ? ", will end up at " . date("M d Y, H:i:s", $war['end']) : "") . ".<br />The frag limit is set to " . $war['frags'] . " frags, " . ($war['payment'] > 0 ? "with payment of " . $war['payment'] . " bronze coins." : "without any payment.");
             break;
         }

          case 4:
         {
             $main_content .= "<font size=\"12\"><span style=\"color: red;\">" . $war['guild_kills'] . "</span> : <span style=\"color: lime;\">" . $war['enemy_kills'] . "</span></font><br /><br /><span style=\"color: darkred;\">Pending end</span><br />Began on " . date("M d Y, H:i:s", $war['begin']) . ", signed armstice on " . date("M d Y, H:i:s", $war['end']) . ".<br />Will expire after reaching " . $war['frags'] . " frags. ".($war['payment'] > 0 ? "The payment is set to " . $war['payment'] . " bronze coins." : "There's no payment set.");
             break;
         }

          case 5:
         {
             $main_content .= "<i>Ended</i><br />Began on " . date("M d Y, H:i:s", $war['begin']) . ", ended on " . date("M d Y, H:i:s", $war['end']) . ". Frag statistics: <span style=\"color: red;\">" . $war['guild_kills'] . "</span> to <span style=\"color: lime;\">" . $war['enemy_kills'] . "</span>.";
             break;
         }

          default:
         {
             $main_content .= "Unknown, please contact with gamemaster.";
             break;
         }
     }

      $main_content .= "<br /><br /><a onclick=\"show_hide('war-details:" . $war['id'] . "'); return false;\" style=\"cursor: pointer;\">» Details «</a></td>
 <td align=\"center\"><a href=\"?subtopic=guilds&action=show&guild=".$e->getId()."\"><img src=\"guilds/".$elogo."\" width=\"64\" height=\"64\" border=\"0\"/><br />".$e->getName()."</a></td>
 </tr>
 <tr id=\"war-details:" . $war['id'] . "\" style=\"display: none; background: " . (is_int($count / 2) ? $config['site']['darkborder'] : $config['site']['lightborder']) . ";\">
 <td colspan=\"3\">";
     if(in_array($war['status'], array(1,4,5)))
     {
         $deaths = $SQL->query('SELECT `pd`.`id`, `pd`.`date`, `gk`.`guild_id` AS `enemy`, `p`.`name`, `pd`.`level`
 FROM `guild_kills` gk
     LEFT JOIN `player_deaths` pd ON `gk`.`death_id` = `pd`.`id`
     LEFT JOIN `players` p ON `pd`.`player_id` = `p`.`id`
 WHERE `gk`.`war_id` = ' . $war['id'] . ' AND `p`.`deleted` = 0
     ORDER BY `pd`.`date` DESC')->fetchAll();
         if(!empty($deaths))
         {
             foreach($deaths as $death)
             {
                 $killers = $SQL->query('SELECT `p`.`name` AS `player_name`, `p`.`deleted` AS `player_exists`, `k`.`war` AS `is_war`
 FROM `killers` k
     LEFT JOIN `player_killers` pk ON `k`.`id` = `pk`.`kill_id`
     LEFT JOIN `players` p ON `p`.`id` = `pk`.`player_id`
 WHERE `k`.`death_id` = ' . $death['id'] . '
     ORDER BY `k`.`final_hit` DESC, `k`.`id` ASC')->fetchAll();
                 $count = count($killers); $i = 0;

                  $others = false;
                 $main_content .= date("j M Y, H:i", $death['date']) . " <span style=\"font-weight: bold; color: " . ($death['enemy'] == $war['guild_id'] ? "red" : "lime") . ";\">+</span>
 <a href=\"/characters/" . urlencode($death['name']) . "\"><b>".$death['name']."</b></a> ";
                 foreach($killers as $killer)
                 {
                     $i++;
                     if($killer['is_war'] != 0)
                     {
                         if($i == 1)
                             $main_content .= "killed at level <b>".$death['level']."</b> by ";
                         else if($i == $count && $others == false)
                             $main_content .= " and by ";
                         else
                             $main_content .= ", ";

                          if($killer['player_exists'] == 0)
                             $main_content .= "<a href=\"/characters/".urlencode($killer['player_name'])."\">";

                          $main_content .= $killer['player_name'];
                         if($killer['player_exists'] == 0)
                             $main_content .= "</a>";
                     }
                     else
                         $others = true;

                      if($i == $count)
                     {
                         if($others == true)
                             $main_content .= " and few others";

                          $main_content .= ".<br />";
                     }
                 }
             }
         }
         else
             $main_content .= "<center>There were no frags on this war so far.</center>";
     }
     else
         $main_content .= "<center>This war did not began yet.</center>";

      $main_content .= "</td>
 </tr>";
 }

  if($count == 0)
     $main_content .= "<tr style=\"background: ".$config['site']['darkborder'].";\">
 <td colspan=\"3\">Currently there are no active wars.</td>
 </tr>";

  $main_content .= "</table>";
 ?>

 

 

 

Creditos :

 

•Elf/OTLand (Por fazer o Script)

•Cakees (Por comprar e trazer ao XTibia)

Link para o comentário
Compartilhar em outros sites

tem os escudos?

 

 

Sim brother, tem os escudos. Se gostou REP+

 

 

Antes de alguem vim reclamar, que eu postei uma coisa que não pode, primeiro olhem, Eu ja vi MODERADORES, do Xtibia, Vendendo

esse system, tenho certeza, que os mesmos, virão aqui reclamar, pois estou postando de graça.

Oque eu estou fazendo, não é Ilegal, Ilegal é oque vocês fazem.. Vender um script que foi criado por outra pessoa.

Isso pra mim é Pirataria.

Sem delongas,

Atenciosamente

Cakes.

Editado por Cakees
Link para o comentário
Compartilhar em outros sites

Bom axo que deveria ter procurado antes de comprar, a alguns dias que postei um War System, se não esta igual, esta muito próximo.

 

Topico War System

 

 

 

além do que esta faltando uma parte

 

-D__WAR_SYSTEM__

 

flz abraço

Editado por Leoprotons
Link para o comentário
Compartilhar em outros sites

  • 6 months later...
  • 1 year later...
  • 2 years later...
×
×
  • Criar Novo...