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.
Abaixo disto, coloque isto:
Agora, vá no módulo "ModClientTCP", e adicione no final esta "Sub"
Por fim, procure em "ModEnumerations" por:
E acima disto, coloque isto:
Muito bem, a parte do cliente está feita!
E, em "ModHandleData", procure por:
E, antes do "End Sub" desta fórmula, adicione isto:
Agora, ainda em "ModHandleData", adicione no final do módulo, esta "Sub" :
Agora, vá no "ModServerLoop", e procure por:
E então, substitua por:
Agora, em "ModGameLogic", substitua esta "Sub" :
Por esta "Sub" :
Agora, em "ModGeneral" , em "InitServer", procure por:
E acima disto, adicione isto:
Agora, vá em "ModGlobals" e no final, adicione isto:
Por fim, em "ModEnumerations", procure por:
E acima disto, adicione isto:
E pronto, o sistema está feito!
-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:
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!
-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.
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