Suporte ao desenvolvimento de jogos!


    NPC de Teletransporte

    Compartilhe
    avatar
    Hashirama
    Experiente
    Experiente

    Mensagens : 408
    Créditos : 130

    NPC de Teletransporte

    Mensagem por Hashirama em Qua Mar 28, 2018 7:07 pm

    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
    adicione :
    Código:
    CWarpPlayer
    agora no modHandleData na Public Sub InitMessages() antes do end sub adicione
    Código:
    HandleDataSub(CWarpPlayer) = GetAddress(AddressOf HandleWarpPlayer)
    agora no final do modHandleData adicione
    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
    adicione
    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
    dentro da NPCRec antes do end type adicione
    Código:
    NPCTele As Byte

    na modEnumerations acima de 
    Código:
    ' Make sure SMSG_COUNT is below everything else
        SMSG_COUNT
    adicione 
    Código:
    SOpenTele

    agora no modCombat na procedure CanPlayerAttackNpc acima de 
    Código:
    If Len(Trim$(Npc(npcnum).AttackSay)) > 0 Then
    adicione
    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
    isso fara que quando abrir a janela de teletransporte vc não possa se mexer, isso evita que o jogar abra a janela de tele e saia com ela, podendo usar o teletransporte quando quiser
    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)
    adicione
    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
    adicione
    Código:
    ' make sure they're not in a tele
        If InTele > 0 Then
            CanMove = False
            Exit Function
        End If
    no final do ModGameLogic adicione
    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
    agora na Sub GameInit()
    abaixo de 
    Código:
    InTrade = False
    adicione
    Código:
    InTele = True

    agora na modGameEditors em baixo de 
    Código:
    .txtDamage.text = Npc(EditorIndex).Damage
    adicione
    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 aparecer


    clique 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


    _________________
    Apoia nosso projeto? use nossa assinatura

    Código:
    [color=#ff9900][size=10]Eu Apoio Esse Projeto![/size][/color]
    [url=http://www.aldeiarpg.com/t11184-naruto-shinobi-online][img]http://i.imgur.com/B9M26iU.png[/img][/url]

    avatar
    Valentine
    Administrador
    Administrador

    Medalhas :
    Mensagens : 4987
    Créditos : 1060

    Re: NPC de Teletransporte

    Mensagem por Valentine em Qui Mar 29, 2018 6:43 am

    Obrigado por compartilhar I love you


    _________________
    avatar
    Mundator
    Membro Ativo
    Membro Ativo

    Mensagens : 330
    Créditos : 23

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

    Re: NPC de Teletransporte

    Mensagem por Mundator em Qui Mar 29, 2018 1:17 pm

    Recomendado


    _________________
    YOU ARE DEAD ? MUNDATOR
    avatar
    Mizuki
    Novato
    Novato

    Mensagens : 17
    Créditos : 2

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

    Re: NPC de Teletransporte

    Mensagem por Mizuki em Qui Ago 09, 2018 1:22 pm

    então fiz aqui aparentemente nao deu erro nenhum porem eu crio o npc e tal e nao aparece a janela a pic cono resolvo isso ??


    edit consegui porem ta faltando uma coisinha ai mano

    falto isso no cliente       SOpenTele 


    espero ter ajudado

    Conteúdo patrocinado

    Re: NPC de Teletransporte

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Sex Nov 16, 2018 9:17 am