Aldeia RPG

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Suporte ao desenvolvimento de jogos


4 participantes

    NPC de Teletransporte

    Hashirama
    Hashirama
    Membro de Honra
    Membro de Honra


    Mensagens : 413
    Créditos : 133

    NPC de Teletransporte Empty NPC de Teletransporte

    Mensagem por Hashirama Qua Mar 28, 2018 8: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
    NPC de Teletransporte 29750616_1650394545051949_1810683449_n

    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
    NPC de Teletransporte Unknown
    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
    NPC de Teletransporte Unknown

    vc precisa criar uma picture na frmMain dentro da picScreen
    nela vc adiciona 4 labels, cada label vai ser um teletransporte segue o exemplo
    NPC de Teletransporte Unknown
    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
    NPC de Teletransporte Unknown

    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
    Valentine
    Valentine
    Administrador
    Administrador


    Medalhas : NPC de Teletransporte ZgLkiRU
    Mensagens : 5336
    Créditos : 1163

    NPC de Teletransporte Empty Re: NPC de Teletransporte

    Mensagem por Valentine Qui Mar 29, 2018 7:43 am

    Obrigado por compartilhar I love you
    OFWGKTA
    OFWGKTA
    Experiente
    Experiente


    Mensagens : 408
    Créditos : 27

    Ficha do personagem
    Nível: 1
    Experiência:
    NPC de Teletransporte Left_bar_bleue5/50NPC de Teletransporte Empty_bar_bleue  (5/50)
    Vida:
    NPC de Teletransporte Left_bar_bleue30/30NPC de Teletransporte Empty_bar_bleue  (30/30)

    NPC de Teletransporte Empty Re: NPC de Teletransporte

    Mensagem por OFWGKTA Qui Mar 29, 2018 2:17 pm

    Recomendado


    _________________
    NPC de Teletransporte 112898
    EVANGELION 
    Mizuki
    Mizuki
    Novato
    Novato


    Mensagens : 29
    Créditos : 4

    Ficha do personagem
    Nível: 1
    Experiência:
    NPC de Teletransporte Left_bar_bleue0/0NPC de Teletransporte Empty_bar_bleue  (0/0)
    Vida:
    NPC de Teletransporte Left_bar_bleue30/30NPC de Teletransporte Empty_bar_bleue  (30/30)

    NPC de Teletransporte Empty Re: NPC de Teletransporte

    Mensagem por Mizuki Qui Ago 09, 2018 2: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


    NPC de Teletransporte Empty Re: NPC de Teletransporte

    Mensagem por Conteúdo patrocinado


      Data/hora atual: Sex Abr 26, 2024 11:40 am