Jump to content

aka Blue

Members
  • Posts

    2,106
  • Joined

  • Last visited

  • Days Won

    6

Everything posted by aka Blue

  1. Me he puesto a aportar sistemas de almacenamiento en el foro y estoy creando algo más 'innovador'. La duda que tengo es de como hacer que automáticamente detecte si hay un slot disponible (ya que uso objeto[obj][slot]) mediante un loop y automáticamente también, guarde el arma en ese slot. Tengo esto, obviamente está mal, guarda el arma en todos los slots. ¿Cómo podría arreglarlo? function boxClick( theButton, theState, player ) local caja = caja_objeto[ source ] if theButton == "right" and theState == "down" then if caja then local arma = getPedWeapon( player ) local ammo = getPedTotalAmmo( player ) if arma and tonumber( arma ) > 0 then for i=1, slots_disponibles do if contenido_caja[ caja ][ i ] == nil then contenido_caja[ caja ][ i ] = { arma = arma, ammo = ammo } takeWeapon( player, arma ) outputChatBox( "Has guardado un arma en la caja", player, 0, 255, 0 ) else outputChatBox( "Todos los slots están ocupados", player, 255, 0, 0 ) end end else outputChatBox( "Debes tener un arma en la mano para guardarla en la caja.", player, 255, 145, 0 ) end end end end Gracias de antemano
  2. Para la explosión: createExplosion
  3. Si es hamachi no debes abrir ningún port.
  4. 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.
  5. 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...
  6. Si es solo el nombre, puedes usar ésto: https://wiki.multitheftauto.com/wiki/Dx ... tOnElement Client-side function dxDrawTextOnElement(TheElement,text,height,distance,R,G,B,alpha,size,font,checkBuildings,checkVehicles,checkPeds,checkDummies,seeThroughStuff,ignoreSomeObjectsForCamera,ignoredElement) local x, y, z = getElementPosition(TheElement) local x2, y2, z2 = getElementPosition(localPlayer) local distance = distance or 20 local height = height or 1 local checkBuildings = checkBuildings or true local checkVehicles = checkVehicles or false local checkPeds = checkPeds or false local checkObjects = checkObjects or true local checkDummies = checkDummies or true local seeThroughStuff = seeThroughStuff or false local ignoreSomeObjectsForCamera = ignoreSomeObjectsForCamera or false local ignoredElement = ignoredElement or nil if (isLineOfSightClear(x, y, z, x2, y2, z2, checkBuildings, checkVehicles, checkPeds , checkObjects,checkDummies,seeThroughStuff,ignoreSomeObjectsForCamera,ignoredElement)) then local sx, sy = getScreenFromWorldPosition(x, y, z+height) if(sx) and (sy) then local distanceBetweenPoints = getDistanceBetweenPoints3D(x, y, z, x2, y2, z2) if(distanceBetweenPoints < distance) then dxDrawText(text, sx+2, sy+2, sx, sy, tocolor(R or 255, G or 255, B or 255, alpha or 255), (size or 1)-(distanceBetweenPoints / distance), font or "arial", "center", "center") end end end end
  7. Te recomiendo que uses el tag [lua] para esto, porque a mi esas imágenes me lían (problemas con los píxeles o algo que no me dejan ver con claridad).
  8. Pensé que no estaba terminado . Una pregunta solo para estar seguro por que en este momento no puedo testear, tengo que usarlo con un exports.dzButton? (es un ejemplo) Si metes la librería como otro script, sí. Espero que esta pequeña explicación te ayude
  9. 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.
  10. Si, debes hacer una comprobación de si una gui está abierta o no, para ello utiliza variables, ya que es client-side, solo afectará al jugador que lo está viendo. Y no, la librería es para tenerlo todo más organizado, de ahí su nombre.
  11. Es un check que comprueba si el ratón está en la posición. isMouseInPosition( x, y, w, h ) Por ejemplo, si dibujas un dxRectangle que quieres usar como botón, compruebas que cuando haces click está en la posición. Tipo: dxDrawRectangle( x+1, y+20, x+2, y+1 ) if isMouseInPosition( x+1, y+20, x+2, y+1 ) then outputChatBox( "Tu ratón está encima del rectángulo" ) end Edito: Aquí te dejo un ejemplo de un rectángulo negro que cuando pasas el ratón por encima se le cambia el color a blanco. local x, y = guiGetScreenSize( ) function isMouseInPosition ( x, y, width, height ) if ( not isCursorShowing ( ) ) then return false end local sx, sy = guiGetScreenSize ( ) local cx, cy = getCursorPosition ( ) local cx, cy = ( cx * sx ), ( cy * sy ) if ( cx >= x and cx <= x + width ) and ( cy >= y and cy <= y + height ) then return true else return false end end addEventHandler( "onClientRender", root, function( ) if isMouseInPosition( x/3.8, y/3.8, x/2.02, y/2 ) then dxDrawRectangle ( x/3.8, y/3.8, x/2.02, y/2, tocolor ( 255, 255, 255, 255 ) ) else dxDrawRectangle ( x/3.8, y/3.8, x/2.02, y/2, tocolor ( 0, 0, 0, 255 ) ) end end )
  12. Base de datos - Carga mediante lua a una tabla - Insertar/remover de una tabla
  13. No te recomiendo para nada usar xml. Usa una base de datos sqlite.
  14. Na, si no se gana nada de ese adfly . Gracias.
  15. Versión 2.0 Output test Click derecho y ver en pestaña nueva, mejor.
  16. Está mal también (sy/myY)*size)
  17. Es así pero bueno: (sy/sourceY)*font_size
  18. No, si multiplicarlas las multiplicas, pero tendrías que, al menos colocar los valores en una tabla (por lo menos los x que es la posición de derecha/izquierda y crearlas por un loop) para cargarlos con un loop.
  19. No se van a ordenar mágicamente. Dibújalas y luego con condiciones les vas cambiando el color o lo que sea que haces con el código. No esperes que con poner un loop ya se ajusten y todo.
  20. Busco funciones que mejoren la optimización en la carga de mapas. Actualmente tengo un buen sistema de carga, que lee scripts cliente como... pues, básicamente eso, mapas pero con createObject. La cosa está en que a veces, cargan lento los edificios y desaparecen al estar a una distancia cercana. ¿Alguna recomendación? Gracias.
×
×
  • Create New...