Ir para conteúdo

Mdcrf

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    Mdcrf recebeu reputação de Leonardo Ozorio em (Resolvido)Maximo de players na guild   
    Boa noite pessoas, mais uma vez venho solicitar ajuda de vocês :|
    se possivel queria limitar o maximo de players em uma guild, no caso, se a guild tiver 30 players não pode invitar mais ninguém...
     
    a script é grande, postei no pastebin
     
    guilds.php
    http://pastebin.com/PuDK0nRb
     
    gesior 2012
    @@@@@@@@@@@@@ edit @@@@@@@@@@@@
     
    encontrei em um outro forum, uma script que limitava mas ela era falha... só que a script da checagem dos membros na guild funciona.
     
    com a script em maos quem entende de PHP consegue fazer de forma simples: no caso pra acessar a pagina
    de aceitar o convite da guild, tenha um IF que se já tiver 30 players na guild a pagina não irá aparecer. pode aparecer uma tela branca ou uma tela com a mensagem: " Esta guild ja atingiu o limite de membros " 
     
    http://baiakhsdfj.com/index.php?subtopic=guilds&action=acceptinvite&guild=95
     
    /\ link da pagina que aceita convite da guild
     
     



     
    Quem entende por favor da um help ai :/
  2. Curtir
    Mdcrf recebeu reputação de Fiapets em (Resolvido)Only moderators and admins can post on news board   
    Depois de ter me virado aqui consegui ! era so editar o if($section_id == 1 && $group_id_of_acc_logged < $group_not_blocked)
                        $errors[] = 'Only moderators and admins can post on news board.';
     
    para
     
    if($section_id == 12345 (ID DA MINHA ACC) && $group_id_of_acc_logged < $group_not_blocked)
                        $errors[] = 'Only moderators and admins can post on news board.';
     
    Podem fechar o tópico!
  3. Gostei
    Achei esse script muito interessante na OTLand e resolvi trazer pra vocês.
     
    Versão: TFS 1.X
    Função: Mostra quanto tempo levou para upar deis de o ultimo level.

     
    Instalação:
    Em "Data/creaturescripts/scripts", copie e cole um arquivo.LUA, renomeie para timeLevel.lua, apague tudo e cole:
    function timeString(timeDiff) local dateFormat = { {"day", timeDiff / 60 / 60 / 24}, {"hour", timeDiff / 60 / 60 % 24}, {"minute", timeDiff / 60 % 60}, {"second", timeDiff % 60} } local out = {} for k, t in ipairs(dateFormat) do local v = math.floor(t[2]) if(v > 0) then table.insert(out, (k < #dateFormat and (#out > 0 and ', ' or '') or ' and ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or '')) end end local ret = table.concat(out) if ret:len() < 16 and ret:find("second") then local a, b = ret:find(" and ") ret = ret:sub(b+1) end return ret end function onAdvance(player, skill, oldlevel, newlevel) if skill ~= SKILL_LEVEL then return true end oldtime = player:getStorageValue(3499) timenow = os.time() if oldtime == -1 then player:setStorageValue(3499, timenow) else player:sendTextMessage(MESSAGE_INFO_DESCR, "It took you " .. timeString(timenow - oldtime) .. " to advance in level from your last advance.") player:setStorageValue(3499, timenow) end return true end Novamente em "Data/creaturescripts/scripts", abra o arquivo login.lua e registre:
    player:registerEvent("timelevel") Agora em "Data/creaturescripts", abra o arquivo creaturescripts.xml e adicione:
    <event type="advance" name="timelevel" script="timelevel.lua"/>  
     
    Créditos: Ahilphino
  4. Gostei
    Mdcrf deu reputação a xWhiteWolf em Voodoo   
    Aeeeeeee carai, hoje vim trazer pra vocês meu mais novo sistema *-*. É uma fodenda spell que você seleciona alguém pra ser seu voodoo e a partir disso durante um tempo X ela vai receber todos os hit's que você deveria receber... INCRÍVEL, NÃO?
    Agora se nesse meio tempo ela deslogar ou entrar em pz você vai tomar o dano normal, mas se ainda tiver nesse tempo X e ela sair ela vai receber o dano instantaneamente (É BOM DEMAIS PRA SER VERDADE).

    Agora você deve estar imaginando, e se eu usar a magia pra transferir o dano pra um amigo e ele fizer a mesma coisa em mim, pra onde vai o dano?
    PRA LUGAR NENHUM!!!! Até porque eu já me previni contra esse bug fazendo com que não seja possível fazer alguém de voodoo se ele já tiver alguém de voodoo.
    Testado em versão 8.54 TFS Crying Damnson mas deve funcionar em todas as versões que tenham a função onStatsChange no creaturescripts.
    Bom, o script tá 100% funcional e livre de bugs (se vc achar algum eu te dou 3 REP).

    Agora vamos à mágica:
     
    Crie um arquivo em mods com extensão .xml e adiciona isso daqui nele
    <?xml version="1.0" encoding="UTF-8"?> <mod name="Voodoo System" version="1.0" author="Night Wolf" contact="none" enabled="yes"> ------------------------------------------------------------------------------------ <config name="feitisso"><![CDATA[ configuration = { storage = 24567,  tempo = 20, cooldown = 45, effect1 = 13, effect2 = 65 } storagecool = 24568 ]]></config> ---------------------------------------------------------------------------------- <event type="login" name="registerVoodoo" event="script"><![CDATA[ function onLogin(cid) domodlib('feitisso') if getPlayerStorageValue(cid, configuration.storage) > 0 then doPlayerSendTextMessage(cid, 22, "Your victim is not receiving your hits anymore.") doPlayerSetStorageValue(cid, configuration.storage, 0) end registerCreatureEvent(cid,"voodoo") return true end ]]></event> ------------------------------------------------------------------------------------ <instant name="Feitiço" words="voodoo" lvl="50" mana="10" prem="1" range="3" needtarget="1" blockwalls="1" exhaustion="1000" needlearn="0" event="script"> <vocation id="5"/> <vocation id="6"/> <vocation id="7"/> <vocation id="8"/> <![CDATA[ function onCastSpell(cid, var) domodlib('feitisso') if not (isPlayer(variantToNumber(var))) then doPlayerSendCancel(cid, "You can only use this spell in players.") return false end if getPlayerStorageValue(variantToNumber(var), configuration.storage) > 0 then doPlayerSendCancel(cid, "You can't make a voodoo of someone who already has a voodoo.") return false end if (os.time() - getPlayerStorageValue(cid, storagecool)) >= configuration.cooldown then if getPlayerStorageValue(cid, configuration.storage) <= 0 then timeleft = (os.time() + configuration.cooldown) doPlayerSetStorageValue(cid, storagecool, timeleft) local target = getPlayerGUID(variantToNumber(var)) doPlayerSetStorageValue(cid, configuration.storage, target) doSendMagicEffect(getPlayerPosition(cid), configuration.effect1) doSendMagicEffect(getThingPos(variantToNumber(var)), configuration.effect1) addEvent(function()   if isCreature(cid) then doSendMagicEffect(getPlayerPosition(cid), configuration.effect2) doPlayerSendTextMessage(cid, 22, "Your victim is not receiving your hits anymore.") doPlayerSetStorageValue(cid, configuration.storage, 0) end  end, 100+1000*configuration.tempo) elseif getPlayerStorageValue (cid, configuration.storage) > 0 then doPlayerSendCancel(cid, "You've already set a target.") end else doPlayerSendCancel(cid, "Your skill is in cooldown, you must wait "..(configuration.cooldown - (os.time() - getPlayerStorageValue(cid, storagecool))).." seconds.") end return true end ]]></instant> ------------------------------------------------------------------------------------ <event type="statschange" name="voodoo" event="script"><![CDATA[ function onStatsChange(cid, attacker, type, combat, value) domodlib('feitisso') if isPlayer(cid) and (not (attacker == cid)) and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) and getPlayerStorageValue(cid, configuration.storage) >= 1 then local name = getPlayerNameByGUID(getPlayerStorageValue(cid, configuration.storage)) local victim = getCreatureByName(name) if isCreature(victim) and not (getTilePzInfo(getPlayerPosition(victim)))  then dano = math.ceil(value) doSendMagicEffect(getPlayerPosition(cid), configuration.effect2) if attacker == victim then doTargetCombatHealth(cid, victim, combat, -dano, -dano, configuration.effect2) else doTargetCombatHealth(attacker, victim, combat, -dano, -dano, configuration.effect2) end return false end end return true end ]]></event> ------------------------------------------------------------------------------------ </mod> aqui você edita os storages da magia e do cooldown, além do tempo que ela dura, o tempo de cooldown (um uso e outro) e os efeitos que vão sair.
    -------------------------------------------------------------------------------------------------------------
     
    aqui você edita o nome da spell, as palavras pra ela sair, level, custo de mana, se é preciso ser premium pra usar, o range dela, e as vocações que podem usá-la.

    OBS: se vc quiser que essa spell seja ganha em uma quest (por se tratar de algo bastante apelativo), é só colocar needlearn = "1" e fazer uma quest pra ganhar a spell (tem no meu Darkness Pact Quest uma quest de ganhar Spell, é só ir lá no meu perfil e procurar o tópico).

    Essa spell não serve somente pra ATS, use a criatividade pra criar uma história e fazer ela se encaixar... foque nos elementos de RPG e tcharam, está feito!.

    Façam bom uso e espero que não saiam postando em outros lugares sem os devidos créditos. Abraços do lobinho pra vcs

    PS: a foto ficou meio bosta mas vou postar mesmo assim 

     
    Eu (sorc) ataquei a zuera e tomei o dano de volta e ainda saiu esse efeitinho bonito. 

    Espero que tenham gostado e usem essa spell como base pra fazer outras coisas maravilhosas pra esse fórum   
    E não esqueça de clicar em "gostei" caso tenha curtido a idéia.

    Ahhh, e antes que eu me esqueça dos agradecimentos:
    @ViitinG por me ajudar a testar
    @CreatServer por me dar a idéia
    @MaXwEllDeN por me orientar a trocar a table pelo storage possibilitando que o script fosse possível.
  5. Gostei
    É sinal que você não leu o tópico onde baixou o site, bem no início do tópico tem falando sobre isso, volte la e leia com atenção.
  6. Gostei
    Mdcrf deu reputação a Wakon em Death System 2016 versão frag consecutivo!   
    Sistema maneiro. Tópico aprovado, obrigado por compartilhar.
    Você recebeu um REP pela contribuição.
  7. Gostei
    Mdcrf deu reputação a Lyu em Death System 2016 versão frag consecutivo!   
    Fala rapaziada, quanto tempo sem publicar algo aqui! Bom, hoje eu venho trazer um sisteminha que é bem utilizado atualmente.
    Estou falando o Death System! Porém, com algumas coisinhas a mais.
     
    Testado em OTX Server 8.60..
     
    Como funciona?
    O Death System em alguns servidores possui um channel chamado "Mortes" ou "Death Channel",
    mas há alguns servidores que preferem que seja anunciado no default mesmo e a função é informar
    quem matou quem, ou quem foi morto por certo monstro.
     
    O que há de novo?
    Bom, agora quem matar x jogadores(configurável) e essa quantia for uma consecutiva, será anunciado isso :

     
    E se algum jogador derrotá-lo dentro a consecutiva, será anunciado isso :

     
    Vamos ao sistema :
    em data/XML/channels.xml, adicione isso :
    <channel id="15" name="Death Channel"/> em data/creaturescripts/creaturescripts.xml :
    <event type="death" name="deathchannel" event="script" value="deathchannel.lua"/> em data/creaturescripts/login.lua, adicione isso antes do último return true :
    registerCreatureEvent(cid, "deathchannel") em data/creaturescripts/scripts, crie um arquivo deathchannel.lua e cole isso dentro :
    -- Coded by Zoom.. local info, win, lose = "%s [Level: %s] foi mort%s pelo %s %s%s", "%s obteve %s frags seguidos após derrotar %s.", "%s acabou de impedir que %s fizesse uma sequência de %s frags seguidos." local frags, storage = {10, 15, 20, 25, 30, 35, 40, 45, 50}, 30045 function onDeath(cid, corpse, deathList) if(not isPlayer(cid)) then return true end local target = deathList[1] doCreatureSetStorage(target, storage, getCreatureStorage(target, storage) + (getCreatureStorage(target, storage) == -1 and 2 or 1)) for _, pid in ipairs(getPlayersOnline()) do doPlayerSendChannelMessage(pid, '', info:format(getCreatureName(cid), getPlayerLevel(cid), getPlayerSex(cid) == 1 and "o" or "a", isPlayer(target) and "player" or "monstro", getCreatureName(target), isPlayer(target) and " [Level: "..getPlayerLevel(target).."]." or "."), TALKTYPE_CHANNEL_ORANGE, 0xF) for _, frag in ipairs(frags) do if(getCreatureStorage(target, storage) == frag) then doPlayerSendChannelMessage(pid, '', win:format(getCreatureName(target), frag, getCreatureName(cid)), TALKTYPE_CHANNEL_MANAGEMENT, 0xF) end if(getCreatureStorage(cid, storage) >= frag) then doPlayerSendChannelMessage(pid, '', lose:format(getCreatureName(target), getCreatureName(cid), getCreatureStorage(cid, storage)+1), TALKTYPE_GAMEMASTER_CHANNEL, 0xF) end end end doCreatureSetStorage(cid, storage, 0) return true end Há uma única configuração, que é as consecutivas :
    local frags = {10, 15, 20, 25, 30, 35, 40, 45, 50}
    completou 10 frags? anuncia! e assim sucessivamente..
     
    Créditos : EU
  8. Gostei
    Mdcrf deu reputação a Lyu em Death System 2016 versão frag consecutivo!   
    de nada, eu que agradeço pela aprovação!
  9. Gostei
    Mdcrf deu reputação a Natanael Beckman em ShopGuild Points 100% add em player offline. Atualizado   
    Ok mare e muito obrigado pelos agradecimentos poucos sabem o que é isso e quanto nos incentiva.
    Valeu meu amigo!
  10. Gostei
    Mdcrf deu reputação a Natanael Beckman em ShopGuild Points 100% add em player offline. Atualizado   
    Obrigatoriamente leia tudo!
    Atualizado 01/07/2014
     
    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.)
     
    Em data/globalevents/scripts crie um arquivo chamado shopguild.lua e adicione o code a seguir:
    local SHOP_MSG_TYPE = MESSAGE_EVENT_ORANGE local SQL_interval = 30 function onThink(interval, lastExecution)         local result_plr = db.getResult("SELECT * FROM z_ots_guildcomunication WHERE `type` = 'login';")         if(result_plr:getID() ~= -1) then                 while(true) do                         local id = tonumber(result_plr:getDataInt("id"))                         local action = tostring(result_plr:getDataString("action"))                         local delete = tonumber(result_plr:getDataInt("delete_it"))                         local cid = getCreatureByName(tostring(result_plr:getDataString("name")))                         if isPlayer(cid) then                                 local itemtogive_id = tonumber(result_plr:getDataInt("param1"))                                 local itemtogive_count = tonumber(result_plr:getDataInt("param2"))                                 local container_id = tonumber(result_plr:getDataInt("param3"))                                 local container_count = tonumber(result_plr:getDataInt("param4"))                                 local add_item_type = tostring(result_plr:getDataString("param5"))                                 local add_item_name = tostring(result_plr:getDataString("param6"))                                 local received_item = 0                                 local full_weight = 0                                 if add_item_type == 'container' then                                         container_weight = getItemWeightById(container_id, 1)                                         if isItemRune(itemtogive_id) == TRUE then                                                 items_weight = container_count * getItemWeightById(itemtogive_id, 1)                                         else                                                 items_weight = container_count * getItemWeightById(itemtogive_id, itemtogive_count)                                         end                                         full_weight = items_weight + container_weight                                 else                                         full_weight = getItemWeightById(itemtogive_id, itemtogive_count)                                         if isItemRune(itemtogive_id) == TRUE then                                                 full_weight = getItemWeightById(itemtogive_id, 1)                                         else                                                 full_weight = getItemWeightById(itemtogive_id, itemtogive_count)                                         end                                 end                                 local free_cap = getPlayerFreeCap(cid)                                 if full_weight <= free_cap then                                         if add_item_type == 'container' then                                                 local new_container = doCreateItemEx(container_id, 1)                                                 local iter = 0                                                 while iter ~= container_count do                                                         doAddContainerItem(new_container, itemtogive_id, itemtogive_count)                                                         iter = iter + 1                                                 end                                                 received_item = doPlayerAddItemEx(cid, new_container)                                         else                                                 local new_item = doCreateItemEx(itemtogive_id, itemtogive_count)                                                 doItemSetAttribute(new_item, "description", "This item can only be used by the player ".. getPlayerName(cid) .."!")                                                 doItemSetAttribute(new_item, "aid", getPlayerGUID(cid)+10000)                                                 received_item = doPlayerAddItemEx(cid, new_item)                                         end                                         if received_item == RETURNVALUE_NOERROR then                                                 doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, 'You received >> '.. add_item_name ..' << from OTS GuildShop.')                                                 db.executeQuery("DELETE FROM `z_ots_guildcomunication` WHERE `id` = " .. id .. ";")                                                 db.executeQuery("UPDATE `z_shopguild_history_item` SET `trans_state`='realized', `trans_real`=" .. os.time() .. " WHERE id = " .. id .. ";")                                         else                                                 doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, '>> '.. add_item_name ..' << from OTS GuildShop is waiting for you. Please make place for this item in your backpack/hands and wait about '.. SQL_interval ..' seconds to get it.')                                         end                                 else                                         doPlayerSendTextMessage(cid, SHOP_MSG_TYPE, '>> '.. add_item_name ..' << from OTS GuildShop is waiting for you. It weight is '.. full_weight ..' oz., you have only '.. free_cap ..' oz. free capacity. Put some items in depot and wait about '.. SQL_interval ..' seconds to get it.')                                 end                         end                         if not(result_plr:next()) then                                 break                         end                 end                 result_plr:free()         end         return true end Em data/globalevents/globalevents.xml adicione a seguinte tag:
    <globalevent name="shopguild" interval="300" event="script" value="shopguild.lua"/> 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`)) CREATE TABLE IF NOT EXISTS `z_ots_guildcomunication` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(255) NOT NULL,   `type` varchar(255) NOT NULL,   `action` varchar(255) NOT NULL,   `param1` varchar(255) NOT NULL,   `param2` varchar(255) NOT NULL,   `param3` varchar(255) NOT NULL,   `param4` varchar(255) NOT NULL,   `param5` varchar(255) NOT NULL,   `param6` varchar(255) NOT NULL,   `param7` varchar(255) NOT NULL,   `delete_it` int(2) NOT NULL DEFAULT '1',   PRIMARY KEY (`id`) ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13107; 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
    z_ots_comunication para z_ots_guildcomunication
     
    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>"; Em shopsystem.php procure por:
            elseif($action == 'show_history') {                 if(!$logged) {                         $main_content .= 'Please login first.';                 } else{                         $items_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_item').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($items_history_received)) {                                 foreach($items_history_received as $item_received) {                                         if($account_logged->getId() == $item_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $items_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$item_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $item_received['from_account'])                                                 $items_received_text .= '<i>Your account</i>';                                         else                                                 $items_received_text .= $item_received['from_nick'];                                                                                                 $items_received_text .= '</td><td>'.$item_received['offer_id'].'</td><td>'.$item_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $item_received['trans_start']).'</td>';                                                                                                                                                                                                         if($item_received['trans_real'] > 0)                                                 $items_received_text .= '<td>'.date("j F Y, H:i:s",$item_received['trans_real']).'</td>';                                         else                                                 $items_received_text .= '<td><b><font color="red">Not realized yet.</font></b></td>';                                                 $items_received_text .= '</tr>';                                 }                         }                         $paccs_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_pacc').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($paccs_history_received)) {                                 foreach($paccs_history_received as $pacc_received) {                                         if($account_logged->getId() == $pacc_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $paccs_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$pacc_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $pacc_received['from_account'])                                                 $paccs_received_text .= '<i>Your account</i>';                                         else                                                 $paccs_received_text .= $pacc_received['from_nick'];                                                 $paccs_received_text .= '</td><td>'.$pacc_received['pacc_days'].' days</td><td>'.$pacc_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $pacc_received['trans_real']).'</td></tr>';                                 }                         }                         $main_content .= '<center><h1>Transactions History</h1></center>';                         if(!empty($items_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="6"><font color="white" size="4"><b>&nbsp;Item Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Offer name</b></td><td><b>Cost</b></td><td><b>Bought on page</b></td><td><b>Received on '.$config['server']['serverName'].'</b></td></tr>'.$items_received_text.'</table><br />';                         if(!empty($paccs_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="5"><font color="white" size="4"><b>&nbsp;Pacc Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Duration</b></td><td><b>Cost</b></td><td><b>Added:</b></td></tr>'.$paccs_received_text.'</table><br />';                         if(empty($paccs_received_text) && empty($items_received_text))                                 $main_content .= 'You did not buy/receive any items or PACC.';                 }         } Troque por:
            elseif($action == 'show_history') {                 if(!$logged) {                         $main_content .= 'Please login first.';                 } else{                         $items_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_item').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($items_history_received)) {                                 foreach($items_history_received as $item_received) {                                         if($account_logged->getId() == $item_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $items_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$item_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $item_received['from_account'])                                                 $items_received_text .= '<i>Your account</i>';                                         else                                                 $items_received_text .= $item_received['from_nick'];                                                                                                 $items_received_text .= '</td><td>'.$item_received['offer_id'].'</td><td>'.$item_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $item_received['trans_start']).'</td>';                                                                                                                                                                                                         if($item_received['trans_real'] > 0)                                                 $items_received_text .= '<td>'.date("j F Y, H:i:s",$item_received['trans_real']).'</td>';                                         else                                                 $items_received_text .= '<td><b><font color="red">Not realized yet.</font></b></td>';                                                 $items_received_text .= '</tr>';                                 }                         }                         $itemsguild_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shopguild_history_item').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($itemsguild_history_received)) {                                 foreach($itemsguild_history_received as $itemguild_received) {                                         if($account_logged->getId() == $itemguild_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $itemsguild_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$itemguild_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $itemguild_received['from_account'])                                                 $itemsguild_received_text .= '<i>Your account</i>';                                         else                                                 $itemsguild_received_text .= $itemguild_received['from_nick'];                                                                                                 $itemsguild_received_text .= '</td><td>'.$itemguild_received['offer_id'].'</td><td>'.$itemguild_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $itemguild_received['trans_start']).'</td>';                                                                                                                                                                                                         if($itemguild_received['trans_real'] > 0)                                                 $itemsguild_received_text .= '<td>'.date("j F Y, H:i:s",$itemguild_received['trans_real']).'</td>';                                         else                                                 $itemsguild_received_text .= '<td><b><font color="red">Not realized yet.</font></b></td>';                                                 $itemsguild_received_text .= '</tr>';                                 }                         }                         $paccs_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shop_history_pacc').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($paccs_history_received)) {                                 foreach($paccs_history_received as $pacc_received) {                                         if($account_logged->getId() == $pacc_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $paccs_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$pacc_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $pacc_received['from_account'])                                                 $paccs_received_text .= '<i>Your account</i>';                                         else                                                 $paccs_received_text .= $pacc_received['from_nick'];                                                 $paccs_received_text .= '</td><td>'.$pacc_received['pacc_days'].' days</td><td>'.$pacc_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $pacc_received['trans_real']).'</td></tr>';                                 }                         }                         $paccsguild_history_received = $SQL->query('SELECT * FROM '.$SQL->tableName('z_shopguild_history_pacc').' WHERE '.$SQL->fieldName('to_account').' = '.$SQL->quote($account_logged->getId()).' OR '.$SQL->fieldName('from_account').' = '.$SQL->quote($account_logged->getId()).';');                         if(is_object($paccsguild_history_received)) {                                 foreach($paccsguild_history_received as $paccguild_received) {                                         if($account_logged->getId() == $paccguild_received['to_account'])                                                 $char_color = 'green';                                         else                                                 $char_color = 'red';                                                 $paccsguild_received_text .= '<tr bgcolor="#F1E0C6"><td><font color="'.$char_color.'">'.$paccguild_received['to_name'].'</font></td><td>';                                         if($account_logged->getId() == $paccguild_received['from_account'])                                                 $paccsguild_received_text .= '<i>Your account</i>';                                         else                                                 $paccsguild_received_text .= $paccguild_received['from_nick'];                                                 $paccsguild_received_text .= '</td><td>'.$paccguild_received['pacc_days'].' days</td><td>'.$paccguild_received['price'].' Points</td><td>'.date("j F Y, H:i:s", $paccguild_received['trans_real']).'</td></tr>';                                 }                         }                         $main_content .= '<center><h1>Transactions History</h1></center>';                         if(!empty($items_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="6"><font color="white" size="4"><b>&nbsp;ShopServer Item Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Offer name</b></td><td><b>Cost</b></td><td><b>Bought on page</b></td><td><b>Received on '.$config['server']['serverName'].'</b></td></tr>'.$items_received_text.'</table><br />';                         if(!empty($itemsguild_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="6"><font color="white" size="4"><b>&nbsp;ShopGuild Item Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Offer name</b></td><td><b>Cost</b></td><td><b>Bought on page</b></td><td><b>Received on '.$config['server']['serverName'].'</b></td></tr>'.$itemsguild_received_text.'</table><br />';                         if(!empty($paccs_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="5"><font color="white" size="4"><b>&nbsp;ShopServer VIP Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Duration</b></td><td><b>Cost</b></td><td><b>Added:</b></td></tr>'.$paccs_received_text.'</table><br />';                         if(!empty($paccsguild_received_text))                                 $main_content .= '<center><table BORDER=0 CELLPADDING=1 CELLSPACING=1 WIDTH=95%><tr width="100%" bgcolor="#505050"><td colspan="5"><font color="white" size="4"><b>&nbsp;ShopGuild VIP Transactions</b></font></td></tr><tr bgcolor="#D4C0A1"><td><b>To:</b></td><td><b>From:</b></td><td><b>Duration</b></td><td><b>Cost</b></td><td><b>Added:</b></td></tr>'.$paccsguild_received_text.'</table><br />';                         if(empty($paccs_received_text) && empty($items_received_text))                                 $main_content .= 'You did not buy/receive any items or PACC.';                         if(empty($paccsguild_received_text) && empty($itemsguild_received_text))                                 $main_content .= 'You did not buy/receive any items or PACC.';                 }         } 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 conseguir 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 meus 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.
  11. Gostei
    Mdcrf deu reputação a Lyu em CHANGEGOLD   
    Olá humanos, tudo certo? estou maior tempão sem frequentar o fórum devido a falta de internet em meu humilde notebook então resolvi entrar esses últimos dias para postar este CHANGEGOLD que acho bem legal e útil, principalmente para quem vende itens de preços altíssimos em seus servidores.

    Como usar? : fácil, apenas clique nos seus 100 crystal coins e em seguida se tornará 1 rare coin ou qualquer nome que você escolher pois no padrão está rare coin.
     
    1º - abra o seu items.xml e digite CTRL+F, em seguida procure pelo id : 9971 e troque esta tag :     <item id="9971" article="a" name="gold ingot">         <attribute key="weight" value="1800" />     </item> por esta :     <item id="9971" article="a" name="rare coin" plural="rare coins">         <attribute key="weight" value="10" />         <attribute key="worth" value="1000000" />     </item> 2º vai em actions/actions.xml e digite CTRL+F, em seguida procure por : changegold e adicione esta tag em baixo :     <action itemid="9971" event="script" value="other/changegold.lua"/> 3ª vai em actions/scripts/others e abra o ficheiro changegold.lua em seguida apague tudo que tem dentro e coloque isto : local coins = {     [2148] = {         to = 2152, effect = 210     },     [2152] = {         from = 2148, to = 2160, effect = 130     },     [2160] = {         from = 2152, to = 9971, effect = 65     },     [9971] = {         from = 2160, effect = 198     } } function onUse(cid, item, fromPosition, itemEx, toPosition)     if(getPlayerFlagValue(cid, PLAYERFLAG_CANNOTPICKUPITEM)) then         return false     end     local coin = coins[item.itemid]     if(not coin) then         return false     end     if(coin.to ~= nil and item.type == ITEMCOUNT_MAX) then         doChangeTypeItem(item.uid, item.type - item.type)         doPlayerAddItem(cid, coin.to, 1)         doSendAnimatedText(fromPosition, "+ $$$", coins[coin.to].effect)     elseif(coin.from ~= nil) then         doChangeTypeItem(item.uid, item.type - 1)         doPlayerAddItem(cid, coin.from, ITEMCOUNT_MAX)         doSendAnimatedText(fromPosition, "- $$$", coins[coin.from].effect)     end     return true end pronto meu caro amigo, tudo funcionará perfeitamente lembrando que você poderá depositar os seus rare coins, comprar itens no NPC e etc.. tudo porque cada rare coin tem um valor de 1,000,000 gold coins.

    creditos : Halls Santos
  12. Gostei
    tudo certo cara, eu que tenho que pedir desculpas, o erro foi meu uhsauhs fazer as coisas correndo não é muito bom não :/ mas eu já resolvi, abra o arquivo monster.lua e apague tudo o que tem dentro, em seguida adicione o seguinte código :
    local config = { monster = 'Dragon', -- nome do monstro. count = 9, -- quantidade que deverá matar, configure sempre 1 a menos. position = {x = 1086, y = 1062, z = 7} -- posição que o player irá após matar todos os monstros. } function onKill(cid, target) if isPlayer(target) then return true end if getPlayerStorageValue(cid, 50000) < config.count and getCreatureName(target) == config.monster then setPlayerStorageValue(cid, 50000, getPlayerStorageValue(cid, 50000)+1) doPlayerSendTextMessage(cid, 19, ""..config.monster.."'s : ["..getPlayerStorageValue(cid, 50000).."/"..((config.count)+1).."]") elseif getPlayerStorageValue(cid, 50000) >= config.count and getCreatureName(target) == config.monster then doTeleportThing(cid, config.position, true) doSendMagicEffect(getThingPos(cid), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, 22, 'Todos os monstros foram derrotados.') doPlayerSendTextMessage(cid, 19, ""..config.monster.."'s : [Finish]") setPlayerStorageValue(cid, 50000, 0) return true end return true end
  13. Gostei
    Mdcrf deu reputação a luanluciano93 em [Gesior2012] Painel de Acessos.   
    Olá amigos, hoje vou ensinar como fazer um painel de acessos, 

    Mas Luan, que painel é esse?
    • Basicamente é um sistema interno do site, você cria uma pasta 'acessos', o sistema cria todos os dias um arquivo de texto e nomeia o arquivo com a data do dia atual (exemplo: 05-03-2014.txt), dentro desse arquivo de texto ficará todos as acessos do dia.  Ele mostra o ip do computador que acessou, hora e minuto do acesso, conta do jogador (se ele estiver logado na conta) e url que ele acessou.

    Mas Luan, para que eu vou usar isso?
    • Você pode usar para várias coisa, desde pegar o ip pelo horário de um ataque, ou até usar apenas para monitoramento de quem acessa o site.

    Mas Luan, isso ae só pega em Gesior, e ainda a versão 2012?
    • Não, isso serve para qualquer site, sendo de tibia ou não, mas para instala-lo necessita de um pouquinho de conhecimento na area.

    Abaixo vou ensinar como instalar no gesior2012 ... 

    Primeiramente, crie uma pasta 'acessos' no diretório (pasta www ou htdocs) do seu site.
    Depois vá na pasta 'system' e abra o arquivo 'load.compat.php', no final dele adicione esse código:
     
    ################################################################################################# ################### SISTEMA DE ACESSOS BY LUANLUCIANO93 ########################## ################################################################################################# if($logged) { $acc = $account_logged->getCustomField('name'); } else { $acc = 'NO LOGOUT';} $ip = $_SERVER['REMOTE_ADDR']; $data = date("d-m-y"); $hora = date("H-i-s"); $myFile = './acessos/'. $data .'.txt'; $fh = fopen($myFile, 'a') or die('Erro ao abrir o arquivo.'); $url = $_SERVER['HTTP_REFERER']; $stringData = "$hora (hour) ------ IP:{$ip} ----- $acc ----- $url \n"; fwrite($fh, $stringData); fclose($fh); #################################### END ######################################################## E pronto, simples assim! Dá um F5 e olha na pasta 'acessos'.

    É isso ae pessoal, espero que tenham gostado. Abração e até mais.
  14. Gostei
    Mdcrf deu reputação a gpedro em [Gesior2012] Painel de Acessos.   
    Se quiser monitoramento de quem acessa seu site, utilize algum Analytics. Em relação ao ataque, acho pouco provável... pode ser se seja uma ataque distribuído e você acabará não sabendo quem é o agente causador.
     
    Para manter uma alta disponiblidade, eu recomendaria utilizar Cloudflare... porque mesmo se o site estiver offline, o Cloudflare mostra o cache do site.
  15. Gostei
    Mdcrf deu reputação a Nightz em Lost Account funcionando com MailGun (HTTP API)   
    Olá cidadãos do TibiaKing!

    Como tenho visto muitas pessoas tendo problemas com o sistema de envio de e-mail do Lost Account através do PHP Mailer, resolvi postar pra vocês uma pequena alteração que fiz no código para utilizar o MailGun no disparo dos e-mails no lugar de um SMTP convencional. 

    Alguns avisos:
    O MailGun é uma plataforma estrangeira, que estou indicando por ter uma API de fácil entendimento. Não sou responsável pela plataforma ou suporte da mesma. O plano grátis do MailGun suporta 10.000 envios por mês. Caso você não tenha um domínio para utilizar (no-ip não é considerado como domínio), terá que fazer os envios através do sandbox deles, que permite 300 envios por hora, limitados a 10.000 por mês.
    Para começar o tutorial, se cadastre na plataforma do MailGun aqui: https://mailgun.com/signup (depois que cadastrar, confirme sua conta através do link enviado por e-mail)

    Em seguida, adicione seu domínio aqui: https://mailgun.com/app/domains/new
    Para confirmar seu domínio, será necessário criar algumas entradas de DNS que estarão explicadas na página do MailGun.

    Assim que o domínio for adicionado, clique no mesmo. (Caso não tenha domínio, clique no domínio sandbox).

    Precisaremos dos seguintes dados para continuar:  API Key API Base URL Default SMTP Login
    Depois que obtiver os dados acima, abra o arquivo lostaccount.php e procure pela seguinte parte de código: $mail = new PHPMailer(); if ($config['site']['smtp_enabled']) { $mail->IsSMTP(); $mail->Host = $config['site']['smtp_host']; $mail->Port = $config['site']['smtp_port']; $mail->SMTPAuth = $config['site']['smtp_auth']; $mail->Username = $config['site']['smtp_user']; $mail->Password = $config['site']['smtp_pass']; } $mail->IsMail(); $mail->IsHTML(true); $mail->From = $config['site']['mail_address']; $mail->AddAddress($account->getCustomField('email')); $mail->Subject = $config['server']['serverName']." - Link to >set new password to account<"; $mail->Body = $mailBody; $enviado = $mail->Send(); if($enviado) { $account->set('email_code', $newcode); $account->set('next_email', (time() + $config['site']['email_lai_sec_interval'])); $account->save(); $main_content .= '<br />Link with informations needed to set new password has been sent to account e-mail address. You should receive this e-mail in 15 minutes. Please check your inbox/spam directory.'; } else { $account->set('next_email', (time() + 60)); $account->save(); $main_content .= '<br />An error occorred while sending email! Try again or contact with admin. ('.$mail->ErrorInfo.')'; }Remova todo esse código e substitua por:             $to = ''.$account->getCustomField('email').'';                         $subject = ''.$config['server']['serverName'].' - Set >new password to account<'; $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, 'api:SUA API KEY'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_URL, 'https://api.mailgun.net/v2/SEUDOMINIO/messages'); curl_setopt($ch, CURLOPT_POSTFIELDS, array('from' => 'SEU OT <[email protected]>', 'to' => $to, 'subject' => $subject, 'html' => $mailBody, 'text' => $mailBody)); $result = curl_exec($ch); $info = curl_getinfo($ch); curl_close($ch); if($info['http_code'] == 200){ $account->set('email_code', $newcode); $account->set('next_email', (time() + $config['site']['email_lai_sec_interval'])); $account->save(); $main_content .= '<br />Link with informations needed to set new password has been sent to account e-mail address. You should receive this e-mail in 15 minutes. Please check your inbox/spam directory.'; }E em seguida altere as seguintes linhas para configurar de acordo com sua conta:curl_setopt($ch, CURLOPT_USERPWD, 'api:key-xxxxxxx'); //Substitua key-xxxxxxx pela sua API Key 'https://api.mailgun.net/v2/SEUDOMINIO/messages'); //Altere SEUDOMINIO com o domínio que se encontra no final da API Base URL array('from' => 'SEU OT <[email protected]>', //Substitua pelo nome e e-mail do jogo (caso tenha domínio). Caso não tenha domínio, utilize o e-mail que está em Default SMTP Login
    E pronto, seu Lost Account já estará funcionando normalmente!


    Observações: O código final tem algumas modificações para facilitar na configuração e na utilização, mas como a versão final foi desenvolvida para venda, resolvi postar uma versão simplificada que resolve o problema. É necessário ter o PHP cURL funcionando para usar esse método. O código foi feito em cima do Gesior 2012: https://github.com/gesior/Gesior2012 Façam bom proveito

    (Esse tutorial foi completamente escrito por mim, incluindo o código. Qualquer cópia deve ser previamente autorizada e conter os devidos créditos.)
  16. Gostei
    Mdcrf deu reputação a leozynho123 em [Tutorial] Push de longe sem exausted   
    Boa noite galera, depois de muitas fuçadas em forums e ajuda de algumas pessoas, consegui tirar o delay do push de longe no caso ( + de 1 sqm do player)
     
    Bom.. vamos lá !
     
    Em OTX Server ,
     
    Em game.cpp procure por 
    " boost::bind(&Game::playerMoveCreature, this, playerId, movingCreatureId, movingCreaturePos, toPos, false)); "
     
    aonde está "false" estará na sua sources ORIGINAL "true" então no caso a palavra "true" (ativa a função) "false" (desativa a função)
     
    ~~
     
    TFS 0.4
     
    Em game.cpp procure por 
    " boost::bind(&Game::playerMoveCreature, this, playerId, movingCreatureId, movingCreaturePos, toPos, false)); "
     
    aonde está "false" estará na sua sources ORIGINAL "true" então no caso a palavra "true" (ativa a função) "false" (desativa a função)
     
    (É a mesma coisa da OTX porém no TFS 0.4 a função está um pouco diferente)
     
    OBS: este tutorial é para alterar a velocidade do push em longa distancia, no caso 1 sqm + do outro player, para alterar o push "colado" ao player é em config.lua "pushCreatureDelay"
     
    É isso galera, qualquer dúvida só perguntar
     
    Créditos:
    Leonardo
    FireElement
  17. Gostei
    Mdcrf deu reputação a luanluciano93 em (Resolvido)Maximo de players na guild   
    Veja essa etapa de aceitar invites: https://github.com/gesior/Gesior2012/blob/TFS-0.4_rev_3703%2B/pages/guilds.php#L645-L761

    Talvez se colocar uma condição: 
    SE (TOTAL_MEMBROS >= 30) ENTÃO RETORNA ERRO Depois dessa checagem: 
    if(!check_name($name)) $guild_errors[] = 'Invalid name format.'; Coloco que isso: 
    $guildMembers = $SQL->query('SELECT COUNT(`gr`.`id`) AS `total` FROM `players` AS `p` LEFT JOIN `guild_ranks` AS `gr` ON `gr`.`id` = `p`.`rank_id` WHERE `gr`.`guild_id` = '.$guild->getId() )->fetch(); if($guildMembers['total'] >= 30) $guild_errors[] = 'The guild is already on its members limit.'; Eu não testei, talvez funcione!
  18. Gostei
    Mdcrf deu reputação a luanluciano93 em [Projeto] New Styller   
    Fazendo remake do site ... 
    Em breve novidades .. 
  19. Gostei
    Mdcrf deu reputação a Caronte em (Resolvido)Se tiver storages X ou Y não pode usar utana vid.   
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local condition = createConditionObject(CONDITION_INVISIBLE) setConditionParam(condition, CONDITION_PARAM_TICKS, 200000) setCombatCondition(combat, condition) function onCastSpell(cid, var) for i = 4000, 4020 do if getPlayerStorageValue(cid, i) > -1 then doPlayerSendCancel(cid, "Essa magia não pode ser usada nesse evento.") doSendMagicEffect(getThingPos(cid), CONST_ME_POFF) return false end end return doCombat(cid, combat, var) end Poste a tag do outro script.
  20. Gostei
    Mdcrf deu reputação a Wakon em (Resolvido){Pedido} Tile para castle24h   
    Testei agora e está funcionando:
    function onStepIn(cid, item, position, fromPosition) if not isPlayer(cid) then return true end local g_storage = getGlobalStorageValue(123123) if g_storage ~= getPlayerGuildId(cid) then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) doSendMagicEffect(getPlayerPosition(cid), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você foi teleportado ao templo, parece que outra guild dominou o castelo.") end end Se der problema, avise.
  21. Gostei
    Mdcrf deu reputação a Wakon em (Resolvido){Pedido} Tile para castle24h   
    Testa ai:
    function onStepIn(cid, item, position, fromPosition) if not isPlayer(cid) then return true end local g_storage = getGlobalStorageValue(123123) if not g_storage == getPlayerGuildId(cid) then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid))) doSendMagicEffect(getPlayerPosition(cid), CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você foi teleportado ao templo, parece que outra guild dominou o castelo.") end end
  22. Gostei
    Mdcrf deu reputação a Lyu em Anti Divulgação em LUA   
    Então, antes de eu ver o teu post eu estava estudando a função no manual. O seu script ficou correto, porém você adicionou um return true em uma função em que qualquer palavra digitada pelo player, executa o script. Então creio que o player irá ficar mudo, né? ahsuahau eu mechi no script e achei um modo melhor de evitar alguns bugs bobos. Mas obrigado pr ajudar, é sempre bom tirarmos conclusões.
  23. Gostei
    Mdcrf deu reputação a Lyu em Anti Divulgação em LUA   
    Sim! Desde o mesmo feito pelo luan nas sources, esse sistema possui essa coisa chata que é bloquear strings concatenadas com as que estao nas tabelas.

    Morgaroth possui "org";
    Internet possui "net".

    isso é chatinho né? :v kk mas depois eu faço uma modificação e se der um bom resultado, eu atualizo o tópico.
  24. Gostei
    Mdcrf deu reputação a Lyu em Anti Divulgação em LUA   
    Testado apenas em TFS 0.4
     
    Em "Data/talkactions", no arquivo talkactions.xml, adicione a tag:
    <talkaction default="yes" filter="quotation" logged="no" hidden="yes" event="script" value="antidiv.lua"/> Em "Data/talkactions/scripts", crie um arquivo.LUA e renomeie para antidiv.lua, apague tudo e cole:
    local words_, prev = {"org","no-ip","net","com","pl","biz","servegame","br","sytes","info"}, {".",",",";"} function onSay(cid, words)         for _, w in ipairs(words_) do         for _, p in ipairs(prev) do             if(words:lower():find(p..''..w, 1, true)) then                 return doPlayerSendCancel(cid, 'You can\'t send this message.')                 end         end     end end Na tabela prev..
     
    Você pode adicionar na tabela, o que vem antes de "net", "org" e etc..
    ex : se eu adicionar um til "~", não vai dá pra divulgar assim : "www.etcetc~org"
    {".",",",";"} Já existem 'ponto', 'vírgula' e 'ponto e vírgula' dentro da tabela.
    Então é impossível divulgar dos seguintes modos :
     
    entrem aqui otfodao.com
    entrem nesse ot baiakzikaofodapakas,com
    novo ot lançado hoje, entrem www.otnoob;net
     
     
    Créditos : EU
  25. Gostei
    Mdcrf deu reputação a Wise em (Resolvido)globalevent mensagem programada   
    Esqueci de te avisar que em algumas versões os globalevents executam o interval em segundos, e em outras, em milissegundos (como o seu).
    O script está sem erros. Basta alterar na tag, onde está 60 (segundos = 1 minuto) por 60000 (milissegundos = 60 segundos = 1 minuto) ou como preferir, desde que seja em milissegundos (este será o tempo de intervalo de execução do script).

     
     
    Por um acaso, seu script está quase igual ao meu. Só uma diferença, o seu faz uso desnecessário de funções.
    Pra quê usar o metamétodo tostring se a função orientada a objetos :sub já retorna uma substring?
    Está semelhante ao uso que o VodkArt fez, portanto não deve ser seu.

Informação Importante

Confirmação de Termo