Server:
1º - Abra o arquivo constants.lua e no final dele a
- Código:
PACKETRESPAWNINIT = '<80>'
PACKETNEEDRESPAWN = '<81>'
PACKETNEEDREVIVE = '<82>'
2º - Abra o arquivo player.lua, substitua a função update por esta:
- Código:
function Player:update()
if self.charnum > 0 then
-- Se morreu
if self.isdead then
if os.clock() - self.respawntime >= PLAYERRESPAWN then
self:gameover()
end
else
self:autorecovery()
end
elseif not self.handshake and os.time() >= self.handshaketime + HANDSHAKETIME then
self.socket:close()
Server:disconnectplayer(self.index)
end
end
2º - No mesmo arquivo, procure por: function Player:gameover()
3º - Abaixo disso adicione: self.isdead = false
4º - Adicione o seguinte código ao final do arquivo senddata.lua:
- Código:
--
-- sendrespawn
--
-- Envia um sinal para que o jogador seja revivido.
--
-- @param index índice do jogador
-- @param data dados
--
function TcpServer:sendrespawninit(index)
self:sendtoplayer(index, PACKETRESPAWNINIT)
end
4º - Abra o arquivo handledata.lua e procure por: elseif header == PACKETVARIABLE
5º - Abaixo dessa linha adicione:
- Código:
elseif header == PACKETNEEDRESPAWN then self:handleneedrespawn(index, player)
elseif header == PACKETNEEDREVIVE then self:handleneedrevive(index, player)
6º - Ao final do mesmo arquivo adicione:
- Código:
--
-- handleneedrespawn
--
-- Processa o pedido de respawn.
--
-- @param index índice do jogador
-- @param player jogador
--
function TcpServer:handleneedrespawn(index, player)
if player.isdead then
player:gameover()
end
end
--
-- handleneedrevive
--
-- @param index índice do jogador
-- @param player jogador
--
function TcpServer:handleneedrevive(index, player)
player.isdead = false
Server:transferplayer(player, player.mapid, player.x, player.y, 2)
player:updatevitals(player.maxhp, player.maxsp)
end
7º - No mesmo arquivo procure por: player.hp = player.hp - damage
8º - Abaixo disso adicione:
- Código:
if player.hp <= 0 and player.isdead == false then
player.respawntime = os.clock()
player.isdead = true
self:sendrespawninit(index)
end
Client
1º - No script [ND] Network, procure por: PACKET_ADMIN_COMMAND = '<39>'
2º - Abaixo disso adicione:
PACKET_RESPAWN_INIT = '<80>'
PACKET_NEED_RESPAWN = '<81>'
PACKET_NEED_REVIVE = '<82>'
3º - No script [ND] Handle_Data, procure por: when PACKET_ADMIN_COMMAND; handle_admin_command(data)
4º - Abaixo dele adicione: when PACKET_RESPAWN_INIT; handle_respawn_init
5º - No mesmo script, antes do último end adicione:
- Código:
#--------------------------------------------------------------------------
# * Inicia o procedimento de respawn
# data : dados
#--------------------------------------------------------------------------
def handle_respawn_init
return unless $scene.is_a?(Scene_Map)
$windows[:respawn].show
end
6º - No script [ND] Send_Data, antes do último end adicione:
- Código:
#--------------------------------------------------------------------------
# * Envia um pedido de respawn.
#--------------------------------------------------------------------------
def need_respawn
@socket.send("#{PACKET_NEED_RESPAWN}\n")
end
#--------------------------------------------------------------------------
# * Envia um pedido de ressurreição.
#--------------------------------------------------------------------------
def need_revive
@socket.send("#{PACKET_NEED_REVIVE}\n")
end
7º - Insira um novo script abaixo do script [ND] Window_Trade com o nome de [ND] Window_Respawn
- Código:
#==============================================================================
# ** TinyButton
#------------------------------------------------------------------------------
# Autor Paulo S.
# Versão 1.0
# Data 29/08/2017
#==============================================================================
class TinyButton < Sprite
def initialize(container, x, y, w, text, align=1)
super nil
@container = container
self.x = container.x + x
self.y = container.y + y
@width = w
@text = text
@align = align
self.z = container.z + 1
self.bitmap = Bitmap.new(w, 20)
self.visible = container.visible
self.bitmap.font.size = 14
@events = []
refresh
end
#--------------------------------------------------------------------------
# * Adiciona um evento de click.
#--------------------------------------------------------------------------
def on_click(&b)
@events << b
end
#--------------------------------------------------------------------------
# * Desenha o conteúdo.
#--------------------------------------------------------------------------
def refresh
self.bitmap.clear
self.bitmap.fill_rect(1, 0, @width - 2, 20, Configs::WIDGET_COLORS[0])
self.bitmap.fill_rect(1, 1, @width - 2, 8, Configs::WIDGET_COLORS[1])
self.bitmap.fill_rect(1, 9, @width - 2, 9, Configs::WIDGET_COLORS[2])
self.bitmap.draw_text(self.bitmap.rect, @text, 1)
end
#--------------------------------------------------------------------------
# * Atualiza o botão.
#--------------------------------------------------------------------------
def update
return unless $mouse.x > self.x
return unless $mouse.x <= self.x + @width
return unless $mouse.y > self.y
return unless $mouse.y <= self.y + self.bitmap.height
return unless Input.trigger?(0x01)
@events.each { |e| e.call }
end
end
#==============================================================================
# ** Window_Respawn
#------------------------------------------------------------------------------
# Autor Paulo S.
# Versão 1.0
# Data 29/08/2017
#==============================================================================
class Window_Respawn < Sprite
# Cor de fundo da janela.
BackgroundColor = Color.new(0, 0, 0, 200).freeze
# Gráfico do personagem morto.
Dead = '190-Down02'
# Id da poção usada para reviver.
PotionId = 3
def initialize
super nil
self.x = 50
self.y = 180
self.z = 999
self.bitmap = Bitmap.new(180, 50)
@seconds = 5
@graphic = $game_party.actors[0].character_name
@tb_respawn = TinyButton.new(self, 5, 25, 70, 'Renascer')
@tb_potion = TinyButton.new(self, 80, 25, 95, 'Usar poção')
@tb_respawn.on_click { respawn }
@tb_potion.on_click { use_potion }
refresh
hide
end
#--------------------------------------------------------------------------
# * Chamado ao clica no botão de respawn.
#--------------------------------------------------------------------------
def respawn
$network.need_respawn
hide
end
#--------------------------------------------------------------------------
# * Chamado ao clicar no botão de usar poção.
#--------------------------------------------------------------------------
def use_potion
if $game_party.item_number(PotionId) > 0
$game_party.lose_item(PotionId, 1)
$network.need_revive
hide
end
end
#--------------------------------------------------------------------------
# * Desenha o conteúdo da janela.
#--------------------------------------------------------------------------
def refresh
self.bitmap.clear
self.bitmap.fill_rect(0, 0, 180, 50, BackgroundColor)
self.bitmap.draw_text(0, 0, 180, 20, "Renascimento em #{@seconds}s...", 1)
end
#--------------------------------------------------------------------------
# * Exibe a janela.
#--------------------------------------------------------------------------
def show
$game_party.actors[0].character_name = Dead
self.visible = true
@timer = Time.now
@tb_respawn.visible = true
@tb_potion.visible = true
refresh
end
#--------------------------------------------------------------------------
# * Esconde a janela.
#--------------------------------------------------------------------------
def hide
$game_party.actors[0].character_name = @graphic
self.visible = false
@seconds = 5
@timer = nil
@tb_respawn.visible = false
@tb_potion.visible = false
end
#--------------------------------------------------------------------------
# * Atualização dos componentes.
#--------------------------------------------------------------------------
def update
super
return unless self.visible
update_timer
update_controls
end
#--------------------------------------------------------------------------
# * Atualização do timer.
#--------------------------------------------------------------------------
def update_timer
return unless @timer
hide if @seconds == 0
t = Time.now
if Time.now - @timer >= 1.0
@seconds -= 1
@timer = t
refresh
end
end
#--------------------------------------------------------------------------
# * Atualização dos botões.
#--------------------------------------------------------------------------
def update_controls
@tb_respawn.update
@tb_potion.update
end
#--------------------------------------------------------------------------
# * Liberação dos recursos usados.
#--------------------------------------------------------------------------
def dispose
super
@tb_respawn.dispose
@tb_potion.dispose
end
end