Makers Brasil
Bem Vindos a Maker´s Brasil (um forum para criação de servidores 2D e 3D)Nos desejamos boa sorte no seu projeto!

Npc Atacando com Spell 2.0

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Npc Atacando com Spell 2.0

Mensagem por Dracolas em Seg Jun 13, 2011 9:32 pm

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 adicione



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



cheers cheers












Última edição por Dracolas em Sab Jul 02, 2011 12:12 am, editado 1 vez(es)
avatar
Dracolas
Sentinela
Sentinela

Mensagens : 16
Estrelas Makers : 93
Creditos : 7
Data de inscrição : 21/01/2011
Idade : 20
Localização : Vitória da Conquista/BA

Voltar ao Topo Ir em baixo

Re: Npc Atacando com Spell 2.0

Mensagem por spectrus em Seg Jun 13, 2011 9:36 pm

Muito bom!!! +1 CRED!


Divulgue nosso Forum!
[Você precisa estar registrado e conectado para ver este link.]
Código:
[url=http://makersbrasil.forumeiros.com/]
src="http://img841.imageshack.us/img841/9522/92324935.png"
border="0">[/url]



E meu fan? entao use:

Código:
[img]http://www.baixa.la/arquivos/3908525_imagem.gif[/img]

Sign:
Spoiler:



avatar
spectrus
Administrador
Administrador

Mensagens : 299
Estrelas Makers : 1466
Creditos : 49
Data de inscrição : 01/01/2011
Idade : 23
Localização : V.da conquista bahia

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum