[Aportes] Bloqueo de Slots Inv Disponibles (TSAO)

Mufarety

Oráculo Lvl 1
Bueno, me gustó el sistema de @Feer~ así que decidí hacer el mío a lo re villero y acá les va, para 11.5 DX8.

Aviso, van a tener que crear su propio grafico que se va a mostrar en reemplazo de el/los slot/s que se va/n a deshabilitar. Lo hacen de 32x32 (recomendado) y lo indexan con cualquier Grh, a futuro van a tener que reemplazar ese Grh por "XX" que se muestra en el último código.

Explicasión: De nuestro máximo de slots (36) el sistema va a bloquear una determinada cantidad de SLOTS del INVENTARIO que se desbloquearán según el STAT de nuestro personaje, ocasionando de esta forma que (de nuestra capacidad máxima de llevar objetos) solamente tendremos ciertos slots disponibles para usar.

SERVIDOR:
Buscamos el Case "/DESCANSAR", y debajo del Exit Sub colocamos:
Código:
Case "/DAMEBLOC"
            If UserList(UserIndex).Stats.SlotsLibresInv = 0 Then
                UserList(UserIndex).Stats.SlotsLibresInv = 1
                Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Opción 1 de bloqueo.(21 slots)" & FONTTYPE_INFO)
                Call EnvSlotsBloq(UserIndex)
                UpdateUserInv True, UserIndex, 0
            ElseIf UserList(UserIndex).Stats.SlotsLibresInv = 1 Then
                UserList(UserIndex).Stats.SlotsLibresInv = 2
                Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Opción 2 de bloqueo.(24 slots)" & FONTTYPE_INFO)
                Call EnvSlotsBloq(UserIndex)
                UpdateUserInv True, UserIndex, 0
            ElseIf UserList(UserIndex).Stats.SlotsLibresInv = 2 Then
                UserList(UserIndex).Stats.SlotsLibresInv = 3
                Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Opción 3 de bloqueo.(27 slots)" & FONTTYPE_INFO)
                Call EnvSlotsBloq(UserIndex)
                UpdateUserInv True, UserIndex, 0
            ElseIf UserList(UserIndex).Stats.SlotsLibresInv = 3 Then
                UserList(UserIndex).Stats.SlotsLibresInv = 4
                Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Opción 4 de bloqueo.(30 slots)" & FONTTYPE_INFO)
                Call EnvSlotsBloq(UserIndex)
                UpdateUserInv True, UserIndex, 0
            ElseIf UserList(UserIndex).Stats.SlotsLibresInv = 4 Then
                UserList(UserIndex).Stats.SlotsLibresInv = 5
                Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Opción 5 de bloqueo.(33 slots)" & FONTTYPE_INFO)
                Call EnvSlotsBloq(UserIndex)
                UpdateUserInv True, UserIndex, 0
            ElseIf UserList(UserIndex).Stats.SlotsLibresInv = 5 Then
                UserList(UserIndex).Stats.SlotsLibresInv = 6
                Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Opción 6 de bloqueo.(Totales slots)" & FONTTYPE_INFO)
                Call EnvSlotsBloq(UserIndex)
                UpdateUserInv True, UserIndex, 0
            ElseIf UserList(UserIndex).Stats.SlotsLibresInv = 6 Then
                UserList(UserIndex).Stats.SlotsLibresInv = 0
                Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Opción 0 de bloqueo.(18 slots)" & FONTTYPE_INFO)
                Call EnvSlotsBloq(UserIndex)
                UpdateUserInv True, UserIndex, 0
            End If
        Exit Sub

Buscamos Public Type UserStats, y debajo ponemos:
Código:
SlotsLibresInv As Long

Buscamos:
Código:
UserList(UserIndex).Stats.Banco = CLng(UserFile.GetValue("STATS", "BANCO"))

Código:
UserList(UserIndex).Stats.SlotsLibresInv = CLng(UserFile.GetValue("STATS", "SlotsLibresInv"))

Buscamos:
Código:
Call WriteVar(UserFile, "STATS", "SlotsLibresInv", CStr(UserList(UserIndex).Stats.SlotsLibresInv))

Código:
Call WriteVar(UserFile, "STATS", "SlotsLibresInv", CStr(UserList(UserIndex).Stats.SlotsLibresInv))

Ahora en el modulo UsUaRiOs, sobre Sub SendUserStatsBox:
Código:
Sub EnvSlotsBloq(ByVal UserIndex As Integer)
Call SendData(SendTarget.ToIndex, UserIndex, 0, "XXXXX" & Userlist(Userindex).stats.SlotsLibresInv)
End Sub

Now, en el Modulo InvUsuario, en el Sub GetObj, debajo:
Código:
MiObj.ObjIndex = MapData(UserList(UserIndex).Pos.Map, x, y).OBJInfo.ObjIndex

Código:
If UserList(UserIndex).Stats.SlotsLibresInv = 0 And UserList(UserIndex).Invent.NroItems >= 18 Then
            Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Solo puedes cargár hasta 18 ítems por el momento." & FONTTYPE_INFO)
            Exit Sub
        End If
        If UserList(UserIndex).Stats.SlotsLibresInv = 1 And UserList(UserIndex).Invent.NroItems >= 21 Then
            Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Solo puedes cargár hasta 21 ítems por el momento." & FONTTYPE_INFO)
            Exit Sub
        End If
        If UserList(UserIndex).Stats.SlotsLibresInv = 2 And UserList(UserIndex).Invent.NroItems >= 24 Then
            Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Solo puedes cargár hasta 24 ítems por el momento." & FONTTYPE_INFO)
            Exit Sub
        End If
        If UserList(UserIndex).Stats.SlotsLibresInv = 3 And UserList(UserIndex).Invent.NroItems >= 27 Then
            Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Solo puedes cargár hasta 27 ítems por el momento." & FONTTYPE_INFO)
            Exit Sub
        End If
        If UserList(UserIndex).Stats.SlotsLibresInv = 4 And UserList(UserIndex).Invent.NroItems >= 30 Then
            Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Solo puedes cargár hasta 30 ítems por el momento." & FONTTYPE_INFO)
            Exit Sub
        End If
        If UserList(UserIndex).Stats.SlotsLibresInv = 5 And UserList(UserIndex).Invent.NroItems >= 33 Then
            Call SendData(SendTarget.ToIndex, UserIndex, 0, "||Solo puedes cargár hasta 33 ítems por el momento." & FONTTYPE_INFO)
            Exit Sub
            'ElseIf UserList(UserIndex).Stats.SlotsLibresInv = 4 Then
            'Call SendData(SendTarget.ToIndex, UserIndex, 0, "||No puedo cargar mas objetos." & FONTTYPE_INFO)
        End If

En el Sub ConnectUser, colocan:
Código:
Call EnvSlotsBloq(UserIndex)

CLIENTE:
Ahora, en las declaraciones agregan:
Código:
Public UserBloqueaSlot As Long

Debajo de:
Código:
Select Case Left$(sData, 5)

Código:
Case "XXXXX"        ' >>>>> Bloqueo de Slot 1
            Rdata = Right$(Rdata, Len(Rdata) - 5)
            UserBloqueaSlot = Rdata
            Exit Sub

Después en el Sub SetItem, del Modulo de Clase donde dibuja el inventario (el mío se llama GrafInv, no se como se llama el original) buscan esta linea y la borran:
.grhindex = eGrhIndex

En el mismo modulo, sobre el With UserInventory(slot):
Código:
If UserBloqueaSlot = 0 Then
        UserInventory(slot).grhindex = eGrhIndex
        UserInventory(19).grhindex = XX
        UserInventory(20).grhindex = XX
        UserInventory(21).grhindex = XX
        UserInventory(22).grhindex = XX
        UserInventory(23).grhindex = XX
        UserInventory(24).grhindex = XX
        UserInventory(25).grhindex = XX
        UserInventory(26).grhindex = XX
        UserInventory(27).grhindex = XX
        UserInventory(28).grhindex = XX
        UserInventory(29).grhindex = XX
        UserInventory(30).grhindex = XX
        UserInventory(31).grhindex = XX
        UserInventory(32).grhindex = XX
        UserInventory(33).grhindex = XX
        UserInventory(34).grhindex = XX
        UserInventory(35).grhindex = XX
        UserInventory(36).grhindex = XX
    ElseIf UserBloqueaSlot = 1 Then
        UserInventory(slot).grhindex = eGrhIndex
        UserInventory(22).grhindex = XX
        UserInventory(23).grhindex = XX
        UserInventory(24).grhindex = XX
        UserInventory(25).grhindex = XX
        UserInventory(26).grhindex = XX
        UserInventory(27).grhindex = XX
        UserInventory(28).grhindex = XX
        UserInventory(29).grhindex = XX
        UserInventory(30).grhindex = XX
        UserInventory(31).grhindex = XX
        UserInventory(32).grhindex = XX
        UserInventory(33).grhindex = XX
        UserInventory(34).grhindex = XX
        UserInventory(35).grhindex = XX
        UserInventory(36).grhindex = XX
    ElseIf UserBloqueaSlot = 2 Then
        UserInventory(slot).grhindex = eGrhIndex
        UserInventory(25).grhindex = XX
        UserInventory(26).grhindex = XX
        UserInventory(27).grhindex = XX
        UserInventory(28).grhindex = XX
        UserInventory(29).grhindex = XX
        UserInventory(30).grhindex = XX
        UserInventory(31).grhindex = XX
        UserInventory(32).grhindex = XX
        UserInventory(33).grhindex = XX
        UserInventory(34).grhindex = XX
        UserInventory(35).grhindex = XX
        UserInventory(36).grhindex = XX
    ElseIf UserBloqueaSlot = 3 Then
        UserInventory(slot).grhindex = eGrhIndex
        UserInventory(28).grhindex = XX
        UserInventory(29).grhindex = XX
        UserInventory(30).grhindex = XX
        UserInventory(31).grhindex = XX
        UserInventory(32).grhindex = XX
        UserInventory(33).grhindex = XX
        UserInventory(34).grhindex = XX
        UserInventory(35).grhindex = XX
        UserInventory(36).grhindex = XX
    ElseIf UserBloqueaSlot = 4 Then
        UserInventory(slot).grhindex = eGrhIndex
        UserInventory(31).grhindex = XX
        UserInventory(32).grhindex = XX
        UserInventory(33).grhindex = XX
        UserInventory(34).grhindex = XX
        UserInventory(35).grhindex = XX
        UserInventory(36).grhindex = XX
    ElseIf UserBloqueaSlot = 5 Then
        UserInventory(slot).grhindex = eGrhIndex
        UserInventory(34).grhindex = XX
        UserInventory(35).grhindex = XX
        UserInventory(36).grhindex = XX
    Else
        UserInventory(slot).grhindex = eGrhIndex
    End If

Lo de arriba está hecho a lo más negro posible porque son las 3:40 y tengo un re sueño así que mañana lo arreglaré (no posiblemente para el post)

Bueno eso es todo, como dije está hecho lo más negro posible y aúnque todos sabemos que 11.5 ya está obsoleto (No rompas Mique ¬¬), todavía me gusta y el que quiera ponerlo para 13.0 es libre de hacerlo (obviamente).

BUG: Al graficar el index mostrará en el slot "0", por la cantidad del grafico, ya que si no hay grafico, no se muestra la cantidad.
 

Feer~

Oráculo Lvl 3
Colaborador
Justo anoche leí el mensaje que me habias mandado jajaja

Lo lei por arriba, pero me parece demasiado rebuscado lo que hiciste. Yo lo unico que hice fue poner una variable InventorySlots que al crear el personaje se seteaba en 21, y luego cambie los parámetros de las iteraciones que 'revisan' la cantidad de slots libres (for i = 1 to max_inventory_slots) por for i = 1 to userlist(userindex).inventoryslots

Después simplemente sumaba esa variable en uno por cada slot a desbloquear.
Al momento de logear el personaje o al momento de desbloquear un slot, envias un paquete al cliente con la cantidad de slots que el personaje tiene, y limitas el renderizado del inventario a dicha cantidad mediante una variable.

No se si me explico.
Igual esta bueno que aporten algo ya hace tiempo que esta sección está muerta..

Saludos.
 

Mufarety

Oráculo Lvl 1
Justo anoche leí el mensaje que me habias mandado jajaja

Lo lei por arriba, pero me parece demasiado rebuscado lo que hiciste. Yo lo unico que hice fue poner una variable InventorySlots que al crear el personaje se seteaba en 21, y luego cambie los parámetros de las iteraciones que 'revisan' la cantidad de slots libres (for i = 1 to max_inventory_slots) por for i = 1 to userlist(userindex).inventoryslots

Después simplemente sumaba esa variable en uno por cada slot a desbloquear.
Al momento de logear el personaje o al momento de desbloquear un slot, envias un paquete al cliente con la cantidad de slots que el personaje tiene, y limitas el renderizado del inventario a dicha cantidad mediante una variable.

