Fala galera, hoje venho trazer um sistema que muitos procuraram, e como estou estudando e aprendendo sistemas, resolvi criar esse, o tutorial é um pouco grande e pode conter algum erro, o sistema eu testei e funciona 100%. O que ele faz?
você pode criar um npc com opção de abrir Teleporte, ai quando vc fala com esse npc que tem a opção vai abrir a janela com os teletransportes que você criou.
Amostra
Vamos lá
Primeira mente vamos criar o pacote que vai enviar do client para o servidor o teletransporte
Server side
No ModEnumerations acima de
- Código:
' Make sure CMSG_COUNT is below everything else
CMSG_COUNT
- Código:
CWarpPlayer
- Código:
HandleDataSub(CWarpPlayer) = GetAddress(AddressOf HandleWarpPlayer)
- Código:
Sub HandleWarpPlayer(ByVal index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
Dim n As Long
Dim MapX As Long
Dim MapY As Long
Dim Buffer As clsBuffer
Set Buffer = New clsBuffer
Buffer.WriteBytes Data()
' The map
n = Buffer.ReadLong 'CLng(Parse(1))
MapX = Buffer.ReadLong 'CLng(Parse(1))
MapY = Buffer.ReadLong 'CLng(Parse(1))
Set Buffer = Nothing
' Prevent hacking
If n < 0 Or n > MAX_MAPS Then
Exit Sub
End If
If MapX > Map(n).MaxX Then
Exit Sub
End If
If MapY > Map(n).MaxY Then
Exit Sub
End If
If MapX > 0 And MapY > 0 Then
Call PlayerWarp(index, n, MapX, MapY)
Call PlayerMsg(index, "Você foi para o mapa:" & n, BrightBlue)
Else
Call PlayerWarp(index, n, GetPlayerX(index), GetPlayerY(index))
Call PlayerMsg(index, "Você foi teleporta para o mapa: " & Trim$(Map(n).Name), BrightGreen)
End If
End Sub
Feito isso ja temos nosso comando de teleporte que indica o mapa, mapa x, mapa y
agora vamos para o client
Client Side
no final do modClienTCP adicione
- Código:
Public Sub WarpPlayer(ByVal MapNum As Long, Optional ByVal MapX As Long, Optional ByVal MapY 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.WriteLong CWarpPlayer
Buffer.WriteLong MapNum
Buffer.WriteLong MapX
Buffer.WriteLong MapY
SendData Buffer.ToArray()
Set Buffer = Nothing
' Error handler
Exit Sub
errorhandler:
HandleError "WarpPlayer", "modClientTCP", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
End Sub
agora no modEnumerations acima de
- Código:
' Make sure CMSG_COUNT is below everything else
CMSG_COUNT
- Código:
CWarpPlayer
Pronto ja temos nosso comando que vai chamar o mapa pelo code Call WarpPlayer (x,x,x) ' mapa, cordenadaX, cordenadaY
Agora vamos criar o sistema que vai fazer que quando você falar com o NPC vai abrir a janela com os teletransportes
Server Side
no modTypes dentro da Public Type TempPlayerRec antes do end type adicione
- Código:
InTele As Long
- Código:
NPCTele As Byte
na modEnumerations acima de
- Código:
' Make sure SMSG_COUNT is below everything else
SMSG_COUNT
- Código:
SOpenTele
agora no modCombat na procedure CanPlayerAttackNpc acima de
- Código:
If Len(Trim$(Npc(npcnum).AttackSay)) > 0 Then
- Código:
' Abrir NPC Teleporte
If Npc(npcnum).NPCTele > 0 Then
Call SendOpenTele(attacker, Npc(npcnum).NPCTele)
End If
agora no modHandleData na HandlePlayerMove abaixo de:
- Código:
' Prever player from moving if in shop
If TempPlayer(index).InShop > 0 Then
Call SendPlayerXY(index)
Exit Sub
End If
adicione
- Código:
' Prever player from moving if in tele
If TempPlayer(index).InTele > 0 Then
Call SendPlayerXY(index)
Exit Sub
End If
agora no final do serverTCP adicione
- Código:
Sub SendOpenTele(ByVal index As Long, ByVal npcnum As Long)
Dim Buffer As clsBuffer
Set Buffer = New clsBuffer
Buffer.WriteLong SOpenTele
Buffer.WriteLong npcnum
SendDataTo index, Buffer.ToArray()
Set Buffer = Nothing
End Sub
Pronto agora o vamos voltar ao client
Client Side
agora no modHandleData na sub initmessages abaixo de
- Código:
HandleDataSub(CWarpPlayer) = GetAddress(AddressOf HandleWarpPlayer)
- Código:
HandleDataSub(SOpenTele) = GetAddress(AddressOf HandleOpenTele)
no final do HandleData adicione
- Código:
Private Sub HandleOpenTele(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
Dim Buffer As clsBuffer
Dim npcNum As Long
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
Set Buffer = New clsBuffer
Buffer.WriteBytes Data()
npcNum = Buffer.ReadLong
Set Buffer = Nothing
OpenTele npcNum
' Error handler
Exit Sub
errorhandler:
HandleError "HandleOpenTele", "modHandleData", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
End Sub
agora no modTypes na Private Type NpcRec antes do end type adicione
- Código:
NPCTele As Byte
agora no ModGameLogic na procedure CanMove abaixo de
- Código:
' make sure they're not in a shop
If InShop > 0 Then
CanMove = False
Exit Function
End If
- Código:
' make sure they're not in a tele
If InTele > 0 Then
CanMove = False
Exit Function
End If
- Código:
Public Sub OpenTele(ByVal npcNum As Long)
' If debug mode, handle error then exit out
If Options.Debug = 1 Then On Error GoTo errorhandler
InTele = npcNum
frmMain.picTele.Visible = True
' Error handler
Exit Sub
errorhandler:
HandleError "OpenTele", "modGameLogic", Err.Number, Err.Description, Err.Source, Err.HelpContext
Err.Clear
Exit Sub
End Sub
agora na frmEditor_NPC crie um checkBox e na propriet Name coloque chkTele
de 2 clicks no chkTele e adicione o code- Código:
If chkTele.Value = 0 Then
Npc(EditorIndex).NPCTele = False
Else
Npc(EditorIndex).NPCTele = True
End If
sempre que quiser que um npc abra o teletransporte basta deixar o chkBox ativado, assim o npc fica como teletransporte
agora no final do ModGlobal adicione
- Código:
Public InTele As Long
abaixo de
- Código:
InTrade = False
- Código:
InTele = True
agora na modGameEditors em baixo de
- Código:
.txtDamage.text = Npc(EditorIndex).Damage
- Código:
If Npc(EditorIndex).NPCTele Then
.chkTele.Value = 1
Else
.chkTele.Value = 0
End If
Feito galera, agora vamos criar nossa picture que vai ser nossa janela de teletransporte, vcs podem criar quantas teletransportes que quiserem, alem disso vcs pode criar uma imagem grande com varias imagens de cidades, cada click na cidade e um teletransporte, isso vai da imaginação de vocês, agora para o tutorial podem usar meu exemplo de pic
vc precisa criar uma picture na frmMain dentro da picScreen
nela vc adiciona 4 labels, cada label vai ser um teletransporte segue o exemplo
Obs: crie a primeira label renomeia a propriet Name para lblTele, quando criar a segundo você cria ela com o msm nome e vai aparecerclique no sim, isso fara que gere um numero de Index para cada lblTele
de 2 clicks e qualquer uma das label que vc criou e adicione
- Código:
'Observação cade Case vai correspodenr ao indice da label que vc criou
Select Case Index
Case 0
Call WarpPlayer(2, 5, 5) '(id do mapa, cordenada X, cordenada Y) e o Call WarpPlayer e o code que chama o teletransporte
picTele.Visible = False
Case 1
Call WarpPlayer(3, 5, 5)
picTele.Visible = False
InTele = 0
Case 2
Call WarpPlayer(4, 5, 5)
picTele.Visible = False
InTele = 0
Case 3 ' teleporte que fecha a janela e cancela o InTele
picTele.Visible = False
InTele = 0
'caso queira criar outros teletransportes basta adicionar Case 4 e o msm codigo que chama o mapa
End Select
Pronto galera, vcs podem criar qualquer comando de teletransporte usando Call WarpPlayer( numero do mapa, coordenada X, coordenada Y) exemplo Call WarpPlayer (2, 5, 5) vai para o mapa 2 e na coordenada 5, 5
vcs tmb em vez da label pode se fazer com buttons, e isso galera. qualquer duvida poste aqui que irei ajudar. e qualquer erro também, abraços
Importante, a picture tem que ter como propriet Name PicTele