aka Blue Posted August 22, 2016 Share Posted August 22, 2016 (edited) 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 August 27, 2016 by Guest Link to comment
aka Blue Posted August 22, 2016 Author Share Posted August 22, 2016 Código editado y mejorado Link to comment
aka Blue Posted August 23, 2016 Author Share Posted August 23, 2016 (edited) Versión 2.0 Video-demostración Edited August 23, 2016 by Guest Link to comment
Enargy, Posted August 23, 2016 Share Posted August 23, 2016 Colocas unos nombres horribles a las funciones Que tengas suerte vendiendolos Link to comment
Alexs Posted August 23, 2016 Share Posted August 23, 2016 Me parece excelente que al fin existan verdaderos aportes en esta sección, más aún cuando estos son recursos tan buenos como éste. Gracias por el aporte. Link to comment
aka Blue Posted August 23, 2016 Author Share Posted August 23, 2016 Gracias por las opiniones 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
aka Blue Posted August 23, 2016 Author Share Posted August 23, 2016 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
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now