Alguns membros pediram esse script e decidi fazer para expandir meu conhecimento e também contribuir para o fórum.
- 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,...
- No script functions.lua adicione o código abaixo antes do penúltimo end do script.
- Você pode configurar quantos rankings serão exibidos/carregados, para isso procure a linha:
- Também pode alterar o level mínimo para que o jogador seja listado no ranking, para isso procure a linha:
- 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.
Script
- 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
- Código:
return if Account.character[$scene.select_char_id-1] == nil
- 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
* 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
- Código:
Network::Main.request_rank(50)
- 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
- 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
Notas
Créditos
blackcrow - Criador
Última edição por blackcrow em Qui Nov 27, 2014 3:21 pm, editado 2 vez(es)