[13.3] Regalos diarios

Ir abajo

[13.3] Regalos diarios

Mensaje por zerocx el 14/12/2016, 6:25 pm

Primero vamos al SERVIDOR

Buscan Public Type UserFlags, antes del End Type añaden lo siguiente:

Código:

RegaloDisponible As Byte
UltimoLogin As String

Ahora van al Sub LoadUserInit, debajo de:

Código:

.Paralizado = CByte(UserFile.GetValue("FLAGS", "Paralizado"))

Añaden lo siguiente:

Código:

.RegaloDisponible = CStr(UserFile.GetValue("REGALOSDIARIOS", "Disponible"))
.UltimoLogin = CStr(UserFile.GetValue("REGALOSDIARIOS", "UltimoLogin"))

Ahora van a ir al Sub SaveUser, debajo de:

Código:

Call Manager.ChangeValue("FLAGS", "Paralizado", CStr(.flags.Paralizado))

Van a añadir lo siguiente:

Código:

Call Manager.ChangeValue("REGALOSDIARIOS", "Disponible", CStr(.flags.RegaloDisponible))
Call Manager.ChangeValue("REGALOSDIARIOS", "UltimoLogin", CStr(.flags.UltimoLogin))

En el Sub ConnectNewUser, debajo de:

Código:

#If ConUpTime Then
    .LogOnTime = Now
    .UpTime = 0
#End If

Añaden lo siguiente:

Código:

.flags.RegaloDisponible = 1 'Le doy el regalo al crear el personaje por primera ves
.flags.UltimoLogin = Date 'Guardo la fecha del día

Ahora en el Sub ConnectUser, debajo de:

Código:

Call MostrarNumUsers

Añaden lo siguiente:

Código:

'Regalos diarios
If Not StrComp(.flags.UltimoLogin, Date, 1) = 0 Then
    .flags.RegaloDisponible = 1
End If
    
With RegaloDiario
    If .Activado = True Then
        If UserList(UserIndex).flags.RegaloDisponible = 1 Then
            Call WriteConsoleMsg(UserIndex, "Tu regalo diario se encuentra disponible, haz click en el ícono del regalo para recibirlo.", FontTypeNames.FONTTYPE_SERVER)
            Call WriteInformarRegaloDiario(UserIndex)
        End If
    End If
End With

Ahora van a Private Enum ServerPacketID, antes del End Enum añaden lo siguiente:

Código:

InformarRegaloDiario

Más abajo, en el Private Enum ClientPacketID, antes del End Enum añaden lo siguiente:

Código:

PedirRegaloDiario

Buscan Public Sub HandleIncomingData, antes del "End Select" van a agregar lo siguiente:

Código:

Case ClientPacketID.PedirRegaloDiario
            Call HandleRecibirRegaloDiario(UserIndex)

Ahora en el módulo Protocol del Servidor, al final de todo añaden estos módulos:

Código:

Public Sub WriteInformarRegaloDiario(ByVal UserIndex As Integer)
On Error GoTo Errhandler

With UserList(UserIndex).outgoingData
    Call .WriteByte(ServerPacketID.InformarRegaloDiario)
End With

Exit Sub

Errhandler:
If Err.Number = UserList(UserIndex).outgoingData.NotEnoughSpaceErrCode Then
    Call FlushBuffer(UserIndex)
    Resume
End If
End Sub

Public Sub HandleRecibirRegaloDiario(ByVal UserIndex As Integer)
'***************************************************
'Author: MAB
'Date: 14/12/2016
'Description: Give the user the daily reward.
'***************************************************
On Error GoTo Errhandler

With UserList(UserIndex)
    'Remove packet ID
    Call .incomingData.ReadByte
        
    Dim Obj As Obj
    Dim Slot As Byte
        
    Obj.ObjIndex = 1055 'Número que utilizamos para el regalo en el Obj.dat del servidor
    Obj.Amount = 1 'Cantidad de regalos que queremos entregar, por defecto 1 solo
        
    If RegaloDiario.Activado = True Then
        If .flags.Muerto = 1 Then
            Call WriteConsoleMsg(UserIndex, "Servidor> ¡¡Estás muerto!! sólo puedes reclamar tu premio diario cuando estás vivo.", FontTypeNames.FONTTYPE_INFO)
            Exit Sub
        End If
            
        If .flags.RegaloDisponible = 1 Then 'Si tiene el regalo disponible, procedemos
            .flags.RegaloDisponible = 0
            
            If Not MeterItemEnInventario(UserIndex, Obj) Then Call TirarItemAlPiso(.Pos, Obj)
                
            Call WriteConsoleMsg(UserIndex, "Has recibido " & Obj.Amount & " " & ObjData(Obj.ObjIndex).Name & ".", FontTypeNames.FONTTYPE_INFO)
        Else
            Call WriteConsoleMsg(UserIndex, "Ya has recibido tu regalo diario. Intenta nuevamente mañana.", FontTypeNames.FONTTYPE_INFO)
        End If
    Else
        Call WriteConsoleMsg(UserIndex, "El evento de Regalos Diarios se encuentra desactivado.", FontTypeNames.FONTTYPE_INFO)
    End If
End With

Errhandler:
    Dim error As Long
    error = Err.Number
On Error GoTo 0
    
    If error <> 0 Then _
        Err.Raise error
End Sub

Ahora van a crear un Módulo en el servidor, con el nombre que ustedes quieran, y van a añadir dentro todo este código:

Código:

Option Explicit

Private Type tConfigRegalo
    Index As Integer
    Amount(0 To 1) As Integer
End Type

Private Type tRegalo
    Activado As Boolean
    Cantidad As Long
    Obj() As tConfigRegalo
End Type

Public RegaloDiario As tRegalo

Public Sub CargarRegalosDiarios()
'****************************************
'Author: MAB
'Date: 14/12/2016
'Description: Load the daily rewards.
'****************************************
Dim Manager As clsIniManager
Set Manager = New clsIniManager

Call Manager.Initialize(App.Path & "\Dat\EventoRegalo.dat")

With RegaloDiario
    .Activado = Manager.GetValue("INIT", "Activado")
    .Cantidad = Manager.GetValue("INIT", "Cantidad")
    
    Call CargarPremios
End With

Set Manager = Nothing

End Sub

Private Sub CargarPremios()
'****************************************
'Author: MAB
'Date: 14/12/2016
'Description: Load the index of the reward and the amount.
'****************************************
Dim Manager As clsIniManager
Set Manager = New clsIniManager

Call Manager.Initialize(App.Path & "\Dat\EventoRegalo.dat")

Dim TempStr As String
Dim Ansci As Byte
Dim Total As Long
Dim LoopA As Long

Ansci = Asc("-")

With RegaloDiario
    Total = Manager.GetValue("INIT", "Cantidad")
    
    ReDim .Obj(1 To Total) As tConfigRegalo
    
    For LoopA = 1 To Total
        With .Obj(LoopA)
            .Index = Manager.GetValue("OBJ" & LoopA, "Index")
            
            TempStr = vbNullString
            TempStr = Manager.GetValue("OBJ" & LoopA, "Amount")
            .Amount(0) = val(General.ReadField(1, TempStr, Ansci))
            .Amount(1) = val(General.ReadField(2, TempStr, Ansci))
        End With
    Next LoopA
End With

Set Manager = Nothing

End Sub

Ahora van a buscar Public Enum eOBJType, y antes del "End Enum" van a añadir lo siguiente:

Código:

otRegalo = 37

Buscan Sub UseInvItem, antes del "End Select" añaden lo siguiente:

Código:

Case eOBJType.otRegalo
            If .flags.Muerto = 1 Then
                Call WriteConsoleMsg(UserIndex, "¡¡Estás muerto!! Sólo puedes usar ítems cuando estás vivo.", FontTypeNames.FONTTYPE_INFO)
                Exit Sub
            End If
            
            With RegaloDiario
                miobj.ObjIndex = RandomNumber(1, .Cantidad)
                miobj.Amount = RandomNumber(.Obj(miobj.ObjIndex).Amount(0), .Obj(miobj.ObjIndex).Amount(1))
                
                Call QuitarUserInvItem(UserIndex, Slot, 1)
                
                If Not MeterItemEnInventario(UserIndex, miobj) Then
                    Call TirarItemAlPiso(UserList(UserIndex).Pos, miobj)
                End If
                
                Call WriteConsoleMsg(UserIndex, "Has recibido " & miobj.Amount & " " & ObjData(miobj.ObjIndex).Name & ".", FontTypeNames.FONTTYPE_DIOS)
                
                Call UpdateUserInv(False, UserIndex, Slot)
            End With

En el módulo General, en Sub Main(), buscan:

Código:

Call BanIpCargar

Y abajo añaden:

Código:

Call CargarRegalosDiarios

Para terminar con el Servidor, van a ir a la carpeta Dat y van a crear un archivo llamado EventoRegalo.dat con el siguiente contenido:

Código:

[INIT]
Activado=1
Cantidad=2

[OBJ1]
Index=1
Amount=1-10

[OBJ2]
Index=2
Amount=1-10

