Suporte ao desenvolvimento de jogos!


    Evento de Experiência (comando e tempo)

    Compartilhe
    avatar
    lucas100vzs
    Novato
    Novato

    Mensagens : 19
    Créditos : 5

    Evento de Experiência (comando e tempo)

    Mensagem por lucas100vzs em Sab Jan 28, 2017 4:00 pm

    Funciona como todos os eventos de experiência, no entanto, é feito por comando, e não é necessário a criação de alguma "form".
    Vamos ao tutorial então.


    Client~Side


    Abra seu cliente, e, em "ModInput" procure por:

    Código:
    Dim Command() As String

    E substitua por:

    Código:
    Dim Command() As String, Command2() As String, Command3() As String
    Agora, continuando em "ModInput", procure por:

    Código:
    Command = Split(MyText, Space(1))
    E abaixo disto, coloque isto:

    Código:
    Command2 = Split(MyText, Space(1))
    Command3 = Split(MyText, Space(1))

    Agora, procure por:

    Código:
    SendKick Command(1)


    Abaixo disto, coloque isto:

    Código:
    Case "/evento"
                        If GetPlayerAccess(MyIndex) < ADMIN_MONITOR Then GoTo Continue

                        If UBound(Command) < 3 Then
                            AddText "Use: /evento quantidade, hora(xx), minuto(xx)", AlertColor
                            GoTo Continue
                        End If
                                            
                        If Not IsNumeric(Command(1)) Or Not IsNumeric(Command(2)) Or Not IsNumeric(Command(3)) Then
                            AddText "Use somente números!", AlertColor
                            GoTo Continue
                        End If
                        
                        SendEventExp Command(1), Command(2), Command(3)

    Agora, vá no módulo "ModClientTCP", e adicione no final esta "Sub"

    Código:
    Public Sub SendEventExp(ByVal ExpValue As Long, ByVal ExpHour As Long, ByVal ExpMinute 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 CEvento
        Buffer.WriteLong ExpValue
        Buffer.WriteLong ExpHour
        Buffer.WriteLong ExpMinute
        
        SendData Buffer.ToArray()
        Set Buffer = Nothing
        
        ' Error handler
        Exit Sub
    errorhandler:
        HandleError "SendEventExp", "modClientTCP", Err.Number, Err.Description, Err.Source, Err.HelpContext
        Err.Clear
        Exit Sub
    End Sub

    Por fim, procure em "ModEnumerations" por:

    Código:
    ' Make sure CMSG_COUNT is below everything else
        CMSG_COUNT
    End Enum

    E acima disto, coloque isto:

    Código:
    CEvento 'Evento de Exp

    Muito bem, a parte do cliente está feita!
    Agora, abra a lógica do seu servidor.
                        
    Server~Side


    E, em "ModHandleData", procure por:

    Código:
    Public Sub InitMessages()

    E, antes do "End Sub" desta fórmula, adicione isto:

    Código:
    HandleDataSub(CEvento) = GetAddress(AddressOf HandleEvento)

    Agora, ainda em "ModHandleData", adicione no final do módulo, esta "Sub" :

    Código:
    Sub HandleEvento(ByVal Index As Long, ByRef Data() As Byte, ByVal StartAddr As Long, ByVal ExtraVar As Long)
        Dim ExpValue As Long, ExpHour As Long, ExpMinute As Long
        Dim Buffer As clsBuffer
        
        ' Prevent Hacking
        If GetPlayerAccess(Index) <= 0 Then
            Exit Sub
        End If
        If Index <= 0 Or Index > MAX_PLAYERS Then Exit Sub
            
        Set Buffer = New clsBuffer
        Buffer.WriteBytes Data()

        ExpValue = Buffer.ReadLong
        ExpHour = Buffer.ReadLong
        ExpMinute = Buffer.ReadLong
        
        Set Buffer = Nothing
        
        'Not numeric, exit
        If Not IsNumeric(ExpValue) Or Not IsNumeric(ExpHour) Or Not IsNumeric(ExpMinute) Then Exit Sub
        
        If ExpHour < 0 Or ExpHour > 24 Then
            Call PlayerMsg(Index, "Utilize horas de 0 a 24.", White)
            Exit Sub
        End If
        
        If ExpMinute < 0 Or ExpMinute > 59 Then
            Call PlayerMsg(Index, "Utilize minutos de 0 a 59.", White)
            Exit Sub
        End If
        
        If ExpValue = 0 Then
            'Everything okay, clear values and close event
            ExpEvent = 0
            ExpEventHour = 0
            ExpEventMinute = 0
            Call GlobalMsg("Evento de experiência cancelado.", White)
            Exit Sub
        End If
            
            'Everything okay, now let's set it
            ExpEvent = ExpValue
            ExpEventHour = ExpHour
            ExpEventMinute = ExpMinute
            
            Call GlobalMsg("Evento de " & ExpEvent & "x de experiência, iniciado até: " & ExpEventHour & ":" & ExpEventMinute, White)
        
    End Sub

    Agora, vá no "ModServerLoop", e procure por:

    Código:
    If Tick > tmr1000 Then
                If isShuttingDown Then
                    Call HandleShutdown
                End If            
                
                tmr1000 = GetTickCount + 1000
            End If

    E então, substitua por:

    Código:
    If Tick > tmr1000 Then
                If isShuttingDown Then
                    Call HandleShutdown
                End If
                
                'Check for exp event every 1 second to do not pass time.
                'If your server lags 60 seconds, change your server, not the system :)
                If ExpEvent > 0 Then 'No need to keep on if no value higher than 0
                    If ExpEventHour = Hour(Now) And ExpEventMinute = Minute(Now) Then
                           'Clear Event
                           ExpEvent = 0
                           ExpEventHour = 0
                           ExpEventMinute = 0
                           Call GlobalMsg("O evento de experiência acabou.", White)
                    End If
                End If
                
                tmr1000 = GetTickCount + 1000
            End If

    Agora, em "ModGameLogic", substitua esta "Sub" :

    Código:
    Public Sub GivePlayerEXP(ByVal Index As Long, ByVal exp As Long)
        
        ' give the exp
        Call SetPlayerExp(Index, GetPlayerExp(Index) + exp)
        SendEXP Index
        SendActionMsg GetPlayerMap(Index), "+" & exp & " EXP", White, 1, (GetPlayerX(Index) * 32), (GetPlayerY(Index) * 32)
        
        ' check if we've leveled
        CheckPlayerLevelUp Index
        
    End Sub

    Por esta "Sub" :
    Código:
    Public Sub GivePlayerEXP(ByVal Index As Long, ByVal exp As Long)
        
        'Add event
        If ExpEvent > 0 Then
            exp = exp * ExpEvent
        End If
        
        ' give the exp
        Call SetPlayerExp(Index, GetPlayerExp(Index) + exp)
        SendEXP Index
        SendActionMsg GetPlayerMap(Index), "+" & exp & " EXP", White, 1, (GetPlayerX(Index) * 32), (GetPlayerY(Index) * 32)
        
        ' check if we've leveled
        CheckPlayerLevelUp Index
        
    End Sub

    Agora, em "ModGeneral" , em "InitServer", procure por:

    Código:
    ' Get the listening socket ready to go
        frmServer.Socket(0).RemoteHost = frmServer.Socket(0).LocalIP
        frmServer.Socket(0).LocalPort = Options.Port

    E acima disto, adicione isto:

    Código:
    'We don't want any "crap byte" event right
        ExpEvent = 0
        ExpEventHour = 0
        ExpEventMinute = 0

    Agora, vá em "ModGlobals" e no final, adicione isto:

    Código:
    'Event Exp
    Public ExpEvent As Long
    Public ExpEventHour As Long
    Public ExpEventMinute As Long

    Por fim, em "ModEnumerations", procure por:

    Código:
    ' Make sure CMSG_COUNT is below everything else
        CMSG_COUNT
    End Enum

    E acima disto, adicione isto:

    Código:
    CEvento 'Evento de Exp


    E pronto, o sistema está feito!  Very Happy

    -Como Funciona?


    *Primeiro de tudo, claro, só administradores podem usar isto.(ADM, GM, Mappers). Caso queiram mudar as permissões, modifique as permissões em: "ModHandleData/Handle Evento" e no acesso permissivo da checagem.

    *O sistema funciona assim:       
            /evento 2 16 20  ( /evento Valor Hora Minuto )
    Isso significa que terá um evento de 2x de experiência, até as 16 e 20.

    *Para cancelar o evento por colocar comando errado ou por vontade própria antes do tempo, use o comando:
            /evento 0 0 0
    Isso significa que o valor do evento será igual a 0, e o evento será cancelado. 
    OBS: Mesmo que coloque tempo, ex.: /evento 0 12 16 , o evento será cancelado.

    *O servidor está checando o tempo a cada 1 segundo que se passa, inclusive eu coloquei até uma frase: "Se seu servidor der 'lag' de 60 segundos, troque seu servidor, e não o sistema" , porque por favor né...isto significa que o tempo tem 60 checagens para não se passar do tempo previsto.

    *Cuidado ao utilizarem o sistema no sentido de:
            -Agora são 12:34, se você colocar o sistema para 12:33 , ficará até dar no tempo "12:33" isto é, até o dia seguinte que o relógio do sistema marcar "12:33".
    *O sistema de aplica às experiências do "GivePlayerExp", que normalmente são aplicadas no cálculo de experiência PvE. Caso queira adicionar à recompensas de exp para missões, guilds, itens, simplesmente utilize o cálculo:
               ExpN = ExpN * EventExp
    Isto é, multiplique o valor pelo "EventExp" que no caso é a quantidade multiplicativa.


    Créditos


    lucas100vzs

      Data/hora atual: Sab Abr 21, 2018 10:07 pm