Jump to content

Recommended Posts

Obrigatoriamente leia tudo!

Opa galera mais uma vez eu trazendo o melhor para todos.
Hoje vou postar o sistema de Guild de Points que eu utilizo em meu OTserver, acredito que dificilmente será encontrado por ae um tão completo e sem bugs igual o que será postado logo abaixo, é um sistema completo que é utilizado pelo líder da guild executando um comando que, se tiver de acordo com as regras que seram feitas por você, todos os membros da guild iram receber os pontos uma unica vez, lembrando que quando os pontos são adicionados a um player ele não receberá entrando em outra guild e não receberá criando outro personagem na conta, resumindo ele só receberá uma unica vez na conta e com um player só. E um dos detalhes que me causava dor de cabeça era que quando um líder executava o comando, quem estava online recebia os pontos, mais quem estava offline não recebia, isso acontecia normalmente porque tem guilds que contém 50, 70, 100 players, portanto nem sempre todos estavam online. O comando só pode ser executado uma vez por dia cada guild, para não gerar processamentos desnecessários e assim um mal funcionamento do servidor.

Cada administrador pode configurar seu sistema da forma que quiser, por ser um sistema muito simples, você pode bota que todos os players estejam no minimo level x, que a guild só possa executar o comando quando estiver quantidade x de players online, isso é bom porque traz um certa dificuldade para fraudes de pontos, e o sistema só vira bagunça dependendo do que você vai oferecer no seu shop guild, eu particularmente só utilizei esse comando porque muitas guilds grandes pediam pontos, eles me cobravam uma quantidade x de pontos e eu cobrava uma quantidade x de player então pra automatizar o processo e não ter dor de cabeça foi feito todo esse sistema. Se você analisar bem vai ver que tudo isso só gera mais crescimento ao seu servidor.
Bom, vamos ao sistema:

Em talkactions.xml, adicione a tag abaixo:

      <talkaction words="!guildpoints" event="script" value="guildpoints.lua"/>
Na pasta talkactions/scripts faça um .lua com o nome guildpoints e dentro dele adicione os coder abaixo:
GuildPointsConfigs =
{
        ExecuteIntervalHours = 24,
        NeedPlayersOnline = 10,
        NeedDiferentIps = 6,
        MinLevel = 80,
        AddPointsForAcc = 9
}


function getGuildPlayersValidAccIDS(GuildID, MinLevel)
        local RanksIDS = {}
        local AccsID = {}
        local ValidAccsID = {}
        Query1 = db.getResult("SELECT `id` FROM `guild_ranks` WHERE guild_id = '".. GuildID .."'")
        if(Query1:getID() == -1) then
                return ValidAccsID
        end
        for i = 1, Query1:getRows() do
                table.insert(RanksIDS, Query1:getDataInt("id"))
                Query1:next()
        end
        Query2 = db.getResult("SELECT `account_id` FROM `players` WHERE `rank_id` IN (".. table.concat(RanksIDS, ', ') ..") AND `level` >= ".. MinLevel .."")
        if(Query2:getID() == -1) then
                return ValidAccsID
        end
        for i = 1, Query2:getRows() do
                local AccID = Query2:getDataInt("account_id")
                if #AccsID > 0 then
                        for k = 1, #AccsID do
                                if AccID == AccsID[k] then
                                        AddAccList = false
                                        break
                                end
                                AddAccList = true
                        end
                        if AddAccList then
                                table.insert(AccsID, AccID)
                        end
                else
                        table.insert(AccsID, AccID)
                end
                Query2:next()
        end
        Query3 = db.getResult("SELECT `id` FROM `accounts` WHERE `guild_points_stats` = 0 AND `id` IN (".. table.concat(AccsID, ', ') ..")")
        if(Query3:getID() == -1) then
                return ValidAccsID
        end
        for i = 1, Query3:getRows() do
                local AccID = Query3:getDataInt("id")
                if #ValidAccsID > 0 then
                        for k = 1, #ValidAccsID do
                                if AccID == ValidAccsID[k] then
                                        AddAccList = false
                                        break
                                end
                                AddAccList = true
                        end
                        if AddAccList then
                                table.insert(ValidAccsID, AccID)
                        end
                else
                        table.insert(ValidAccsID, AccID)
                end
                Query3:next()
        end
        return ValidAccsID
end


