Habilitar/Desabilitar PVP por Botão
Esse foi um Pedido que o @Lucastobias e o @Kies fizeram. Vou estar auxiliando na criação do mesmo neste momento.
# Função do Sistema
Um botão que irá Habilitar e Desabilitar (Permitir ou não permitir) que o jogador participe de um PVP, entre em batalha, machuque outros jogadores , entre outros.
# Ficha Técnica
- Nível de Dificuldade : Quase Nenhum (Ainda mais porque você só vai copiar e colar seu safado.)
- Compatibilidade : Qualquer Engine variante de EO/CS
- Programas Necessários : Visual Basic 6zão
# Ao Sistema
[ 0.1 ] Abra seu Servidor e Cliente no Vb6 ;3
~ Client Side (Edições para o Cliente)
[ 0.2 ] Criando o Botão com a Função
Na frmMain, crie um botão para que ele seja o botão que irá ser apertado para ativar e desativar o pvp.
Dê um duplo click sobre ele para entrar nas funções dele, dentro adicione:
- Código:
RequestChangePvPMoral
[ 0.3 ] Criando a Sub que enviará o Pedido da Mudança.
Vá ao modClientTCP, no final dele adicione:
- Código:
Sub RequestChangePvPMoral()
Dim Buffer As clsBuffer
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
Set Buffer = New clsBuffer
Buffer.WriteLong CChangePvPMoral
SendData Buffer.ToArray()
Set Buffer = Nothing
' Error handler
Exit Sub
errorhandler:
HandleError "RequestChangePvPMoral", "modClientTCP", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
End Sub
[ 0. 4 ] Adicionando Pacote ao Enum
Vá ao ModEnumarations, no cliente, procure por:
- Código:
CMSG_COUNT
Acima adicione:
- Código:
CChangePvPMoral
~ Server Side (Lado do Servidor)
[ 0.5 ] Adicionando Pacote no Servidor
Vá ao ModEnumaretions, no Servidor, procure por:
- Código:
CMSG_COUNT
Acima adicione:
- Código:
CChangePvPMoral
Sim, precisa estar tanto no cliente quanto no servidor.
[ 0.6 ] Recepcionando o Pedido.
Vá ao ModHandleData, no Servidor. Procure pela sub:
- Código:
Public Sub InitMessages()
Dentro dela, de preferencia em uma linha abaixo de todos os "HandleDataSub"
Adicione:
- Código:
HandleDataSub(CChangePvPMoral) = GetAddress(AddressOf HandleChangePvPMoral)
Se mesmo assim você não entendeu onde por, so colocar antes do End Sub
[ 0.7 ] Desempacotando
No final do ModHandleData, no Servidor. Adicione:
- Código:
'Mudando Moral PvP
Sub HandleChangePvPMoral(ByVal index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
If index <= 0 Or index > MAX_PLAYERS Then Exit Sub
If IsPlaying(index) Then
If TempPlayer(index).MoralPVP = 0 Then
TempPlayer(index).MoralPVP = 1
PlayerMsg index, "Você ativou o PVP!", Yellow
Else
TempPlayer(index).MoralPVP = 0
PlayerMsg index, "Você desativou o PVP!", BrightGreen
End If
End If
End Sub
[ 0.8 ] Adicionando Variável no TempPlayer
Vá ao ModTypes, procure por:
- Código:
Public Type TempPlayerRec
Dentro dela, de preferencia no final antes do End Type, adicione:
- Código:
'PVP
MoralPvP As Byte
[ 0.9 ] Adicionando a Logica do Sistema
Agora vamos ao CanPlayerAttackPlayer, no ModCombat, dentro do Servidor ainda.
Dentro da Function:
- Código:
Function CanPlayerAttackPlayer
Antes do :
- Código:
CanPlayerAttackPlayer = True
End Function
Adicione:
- Código:
'Moral Pvp
If TempPlayer(attacker).MoralPvP = 0 Then
Call PlayerMsg(attacker, "Você está com o Pvp Desativado, não poderá ferir um jogador.", BrightRed)
Exit Function
ElseIf TempPlayer(victim).MoralPvP = 0 Then
Call PlayerMsg(victim, "O jogador alvo está com o Pvp Desativado.", BrightRed)
Exit Function
End If
Pode retirar as msg's caso queira, ou mesmo modifica-las, fica a seu critério.
Agora o Sistema já está pronto!
[ 1.0 ] Time Defense - Bônus
Para evitar algo simples que seria o jogador ativar pvp, atacar, e logo após desativar para se tornar "invulnerável" o que seria um problema. Vamos colocar um tempinho na questão da mudança da Moral pvp. Adicione esse "add" se quiser.
No Servidor, abaixo de:
- Código:
'PVP
MoralPvP As Byte
Adicione:
- Código:
MoralPvP_Timer as Long
Procure por:
- Código:
Sub HandleChangePvPMoral(ByVal index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
If index <= 0 Or index > MAX_PLAYERS Then Exit Sub
If IsPlaying(index) Then
If TempPlayer(index).MoralPvP = 0 Then
TempPlayer(index).MoralPvP = 1
PlayerMsg index, "Você ativou o PVP!", Yellow
Else
TempPlayer(index).MoralPvP = 0
PlayerMsg index, "Você desativou o PVP!", BrightGreen
End If
End If
End Sub
Substitua a sub por isso aqui:
- Código:
'Mudando Moral PvP
Sub HandleChangePvPMoral(ByVal index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
If index <= 0 Or index > MAX_PLAYERS Then Exit Sub
'Controle de Mudanças de PvP Moral
If TempPlayer(index).MoralPvP_Timer > GetTickCount Then
Call PlayerMsg(index, "Você mudou recentemente sua moral PVP, aguarde alguns instantes.", BrightRed)
Exit Sub
End If
If IsPlaying(index) Then
If TempPlayer(index).MoralPvP = 0 Then
TempPlayer(index).MoralPvP = 1
PlayerMsg index, "Você ativou o PVP!", Yellow
Else
TempPlayer(index).MoralPvP = 0
PlayerMsg index, "Você desativou o PVP!", BrightGreen
End If
TempPlayer(index).MoralPvP_Timer = GetTickcount + 15000 'Tempo
End If
End Sub
Ali onde tem configurado 'Tempo, o valor de 15000 corresponde a 15 segundos.
Cada Segundo é no total 1000ms, logo se você quiser 1 minuto = 60s = 60000ms
Faça o calculo e deixe da forma que achar melhor.
Att e Bjus na Boka.
Última edição por Profane ~ em Dom Ago 05, 2018 6:29 pm, editado 1 vez(es)