Daga Rusa 100% automática - realizada por un NPC.

Ir abajo

Daga Rusa 100% automática - realizada por un NPC.

Mensaje por Toyz el 22/12/2016, 4:42 pm

VIDEO:

Módulo:
Código:

Option Explicit
'***************
'AUTOR: Toyz - Luciano
'FECHA: 19/12/16
'***************

Private Const Tiempo_Cancelamiento As Integer = 180

Public Const NPC_DAGA_RUSA As Integer = 1050
Public INDEX_NPC_DAGA_RUSA_ONLINE As Integer

Private Type tUsuario
    ID As Integer
    Posicion As WorldPos
End Type

Private Type tDagaRusa
    Activo As Boolean
    Usuarios() As tUsuario
    Conteo As Integer
    Cupos As Byte
    CoordenadasEspera As WorldPos
    CoordenadasArena As WorldPos
    CoordenadasNPC As WorldPos
    Premio As Long
    Inscripcion As Long
    Total As Byte
    Restantes As Byte
    AtacoUser As Integer
    Atacar As Integer
    PuedeAtacar As Boolean
    ActivarEvento As Boolean
    Volver As Boolean
End Type

Private DagaRusa As tDagaRusa

Public Sub Carga_DagaRusa()

    Dim Leer As clsIniReader
    Set Leer = New clsIniReader
    Call Leer.Initialize(App.Path & "\Dat\DagaRusa.dat")

    With DagaRusa.CoordenadasArena
        .Map = CInt(Leer.GetValue("EVENTO", "Mapa_Espera"))
        .X = CByte(Leer.GetValue("EVENTO", "X_Espera"))
        .Y = CByte(Leer.GetValue("EVENTO", "Y_Espera"))
    End With

    With DagaRusa.CoordenadasEspera
        .Map = CInt(Leer.GetValue("EVENTO", "Mapa_Arena"))
        .X = CByte(Leer.GetValue("EVENTO", "X_Arena"))
        .Y = CByte(Leer.GetValue("EVENTO", "Y_Arena"))
    End With

End Sub

Public Sub Armar_DagaRusa(ByVal ID As Integer, ByVal Cupos As Byte, ByVal Premio As Long, ByVal Inscripcion As Long)

    With DagaRusa
        If .Activo = True Then
            Call WriteConsoleMsg(ID, "Daga Rusa> El evento ya está en curso.", FontTypeNames.FONTTYPE_GUILD)
            Exit Sub
        End If

        If Cupos > 16 Then Cupos = 16
        If Cupos < 2 Then Cupos = 2
        If Premio <= 0 Then Premio = 1
      
        .Cupos = Cupos
        .Inscripcion = Inscripcion
        .Premio = Premio
        .Total = .Cupos
        .Restantes = .Total
        .Activo = True
        .Conteo = Tiempo_Cancelamiento
        ReDim .Usuarios(1 To .Cupos) As tUsuario
      
        Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Daga Rusa> " & .Cupos & " Cupos, Incripción" & IIf(.Inscripcion > 0, " de: " & .Inscripcion & " Monedas de oro, ", " Gratis, ") & IIf(.Premio > 0, "Premio de: " & .Premio & " Monedas de oro.", " No hay premio.") & " Manden /DAGARUSA si desean participar.", FontTypeNames.FONTTYPE_GUILD))
    End With

End Sub

