[EO 2.0] Passivas para os NPC's Hitskin_logo Hitskin.com

Isto é uma pré-visualização de um tema em Hitskin.com
Instalar o temaVoltar para a ficha do tema

Aldeia RPG
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

[EO 2.0] Passivas para os NPC's

Ir para baixo

[EO 2.0] Passivas para os NPC's Empty [EO 2.0] Passivas para os NPC's

Mensagem por Kotol Seg Abr 03, 2023 3:04 pm

É 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:

-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: 
[EO 2.0] Passivas para os NPC's Exampl12

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. Very Happy
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
Kotol
Kotol
Moderador Local
Moderador Local

Mensagens : 77
Créditos : 17

Valentine, Mizuki e Kiyoko gostam desta mensagem

Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos