[Aportes] Base 1vs1, 2vs2 , death vía doble clics en NPCS. Rápido y dinámico

Shak

Evolution
Miembro del equipo
Developer
Especialista de Argentum
Bueno es mediante NPC y doble clic. Adeemás de que para el 2vs2 hay que estar en las posiciones específicas que muestra el código

Esta es la segunda versión que hice, la cual salió mucho más prolija y sin tantos codeos al pedo. La primera que había hecho , no estaba ni testiada, esta lo está y está funcional. Si alguno lo quiere usar para sus AOS.

Este es un código que hice para LujanAO, a diferencia del anterior que fue hecho para ArgenDrag.

¿Se puede mejorar? Claro que si
¿Funciona al 100%? Si [Nunca se bugeo en Lujan, a pesar de sus pocos users que tuvo, fue testeado masivamente, se podría decir..]


Código:
'BY SHAK

Option Explicit

Type tArenaDeath
    MaxUsers As Byte
    mapa As WorldPos
    Usuarios As Byte
End Type

Public ArenaDeath As tArenaDeath
'''''''''''''''''''''
Type tArena1vs1
    UserIndex1 As Integer
    UserIndex2 As Integer
    Ocupada As Byte
End Type

Public Arena1vs1 As tArena1vs1

''''''''''''''''''''''
Type tMapa
    M1vs1 As WorldPos
    M2vs2 As WorldPos
    Death As WorldPos
End Type