Activado: informa al servidor si el evento se encuentra activo o no.
Cantidad: es la cantidad de Objetos que quieran cargar, si quieren añadir más simplemente modifiquen la cantidad al número de objetos que quieran.
OBJX: Cada ObjX es un item que puede entregar el regalo.
Index: Es el identificador del objeto, por ejemplo, un báculo engarzado tiene un ID de 660 (OBJ660 en el Obj.dat).
Amount: Es la cantidad, aquí cargamos 2 valores, el primero es la cantidad mínima y el segundo es la cantidad máxima. Con esto lo que se hace es que cuando el usuario abra su regalo, pueda tocarle una cantidad entre el mínimo y el máximo de lo que ustedes especifiquen ahí.

Y por último van a ir a su Obj.dat, y al final del documento van a crear el regalo de la siguiente forma:

Código:

[OBJ1055]
Name=Regalo
GrhIndex=601
ObjType=37
Agarrable=0

Para testear yo utilice el GrhIndex 601 que es el de la poción violeta, ustedes tienen que poner el de su regalo cuando ya este indexado. El ObjType 37 es el del Regalo, no pueden cambiarlo.
Recuerden que el nº del objeto es 1055, si su cantidad de objetos es diferente, tienen que modificar el número aquí y en el sub HandleRecibirRegaloDiario, donde especificamos el número del objeto regalo.


Ahora pasamos al CLIENTE

En el frmMain vamos a crear un label con el nombre "lblDailyReward" (sin las comillas dobles) y le van a cambiar la propiedad Caption y van a poner el número 1.

Luego le van a hacer doble click y dentro van a colocar el siguiente código:

Código:

Call WritePedirRegaloDiario
    
frmMain.lblDailyReward.Caption = "0"

Ahora van a Private Enum ServerPacketID, antes del End Enum añaden lo siguiente:

Código:

InformarRegaloDiario

Más abajo, en el Private Enum ClientPacketID, antes del End Enum añaden lo siguiente:

Código:

PedirRegaloDiario

En el Public Sub HandleIncomingData, antes del "End Select" añaden:

Código:

Case ServerPacketID.InformarRegaloDiario
            Call HandleRecibirInformeRegaloDiario

Por último van al módulo Protocol y abajo de todo añaden los siguientes módulos:

Código:

Public Sub HandleRecibirInformeRegaloDiario()

'Remove packet ID
Call incomingData.ReadByte

frmMain.lblDailyReward.Caption = "1"

End Sub

Public Sub WritePedirRegaloDiario()
    With outgoingData
        Call .WriteByte(ClientPacketID.PedirRegaloDiario)
    End With
End Sub

Ahora van a buscar Public Enum eOBJType, y antes del "End Enum" van a añadir lo siguiente:

Código:

otRegalo = 37

Y creo que eso es todo, si falta algo me avisan.

Salu2.


Última edición por zerocx el 16/12/2016, 5:56 pm, editado 2 veces
avatar
zerocx
Nivel 2
Nivel 2

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 43
Edad : 27
Localización : Buenos Aires
Fecha de inscripción : 23/10/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: [13.3] Regalos diarios

Mensaje por Toyz el 14/12/2016, 6:44 pm

"Ahora en el módulo Protocol del Servidor, al final de todo añaden estos módulos:" :grin:

Una pregunta... ¿cómo es eso de que el objeto puede tener 2 cantidades?

Excelente aporte, yo ya lo vi en uso y es funcional Razz


_______________

Como saben yo aporto bastante en Servers-Argentum y les quiero decir que todos tienen derecho de usar y de aportar en otra comunidad mis aportes pero sólo con un requisito y es tan simple que dejar los créditos. Gracias.
Si conocen otra comunidad y en esa misma mis aportes no están aportados, si tenés tiempo y ganas, aportalo! A mucha gente le puede servir. No te olvides del requisito Razz

MIS MEJORES APORTES:

Compra/venta de personajes:
https://goo.gl/A44Av0

Juegos del Hambre:
https://goo.gl/u6aNUG

Deathmatch automático:
https://goo.gl/GQF4fK

Sistema de retos vía MMR con búsqueda, emparejamiento, etc:
https://goo.gl/40uP0f

Sistemas de eventos automáticos de 1vs1 hasta 10vs10:
https://goo.gl/XYKygc

1VS1 - AIM - MELEE - Gana Sigue (Se liberan cupos)
https://goo.gl/qq83wx

Retos 3vs3 - [Items, 2 rounds, múltiples arenas, oro]
https://goo.gl/x8SMnV

Eliminar sistema de Skill (COMPLETO)
https://goo.gl/mKxHzC
avatar
Toyz
Administrador
Administrador

