MMORPG Brasil
Ola, visitante! Agradecemos sua visita, para ter acesso a todo nosso conteúdo recomendamos que faça um cadastro no fórum, com ele você pode participar de tópicos e ter acesso a todas áreas da comunidade!

Participe do fórum, é rápido e fácil

MMORPG Brasil
Ola, visitante! Agradecemos sua visita, para ter acesso a todo nosso conteúdo recomendamos que faça um cadastro no fórum, com ele você pode participar de tópicos e ter acesso a todas áreas da comunidade!
MMORPG Brasil
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Npc Usando Spells

+2
Halls02
Thales12
6 participantes

Ir para baixo

Npc Usando Spells Empty Npc Usando Spells

Mensagem por Thales12 Qua 26 Set 2012, 19:08

PARA QUE SERVE ISSO?

Bom Esta lista de códigos fará com que os NPC's do seu jogo utilizem também spell's.
Tanto Spell's de ataque como Spell's de cura. Bom vamos ao que interessa

Lado do SEVER

Abra o seu SERVER.VBP

Em modConstants

Procure por :

Código:
    Public Const MAX_PARTY_MEMBERS As Long = 4

Embaixo dele você adciona

Código:
Public Const MAX_NPC_SPELLS As Long = 5

Isso diz quantas spells seu npc terá, no caso 5 mas pode ter mais ou menos.

Agora vá para modTypes

Lá procure por Private Type NpcRec

Adcione isso entre Private Type NpcRec e End Type

Código:
    Spell(1 To MAX_NPC_SPELLS) As Long

Ainda em modTypes

Procure Private Type MapNpcRec

(Fica logo abaixo de Private Type NpcRec.)

Entre Private Type MapNpcRec e End Type adcione:

Código:
SpellTimer(1 To MAX_NPC_SPELLS) As Long
        Heals As Integer

Vamos para modCombat

Procure por Sub NpcAttackPlayer

No final desse Sub após até do End Sub adcione isto

