É interessante quando o jogo tem várias mecânicas, umas delas é quando o NPC possui passivas variadas e diferentes.
Nesse tutorial eu vou disponibilizar um sistema que adiciona isso ao seu jogo, com "1" passiva inclusa.
O tutorial conta com:
Vamos lá então, começando pelo cliente. Abra seu "Client.Vbp" , e no "frmEditor_NPC" crie:
- 1x label - Caption: "Passives: "
- 1x ListBox - Name: lstPassives / Text: "No Passive" / List: 1- "No Passive" ; 2- "Revive after Death"
- 1x ComboBox - Name: cmbPassives
- 1x CommandButton - Name: cmdAddPassive
- 1x label - Caption: "CD(s): "
- 1x TextBox - Name: txtPassCD / Text: "0"
Agora, na parte lógica dos adicionáveis, vamos adicionar os códigos.
Dê dois cliques no "cmdAddPassive" e adicione isto:
Agora dê dois cliques no "txtPassCD" e adicione isto:
Agora, em "ModGameEditors" na "Public Sub NpcEditorInit()" , abaixo de:
Adicione isto:
Agora, no final de "ModGameLogic" adicione isto:
Também, no final de "ModConstants" , adicione isto:
Agora, em "ModTypes", procure pela type "Private Type NpcRec" e logo acima, declare isto:
Ainda em "ModTypes", procure pela type "Private Type NpcRec" e logo abaixo, antes do primeiro "End Type" que achar, declare um type adicionando isto:
E pronto, o cliente está finalizado.
Agora vamos para o server~side, abra seu "Server.Vbp" e em "ModTypes", procure pela type "Private Type NpcRec" e logo acima, declare isto:
Ainda em "ModTypes", procure pela type "Private Type NpcRec" e logo abaixo, antes do primeiro "End Type" que achar, declare um type adicionando isto:
Finalmente para o "ModTypes", procure pela type "Private Type MapNpcRec" e logo abaixo, antes do primeiro "End Type" que achar, declare um type adicionando isto:
Agora, no final de "ModConstants" , adicione isto:
Agora, em "ModCombat" , na "Public Sub PlayerAttackNpc", procure por este código:
E logo acima adicione isto:
Agora, em "ModGameLogic" na "Public Sub SpawnNpc", procure por isto:
E logo abaixo adicione isto:
Ainda no final de "ModGameLogic", adicione isto:
E pronto, agora seu NPC tem passiva.
No caso, a passiva é "NPC não morrer".
Com funciona?
Abra o Editor de NPC, selecione no "cmbPassives" sua passiva, escreva no "txtPassCD" os Segundos de cooldown, e pronto, sempre que o NPC for morrer, ele irá ficar vivo e entrará em Cooldown a passiva pelo editor.
Lembre que você pode fazer uma passiva permanente ao deixar o "Cooldown" em "ZERO".
Talvez futuramente eu apresente "Add-On's" trazendo outros scripts como passiva. (Ou deixem ideias...)
Nesse tutorial eu vou disponibilizar um sistema que adiciona isso ao seu jogo, com "1" passiva inclusa.
O tutorial conta com:
-Limite de 10 passivas por "MapNpc";
-Cada passiva tem o tempo único de "Cooldown".
TUTORIAL
CLIENT~SIDE
Vamos lá então, começando pelo cliente. Abra seu "Client.Vbp" , e no "frmEditor_NPC" crie:
- 1x label - Caption: "Passives: "
- 1x ListBox - Name: lstPassives / Text: "No Passive" / List: 1- "No Passive" ; 2- "Revive after Death"
- 1x ComboBox - Name: cmbPassives
- 1x CommandButton - Name: cmdAddPassive
- 1x label - Caption: "CD(s): "
- 1x TextBox - Name: txtPassCD / Text: "0"
Poderá ficar mais ou menos assim:
Agora, na parte lógica dos adicionáveis, vamos adicionar os códigos.
Dê dois cliques no "cmdAddPassive" e adicione isto:
- Código:
Dim tmpString() As String
Dim X As Long, tmpIndex As Long
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
' exit out if needed
If Not cmbPassives.ListCount > 0 Then Exit Sub
If Not lstPassives.ListCount > 0 Then Exit Sub
' set the combo box properly
tmpString = Split(cmbPassives.list(cmbPassives.ListIndex))
' make sure it's not a clear
If Not cmbPassives.list(cmbSpells.ListIndex) = "No Passive" Then
NPC(EditorIndex).NpcPassives(lstPassives.ListIndex + 1).Num = cmbPassives.ListIndex
NPC(EditorIndex).NpcPassives(lstPassives.ListIndex + 1).PassiveSeconds = txtPassCD.Text
Else
NPC(EditorIndex).NpcPassives(lstPassives.ListIndex + 1).Num = 0
NPC(EditorIndex).NpcPassives(lstPassives.ListIndex + 1).PassiveSeconds = 0
End If
' re-load the list
tmpIndex = lstPassives.ListIndex
lstPassives.Clear
For X = 1 To MAX_NPC_PASSIVES
If NPC(EditorIndex).NpcPassives(X).Num > 0 Then
lstPassives.AddItem X & ": " & Trim$(GetNpcPassiveName(NPC(EditorIndex).NpcPassives(X).Num)) & " (CD:" & NPC(EditorIndex).NpcPassives(X).PassiveSeconds & "s)"
Else
lstPassives.AddItem X & ": No Passive"
End If
Next
lstPassives.ListIndex = tmpIndex
' Error handler
Exit Sub
errorhandler:
HandleError "cmdAddPassive_Click", "frmEditor_Npc", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
Agora dê dois cliques no "txtPassCD" e adicione isto:
- Código:
If Not Len(txtPassCD.Text) > 0 Then Exit Sub
If Not IsNumeric(txtPassCD.Text) Then Exit Sub
Agora, em "ModGameEditors" na "Public Sub NpcEditorInit()" , abaixo de:
- Código:
' find the sound we have set
If .cmbSound.ListCount >= 0 Then
For i = 0 To .cmbSound.ListCount
If .cmbSound.list(i) = Trim$(NPC(EditorIndex).sound) Then
.cmbSound.ListIndex = i
SoundSet = True
End If
Next
If Not SoundSet Or .cmbSound.ListIndex = -1 Then .cmbSound.ListIndex = 0
End If
Adicione isto:
- Código:
' Spell List, cache CMB
.cmbPassives.Clear
.cmbPassives.AddItem "No Passive"
If .cmbPassives.ListCount >= 0 Then
For i = 1 To MAX_NPC_PASSIVES
.cmbPassives.AddItem GetNpcPassiveName(NPC(EditorIndex).NpcPassives(i).Num)
Next
End If
' cache list from saved
.lstPassives.Clear
For i = 1 To MAX_NPC_PASSIVES
If NPC(EditorIndex).NpcPassives(i).Num > 0 Then
.lstPassives.AddItem i & ": " & GetNpcPassiveName(NPC(EditorIndex).NpcPassives(i).Num) & " (CD:" & NPC(EditorIndex).NpcPassives(i).PassiveSeconds & "s)"
Else
.lstPassives.AddItem i & ": " & "No Passive"
End If
Next
.lstPassives.ListIndex = 0
Agora, no final de "ModGameLogic" adicione isto:
- Código:
Public Function GetNpcPassiveName(ByVal PassiveNum As Long) As String
If PassiveNum <= 0 Or PassiveNum > MAX_NPC_PASSIVES Then Exit Function
Select Case PassiveNum
Case 1
GetNpcPassiveName = "Revive after Death"
Case 2
GetNpcPassiveName = "Develop"
Case 3
GetNpcPassiveName = "Develop"
Case 4
GetNpcPassiveName = "Develop"
Case 5
GetNpcPassiveName = "Develop"
Case 6
GetNpcPassiveName = "Develop"
Case 7
GetNpcPassiveName = "Develop"
Case 8
GetNpcPassiveName = "Develop"
Case 9
GetNpcPassiveName = "Develop"
Case 10
GetNpcPassiveName = "Develop"
End Select
End Function
Também, no final de "ModConstants" , adicione isto:
- Código:
Public Const MAX_NPC_PASSIVES As Long = 10
Agora, em "ModTypes", procure pela type "Private Type NpcRec" e logo acima, declare isto:
- Código:
Private Type PassivesGeneralRec
Num As Long
'Cooldown of passive
PassiveSeconds As Long
End Type
Ainda em "ModTypes", procure pela type "Private Type NpcRec" e logo abaixo, antes do primeiro "End Type" que achar, declare um type adicionando isto:
- Código:
NpcPassives(1 To MAX_NPC_PASSIVES) As PassivesGeneralRec
E pronto, o cliente está finalizado.
SERVER~SIDE
Agora vamos para o server~side, abra seu "Server.Vbp" e em "ModTypes", procure pela type "Private Type NpcRec" e logo acima, declare isto:
- Código:
Private Type PassivesGeneralRec
Num As Long
'Cooldown of passive
PassiveSeconds As Long
End Type
Ainda em "ModTypes", procure pela type "Private Type NpcRec" e logo abaixo, antes do primeiro "End Type" que achar, declare um type adicionando isto:
- Código:
NpcPassives(1 To MAX_NPC_PASSIVES) As PassivesGeneralRec
Finalmente para o "ModTypes", procure pela type "Private Type MapNpcRec" e logo abaixo, antes do primeiro "End Type" que achar, declare um type adicionando isto:
- Código:
MapNpcPassives(1 To MAX_NPC_PASSIVES) As PassivesGeneralRec
PassiveTimer(1 To MAX_NPC_PASSIVES) As Long
Agora, no final de "ModConstants" , adicione isto:
- Código:
Public Const MAX_NPC_PASSIVES As Long = 10
Agora, em "ModCombat" , na "Public Sub PlayerAttackNpc", procure por este código:
- Código:
' Calculate exp to give attacker
Exp = NPC(npcnum).Exp
E logo acima adicione isto:
- Código:
'Revival Passive
If CanUsePassive(MapNum, MapNpcNum, 1) Then
MapNpc(MapNum).NPC(MapNpcNum).vital(Vitals.HP) = GetMapNpcMaxVital(MapNum, MapNpcNum, HP) + GetNpcMaxVital(NpcNum, HP)
SendMapNpcsToMap MapNum
'Add cooldown
MapNpc(MapNum).NPC(MapNpcNum).PassiveTimer(GetPassiveSlot(MapNum, MapNpcNum, 1)) = GetTickCount
Exit Sub
End If
Agora, em "ModGameLogic" na "Public Sub SpawnNpc", procure por isto:
- Código:
MapNpc(MapNum).NPC(MapNpcNum).dir = Int(Rnd * 4)
E logo abaixo adicione isto:
- Código:
For i = 1 To MAX_NPC_PASSIVES
MapNpc(MapNum).NPC(MapNpcNum).MapNpcPassives(i).Num = NPC(NpcNum).NpcPassives(i).Num
MapNpc(MapNum).NPC(MapNpcNum).MapNpcPassives(i).PassiveSeconds = NPC(NpcNum).NpcPassives(i).PassiveSeconds
MapNpc(MapNum).NPC(MapNpcNum).PassiveTimer(i) = GetTickCount
Next
Ainda no final de "ModGameLogic", adicione isto:
- Código:
Public Function HasPassive(ByVal MapNum As Long, ByVal MapNpcNum As Long, ByVal PassiveNum As Long) As Boolean
Dim i As Long
HasPassive = False
If MapNum <= 0 Or MapNum > MAX_MAPS Then Exit Function
If MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Then Exit Function
For i = 1 To MAX_NPC_PASSIVES
If MapNpc(MapNum).NPC(MapNpcNum).MapNpcPassives(i).Num = PassiveNum Then
HasPassive = True
Exit For
End If
Next
End Function
Public Function GetPassiveSlot(ByVal MapNum As Long, ByVal MapNpcNum As Long, ByVal PassiveNum As Long) As Long
Dim i As Long
GetPassiveSlot = 0
If MapNum <= 0 Or MapNum > MAX_MAPS Then Exit Function
If MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Then Exit Function
For i = 1 To MAX_NPC_PASSIVES
If MapNpc(MapNum).NPC(MapNpcNum).MapNpcPassives(i).Num = PassiveNum Then
GetPassiveSlot = i
Exit For
End If
Next
End Function
Public Function CanUsePassive(ByVal MapNum As Long, ByVal MapNpcNum As Long, ByVal PassiveNum As Long) As Boolean
Dim i As Long, psNum As Long
CanUsePassive = False
If MapNum <= 0 Or MapNum > MAX_MAPS Then Exit Function
If MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Then Exit Function
If HasPassive(MapNum, MapNpcNum, PassiveNum) Then
psNum = GetPassiveSlot(MapNum, MapNpcNum, PassiveNum)
If MapNpc(MapNum).NPC(MapNpcNum).MapNpcPassives(psNum).Num > 0 Then
If MapNpc(MapNum).NPC(MapNpcNum).PassiveTimer(psNum) + MapNpc(MapNum).NPC(MapNpcNum).MapNpcPassives(psNum).PassiveSeconds * 1000 < GetTickCount Then
CanUsePassive = True
Exit Function
End If
End If
End If
End Function
E pronto, agora seu NPC tem passiva.
No caso, a passiva é "NPC não morrer".
Com funciona?
Abra o Editor de NPC, selecione no "cmbPassives" sua passiva, escreva no "txtPassCD" os Segundos de cooldown, e pronto, sempre que o NPC for morrer, ele irá ficar vivo e entrará em Cooldown a passiva pelo editor.
Lembre que você pode fazer uma passiva permanente ao deixar o "Cooldown" em "ZERO".
Talvez futuramente eu apresente "Add-On's" trazendo outros scripts como passiva. (Ou deixem ideias...)
Créditos
Kotol