Jump to content

[Aporte] Maleteros con slots v.1.0 (v.2.0 disponible)


Recommended Posts

ZIcuHhX.png

Estaba algo aburrido así que decidí hacer este script para aquellos que quieran usarlo. Se puede usar en bastantes modos de juego así que aquí lo comparto. Este script cuenta con varios comandos y función para guardar los datos en MySQL o cualquier otro método, usando toJSON y para la lectura fromJSON. Se trata de un sistema de maleteros el cual permite guardar armas y poder asignar a cada vehículo un número de slots disponibles distinto (esto se tendrá que hacer manualmente), modificando la siguiente línea:

local getSlotsDisponibles = { ["Sultan"] = 5, ["Freeway"] = 2, ["BF-400"] = 4 } -- Asignamos los slots para cada vehíclo. Esto ya es manual 

Básicamente sería añadir el vehículo en la tabla tal que así (sin olvidar las comas, claro):

["Nombre_Del_Vehiculo"] = slots 

Cuenta con varios comandos los cuales nos servirán para guardar, para retirar, para abrir/cerrar o para mirar el contenido del maletero. Todo esto con sus respectivas funciones para que se puedan modificar:

  • /maletero abrir Con este comando abrimos o cerramos el maletero del vehículo, dependiendo del estado del mismo (si está abierto se cerrará, en caso contrario, se abrirá).
  • /maletero mirar Con este comando nos saldrán en el chat los slots del vehículo así también el contenido de los mismos: el arma, la munición o en caso de que no tenga nada, Nada.
  • /maletero guardar slot Teniendo el maletero del vehículo abierto, usando este comando y con un arma en la mano, guardaremos la misma en el slot asignado (obviamente el slot debe ser menor o igual a los slots disponibles y estar vacío).
  • /maletero sacar slot Con este comando sacaremos el contenido que hay en el slot que hemos elegido. Nos dará el arma en la mano en caso de que haya una guardada, en caso contrario, nos dirá que el slot está vacío.

Código gratuito .lua, lado servidor

local maleteros = { } -- Tabla necesaria de almacenamiento de datos 
local getSlotsDisponibles = { ["Sultan"] = 5, ["Freeway"] = 2, ["BF-400"] = 4 } -- Asignamos los slots para cada vehículo. Esto ya es manual 
  
function getDatosMaletero( vehicle ) -- Función para utilizar en el guardado de los maleteros, se puede usar en MySql, SQLite... 
    local data = maleteros[ vehicle ] 
    if data then 
        local data_guardar = toJSON( data ) 
        return data_guardar 
        -- Necesario saber que al cargar los datos de nuevo deberemos usar fromJSON 
    end 
end 
  
function mirarMaletero( player, vehicle ) 
    local is_maletero_abierto = getVehicleDoorOpenRatio( vehicle, 1 ) == 1 
    if is_maletero_abierto then 
        local data = maleteros[ vehicle ] 
        local slots = getSlotsDisponibles[ getVehicleNameFromModel( getElementModel( vehicle ) ) ] 
        if slots then       
            outputChatBox( "Maletero del "..getVehicleNameFromModel( getElementModel( vehicle ) )..": ", player, 255, 255, 0 ) 
            for i=1, slots do 
                local data_slot = maleteros[ vehicle ][ i ] 
                if data_slot then 
                    local data_slot_arma = data_slot.gun 
                    local data_slot_ammo = data_slot.ammo 
                    outputChatBox( "Slot #"..i..": Arma: "..getWeaponNameFromID( data_slot_arma ).." Munición: "..tonumber( data_slot_ammo )..".", player, 255, 255, 255 ) 
                else 
                    outputChatBox( "Slot #"..i..": Nada", player, 255, 255, 255 ) 
                end 
            end 
        else 
            outputChatBox( "El vehículo no tiene slots asignados", player, 255, 0, 0 ) 
        end  
    else 
        outputChatBox( "El maletero está cerrado. Usa /maletero abrir para abrirlo", player, 255, 145, 0 ) 
    end 
end 
  
function isMaleteroAbierto( vehicle ) 
    local estado = getVehicleDoorOpenRatio( vehicle, 1 ) 
    if estado == 1 then return true else return false end 
end 
  
