Sistema de Pet
+6
Valentine
DarkKang
St4rk
Zeus
Ricardo
Lucas Roberto
10 participantes
Página 1 de 1
Sistema de Pet
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:
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:
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:
Em seguida, vá para modHandleData e substituir "Sub HandleSpawnNpc"com este:
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:
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:
Abaixo "Dir As Byte" em PlayerRec, adicione isto:
e adicionar esse tipo personalizado acima PlayerRec:
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:
Em seguida, passar para modHandleData e procure por "Public Sub InitMessages ()". Vá até o final do procedimento e acrescentar:
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:
Depois disso, vá para modGameLogic e adicionar esses procedimentos para o fundo da questão:
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:
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.
Ficar em modCombat, localizar a função: "CanNpcAttackPlayer". Debaixo dos controlos principais: Acrescentar este:
Isto impede o animal de estimação atacar seu próprio dono. > _ <
Em seguida, Ctrl + F "Sub closesocket". Substituir o actual procedimento com este:
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:
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:
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:
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:
Adicione esta no fundo do PlayerRec:
Adicionar esta no fundo do TempPlayerRec:
Finalmente, adicione-o ao fundo do MapNpcRec:
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
Lucas Roberto traduzir
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:
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:
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
Lucas Roberto traduzir
Re: Sistema de Pet
parei de ler no " sobre como criar um Basic Pet System" Google tradutor rusha
Zeus- Membro Vitalicio
- Mensagens : 711
Re: Sistema de Pet
Evite Off-Tópic ou Comentários inuteis.parei de ler no " sobre como criar um Basic Pet System" Google tradutor rusha
OmegaZero.
Re: Sistema de Pet
Google Tradutor até errou o nome do autor nos créditos. Corrija.
DarkKang- Membro
- Mensagens : 172
Re: Sistema de Pet
DarkKang escreveu:Google Tradutor até errou o nome do autor nos créditos. Corrija.
Não tu fala demais --'
Re: Sistema de Pet
Lucas Roberto escreveu:DarkKang escreveu:Google Tradutor até errou o nome do autor nos créditos. Corrija.
Não tu fala demais --'
Eu não falo, digito.
E o Richy já aprimorou esse sistema com sistema de lvl e summon em spell e item. Depois eu posto.
DarkKang- Membro
- Mensagens : 172
Re: Sistema de Pet
DarkKang escreveu:Lucas Roberto escreveu:DarkKang escreveu:Google Tradutor até errou o nome do autor nos créditos. Corrija.
Não tu fala demais --'
Eu não falo, digito.
E o Richy já aprimorou esse sistema com sistema de lvl e summon em spell e item. Depois eu posto.
não to falando
--' e vamos parar com essa comversa desagradavel
Re: Sistema de Pet
Plz stop digging up threads...
Pf parem de desenterrar os Tópicos...
V-Force- Administrador V-Force
- Mensagens : 933
Tópicos semelhantes
» Sistema de Hud
» Sistema de char tai,gen,nin/sistema de 2 barra de classe
» [Sistema] Sistema de Level Maximo 1000
» Sistema Pet
» [ALL]Sistema Vip
» Sistema de char tai,gen,nin/sistema de 2 barra de classe
» [Sistema] Sistema de Level Maximo 1000
» Sistema Pet
» [ALL]Sistema Vip
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
Dom 08 Abr 2018, 18:40 por JorgeZinhoo002
» Ojkjeeeee
Seg 10 Out 2016, 23:19 por Frozen
» Naruto Great Ninja Batle
Dom 09 Out 2016, 14:29 por GuiinhoLP
» Recrutamento de um Designer para jogo de CDZ.
Sex 23 Set 2016, 18:37 por newbie123
» Serviços de suporte maker( Programação , Design , PixelArt ) E Vendas de Jogos
Qui 22 Set 2016, 20:11 por Eduardo
» Serviços de suporte maker( Programação , Design , PixelArt ) E Vendas de Jogos
Qui 22 Set 2016, 20:11 por Eduardo
» Serviços de suporte maker( Programação , Design , PixelArt ) E Vendas de Jogos
Qui 22 Set 2016, 20:09 por Eduardo
» Projeto Dbz
Qua 31 Ago 2016, 23:46 por 157
» Avaliação - Sprites Naruto
Qua 31 Ago 2016, 17:09 por 157
» [Sprites] DBZ (Plix)
Qua 31 Ago 2016, 14:13 por 157
» Super Pack - Bleach V.2
Qua 31 Ago 2016, 13:02 por 157
» [PEDIDO][PROJETO][RECRUTAMENTO] DYNISTYGAMES
Ter 30 Ago 2016, 10:04 por 157
» [PEDIDO][PROJETO][RECRUTAMENTO] DYNISTYGAMES
Ter 30 Ago 2016, 10:03 por 157
» [PEDIDO][PROJETO][RECRUTAMENTO] DYNISTYGAMES
Ter 30 Ago 2016, 10:02 por 157
» [Pedido] Contador de resets na FrmMain
Sáb 13 Ago 2016, 17:45 por killers97
» [Recrutamento]
Qua 10 Ago 2016, 23:09 por Monsters
» Ajuda erro no Cliente e Servidor do EEB 2.6!
Qua 20 Jul 2016, 19:53 por Binholx
» Como criar tilesets para Eclipse Origins 3.0 (POKÉMON)
Qua 29 Jun 2016, 19:46 por Sir Aaron
» Recursos Pokemons
Qua 29 Jun 2016, 19:34 por Sir Aaron
» erro frm flash
Qua 25 maio 2016, 13:51 por vava123
» Pedido - Pack de star wars
Qui 19 maio 2016, 05:06 por edsonpet
» [Ajuda] Sobre como por o servidor on por ip fixo
Ter 17 maio 2016, 16:14 por vava123
» Illusion Dimension - O Misterio do ID: BETA TESTE ONLINE
Sex 06 maio 2016, 20:02 por LksFlorencio
» [NSME] Naruto Shinobi Maker Engine
Qua 23 Mar 2016, 15:11 por luana1457
» Script /base,/casa Igual DBZ Forces
Dom 21 Fev 2016, 07:34 por JorgeZinhoo002
» [Pedido]Colar Tsunade item sprite eclipse origin
Qui 21 Jan 2016, 07:38 por lawllietbr
» [Pedido] Elysium
Sáb 19 Dez 2015, 11:31 por luana1457
» Naruto - Recruta
Ter 15 Dez 2015, 18:40 por Uchiha ~
» [Avaliação] - Kirito from Sword Art Online; Red and Pikachu from Pokemon.
Qua 25 Nov 2015, 13:43 por Thanakii
» [Avaliação] - Kenpachi Zaraki from Bleach; Libra Shiryu From Saint Seiya.
Qua 25 Nov 2015, 12:55 por Thanakii
» Demonstração de Sprites (Á VENDA!)
Qua 25 Nov 2015, 12:40 por Thanakii
» [Sistema de Reset]Para Eclipse .
Ter 24 Nov 2015, 16:51 por VithorUchi
» Cada Guild Nascer em Certo Mapa
Qui 12 Nov 2015, 06:13 por fabiofeijó_HIT
» Dragon Ball z Fusion A Grande Volta
Qui 29 Out 2015, 15:17 por fabiofeijó_HIT
» Ajuda com Ip fixo
Seg 26 Out 2015, 16:07 por GalaxyHells15
» Como Fazer um GUI no Eclipse Origins
Dom 18 Out 2015, 22:10 por Jeanleee
» Shisui Susanoo
Dom 18 Out 2015, 20:23 por Jeanleee
» Fantasy Art Online
Dom 18 Out 2015, 16:41 por daviih123
» Ajuda !!
Seg 05 Out 2015, 12:13 por andersonzika
» como passar o usuário e senha para o MainMenu?
Seg 28 Set 2015, 22:03 por Bëzerk
» Ru time ero 13 Type mismatch
Seg 28 Set 2015, 09:08 por andredarle
» Jarvis 1.3 Download
Qua 23 Set 2015, 18:42 por soares125
» [Avaliação/Disponibilização]Árvore 64x64
Qua 23 Set 2015, 15:15 por Over~
» Mlk's Zikas Signatures
Ter 22 Set 2015, 21:15 por Aikawa Reborn'
» Pedido de Sistemas
Dom 20 Set 2015, 18:05 por cleyton_05
» [AjudaEEB]Gerador de EXP
Qua 16 Set 2015, 14:04 por Over~
» [Avaliar] Base, Humano e Goblin.
Seg 14 Set 2015, 22:51 por .iBlaz3.
» Fabrica do Tio Cronos!
Dom 13 Set 2015, 21:31 por [ADM]Cronos
» [PixelArt] Minion - Meu malvado favorito
Dom 13 Set 2015, 12:51 por [ADM]Cronos
» [Avaliar] Goku Dragon Ball Z
Qua 05 Ago 2015, 21:36 por Setrux