Public Sub Entrar_DagaRusa(ByVal ID As Integer)

    Dim ID_DagaRusa As Byte
    Dim LoopC As Long

    With DagaRusa
        If Puede_Entrar(ID) = False Then _
           Exit Sub

        Call WriteConsoleMsg(ID, "Has ingresado al evento" & IIf(.Inscripcion > 0, ", se te han descontado " & .Inscripcion & " monedas de oro.", vbNullString) & ". Espera a que el cupo se complete. ¡Suerte en el campo de batalla!", FontTypeNames.FONTTYPE_GUILD)

        UserList(ID).Stats.GLD = UserList(ID).Stats.GLD - .Inscripcion
        ID_DagaRusa = DagaRusa_ID
        UserList(ID).flags.EnDagaRusa = ID_DagaRusa

        .Cupos = .Cupos - 1
        .Usuarios(ID_DagaRusa).ID = ID
        .Usuarios(ID_DagaRusa).Posicion = UserList(ID).pos

        With DagaRusa.CoordenadasEspera
            WarpUserChar ID, .Map, .X, .Y, False
        End With

        WritePauseToggle ID
        WriteUpdateGold ID

        If .Cupos = 0 Then
            For LoopC = 1 To .Total
                WarpUserChar .Usuarios(LoopC).ID, .CoordenadasArena.Map, .CoordenadasArena.X + LoopC, .CoordenadasArena.Y, True
            Next LoopC
            Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Daga Rusa> El cupo ha sido completado!", FontTypeNames.FONTTYPE_GUILD))
            .ActivarEvento = True
            .Conteo = 10
            .CoordenadasNPC = UserList(.Usuarios(1).ID).pos
            .CoordenadasNPC.Y = .CoordenadasNPC.Y - 1
            SpawnNpc NPC_DAGA_RUSA, .CoordenadasNPC, False, False
        End If
    End With

End Sub

Private Function DagaRusa_ID() As Byte

    Dim LoopC As Long

    With DagaRusa
        For LoopC = 1 To .Total
            If .Usuarios(LoopC).ID = 0 Then
                DagaRusa_ID = LoopC
                Exit Function
            End If
        Next LoopC
    End With

End Function

Private Function Puede_Entrar(ByVal ID As Integer) As Boolean

    Puede_Entrar = False

    If UserList(ID).flags.Muerto > 0 Then
        Call WriteConsoleMsg(ID, "Estás muerto.", FontTypeNames.FONTTYPE_GUILD)
        Exit Function
    End If

    'If UserList(ID).flags.EnJDH > 0 Then
    '    Call WriteConsoleMsg(ID, "Estás en los Juegos del Hambre.", FontTypeNames.FONTTYPE_GUILD)
    '    Exit Function
    'End If

    'If UserList(ID).flags.EnPlantes > 0 Then
    '    Call WriteConsoleMsg(ID, "Ya estás en Plantes Automáticos.", FontTypeNames.FONTTYPE_GUILD)
    '    Exit Function
    'End If

    If UserList(ID).flags.EnDagaRusa > 0 Then
        Call WriteConsoleMsg(ID, "Ya estás en el en Daga Rusa.", FontTypeNames.FONTTYPE_GUILD)
        Exit Function
    End If

    If DagaRusa.Activo = False Then
        Call WriteConsoleMsg(ID, "El evento no está en curso.", FontTypeNames.FONTTYPE_GUILD)
        Exit Function
    End If

    If DagaRusa.Cupos = 0 Then
        Call WriteConsoleMsg(ID, "El evento ya no tiene cupos disponibles.", FontTypeNames.FONTTYPE_GUILD)
        Exit Function
    End If

    If UserList(ID).Stats.GLD < DagaRusa.Inscripcion Then
        Call WriteConsoleMsg(ID, "No tienes el oro suficiente.", FontTypeNames.FONTTYPE_GUILD)
        Exit Function
    End If

    If Not UserList(ID).pos.Map = 1 Then
        Call WriteConsoleMsg(ID, "Tienes que estar en Ullathorpe para poder ingresar al evento", FontTypeNames.FONTTYPE_GUILD)
        Exit Function
    End If
  
    If Tiene_Objeto(ID) = False Then
        Call WriteConsoleMsg(ID, "No tienes que tener ningún objeto en tu inventario para ingresar al evento.", FontTypeNames.FONTTYPE_GUILD)
        'Exit Function
    End If

    Puede_Entrar = True

End Function

