[Aporte] Facción Neutral, comandos /CRIMINAL, /CIUDADANO y /RENUNCIAR

Abalor

Newbie Lvl 1
Hola gente de GS, este es mi primer aporte. Sin mucha experiencia en programación este "sistemita" me llevo unos dos días hasta que pude lograr todo lo que quería y no quería que hiciera. Cualquier optimización es bienvenida.

Mi base salió de este thread de maTih.-, con unos retoques míos también porque obviamente es una base y tenía algún que otro bug. Alineacion Neutral by maTih.-

El resto lo fui aplicando con un poco de lógica y leyendo otros códigos para entenderlo mejor. Espero que les sirva.


SERVIDOR

Vamos a empezar agregando la alineación NEUTRAL, buscamos lo siguiente en el sub ConnectNewUser:

Código:
    .Reputacion.PlebeRep = 30         'el valor 30 puede variar dependiendo de como tengan el codigo de su AO
y abajo agregamos:

Código:
 .Reputacion.Neutral = 1      
'Con esto vamos a hacer que todos los personajes se creen Neutrales

Después vamos al ModFacciones y al final agregamos:

Código:
  'Esta es la funcion que usamos para poder leer la variable "Neutral"
Public Function isNeutral(ByVal UserIndex As Integer) As Byte      
    isNeutral = UserList(UserIndex).Reputacion.Neutral
End Function

Buscamos:
Código:
  NickColor = GetNickColor(UserIndex)
Abajo ponemos:
Código:
                If isNeutral(UserIndex) = 1 Then NickColor = 8      
 'el valor lo pueden cambiar por un numero de color asignado por ustedes en el archivo "colores.dat" del cliente

Después buscamos:
Código:
         .Promedio = val(UserFile.GetValue("REP", "Promedio"))
Abajo:
Código:
         .Neutral = val(UserFile.GetValue("REP", "Neutral"))    
'Esto hace que se escriba la reputacion en el charfile del usuario

Abajo de:
Código:
     Call WriteVar(UserFile, "REP", "Promedio", CStr(L))
Ponemos:
Código:
    Call WriteVar(UserFile, "REP", "Neutral", CStr(.Reputacion.Neutral))

Ahora vamos al Sub LookAtTile y buscamos lo siguiente:
Código:
                                        If criminal(TempCharIndex) Then
                                            Stat = Stat & "<CRIMINAL>"
                                            ft = FontTypeNames.FONTTYPE_FIGHT
                                        Else
                                            Stat = Stat & "<CIUDADANO>"
                                            ft = FontTypeNames.FONTTYPE_CITIZEN
                                        End If
Y lo reemplazamos por este If:
Código:
                                    If .Reputacion.Neutral = 0 Then
                                        If criminal(TempCharIndex) Then
                                            Stat = Stat & "<CRIMINAL>"
                                            ft = FontTypeNames.FONTTYPE_FIGHT
                                        Else
                                            Stat = Stat & "<CIUDADANO>"
                                            ft = FontTypeNames.FONTTYPE_CITIZEN
                                        End If
                                    Else
                                        Stat = Stat & "<NEUTRAL>"
                                            ft = FontTypeNames.FONTTYPE_EJECUCION
                                    End If         
'Esto hace que en consola nos diga "<NEUTRAL> si asi lo fuera"

Vamos a la Funcion PuedeAtacar y buscamos:
Código:
    Select Case TriggerZonaPelea(AttackerIndex, VictimIndex)
Y abajo del End Select ponemos:
Código:
        If isNeutral(AttackerIndex) = 1 And MapInfo(UserList(AttackerIndex).Pos.Map).Pk = True Then PuedeAtacar = True: Exit Function


CLIENTE

Buscamos:
Código:
 Public Type Char
Y abajo declaramos la siguiente variable:
Código:
    Neutral As Byte

Buscamos en los Sub "HandleCharacterCreate" y "HandleUpgradeTagAndStatus":
Código:
            If (NickColor And eNickColor.ieCriminal) <> 0 Then
Y arriba ponemos:
Código:
        'Le damos valor a la variable .Neutral o no según corresponda
        If NickColor = 8 Then
            .Neutral = 1
        Else
            .Neutral = 0
        End If

Buscamos en el Sub CharRender:
Código:
                                If .priv = 0 Then
                                    If .Atacable Then
                                        color = RGB(ColoresPJ(48).r, ColoresPJ(48).g, ColoresPJ(48).b)
                                    Else
                                        If .Criminal Then
                                            color = RGB(ColoresPJ(50).r, ColoresPJ(50).g, ColoresPJ(50).b)
                                        Else
                                            color = RGB(ColoresPJ(49).r, ColoresPJ(49).g, ColoresPJ(49).b)
                                        End If
                                    End If
                                Else
                                    color = RGB(ColoresPJ(.priv).r, ColoresPJ(.priv).g, ColoresPJ(.priv).b)
                                End If
Y abajo ponemos:
Código:
                                'Nick de color gris para neutral
                                If .Neutral = 1 Then
                                    color = RGB(190, 192, 190)
                                End If