No se si me explico.
Igual esta bueno que aporten algo ya hace tiempo que esta sección está muerta..

Saludos.

Si, te entiendo totalmente, de esa forma se envían paquetes chicos y simples. Sin lineas extras al cuete.
 

Feer~

Oráculo Lvl 3
Colaborador
Si, te entiendo totalmente, de esa forma se envían paquetes chicos y simples. Sin lineas extras al cuete.

El paquete es igual, lo que veo son muchos condicionales a la hora de desbloquear un slot o dibujar el inventario, eso se puede acortar bastante.
También la parte del "GetObj", y por lo q veo te faltan controles:

En el usercompraobj, en el retirar de la boveda, en el meteritemeninventario.. por eso es preferible hacer una variable InventorySlots e ir utilizandola en todos los lugares en los que se verifica el espacio en el inventario.

ejemplo:

Código:
Function MeterItemEnInventario(ByVal Userindex As Integer, ByRef MiObj As Obj) As Boolean
On Error GoTo Errhandler

'Call LogTarea("MeterItemEnInventario")

Dim X As Integer
Dim Y As Integer
Dim Slot As Byte

'¿el user ya tiene un objeto del mismo tipo?
Slot = 1
Do Until UserList(Userindex).Invent.Object(Slot).ObjIndex = MiObj.ObjIndex And _
         UserList(Userindex).Invent.Object(Slot).Amount + MiObj.Amount <= MAX_INVENTORY_OBJS
   Slot = Slot + 1
   If Slot > UserList(Userindex).InventorySlots Then
         Exit Do
   End If
Loop
   
'Sino busca un slot vacio
If Slot > UserList(Userindex).InventorySlots Then
   Slot = 1
   Do Until UserList(Userindex).Invent.Object(Slot).ObjIndex = 0
       Slot = Slot + 1
       If Slot > UserList(Userindex).InventorySlots Then
           Call SendData(SendTarget.toindex, Userindex, 0, "||108")
           MeterItemEnInventario = False
           Exit Function
       End If
   Loop
   UserList(Userindex).Invent.NroItems = UserList(Userindex).Invent.NroItems + 1
End If
   
'Mete el objeto
If UserList(Userindex).Invent.Object(Slot).Amount + MiObj.Amount <= MAX_INVENTORY_OBJS Then
   'Menor que MAX_INV_OBJS
   UserList(Userindex).Invent.Object(Slot).ObjIndex = MiObj.ObjIndex
   UserList(Userindex).Invent.Object(Slot).Amount = UserList(Userindex).Invent.Object(Slot).Amount + MiObj.Amount
Else
   UserList(Userindex).Invent.Object(Slot).Amount = MAX_INVENTORY_OBJS
End If
   
MeterItemEnInventario = True
       
Call UpdateUserInv(False, Userindex, Slot)


Exit Function
Errhandler:

End Function
 

Lucho~

Usuario Bendecido
Mas aya de si la forma está bien, lo podrías acortar bastante al codigo hdp ajja

ej:

Código:
    Select Case userbloqueaslot
   
        Case 0
        UserInventory(slot).Grhindex = eGrhIndex
            For i = 19 To 36
                UserInventory(i).Grhindex = XX
            Next i
       
        Case 1
        UserInventory(slot).Grhindex = eGrhIndex
            For i = 22 To 36
                UserInventory(i).Grhindex = XX
            Next i
             
        Case 2
        UserInventory(slot).Grhindex = eGrhIndex
            For i = 25 To 36
                UserInventory(i).Grhindex = XX
            Next i
           
        Case 3
        UserInventory(slot).Grhindex = eGrhIndex
            For i = 28 To 36
                UserInventory(i).Grhindex = XX
            Next i
           
        Case 4
        UserInventory(slot).Grhindex = eGrhIndex
            For i = 31 To 36
                UserInventory(i).Grhindex = XX
            Next i
       
        Case 5
        UserInventory(slot).Grhindex = eGrhIndex
            For i = 34 To 36
                UserInventory(i).Grhindex = XX
            Next i
       
        Case Else
        UserInventory(slot).Grhindex = eGrhIndex
    End Select

Muy lindo post, no comparto que la version 11.5 es obsoleta.
 
Arriba