Public Sub Contar_DagaRusa()

    Dim LoopC As Long
    Dim LoopX As Long
    Dim ID_DagaRusa As Byte

    With DagaRusa
        If .Conteo = 0 Then
            .Conteo = -1
            If .Activo = True Then
                If .ActivarEvento = True Then
                    SendData SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Daga Rusa> Ya!", FontTypeNames.FONTTYPE_FIGHT)
                    .PuedeAtacar = True
                Else
                    SendData SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Daga Rusa> Evento cancelado por falta de participantes, se ha devuelto el oro por la inscripción.", FontTypeNames.FONTTYPE_GUILD)
                    Cancelar_DagaRusa
                End If
            End If
        End If
    '        .Conteo = 3
        If .Conteo > 0 Then
            If .ActivarEvento = True Then _
               SendData SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Daga Rusa> " & .Conteo, FontTypeNames.FONTTYPE_GUILD)
            .Conteo = .Conteo - 1
        End If
    End With
End Sub

Public Sub IA_NPC_DAGARUSA(ByVal NpcIndex As Integer)

    Dim Y As Long
    Dim X As Long
    Dim UI As Integer
    Dim tHeading As Byte

    With Npclist(NpcIndex)
        If DagaRusa.PuedeAtacar = True Then
            If DagaRusa.Atacar > 0 Then
                NpcAtacaUser NpcIndex, DagaRusa.Atacar
                DagaRusa.AtacoUser = DagaRusa.Atacar
                DagaRusa.Atacar = 0
            End If

            For Y = .pos.Y To .pos.Y + RANGO_VISION_Y
                For X = .pos.X To .pos.X + RANGO_VISION_Y
                    If X >= MinXBorder And X <= MaxXBorder And Y >= MinYBorder And Y <= MaxYBorder Then
                        UI = MapData(.pos.Map, X, Y).UserIndex
                        If UI > 0 Then
                            If UI <> DagaRusa.AtacoUser Then
                                If DagaRusa.Volver = False Then
                                    If Distancia(.pos, UserList(UI).pos) <= 1 Then
                                        If DagaRusa.Atacar = 0 Then
                                            DagaRusa.Atacar = UI
                                            .Char.Heading = SOUTH
                                            ChangeNPCChar NpcIndex, .Char.Body, .Char.Head, .Char.Heading
                                            Exit Sub
                                        End If
                                    End If
                                    If UserList(UI).flags.EnDagaRusa = Total Then DagaRusa.Volver = True
                                    tHeading = FindDirection(Npclist(NpcIndex).pos, UserList(UI).pos)
                                Else
                                    tHeading = FindDirection(Npclist(NpcIndex).pos, DagaRusa.CoordenadasNPC)
                                End If
                                MoveNPCChar NpcIndex, tHeading
                                Exit Sub
                            End If
                        End If
                    End If
                Next X
            Next Y
        End If
    End With
End Sub

Private Function ID_Usuario() As Byte

    Dim LoopC As Long

    For LoopC = 1 To DagaRusa.Total
        If DagaRusa.Usuarios(LoopC).ID > 0 Then
            ID_Usuario = LoopC
            Exit For
        End If
    Next LoopC

End Function

Public Sub Apuñalado_DagaRusa(ByVal ID As Integer)

    Dim ID_DagaRusa As Byte

    ID_DagaRusa = UserList(ID).flags.EnDagaRusa
    UserList(ID).flags.EnDagaRusa = 0

    With DagaRusa
        .Restantes = .Restantes - 1
        If .Restantes > 1 Then SendData SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Daga Rusa> Quedan " & .Restantes & " participantes.", FontTypeNames.FONTTYPE_GUILD)
        Call WriteConsoleMsg(ID, "Daga Rusa> ¡Has perdido, has sido descalificado. ¡Suerte para la próxima!", FontTypeNames.FONTTYPE_GUILD)
        WarpUserChar ID, .Usuarios(ID_DagaRusa).Posicion.Map, .Usuarios(ID_DagaRusa).Posicion.X, .Usuarios(ID_DagaRusa).Posicion.Y, False
        .Usuarios(ID_DagaRusa).ID = 0
        If .Restantes = 1 Then
            Call QuitarNPC(INDEX_NPC_DAGA_RUSA_ONLINE)
            Call Finalizar
        End If
    End With

End Sub

