por Profane ~ Seg Abr 30, 2018 11:41 pm
Ahm c;c
Vamos ver se dá certo /o/
Servidor,
Procura pela:
- Código:
Sub SendVital(ByVal index As Long, ByVal Vital As Vitals)
No Fim dela tem:
- Código:
SendDataTo index, Buffer.ToArray()
troca por
- Código:
SendDataToMap GetPlayerMap(index), Buffer.ToArray()
Com isso o valor vai estar sendo enviado para todo o mapa.
Agora no Cliente,
Procura por..
- Código:
Private Sub HandlePlayerHp(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long
Na EO 2.0 É assim:
- Código:
Private Sub HandlePlayerHp(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
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.WriteBytes Data()
Player(MyIndex).MaxVital(Vitals.HP) = Buffer.ReadLong
Call SetPlayerVital(MyIndex, Vitals.HP, Buffer.ReadLong)
If GetPlayerMaxVital(MyIndex, Vitals.HP) > 0 Then
'frmMain.lblHP.Caption = Int(GetPlayerVital(MyIndex, Vitals.HP) / GetPlayerMaxVital(MyIndex, Vitals.HP) * 100) & "%"
frmMain.lblHP.Caption = GetPlayerVital(MyIndex, Vitals.HP) & "/" & GetPlayerMaxVital(MyIndex, Vitals.HP)
' hp bar
frmMain.imgHPBar.width = ((GetPlayerVital(MyIndex, Vitals.HP) / HPBar_Width) / (GetPlayerMaxVital(MyIndex, Vitals.HP) / HPBar_Width)) * HPBar_Width
End If
' Error handler
Exit Sub
errorhandler:
HandleError "HandlePlayerHP", "modHandleData", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
End Sub
Deixe assim:
- Código:
Private Sub HandlePlayerHp(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
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.WriteBytes Data()
Player(Index).MaxVital(Vitals.HP) = Buffer.ReadLong
Call SetPlayerVital(Index, Vitals.HP, Buffer.ReadLong)
If Index = MyIndex Then 'Sou eu?
If GetPlayerMaxVital(MyIndex, Vitals.HP) > 0 Then
'frmMain.lblHP.Caption = Int(GetPlayerVital(MyIndex, Vitals.HP) / GetPlayerMaxVital(MyIndex, Vitals.HP) * 100) & "%"
frmMain.lblHP.Caption = GetPlayerVital(MyIndex, Vitals.HP) & "/" & GetPlayerMaxVital(MyIndex, Vitals.HP)
' hp bar
frmMain.imgHPBar.width = ((GetPlayerVital(MyIndex, Vitals.HP) / HPBar_Width) / (GetPlayerMaxVital(MyIndex, Vitals.HP) / HPBar_Width)) * HPBar_Width
End If
End If
' Error handler
Exit Sub
errorhandler:
HandleError "HandlePlayerHP", "modHandleData", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
End Sub
Se notar a parte de cima que era "MyIndex" (EU) foi trocado por Index, onde poderá recepcionar outros jogadores.. assim o cliente passaria a receber o HP atual de outros jogadores.
E ali embaixo uma verificação se Index = MyIndex, para poder fazer a movimentação das Barras.
Creio que possa mudar um pouco em outras engines.
Vamos que ainda não acabou /o/
Ainda no Cliente, procura por:
- Código:
Private Sub BltBars()
Dentro dela.. vamos procurar a área de minha "barra", que é essa aqui:
- Código:
' draw own health bar
If GetPlayerVital(MyIndex, Vitals.HP) > 0 And GetPlayerVital(MyIndex, Vitals.HP) < GetPlayerMaxVital(MyIndex, Vitals.HP) Then
' lock to Player
tmpX = GetPlayerX(MyIndex) * PIC_X + Player(MyIndex).XOffset + 16 - (sWidth / 2)
tmpY = GetPlayerY(MyIndex) * PIC_X + Player(MyIndex).YOffset + 35
' calculate the width to fill
barWidth = ((GetPlayerVital(MyIndex, Vitals.HP) / sWidth) / (GetPlayerMaxVital(MyIndex, Vitals.HP) / sWidth)) * sWidth
' draw bar background
With sRECT
.top = sHeight * 1 ' HP bar background
.Left = 0
.Right = .Left + sWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
' draw the bar proper
With sRECT
.top = 0 ' HP bar
.Left = 0
.Right = .Left + barWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
End If
Essa área é responsável por mostrar meu HP.
Vamos Mudar isso... para isso aqui..
- Código:
' draw own health bar
For i = 1 To MAX_PLAYERS
If GetPlayerMap(i) = GetPlayerMap(MyIndex) Then
If GetPlayerVital(i, Vitals.HP) > 0 And GetPlayerVital(i, Vitals.HP) < GetPlayerMaxVital(i, Vitals.HP) Then
' lock to Player
tmpX = GetPlayerX(i) * PIC_X + Player(i).XOffset + 16 - (sWidth / 2)
tmpY = GetPlayerY(i) * PIC_X + Player(i).YOffset + 35
' calculate the width to fill
barWidth = ((GetPlayerVital(i, Vitals.HP) / sWidth) / (GetPlayerMaxVital(i, Vitals.HP) / sWidth)) * sWidth
' draw bar background
With sRECT
.top = sHeight * 1 ' HP bar background
.Left = 0
.Right = .Left + sWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
' draw the bar proper
With sRECT
.top = 0 ' HP bar
.Left = 0
.Right = .Left + barWidth
.Bottom = .top + sHeight
End With
Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
End If
End If
End If
O For passará por todos os players que estarão no seu mapa atualizando o HP Barra (HP que fica embaixo ou em cima /o/ do Player) atualizando os valores.
Se sua engine foi dx8 vai mudar pouca coisa.. a lógica é a mesma.
Att e Bjus;