Código:
Sub NpcSpellPlayer(ByVal MapNpcNum As Long, ByVal Victim As Long, SpellSlotNum As Long)
        Dim mapnum As Long
        Dim i As Long
        Dim n As Long
        Dim SpellNum As Long
        Dim Buffer As clsBuffer
        Dim InitDamage As Long
        Dim Damage As Long
        Dim MaxHeals As Long

        ' Check for subscript out of range
        If MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Or IsPlaying(Victim) = False Then
            Exit Sub
        End If

        ' Check for subscript out of range
        If MapNpc(GetPlayerMap(Victim)).Npc(MapNpcNum).Num <= 0 Then
            Exit Sub
        End If
     
        If SpellSlotNum <= 0 Or SpellSlotNum > MAX_NPC_SPELLS Then Exit Sub

        ' The Variables
        mapnum = GetPlayerMap(Victim)
        SpellNum = Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Spell(SpellSlotNum)
     
        ' Send this packet so they can see the person attacking
        Set Buffer = New clsBuffer
        Buffer.WriteLong SNpcAttack
        Buffer.WriteLong MapNpcNum
        SendDataToMap mapnum, Buffer.ToArray()
        Set Buffer = Nothing
     
        ' CoolDown Time
        If MapNpc(mapnum).Npc(MapNpcNum).SpellTimer(SpellSlotNum) > GetTickCount Then Exit Sub
     
        ' Spell Types
            Select Case Spell(SpellNum).Type
                ' AOE Healing Spells
                Case SPELL_TYPE_HEALHP
                ' Make sure an npc waits for the spell to cooldown
                MaxHeals = 1  Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Stat(Stats.intelligence) \ 25
                If MapNpc(mapnum).Npc(MapNpcNum).Heals >= MaxHeals Then Exit Sub
                    If MapNpc(mapnum).Npc(MapNpcNum).Vital(Vitals.HP) <= Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).HP * 0.3 Then
                        If Spell(SpellNum).IsAoE Then
                            For i = 1 To MAX_MAP_NPCS
                                If MapNpc(mapnum).Npc(i).Num > 0 Then
                                    If MapNpc(mapnum).Npc(i).Vital(Vitals.HP) > 0 Then
                                        If isInRange(Spell(SpellNum).AoE, MapNpc(mapnum).Npc(MapNpcNum).x, MapNpc(mapnum).Npc(MapNpcNum).y, MapNpc(mapnum).Npc(i).x, MapNpc(mapnum).Npc(i).y) Then
                                            InitDamage = Spell(SpellNum).Vital  (Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Stat(Stats.intelligence) / 2)
                     
                                            MapNpc(mapnum).Npc(i).Vital(Vitals.HP) = MapNpc(mapnum).Npc(i).Vital(Vitals.HP)  InitDamage
                                            SendActionMsg mapnum, " " & InitDamage, BrightGreen, 1, (MapNpc(mapnum).Npc(i).x * 32), (MapNpc(mapnum).Npc(i).y * 32)
                                            Call SendAnimation(mapnum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_NPC, MapNpcNum)
                     
                                            If MapNpc(mapnum).Npc(i).Vital(Vitals.HP) > Npc(MapNpc(mapnum).Npc(i).Num).HP Then
                                                MapNpc(mapnum).Npc(i).Vital(Vitals.HP) = Npc(MapNpc(mapnum).Npc(i).Num).HP
                                            End If
                     
                                            MapNpc(mapnum).Npc(MapNpcNum).Heals = MapNpc(mapnum).Npc(MapNpcNum).Heals  1
                     
                                            MapNpc(mapnum).Npc(MapNpcNum).SpellTimer(SpellSlotNum) = GetTickCount  Spell(SpellNum).CDTime * 1000
                                            Exit Sub
                                        End If
                                    End If
                                End If
                            Next
                        Else
                        ' Non AOE Healing Spells
                            InitDamage = Spell(SpellNum).Vital  (Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Stat(Stats.intelligence) / 2)
                     
                            MapNpc(mapnum).Npc(MapNpcNum).Vital(Vitals.HP) = MapNpc(mapnum).Npc(MapNpcNum).Vital(Vitals.HP)  InitDamage
                            SendActionMsg mapnum, " " & InitDamage, BrightGreen, 1, (MapNpc(mapnum).Npc(MapNpcNum).x * 32), (MapNpc(mapnum).Npc(MapNpcNum).y * 32)
                            Call SendAnimation(mapnum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_NPC, MapNpcNum)
                     
                            If MapNpc(mapnum).Npc(MapNpcNum).Vital(Vitals.HP) > Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).HP Then
                                MapNpc(mapnum).Npc(MapNpcNum).Vital(Vitals.HP) = Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).HP
                            End If
                     
                            MapNpc(mapnum).Npc(MapNpcNum).Heals = MapNpc(mapnum).Npc(MapNpcNum).Heals  1
                     
                            MapNpc(mapnum).Npc(MapNpcNum).SpellTimer(SpellSlotNum) = GetTickCount  Spell(SpellNum).CDTime * 1000
                            Exit Sub
                        End If
                    End If
                 
                ' AOE Damaging Spells
                Case SPELL_TYPE_DAMAGEHP
                ' Make sure an npc waits for the spell to cooldown
                    If Spell(SpellNum).IsAoE Then
                        For i = 1 To Player_HighIndex
                            If IsPlaying(i) Then
                                If GetPlayerMap(i) = mapnum Then
                                    If isInRange(Spell(SpellNum).AoE, MapNpc(mapnum).Npc(MapNpcNum).x, MapNpc(mapnum).Npc(MapNpcNum).y, GetPlayerX(i), GetPlayerY(i)) Then
                                        InitDamage = Spell(SpellNum).Vital  (Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Stat(Stats.intelligence) / 2)
                                        Damage = InitDamage - Player(i).Stat(Stats.willpower)
                                            If Damage <= 0 Then
                                                SendActionMsg GetPlayerMap(i), "RESIST!", Pink, 1, (GetPlayerX(i) * 32), (GetPlayerY(i) * 32)
                                                Exit Sub
                                            Else
                                                NpcAttackPlayer MapNpcNum, i, Damage
                                                SendAnimation mapnum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_PLAYER, MapNpcNum
                                                MapNpc(mapnum).Npc(MapNpcNum).SpellTimer(SpellSlotNum) = GetTickCount  Spell(SpellNum).CDTime * 1000
                                                Exit Sub
                                            End If
                                    End If
                                End If
                            End If
                        Next
                    ' Non AoE Damaging Spells
                    Else
                        If isInRange(Spell(SpellNum).Range, MapNpc(mapnum).Npc(MapNpcNum).x, MapNpc(mapnum).Npc(MapNpcNum).y, GetPlayerX(Victim), GetPlayerY(Victim)) Then
                        InitDamage = Spell(SpellNum).Vital  (Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Stat(Stats.intelligence) / 2)
                        Damage = InitDamage - Player(Victim).Stat(Stats.willpower)
                            If Damage <= 0 Then
                                SendActionMsg GetPlayerMap(Victim), "RESIST!", Pink, 1, (GetPlayerX(Victim) * 32), (GetPlayerY(Victim) * 32)
                                Exit Sub
                            Else
                                NpcAttackPlayer MapNpcNum, Victim, Damage
                                SendAnimation mapnum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_PLAYER, Victim
                                MapNpc(mapnum).Npc(MapNpcNum).SpellTimer(SpellSlotNum) = GetTickCount  Spell(SpellNum).CDTime * 1000
                                Exit Sub
                            End If
                        End If
                    End If
                End Select
    End Sub