addCommandHandler( "maletero", 
    function( player, commandName, hacer, slot ) 
        local hacer = tostring( hacer ) 
        local slot = tonumber( slot ) 
        local vehs = getElementsByType( 'vehicle' ) 
        local x, y, z = getElementPosition( player ) 
        local interior, dimension = getElementInterior( player ), getElementDimension( player ) 
        if hacer then 
            for i=1, #vehs do 
                local veh = vehs[i] 
                local x1, y1, z1 = getElementPosition( veh ) 
                local interiorv, dimensionv = getElementInterior( veh ), getElementDimension( veh ) 
                if maleteros[ veh ] == nil then maleteros[ veh ] = { } end -- Si no está asignado en la tabla, lo asignamos (el vehiculo) 
                if getDistanceBetweenPoints3D( x, y, z, x1, y1, z1 ) < 3 and interior == interiorv and dimension == dimensionv then 
                    if hacer == "abrir" then  
                        if not isMaleteroAbierto( veh ) then 
                            outputChatBox( "Has abierto el maletero del "..getVehicleNameFromModel( getElementModel( veh ) )..".", player, 0, 255, 0 ) 
                            setVehicleDoorOpenRatio( veh, 1, 1, 2500 ) 
                        else 
                            outputChatBox( "Has cerrado el maletero del "..getVehicleNameFromModel( getElementModel( veh ) )..".", player, 255, 0, 0 ) 
                            setVehicleDoorOpenRatio( veh, 1, 0, 2500 ) 
                        end 
                    end 
                    if hacer == "mirar" then mirarMaletero( player, veh ) end 
                    if hacer == "guardar" then 
                        if isMaleteroAbierto( veh ) then 
                            local slots = getSlotsDisponibles[ getVehicleNameFromModel( getElementModel( veh ) ) ] 
                            if slot then 
                                if slots then 
                                    if slot <= slots then 
                                        if maleteros[ veh ][ slot ] == nil then 
                                            local arma = getPedWeapon( player ) 
                                            local ammo = getPedTotalAmmo( player ) 
                                            if arma and tonumber( arma ) > 0 then 
                                                maleteros[ veh ][ slot ] = { gun = arma, ammo = ammo } 
                                                outputChatBox( "Datos de guardado:", player, 255, 255, 0 ) 
                                                outputChatBox( "• Slot: #"..slot, player, 255, 255, 255 ) 
                                                outputChatBox( "• Arma guardada: "..getWeaponNameFromID( tonumber( arma ) ), player, 255, 255, 255 ) 
                                                outputChatBox( "• Munición guardada: "..tonumber( ammo ), player, 255, 255, 255 ) 
                                                takeWeapon( player, arma ) 
                                            else 
                                                outputChatBox( "Debes tener un arma en tu mano para guardarla", player, 255, 0, 0 ) 
                                            end 
                                        else 
                                            local arma_slot, ammo_slot = maleteros[ veh ][ slot ].gun, maleteros[ veh ][ slot ].ammo 
                                            outputChatBox( "El slot ya está ocupado.", player, 255, 0, 0 ) 
                                            outputChatBox( "Datos del slot:", player, 255, 255, 0 ) 
                                            outputChatBox( "• Arma: "..getWeaponNameFromID( tonumber( arma_slot ) ), player, 255, 255, 255 ) 
                                            outputChatBox( "• Munición: "..tonumber( ammo_slot ), player, 255, 255, 255 ) 
                                        end 
                                    else 
                                        outputChatBox( "El vehículo solo tiene "..tonumber( slots ).." slots disponibles.", player, 255, 145, 0 ) 
                                    end 
                                else 
                                    outputChatBox( "El vehículo no tiene slots asignados", player, 255, 0, 0 ) 
                                end 
                            else 
                                outputChatBox( "Se usa /maletero guardar [slot]", player, 255, 145, 0 ) 
                            end 
                        else 
                            outputChatBox( "El maletero no está abierto, usa /maletero abrir", player, 255, 145, 0 ) 
                        end 
                    end 
                    if hacer == "sacar" then 
                        if isMaleteroAbierto( veh ) then 
                            local slots = getSlotsDisponibles[ getVehicleNameFromModel( getElementModel( veh ) ) ] 
                            if slots then 
                                if slot then 
                                    if slot <= slots then 
                                        if maleteros[ veh ][ slot ] == nil then 
                                            outputChatBox( "No hay nada guardado en el slot #"..tonumber( slot )..".", player, 255, 0, 0 ) 
                                        else 
                                            local arma = maleteros[ veh ][ slot ].gun 
                                            local ammo = maleteros[ veh ][ slot ].ammo 
                                            outputChatBox( "Datos de lo sacado:", player, 255, 255, 0 ) 
                                            outputChatBox( "• Arma sacada: "..getWeaponNameFromID( tonumber( arma ) ), player, 255, 255, 255 ) 
                                            outputChatBox( "• Munición sacada: "..tonumber( ammo ), player, 255, 255, 255 ) 
                                            giveWeapon( player, tonumber( arma ), tonumber( ammo ), true ) 
                                            maleteros[ veh ][ slot ] = nil 
                                        end 
                                    else     
                                        outputChatBox( "El vehículo solo tiene "..tonumber( slots ).." slots disponibles.", player, 255, 145, 0 ) 
                                    end 
                                else 
                                    outputChatBox( "Se usa /maletero sacar [slot]", player, 255, 145, 0 ) 
                                end 
                            else 
                                outputChatBox( "El vehículo no tiene slots asignados", player, 255, 0, 0 ) 
                            end 
                        else 
                            outputChatBox( "El maletero no está abierto, usa /maletero abrir", player, 255, 145, 0 ) 
                        end 
                    end 
                end 
            end 
        else 
            outputChatBox( "Syntax: /"..commandName.." [abrir/mirar/guardar/sacar]", player, 255, 255, 255 ) 
        end 
    end 
) 

