Evento de Experiência (comando e tempo) Hitskin_logo Hitskin.com

Isto é uma pré-visualização de um tema em Hitskin.com
Instalar o temaVoltar para a ficha do tema

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

Evento de Experiência (comando e tempo)

Ir para baixo

Evento de Experiência (comando e tempo) Empty Evento de Experiência (comando e tempo)

Mensagem por Kotol Sáb 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
Kotol
Kotol
Moderador Local
Moderador Local

Mensagens : 77
Créditos : 17

Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos