Suporte no desenvolvimento de jogos


    [Prof ~] NPC Evolve

    Profane ~
    Profane ~
    Moderador Global
    Moderador Global

    Mensagens : 774
    Créditos : 128
    Cash : 0

    [Prof ~] NPC Evolve  Empty [Prof ~] NPC Evolve

    Mensagem por Profane ~ em Seg Fev 25, 2019 4:13 am

    Oin Amoresitos.

    Cai no conto do Coyote de comentar que faria uma incrementação em um sistema do @GalaxyHells , bla bla... caso ele tomasse vergonha na face dele e arrumasse o tópico para que fosse possível ser lido e copiado e colado pelos belos garotos peludos do fórum.

    Eis aqui... Depois de um longo tempo sem trazer incrementações e sisteminhas para os Narutos de vocês... Trago a Trans por Foto de NPC.

    Não que o do @GalaxyHells estivesse errado. O Link para o tópico do sistema do mesmo vai estar disponível aqui, mas me é ruim incrementar uma estrutura que é feita meio que de meia boca.

     Link para o Tópico do Hells: [Hells] Boss Fight (EO)

    Logo resolvi trazer os códigos todos para o sistema em questão, obviamente que existem outras 1000000 formas e de serem feitas, com palavras e jeitos diferentes.. porém esse é meu jeito programadora ninja de ser.





    • Ficha Técnica


    Código:
    Nível de Programação: Baixo
    Programas Necessários: Visual Basic 6 (Sex)
    Nível de Programação para Edições Futuras: Mediano


    • Entendimento sobre o sistema em si.


    Código:
    O Sistema gira com a função de ao NPC setado chegar até uma determinada % de HP (Vital) iniciar seu modo
    de transformação. Será possível o mesmo usar um valor imenso de 'tabs' de transformação, você conseguindo
    por exemplo configurar 100 Transformações em Cadeia para o mesmo NPC, cada uma contendo um valor diferente de
    potencial de HP/DANO.

    Algumas funções adicionais naturais foram adicionadas como Tempo para Transformar, Animações, Falas, Se ele
    entrar em momento de evolução estará imune e também se ao transformar ele irá encher por completo seu HP.


    • Adicionais


    Código:
    No decorrer da programação notei que era interessante adicionar coisas que vinham com a situação... Ex's.
    > Regeneração Funcional do HP do NPC enquanto ele estiver fora de Batalha.
    > Des-Evolve (Npc voltará ao seu estado natural e inicial ~)
    > Outros




    Ao Sistema ~


    • Client Side


    [ 1.0 - Adicionando Componentes na Form do Editor ]
    Spoiler:


    Well primeiro iremos começar adicionando os componentes na Form de Editor de Npc's. O Esquema é simples porém você tem que saber o minimo do minimo.. que é INDEX!

    [Prof ~] NPC Evolve  O4t5zvk

    https://i.imgur.com/O4t5zvk.png

    A Numeração representa os Index de cada componente em ordem. Lembre-se que eles vão precisar estar na devida ordem para funcionar de acordo com a estrutura do código.


    Código:
    Nomenclatura dos Componentes -
    *Label Name = lblNpcEvolve
    *CheckBox Name = chkNpcEvolve
    *TextBox Name = txtNpcEvolve
    *Scroll Name = scrlNpcEvolve
    *Picture Name = picNpcEvolve

    Index em componente permite economizar nomenclaturas e subs. Logo cada componente ai é da mesma família relacionada ao Evolve.

    Quando criar os Componentes e atribuir Index aos mesmo, vai notar que ficarão com este detalhe.

    [Prof ~] NPC Evolve  4kvimVY

    https://i.imgur.com/4kvimVY.png

    Então faça de forma certa seguindo o esquema postado no começo.

    [ 1.1 - Código do FrmEditor_Npc ]

    Spoiler:



    Entre na Window de Código da FrmEditor_NPC para que possamos adicionar os códigos que dão função aos Componente.

    Botão direito sobre o visual da Form e acesso o View Code.

    [Prof ~] NPC Evolve  MHWT4qC
    https://i.imgur.com/MHWT4qC.png

    No final do Modulo da Form adicione o que está abaixo.


    '''''''''''''''
    ' Evolve Area '
    ''''''''''''''' // Copy Below

    'Modificações na Data1 do NPC - EvolveREC
    Private Sub scrlNpcEvolve_Change(Index As Integer)
        ' If debug mode, handle error then exit out
        If Options.Debug = 1 Then On Error GoTo errorhandler

        Select Case Index
            Case 0 'Matriz de TAB baseado no MAX_NPC_Evolve
                'Mudança apenas da ABA TAB do Index de Evolve
                lblNpcEvolve(0).Caption = "Evolution - " & scrlNpcEvolve(0).Value
                NpcEditor_EvolveTab scrlNpcEvolve(0).Value
                
                '// Load Evolve
            Case 1 'Animação de Charge - Pre Evolve
                If scrlNpcEvolve(1).Value > 0 And scrlNpcEvolve(1).Value <= MAX_ANIMATIONS Then
                    lblNpcEvolve(1).Caption = "Charge Anim: " & scrlNpcEvolve(1).Value & " - " & Trim$(Animation(scrlNpcEvolve(1).Value).Name)
                    Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(4) = scrlNpcEvolve(1).Value
                Else
                    lblNpcEvolve(1).Caption = "Charge Anim: X - None"
                    Exit Sub
                End If
                
            Case 2 'Animação Final - Já Finalizando a Evolução
                If scrlNpcEvolve(2).Value > 0 And scrlNpcEvolve(2).Value <= MAX_ANIMATIONS Then
                    lblNpcEvolve(2).Caption = "Evolve Anim: " & scrlNpcEvolve(2).Value & " - " & Trim$(Animation(scrlNpcEvolve(2).Value).Name)
                    Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(6) = scrlNpcEvolve(2).Value
                Else
                    lblNpcEvolve(2).Caption = "Evolve Anim: X - None"
                    Exit Sub
                End If
            
            Case 3 'Evolved Sprite
                Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(7) = scrlNpcEvolve(3).Value
                lblNpcEvolve(3).Caption = "Sprite: " & scrlNpcEvolve(3).Value
                Call EditorNpc_BltSprite_Evolve
                
                'Atualizar Quadro
                
        End Select

        ' Error handler
        Exit Sub
    errorhandler:
        HandleError "scrlNpcEvolve_Change", "frmEditor_NPC", Err.Number, Err.Description, Err.Source, Err.HelpContext
        Err.Clear
        Exit Sub
    End Sub

    Private Sub txtNpcEvolve_Change(Index As Integer)
    Dim textval As String
    Dim numval As String
    Dim posted As Integer
    Dim Old As String
        ' If debug mode, handle error then exit out
        If Options.Debug = 1 Then On Error GoTo errorhandler

        Select Case Index
            Case 0, 1, 2, 3 '% To Evolve / Seconds in Evolve Charge / General Power Up / HP Increase %
                textval = txtNpcEvolve(Index).text
                If IsNumeric(textval) Then
                    numval = textval
                    posted = CInt(numval)
                    
                    If Len(posted) <= txtNpcEvolve(Index).MaxLength Then
                        'Resguardar
                        If Index = 0 Then Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(1) = posted 'scrlNpcEvolve(Index).Value
                        If Index = 1 Then Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(2) = posted 'scrlNpcEvolve(Index).Value
                        
                        If Index = 2 Then Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(8) = posted 'scrlNpcEvolve(Index).Value
                        If Index = 3 Then Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(9) = posted 'scrlNpcEvolve(Index).Value
                        
                        txtNpcEvolve(Index).text = posted
                    Else
                        txtNpcEvolve(Index).text = "0"
                        Exit Sub
                    End If
                Else
                  txtNpcEvolve(Index).text = CStr(numval)
                End If
               
            Case 4 'Say Text
                Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data2 = Trim$(txtNpcEvolve(Index).text)
                
        End Select

        ' Error handler
        Exit Sub
    errorhandler:
        HandleError "txtNpcEvolve_Change", "frmEditor_NPC", Err.Number, Err.Description, Err.Source, Err.HelpContext
        Err.Clear
        Exit Sub

    End Sub

    Private Sub chkNpcEvolve_Click(Index As Integer)

        ' If debug mode, handle error then exit out
        If Options.Debug = 1 Then On Error GoTo errorhandler

        Select Case Index
            Case 0 'Immune
                If chkNpcEvolve(0).Value > 0 Then
                    Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(3) = 1
                Else
                    Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(3) = 0
                End If
            Case 1 'Restore Hp After Evolve
                If chkNpcEvolve(1).Value > 0 Then
                    Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(5) = 1
                Else
                    Npc(EditorIndex).Evolve(scrlNpcEvolve(0).Value).Data1(5) = 0
                End If
        End Select

       ' Error handler
        Exit Sub
    errorhandler:
        HandleError "chkNpcEvolve_Click", "frmEditor_NPC", Err.Number, Err.Description, Err.Source, Err.HelpContext
        Err.Clear
        Exit Sub
    End Sub

    [ 1.2 - Editando o GameEditor do Cliente ]

    Spoiler:


    Vá para os módulos, busque pelo ... ModGameEditors

    Dentro dele procure pela Sub NpcEditorInit

    Nela, procure por End With

    Acima dele adicione :

    Código:
           ''''''''''
            ' Evolve '
            ''''''''''
            .scrlNpcEvolve(0).Max = MAX_NPC_EVOLVE: .scrlNpcEvolve(0).Min = 1: .scrlNpcEvolve(0).Value = 1
            If Npc(EditorIndex).Evolve(1).Data1(7) <= 0 Or Npc(EditorIndex).Evolve(1).Data1(7) > .scrlNpcEvolve(3).Max Then Npc(EditorIndex).Evolve(1).Data1(7) = 0
            .scrlNpcEvolve(3).Value = Npc(EditorIndex).Evolve(1).Data1(7)
            
            
            .txtNpcEvolve(0).MaxLength = 2
            .txtNpcEvolve(1).MaxLength = 2
            .txtNpcEvolve(0).text = Npc(EditorIndex).Evolve(1).Data1(1)
            .txtNpcEvolve(1).text = Npc(EditorIndex).Evolve(1).Data1(2)
            If Npc(EditorIndex).Evolve(1).Data1(3) > 0 Then .chkNpcEvolve(0).Value = 1 Else .chkNpcEvolve(0).Value = 0
            .scrlNpcEvolve(1).Value = Npc(EditorIndex).Evolve(1).Data1(4)
            If Npc(EditorIndex).Evolve(1).Data1(5) > 0 Then .chkNpcEvolve(1).Value = 1 Else .chkNpcEvolve(1).Value = 0
            .scrlNpcEvolve(2).Value = Npc(EditorIndex).Evolve(1).Data1(6)
            .scrlNpcEvolve(3).Value = Npc(EditorIndex).Evolve(1).Data1(7)
            .txtNpcEvolve(2).text = Npc(EditorIndex).Evolve(1).Data1(8)
            .txtNpcEvolve(3).text = Npc(EditorIndex).Evolve(1).Data1(9)
            
            .txtNpcEvolve(4).text = Trim$(Npc(EditorIndex).Evolve(1).Data2)

    Saia da NpcEditorInit, abaixo dela, adicione esta nova Sub.

    Código:

    Public Sub NpcEditor_EvolveTab(ByVal Index As Long)
        ' If debug mode, handle error then exit out
        If Options.Debug = 1 Then On Error GoTo errorhandler
        
        'Normalizando Setor
        If Index <= 0 Or Index > MAX_NPC_EVOLVE Then Index = 1
        
        With frmEditor_NPC
            ''''''''''
            ' Evolve '
            ''''''''''
            .scrlNpcEvolve(0).Max = MAX_NPC_EVOLVE: .scrlNpcEvolve(0).Min = 1
            If Npc(EditorIndex).Evolve(Index).Data1(7) <= 0 Or Npc(EditorIndex).Evolve(Index).Data1(7) > .scrlNpcEvolve(3).Max Then Npc(EditorIndex).Evolve(Index).Data1(7) = 0
            .scrlNpcEvolve(3).Value = Npc(EditorIndex).Evolve(Index).Data1(7)
            
            .txtNpcEvolve(0).text = Npc(EditorIndex).Evolve(Index).Data1(1)
            .txtNpcEvolve(1).text = Npc(EditorIndex).Evolve(Index).Data1(2)
            If Npc(EditorIndex).Evolve(Index).Data1(3) > 0 Then .chkNpcEvolve(0).Value = 1 Else .chkNpcEvolve(0).Value = 0
            .scrlNpcEvolve(1).Value = Npc(EditorIndex).Evolve(Index).Data1(4)
            If Npc(EditorIndex).Evolve(Index).Data1(5) > 0 Then .chkNpcEvolve(1).Value = 1 Else .chkNpcEvolve(1).Value = 0
            .scrlNpcEvolve(2).Value = Npc(EditorIndex).Evolve(Index).Data1(6)
            .scrlNpcEvolve(3).Value = Npc(EditorIndex).Evolve(Index).Data1(7)
            .txtNpcEvolve(2).text = Npc(EditorIndex).Evolve(Index).Data1(8)
            .txtNpcEvolve(3).text = Npc(EditorIndex).Evolve(Index).Data1(9)
            
            .txtNpcEvolve(4).text = Trim$(Npc(EditorIndex).Evolve(Index).Data2)
        End With

        ' Error handler
        Exit Sub
    errorhandler:
        HandleError "NpcEditor_EvolveTab", "modGameEditors", Err.Number, Err.Description, Err.Source, Err.HelpContext
        Err.Clear
        Exit Sub
    End Sub


    [ 1.3 - Adicionando Memórias no ModType ]

    Spoiler:


    Acesse o ModTypes no Cliente, procure por...
    Código:
    Private Type MapNpcRec

    Dentro dele, abaixo de 

    Código:
    Dir As Byte

    Adicione:

    Código:
    Evolve As Byte      'Guarda o Valor de Evolve do Npc
    MaxHP As Long

    Agora procure por...

    Código:
    Private Type NpcRec

    Antes do End Type da sessão adicione:

    Código:
    Evolve(1 To MAX_NPC_EVOLVE) As EvolveRec

    Acima de :

    Código:
    Private Type NpcRec

    Adicione:

    Código:
    'Npc Evolve Data()
    Private Type EvolveRec
        Data1(1 To 9) As Integer    'Valores Numericos
        Data2 As String * 100       'Valores em Texto
    End Type

    [ 1.4 - Delimitando Limites na velocidade da Luz ] 

    Spoiler:


    Acesse agora o ModConstants, procure por ...
    Código:
    Public Const MAX_PARTY_MEMBERS As Long = 4

    Abaixo adicione:

    Código:
    Public Const MAX_NPC_EVOLVE As Byte = 4

    O Valor correspondente ao "4" representa a quantidade de possiveis evoluções em cadeia a qual os NPC's terão de limite.
    Se o valor é 4, então ele terá até 4 transformações a qual você poderá ou não configurar. 

    Não é interessante que você fique editando esse valor... decida um para o seu projeto, obviamente que não seja um valor esculhambado... a variavel da data está como Byte, então so irá até 255, caso queira usar mais do que 255 Evoluções no NPC então... Mude o Byte para um Integer ou Long ~(o.o~)




    [ 1.5 - Preparação para mudança de Sprite ] 


    Spoiler:

    Procure por :
    Código:
    Public Sub BltNpc(ByVal MapNpcNum As Long)

    Dentro dela, bem no inicio, procure por:

    Código:
    Sprite = Npc(MapNpc(MapNpcNum).num).Sprite

    Abaixo adicione:

    Código:
    'Analisar Evolve
        If MapNpc(MapNpcNum).Evolve > 0 Then
            If Npc(MapNpc(MapNpcNum).num).Evolve(MapNpc(MapNpcNum).Evolve).Data1(7) > 0 Then
                Sprite = Npc(MapNpc(MapNpcNum).num).Evolve(MapNpc(MapNpcNum).Evolve).Data1(7)
            End If
        End If

    [ 1.6 - Barras ]

    Spoiler:


    Procure por:

    Código:
    Private Sub BltBars()

    Substitua TODA a SUB por isso aqui:

    Código:
    Private Sub BltBars()
    Dim tmpY As Long, tmpX As Long
    Dim sWidth As Long, sHeight As Long
    Dim sRECT As RECT
    Dim barWidth As Long
    Dim i As Long, npcNum As Long, partyIndex As Long
    Dim HaveMaxHP As Boolean

        ' If debug mode, handle error then exit out
        If Options.Debug = 1 Then On Error GoTo errorhandler
        
        ' dynamic bar calculations
        sWidth = DDSD_Bars.lWidth
        sHeight = DDSD_Bars.lHeight / 4
        
        ' render health bars
        For i = 1 To MAX_MAP_NPCS
            npcNum = MapNpc(i).num
            ' exists?
            If npcNum > 0 Then
            
                'Evolve Hp Show
                If MapNpc(i).MaxHP > 0 Then
                    If MapNpc(i).Vital(Vitals.HP) > 0 And MapNpc(i).Vital(Vitals.HP) < MapNpc(i).MaxHP Then
                        GoTo RenderMaxHP
                    End If
                End If
                
                ' alive?
                If MapNpc(i).Vital(Vitals.HP) > 0 And MapNpc(i).Vital(Vitals.HP) < Npc(npcNum).HP Then

    RenderMaxHP:
                    ' lock to npc
                    tmpX = MapNpc(i).x * PIC_X + MapNpc(i).XOffset + 16 - (sWidth / 2)
                    tmpY = MapNpc(i).y * PIC_Y + MapNpc(i).YOffset + 35
                    
                    ' calculate the width to fill
                    barWidth = ((MapNpc(i).Vital(Vitals.HP) / sWidth) / (Npc(npcNum).HP / sWidth)) * sWidth
                    
                    If MapNpc(i).Evolve > 0 And MapNpc(i).MaxHP > 0 Then
                        barWidth = ((MapNpc(i).Vital(Vitals.HP) / sWidth) / (MapNpc(i).MaxHP / sWidth)) * sWidth
                    End If
                    
                    ' 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
        Next

        ' check for casting time bar
        If SpellBuffer > 0 Then
            If Spell(PlayerSpells(SpellBuffer)).CastTime > 0 Then
                ' lock to player
                tmpX = GetPlayerX(MyIndex) * PIC_X + Player(MyIndex).XOffset + 16 - (sWidth / 2)
                tmpY = GetPlayerY(MyIndex) * PIC_Y + Player(MyIndex).YOffset + 35 + sHeight + 1
                
                ' calculate the width to fill
                barWidth = (GetTickCount - SpellBufferTimer) / ((Spell(PlayerSpells(SpellBuffer)).CastTime * 1000)) * sWidth
                
                ' draw bar background
                With sRECT
                    .top = sHeight * 3 ' cooldown bar background
                    .Left = 0
                    .Right = 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 = sHeight * 2 ' cooldown bar
                    .Left = 0
                    .Right = barWidth
                    .Bottom = .top + sHeight
                End With
                Engine_BltFast ConvertMapX(tmpX), ConvertMapY(tmpY), DDS_Bars, sRECT, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY
            End If
        End If
        
        ' 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
        
        ' draw party health bars
        If Party.Leader > 0 Then
            For i = 1 To MAX_PARTY_MEMBERS
                partyIndex = Party.Member(i)
                If (partyIndex > 0) And (partyIndex <> MyIndex) And (GetPlayerMap(partyIndex) = GetPlayerMap(MyIndex)) Then
                    ' player exists
                    If GetPlayerVital(partyIndex, Vitals.HP) > 0 And GetPlayerVital(partyIndex, Vitals.HP) < GetPlayerMaxVital(partyIndex, Vitals.HP) Then
                        ' lock to Player
                        tmpX = GetPlayerX(partyIndex) * PIC_X + Player(partyIndex).XOffset + 16 - (sWidth / 2)
                        tmpY = GetPlayerY(partyIndex) * PIC_X + Player(partyIndex).YOffset + 35
                        
                        ' calculate the width to fill
                        barWidth = ((GetPlayerVital(partyIndex, Vitals.HP) / sWidth) / (GetPlayerMaxVital(partyIndex, 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
            Next
        End If
                        
        
        ' Error handler
        Exit Sub
    errorhandler:
        HandleError "BltBars", "modDirectDraw7", Err.Number, Err.Description, Err.Source, Err.HelpContext
        Err.Clear
        Exit Sub
    End Sub

    [ 1.7 - Recebimento ]

    Spoiler:


    Procure por :

    Código:
    Private Sub HandleMapNpcData

    Substitua TODA a SUB por...

    Código:

    Private Sub HandleMapNpcData(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim i As Long, OnlyOne 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()
        
        OnlyOne = Buffer.ReadLong

        If OnlyOne <= 0 Then
            For i = 1 To MAX_MAP_NPCS
                With MapNpc(i)
                    .num = Buffer.ReadLong
                    .x = Buffer.ReadLong
                    .y = Buffer.ReadLong
                    .Dir = Buffer.ReadLong
                    .Vital(HP) = Buffer.ReadLong
                    .Evolve = Buffer.ReadByte
                    .MaxHP = Buffer.ReadLong
                End With
            Next
        Else
            i = Buffer.ReadLong
            With MapNpc(i)
                .num = Buffer.ReadLong
                .x = Buffer.ReadLong
                .y = Buffer.ReadLong
                .Dir = Buffer.ReadLong
                .Vital(HP) = Buffer.ReadLong
                .Evolve = Buffer.ReadByte
                .MaxHP = Buffer.ReadLong
            End With
        End If
        
        ' Error handler
        Exit Sub
    errorhandler:
        HandleError "HandleMapNpcData", "modHandleData", Err.Number, Err.Description, Err.Source, Err.HelpContext
        Err.Clear
        Exit Sub
    End Sub


    [ 1.8 - Sensualidade da Form NPC Editor ]

    Spoiler:


    Procure por...

    Código:
    Public Sub EditorNpc_BltSprite()

    Acima dessa sub adicione:

    Código:

    Public Sub EditorNpc_BltSprite_Evolve()
    Dim Sprite As Long
    Dim sRECT As DxVBLib.RECT
    Dim dRECT As DxVBLib.RECT

        ' If debug mode, handle error then exit out
        If Options.Debug = 1 Then On Error GoTo errorhandler

        Sprite = frmEditor_NPC.scrlNpcEvolve(3).Value

        If Sprite < 1 Or Sprite > NumCharacters Then
            frmEditor_NPC.picNpcEvolve.Cls
            Exit Sub
        End If

        CharacterTimer(Sprite) = GetTickCount + SurfaceTimerMax

        If DDS_Character(Sprite) Is Nothing Then
            Call InitDDSurf("characters\" & Sprite, DDSD_Character(Sprite), DDS_Character(Sprite))
        End If

        sRECT.top = 0
        sRECT.Bottom = SIZE_Y
        sRECT.Left = PIC_X * 3 ' facing down
        sRECT.Right = sRECT.Left + SIZE_X
        dRECT.top = 0
        dRECT.Bottom = SIZE_Y
        dRECT.Left = 0
        dRECT.Right = SIZE_X
        Call Engine_BltToDC(DDS_Character(Sprite), sRECT, dRECT, frmEditor_NPC.picNpcEvolve)
        
        ' Error handler
        Exit Sub
    errorhandler:
        HandleError "EditorNpc_BltSprite_Evolve", "modDirectDraw7", Err.Number, Err.Description, Err.Source, Err.HelpContext
        Err.Clear
        Exit Sub
    End Sub


    _________________
    "Mistress of shattered hopes and forever broken dreams"
    Profane ~
    Profane ~
    Moderador Global
    Moderador Global

    Mensagens : 774
    Créditos : 128
    Cash : 0

    [Prof ~] NPC Evolve  Empty Re: [Prof ~] NPC Evolve

    Mensagem por Profane ~ em Seg Fev 25, 2019 4:13 am


    • Server Side



    [ 2.0 - Adicionando o Trigger Like a Rainbow] 

    Spoiler:



    Dentro do servidor, eu indicaria adicionar um novo Modulo, no meu caso eu adicionei e o coloquei o Nome de...

    Código:
    modNpcEvolve

    [Prof ~] NPC Evolve  AcNmMbE

    Você não é obrigado a fazer o mesmo, mas em casos de organização é o decente a se fazer. Ainda mais se no futuro desejar maiores incrementações... saberá onde estar a área relacionada.

    Dentro do novo modulo, adicione:

    Código:
    Option Explicit

    '###################################################
    '# Modulo Responsável por armazenar Funções e Subs #
    '#         relacionadas a Evolve dos Npc's.        #
    '###################################################


    'Analisa se o Npc tem Evolução
    Sub HaveNpcEvolve(ByVal mapNum As Long, ByVal MapNpcNum As Long)
    Dim npcNum As Long, MaxVital As Long
    Dim Npc_HP As Long
    Dim Anim As Long

        npcNum = MapNpc(mapNum).Npc(MapNpcNum).Num
        
        'Ele está em momento de Evolve
        If GetTickCount < MapNpc(mapNum).Npc(MapNpcNum).Evolve_Timer Then Exit Sub
        
        'Analisar Slots de Evolução Baseado na Atual e no MAX
        If MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1 <= MAX_NPC_EVOLVE Then
            'Ha Alguma Evolução Disponível?
            If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(1) > 0 Then
                'Existe evolução disponível, então analisar HP%
                
                MaxVital = GetNpcMaxVital(npcNum, HP)
                Npc_HP = MapNpc(mapNum).Npc(MapNpcNum).Vital(HP)
                Npc_HP = (Npc_HP * 100) / MaxVital
                
                'Bateu o Valor Necessário para Evolve?
                If Npc_HP <= Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(1) Then
                    MapNpc(mapNum).Npc(MapNpcNum).Evolve_Timer = GetTickCount + 100 + (Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(2) * 1000) 'Aplica os Segundo para Evolve
                    
                    'Analisar Animação
                    If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(4) > 0 And Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(4) <= MAX_ANIMATIONS Then
                        Anim = Npc(npcNum).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(4)
                        If Len(Trim$(Animation(Anim).Name)) > 0 Then 'Enviar Animação de Pre Evolve
                            SendAnimation mapNum, Anim, MapNpc(mapNum).Npc(MapNpcNum).x, MapNpc(mapNum).Npc(MapNpcNum).y, TARGET_TYPE_NPC, MapNpcNum
                        End If
                    End If
                    
                End If
            End If
        End If
          
    End Sub

    [ 2.1 - Adicionando Constant de Max Evolve ]

    Spoiler:


    Vá ao modConstants. Procure por... 
    Código:
    Public Const MAX_PARTY_MEMBERS As Long = 4

    Adicione abaixo:

    Código:
    Public Const MAX_NPC_EVOLVE As Byte = 4

    Lembrando que é estritamente interessante que o Valor que foi colocado nesta Constante seja o mesmo a qual você decidiu no Client Side.



    [ 2.2 - Adicionando as Memórias no Servidor. ] 

    Spoiler:


    Vá ao ModTypes no Servidor e procure por...
    Código:
    Private Type MapNpcRec

    Dentro dele, de preferencia la pelo fim, antes do End Type, adicione:

    Código:
        Evolve As Byte          'Guarda o Valor de Evolve
        Evolve_Timer As Long    'Tempo de Evolve Charge
        
        'Evolve Effect's
        HP_Up As Integer
        Power_Up As Integer
        MaxHp As Long

    Agora procure por...

    Código:
    Private Type NpcRec

    Dentro dele, de preferencia no final, antes do End Types.. adicione.

    Código:
    Evolve(1 To MAX_NPC_EVOLVE) As EvolveRec

    Acima do...

    Código:
    Private Type NpcRec

    Adicione:

    Código:
    'Npc Evolve Data()
    Private Type EvolveRec
        Data1(1 To 9) As Integer    'Valores Numericos
        Data2 As String * 100       'Valores em Texto
    End Type


    [ 2.3 - Modificações de Gatilho ]

    Spoiler:


    Vá ao modCombat no Servidor... Procure por...

    Código:
    Public Sub TryNpcAttackPlayer(ByVal MapNpcNum As Long, ByVal index As Long)

    Dentro da Sub procure por...

    Código:
    ' Get the damage we can do
    Damage = GetNpcDamage(npcNum)

    Abaixo dele adicione:

    Código:
    'Evolve Power Up
    If MapNpc(mapNum).Npc(MapNpcNum).Power_Up > 0 Then Damage = Damage + ((Damage / 100) * MapNpc(mapNum).Npc(MapNpcNum).Power_Up)
                

    Agora procure por...

    Código:
    Public Sub PlayerAttackNpc(ByVal attacker As Long, ByVal MapNpcNum As Long, ByVal Damage As Long, Optional ByVal spellnum As Long, Optional ByVal overTime As Boolean = False)

    Dentro desta SUB, procure por...

    Código:
    ' set the regen timer
        TempPlayer(attacker).stopRegen = True
        TempPlayer(attacker).stopRegenTimer = GetTickCount

    Abaixo disso adicione:

    Código:
    'Evolve Immune
        If MapNpc(mapNum).Npc(MapNpcNum).Evolve_Timer > 0 Then
            If Npc(MapNpc(mapNum).Npc(MapNpcNum).Num).Evolve(MapNpc(mapNum).Npc(MapNpcNum).Evolve + 1).Data1(3) > 0 Then
                Damage = 0
            End If
        End If

    Ainda dentro da mesma sub, procure por...

    Código:
     ' Now set HP to 0 so we know to actually kill them in the server loop (this prevents subscript out of range)
            MapNpc(mapNum).Npc(MapNpcNum).Num = 0
            MapNpc(mapNum).Npc(MapNpcNum).SpawnWait = GetTickCount
            MapNpc(mapNum).Npc(MapNpcNum).Vital(Vitals.HP) = 0

    Abaixo adicione:

    Código:
    MapNpc(mapNum).Npc(MapNpcNum).Evolve = 0
    MapNpc(mapNum).Npc(MapNpcNum).Evolve_Timer = 0
    MapNpc(mapNum).Npc(MapNpcNum).MaxHp = 0

    Ainda na SUB procure por...

    Código:
    ' NPC not dead, just do the damage
    MapNpc(mapNum).Npc(MapNpcNum).Vital(Vitals.HP) = MapNpc(mapNum).Npc(MapNpcNum).Vital(Vitals.HP) - Damage

    Adicione abaixo...

    Código:
    'Analise de Evolve
    HaveNpcEvolve mapNum, MapNpcNum


    [ 2.4 - Serverlupando ] 

    Spoiler:


    Dentro do Servidor, procure o ModServerLoop, nele procure por...

    Código:
    Private Sub UpdateMapLogic()

    Dentro desta Sub, iremos trabalhar, logo abaixo do titulo da Sub, junto as declarações ( Dim.. ) adicione..

    Código:
    Dim Data_Regen As Long 'Evolve

    Agora, procure por...

    Código:
    If Map(mapNum).Npc(x) > 0 And MapNpc(mapNum).Npc(x).Num > 0 Then

    Abaixo adicione:

    Código:
    'Analisar Evolução Pendente
                        If MapNpc(mapNum).Npc(x).Evolve_Timer > 0 Then
                            If GetTickCount > MapNpc(mapNum).Npc(x).Evolve_Timer Then
                                'Clear
                                MapNpc(mapNum).Npc(x).Evolve_Timer = 0
                                
                                'Habilitar Evolve
                                MapNpc(mapNum).Npc(x).Evolve = MapNpc(mapNum).Npc(x).Evolve + 1
                                
                                'Enviar Animação de Evolução caso tenha
                                If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(6) > 0 And Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(6) <= MAX_ANIMATIONS Then
                                    SendAnimation mapNum, Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(6), MapNpc(mapNum).Npc(x).x, MapNpc(mapNum).Npc(x).y, TARGET_TYPE_NPC, x
                                End If
                                
                                'Analisar Buff's Put
                                If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(8) > 0 Then 'Power Up
                                    MapNpc(mapNum).Npc(x).Power_Up = Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(8)
                                End If
                                If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(9) > 0 Then 'Hp Up
                                    MapNpc(mapNum).Npc(x).HP_Up = Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(9)
                                    MapNpc(mapNum).Npc(x).MaxHp = GetNpcMaxVital(npcNum, HP) + ((GetNpcMaxVital(npcNum, HP) / 100) * MapNpc(mapNum).Npc(x).HP_Up)
                                End If
                                
                                'Analisar Restauramento de Hp
                                If Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data1(5) > 0 Then
                                    MapNpc(mapNum).Npc(x).Vital(HP) = GetNpcMaxVital(npcNum, HP)
                                    If MapNpc(mapNum).Npc(x).MaxHp > 0 Then MapNpc(mapNum).Npc(x).Vital(HP) = MapNpc(mapNum).Npc(x).MaxHp
                                End If
                                
                                'Analisar Frase de Envio - Evolve
                                If Len(Trim$(Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data2)) > 0 Then
                                    Call MapMsg(mapNum, Trim$(Npc(npcNum).Name) & " says: " & Trim$(Npc(npcNum).Evolve(MapNpc(mapNum).Npc(x).Evolve).Data2), SayColor)
                                End If
                                
                                'Atualizar NpcData
                                SendMapNpcsTo 0, mapNum, x
                            End If
                        End If
                    

    Mais abaixo, mas ainda na mesma SUB... procure por isso aqui..

    [Prof ~] NPC Evolve  WGsG7yi

    https://i.imgur.com/wGsG7yi.png

    Caso queira buscar em códigos... aqui está..

    Código:
    ' ////////////////////////////////////////////
                    ' // This is used for regenerating NPC's HP //
                    ' ////////////////////////////////////////////
                    ' Check to see if we want to regen some of the npc's hp
                    If Not MapNpc(mapNum).Npc(x).stopRegen Then
                        If MapNpc(mapNum).Npc(x).Num > 0 And TickCount > GiveNPCHPTimer + 10000 Then
                            If MapNpc(mapNum).Npc(x).Vital(Vitals.HP) > 0 Then
                                MapNpc(mapNum).Npc(x).Vital(Vitals.HP) = MapNpc(mapNum).Npc(x).Vital(Vitals.HP) + GetNpcVitalRegen(npcNum, Vitals.HP)
        
                                ' Check if they have more then they should and if so just set it to max
                                If MapNpc(mapNum).Npc(x).Vital(Vitals.HP) > GetNpcMaxVital(npcNum, Vitals.HP) Then
                                    MapNpc(mapNum).Npc(x).Vital(Vitals.HP) = GetNpcMaxVital(npcNum, Vitals.HP)
                                End If
                            End If
                        End If
                    End If

    Apague tudo isso ai, e no local adicione isso aqui.

    Código:
    ' ////////////////////////////////////////////
                    ' // This is used for regenerating NPC's HP //
                    ' ////////////////////////////////////////////
                    ' Check to see if we want to regen some of the npc's hp
                    If MapNpc(mapNum).Npc(x).stopRegen Then
                        If MapNpc(mapNum).Npc(x).Num > 0 And GetTickCount > MapNpc(mapNum).Npc(x).stopRegenTimer + 5000 Then
                            MapNpc(mapNum).Npc(x).stopRegenTimer = GetTickCount + 5000 'Tempo para a Proxima Regeneração
                            
                            If MapNpc(mapNum).Npc(x).Vital(Vitals.HP) > 0 Then
                                Data_Regen = GetNpcVitalRegen(npcNum, Vitals.HP)
                                MapNpc(mapNum).Npc(x).Vital(Vitals.HP) = MapNpc(mapNum).Npc(x).Vital(Vitals.HP) + Data_Regen
                                SendActionMsg mapNum, "-" & Data_Regen, BrightGreen, 1, (MapNpc(mapNum).Npc(x).x * 32), (MapNpc(mapNum).Npc(x).y * 32)
                                
                                'Setted HP MAX
                                Data_Regen = GetNpcMaxVital(npcNum, Vitals.HP)
                                If MapNpc(mapNum).Npc(x).MaxHp > 0 Then Data_Regen = MapNpc(mapNum).Npc(x).MaxHp
                                
                                 ' Check if they have more then they should and if so just set it to max
                                If MapNpc(mapNum).Npc(x).Vital(Vitals.HP) >= Data_Regen Then
                                    MapNpc(mapNum).Npc(x).stopRegen = False
                                    
                                    'De-Evolve
                                    MapNpc(mapNum).Npc(x).Evolve = 0
                                    MapNpc(mapNum).Npc(x).Evolve_Timer = 0
                                    MapNpc(mapNum).Npc(x).MaxHp = 0
                                    MapNpc(mapNum).Npc(x).Power_Up = 0
                                    
                                    'Setted Hp
                                    Data_Regen = GetNpcMaxVital(npcNum, Vitals.HP)
                                    MapNpc(mapNum).Npc(x).Vital(Vitals.HP) = Data_Regen
                                    
                                    'Atualizar NpcData
                                    SendMapNpcsTo 0, mapNum, x
                                End If
                              
                               SendMapNpcVitals mapNum, x
                            End If
                        End If
                    End If

    Esse é o novo esquema de Regen, decente e que faz umas coisinhas em adicional com o NPC Evoluido.
    Mostrará o NPC regenerando HP, será responsável por retirar o NPC de Batalha permitindo a Regen, e caso o NPC consiga se recuperar por completo, então ele retornará o NPC ao estado inicial, não evoluído, e o ciclo da batalha poderá recomeçar.


    [ 2.5 - Trick ou Trick ] 

    Spoiler:


    Aqui um leve aumento de Função ao Envio do NPC, no modServerTCP procure por...

    Código:
    Sub SendMapNpcsTo(ByVal index As Long

    Substitua totalmente essa SUB por esta aqui...

    Código:

    Sub SendMapNpcsTo(ByVal index As Long, ByVal mapNum As Long, Optional ByVal OnlyOne As Long)
        Dim packet As String
        Dim i As Long
        Dim Buffer As clsBuffer
        Set Buffer = New clsBuffer
        
        'Prevent Out of Range
        If OnlyOne > MAX_MAP_NPCS Then Exit Sub
        
        Buffer.WriteLong SMapNpcData
        Buffer.WriteLong OnlyOne
        
        If OnlyOne <= 0 Then
            For i = 1 To MAX_MAP_NPCS
                Buffer.WriteLong MapNpc(mapNum).Npc(i).Num
                Buffer.WriteLong MapNpc(mapNum).Npc(i).x
                Buffer.WriteLong MapNpc(mapNum).Npc(i).y
                Buffer.WriteLong MapNpc(mapNum).Npc(i).Dir
                Buffer.WriteLong MapNpc(mapNum).Npc(i).Vital(HP)
                Buffer.WriteByte MapNpc(mapNum).Npc(i).Evolve
                Buffer.WriteLong MapNpc(mapNum).Npc(i).MaxHp
            Next
        Else
            i = OnlyOne
            Buffer.WriteLong i
            Buffer.WriteLong MapNpc(mapNum).Npc(i).Num
            Buffer.WriteLong MapNpc(mapNum).Npc(i).x
            Buffer.WriteLong MapNpc(mapNum).Npc(i).y
            Buffer.WriteLong MapNpc(mapNum).Npc(i).Dir
            Buffer.WriteLong MapNpc(mapNum).Npc(i).Vital(HP)
            Buffer.WriteByte MapNpc(mapNum).Npc(i).Evolve
            Buffer.WriteLong MapNpc(mapNum).Npc(i).MaxHp
        End If

        If index > 0 And index <= MAX_PLAYERS Then
            SendDataTo index, Buffer.ToArray()
        ElseIf index <= 0 Then
            SendDataToMap mapNum, Buffer.ToArray() 'E assim nascem as gambiarras ~
        End If
        
        Set Buffer = Nothing
    End Sub



    Creio que está tudo ai... Caso venha a dar algum tipo de problema refaça.. leia todos os coments do Post caso tenha, e por ultimo se não conseguir resolver (se é que vai encontrar problemas /o/) você manda ai o Buxo que tentamos ajudar.

    A Configuração é bem simples, adicione os valores que é sucesso.

    Não é necessário apagar os NPC's já feitos, porém é interessante que seja feito... O Designer do Sistema foi feito em cima de uma EO 2.0. No que foi mexido não se é necessário perder os NPCs.

    Com a estrutura montada é possível configurar infinitas coisas em adicional e etc.

    Link para Download da Engine Mãe já contendo o sistema programado direto pela Loved Me.
    http://www.mediafire.com/file/0ovwt3goc7vhtw5/EO_2.0_NPC_Evolution.rar/file


    _________________
    "Mistress of shattered hopes and forever broken dreams"
    DragonicK
    DragonicK
    Lenda
    Lenda

    Mensagens : 488
    Créditos : 71
    Cash : 0

    Ficha do personagem
    Nível: 1
    Experiência:
    [Prof ~] NPC Evolve  Left_bar_bleue0/0[Prof ~] NPC Evolve  Empty_bar_bleue  (0/0)
    Vida:
    [Prof ~] NPC Evolve  Left_bar_bleue30/30[Prof ~] NPC Evolve  Empty_bar_bleue  (30/30)

    [Prof ~] NPC Evolve  Empty Re: [Prof ~] NPC Evolve

    Mensagem por DragonicK em Seg Fev 25, 2019 6:02 am

    Ficou bom, agora faz o npc voar.
    GODZILLA
    GODZILLA
    Membro Ativo
    Membro Ativo

    Mensagens : 383
    Créditos : 26
    Cash : 5

    Ficha do personagem
    Nível: 1
    Experiência:
    [Prof ~] NPC Evolve  Left_bar_bleue5/50[Prof ~] NPC Evolve  Empty_bar_bleue  (5/50)
    Vida:
    [Prof ~] NPC Evolve  Left_bar_bleue30/30[Prof ~] NPC Evolve  Empty_bar_bleue  (30/30)

    [Prof ~] NPC Evolve  Empty Re: [Prof ~] NPC Evolve

    Mensagem por GODZILLA em Seg Fev 25, 2019 2:06 pm

    @DragonicK escreveu:Ficou bom, agora faz o npc voar.

    Conteúdo patrocinado

    [Prof ~] NPC Evolve  Empty Re: [Prof ~] NPC Evolve

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Sab Set 21, 2019 10:33 am