Con esto ya tendriamos la alineacion "Neutral" funcionando, ahora vamos con /CIUDADANO, /CRIMINAL y /RENUNCIAR


SERVIDOR

Buscamos:
Código:
 Private Enum ClientPacketID
Y justo abajo ponemos:
Código:
               ChangeStatus          '/CRIMINAL O /CIUDADANO
               Renuncia                 '/RENUNCIAR

Ahora en el modulo Protocol.bas agregamos las siguientes funciones:
Código:
Public Sub ChangeStats(ByVal UserIndex As Integer)
    With UserList(UserIndex)
        Call .incomingData.ReadByte
         
        Dim decide As Byte
        decide = .incomingData.ReadByte
         
        'Si es GM no tiene facción
        If EsGM(UserIndex) Then
            WriteConsoleMsg UserIndex, "Tu rango no necesita una facción", FontTypeNames.FONTTYPE_GUILD
            Exit Sub
        End If
         
        'Si no es neutral no puede
        If .Reputacion.Neutral = 0 Then
            WriteConsoleMsg UserIndex, "Solo puedes usar este comando siendo neutral", FontTypeNames.FONTTYPE_GUILD
            Exit Sub
        End If
        

        If decide = 1 Then
        
                'Si ya habia renunciado no puede
            If .Reputacion.Renuncio = 1 Then
                WriteConsoleMsg UserIndex, "Renunciaste una vez, ya no puedes ser un ciudadano.", FontTypeNames.FONTTYPE_GUILD
                Exit Sub
            Else                                                  'Si cumple con los requisitos, entonces
                .Reputacion.Neutral = 0
                VolverCiudadano UserIndex
                WriteConsoleMsg UserIndex, "Te has vuelto un ciudadano!", FontTypeNames.FONTTYPE_GUILD
                RefreshCharStatus UserIndex
                Call WarpUserChar(UserIndex, 1, 50, 50, True)     'Pueden cambiar las coordenadas por el mapa que gusten
            End If
        ElseIf decide = 2 Then
                'Si ya habia renunciado no puede
            If .Reputacion.Renuncio = 1 Then
                WriteConsoleMsg UserIndex, "Renunciaste una vez, ya no puedes ser un criminal.", FontTypeNames.FONTTYPE_GUILD
                Exit Sub
            Else                                  'Si cumple con los requisitos entonces
            .Reputacion.Neutral = 0
            VolverCriminal UserIndex
            WriteConsoleMsg UserIndex, "Te has vuelto un criminal!", FontTypeNames.FONTTYPE_GUILD
            RefreshCharStatus UserIndex
            Call WarpUserChar(UserIndex, 1, 50, 50, True)    'Pueden cambiar las coordenadas por el mapa que gusten
            End If
        End If
     
    End With
End Sub
Public Sub Renunciar(ByVal usuario As Integer)
    With UserList(usuario)
        Call .incomingData.ReadByte
        
        Dim ren As Byte
        ren = .incomingData.ReadByte
        
        'Si es gm no puede renunciar
        If EsGM(usuario) Then
            WriteConsoleMsg usuario, "Tu rango no tiene una facción definida", FontTypeNames.FONTTYPE_GUILD
            Exit Sub
        End If
        
        'No puede renunciar 2 veces
        If .Reputacion.Renuncio = 1 Then
            WriteConsoleMsg usuario, "Ya habias renunciado una vez.", FontTypeNames.FONTTYPE_GUILD
            Exit Sub
        End If
        
        'Si no tiene faccion no puede renunciar
        If .Reputacion.Neutral = 1 Then
            WriteConsoleMsg usuario, "Todavia no has elegido una facción. Utiliza /CRIMINAL o /CIUDADANO para elegir tu facción", FontTypeNames.FONTTYPE_GUILD
            Exit Sub
        End If
        
        'Cumple con los requisitos, entonces:
        If ren = 1 Then
            .Reputacion.Neutral = 1
            .Reputacion.Renuncio = 1
            WriteConsoleMsg usuario, "Has renunciado a tu facción.", FontTypeNames.FONTTYPE_GUILD
            RefreshCharStatus usuario
            Call WarpUserChar(usuario, 1, 50, 50, True)    'Pueden cambiar las coordenadas por el mapa que gusten
        End If
    End With
End Sub

Abajo de :
Código:
    Neutral As Byte
ponemos:
Código:
    Renuncio As Byte

Tambien abajo de
Código:
    .Reputacion.Neutral = 1
Ponemos
Código:
    .Reputacion.Renuncio = 0

Buscamos:
Código:
        .Neutral = val(UserFile.GetValue("REP", "Neutral"))
Y abajo ponemos
Código:
        .Renuncio = val(UserFile.GetValue("REP", "Renuncio"))

Ahora abajo de
Código:
    Call WriteVar(UserFile, "REP", "Neutral", CStr(.Reputacion.Neutral))
Ponemos
Código:
    Call WriteVar(UserFile, "REP", "Renuncio", CStr(.Reputacion.Renuncio))