Novedades

  • Agregada función isMaleteroAbierto para comprobar más fácilmente si el maletero está abierto o no y acortar el código base.
  • Editado todo el código.
  • Testeado en un servidor local. Funciona.

Edited by Guest
Link to comment

Gracias por las opiniones :D

Lo he pensado mejor y la verdad que un sistema de este estilo no lo veo en venta, debido a que no tiene un guardado fijo ya que, cada GM tiene su propio sistema de 'id's' de vehículos y guardado. He hecho un sistema de vehículos (creación, guardado) con guardado MySQL (usando el sistema de Paradise, editado para Freeroam y otras GM's que no sean Paradise) pero si eso significa cambiar todo un sistema de guardado de una GM, no se ve muy rentable para unos maleteros, por ello, haré el código público, que es de lo que se trata esto...

Link to comment

2D7Igc5.png

Novedades

  • Acortado todo el código del script para hacerlo más compacto y optimizado.
  • Añadido panel, para el cual, para acceder se usa /maletero [mirar]. Es un panel simple con una gridlist la cual añade los rows o filas dependiendo del número de slots que tenga el vehículo, así también le añade su contenido (arma, balas).
  • Retirados la mayoría de comandos como /maletero guardar [slot] y /maletero sacar [slot], sustituyéndolos por el panel, el cual cuenta con dos botones: Guardar y Sacar, que realizan la misma función que los comandos anteriores.

Server-side .lua

local maleteros = { } -- Tabla necesaria de almacenamiento de datos 
local getSlotsDisponibles = { ["Sultan"] = 5, ["Freeway"] = 2, ["BF-400"] = 4 } -- Asignamos los slots para cada vehículo. Esto ya es manual 
  
function getMaleteroData( vehicle ) -- Función para utilizar en el guardado de los maleteros, se puede usar en MySql, SQLite... 
    local data = maleteros[ vehicle ] 
    if data then 
        local data_guardar = toJSON( data ) 
        return data_guardar 
        -- Necesario saber que al cargar los datos de nuevo deberemos usar fromJSON 
    end 
end 
  
function mirarMaletero( player, vehicle ) 
    local is_maletero_abierto = getVehicleDoorOpenRatio( vehicle, 1 ) == 1 
    if is_maletero_abierto then 
        local data = maleteros[ vehicle ] 
        local slots = getSlotsDisponibles[ getVehicleNameFromModel( getElementModel( vehicle ) ) ] 
        if slots then       
            triggerClientEvent( player, "maleteros:ver", player, data, tonumber( slots ), vehicle ) 
        else 
            outputChatBox( "El vehículo no tiene slots asignados", player, 255, 0, 0 ) 
        end  
    else 
        outputChatBox( "El maletero está cerrado. Usa /maletero abrir para abrirlo", player, 255, 145, 0 ) 
    end 
