Isto é uma pré-visualização de um tema em Hitskin.com
Instalar o tema • Voltar para a ficha do tema
[EO] Sistema de pet
5 participantes
Página 1 de 1
[EO] 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 por traduzir
OBS:
Desculpem pelas imagens não aparecerem.
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:
- 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 por traduzir
OBS:
Desculpem pelas imagens não aparecerem.
_________________
O Equívoco do Sábio - conto na Amazon
FilipeJF- Aldeia Friend
- Medalhas :
Mensagens : 1859
Créditos : 134
Re: [EO] Sistema de pet
Desculpe, mas o que eu tenho que por nos botões (sou muito newbie em vb)?
Última edição por lgomes.leo em Ter Jun 07, 2011 5:17 pm, editado 1 vez(es)
lgomes.leo- Novato
- Mensagens : 2
Créditos : 0
Re: [EO] Sistema de pet
Todo mundo sempre fala "parece bom", "muito bom vlw" mas ninguem nunca testa.
Comigo nao deu certo, alguem pode fazer ai e dizer se deu certo? =/
ja refiz varias vezes
Comigo nao deu certo, alguem pode fazer ai e dizer se deu certo? =/
ja refiz varias vezes
_________________
mãe, tô no youtube
Re: [EO] Sistema de pet
Lucky escreveu:Todo mundo sempre fala "parece bom", "muito bom vlw" mas ninguem nunca testa.
Comigo nao deu certo, alguem pode fazer ai e dizer se deu certo? =/
ja refiz varias vezes
Eu falei que parece bom pois nao mexo no Eclipse, só comentei e dei cred pra dar uma força e por ele ter feito e postado aqui no forum...
Re: [EO] Sistema de pet
Não me referi a você, porque em todos os fóruns que vi esse sistema só tem comentários assim =/ ..
e não foi ele que fez, foi um gringo, e o "Lucas Roberto" traduziu ._.
@ON
Filipe, você poderia pelo menos modificar
e não foi ele que fez, foi um gringo, e o "Lucas Roberto" traduziu ._.
@ON
Filipe, você poderia pelo menos modificar
Troca o nick ali pelo menos né '-'Atenciosamente,
Relâmpago
_________________
mãe, tô no youtube
Re: [EO] Sistema de pet
Queria pedir pra depois de traduzirem no google dar uma arrumada por que pqp não dá pra entender =s
Zeus- Novato
- Mensagens : 17
Créditos : 0
Tópicos semelhantes
» Sistema de Loja+Sistema de Passar de Classe por Level
» Movido: [Sistema por Evento] - Sistema de Cupons
» [PEDIDO] [Sistema] Sistema de Tiro Cristianoforce 1.6
» Sistema de Pulo+Sistema de Correr
» Sistema VIP
» Movido: [Sistema por Evento] - Sistema de Cupons
» [PEDIDO] [Sistema] Sistema de Tiro Cristianoforce 1.6
» Sistema de Pulo+Sistema de Correr
» Sistema VIP
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos