Suporte ao desenvolvimento de jogos!


    Erro quando o npc mata o player usando magia.

    Compartilhe
    avatar
    Snoopy
    Iniciante
    Iniciante

    Mensagens : 56
    Créditos : 7

    Erro quando o npc mata o player usando magia.

    Mensagem por Snoopy em Sab Maio 10, 2014 8:26 pm

    1* Primeiro Problema
    Bom eu cheio de problemas com a engine do nada descubro outro problema.
    É assim depois que o npc mata o player usando uma magia da o erro no servidor.


    esse erro acontece tanto quando o npc me da só um hit com a magia quanto com vários. sopra constar

    2* Erro em um tipo de item que fiz. ( já consegui resolver).Agr o problema que está dando dor de cabeça é esse ai em cima.

    Se não entenderem algo por favor me informem
    avatar
    Fadinext
    Iniciante
    Iniciante

    Mensagens : 33
    Créditos : 8

    Re: Erro quando o npc mata o player usando magia.

    Mensagem por Fadinext em Dom Maio 11, 2014 9:31 pm

    Provavelmente tem algum erro que não consegue pegar o spellNum,aí por padrão ele fica sendo zero.Como não existe magia 0 (só de 1 até 255,se você não mudou),o server trava.

    Coloca um Call PlayerMsg(index,"A magia é: " & spellNum,Red) por cima da linha que tá dando erro.Provavelmente vai aparecer a mensagem "A magia é: 0",então o que eu falei vai estar certo,e você vai ter que procurar o porquê de não encontrar o spellNum.
    avatar
    Snoopy
    Iniciante
    Iniciante

    Mensagens : 56
    Créditos : 7

    Re: Erro quando o npc mata o player usando magia.

    Mensagem por Snoopy em Seg Maio 12, 2014 12:17 pm

    fiz o que você disse porém em game a mensagem não chego o erro ficou do mesmo jeito de antes
    mais será que poderia por a primeira magia 0 invés de 1? dai ao invés de dar erro ele iria usar a magia 0.
    avatar
    Dooolly
    Moderador Global
    Moderador Global

    Medalhas :
    Mensagens : 1239
    Créditos : 147

    Ficha do personagem
    Nível: 1
    Vida:
    30/30  (30/30)
    Energia:
    0/0  (0/0)

    Re: Erro quando o npc mata o player usando magia.

    Mensagem por Dooolly em Seg Maio 12, 2014 1:23 pm

    @Snoopy escreveu:fiz o que você disse porém em game a mensagem não chego o erro ficou do mesmo jeito de antes
    mais será que poderia por a primeira magia 0 invés de 1? dai ao invés de dar erro ele iria usar a magia 0.

    o problema ñ eh pq está usando a magia 0, o problema eh q o SpellNum ñ está sendo definido...

    pode postar toda a Sub em q o erro ocorre em aki no topico para que eu possa ver se o erro está realmente na sub.. pois o servidor pode ñ está recebendo a informação dessa tal magia...

    Recomendo Usar isso:
    Código:
    Sub
    avatar
    Snoopy
    Iniciante
    Iniciante

    Mensagens : 56
    Créditos : 7

    Re: Erro quando o npc mata o player usando magia.

    Mensagem por Snoopy em Ter Maio 13, 2014 12:57 pm

    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), "RESISTE!", 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, i
                                                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), "RESISTE!", 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
    Tai vlw por estar ajudando.
    avatar
    Dooolly
    Moderador Global
    Moderador Global

    Medalhas :
    Mensagens : 1239
    Créditos : 147

    Ficha do personagem
    Nível: 1
    Vida:
    30/30  (30/30)
    Energia:
    0/0  (0/0)

    Re: Erro quando o npc mata o player usando magia.

    Mensagem por Dooolly em Ter Maio 13, 2014 1:15 pm

    @Snoopy escreveu:
    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), "RESISTE!", 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, i
                                                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), "RESISTE!", 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
    Tai vlw por estar ajudando.

    Cara o Codigo está normal, ñ vi nenhuma erro nele, acho q o servidor ñ está recebendo a magia q o NPC está usando...
    avatar
    Snoopy
    Iniciante
    Iniciante

    Mensagens : 56
    Créditos : 7

    Re: Erro quando o npc mata o player usando magia.

    Mensagem por Snoopy em Ter Maio 13, 2014 1:51 pm

    então se o npc usasse outras magias não daria erro?
    avatar
    Fadinext
    Iniciante
    Iniciante

    Mensagens : 33
    Créditos : 8

    Re: Erro quando o npc mata o player usando magia.

    Mensagem por Fadinext em Ter Maio 13, 2014 6:23 pm

    Não existe magia 0.
    O NPC pode estar usando a magia 18,por exemplo.Com esse erro no código,que eu também não achei qual é,o valor da spellNum tá sempre sendo 0.
    Como não existe a magia número 0,não dá pra acessar os data members da rec ( .type , .name, .mpcost etc),aí dá erro.

    Isso aconteceu comigo no meu sistema de receitas,o servidor não tava recebendo o número da receita,então por padrão tava sendo 0 e bugando tudo.

    Edit:Faz assim,embaixo de
    Código:
    spellNum = Npc(MapNpc(mapNum).Npc(mapNpcNum).Num).Spell(SpellSlotNum)

    Coloca:
    Código:
    If spellNum = 0 Then Exit Sub

    Provavelmente vai parar de travar o servidor,porém o NPC ainda não vai usar a magia.Você tá usando a Modification S ( E.O 2.6 ) ? Se for,vou dar uma olhada na source dela.


    Última edição por Fadinext em Ter Maio 13, 2014 6:28 pm, editado 1 vez(es) (Razão : O 2.6) formou um smiley..)
    avatar
    Snoopy
    Iniciante
    Iniciante

    Mensagens : 56
    Créditos : 7

    Re: Erro quando o npc mata o player usando magia.

    Mensagem por Snoopy em Qua Maio 14, 2014 1:34 pm

    cara eu fiz isso e o npc está usando a magia normalmente valeu por ajudar
    Mas porque se você disse que ele não iria usar mais? Question
    edit: to usando a Eclipse Omega (Super editado por min)a qual ja vem integrado a magia no npc.
    avatar
    Fadinext
    Iniciante
    Iniciante

    Mensagens : 33
    Créditos : 8

    Re: Erro quando o npc mata o player usando magia.

    Mensagem por Fadinext em Qua Maio 14, 2014 4:10 pm

    Achei que ia parar de usar magia,porque achei tava sempre pegando a 0,então sempre ia sair da Sub.Mas que bom que funcionou.

    Conteúdo patrocinado

    Re: Erro quando o npc mata o player usando magia.

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Qua Dez 12, 2018 9:19 am