end 
  
addEvent( "maleteros:guardar", true ) 
addEventHandler( "maleteros:guardar", getRootElement( ), 
    function( player, vehiculo, slot, arma, ammo ) 
        local arma = tonumber( arma ) 
        local ammo = tonumber( ammo ) 
        maleteros[ vehiculo ][ tonumber( slot ) ] = { gun = arma, ammo = ammo } 
        outputChatBox( "Has guardado un/a "..getWeaponNameFromID( arma ).." con "..ammo.." en el maletero.", player, 0, 255, 0 ) 
        takeWeapon( player, arma ) 
    end 
) 
  
addEvent( "maleteros:sacar", true ) 
addEventHandler( "maleteros:sacar", getRootElement( ), 
    function( player, vehicle, k, nombre_arma, ammo ) 
        local arma = getWeaponIDFromName( tostring( nombre_arma ) ) 
        local ammo = tonumber( ammo ) 
        local slot = tonumber( k ) 
        maleteros[ vehicle ][ slot ] = nil 
        outputChatBox( "Has sacado un/a "..tostring( nombre_arma ).." del maletero con "..ammo.." balas.", player, 0, 255, 0 ) 
        giveWeapon( player, arma, ammo, true ) 
    end 
) 
  
-- Useful 
  
function isMaleteroAbierto( vehicle ) 
    local estado = getVehicleDoorOpenRatio( vehicle, 1 ) 
    if estado == 1 then return true else return false end 
end 
  
-- 
  
addCommandHandler( "maletero", 
    function( player, commandName, hacer, slot ) 
        local hacer = tostring( hacer ) 
        local slot = tonumber( slot ) 
        local vehs = getElementsByType( 'vehicle' ) 
        local x, y, z = getElementPosition( player ) 
        local interior, dimension = getElementInterior( player ), getElementDimension( player ) 
        if hacer then 
            for i=1, #vehs do 
                local veh = vehs[i] 
                local x1, y1, z1 = getElementPosition( veh ) 
                local interiorv, dimensionv = getElementInterior( veh ), getElementDimension( veh ) 
                if maleteros[ veh ] == nil then maleteros[ veh ] = { } end -- Si no está asignado en la tabla, lo asignamos (el vehiculo) 
                if getDistanceBetweenPoints3D( x, y, z, x1, y1, z1 ) < 3 and interior == interiorv and dimension == dimensionv then 
                    if hacer == "abrir" then  
                        if not isMaleteroAbierto( veh ) then 
                            outputChatBox( "Has abierto el maletero del "..getVehicleNameFromModel( getElementModel( veh ) )..".", player, 0, 255, 0 ) 
                            setVehicleDoorOpenRatio( veh, 1, 1, 2500 ) 
                        else 
                            outputChatBox( "Has cerrado el maletero del "..getVehicleNameFromModel( getElementModel( veh ) )..".", player, 255, 0, 0 ) 
                            setVehicleDoorOpenRatio( veh, 1, 0, 2500 ) 
                        end 
                    end 
                    if hacer == "mirar" then mirarMaletero( player, veh ) end 
                end 
            end 
        else 
            outputChatBox( "Syntax: /"..commandName.." [abrir/mirar/guardar/sacar]", player, 255, 255, 255 ) 
        end 
    end 
) 

Client-side .lua

local sourceX, sourceY = 1366, 768 
local sx, sy = guiGetScreenSize( ) 
local vehiculo, slots_vehiculo 
  