Buscamos
Código:
        Case ClientPacketID.Consulation
            Call HandleConsulation(UserIndex)
y abajo ponemos
Código:
        Case ClientPacketID.ChangeStatus
            Call ChangeStats(UserIndex)

        Case ClientPacketID.Renuncia
            Call Renunciar(UserIndex)


CLIENTE

Buscamos
Código:
Private Enum ClientPacketID
Y justo abajo ponemos
Código:
    ChangeStatus          '/CRIMINAL O /CIUDADANO
    Renuncia                 '/RENUNCIAR

Vamos al mod Protocol.bas y abajo de todo agregamos
Código:
Public Sub ChangeStats(ByVal Deci As Byte)
    Call outgoingData.WriteByte(ClientPacketID.ChangeStatus)
    Call outgoingData.WriteByte(Deci)
End Sub
Public Sub Renunciar(ByVal Renu As Byte)
    Call outgoingData.WriteByte(ClientPacketID.Renuncia)
    Call outgoingData.WriteByte(Renu)
End Sub

Ahora buscamos
Código:
 Case "/RESUCITAR"
y arriba ponemos
Código:
            Case "/RENUNCIAR"
                Renunciar 1
                
            Case "/CRIMINAL"
                ChangeStats 2
 
            Case "/CIUDADANO"
                ChangeStats 1

Listo, ahi tenemos:
-Alineación Neutral
-Comando /CIUDADANO, /CRIMINAL, y /RENUNCIAR
-Cambio de color en el Nick al cambiar de facción
-Nos lleva a otro mapa cualquiera de las 3 opciones
-Cambia el Stat también en consola
-Si renunció no puede volver a ser ni criminal ni ciudadano
-Si es gm no tiene facción
-Si es neutral no puede renunciar
-Si es ciudadano no puede ser criminal y viceversa

Repito, espero que les sirva. Saludos :D
 

EmiDelPino

Newbie Lvl 1
Tengo un problema, cuando pones en el Servidor, abajo de Neutral as byte, no me lo encuentra, porque no lo declaramos en servidor siguiendo tus pasos no?, o esta fallado lo mio jaja.
Edit: Lo que hice fue hacer los mismos pasos que dijiste en el cliente, despues les digo si funciona. xD
Problema: "Error de compilacion: No se encontro el metodo o miembro de datos" y me marca la palabra Neutral de esta linea:
Código:
.Neutral = val(UserFile.GetValue("REP", "Neutral"))
Me pasa tanto con .Nuetral como con .Renuncio .
 
Última edición:

MAB

Lamb of God
Tengo un problema, cuando pones en el Servidor, abajo de Neutral as byte, no me lo encuentra, porque no lo declaramos en servidor siguiendo tus pasos no?, o esta fallado lo mio jaja.
Edit: Lo que hice fue hacer los mismos pasos que dijiste en el cliente, despues les digo si funciona. xD
Problema: "Error de compilacion: No se encontro el metodo o miembro de datos" y me marca la palabra Neutral de esta linea:
Código:
.Neutral = val(UserFile.GetValue("REP", "Neutral"))
Me pasa tanto con .Nuetral como con .Renuncio .
Fijate esa misma línea que citaste "REP", donde esta eso? en los charfiles, es la reputación... en algún lugar el servidor crea la reputación, ahí seguramente te falte declarar Neutral y Renuncio.
 

EmiDelPino

Newbie Lvl 1
Hice eso y funciono, gracias MAB.

EDIT: No estaría funcionando el cambio de color del Nick a Gris (lo solucione revisando el code original de matih). Aún así tengo el problema de que cuando hago me doy un rango (dios, semi dios, etc) no me cambia el Nick y queda gris.
 
Última edición:
  • Me gusta
Reacciones: MAB

Abalor

Newbie Lvl 1
Hice eso y funciono, gracias MAB.

EDIT: No estaría funcionando el cambio de color del Nick a Gris (lo solucione revisando el code original de matih). Aún así tengo el problema de que cuando hago me doy un rango (dios, semi dios, etc) no me cambia el Nick y queda gris.
Buenas, estuve sin conexion un tiempo y no estuve al tanto. Mete esto:
Código:
'Nick de color gris para neutral
                                If .Neutral = 1 Then
                                    color = RGB(190, 192, 190)
                                End If
justo abajo de:
Código:
                                    If .Atacable Then
                                        color = RGB(ColoresPJ(48).r, ColoresPJ(48).g, ColoresPJ(48).b)
                                    Else
                                        If .Criminal Then
                                            color = RGB(ColoresPJ(50).r, ColoresPJ(50).g, ColoresPJ(50).b)
                                        Else
                                            color = RGB(ColoresPJ(49).r, ColoresPJ(49).g, ColoresPJ(49).b)
                                        End If
                                    End If
asi te toma el color cuando el privilegio del usuario es 0.

No pude editar, si algun moderador lo ve me falto la parte de declaración de variables en el servidor.

Código:
Neutral As byte
Renuncio As byte
en el public type tReputacion, justo abajo de:
Código:
Promedio As Long
 
Última edición:
Arriba