function onSay(cid, words, param, channel)
        if(getPlayerGuildLevel(cid) == 3) then
                local GuildID = getPlayerGuildId(cid)
                Query = db.getResult("SELECT `last_execute_points` FROM `guilds` WHERE id = '".. GuildID .."'")
                if(Query:getID() == -1) then
                        return true
                end
                if Query:getDataInt("last_execute_points") < os.time() then
                        local GuildMembers = {}
                        local GuildMembersOnline = {}
                        local PlayersOnline = getPlayersOnline()
                        for i, pid in ipairs(PlayersOnline) do
                                if getPlayerGuildId(pid) == GuildID then
                                        if getPlayerLevel(pid) >= GuildPointsConfigs.MinLevel then
                                                table.insert(GuildMembersOnline, pid)
                                        end
                                end
                        end
                        if #GuildMembersOnline >= GuildPointsConfigs.NeedPlayersOnline then
                                local IPS = {}
                                for i, pid in ipairs(GuildMembersOnline) do
                                        local PlayerIP = getPlayerIp(pid)
                                        if #IPS > 0 then
                                                for k = 1, #IPS do
                                                        if PlayerIP == IPS[k] then
                                                                AddIPList = false
                                                                break
                                                        end
                                                        AddIPList = true
                                                end
                                                if AddIPList then
                                                        table.insert(IPS, PlayerIP)
                                                end
                                        else
                                                table.insert(IPS, PlayerIP)
                                        end
                                end
                                if #IPS >= GuildPointsConfigs.NeedDiferentIps then
                                        local ValidAccounts = getGuildPlayersValidAccIDS(GuildID, GuildPointsConfigs.MinLevel)
                                        db.executeQuery("UPDATE `guilds` SET `last_execute_points` = ".. os.time() +(GuildPointsConfigs.ExecuteIntervalHours * 3600) .." WHERE `guilds`.`id` = ".. GuildID ..";")
                                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "".. #ValidAccounts .." Players received points")
                                        if #ValidAccounts > 0 then
                                                db.executeQuery("UPDATE `accounts` SET `guild_points` = `guild_points` + " ..GuildPointsConfigs.AddPointsForAcc .. ", `guild_points_stats` = ".. os.time() .." WHERE `id` IN (" .. table.concat(ValidAccounts, ',') ..");")
                                                for i, pid in ipairs(GuildMembersOnline) do
                                                        local PlayerMSGAccID = getPlayerAccountId(pid)
                                                        for k = 1, #ValidAccounts do
                                                                if PlayerMSGAccID == ValidAccounts[k] then
                                                                        doPlayerSendTextMessage(pid, MESSAGE_INFO_DESCR, "You received "..GuildPointsConfigs.AddPointsForAcc .." guild points.")
                                                                        break
                                                                end
                                                        end
                                                end
                                        end
                                else
                                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Only ".. #IPS .." players are valid, you need ".. GuildPointsConfigs.NeedDiferentIps .." players with different ips.")
                                end
                        else
                                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Has only ".. #GuildMembersOnline .." players online you need ".. GuildPointsConfigs.NeedPlayersOnline .." players online at least from level ".. GuildPointsConfigs.MinLevel ..".")
                        end
                else
                        doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "The command can only be run once every "..GuildPointsConfigs.ExecuteIntervalHours .." hours.")
                end
        else
                doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Only guild leader can request points.")
        end
        return true
end

No coder acima bem no inicio tem as linhas seguintes para configurar:

ExecuteIntervalHours = 24, ( Intervalo para execução do comando, ae está de 24 em 24hrs)
NeedPlayersOnline = 10, (Quantos players é preciso está online para poder executar o comando.)
NeedDiferentIps = 6, (Quantos IPS diferentes são necessários para executar o comando no exemplo ae tem 6.)
MinLevel = 80, (Aqui adicione o level minimo, é necessário que todos os player da guild tenha o level pedido para o lider executar o comando.)
AddPointsForAcc = 9, (Aqui é a quantidade de pontos para adicionar em cada player da guild.)

Certo, a parte do servidor é esta, ta feita, vamos adicionar a database o coder a seguir:

                 ALTER TABLE `accounts` ADD `guild_points` INTEGER(11) NOT NULL DEFAULT 0;
                ALTER TABLE `accounts` ADD `guild_points_stats` INT NOT NULL DEFAULT '0';
                 ALTER TABLE `guilds` ADD `last_execute_points` INT NOT NULL DEFAULT '0';
                  CREATE TABLE `z_shopguild_offer` (
                        `id` int(11) NOT NULL auto_increment,
                        `points` int(11) NOT NULL default '0',
                        `itemid1` int(11) NOT NULL default '0',
                        `count1` int(11) NOT NULL default '0',
                        `itemid2` int(11) NOT NULL default '0',
                        `count2` int(11) NOT NULL default '0',
                        `offer_type` varchar(255) default NULL,
                        `offer_description` text NOT NULL,
                        `offer_name` varchar(255) NOT NULL,
                        `pid` INT(11) NOT NULL DEFAULT '0',
                  PRIMARY KEY (`id`))
                  CREATE TABLE `z_shopguild_history_item` (
                        `id` int(11) NOT NULL auto_increment,
                        `to_name` varchar(255) NOT NULL default '0',
                        `to_account` int(11) NOT NULL default '0',
                        `from_nick` varchar(255) NOT NULL,
                        `from_account` int(11) NOT NULL default '0',
                        `price` int(11) NOT NULL default '0',
                        `offer_id` int(11) NOT NULL default '0',
                        `trans_state` varchar(255) NOT NULL,
                        `trans_start` int(11) NOT NULL default '0',
                        `trans_real` int(11) NOT NULL default '0',
                  PRIMARY KEY (`id`))
                  CREATE TABLE `z_shopguild_history_pacc` (
                        `id` int(11) NOT NULL auto_increment,
                        `to_name` varchar(255) NOT NULL default '0',
                        `to_account` int(11) NOT NULL default '0',
                        `from_nick` varchar(255) NOT NULL,
                        `from_account` int(11) NOT NULL default '0',
                        `price` int(11) NOT NULL default '0',
                        `pacc_days` int(11) NOT NULL default '0',
                        `trans_state` varchar(255) NOT NULL,
                        `trans_start` int(11) NOT NULL default '0',
                        `trans_real` int(11) NOT NULL default '0',
                  PRIMARY KEY (`id`))