Public MapaArenas As tMapa
''''''''''''''''''''''
Type tArena2vs2
    Team1(1 To 2) As Integer
    Team2(1 To 2) As Integer
    Ocupada As Byte
    PosRecluta As WorldPos
End Type


'//Usado para saber en que evento está.
Public Enum eEventos
    UNOVSUNO = 1
    DOSVSDOS = 2
    Death = 3
End Enum

Public Arena2vs2 As tArena2vs2



''''''''''''1VS1 2VS2 DEATHMATCH DE USUARIOS'''''''''''''''''''''''''

Public Sub LoadArenas()
    ArenaDeath.MaxUsers = 20
    ArenaDeath.mapa.Map = 29
    ArenaDeath.mapa.X = 40
    ArenaDeath.mapa.Y = 59
   
    MapaArenas.M1vs1.Map = 29
    MapaArenas.M1vs1.X = 13
    MapaArenas.M1vs1.Y = 38 '23 46 la otra pos
   
    MapaArenas.M2vs2.Map = 29
    MapaArenas.M2vs2.X = 35
    MapaArenas.M2vs2.Y = 38 '52 53 el otro
   
    Arena2vs2.PosRecluta.Map = 1
    Arena2vs2.PosRecluta.X = 53
    Arena2vs2.PosRecluta.Y = 49
End Sub


Public Sub EntrarArena(ByVal UserIndex As Integer)
    With UserList(UserIndex)
        If Arena1vs1.Ocupada <> 0 Then
            Call WriteConsoleMsg(UserIndex, "1vs1» La sala está ocupada", FontTypeNames.FONTTYPE_INFO)
            Exit Sub
        End If
       
        If .flags.EnEvento > 0 Then
            Call WriteConsoleMsg(UserIndex, "Ya te encuentras participando y/o en otro evento.", FontTypeNames.FONTTYPE_INFO)
            Exit Sub
        End If
       
        'Si es el primer usuario que entra
        If Arena1vs1.UserIndex1 = 0 Then
            Arena1vs1.UserIndex1 = UserIndex
            Call WarpUserChar(UserIndex, MapaArenas.M1vs1.Map, MapaArenas.M1vs1.X, MapaArenas.M1vs1.Y, False)
            Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Arena 1vs1» El personaje " & .name & " espera contrincante en la arena de 1vs1", FontTypeNames.FONTTYPE_GUILD))
           
            .flags.EnEvento = eEventos.UNOVSUNO
        Else 'Completamos
            Arena1vs1.UserIndex2 = UserIndex
           
            Call WarpUserChar(Arena1vs1.UserIndex1, MapaArenas.M1vs1.Map, MapaArenas.M1vs1.X, MapaArenas.M1vs1.Y, False)
            Call WarpUserChar(UserIndex, MapaArenas.M1vs1.Map, 23, 46, False)
            Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Arena 1vs1» " & UserList(Arena1vs1.UserIndex1).name & " vs " & UserList(Arena1vs1.UserIndex2).name & ".", FontTypeNames.FONTTYPE_GUILD))
            .flags.EnEvento = eEventos.UNOVSUNO
            Arena1vs1.Ocupada = 1
        End If
   
    End With
End Sub

Public Sub SalirArena(ByVal UserIndex As Integer, Optional ByVal Ganador As Integer = 0)
    With UserList(UserIndex)
       
        'DESCONEXIÓN DEL PERSONAJE
        If Ganador = 0 Then
            If Arena1vs1.UserIndex2 = 0 Then 'Significa que todavía no empezo el duelo
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg( _
                    "Desconexión en arena» Sala de 1vs1 libre.", FontTypeNames.FONTTYPE_GUILD))
               
             
                Arena1vs1.UserIndex1 = 0
            Else 'Estaban en duelo
                If Arena1vs1.UserIndex1 = UserIndex Then
                    Arena1vs1.UserIndex1 = Arena1vs1.UserIndex2
                    Arena1vs1.UserIndex2 = 0
                Else
                    Arena1vs1.UserIndex2 = 0
                End If
               
             
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg( _
                    "Arena 1vs1» El ganador es " & UserList(Arena1vs1.UserIndex1).name & ". Espera contrincante en dicha arena.", FontTypeNames.FONTTYPE_GUILD))
                 
            End If
             Arena1vs1.Ocupada = 0
        Else 'Gano limpiamente
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg( _
                        "Arena 1vs1»  " & UserList(Arena1vs1.UserIndex1).name & " vs " & UserList(Arena1vs1.UserIndex2).name & ". Ganador " & UserList(Ganador).name & " quien sigue en pie esperando rival.", FontTypeNames.FONTTYPE_GUILD))
                   
                If Arena1vs1.UserIndex1 = UserIndex Then
                    Arena1vs1.UserIndex1 = Arena1vs1.UserIndex2
                    Arena1vs1.UserIndex2 = 0
                Else
                    Arena1vs1.UserIndex2 = 0
                End If
               
                Arena1vs1.Ocupada = 0
               
        End If

        If Ganador <> 0 Then Call FlushBuffer(Ganador)
        Call WarpUserChar(UserIndex, 1, 50, 50, False)
        .flags.EnEvento = 0
       
    End With
End Sub

Public Function UserIndex2vs2_1() As Integer
   
    UserIndex2vs2_1 = 0
   
    If MapData(Arena2vs2.PosRecluta.Map, Arena2vs2.PosRecluta.X, Arena2vs2.PosRecluta.Y).UserIndex <> 0 Then
        UserIndex2vs2_1 = MapData(Arena2vs2.PosRecluta.Map, Arena2vs2.PosRecluta.X, Arena2vs2.PosRecluta.Y).UserIndex
    End If
End Function

Public Function UserIndex2vs2_2() As Integer
    UserIndex2vs2_2 = 0
   
    If MapData(Arena2vs2.PosRecluta.Map, Arena2vs2.PosRecluta.X + 2, Arena2vs2.PosRecluta.Y).UserIndex <> 0 Then
        UserIndex2vs2_2 = MapData(Arena2vs2.PosRecluta.Map, Arena2vs2.PosRecluta.X + 2, Arena2vs2.PosRecluta.Y).UserIndex
    End If
End Function
Public Function CheckPosArena2vs2(ByVal UI As Integer) As Boolean
'Chequeamos las posiciones!
   
    Dim UserIndex1 As Integer, UserIndex2 As Integer
   
    UserIndex1 = MapData(Arena2vs2.PosRecluta.Map, Arena2vs2.PosRecluta.X, Arena2vs2.PosRecluta.Y).UserIndex
    UserIndex2 = MapData(Arena2vs2.PosRecluta.Map, Arena2vs2.PosRecluta.X + 2, Arena2vs2.PosRecluta.Y).UserIndex
   
    If UserIndex1 <> 0 And UserIndex2 <> 0 Then
        If UserIndex1 = UI Or UserIndex2 = UI Then _
        CheckPosArena2vs2 = True
    Else
        CheckPosArena2vs2 = False
    End If
End Function
Public Sub EntrarArena2vs2(ByVal UserIndex As Integer)
    With UserList(UserIndex)
        If Arena2vs2.Ocupada <> 0 Then
            Call WriteConsoleMsg(UserIndex, "La arena se encuentra ocupada.", FontTypeNames.FONTTYPE_INFO)
            Exit Sub
        End If
       
        If CheckPosArena2vs2(UserIndex) = False Then
            Call WriteConsoleMsg(UserIndex, "Recuerda respetar las pocisiones para entrar a la arena.", FontTypeNames.FONTTYPE_INFO)
            Exit Sub
        End If
       
        '//Entramos con mi compa ñery
        If Arena2vs2.Team1(1) = 0 Then
            Arena2vs2.Team1(1) = UserIndex2vs2_1
            Arena2vs2.Team1(2) = UserIndex2vs2_2
           
            UserList(Arena2vs2.Team1(1)).flags.EnEvento = eEventos.DOSVSDOS
            UserList(Arena2vs2.Team1(2)).flags.EnEvento = eEventos.DOSVSDOS
            Call WarpUserChar(Arena2vs2.Team1(1), MapaArenas.M2vs2.Map, MapaArenas.M2vs2.X, MapaArenas.M2vs2.Y, False)
            Call WarpUserChar(Arena2vs2.Team1(2), MapaArenas.M2vs2.Map, MapaArenas.M2vs2.X + 1, MapaArenas.M2vs2.Y, False)
            Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Arena 2vs2» " & UserList(Arena2vs2.Team1(1)).name & "-" & UserList(Arena2vs2.Team1(2)).name & " esperan contrincante.", FontTypeNames.FONTTYPE_GUILD))
       
        Else
            Arena2vs2.Team2(1) = UserIndex2vs2_1
            Arena2vs2.Team2(2) = UserIndex2vs2_2
            UserList(Arena2vs2.Team2(1)).flags.EnEvento = eEventos.DOSVSDOS
            UserList(Arena2vs2.Team2(2)).flags.EnEvento = eEventos.DOSVSDOS
            Call WarpUserChar(Arena2vs2.Team1(1), MapaArenas.M2vs2.Map, MapaArenas.M2vs2.X, MapaArenas.M2vs2.Y, False)
            Call WarpUserChar(Arena2vs2.Team1(2), MapaArenas.M2vs2.Map, MapaArenas.M2vs2.X + 1, MapaArenas.M2vs2.Y, False)
           
            Call WarpUserChar(Arena2vs2.Team2(1), MapaArenas.M2vs2.Map, 52, 53, False)
            Call WarpUserChar(Arena2vs2.Team2(2), MapaArenas.M2vs2.Map, 53, 53, False)
            Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Arena 2vs2» " & UserList(Arena2vs2.Team1(1)).name & "-" & UserList(Arena2vs2.Team1(2)).name & " VS " & UserList(Arena2vs2.Team2(1)).name & "-" & UserList(Arena2vs2.Team2(2)).name & ".", FontTypeNames.FONTTYPE_GUILD))
               
            'warpeo
        End If
    End With
End Sub

Public Sub SalirArena2vs2(ByVal UserIndex As Integer, Optional ByVal Ganador As Integer = 0)
    With UserList(UserIndex)
        If Ganador = 0 Then 'Deslogio alguien
            'El que deslogeo es la pareja 1 ?
            If Arena2vs2.Team1(1) = UserIndex Or Arena2vs2.Team1(2) = UserIndex Then
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Desconexión en 2vs2» " & UserList(Arena2vs2.Team1(1)).name & "-" & UserList(Arena2vs2.Team1(2)).name & " VS " & UserList(Arena2vs2.Team2(1)).name & "-" & UserList(Arena2vs2.Team2(2)).name & ". Ganador equipo 2, quien sigue buscando rival.", FontTypeNames.FONTTYPE_GUILD))
               
                Call WarpUserChar(Arena2vs2.Team1(1), 1, 50, 50, False)
                Call WarpUserChar(Arena2vs2.Team1(2), 1, 51, 50, False)
               
                UserList(Arena2vs2.Team1(1)).flags.EnEvento = 0
                UserList(Arena2vs2.Team1(2)).flags.EnEvento = 0
                Arena2vs2.Team1(1) = Arena2vs2.Team2(1)
                Arena2vs2.Team1(2) = Arena2vs2.Team2(2)
                Arena2vs2.Team2(1) = 0
                Arena2vs2.Team2(2) = 0
               
               
            Else 'Es la pareja 2
                Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Desconexión en 2vs2» " & UserList(Arena2vs2.Team1(1)).name & "-" & UserList(Arena2vs2.Team1(2)).name & " VS " & UserList(Arena2vs2.Team2(1)).name & "-" & UserList(Arena2vs2.Team2(2)).name & ". Ganador equipo 1, quien sigue buscando rival.", FontTypeNames.FONTTYPE_GUILD))
                Call WarpUserChar(Arena2vs2.Team2(1), 1, 50, 50, False)
                Call WarpUserChar(Arena2vs2.Team2(2), 1, 51, 50, False)
                UserList(Arena2vs2.Team2(1)).flags.EnEvento = 0
                UserList(Arena2vs2.Team2(2)).flags.EnEvento = 0
                Arena2vs2.Team2(1) = 0
                Arena2vs2.Team2(2) = 0
            End If
           
        Else ' Ganaron limpiamente
       
        'Chequeamos que esten los dos muertos!!!!!! ! ! ! !
        Dim Muerto As Byte
            If UserList(Arena2vs2.Team1(1)).flags.Muerto <> 0 And UserList(Arena2vs2.Team1(2)).flags.Muerto <> 0 Then
                Muerto = 1
            ElseIf UserList(Arena2vs2.Team2(1)).flags.Muerto <> 0 And UserList(Arena2vs2.Team2(2)).flags.Muerto <> 0 Then
                Muerto = 1
            End If
           
           
            If Muerto <> 0 Then
                'Pierde la pareja 1 ?
                If Arena2vs2.Team1(1) = UserIndex Or Arena2vs2.Team1(2) = UserIndex Then
                    Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Arena 2vs2» " & UserList(Arena2vs2.Team1(1)).name & "-" & UserList(Arena2vs2.Team1(2)).name & " VS " & UserList(Arena2vs2.Team2(1)).name & "-" & UserList(Arena2vs2.Team2(2)).name & ". Ganador equipo 2, quien sigue buscando rival.", FontTypeNames.FONTTYPE_GUILD))
                   
                    Call WarpUserChar(Arena2vs2.Team1(1), 1, 50, 50, False)
                    Call WarpUserChar(Arena2vs2.Team1(2), 1, 51, 50, False)
                   
                    UserList(Arena2vs2.Team1(1)).flags.EnEvento = 0
                    UserList(Arena2vs2.Team1(2)).flags.EnEvento = 0
                    Arena2vs2.Team1(1) = Arena2vs2.Team2(1)
                    Arena2vs2.Team1(2) = Arena2vs2.Team2(2)
                    Arena2vs2.Team2(1) = 0
                    Arena2vs2.Team2(2) = 0
                   
                Else 'Es la pareja 2
                    Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Arena 2vs2» " & UserList(Arena2vs2.Team1(1)).name & "-" & UserList(Arena2vs2.Team1(2)).name & " VS " & UserList(Arena2vs2.Team2(1)).name & "-" & UserList(Arena2vs2.Team2(2)).name & ". Ganador equipo 1, quien sigue buscando rival.", FontTypeNames.FONTTYPE_GUILD))
                    Call WarpUserChar(Arena2vs2.Team2(1), 1, 50, 50, False)
                    Call WarpUserChar(Arena2vs2.Team2(2), 1, 51, 50, False)
                    UserList(Arena2vs2.Team2(1)).flags.EnEvento = 0
                    UserList(Arena2vs2.Team2(2)).flags.EnEvento = 0
                   
                    Arena2vs2.Team2(1) = 0
                    Arena2vs2.Team2(2) = 0
                End If
            End If
        End If
    End With
End Sub

Public Sub EntrarDeath(ByVal UserIndex As Integer)
    With UserList(UserIndex)
   
        If ArenaDeath.Usuarios = ArenaDeath.MaxUsers Then
            Call WriteConsoleMsg(UserIndex, "No hay más lugar en la arena", FontTypeNames.FONTTYPE_INFO)
            Exit Sub
        End If
       
        Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Deathmatch» El personaje " & .name & " ha ingresado a la arena.", FontTypeNames.FONTTYPE_GUILD))
        Call WarpUserChar(UserIndex, ArenaDeath.mapa.Map, ArenaDeath.mapa.X, ArenaDeath.mapa.Y, False)
        .flags.EnEvento = eEventos.Death
        ArenaDeath.Usuarios = ArenaDeath.Usuarios + 1
    End With
End Sub

Public Sub SalirDeath(ByVal UserIndex As Integer)
    With UserList(UserIndex)
        Call SendData(SendTarget.ToAll, 0, PrepareMessageConsoleMsg("Deathmatch» El personaje " & .name & " ha salido de la arena.", FontTypeNames.FONTTYPE_GUILD))
        ArenaDeath.Usuarios = ArenaDeath.Usuarios - 1
        If ArenaDeath.Usuarios < 0 Then ArenaDeath.Usuarios = 0
        .flags.EnEvento = 0
    End With
End Sub

Algunas ayudas:

Código:
ElseIf Npclist(tempIndex).name = "1vs1" Then
                    If Distancia(.Pos, Npclist(tempIndex).Pos) > 5 Then
                        Call WriteConsoleMsg(UserIndex, "¡Tienes que acercarte más!", FontTypeNames.FONTTYPE_INFO)
                        Exit Sub
                    End If
                   
                    Call EntrarArena(UserIndex)
                    'Call WriteEnviarRankingUsers(UserIndex)
                ElseIf Npclist(tempIndex).name = "Ranking" Then
                    If Distancia(.Pos, Npclist(tempIndex).Pos) > 5 Then
                        Call WriteConsoleMsg(UserIndex, "¡Tienes que acercarte más!", FontTypeNames.FONTTYPE_INFO)
                        Exit Sub
                    End If
                   
                    Call WriteEnviarRankingUsers(UserIndex)
                   
                ElseIf Npclist(tempIndex).name = "2vs2" Then
                    If Distancia(.Pos, Npclist(tempIndex).Pos) > 5 Then
                        Call WriteConsoleMsg(UserIndex, "¡Tienes que acercarte más!", FontTypeNames.FONTTYPE_INFO)
                        Exit Sub
                    End If
                   
                    Call EntrarArena2vs2(UserIndex)
                   
                ElseIf Npclist(tempIndex).name = "Death" Then
                    If Distancia(.Pos, Npclist(tempIndex).Pos) > 5 Then
                        Call WriteConsoleMsg(UserIndex, "¡Tienes que acercarte más!", FontTypeNames.FONTTYPE_INFO)
                        Exit Sub
                    End If
                   
                    Call EntrarDeath(UserIndex)
                End If
Al final del userdie
Código:
If .flags.EnEvento > 0 Then
            If Arena1vs1.UserIndex1 = UserIndex Then
                Call SalirArena(UserIndex, Arena1vs1.UserIndex2)
               
                'Call WarpUserChar(Arena1vs1.UserIndex1, 1, 50, 50, False)
                '.flags.EnEvento = 0
            ElseIf Arena1vs1.UserIndex2 = UserIndex Then
                Call SalirArena(UserIndex, Arena1vs1.UserIndex1)
               
                'Call WarpUserChar(Arena1vs1.UserIndex2, 1, 50, 50, False)
                '.flags.EnEvento = 0
            End If
           
            If .flags.EnEvento = eEventos.DOSVSDOS Then
                'ES TEAM 1
                If Arena2vs2.Team1(1) = UserIndex Or Arena2vs2.Team1(2) = UserIndex Then
                    Call SalirArena2vs2(UserIndex, Arena2vs2.Team2(1))
                Else ' ES TEAM 2
                    Call SalirArena2vs2(UserIndex, Arena2vs2.Team1(1))
                End If
            End If
           
            If .flags.EnEvento = eEventos.Death Then
                Call WarpUserChar(UserIndex, 1, 50, 50, True)
                .flags.EnEvento = 0
            End If
        End If

Cuando deslogiamos

Código:
If Arena1vs1.UserIndex1 = UserIndex Or Arena1vs1.UserIndex2 = UserIndex Then Call SalirArena(UserIndex)
If Arena2vs2.Team1(1) = UserIndex Or Arena2vs2.Team1(2) = UserIndex Or Arena2vs2.Team2(1) = UserIndex Or Arena2vs2.Team2(2) = UserIndex Then Call SalirArena2vs2(UserIndex)
 

Bramhh

Fundador EvolutionAo
Shak perdona que te moleste pero , el código que realizas es del servidor o del cliente?

En que modulo hago el código ese? Soy nuevo , manejo lenguajes pero quiero adaptarme a vb6
 

Cristianhk

Newbie Lvl 1
Excelente aporte, Shak, me podrás mandar un mensaje privado, asi te puedo contactar, para sacarme unas pequeñas dudas y preguntarte un presupuesto!
 

SergioCapo01

Newbie Lvl 1
Que tendria que crear un modulo y pegar todo lo primero y despues ponerlo en userdie? no entiendo como funciona para que te lleve desde el NPC
 

Shak

Evolution
Miembro del equipo
Developer
Especialista de Argentum
Que tendria que crear un modulo y pegar todo lo primero y despues ponerlo en userdie? no entiendo como funciona para que te lleve desde el NPC
Claro y despues en el sub accion pones la ayuda que deje, fijate bien leelo un poco y comprendelo donde ponerlo si no vas a buguear todo

Lo demas lo deje explicito, cuando deslogeamos, cuando morimos..
 
Arriba