No modServerLoop

Procure por isso e delete:

Código:
Else
                                ' lol no npc combat [img]/users/2515/17/56/91/smiles/881399.gif[/img]
                            End If

Agora Procure no mesmo mod:

Código:
' ////////////////////////////////////////////
                    ' // This is used for regenerating NPC's HP //
                    ' ////////////////////////////////////////////

Acima disso adcione:

Código:
' Spell Casting
                                    For i = 1 To MAX_NPC_SPELLS
                                        If Npc(npcNum).Spell(i) > 0 Then
                                            If MapNpc(mapnum).Npc(x).SpellTimer(i)  (Spell(Npc(npcNum).Spell(i)).CastTime * 1000) < GetTickCount Then
                                                NpcSpellPlayer x, target, i
                                            End If
                                        End If
                                    Next
                                End If

Acabou o Lado do Servidor salve e compile ^.^

Vamos para o Client agora.
Abra o seu CLIENT.VBP

Vá em modConstants

Procure por:

Código:
    Public Const MAX_PARTY_MEMBERS As Long = 4

Logo abaixo adcione:

Código:
    Public Const MAX_NPC_SPELLS As Long = 5

Agora vamos para o modTypes

Procure por Private Type NpcRec

Entre o Private Type NpcRec e o End Type Adcione:

Código:
    Spell(1 To MAX_NPC_SPELLS) As Long

Vá para modGameEditors

Procure por Public Sub NpcEditorInit

Ache esta linha:

Código:
    .txtDamage.text = Npc(EditorIndex).Damage

Logo abaixo disso adcione:

Código:
.scrlSpellNum.Max = MAX_NPC_SPELLS
            .scrlSpellNum.Value = 1

agora baixe esses 2 arquivos e os adcione no seu projeto:

http://www.touchofdeathforums.com/smf/index.php?action=dlattach;topic=59564.0;attach=18160
http://www.touchofdeathforums.com/smf/index.php?action=dlattach;topic=59564.0;attach=18161

Ai é só vc salvar e compilar.

Creditos : nao sei de quem é
Créditos: Thales12 por postar
Thales12
Thales12
Membro Veterano
Membro Veterano

Mensagens : 1011

http://www.rdmgames.tk

Ir para o topo Ir para baixo

Npc Usando Spells Empty Re: Npc Usando Spells

Mensagem por Halls02 Dom 09 Dez 2012, 11:54

nao consigo baixar os arquivos ultimos q vc citou
akeles sites q vc passou la no final n consegui
Halls02
Halls02
Novato
Novato

Mensagens : 18

Ir para o topo Ir para baixo

Npc Usando Spells Empty Re: Npc Usando Spells

Mensagem por Storm™ Dom 09 Dez 2012, 13:05

Thales12 - Não da para baixa os Arquivos , Por Favor Edite o Topico .
Storm™
Storm™
Moderador Global
Moderador Global

Mensagens : 2155

http://senningames.com

Ir para o topo Ir para baixo

Npc Usando Spells Empty Re: Npc Usando Spells

Mensagem por LythZerou Sáb 29 Dez 2012, 14:56

Alguem posta os arquivos, por que estes estão OFF, por favor...
LythZerou
LythZerou
Membro
Membro

Mensagens : 108

Ir para o topo Ir para baixo

Npc Usando Spells Empty Re: Npc Usando Spells

Mensagem por TheKirin Dom 17 Mar 2013, 22:55

Alguém disponibiliza o link de download daki quero muito esse sistema...
TheKirin
TheKirin
Membro Vitalicio
Membro Vitalicio

Mensagens : 561

