Aldeia RPG

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

Suporte ao desenvolvimento de jogos


    [EO 2.0] Passivas para os NPC's

    Kotol
    Kotol
    Moderador Local
    Moderador Local


    Mensagens : 74
    Créditos : 15

    [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

    Valentine, Mizuki e Kiyoko gostam desta mensagem


      Data/hora atual: Dom Abr 28, 2024 4:12 am