Olha estamos quase finalizando tudo, só precisamos terminar a parte de web.
O meu GuildShop eu copiei meu shopsystem.php e fiz umas modificações, simples você pode fazer o mesmo é menos trabalhoso.
Copie o shopsystem.php renomeie para shopguild.php, após abra-o e modifique como manda a seguir:

shop_system para shopguild_system
premium_points para guild_points

premium points para guild points
z_shop_offer para z_shopguild_offer
shopsystem para shopguild
z_shop_history_pacc para z_shopguild_history_pacc
z_shop_history_item para z_shopguild_history_item

 

Ou utilize este já pronto:

shopguild.php

 

O shopguildadmin.php esté no link abaixo, basta fazer o mesmo procedimento:

shopguildadmin.php

 

Em index.php add:

case "shopguild";
   $topic = "Shop Guild";
   $subtopic = "shopguild";
   include("shopguild.php");
break;
case "shopguildadmin";
   $topic = "ShopGuild Admin";
   $subtopic = "shopguildadmin";
   include("shopguildadmin.php");
break;

Vá em config.php adicione:

$config['site']['shopguild_system'] = 1;
$config['site']['access_adminguild_panel'] = 9;

Vá em layouts.php adicione abaixo de buypoints:

                                <a href='?subtopic=shopguild'>
                                        <div id='submenu_shopguild' 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_shopguild' class='ActiveSubmenuItemIcon'style='background-image:url(<?PHP echo $layout_name; ?>/images/menu/icon-activesubmenu.gif);'></div>
                                                <div class='SubmenuitemLabel'>Shop Guild</div>
                                                <div class='RightChain' style='background-image:url(<?PHP echo $layout_name; ?>/images/general/chain.gif);'></div>
                                        </div>
                                </a>

Em layouts.php add depois do shopadmin:

if($group_id_of_acc_logged >= $config['site']['access_adminguild_panel']) 
echo "<a href='?subtopic=shopadmin'>
                                   <div id='submenu_shopguildadmin' class='Submenuitem' onMouseOver='MouseOverSubmenuItem(this)'onMouseOut='MouseOutSubmenuItem(this)'>
                                          <div class='LeftChain' style='background-image:url(".$layout_name."/images/general/chain.gif);'></div>
                                          <div id='ActiveSubmenuItemIcon_shopguildadmin' class='ActiveSubmenuItemIcon'style='background-image:url(".$layout_name."/images/menu/icon-activesubmenu.gif);'></div>
                                          <div class='SubmenuitemLabel'><font color=red>! ShopGuild Admin !</font></div>
                                         <div class='RightChain' style='background-image:url(".$layout_name."/images/general/chain.gif);'></div>
                                   </div>
                            </a>";

Finalmente terminamos!
Bom todo esse processo é feito só para facilitar tudo pra você e o player e pra diferenciar o Shop System do Shop Guild, porque um sustenta as despesas do server e o outro atrai player, porque pra ter player é preciso ter player.

Galera acredito que não esteja faltando nada, espero que gostem e tudo que eu poder fazer para nossas melhoras estarei postando, me desculpem meu erros de português mais o que importa aqui é o script está correto, abraços!


Créditos:
Natanael Beckman
LukeSkywalker (Raphael Luiz) .lua 100%
Não proíbo ninguém de copia o tópico só peço que onde você adicione inclua os créditos mencionados.

Edited by GM Bekman
Link to comment
Share on other sites

Será que isso poderia ser feito in-game com um NPC ? pois meu servidor é Sqlite então não tenho site tem como desenvolver um NPC para esse sistema ?

Claro que é possivel desenvolver um NPC para esse sistema porem precisa de um scripter que saiba mexer bem com LiveSQL e conheça bem o .LUA, eu ja parei de mexer com a area atualmente estou ocupado com outras coisas então não mexo mais.

Link to comment
Share on other sites

Cara aqui deu um erro na página mais eu resolvi executano essa query.

 

ALTER TABLE  `accounts` ADD  `guild_points` INTEGER NOT NULL DEFAULT 0

 

quem tiver o mesmo problema me da rep xd

Link to comment
Share on other sites

  • 4 weeks later...
  • 3 weeks later...

muito bom

 

ExecuteIntervalHours = 24, ( Intervalo para execução do comando, ae está de 24 em 24hrs)

 

 

se deixar 24h um cara executa dps so 24hr pra outro executa?

Link to comment
Share on other sites

×
×
  • Create New...