¿BANEADO? : No.
Premios :
[1er puesto] Usuario del año 2016
Cantidad de envíos : 5046
Edad : 17
Localización : Global.
Fecha de inscripción : 28/09/2014

Ver perfil de usuario

Volver arriba Ir abajo

Re: [13.3] Regalos diarios

Mensaje por zerocx el 14/12/2016, 6:54 pm

@Toyz escribió:"Ahora en el módulo Protocol del Servidor, al final de todo añaden estos módulos:" :grin:

Una pregunta... ¿cómo es eso de que el objeto puede tener 2 cantidades?

Excelente aporte, yo ya lo vi en uso y es funcional Razz

Porque cuando el usuario abre el regalo, el código hace un randomnumber de los objetos en la lista, y después hace otro randomnumber de la cantidad mínima y máxima de ese objeto, que en el ejemplo puede ser 1 o 10 en ambos items, pero cada uno puede ponerle la cantidad que quiera.
avatar
zerocx
Nivel 2
Nivel 2

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 43
Edad : 27
Localización : Buenos Aires
Fecha de inscripción : 23/10/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: [13.3] Regalos diarios

Mensaje por Toyz el 14/12/2016, 6:56 pm

Ahhh, perfecto.

Está lindo, capaz no lo usaría para regalos diarios sino como bonus algunos días o para los usuarios que están mucho tiempo online.

Gracias por aportar.


_______________

Como saben yo aporto bastante en Servers-Argentum y les quiero decir que todos tienen derecho de usar y de aportar en otra comunidad mis aportes pero sólo con un requisito y es tan simple que dejar los créditos. Gracias.
Si conocen otra comunidad y en esa misma mis aportes no están aportados, si tenés tiempo y ganas, aportalo! A mucha gente le puede servir. No te olvides del requisito Razz

MIS MEJORES APORTES:

Compra/venta de personajes:
https://goo.gl/A44Av0

Juegos del Hambre:
https://goo.gl/u6aNUG

Deathmatch automático:
https://goo.gl/GQF4fK

Sistema de retos vía MMR con búsqueda, emparejamiento, etc:
https://goo.gl/40uP0f

Sistemas de eventos automáticos de 1vs1 hasta 10vs10:
https://goo.gl/XYKygc

1VS1 - AIM - MELEE - Gana Sigue (Se liberan cupos)
https://goo.gl/qq83wx

Retos 3vs3 - [Items, 2 rounds, múltiples arenas, oro]
https://goo.gl/x8SMnV

Eliminar sistema de Skill (COMPLETO)
https://goo.gl/mKxHzC
avatar
Toyz
Administrador
Administrador

¿BANEADO? : No.
Premios :
[1er puesto] Usuario del año 2016
Cantidad de envíos : 5046
Edad : 17
Localización : Global.
Fecha de inscripción : 28/09/2014

Ver perfil de usuario

Volver arriba Ir abajo

Re: [13.3] Regalos diarios

Mensaje por zerocx el 14/12/2016, 7:01 pm

@Toyz escribió:Ahhh, perfecto.

Está lindo, capaz no lo usaría para regalos diarios sino como bonus algunos días o para los usuarios que están mucho tiempo online.

Gracias por aportar.

Si sacan la parte de la fecha y 2 o 3 boludeces, tranquilamente pueden crear un comando para "regalar" premios a los usuarios y el sistema les va a funcionar igual. Es una base para no solo regalos, sino un par de cosas más.
avatar
zerocx
Nivel 2
Nivel 2

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 43
Edad : 27
Localización : Buenos Aires
Fecha de inscripción : 23/10/2016

Ver perfil de usuario

Volver arriba Ir abajo

Re: [13.3] Regalos diarios

Mensaje por Happy el 14/12/2016, 8:30 pm

No soy de comentar en esta sección, pero este sistema me gustó.

Me pareció original, me gustaría verlo aplicado en un AO Smile





Shini I escribió:Capaz le vino y dijo fue happy es SMOD.


Reglamento general: http://www.servers-argentum.org/h2-reglamento
Reglamento de servers AO: http://goo.gl/3NbAM9

Invitado, mi msn es happy-ungran@hotmail.com y mi skype es Happy-Ungran
Invitado, ¿Querés ser mi amigo? haz click Aquí!.
Happy - Un gran - Noti - Erves - Clock
avatar
Happy
Administrador
Administrador

¿BANEADO? : No.
Premios : 1
[1º Puesto] Diseño mascota del foro




Cantidad de envíos : 10545
Localización : Offtopic
Fecha de inscripción : 24/05/2011

Ver perfil de usuario

Volver arriba Ir abajo

Re: [13.3] Regalos diarios

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba


 
Permisos de este foro:
No puedes responder a temas en este foro.