function abrirMaletero ( ) 
    ventana_maletero = guiCreateWindow( (326/sourceX)*sx, (245/sourceY)*sy, (289/sourceX)*sx, (397/sourceY)*sy, "Maletero (#"..slots_vehiculo.." slots)", false) 
        guiWindowSetSizable(ventana_maletero, false) 
         
    lista_armas = guiCreateGridList( (10/sourceX)*sx, (27/sourceY)*sy, (269/sourceX)*sx, (322/sourceY)*sy, false, ventana_maletero) 
        guiGridListAddColumn(lista_armas, "Slot", 0.3) 
        guiGridListAddColumn(lista_armas, "Arma", 0.35) 
        guiGridListAddColumn(lista_armas, "Ammo", 0.3) 
        boton_sacar = guiCreateButton( (11/sourceX)*sx, (364/sourceY)*sy, (107/sourceX)*sx, (23/sourceY)*sy, "Sacar", false, ventana_maletero) 
        boton_cerrar = guiCreateButton( (221/sourceX)*sx, (365/sourceY)*sy, (54/sourceX)*sx, (22/sourceY)*sy, "Cerrar", false, ventana_maletero) 
        boton_guardar = guiCreateButton( (145/sourceX)*sx, (365/sourceY)*sy, (63/sourceX)*sx, (22/sourceY)*sy, "Guardar", false, ventana_maletero)     
      
    addEventHandler( "onClientGUIClick", boton_cerrar, cerrarPanel, false ) 
    addEventHandler( "onClientGUIClick", boton_sacar, checkClickeado, false ) 
    addEventHandler( "onClientGUIClick", boton_guardar, checkGuardado, false ) 
end 
  
function checkGuardado( ) 
    local arma = getPedWeapon( getLocalPlayer( ) ) 
    local ammo = getPedTotalAmmo( getLocalPlayer( ) ) 
    if arma and arma > 0 then 
        local selected = guiGridListGetSelectedItem( lista_armas ) 
        if selected then 
            if guiGridListGetItemText( lista_armas, selected, 2 ) == "" then 
                local k = guiGridListGetItemText( lista_armas, selected, 1 ) 
                cerrarPanel( ) 
                triggerServerEvent( "maleteros:guardar", getLocalPlayer( ), getLocalPlayer( ), vehiculo, k, arma, ammo ) 
            else 
                outputChatBox( "El slot ya está ocupado, elige uno vacío", 255, 145, 0 ) 
            end 
        else 
            outputChatBox( "Clickea sobre un slot de la lista vacío para guardar el arma", 255, 145, 0 ) 
        end 
    else 
        outputChatBox( "No tienes un arma en la mano.", 255, 0, 0 ) 
    end 
end 
  
function checkClickeado( ) 
    local selected = guiGridListGetSelectedItem( lista_armas ) 
    if selected then 
        local k = guiGridListGetItemText( lista_armas, selected, 1 ) 
        local arma_name = guiGridListGetItemText( lista_armas, selected, 2 ) 
        local ammo = guiGridListGetItemText( lista_armas, selected, 3 ) 
        if arma_name == "" then 
            outputChatBox( "No tienes nada guardado en ese slot", 255, 145, 0 ) 
        else 
            cerrarPanel( ) 
            triggerServerEvent( "maleteros:sacar", getLocalPlayer( ), getLocalPlayer( ), vehiculo, k, arma_name, ammo ) 
        end 
    else 
        outputChatBox( "Debes seleccionar un slot para sacar su contenido", 255, 145, 0 ) 
    end 
end 
  
function cerrarPanel (  ) 
    destroyElement( ventana_maletero ) 
    showCursor( false ) 
end 
  
addEvent( "maleteros:ver", true ) 
addEventHandler( "maleteros:ver", getRootElement( ), 
    function( data, slots, vehicle ) 
        if data and slots and vehicle then 
            vehiculo = vehicle 
            slots_vehiculo = tonumber( slots ) 
            if isElement( ventana_maletero ) then destroyElement( ventana_maletero ) abrirMaletero( ) else abrirMaletero( ) showCursor(true) end 
            for i=1, tonumber( slots ) do 
                local data_slot = data[i] 
                local row = guiGridListAddRow(lista_armas) 
                if data_slot then 
                    local arma = data_slot.gun 
                    local ammo = data_slot.ammo 
                    guiGridListSetItemText(lista_armas, row, 1, i, false, false) 
                    guiGridListSetItemText(lista_armas, row, 2, getWeaponNameFromID( arma ), false, false) 
                    guiGridListSetItemText(lista_armas, row, 3, tonumber( ammo ), false, false)              
                else 
                    guiGridListSetItemText(lista_armas, row, 1, i, false, false) 
                    guiGridListSetItemText(lista_armas, row, 2, "", false, false) 
                    guiGridListSetItemText(lista_armas, row, 3, "", false, false)                    
                end 
            end 
        end 
    end 
) 

Salu2.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...