Aldeia RPG

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Suporte ao desenvolvimento de jogos


+20
Haseo
Doubleacont
srgeh01
Adanrox
wiferdgot
Ero-Sennin
agaceli1
Luizkaio100
Pablo Kawan
urbios
bielmegatrinf
Maephel
leoXP
Jonny
Paulo Soreto
GallighanMaker
Hashirama
Valentine
Komuro Takashi
blackcrow
24 participantes

    Level Ranking

    blackcrow
    blackcrow
    Semi-Experiente
    Semi-Experiente


    Mensagens : 111
    Créditos : 41

    Level Ranking Empty Level Ranking

    Mensagem por blackcrow Qua Nov 26, 2014 10:04 pm

    Alguns membros pediram esse script e decidi fazer para expandir meu conhecimento e também contribuir para o fórum.

    Script


    - A janela que exibe o ranking possuí "páginas", onde em cada página é exibida uma lista com 10 nicks no ranking.
    - Se o arquivo do ranking não foi encontrado ou não pode ser lido no server, será exibida a mensagem Ranking indisponível na janela do ranking.
    - Enquanto o ranking é carregado, será exibida a mensagem Loading... na janela.
    - Se o jogador excluir um personagem da conta, esse personagem será excluído automaticamente do ranking.
    - O ranking será salvo na pasta Rank(no server) em um arquivo de texto nomeado ranking, salvos nesse formato: level:nome,level:nome,...

    Imagens



    Spoiler:


    Instalação


    * Netplay

    - Cole o script acima do main:
    Código:
    #===============================================================================
    # * Level Ranking - Netplay Master 4.9
    #-------------------------------------------------------------------------------
    # Autor       blackcrow
    # Versão      alpha - 26/11/2014
    # Original de www.aldeiarpg.com
    #===============================================================================
    class Window_Rank < Window_Base
      
      def initialize
        super(25,35,190,256)
        self.contents = Bitmap.new(158,228)
        self.back_opacity = 200
        self.z = 9999
        self.visible = false
        self.active = false
        @title = Title.new(self,'Ranking')
        @nextb = Button.new(self,134,220,'>>'){next_page}
        @prevb = Button.new(self,14,220,'<<'){prev_page}
        @loading = false
        @dragable = true
        @closable = true
      end
      
      def update
        if @loading and Network::Main.rank
          @loading = false
          load
        end
        super
        @title.update
      end
      
      def request
        @nextb.visible = false
        @nextb.active = false
        @prevb.visible = false
        @prevb.active = false
        self.contents.clear
        self.contents.draw_text(0,28,158,64,'Loading...',1)
        @loading = true
        Network::Main.request_rank(50)
      end
      
      def load
        data = Network::Main.rank
        if data != '0'
          @list = data.split(',')
          @pages = (@list.size.to_f/10.0).ceil
          @index = 1
          if @pages > 1
            @nextb.visible = true
            @nextb.active = true
          end
          refresh
        else
          self.contents.clear
          self.contents.draw_text(0,28,158,64,'Ranking indisponível',1)
        end
      end
      
      def next_page
        @index += 1
        if @index == @pages
          @nextb.visible = false
          @nextb.active = false
        end
        unless @prevb.visible
          @prevb.visible = true
          @prevb.active = true
        end
        refresh
      end
      
      def prev_page
        @index -= 1
        if @index == 1
          @prevb.visible = false
          @prevb.active = false
        end
        unless @nextb.visible
          @nextb.visible = true
          @nextb.active = true
        end
        refresh
      end
      
      def refresh
        self.contents.clear
        lim = 10*@index
        y = 0
        for i in lim-10...@list.size
          break if i == lim
          sep = @list[i].index(':')
          self.contents.draw_text(0,y*16,158,64,sprintf("%s. %s",(i+1).to_s,@list[i][sep+1..-1]))
          self.contents.draw_text(0,y*16,158,64,sprintf("Lv. %s",@list[i][0..sep-1]),2)
          y += 1
        end
        self.contents.draw_text(0,182,158,64,sprintf("Pag. %s de %s",@index.to_s,@pages.to_s),1)
      end
    end
    #===============================================================================
    # ** Scene_Map
    #===============================================================================
    class Scene_Map
      
      alias alias_main_draw     main_draw
      alias alias_update        update
      alias alias_dispose       dispose
      alias alias_windows_area? windows_area?
      
      def main_draw
        @rank_window = Window_Rank.new
        @rank_icon = Icon.new(nil,'rank','Ranking',310,444,'Ranking(R)'){@rank_window.visible=true;@rank_window.active=true;@rank_window.request}
        alias_main_draw
      end
      
      def windows_area?
        return unless $scene.is_a?(Scene_Map)
        return true if @rank_window.visible and @rank_window.in_area?
        alias_windows_area?
      end
      
      def update
        @rank_icon.update
        @rank_window.update if @rank_window.visible
        if Input.triggerd?(Input::Letters['R'])
          unless box_active
            unless @rank_window.visible
              @rank_window.visible = true
              @rank_window.active = true
              @rank_window.request
            else
              @rank_window.visible = false
              @rank_window.active = false
            end
          end
        end
        alias_update
      end
      
      def dispose
        @rank_icon.dispose
        @rank_window.dispose
        alias_dispose
      end
    end
    #===============================================================================
    # ** Game_Actor
    #===============================================================================
    class Game_Actor < Game_Battler
      
      alias alias_level level=
      
      def level=(level)
        alias_level(level)
        Network::Main.socket.send("<41a>1,#{level}:#{@name}\n") if $scene.is_a?(Scene_Map) and level >= 10
      end
      
    end
    #===============================================================================
    # ** Network
    #===============================================================================
    module Network
      
      class Main
        
        class << self
          
          alias alias_update_ingame update_ingame
          
          def update_ingame(line)
            case line
              when /<41>(.*)<\/41>/
                unless $1 == ''
                  @rank = $1
                else
                  @rank = '0'
                end
              return true
            end
            alias_update_ingame(line)
          end
        
          def rank
            @rank
          end
          
          def request_rank(qt)
            @rank = nil
            @socket.send("<41>#{qt}\n")
          end
        end
      end
    end
    - No script Window_Delete procure o método delete_char e abaixo de:
    Código:
    return if Account.character[$scene.select_char_id-1] == nil
    Adicione:
    Código:
    Network::Main.socket.send("<41a>2,#{Account.character[$scene.select_char_id-1].name}\n") if Account.character[$scene.select_char_id-1].level >= 10
    - Salve essa imagem Level Ranking AjEjrrW (ou outra) na pasta Icons com o nome rank.

    * Servidor

    - Na pasta do servidor crie uma nova pasta chamada Rank.
    - No script functions.lua adicione o código abaixo antes do penúltimo end do script.
    Código:
    -------------------------------
    -- Level Ranking - Server side
    -- By blackcrow
    -------------------------------
    -- Update ranking
    elseif cmd == "<41a>" then
      do
        data = string.gsub(data,"<41a>","")
        local f = io.open("Rank/ranking.txt","r")
        if string.sub(data,1,1) == '1' then
          if not f then
            data = string.sub(data,3)
            f = io.open("Rank/ranking.txt","w")
            f:write(data..',')
            f:close()
            return
          end
          local buff = f:read("*all")
          f:close()
          local sep = string.find(data,':')
          local char = string.sub(data,sep+1)
          local lvl = string.sub(data,3,sep-1)
          local list = {}
          local find = true
          local i = 0
          for lv, ch in string.gmatch(buff,"(%d+):(%w+),") do
            if find and char == ch then
              lv = lvl
              find = false
            end
            list[ch] = tonumber(lv)
          end
          if find then
            list[char] = tonumber(lvl)
          end
          local levels = {}
          for ch in pairs(list) do
            i = i + 1
            levels[i] = list[ch]
          end
          table.sort(levels,function(a,b) return a > b end)
          f = io.open("Rank/ranking.txt","w")
          for i=1, #levels do
            for ch, lv in pairs(list) do
              if lv == levels[i] then
                f:write(lv..':'..ch..',')
                list[ch] = nil
                break
              end
            end
          end
          f:close()
        else
          if not f then return end
          local buff = f:read("*all")
          f:close()
          data = string.sub(data,3)
          buff = string.gsub(buff,"%d+:"..data..',',"")
          f = io.open("Rank/ranking.txt","w")
          f:write(buff)
          f:close()
        end
      end
    --
    -- Load ranking
    elseif cmd == "<41>" then
      do
        data = string.gsub(data,"<41>","")
        local f = io.open("Rank/ranking.txt","r")
        if not f then
          NP():SendToUser(user.id,"<41>0</41>\n")
          return
        end
        local buff = f:read("*all")    
        f:close()
        local qt = tonumber(data)
        local ranking = {}
        local i = 0
        for rank in string.gmatch(buff,"([^,]+)") do
          i = i + 1
          ranking[i] = rank
          if i == qt then
            break
          end
        end
        NP():SendToUser(user.id,"<41>"..table.concat(ranking,',').."</41>\n")
      end
    --

    Configuração


    - Você pode configurar quantos rankings serão exibidos/carregados, para isso procure a linha:
    Código:
    Network::Main.request_rank(50)
    Basta mudar o valor entre parênteses.
    - Também pode alterar o level mínimo para que o jogador seja listado no ranking, para isso procure a linha:
    Código:
    Network::Main.socket.send("<41a>1,#{level}:#{@name}\n") if $scene.is_a?(Scene_Map) and level >= 10
    Mude o valor que está na condição level >= 10 ou remova essa condição para permitir qualquer level. Também precisa alterar essa condição no script Window_Delete, nele procure a linha:
    Código:
    Network::Main.socket.send("<41a>2,#{Account.character[$scene.select_char_id-1].name}\n") if Account.character[$scene.select_char_id-1].level >= 10
    Coloque o mesmo valor da condição do passo anterior em .level >= 10 ou remova if Account.character[$scene.select_char_id-1].level >= 10


    Notas


    - Coloque no máximo 70 ranks para serem carregados, pois o script no server ainda não compacta os dados para serem enviados ao usuário.

    Créditos


    blackcrow - Criador


    Última edição por blackcrow em Qui Nov 27, 2014 12:21 pm, editado 2 vez(es)
    Komuro Takashi
    Komuro Takashi
    Colaborador
    Colaborador


    Mensagens : 1047
    Créditos : 130

    Level Ranking Empty Re: Level Ranking

    Mensagem por Komuro Takashi Qui Nov 27, 2014 6:50 am

    Parabéns Crow sempre ajudando você é um Bom Scripter...veio como que não queria nada e hoje ajuda muito...

    @off-topic : consegui arrumar o pet global plug em play com seu script class << self só agora que eu entendi essa funcionalidade Obrigado.


    _________________
    Level Ranking Takashi_komuro_by_minato8-d51g9o4

    Paga um café? Patreon
    Valentine
    Valentine
    Administrador
    Administrador


    Medalhas : Level Ranking ZgLkiRU
    Mensagens : 5336
    Créditos : 1163

    Level Ranking Empty Re: Level Ranking

    Mensagem por Valentine Qui Nov 27, 2014 8:03 am

    Muito bom cara

    + 1 crédito
    Hashirama
    Hashirama
    Membro de Honra
    Membro de Honra


    Mensagens : 413
    Créditos : 133

    Level Ranking Empty Re: Level Ranking

    Mensagem por Hashirama Qui Nov 27, 2014 11:27 am

    Bem bacana mano
    +1Crédito


    _________________
    Apoia nosso projeto? use nossa assinatura
    GallighanMaker
    GallighanMaker
    Colaborador
    Colaborador


    Medalhas : Level Ranking ZgLkiRU
    Mensagens : 985
    Créditos : 102

    Ficha do personagem
    Nível: 1
    Experiência:
    Level Ranking Left_bar_bleue0/0Level Ranking Empty_bar_bleue  (0/0)
    Vida:
    Level Ranking Left_bar_bleue30/30Level Ranking Empty_bar_bleue  (30/30)

    Level Ranking Empty Re: Level Ranking

    Mensagem por GallighanMaker Qui Nov 27, 2014 11:32 am

    Parabéns blackcrow, chegou do nada e é muito bacana com a galera, sempre ajudando e ótimo script, muita gente precisa disso em seus jogos. +1 credito. Só faltou uma print de como fica o Ranking Very Happy abraço.


    _________________
    Level Ranking 8dVK0ku
    using C# and import Python developer || Expert in Unity Engine IDE. || Level Ranking 769_heart 2D pixel games.
    blackcrow
    blackcrow
    Semi-Experiente
    Semi-Experiente


    Mensagens : 111
    Créditos : 41

    Level Ranking Empty Re: Level Ranking

    Mensagem por blackcrow Qui Nov 27, 2014 12:24 pm

    Tá aí os prints.
    Um ranking é algo essencial para um jogo.
    Paulo Soreto
    Paulo Soreto
    Lenda
    Lenda


    Mensagens : 1980
    Créditos : 367

    Ficha do personagem
    Nível: 1
    Experiência:
    Level Ranking Left_bar_bleue0/0Level Ranking Empty_bar_bleue  (0/0)
    Vida:
    Level Ranking Left_bar_bleue30/30Level Ranking Empty_bar_bleue  (30/30)

    Level Ranking Empty Re: Level Ranking

    Mensagem por Paulo Soreto Qui Nov 27, 2014 12:55 pm

    Não tive oportunidade de analisar os códigos, mas pelo que vi você fez (muito bem) uso do servidor da forma correta, deixando para o client apenas a renderização sem ter que processar as informações, re-organizar e tal.
    Espero que esse script sirva de inspiração e modelo para os que querem criar sistemas para o netplay.


    _________________
    Level Ranking FwYnoXI
    Jonny
    Jonny
    Aldeia Friend
    Aldeia Friend


    Medalhas : Level Ranking Trophy11Level Ranking 9P5Gx
    Mensagens : 1936
    Créditos : 327

    Level Ranking Empty Re: Level Ranking

    Mensagem por Jonny Qui Nov 27, 2014 2:35 pm

    muy bien blackcrow, veo que las dudas que haclaramos el otro dia sirbieron de algo para crear el sistema Very Happy

    PD : Tambien puede ser mejorado el script, no use una windo_normal, use una window_selectabel, queda mas mejor Very Happy

    PD2 : Tambien usted puede modificar el rankin para guild, para os player que estan baneados, ou son  VIP's o los admin, ecet... Very Happy


    _________________
    Spoiler:


    Level Ranking KVIdx
    leoXP
    leoXP
    Ocasional
    Ocasional


    Mensagens : 219
    Créditos : 5

    Ficha do personagem
    Nível: 1
    Experiência:
    Level Ranking Left_bar_bleue0/0Level Ranking Empty_bar_bleue  (0/0)
    Vida:
    Level Ranking Left_bar_bleue30/30Level Ranking Empty_bar_bleue  (30/30)

    Level Ranking Empty Re: Level Ranking

    Mensagem por leoXP Qui Nov 27, 2014 6:30 pm

    Gostei +1 cred eu tava precisando dele vlw
    blackcrow
    blackcrow
    Semi-Experiente
    Semi-Experiente


    Mensagens : 111
    Créditos : 41

    Level Ranking Empty Re: Level Ranking

    Mensagem por blackcrow Sex Nov 28, 2014 11:10 am

    Não vejo o por que de usar uma Window_Selectable, seria mais processamento em vão.

    Obrigado a todos pelos comentários.

    Conteúdo patrocinado


    Level Ranking Empty Re: Level Ranking

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Sex Abr 26, 2024 7:47 pm