Universo Games
Ola , Convidado



Você ainda não e cadastrado então cadastre-se e veja todas as atualizações no mundo rpg!!!
Universo Games

Suporte e Desenvolvimento só no Universo Games

Ola Convidado, Seja Bem vindo a equipe lhe deseja boa sorte no seu projeto!

Você não está conectado. Conecte-se ou registre-se

[EO]Sistema de Pet

Ver o tópico anterior Ver o tópico seguinte Ir em baixo  Mensagem [Página 1 de 1]

1Tutorial [EO]Sistema de Pet em Seg 11 Abr 2011, 13:47

Luucas Robeerto


Fundador
Fundador
Olá, bem vindo ao meu tutorial sobre como criar um Basic Pet System. Quando este tutorial é longo, você deve ter criado uma base sólida Pet Sistema para trabalhar em outras, que também inclui algumas características-chave de qualquer sistema de animal de estimação. Antes de começar, certifique-se de ter o seguinte:

Professional Visual Basic 6 / Enterprise
Cliente / Servidor de Arquivos de Origem
Conhecimento básico da utilização do IDE do VB6 e Linguagem
Um cérebro

Compatível com: Eclipse 2.0.0 Origens

Mods Opcional:
Abaixo estão as modificações outros usuários tenham criado para este sistema de estimação. É recomendado para a maioria dos mods que você siga esse mod primeiro tutorial, então vá e depois. Eu também tenho dado a classificação um tutorial estrelas (de cinco) e uma breve revisão. Por favor, não me PM para apoio a esses mods, eles não são criados por mim, e perguntas devem ser feitas aos criadores respectivos.

No final deste tutorial, você deve ser capaz de usar um animal de estimação, talvez algo como isto:

[Você precisa estar registrado e conectado para ver esta imagem.]
[Você precisa estar registrado e conectado para ver esta imagem.]

Do lado do cliente

Primeiro, vamos trabalhar sobre o código do cliente. Isto é principalmente o envio de comandos para o servidor para controlar o seu animal de estimação. Esses comandos incluem:

Chamando o seu animal de estimação
Atacar um alvo
NPC simples sequência
Deixando o seu animal passear ao redor do mapa
Dissolução seu animal de estimação.

Primeiro de tudo, você precisa trabalhar o seu caminho para modGameLogic.

Vá até o final do módulo e colar esses cinco procedimentos:

Código:
Sub SpawnPet(ByVal Index As Long)
    Dim Buffer As clsBuffer
   
    Set Buffer = New clsBuffer
   
    Buffer.WriteLong CSpawnPet
   
    SendData Buffer.ToArray()
   
    Set Buffer = Nothing

End Sub

Sub PetFollow(ByVal Index As Long)
    Dim Buffer As clsBuffer
   
    Set Buffer = New clsBuffer
   
    Buffer.WriteLong CPetFollowOwner
   
    SendData Buffer.ToArray()
   
    Set Buffer = Nothing
End Sub

Sub PetAttack(ByVal Index As Long)
    Dim Buffer As clsBuffer
   
    Set Buffer = New clsBuffer
   
    Buffer.WriteLong CPetAttackTarget
   
    SendData Buffer.ToArray()
   
    Set Buffer = Nothing
End Sub

Sub PetWander(ByVal Index As Long)
    Dim Buffer As clsBuffer
   
    Set Buffer = New clsBuffer
   
    Buffer.WriteLong CPetWander
   
    SendData Buffer.ToArray()
   
    Set Buffer = Nothing
End Sub

Sub PetDisband(ByVal Index As Long)
    Dim Buffer As clsBuffer
   
    Set Buffer = New clsBuffer
   
    Buffer.WriteLong CPetDisband
   
    SendData Buffer.ToArray()
   
    Set Buffer = Nothing
End Sub

Estes procedimentos são os comandos para controlar o seu animal de estimação. Observe os nomes dos processos são nomeados de forma adequada para cada comando.

Em seguida, você precisa abrir modEnumerations.
Vá até o fundo do enumerações do lado do cliente (Os que começam com um "C") e cole este CMSG_COUNT acima:

Código:
CSpawnPet
CPetFollowOwner
CPetAttackTarget
CPetWander
CPetDisband

Em seguida, vá para modHandleData e substituir "Sub HandleSpawnNpc"com este:

Código:
Private Sub HandleSpawnNpc(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
Dim n 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()
    n = Buffer.ReadLong

    With MapNpc(n)
        .Num = Buffer.ReadLong
        .x = Buffer.ReadLong
        .y = Buffer.ReadLong
        .Dir = Buffer.ReadLong
        .IsPet = Buffer.ReadByte
        .PetData.Name = Buffer.ReadString
        .PetData.Owner = Buffer.ReadLong
        ' Client use only
        .XOffset = 0
        .YOffset = 0
        .Moving = 0
    End With

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

Depois de ter feito isso, você precisará criar cinco botões ou etiquetas para acionar cada um dos comandos.

Colocá-los no menu de opções, ou em qualquer outro menu que você deseja. Depois de ter criado eles, deve ser algo parecido com isto:

[Você precisa estar registrado e conectado para ver esta imagem.]

Terá então a chamar cada um dos procedimentos anteriores para cada uma das suas respectivas funções. O parâmetro será necessário para passar para eles será "MyIndex" para cada um.

Finalmente, você precisará adicionar o código abaixo para o fundo do "MapNpcRec" em modTypes:

Código:
  'Pet Data
    IsPet As Byte
    PetData As PetRec

Abaixo "Dir As Byte" em PlayerRec, adicione isto:

Código:
Pet As PetRec

e adicionar esse tipo personalizado acima PlayerRec:

Código:
Public Type PetRec
    SpriteNum As Byte
    Name As String * 50
    Owner As Long
End Type

Server Side

Podemos agora passar para o código do lado do servidor mais complicada. O código do lado do servidor processa principalmente a desova e de que desova do animal de estimação, e manuseio de combate.


Em primeiro lugar, você precisa abrir modEnumerations.
Vá até o fundo do enumerações do lado do cliente (Os que começam com um "C") e cole este CMSG_COUNT acima:

Código:
CSpawnPet
CPetFollowOwner
CPetAttackTarget
CPetWander
CPetDisband

Em seguida, passar para modHandleData e procure por "Public Sub InitMessages ()". Vá até o final do procedimento e acrescentar:

Código:
    'Pet System
    HandleDataSub(CSpawnPet) = GetAddress(AddressOf HandleSpawnPet)
    HandleDataSub(CPetFollowOwner) = GetAddress(AddressOf HandlePetFollowOwner)
    HandleDataSub(CPetAttackTarget) = GetAddress(AddressOf HandlePetAttackTarget)
    HandleDataSub(CPetWander) = GetAddress(AddressOf HandlePetWander)
    HandleDataSub(CPetDisband) = GetAddress(AddressOf HandlePetDisband)

Estas cinco linhas chamará os respectivos procedimentos quando o pacote correto é recebida. Depois de ter colado estas linhas, vá até o fundo do modHandleData e adicionar esses cinco procedimentos:

Código:
Public Sub HandleSpawnPet(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    SpawnPet Index, GetPlayerMap(Index)
End Sub

Public Sub HandlePetFollowOwner(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim Buffer As clsBuffer
   
    PetFollowOwner Index
End Sub

Public Sub HandlePetAttackTarget(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim Buffer As clsBuffer
   
    If TempPlayer(Index).TempPetSlot < 1 Then Exit Sub
   
    MapNpc(GetPlayerMap(Index)).Npc(TempPlayer(Index).TempPetSlot).targetType = TempPlayer(Index).targetType
    MapNpc(GetPlayerMap(Index)).Npc(TempPlayer(Index).TempPetSlot).target = TempPlayer(Index).target
End Sub

Public Sub HandlePetWander(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim Buffer As clsBuffer
   
    PetWander Index
End Sub

Public Sub HandlePetDisband(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
    Dim Buffer As clsBuffer
   
    PetDisband Index, GetPlayerMap(Index)
    SendMap Index, GetPlayerMap(Index)
    PlayerWarp Index, GetPlayerMap(Index), GetPlayerX(Index), GetPlayerY(Index)
End Sub

Depois disso, vá para modGameLogic e adicionar esses procedimentos para o fundo da questão:

Código:
'makes the pet follow its owner
Sub PetFollowOwner(ByVal Index As Long)
    If TempPlayer(Index).TempPetSlot < 1 Then Exit Sub
   
    MapNpc(GetPlayerMap(Index)).Npc(TempPlayer(Index).TempPetSlot).targetType = 1
    MapNpc(GetPlayerMap(Index)).Npc(TempPlayer(Index).TempPetSlot).target = Index
End Sub

'makes the pet wander around the map
Sub PetWander(ByVal Index As Long)
    If TempPlayer(Index).TempPetSlot < 1 Then Exit Sub

    MapNpc(GetPlayerMap(Index)).Npc(TempPlayer(Index).TempPetSlot).targetType = TARGET_TYPE_NONE
    MapNpc(GetPlayerMap(Index)).Npc(TempPlayer(Index).TempPetSlot).target = 0
End Sub

'Clear the npc from the map
Sub PetDisband(ByVal Index As Long, ByVal MapNum As Long)
    If TempPlayer(Index).TempPetSlot < 1 Then Exit Sub
   
    Call ClearSingleMapNpc(TempPlayer(Index).TempPetSlot, MapNum)
    Map(GetPlayerMap(Index)).Npc(TempPlayer(Index).TempPetSlot) = 0
    TempPlayer(Index).TempPetSlot = 0
End Sub

Sub SpawnPet(ByVal Index As Long, ByVal MapNum As Long)
    Dim PlayerMap As Long
    Dim I As Integer
    Dim PetSlot As Byte
   
    'Prevent multiple pets for the same owner
    If TempPlayer(Index).TempPetSlot > 0 Then Exit Sub
   
    PlayerMap = GetPlayerMap(Index)
    PetSlot = 0
   
    For I = 1 To MAX_MAP_NPCS
        If Map(PlayerMap).Npc(I) = 0 Then
            PetSlot = I
            Exit For
        End If
    Next
   
    If PetSlot = 0 Then
        Call PlayerMsg(Index, "The map is too crowded for you to call on your pet!", Red)
        Exit Sub
    End If

    'create the pet for the map
    Map(PlayerMap).Npc(PetSlot) = #
    MapNpc(PlayerMap).Npc(PetSlot).Num = #
    'set its Pet Data
    MapNpc(PlayerMap).Npc(PetSlot).IsPet = YES
    MapNpc(PlayerMap).Npc(PetSlot).PetData.Name = GetPlayerName(Index) & "'s " & Npc(#).Name
    MapNpc(PlayerMap).Npc(PetSlot).PetData.Owner = Index
   
    'If Pet doesn't exist with player, link it to the player
    If Player(Index).Pet.SpriteNum <> # Then
        Player(Index).Pet.SpriteNum = #
        Player(Index).Pet.Name = GetPlayerName(Index) & "'s " & Npc(#).Name
    End If
   
    TempPlayer(Index).TempPetSlot = PetSlot
     
    'cache the map for sending
    Call MapCache_Create(PlayerMap)
   
    'send the update
    For I = 1 To Player_HighIndex
        If IsPlaying(I) Then
            If GetPlayerMap(I) = GetPlayerMap(Index) Then
                SendMap I, PlayerMap
            End If
        End If
    Next

    Select Case GetPlayerDir(Index)
        Case DIR_UP
            Call SpawnNpc(PetSlot, PlayerMap, GetPlayerX(Index), GetPlayerY(Index) - 1)
        Case DIR_DOWN
            Call SpawnNpc(PetSlot, PlayerMap, GetPlayerX(Index), GetPlayerY(Index) + 1)
        Case DIR_LEFT
            Call SpawnNpc(PetSlot, PlayerMap, GetPlayerX(Index) + 1, GetPlayerY(Index))
        Case DIR_RIGHT
            Call SpawnNpc(PetSlot, PlayerMap, GetPlayerX(Index), GetPlayerY(Index) - 1)
    End Select
   
    're-warp the players on the map
    For I = 1 To Player_HighIndex
        If IsPlaying(I) Then
            If GetPlayerMap(I) = GetPlayerMap(Index) Then
                Call PlayerWarp(Index, PlayerMap, GetPlayerX(Index), GetPlayerY(Index))
            End If
        End If
    Next
   
End Sub

Os nomes dos procedimentos de explicar claramente a sua função. O código também deve ser fácil de seguir. Substitua os hashes com seu número de NPC desejado.

Ficar em modGameLogic, você precisa navegar no seu caminho para Sub SpawnNpc. Excluir este procedimento, e substituí-lo por isso:

Código:
Public Sub SpawnNpc(ByVal mapNpcNum As Long, ByVal MapNum As Long, Optional ByVal SetX As Long, Optional ByVal SetY As Long)
    Dim Buffer As clsBuffer
    Dim npcNum As Long
    Dim I As Long
    Dim x As Long
    Dim y As Long
    Dim Spawned As Boolean

    ' Check for subscript out of range
    If mapNpcNum <= 0 Or mapNpcNum > MAX_MAP_NPCS Or MapNum <= 0 Or MapNum > MAX_MAPS Then Exit Sub
    npcNum = Map(MapNum).Npc(mapNpcNum)

    If npcNum > 0 Then
   
        MapNpc(MapNum).Npc(mapNpcNum).Num = npcNum
        MapNpc(MapNum).Npc(mapNpcNum).target = 0
        MapNpc(MapNum).Npc(mapNpcNum).targetType = 0 ' clear
       
        MapNpc(MapNum).Npc(mapNpcNum).Vital(Vitals.HP) = GetNpcMaxVital(npcNum, Vitals.HP)
        MapNpc(MapNum).Npc(mapNpcNum).Vital(Vitals.MP) = GetNpcMaxVital(npcNum, Vitals.MP)
       
        MapNpc(MapNum).Npc(mapNpcNum).Dir = Int(Rnd * 4)
       
        'Check if theres a spawn tile for the specific npc
        For x = 0 To Map(MapNum).MaxX
            For y = 0 To Map(MapNum).MaxY
                If Map(MapNum).Tile(x, y).Type = TILE_TYPE_NPCSPAWN Then
                    If Map(MapNum).Tile(x, y).Data1 = mapNpcNum Then
                        MapNpc(MapNum).Npc(mapNpcNum).x = x
                        MapNpc(MapNum).Npc(mapNpcNum).y = y
                        MapNpc(MapNum).Npc(mapNpcNum).Dir = Map(MapNum).Tile(x, y).Data2
                        Spawned = True
                        Exit For
                    End If
                End If
            Next y
        Next x
       
        If Not Spawned Then
   
            ' Well try 100 times to randomly place the sprite
            For I = 1 To 100
               
                If SetX = 0 And SetY = 0 Then
                    x = Random(0, Map(MapNum).MaxX)
                    y = Random(0, Map(MapNum).MaxY)
                Else
                    x = SetX
                    y = SetY
                End If
   
                If x > Map(MapNum).MaxX Then x = Map(MapNum).MaxX
                If y > Map(MapNum).MaxY Then y = Map(MapNum).MaxY
   
                ' Check if the tile is walkable
                If NpcTileIsOpen(MapNum, x, y) Then
                    MapNpc(MapNum).Npc(mapNpcNum).x = x
                    MapNpc(MapNum).Npc(mapNpcNum).y = y
                    Spawned = True
                    Exit For
                End If
   
            Next
           
        End If

        ' Didn't spawn, so now we'll just try to find a free tile
        If Not Spawned Then

            For x = 0 To Map(MapNum).MaxX
                For y = 0 To Map(MapNum).MaxY

                    If NpcTileIsOpen(MapNum, x, y) Then
                        MapNpc(MapNum).Npc(mapNpcNum).x = x
                        MapNpc(MapNum).Npc(mapNpcNum).y = y
                        Spawned = True
                    End If

                Next
            Next

        End If

        ' If we suceeded in spawning then send it to everyone
        If Spawned Then
            Set Buffer = New clsBuffer
            Buffer.WriteLong SSpawnNpc
            Buffer.WriteLong mapNpcNum
            Buffer.WriteLong MapNpc(MapNum).Npc(mapNpcNum).Num
            Buffer.WriteLong MapNpc(MapNum).Npc(mapNpcNum).x
            Buffer.WriteLong MapNpc(MapNum).Npc(mapNpcNum).y
            Buffer.WriteLong MapNpc(MapNum).Npc(mapNpcNum).Dir
            Buffer.WriteByte MapNpc(MapNum).Npc(mapNpcNum).IsPet
            Buffer.WriteString MapNpc(MapNum).Npc(mapNpcNum).PetData.Name
            Buffer.WriteLong MapNpc(MapNum).Npc(mapNpcNum).PetData.Owner
            SendDataToMap MapNum, Buffer.ToArray()
            Set Buffer = Nothing
        End If
       
        SendMapNpcVitals MapNum, mapNpcNum
    End If

End Sub

Outro parâmetro para esse procedimento poderia ser facilmente adicionados para vários números NPC, desencadeadas pelo uso de um item.

Agora, vá para modCombat. Adicione estes procedimentos para o fundo do módulo. São TryNpcAttackNpc e CanNpcAttackNpc. Estes são, basicamente, rasgado de uma versão antiga do óxido de etileno com algumas modificações, por mim, por isso os créditos vão para Robin para eles. Eles são usados ​​neste tutorial para combater o NPC Pet vs Outros.

Código:
Function CanNpcAttackNpc(ByVal MapNum As Long, ByVal Attacker As Long, ByVal Victim As Long) As Boolean
    Dim aNpcNum As Long
    Dim vNpcNum As Long
    Dim VictimX As Long
    Dim VictimY As Long
    Dim AttackerX As Long
    Dim AttackerY As Long
   
    CanNpcAttackNpc = False

    ' Check for subscript out of range
    If Attacker <= 0 Or Attacker > MAX_MAP_NPCS Then
        Exit Function
    End If
   
    If Victim <= 0 Or Victim > MAX_MAP_NPCS Then
        Exit Function
    End If

    ' Check for subscript out of range
    If MapNpc(MapNum).Npc(Attacker).Num <= 0 Then
        Exit Function
    End If
   
    ' Check for subscript out of range
    If MapNpc(MapNum).Npc(Victim).Num <= 0 Then
        Exit Function
    End If

    aNpcNum = MapNpc(MapNum).Npc(Attacker).Num
    vNpcNum = MapNpc(MapNum).Npc(Victim).Num
   
    If aNpcNum <= 0 Then Exit Function
    If vNpcNum <= 0 Then Exit Function

    ' Make sure the npcs arent already dead
    If MapNpc(MapNum).Npc(Attacker).Vital(Vitals.HP) <= 0 Then
        Exit Function
    End If
   
    ' Make sure the npc isn't already dead
    If MapNpc(MapNum).Npc(Victim).Vital(Vitals.HP) <= 0 Then
        Exit Function
    End If

    ' Make sure npcs dont attack more then once a second
    If GetTickCount < MapNpc(MapNum).Npc(Attacker).AttackTimer + 1000 Then
        Exit Function
    End If
   
    MapNpc(MapNum).Npc(Attacker).AttackTimer = GetTickCount
   
    AttackerX = MapNpc(MapNum).Npc(Attacker).x
    AttackerY = MapNpc(MapNum).Npc(Attacker).y
    VictimX = MapNpc(MapNum).Npc(Victim).x
    VictimY = MapNpc(MapNum).Npc(Victim).y

    ' Check if at same coordinates
    If (VictimY + 1 = AttackerY) And (VictimX = AttackerX) Then
        CanNpcAttackNpc = True
    Else

        If (VictimY - 1 = AttackerY) And (VictimX = AttackerX) Then
            CanNpcAttackNpc = True
        Else

            If (VictimY = AttackerY) And (VictimX + 1 = AttackerX) Then
                CanNpcAttackNpc = True
            Else

                If (VictimY = AttackerY) And (VictimX - 1 = AttackerX) Then
                    CanNpcAttackNpc = True
                End If
            End If
        End If
    End If

End Function

Sub NpcAttackNpc(ByVal MapNum As Long, ByVal Attacker As Long, ByVal Victim As Long, ByVal Damage As Long)
    Dim i As Long
    Dim Buffer As clsBuffer
    Dim aNpcNum As Long
    Dim vNpcNum As Long
    Dim n As Long
    Dim PetOwner As Long
   
    If Attacker <= 0 Or Attacker > MAX_MAP_NPCS Then Exit Sub
    If Victim <= 0 Or Victim > MAX_MAP_NPCS Then Exit Sub
   
    If Damage <= 0 Then Exit Sub
   
    aNpcNum = MapNpc(MapNum).Npc(Attacker).Num
    vNpcNum = MapNpc(MapNum).Npc(Victim).Num
   
    If aNpcNum <= 0 Then Exit Sub
    If vNpcNum <= 0 Then Exit Sub
   
    'set the victim's target to the pet attacking it
    MapNpc(MapNum).Npc(Victim).targetType = 2 'Npc
    MapNpc(MapNum).Npc(Victim).target = Attacker
   
    ' Send this packet so they can see the person attacking
    Set Buffer = New clsBuffer
    Buffer.WriteLong SNpcAttack
    Buffer.WriteLong Attacker
    SendDataToMap MapNum, Buffer.ToArray()
    Set Buffer = Nothing

    If Damage >= MapNpc(MapNum).Npc(Victim).Vital(Vitals.HP) Then
        SendActionMsg MapNum, "-" & Damage, BrightRed, 1, (MapNpc(MapNum).Npc(Victim).x * 32), (MapNpc(MapNum).Npc(Victim).y * 32)
        SendBlood MapNum, MapNpc(MapNum).Npc(Victim).x, MapNpc(MapNum).Npc(Victim).y
       
        ' npc is dead.
        'Call GlobalMsg(CheckGrammar(Trim$(Npc(vNpcNum).Name), 1) & " has been killed by " & CheckGrammar(Trim$(Npc(aNpcNum).Name)) & "!", BrightRed)

        ' Set NPC target to 0
        MapNpc(MapNum).Npc(Attacker).target = 0
        MapNpc(MapNum).Npc(Attacker).targetType = 0
        'reset the targetter for the player
       
        If MapNpc(MapNum).Npc(Attacker).IsPet = YES Then
            TempPlayer(MapNpc(MapNum).Npc(Attacker).PetData.Owner).target = 0
            TempPlayer(MapNpc(MapNum).Npc(Attacker).PetData.Owner).targetType = TARGET_TYPE_NONE
           
            PetOwner = MapNpc(MapNum).Npc(Attacker).PetData.Owner
           
            SendTarget PetOwner
           
            'Give the player the pet owner some experience from the kill
            Call SetPlayerExp(PetOwner, GetPlayerExp(PetOwner) + Npc(MapNpc(MapNum).Npc(Victim).Num).Exp)
            CheckPlayerLevelUp PetOwner
            SendActionMsg MapNum, "+" & Npc(MapNpc(MapNum).Npc(Victim).Num).Exp & "Exp", White, 1, GetPlayerX(PetOwner) * 32, GetPlayerY(PetOwner) * 32
            SendEXP PetOwner
                     
        ElseIf MapNpc(MapNum).Npc(Victim).IsPet = YES Then
            'Get the pet owners' index
            PetOwner = MapNpc(MapNum).Npc(Victim).PetData.Owner
            'Set the NPC's target on the owner now
            MapNpc(MapNum).Npc(Attacker).targetType = 1 'player
            MapNpc(MapNum).Npc(Attacker).target = PetOwner
            'Disband the pet
            PetDisband PetOwner, GetPlayerMap(PetOwner)
        End If
             
        ' Drop the goods if they get it
        'For n = 1 To MAX_NPC_DROPS
        If Npc(vNpcNum).DropItem <> 0 Then
            If Rnd <= Npc(vNpcNum).DropChance Then
                Call SpawnItem(Npc(vNpcNum).DropItem, Npc(vNpcNum).DropItemValue, MapNum, MapNpc(MapNum).Npc(Victim).x, MapNpc(MapNum).Npc(Victim).y)
            End If
        End If
        'Next
       
       
        ' Reset victim's stuff so it dies in loop
        MapNpc(MapNum).Npc(Victim).Num = 0
        MapNpc(MapNum).Npc(Victim).SpawnWait = GetTickCount
        MapNpc(MapNum).Npc(Victim).Vital(Vitals.HP) = 0
             
        ' send npc death packet to map
        Set Buffer = New clsBuffer
        Buffer.WriteLong SNpcDead
        Buffer.WriteLong Victim
        SendDataToMap MapNum, Buffer.ToArray()
        Set Buffer = Nothing
       
        If PetOwner > 0 Then
            PetFollowOwner PetOwner
        End If
    Else
        ' npc not dead, just do the damage
        MapNpc(MapNum).Npc(Victim).Vital(Vitals.HP) = MapNpc(MapNum).Npc(Victim).Vital(Vitals.HP) - Damage
     
        ' Say damage
        SendActionMsg MapNum, "-" & Damage, BrightRed, 1, (MapNpc(MapNum).Npc(Victim).x * 32), (MapNpc(MapNum).Npc(Victim).y * 32)
        SendBlood MapNum, MapNpc(MapNum).Npc(Victim).x, MapNpc(MapNum).Npc(Victim).y
    End If
   
    'Send both Npc's Vitals to the client
    SendMapNpcVitals MapNum, Attacker
    SendMapNpcVitals MapNum, Victim

End Sub

Ficar em modCombat, localizar a função: "CanNpcAttackPlayer". Debaixo dos controlos principais: Acrescentar este:

Código:
'check if the NPC attacking us is actually our pet.
'We don't want a rebellion on our hands now do we?
       
If MapNpc(MapNum).Npc(mapNpcNum).PetData.Owner = Index Then Exit Function

Isto impede o animal de estimação atacar seu próprio dono. > _ <


Em seguida, Ctrl + F "Sub closesocket". Substituir o actual procedimento com este:

Código:
Sub CloseSocket(ByVal Index As Long)
Dim I As Integer

    If Index > 0 Then
        If TempPlayer(Index).TempPetSlot > 0 Then
            Call PetDisband(Index, GetPlayerMap(Index))
            For I = 1 To Player_HighIndex
                If GetPlayerMap(I) = GetPlayerMap(Index) Then
                    SendMap I, GetPlayerMap(Index)
                End If
            Next
        End If
       
        Call LeftGame(Index)
        Call TextAdd("Connection from " & GetPlayerIP(Index) & " has been terminated.")
        frmServer.Socket(Index).Close
        Call UpdateCaption
        Call ClearPlayer(Index)
    End If

End Sub

A modificação aqui desfaz um animal de estimação se o seu dono fizer fora.
Depois disso, Ctrl + F "Isto é usado para npcs para atacar alvos". Isto irá levá-lo em modServerLoop> UpdateMapLogic.

Nessa seção, até "Isto é usado para regenerar HP NPC's, substituir esse código com o seguinte:

Código:
If Map(MapNum).Npc(x) > 0 And MapNpc(MapNum).Npc(x).Num > 0 Then
                    target = MapNpc(MapNum).Npc(x).target
                    targetType = MapNpc(MapNum).Npc(x).targetType

                    ' Check if the npc can attack the targeted player player
                    If target > 0 Then
                   
                        If targetType = 1 Then ' player

                            ' Is the target playing and on the same map?
                            If IsPlaying(target) And GetPlayerMap(target) = MapNum Then
                                TryNpcAttackPlayer x, target
                            Else
                                ' Player left map or game, set target to 0
                                MapNpc(MapNum).Npc(x).target = 0
                                MapNpc(MapNum).Npc(x).targetType = 0 ' clear
                            End If
                        ElseIf targetType = 2 Then
                            ' lol no npc combat :( DATS WAT YOU THINK
                            If CanNpcAttackNpc(MapNum, x, MapNpc(MapNum).Npc(x).target) = True Then
                                Call NpcAttackNpc(MapNum, x, MapNpc(MapNum).Npc(x).target, Npc(Map(MapNum).Npc(x)).Damage)
                            End If
                        Else
                       
                        End If
                    End If
                End If

A modificação que eu fiz aqui, basicamente, trata da luta contra o NPC NPC para o seu animal de estimação, mencionado anteriormente.

Depois, vá para modDatabase e acrescentar o seguinte:

Código:
Sub ClearSingleMapNpc(ByVal index As Long, ByVal MapNum As Long)
    Call ZeroMemory(ByVal VarPtr(MapNpc(MapNum).Npc(index)), LenB(MapNpc(MapNum).Npc(index)))
    Map(MapNum).Npc(index) = 0
    MapNpc(MapNum).Npc(index).Num = 0
    MapCache_Create (MapNum)
End Sub

Isso ajuda para eliminar um npc única a partir de um mapa, se em caso de morte ou demissão.

Em seguida, passar para modPlayer e encontrar o procedimento chamado "PlayerWarp". Substituir esse procedimento com esta versão modded:

Código:
Sub PlayerWarp(ByVal Index As Long, ByVal MapNum As Long, ByVal x As Long, ByVal y As Long)
    Dim shopNum As Long
    Dim OldMap As Long
    Dim I As Long
    Dim Buffer As clsBuffer

    ' Check for subscript out of range
    If IsPlaying(Index) = False Or MapNum <= 0 Or MapNum > MAX_MAPS Then
        Exit Sub
    End If

    ' Check if you are out of bounds
    If x > Map(MapNum).MaxX Then x = Map(MapNum).MaxX
    If y > Map(MapNum).MaxY Then y = Map(MapNum).MaxY
    If x < 0 Then x = 0
    If y < 0 Then y = 0
   
    ' if same map then just send their co-ordinates
    If MapNum = GetPlayerMap(Index) Then
        SendPlayerXYToMap Index
    End If
   
    ' clear target
    TempPlayer(Index).target = 0
    TempPlayer(Index).targetType = TARGET_TYPE_NONE
    SendTarget Index

    ' Save old map to send erase player data to
    OldMap = GetPlayerMap(Index)

    If OldMap <> MapNum Then
        Call SendLeaveMap(Index, OldMap)
    End If

    Call SetPlayerMap(Index, MapNum)
    Call SetPlayerX(Index, x)
    Call SetPlayerY(Index, y)
   
    'If 'refreshing' map
    If (OldMap <> MapNum) And TempPlayer(Index).TempPetSlot > 0 Then
        'switch maps
      PetDisband Index, OldMap
        SpawnPet Index, MapNum
        PetFollowOwner Index
    End If
   
    ' send player's equipment to new map
    SendMapEquipment Index
   
    ' send equipment of all people on new map
    If GetTotalMapPlayers(MapNum) > 0 Then
        For I = 1 To Player_HighIndex
            If IsPlaying(I) Then
                If GetPlayerMap(I) = MapNum Then
                    SendMapEquipmentTo I, Index
                End If
            End If
        Next
    End If

    ' Now we check if there were any players left on the map the player just left, and if not stop processing npcs
    If GetTotalMapPlayers(OldMap) = 0 Then
        PlayersOnMap(OldMap) = NO

        ' Regenerate all NPCs' health
        For I = 1 To MAX_MAP_NPCS

            If MapNpc(OldMap).Npc(I).Num > 0 Then
                MapNpc(OldMap).Npc(I).Vital(Vitals.HP) = GetNpcMaxVital(MapNpc(OldMap).Npc(I).Num, Vitals.HP)
            End If

        Next

    End If

    ' Sets it so we know to process npcs on the map
    PlayersOnMap(MapNum) = YES
    TempPlayer(Index).GettingMap = YES
    Set Buffer = New clsBuffer
    Buffer.WriteLong SCheckForMap
    Buffer.WriteLong MapNum
    Buffer.WriteLong Map(MapNum).Revision
    SendDataTo Index, Buffer.ToArray()
    Set Buffer = Nothing
End Sub

A modificação aqui meramente de-desova o animal de estimação a partir do mapa antigo e gera-lo para o novo.

Finalmente, vá para modTypes e modificar esses pedaços de código. Adicionar PetRec acima PlayerRec:

Código:
Public Type PetRec
    SpriteNum As Byte
    Name As String * 50
    Owner As Long
End Type

Adicione esta no fundo do PlayerRec:

Código:
Pet As PetRec

Adicionar esta no fundo do TempPlayerRec:

Código:
TempPetSlot As Byte

Finalmente, adicione-o ao fundo do MapNpcRec:

Código:
'Pet Data
    IsPet As Byte
    PetData As PetRec

E, Voila! Você deve agora ter uma base aceitável para aplicar mais recursos, se quiser, para o Sistema de Pet. Espero que ele não era muito difícil de seguir, e que você aprendeu alguma coisa no processo de fazer isso.

Atenciosamente,

Relâmpago

Creditos:
Lucas Roberto traduzir


_______________________________________________________________________________________________________

[Você precisa estar registrado e conectado para ver esta imagem.]
Spoiler:
[Você precisa estar registrado e conectado para ver esta imagem.]
[Você precisa estar registrado e conectado para ver esta imagem.]
[Você precisa estar registrado e conectado para ver esta imagem.]

[Você precisa estar registrado e conectado para ver esta imagem.]
[Você precisa estar registrado e conectado para ver esta imagem.]
http://universogamesmmo.forumeiros.com

2Tutorial Re: [EO]Sistema de Pet em Dom 29 Maio 2011, 15:37

Freitas


Membro
Membro
Só tenho uma dúvida, o pet ira seguir o Player, ou andará por tudo sem seguir o Player?

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo  Mensagem [Página 1 de 1]

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