Ir para o topo Ir para baixo

Npc Usando Spells Empty Re: Npc Usando Spells

Mensagem por GoldSlash Qua 22 maio 2013, 05:19

Nem passo 1 semana, creio q n estou revivendo topics...
Então tem alguns erros, provavelmente foi problema no copy e paste...
Eu ajeitei essa parte, ficou beleza, mas o script n é funcional, não acontece nada, nem com os downloads...
Peguei o ingles mesma coisa...
Mas enfim pra quem quer pelo menos fazer compilar, tem q arrumar essa parte.

Aqui:

Vamos para modCombat
Procure por Sub NpcAttackPlayer
No final desse Sub após até do End Sub adcione isto

Código:
 
Sub NpcSpellPlayer(ByVal MapNpcNum As Long, ByVal Victim As Long, SpellSlotNum As Long)
    Dim mapnum As Long
    Dim i As Long
    Dim n As Long
    Dim SpellNum As Long
    Dim Buffer As clsBuffer
    Dim InitDamage As Long
    Dim Damage As Long
    Dim MaxHeals As Long

    ' Check for subscript out of range
    If MapNpcNum <= 0 Or MapNpcNum > MAX_MAP_NPCS Or IsPlaying(Victim) = False Then
        Exit Sub
    End If

    ' Check for subscript out of range
    If MapNpc(GetPlayerMap(Victim)).Npc(MapNpcNum).Num <= 0 Then
        Exit Sub
    End If
   
    If SpellSlotNum <= 0 Or SpellSlotNum > MAX_NPC_SPELLS Then Exit Sub

    ' The Variables
    mapnum = GetPlayerMap(Victim)
    SpellNum = Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Spell(SpellSlotNum)
   
    ' Send this packet so they can see the person attacking
    Set Buffer = New clsBuffer
    Buffer.WriteLong SNpcAttack
    Buffer.WriteLong MapNpcNum
    SendDataToMap mapnum, Buffer.ToArray()
    Set Buffer = Nothing
   
    ' CoolDown Time
    If MapNpc(mapnum).Npc(MapNpcNum).SpellTimer(SpellSlotNum) > GetTickCount Then Exit Sub
   
    ' Spell Types
        Select Case Spell(SpellNum).Type
            ' AOE Healing Spells
            Case SPELL_TYPE_HEALHP
            ' Make sure an npc waits for the spell to cooldown
            MaxHeals = 1 + Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Stat(Stats.intelligence) \ 25
            If MapNpc(mapnum).Npc(MapNpcNum).Heals >= MaxHeals Then Exit Sub
                If MapNpc(mapnum).Npc(MapNpcNum).Vital(Vitals.HP) <= Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).HP * 0.3 Then
                    If Spell(SpellNum).IsAoE Then
                        For i = 1 To MAX_MAP_NPCS
                            If MapNpc(mapnum).Npc(i).Num > 0 Then
                                If MapNpc(mapnum).Npc(i).Vital(Vitals.HP) > 0 Then
                                    If isInRange(Spell(SpellNum).AoE, MapNpc(mapnum).Npc(MapNpcNum).x, MapNpc(mapnum).Npc(MapNpcNum).y, MapNpc(mapnum).Npc(i).x, MapNpc(mapnum).Npc(i).y) Then
                                        InitDamage = Spell(SpellNum).Vital + (Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Stat(Stats.intelligence) / 2)
                   
                                        MapNpc(mapnum).Npc(i).Vital(Vitals.HP) = MapNpc(mapnum).Npc(i).Vital(Vitals.HP) + InitDamage
                                        SendActionMsg mapnum, "+" & InitDamage, BrightGreen, 1, (MapNpc(mapnum).Npc(i).x * 32), (MapNpc(mapnum).Npc(i).y * 32)
                                        Call SendAnimation(mapnum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_NPC, MapNpcNum)
                   
                                        If MapNpc(mapnum).Npc(i).Vital(Vitals.HP) > Npc(MapNpc(mapnum).Npc(i).Num).HP Then
                                            MapNpc(mapnum).Npc(i).Vital(Vitals.HP) = Npc(MapNpc(mapnum).Npc(i).Num).HP
                                        End If
                   
                                        MapNpc(mapnum).Npc(MapNpcNum).Heals = MapNpc(mapnum).Npc(MapNpcNum).Heals + 1
                   
                                        MapNpc(mapnum).Npc(MapNpcNum).SpellTimer(SpellSlotNum) = GetTickCount + Spell(SpellNum).CDTime * 1000
                                        Exit Sub
                                    End If
                                End If
                            End If
                        Next
                    Else
                    ' Non AOE Healing Spells
                        InitDamage = Spell(SpellNum).Vital + (Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Stat(Stats.intelligence) / 2)
                   
                        MapNpc(mapnum).Npc(MapNpcNum).Vital(Vitals.HP) = MapNpc(mapnum).Npc(MapNpcNum).Vital(Vitals.HP) + InitDamage
                        SendActionMsg mapnum, "+" & InitDamage, BrightGreen, 1, (MapNpc(mapnum).Npc(MapNpcNum).x * 32), (MapNpc(mapnum).Npc(MapNpcNum).y * 32)
                        Call SendAnimation(mapnum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_NPC, MapNpcNum)
                   
                        If MapNpc(mapnum).Npc(MapNpcNum).Vital(Vitals.HP) > Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).HP Then
                            MapNpc(mapnum).Npc(MapNpcNum).Vital(Vitals.HP) = Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).HP
                        End If
                   
                        MapNpc(mapnum).Npc(MapNpcNum).Heals = MapNpc(mapnum).Npc(MapNpcNum).Heals + 1
                   
                        MapNpc(mapnum).Npc(MapNpcNum).SpellTimer(SpellSlotNum) = GetTickCount + Spell(SpellNum).CDTime * 1000
                        Exit Sub
                    End If
                End If
               
            ' AOE Damaging Spells
            Case SPELL_TYPE_DAMAGEHP
            ' Make sure an npc waits for the spell to cooldown
                If Spell(SpellNum).IsAoE Then
                    For i = 1 To Player_HighIndex
                        If IsPlaying(i) Then
                            If GetPlayerMap(i) = mapnum Then
                                If isInRange(Spell(SpellNum).AoE, MapNpc(mapnum).Npc(MapNpcNum).x, MapNpc(mapnum).Npc(MapNpcNum).y, GetPlayerX(i), GetPlayerY(i)) Then
                                    InitDamage = Spell(SpellNum).Vital + (Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Stat(Stats.intelligence) / 2)
                                    Damage = InitDamage - Player(i).Stat(Stats.willpower)
                                        If Damage <= 0 Then
                                            SendActionMsg GetPlayerMap(i), "RESIST!", Pink, 1, (GetPlayerX(i) * 32), (GetPlayerY(i) * 32)
                                            Exit Sub
                                        Else
                                            NpcAttackPlayer MapNpcNum, i, Damage
                                            SendAnimation mapnum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_PLAYER, MapNpcNum
                                            MapNpc(mapnum).Npc(MapNpcNum).SpellTimer(SpellSlotNum) = GetTickCount + Spell(SpellNum).CDTime * 1000
                                            Exit Sub
                                        End If
                                End If
                            End If
                        End If
                    Next
                ' Non AoE Damaging Spells
                Else
                    If isInRange(Spell(SpellNum).Range, MapNpc(mapnum).Npc(MapNpcNum).x, MapNpc(mapnum).Npc(MapNpcNum).y, GetPlayerX(Victim), GetPlayerY(Victim)) Then
                    InitDamage = Spell(SpellNum).Vital + (Npc(MapNpc(mapnum).Npc(MapNpcNum).Num).Stat(Stats.intelligence) / 2)
                    Damage = InitDamage - Player(Victim).Stat(Stats.willpower)
                        If Damage <= 0 Then
                            SendActionMsg GetPlayerMap(Victim), "RESIST!", Pink, 1, (GetPlayerX(Victim) * 32), (GetPlayerY(Victim) * 32)
                            Exit Sub
                        Else
                            NpcAttackPlayer MapNpcNum, Victim, Damage
                            SendAnimation mapnum, Spell(SpellNum).SpellAnim, 0, 0, TARGET_TYPE_PLAYER, Victim
                            MapNpc(mapnum).Npc(MapNpcNum).SpellTimer(SpellSlotNum) = GetTickCount + Spell(SpellNum).CDTime * 1000
                            Exit Sub
                        End If
                    End If
                End If
            End Select
End Sub

Vou ainda tentar fazer o npc largar o fire.
GoldSlash
GoldSlash
Membro Sênior
Membro Sênior

Mensagens : 383

Ir para o topo Ir para baixo

Npc Usando Spells Empty Re: Npc Usando Spells

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


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