Private Sub Finalizar()

    Dim LoopC As Long
    Dim Dame_ID As Byte
    Dim ID As Integer

    With DagaRusa
        Dame_ID = ID_Usuario
        ID = .Usuarios(Dame_ID).ID
        SendData SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Daga Rusa> Ganador del evento: " & UserList(ID).name & " se lleva una cantidad de " & .Premio & " monedas de oro, felicitaciones!", FontTypeNames.FONTTYPE_GUILD)
        UserList(ID).Stats.GLD = UserList(ID).Stats.GLD + .Premio

        WriteUpdateGold ID
        UserList(ID).flags.EnDagaRusa = 0
        .Premio = 0
        WarpUserChar ID, .Usuarios(Dame_ID).Posicion.Map, .Usuarios(Dame_ID).Posicion.X, .Usuarios(Dame_ID).Posicion.Y, False
        Call Limpiar
    End With
End Sub

Public Sub Cancelar_DagaRusa()

    Dim LoopC As Long

    With DagaRusa

        If .Activo = False Then Exit Sub

        For LoopC = 1 To .Total
            If .Usuarios(LoopC).ID > 0 Then
                WarpUserChar .Usuarios(LoopC).ID, .Usuarios(LoopC).Posicion.Map, .Usuarios(LoopC).Posicion.X, .Usuarios(LoopC).Posicion.Y, False
                UserList(.Usuarios(LoopC).ID).flags.EnDagaRusa = 0
                UserList(.Usuarios(LoopC).ID).Stats.GLD = UserList(.Usuarios(LoopC).ID).Stats.GLD + .Inscripcion

                WriteConsoleMsg .Usuarios(LoopC).ID, "El evento ha sido cancelado, se te ha devuelto el costo de la inscripción.", FontTypeNames.FONTTYPE_GUILD
                WriteUpdateGold .Usuarios(LoopC).ID
            End If
        Next LoopC
    End With

    SendData SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Daga Rusa> Evento fue cancelado por un Game Master.", FontTypeNames.FONTTYPE_GUILD)
    Limpiar

End Sub

Public Sub Desconexion_DagaRusa(ByVal ID As Integer)

    If UserList(ID).flags.EnDagaRusa = 0 Then Exit Sub

    With DagaRusa
        WarpUserChar ID, .Usuarios(UserList(ID).flags.EnDagaRusa).Posicion.Map, .Usuarios(UserList(ID).flags.EnDagaRusa).Posicion.X, .Usuarios(UserList(ID).flags.EnDagaRusa).Posicion.Y, True
        .Usuarios(UserList(ID).flags.EnDagaRusa).ID = 0
        UserList(ID).flags.EnDagaRusa = 0
        .Cupos = .Cupos + 1
        WritePauseToggle ID
    End With

End Sub

Private Sub Limpiar()

    With DagaRusa
        .Activo = False
        .Conteo = -1
        .Cupos = 0
        .Inscripcion = 0
        .Premio = 0
        .Restantes = 0
        .Total = 0
        .AtacoUser = 0
        .Atacar = 0
        .PuedeAtacar = False
        .ActivarEvento = False
        Erase .Usuarios()
    End With
    INDEX_NPC_DAGA_RUSA_ONLINE = 0
End Sub

Private Function Tiene_Objeto(ByVal ID As Integer) As Boolean
    Dim LoopC As Long
    Tiene_Objeto = False
    With UserList(ID)
        For LoopC = 1 To .CurrentInventorySlots
            If .Invent.Object(LoopC).ObjIndex > 0 Then Exit Function
        Next LoopC
        Tiene_Objeto = True
    End With
End Function




NPCDAÑO:
Código:

If .flags.EnDagaRusa > 0 Then
            If RandomNumber(1, 100) = 10 Then
                .Stats.MinHp = .Stats.MinHp - daño * 2
                Call WriteMultiMessage(UserIndex, eMessages.NPCHitUser, Lugar, daño)
                If .Stats.MinHp <= 0 Then
                    .Stats.MinHp = 1
                    Call WriteConsoleMsg(UserIndex, "Daga Rusa> Te hemos curado!", FontTypeNames.FONTTYPE_FIGHT)
                End If
                Call WriteConsoleMsg(UserIndex, "Daga Rusa> La criautura te ha apuñalado por " & daño, FontTypeNames.FONTTYPE_FIGHT)
                Call m_DagaRusa.Apuñalado_DagaRusa(UserIndex)
                Call WriteUpdateHP(UserIndex)
            End If
            daño = CInt(RandomNumber(1, 2))
            .Stats.MinHp = .Stats.MinHp - daño
            Call WriteMultiMessage(UserIndex, eMessages.NPCHitUser, Lugar, daño)
            If .Stats.MinHp <= 0 Then
                .Stats.MinHp = 20
                Call WriteConsoleMsg(UserIndex, "Daga Rusa> Te hemos curado!", FontTypeNames.FONTTYPE_FIGHT)
            End If
            Call WriteUpdateHP(UserIndex)
            Exit Sub
        End If

Ayudas:

Tienen que crear un nuevo tipo de movimiento en el enum IA.
Tiene que agregar un nuevo caso en el NPC_IA
Tienen que llamar en ese caso al método de IA del módulo que dejé.
Llamada en el sub main.
En closesocket hacer la la llamada correspondiente
Agregar un NPC en el npc.dat con el tipo de movimiento nuevo que agregaste.
Llamada en el pasar segundo.

Paquetes:
1- Armar evento.
2- Cancelar evento.
3- Entrar evento.


_______________

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 : 5045
Edad : 17
Localización : Global.
Fecha de inscripción : 28/09/2014

Ver perfil de usuario

Volver arriba Ir abajo

Re: Daga Rusa 100% automática - realizada por un NPC.

Mensaje por Nethird el 22/12/2016, 6:53 pm

Esto nunca lo habia visto, esta genial. Quizá podrías dejarlo completo para los que no quieren pensar, o no tienen idea jajaj



Spoiler:

Spoiler:
[/color]
Escuchalo:
Spoiler:



¡Escuchá la radio acá!
Spoiler:




[/i]
avatar
Nethird
Administrador
Administrador

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 9841
Edad : 20
Localización : Entre 4 paredes
Fecha de inscripción : 25/12/2009

Ver perfil de usuario http://www.ao-sender.com.ar

Volver arriba Ir abajo

Re: Daga Rusa 100% automática - realizada por un NPC.

Mensaje por Toyz el 22/12/2016, 6:58 pm

Es muy simple añadir lo que falta, quizá lo más complicado dentro de lo simple son los paquetes. Ahora en un rato justo iba a dejar explicación BIEN detallada sobre el protocolo binario así aprender a hacer paquetes sin problemas.

No lo dejo paso a paso por el simple hecho de que quiero que lean el código que aporto, el 99% del código está hecho. O sea, el nexo del código está ahí, lo que falta son cosas mínimas como declarar variables o hacer llamadas Razz

EDIT: Justo leo que había dejado los pasos sin códigos a realizar 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 : 5045
Edad : 17
Localización : Global.
Fecha de inscripción : 28/09/2014

Ver perfil de usuario

Volver arriba Ir abajo

Re: Daga Rusa 100% automática - realizada por un NPC.

Mensaje por KiZAS el 5/1/2017, 7:34 pm

Te estás volviendo todo un especialista men aflojá y déjame oportunidades!!
avatar
KiZAS
Nivel 9
Nivel 9

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 941
Edad : 15
Localización : In da Haus
Fecha de inscripción : 21/10/2011

Ver perfil de usuario

Volver arriba Ir abajo

Re: Daga Rusa 100% automática - realizada por un NPC.

Mensaje por ryake el 22/2/2017, 1:55 pm

"el 99% del código está hecho".
De ahí a que esté BIEN hecho es otra cosa.
Tenés mal el NPC_AI
avatar
ryake
Nivel 6
Nivel 6

¿BANEADO? : No.
Premios : Ninguno.
Cantidad de envíos : 320
Edad : 28
Localización : Allahu akbar
Fecha de inscripción : 18/05/2011

Ver perfil de usuario

Volver arriba Ir abajo

Re: Daga Rusa 100% automática - realizada por un NPC.

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba


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