Mikhail Posted October 10, 2018 Share Posted October 10, 2018 I've been 2 hours and a half trying to make an "onVehicleStartEnter" for the police faction, that only the police can get on the vehicle, I create an ingame vehicle that has: ID 2 (police ranger 599) but I do not know how to check the ID, I suppose that for someone with experience it will be a basic error but I try and I can not. Here I leave the resource vehicles so you can see it and can tell me how to check the ID of a vehicle (from the base data) Spoiler --[[ Copyright (c) 2010 MTA: Paradise This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. ]] local vehiclesIgnoringLocked = { [448] = true, [461] = true, [462] = true, [463] = true, [481] = true, [509] = true, [510] = true, [521] = true, [522] = true, [581] = true, [586] = true, -- bikes [430] = true, [446] = true, [452] = true, [453] = true, [454] = true, [472] = true, [473] = true, [484] = true, [493] = true, [595] = true, -- boats [424] = true, [457] = true, [471] = true, [539] = true, [568] = true, [571] = true -- recreational vehicles } -- local addCommandHandler_ = addCommandHandler addCommandHandler = function( commandName, fn, restricted, caseSensitive ) -- add the default command handlers if type( commandName ) ~= "table" then commandName = { commandName } end for key, value in ipairs( commandName ) do if key == 1 then addCommandHandler_( value, fn, restricted, caseSensitive ) else addCommandHandler_( value, function( player, ... ) -- check if he has permissions to execute the command, default is not restricted (aka if the command is restricted - will default to no permission; otherwise okay) if hasObjectPermissionTo( player, "command." .. commandName[ 1 ], not restricted ) then fn( player, ... ) end end ) end end -- check for alternative handlers, such as gotovehicle = gotoveh, gotocar for k, v in ipairs( commandName ) do if v:find( "vehicle" ) then for key, value in pairs( { "veh", "car" } ) do local newCommand = v:gsub( "vehicle", value ) if newCommand ~= v then -- add a second (replaced) command handler addCommandHandler_( newCommand, function( player, ... ) -- check if he has permissions to execute the command, default is not restricted (aka if the command is restricted - will default to no permission; otherwise okay) if hasObjectPermissionTo( player, "command." .. commandName[ 1 ], not restricted ) then fn( player, ... ) end end ) end end end end end -- local p = { } local getPedOccupiedVehicle_ = getPedOccupiedVehicle getPedOccupiedVehicle = function( ped ) local vehicle = isPedInVehicle( ped ) and getPedOccupiedVehicle_( ped ) if vehicle and ( p[ ped ] and p[ ped ].vehicle == vehicle or getElementParent( vehicle ) ~= getResourceDynamicElementRoot( resource ) ) then return vehicle end return false end local function isPedEnteringVehicle( ped ) return getPedOccupiedVehicle_( ped ) and not getPedOccupiedVehicle( ped ) end -- local vehicleIDs = { } local vehicles = { } addEventHandler( "onResourceStart", resourceRoot, function( ) -- Looking at it from a technical point of view, loading vehicles on a non-existant table makes only limited sense if not exports.sql:create_table( 'vehicles', { { name = 'vehicleID', type = 'int(10) unsigned', auto_increment = true, primary_key = true }, { name = 'model', type = 'int(10) unsigned' }, { name = 'posX', type = 'float' }, { name = 'posY', type = 'float' }, { name = 'posZ', type = 'float' }, { name = 'rotX', type = 'float' }, { name = 'rotY', type = 'float' }, { name = 'rotZ', type = 'float' }, { name = 'interior', type = 'tinyint(3) unsigned', default = 0 }, { name = 'dimension', type = 'int(10) unsigned', default = 0 }, { name = 'respawnPosX', type = 'float' }, { name = 'respawnPosY', type = 'float' }, { name = 'respawnPosZ', type = 'float' }, { name = 'respawnRotX', type = 'float' }, { name = 'respawnRotY', type = 'float' }, { name = 'respawnRotZ', type = 'float' }, { name = 'respawnInterior', type = 'int(10) unsigned', default = 0 }, { name = 'respawnDimension', type = 'int(10) unsigned', default = 0 }, { name = 'numberplate', type = 'varchar(8)' }, { name = 'health', type = 'int(10) unsigned', default = 1000 }, { name = 'color1', type = 'tinyint(3) unsigned', default = 0 }, { name = 'color2', type = 'tinyint(3) unsigned', default = 0 }, { name = 'characterID', type = 'int(11)', default = 0 }, { name = 'locked', type = 'tinyint(3) unsigned', default = 0 }, { name = 'engineState', type = 'tinyint(3) unsigned', default = 0 }, { name = 'lightsState', type = 'tinyint(3) unsigned', default = 0 }, { name = 'tintedWindows', type = 'tinyint(3) unsigned', default = 0 }, { name = 'fuel', type = 'float unsigned', default = 100 }, } ) then cancelEvent( ) return end -- load all vehicles local result = exports.sql:query_assoc( "SELECT * FROM vehicles ORDER BY vehicleID ASC" ) if result then for key, data in ipairs( result ) do local vehicle = createVehicle( data.model, data.posX, data.posY, data.posZ, data.rotX, data.rotY, data.rotZ, numberplate ) -- tables for ID -> vehicle and vehicle -> data vehicleIDs[ data.vehicleID ] = vehicle vehicles[ vehicle ] = { vehicleID = data.vehicleID, respawnInterior = data.respawnInterior, respawnDimension = data.respawnDimension, characterID = data.characterID, engineState = not doesVehicleHaveEngine( vehicle ) or data.engineState == 1, tintedWindows = data.tintedWindows == 1, fuel = data.fuel } -- some properties setElementHealth( vehicle, data.health ) if data.health <= 300 then setVehicleDamageProof( vehicle, true ) vehicles[ vehicle ].engineState = false end setVehicleColor( vehicle, data.color1, data.color2, data.color1, data.color2 ) -- most vehicles don't use second/third color anyway setVehicleRespawnPosition( vehicle, data.respawnPosX, data.respawnPosY, data.respawnPosZ, data.respawnRotX, data.respawnRotY, data.respawnRotZ ) setElementInterior( vehicle, data.interior ) setElementDimension( vehicle, data.dimension ) setVehicleLocked( vehicle, data.locked == 1 ) setVehicleEngineState( vehicle, data.engineState == 1 ) setVehicleOverrideLights( vehicle, data.lightsState + 1 ) setElementData( vehicle, "fuel", data.fuel ) end end -- bind a key for everyone for key, value in ipairs( getElementsByType( "player" ) ) do bindKey( value, "k", "down", "lockvehicle" ) bindKey( value, "j", "down", "toggleengine" ) bindKey( value, "l", "down", "togglelights" ) end -- -- Fuel update setTimer( function( ) for vehicle, data in pairs( vehicles ) do if not isElement( vehicle ) or getElementType( vehicle ) ~= "vehicle" then vehicles[ vehicle ] = nil elseif data.engineState and data.fuel and not isVehicleEmpty( vehicle ) and doesVehicleHaveEngine( vehicle ) and doesVehicleHaveFuel( vehicle ) then local vx, vy, vz = getElementVelocity( vehicle ) local speed = math.sqrt( vx * vx + vy * vy ) local loss = ( speed > 0.65 and 2 * speed or speed ) * 0.1 + 0.005 data.fuel = math.max( data.fuel - loss, 0 ) if math.floor( data.fuel + 0.5 ) ~= getElementData( vehicle, "fuel" ) then setElementData( vehicle, "fuel", math.floor( data.fuel + 0.5 ) ) end if data.fuel == 0 then setVehicleEngineState( vehicle, false ) for seat = 0, getVehicleMaxPassengers( vehicle ) do local player = getVehicleOccupant( vehicle, seat ) if player then triggerClientEvent( player, "gui:hint", player, "Out of Fuel", "Your " .. getVehicleName( vehicle ) .. " ran out of fuel!\nTo prevent this from happening, refill it regulary.", 3 ) end end end end end end, 2000, 0 ) end ) addCommandHandler( { "createvehicle", "makevehicle" }, function( player, commandName, ... ) model = table.concat( { ... }, " " ) model = getVehicleModelFromName( model ) or tonumber( model ) if model then local x, y, z, rz = getPositionInFrontOf( player ) local vehicle = createVehicle( model, x, y, z, 0, 0, rz ) if vehicle then local color1, color2 = getVehicleColor( vehicle ) local vehicleID, error = exports.sql:query_insertid( "INSERT INTO vehicles (model, posX, posY, posZ, rotX, rotY, rotZ, numberplate, color1, color2, respawnPosX, respawnPosY, respawnPosZ, respawnRotX, respawnRotY, respawnRotZ, interior, dimension, respawnInterior, respawnDimension) VALUES (" .. table.concat( { model, x, y, z, 0, 0, rz, '"%s"', color1, color2, x, y, z, 0, 0, rz, getElementInterior( player ), getElementDimension( player ), getElementInterior( player ), getElementDimension( player ) }, ", " ) .. ")", getVehiclePlateText( vehicle ) ) if vehicleID then -- tables for ID -> vehicle and vehicle -> data vehicleIDs[ vehicleID ] = vehicle vehicles[ vehicle ] = { vehicleID = vehicleID, respawnInterior = getElementInterior( player ), respawnDimension = getElementDimension( player ), characterID = 0, engineState = false, tintedWindows = false, fuel = 100 } -- some properties setElementInterior( vehicle, getElementInterior( player ) ) setElementDimension( vehicle, getElementDimension( player ) ) setVehicleEngineState( vehicle, false ) setVehicleOverrideLights( vehicle, 1 ) setElementData( vehicle, "fuel", 100 ) -- success message outputChatBox( "Created " .. getVehicleName( vehicle ) .. " (ID " .. vehicleID .. ")", player, 0, 255, 0 ) else destroyElement( vehicle ) outputChatBox( "MySQL-Query failed.", player, 255, 0, 0 ) end else outputChatBox( "Invalid Vehicle Model.", player, 255, 0, 0 ) end else outputChatBox( "Syntax: /" .. commandName .. " [model]", player, 255, 255, 255 ) end end, true ) function create( player, vehicle ) if isElement( player ) and isElement( vehicle ) then local characterID = exports.players:getCharacterID( player ) if characterID then local model = getElementModel( vehicle ) local x, y, z = getElementPosition( vehicle ) local rx, ry, rz = getVehicleRotation( vehicle ) local interior = getElementInterior( vehicle ) local dimension = getElementDimension( vehicle ) local color1, color2 = getVehicleColor( vehicle ) local vehicleID, error = exports.sql:query_insertid( "INSERT INTO vehicles (model, posX, posY, posZ, rotX, rotY, rotZ, numberplate, color1, color2, respawnPosX, respawnPosY, respawnPosZ, respawnRotX, respawnRotY, respawnRotZ, interior, dimension, respawnInterior, respawnDimension, characterID) VALUES (" .. table.concat( { model, x, y, z, rx, ry, rz, '"%s"', color1, color2, x, y, z, rx, ry, rz, interior, dimension, interior, dimension, characterID }, ", " ) .. ")", getVehiclePlateText( vehicle ) ) if vehicleID then local newVehicle = createVehicle( model, x, y, z, rx, ry, rz, getVehiclePlateText( vehicle ) ) -- tables for ID -> vehicle and vehicle -> data vehicleIDs[ vehicleID ] = newVehicle vehicles[ newVehicle ] = { vehicleID = vehicleID, respawnInterior = interior, respawnDimension = dimension, characterID = characterID, engineState = false, tintedWindows = false, fuel = 100 } -- some properties setVehicleColor( newVehicle, color1, color2, color1, color2 ) -- most vehicles don't use second/third color anyway setVehicleRespawnPosition( newVehicle, x, y, z, rx, ry, rz ) setElementInterior( newVehicle, interior ) setElementDimension( newVehicle, dimension ) setVehicleEngineState( newVehicle, false ) setVehicleOverrideLights( newVehicle, 1 ) setElementData( newVehicle, "fuel", 100 ) return newVehicle, vehicleID end end end end addCommandHandler( { "deletevehicle", "delvehicle" }, function( player, commandName, vehicleID ) if hasObjectPermissionTo( player, "command.createvehicle", false ) or hasObjectPermissionTo( player, "command.temporaryvehicle", false ) then vehicleID = tonumber( vehicleID ) if vehicleID and vehicleID ~= 0 then if ( vehicleID >= 0 and not hasObjectPermissionTo( player, "command.createvehicle", false ) ) or ( vehicleID < 0 and not hasObjectPermissionTo( player, "command.temporaryvehicle", false ) ) then outputChatBox( "You can not delete this vehicle.", player, 255, 0, 0 ) else local vehicle = vehicleIDs[ vehicleID ] if vehicle then if vehicleID < 0 or exports.sql:query_free( "DELETE FROM vehicles WHERE vehicleID = " .. vehicleID ) then outputChatBox( "You deleted vehicle " .. vehicleID .. " (" .. getVehicleName( vehicle ) .. ").", player, 0, 255, 153 ) -- remove from vehicles list vehicleIDs[ vehicleID ] = nil vehicles[ vehicle ] = nil destroyElement( vehicle ) else outputChatBox( "MySQL-Query failed.", player, 255, 0, 0 ) end else outputChatBox( "Vehicle not found.", player, 255, 0, 0 ) end end else outputChatBox( "Syntax: /" .. commandName .. " [id]", player, 255, 255, 255 ) end end end ) addCommandHandler( { "repairvehicle", "fixvehicle" }, function( player, commandName, otherPlayer ) if otherPlayer then target, targetName = exports.players:getFromName( player, otherPlayer ) else target = player targetName = getPlayerName( player ):gsub( "_", " " ) end if target then local vehicle = getPedOccupiedVehicle( target ) if vehicle then fixVehicle( vehicle ) if isVehicleDamageProof( vehicle ) then setVehicleDamageProof( vehicle, false ) end outputChatBox( "Your vehicle has been repaired by " .. getPlayerName( player ):gsub( "_", " " ) .. ".", target, 0, 255, 153 ) if player ~= target then outputChatBox( "You repaired " .. targetName .. "'s vehicle.", player, 0, 255, 153 ) end else outputChatBox( targetName .. " is not in a vehicle.", player, 255, 0, 0 ) end end end, true ) addCommandHandler( { "repairvehicles", "fixvehicles" }, function( player, commandName ) for vehicle in pairs( vehicles ) do fixVehicle( vehicle ) if isVehicleDamageProof( vehicle ) then setVehicleDamageProof( vehicle, false ) end end outputChatBox( "*** " .. getPlayerName( player ):gsub( "_", " " ) .. " repaired all vehicles. ***", root, 0, 255, 153 ) end, true ) addCommandHandler( { "fillvehicle", "fuelvehicle", "refillvehicle" }, function( player, commandName, otherPlayer ) if otherPlayer then target, targetName = exports.players:getFromName( player, otherPlayer ) else target = player targetName = getPlayerName( player ):gsub( "_", " " ) end if target then local vehicle = getPedOccupiedVehicle( target ) if vehicle then local data = vehicles[ vehicle ] if doesVehicleHaveFuel( vehicle ) and data then data.fuel = 100 setElementData( vehicle, "fuel", data.fuel ) outputChatBox( "Your vehicle has been refilled by " .. getPlayerName( player ):gsub( "_", " " ) .. ".", target, 0, 255, 153 ) if player ~= target then outputChatBox( "You refilled " .. targetName .. "'s vehicle.", player, 0, 255, 153 ) end else outputChatBox( targetName .. " has no vehicle with fuel.", player, 255, 0, 0 ) end else outputChatBox( targetName .. " is not in a vehicle.", player, 255, 0, 0 ) end end end, true ) addCommandHandler( { "fillvehicles", "fuelvehicles", "refillvehicles" }, function( player, commandName ) for vehicle, data in pairs( vehicles ) do if doesVehicleHaveFuel( vehicle ) and getElementData( vehicle, "fuel" ) < 100 then data.fuel = 100 setElementData( vehicle, "fuel", data.fuel ) end end outputChatBox( "*** " .. getPlayerName( player ):gsub( "_", " " ) .. " refilled all vehicles. ***", root, 0, 255, 153 ) end, true ) addCommandHandler( "respawnvehicle", function( player, commandName, vehicleID ) vehicleID = tonumber( vehicleID ) if vehicleID then local vehicle = vehicleIDs[ vehicleID ] if vehicle then if vehicleID < 0 then fixVehicle( vehicle ) if isVehicleDamageProof( vehicle ) then setVehicleDamageProof( vehicle, false ) end else respawnVehicle( vehicle ) saveVehicle( vehicle ) end outputChatBox( "You respawned vehicle " .. vehicleID .. " (" .. getVehicleName( vehicle ) .. ").", player, 0, 255, 153 ) else outputChatBox( "Vehicle not found.", player, 255, 0, 0 ) end else outputChatBox( "Syntax: /" .. commandName .. " [id]", player, 255, 255, 255 ) end end, true ) addCommandHandler( "respawnvehicles", function( player, commandName ) for vehicle, data in pairs( vehicles ) do if isVehicleEmpty( vehicle ) then if data.vehicleID < 0 then -- delete empty temp. vehicles vehicleIDs[ data.vehicleID ] = nil vehicles[ vehicle ] = nil destroyElement( vehicle ) else respawnVehicle( vehicle ) end end end if getResourceState( getResourceFromName( "vehicle-shop" ) ) == "running" then for key, value in ipairs( getElementsByType( "vehicle", getResourceRootElement( getResourceFromName( "vehicle-shop" ) ) ) ) do respawnVehicle( value ) end end outputChatBox( "*** " .. getPlayerName( player ):gsub( "_", " " ) .. " respawned all vehicles. ***", root, 0, 255, 153 ) exports.server:message( "%C03[" .. exports.players:getID( player ) .. "] " .. getPlayerName( player ):gsub( "_", " " ) .. " respawned all vehicles.%C" ) end, true ) addCommandHandler( "park", function( player, commandName ) local vehicle = getPedOccupiedVehicle( player ) if vehicle then local data = vehicles[ vehicle ] if data then if data.vehicleID < 0 then outputChatBox( "Your temporary vehicle " .. data.vehicleID .. " (" .. getVehicleName( vehicle ) .. ") can't be parked.", player, 255, 0, 0 ) elseif ( data.characterID > 0 and exports.players:getCharacterID( player ) == data.characterID or exports.factions:isPlayerInFaction( player, -data.characterID, 1 ) ) or hasObjectPermissionTo( player, "command.createvehicle", false ) then local x, y, z = getElementPosition( vehicle ) local rx, ry, rz = getVehicleRotation( vehicle ) local success, error = exports.sql:query_free( "UPDATE vehicles SET respawnPosX = " .. x .. ", respawnPosY = " .. y .. ", respawnPosZ = " .. z .. ", respawnRotX = " .. rx .. ", respawnRotY = " .. ry .. ", respawnRotZ = " .. rz .. ", respawnInterior = " .. getElementInterior( vehicle ) .. ", respawnDimension = " .. getElementDimension( vehicle ) .. " WHERE vehicleID = " .. data.vehicleID ) if success then setVehicleRespawnPosition( vehicle, x, y, z, rx, ry, rz ) data.respawnInterior = getElementInterior( vehicle ) data.respawnDimension = getElementDimension( vehicle ) saveVehicle( vehicle ) outputChatBox( "Vehicle " .. data.vehicleID .. " (" .. getVehicleName( vehicle ) .. ") has been parked.", player, 0, 255, 0 ) else outputChatBox( "Parking Vehicle failed.", player, 255, 0, 0 ) end else outputChatBox( "You cannot park this vehicle.", player, 255, 0, 0 ) end end else outputChatBox( "You aren't driving a vehicle.", player, 255, 0, 0 ) end end ) addCommandHandler( "getvehicle", function( player, commandName, vehicleID ) vehicleID = tonumber( vehicleID ) if vehicleID then local vehicle = vehicleIDs[ vehicleID ] if vehicle then local x, y, z, rz = getPositionInFrontOf( player ) setElementPosition( vehicle, x, y, z ) setElementDimension( vehicle, getElementDimension( player ) ) setElementInterior( vehicle, getElementInterior( player ) ) setVehicleRotation( vehicle, 0, 0, rz ) outputChatBox( "You teleported vehicle " .. vehicleID .. " (" .. getVehicleName( vehicle ) .. ") to you.", player, 0, 255, 153 ) -- save the vehicle delayed since it might fall down/position might be adjusted to ground position if vehicleID > 0 then setTimer( saveVehicle, 2000, 1, vehicle ) end else outputChatBox( "Vehicle not found.", player, 255, 0, 0 ) end else outputChatBox( "Syntax: /" .. commandName .. " [id]", player, 255, 255, 255 ) end end, true ) addCommandHandler( "gotovehicle", function( player, commandName, vehicleID ) vehicleID = tonumber( vehicleID ) if vehicleID then local vehicle = vehicleIDs[ vehicleID ] if vehicle then setElementPosition( player, getPositionInFrontOf( vehicle, nil, 180 ) ) setElementDimension( player, getElementDimension( vehicle ) ) setElementInterior( player, getElementInterior( vehicle ) ) outputChatBox( "You teleported to vehicle " .. vehicleID .. " (" .. getVehicleName( vehicle ) .. ").", player, 0, 255, 153 ) -- save the vehicle delayed since it might fall down/position might be adjusted to ground position if vehicleID > 0 then setTimer( saveVehicle, 2000, 1, vehicle ) end else outputChatBox( "Vehicle not found.", player, 255, 0, 0 ) end else outputChatBox( "Syntax: /" .. commandName .. " [id]", player, 255, 255, 255 ) end end, true ) addCommandHandler( { "vehicleid", "thisvehicle" }, function( player, commandName ) local vehicle = getPedOccupiedVehicle( player ) if vehicle then local vehicleID = vehicles[ vehicle ] and vehicles[ vehicle ].vehicleID if vehicleID then outputChatBox( "The ID of this " .. getVehicleName( vehicle ) .. " is " .. vehicleID .. ".", player, 0, 255, 0 ) else outputChatBox( "This " .. getVehicleName( vehicle ) .. " has no ID.", player, 255, 0, 0 ) end else outputChatBox( "You are not in any vehicle.", player, 255, 0, 0 ) end end ) function aff ( theVehicle, seat, jacked ) local asd = getVehicle (theVehicle) if asd == 2 then outputChatBox("ESSSSSSS",player,255,0,0) else outputChatBox("No es el id",player,255,0,0) end end -- add the event handler to the event addEventHandler ( "onPlayerVehicleEnter", root, aff ) addCommandHandler( { "oldvehicleid", "oldvehicle" }, function( player, commandName ) local vehicle = p[ player ] and p[ player ].oldVehicle if vehicle and isElement( vehicle ) then local vehicleID = vehicles[ vehicle ] and vehicles[ vehicle ].vehicleID if vehicleID then outputChatBox( "The ID of your old " .. getVehicleName( vehicle ) .. " is " .. vehicleID .. ".", player, 0, 255, 0 ) else outputChatBox( "This " .. getVehicleName( vehicle ) .. " has no ID.", player, 255, 0, 0 ) end else outputChatBox( "You haven't been in any vehicle.", player, 255, 0, 0 ) end end ) addCommandHandler( "setwindowstinted", function( player, commandName, other, state ) local state = tonumber( state ) if other and state then local other, name = exports.players:getFromName( player, other ) if other then local vehicle = getPedOccupiedVehicle( other ) if vehicle then local data = vehicles[ vehicle ] if data then if state ~= 1 then state = 0 end if data.vehicleID < 0 or exports.sql:query_free( "UPDATE vehicles SET tintedWindows = " .. state .. " WHERE vehicleID = " .. data.vehicleID ) then data.tintedWindows = state == 1 outputChatBox( "Tinted windows are now " .. ( data.tintedWindows and "enabled" or "disabled" ) .. ".", player, 0, 255, 153 ) for i = 0, getVehicleMaxPassengers( vehicle ) do local p = getVehicleOccupant( vehicle, i ) if p then exports.players:updateNametag( p ) end end else outputChatBox( "MySQL Query failed.", player, 255, 0, 0 ) end else outputChatBox( "Vehicle Error.", player, 255, 0, 0 ) end else outputChatBox( name .. " isn't driving a vehicle.", player, 255, 0, 0 ) end end else outputChatBox( "Syntax: /" .. commandName .. " [player] [1 = on, 0 = off]", player, 255, 255, 255 ) end end, true ) addCommandHandler( { "setvehiclecolor", "setcolor" }, function( player, commandName, other, color1, color2 ) local color1 = tonumber( color1 ) local color2 = tonumber( color2 ) or color1 if other and color1 and color2 and color1 >= 0 and color1 <= 255 and color2 >= 0 and color2 <= 255 then local other, name = exports.players:getFromName( player, other ) if other then local vehicle = getPedOccupiedVehicle( other ) if vehicle then local data = vehicles[ vehicle ] if data then if data.vehicleID < 0 or exports.sql:query_free( "UPDATE vehicles SET color1 = " .. color1 .. ", color2 = " .. color2 .. " WHERE vehicleID = " .. data.vehicleID ) then setVehicleColor( vehicle, color1, color2, color1, color2 ) outputChatBox( "Changed the color of " .. name .. "'s " .. getVehicleName( vehicle ) .. ".", player, 0, 255, 153 ) else outputChatBox( "MySQL Query failed.", player, 255, 0, 0 ) end else outputChatBox( "Vehicle Error.", player, 255, 0, 0 ) end else outputChatBox( name .. " isn't driving a vehicle.", player, 255, 0, 0 ) end end else outputChatBox( "Syntax: /" .. commandName .. " [player] [color 1] [color 2]", player, 255, 255, 255 ) end end, true ) addCommandHandler( "setvehiclefaction", function( player, commandName, other, faction ) local faction = tonumber( faction ) if other and faction and ( faction == 0 or exports.factions:getFactionName( faction ) ) then local other, name = exports.players:getFromName( player, other ) if other then local vehicle = getPedOccupiedVehicle( other ) if vehicle then local data = vehicles[ vehicle ] if data then if data.vehicleID > 0 then if data.characterID <= 0 then if exports.sql:query_free( "UPDATE vehicles SET characterID = " .. -faction .. " WHERE vehicleID = " .. data.vehicleID ) then data.characterID = -faction outputChatBox( name .. "'s " .. getVehicleName( vehicle ) .. " does now belong to " .. ( faction == 0 and "no faction" or exports.factions:getFactionName( faction ) ) .. ".", player, 0, 255, 153 ) else outputChatBox( "MySQL Query failed.", player, 255, 0, 0 ) end else outputChatBox( "This is no civilian/faction vehicle.", player, 255, 0, 0 ) end end else outputChatBox( "Vehicle Error.", player, 255, 0, 0 ) end else outputChatBox( name .. " isn't driving a vehicle.", player, 255, 0, 0 ) end end else outputChatBox( "Syntax: /" .. commandName .. " [player] [faction or 0 for no faction]", player, 255, 255, 255 ) end end, true ) -- function saveVehicle( vehicle ) if vehicle then local data = vehicles[ vehicle ] if data and data.vehicleID > 0 then local x, y, z = getElementPosition( vehicle ) local rx, ry, rz = getVehicleRotation( vehicle ) local success, error = exports.sql:query_free( "UPDATE vehicles SET posX = " .. x .. ", posY = " .. y .. ", posZ = " .. z .. ", rotX = " .. rx .. ", rotY = " .. ry .. ", rotZ = " .. rz .. ", health = " .. math.min( 1000, math.ceil( getElementHealth( vehicle ) ) ) .. ", interior = " .. getElementInterior( vehicle ) .. ", dimension = " .. getElementDimension( vehicle ) .. ", fuel = " .. data.fuel .. " WHERE vehicleID = " .. data.vehicleID ) if error then outputDebugString( error ) end end end end addEventHandler( "onVehicleExit", root, function( player ) saveVehicle( source ) if hasTintedWindows( source ) then exports.players:updateNametag( player ) end end ) setTimer( function( ) -- save all vehicles for vehicle in pairs( vehicles ) do saveVehicle( vehicle ) end end, 60000, 0 ) addEventHandler( "onResourceStop", resourceRoot, function( ) -- save all occupied vehicles on resource start local occupiedVehicles = { } for _, value in ipairs( getElementsByType( "player" ) ) do local vehicle = getPedOccupiedVehicle( value ) if vehicle then occupiedVehicles[ vehicle ] = true end end for vehicle in pairs( occupiedVehicles ) do saveVehicle( vehicle ) end -- we won't have any vehicles left, but show no message in onElementDestroy vehicles = { } vehicleIDs = { } end ) addEventHandler( "onVehicleRespawn", resourceRoot, function( ) local data = vehicles[ source ] if data and data.vehicleID > 0 then setElementInterior( source, data.respawnInterior ) setElementDimension( source, data.respawnDimension ) saveVehicle( source ) end end ) addEventHandler( "onPlayerJoin", root, function( ) bindKey( source, "k", "down", "lockvehicle" ) bindKey( source, "j", "down", "toggleengine" ) bindKey( source, "l", "down", "togglelights" ) end ) addEventHandler( "onPlayerQuit", root, function( ) local vehicle = getPedOccupiedVehicle( source ) if vehicle then saveVehicle( vehicle ) end p[ source ] = nil end ) addEventHandler( "onElementDestroy", resourceRoot, function( ) if vehicles[ source ] then outputDebugString( "Deleted vehicle ID " .. vehicles[ source ].vehicleID .. " (" .. getVehicleName( source ) .. "), even though it's still referenced. Removing references...", 2 ) vehicleIDs[ vehicles[ source ].vehicleID ] = nil vehicles[ source ] = nil end end ) addEventHandler( "onVehicleStartEnter", resourceRoot, function( player ) if isVehicleLocked( source ) and vehiclesIgnoringLocked[ getElementModel( source ) ] then cancelEvent( ) outputChatBox( "(( This " .. getVehicleName( source ) .. " is locked. ))", player, 255, 0, 0 ) end end ) addEventHandler( "onVehicleEnter", resourceRoot, function( player ) if isVehicleLocked( source ) then cancelEvent( ) removePedFromVehicle( player ) outputChatBox( "(( This " .. getVehicleName( source ) .. " is locked. ))", player, 255, 0, 0 ) else local data = vehicles[ source ] if data then if data.characterID > 0 then local name = exports.players:getCharacterName( data.characterID ) if name then outputChatBox( "(( This " .. getVehicleName( source ) .. " belongs to " .. name .. ". ))", player, 255, 204, 0 ) else outputDebugString( "Vehicle " .. data.vehicleID .. " (" .. getVehicleName( source ) .. ") has an invalid owner.", 2 ) end elseif data.characterID < 0 then outputChatBox( "(( This " .. getVehicleName( source ) .. " belongs to " .. tostring( exports.factions:getFactionName( -data.characterID ) ) .. ". ))", player, 255, 204, 0 ) end if not p[ player ] then p[ player ] = { } end p[ player ].vehicle = source setVehicleEngineState( source, not doesVehicleHaveEngine( source ) or data.engineState ) if hasTintedWindows( source ) then exports.players:updateNametag( player ) end end end end ) addEventHandler( "onVehicleStartExit", resourceRoot, function( player ) if isVehicleLocked( source ) then cancelEvent( ) outputChatBox( "(( The door is locked. ))", player, 255, 0, 0 ) else p[ player ].oldVehicle = p[ player ].vehicle p[ player ].vehicle = nil end end ) addEventHandler( "onVehicleExit", resourceRoot, function( player ) if p[ source ] then p[ source ].vehicle = nil end end ) addEventHandler( "onPlayerWasted", root, function( ) if p[ source ] then p[ source ].vehicle = nil end end ) -- local function lockVehicle( player, vehicle, driver ) local vehicleID = vehicles[ vehicle ] and vehicles[ vehicle ].vehicleID if vehicleID and ( vehicleID < 0 or exports.sql:query_free( "UPDATE vehicles SET locked = 1 - locked WHERE vehicleID = " .. vehicleID ) ) then if driver then exports.chat:me( player, ( isVehicleLocked( vehicle ) and "un" or "" ) .. "locks the vehicle doors." ) else exports.chat:me( player, "presses on the key to " .. ( isVehicleLocked( vehicle ) and "un" or "" ) .. "lock the " .. getVehicleName( vehicle ) .. "." ) end setVehicleLocked( vehicle, not isVehicleLocked( vehicle ) ) return true end return false end addCommandHandler( "lockvehicle", function( player, commandName ) if exports.players:isLoggedIn( player ) then if getElementData( player, "interiorMarker" ) then return end if isPedEnteringVehicle( player ) then return end local vehicle = getPedOccupiedVehicle( player ) local vehicleID = vehicle and vehicles[ vehicle ] and vehicles[ vehicle ].vehicleID if vehicleID then local driver = getVehicleOccupant( vehicle ) == player if driver or exports.items:has( player, 1, vehicleID ) or driver then lockVehicle( player, vehicle, driver ) end else local dimension = getElementDimension( player ) local minDistance = 20 local vehicle = nil local x, y, z = getElementPosition( player ) for key, value in pairs( vehicles ) do if dimension == getElementDimension( key ) then local distance = getDistanceBetweenPoints3D( x, y, z, getElementPosition( key ) ) if distance < minDistance then if exports.items:has( player, 1, value.vehicleID ) or ( value.characterID < 0 and exports.factions:isPlayerInFaction( player, -value.characterID ) ) then minDistance = distance vehicle = key end end end end if vehicle then lockVehicle( player, vehicle ) end end end end ) addCommandHandler( "toggleengine", function( player, commandName ) if exports.players:isLoggedIn( player ) then local vehicle = getPedOccupiedVehicle( player ) if vehicle and getVehicleOccupant( vehicle ) == player and doesVehicleHaveEngine( vehicle ) then local data = vehicles[ vehicle ] if data then if data.vehicleID < 0 or exports.sql:query_free( "UPDATE vehicles SET engineState = 1 - engineState WHERE vehicleID = " .. data.vehicleID ) then if math.floor( getElementHealth( vehicle ) + 0.5 ) > 301 then setVehicleEngineState( vehicle, not data.engineState ) data.engineState = not data.engineState else outputChatBox( "(( The engine is broken. ))", player, 255, 0, 0 ) end end end end end end ) addCommandHandler( "togglelights", function( player, commandName ) if exports.players:isLoggedIn( player ) then local vehicle = getPedOccupiedVehicle( player ) if vehicle and getVehicleOccupant( vehicle ) == player then local data = vehicles[ vehicle ] if data then if data.vehicleID < 0 or exports.sql:query_free( "UPDATE vehicles SET lightsState = 1 - lightsState WHERE vehicleID = " .. data.vehicleID ) then setVehicleOverrideLights( vehicle, getVehicleOverrideLights( vehicle ) == 2 and 1 or 2 ) end end end end end ) function getVehicle( vehicleID ) return vehicleIDs[ vehicleID ] or false end function getOwner( vehicle ) if vehicles[ vehicle ] then local owner = vehicles[ vehicle ].characterID return owner ~= 0 and owner or false -- false is in that case civilian end end function hasTintedWindows( vehicle ) return vehicles[ vehicle ] and vehicles[ vehicle ].tintedWindows or false end function toggleLock( player, vehicle ) return getElementType( player ) == "player" and isElement( vehicle ) and lockVehicle( player, vehicle, false ) or false end -- local tempIDCounter = 0 addCommandHandler( { "temporaryvehicle", "tempvehicle", "vehicle" }, function( player, commandName, ... ) model = table.concat( { ... }, " " ) model = getVehicleModelFromName( model ) or tonumber( model ) if model then local x, y, z, rz = getPositionInFrontOf( player ) local vehicle = createVehicle( model, x, y, z, 0, 0, rz ) if vehicle then tempIDCounter = tempIDCounter - 1 local vehicleID = tempIDCounter -- tables for ID -> vehicle and vehicle -> data vehicleIDs[ vehicleID ] = vehicle vehicles[ vehicle ] = { vehicleID = vehicleID, characterID = 0, engineState = true, tintedWindows = false, fuel = 100 } -- some properties setElementInterior( vehicle, getElementInterior( player ) ) setElementDimension( vehicle, getElementDimension( player ) ) setVehicleEngineState( vehicle, true ) setVehicleOverrideLights( vehicle, 1 ) setElementData( vehicle, "fuel", 100 ) -- success message outputChatBox( "Created " .. getVehicleName( vehicle ) .. " (ID " .. vehicleID .. ")", player, 0, 255, 0 ) else outputChatBox( "Invalid Vehicle Model.", player, 255, 0, 0 ) end else outputChatBox( "Syntax: /" .. commandName .. " [model]", player, 255, 255, 255 ) end end, true ) -- function increaseFuel( vehicle, amount ) local data = vehicles[ vehicle ] if data and doesVehicleHaveFuel( vehicle ) then if data.fuel + amount <= 100 then data.fuel = data.fuel + amount setElementData( vehicle, "fuel", math.floor( data.fuel + 0.5 ) ) end end end -- addEventHandler( "onVehicleDamage", root, function( loss ) if getElementHealth( source ) <= 301 then setElementHealth( source, 300 ) setVehicleDamageProof( source, true ) setVehicleEngineState( source, false ) vehicles[ source ].engineState = false if getVehicleOccupant( source ) then outputChatBox( "(( Your engine broke down. ))", getVehicleOccupant( source ), 255, 204, 0 ) end end end ) addEventHandler( "onVehicleRespawn", root, function( ) setVehicleDamageProof( source, false ) end ) addEventHandler( "onVehicleEnter", root, function( ) if isVehicleDamageProof( source ) and math.floor( getElementHealth( source ) + 0.5 ) > 301 then setVehicleDamageProof( source, false ) end end ) Link to comment
Mikhail Posted October 11, 2018 Author Share Posted October 11, 2018 2 hours ago, SaNoR said: OnVehicleStartEnter bro i know.. but how i check the vehicle ID? im not talking about the default vehicles IDs like: police ranger 599, im talking about the IDs from data base of paradise gm... Link to comment
ShayF2 Posted October 11, 2018 Share Posted October 11, 2018 Not many people are willing to help with ripped scripts. Even though it has public license information inside the file you're better off learning to script/learning their ways of scripting, or talking to the original author of the script its self. Link to comment
Addlibs Posted October 11, 2018 Share Posted October 11, 2018 -- The structure is as follows local vehicleIDs = { --[id] = vehElem, } local vehicles = { --[vehElem] = { -- vehicleID=id, -- respawnInterior=int, -- respawnDimension=dim, -- characterID=character, -- engineState=engine, -- tintedWindows=windows, -- fuel=fuelAmount --} } So if you want the vehicle with ID x, you use vehicleIDs[x] And if you want to get the ID of a vehicle v, use vehicles[v].vehicleID Link to comment
Mikhail Posted October 11, 2018 Author Share Posted October 11, 2018 (edited) 11 hours ago, MrTasty said: -- The structure is as followslocal vehicleIDs = { --[id] = vehElem,}local vehicles = { --[vehElem] = { -- vehicleID=id, -- respawnInterior=int, -- respawnDimension=dim, -- characterID=character, -- engineState=engine, -- tintedWindows=windows, -- fuel=fuelAmount --}} So if you want the vehicle with ID x, you use vehicleIDs[x] And if you want to get the ID of a vehicle v, use vehicles[v].vehicleID so i did this Spoiler addEventHandler( "onVehicleEnter", resourceRoot, function( player ) local vehicles = vehicles[ source ] local id = 1 if vehicles then if vehicles.vehicleID == id then outputChatBox( "yes", player, 255, 204, 0 ) else outputChatBox ("no",player, 255,0,0) end end end) and seems it work! ( the code its right?) but I'd like you to tell me what this means: "vehicles[v].vehicleID" THAT "[v]" thats means the V? It works if I want you to check 1 single ID, but if I want you to check for example: ID 2 and ID 3 How do I define them? try this: local asd = 2, 3 but it does not work, just take the id 2, sorry for my ignorance but not even in tutorials I find the correct way to define various numbers Edited October 11, 2018 by Mikhail Link to comment
Mikhail Posted October 12, 2018 Author Share Posted October 12, 2018 i found the solution! i will share it if someone needs it like me.. Spoiler local function contains(elem, val) for i=1,#elem do if elem[i] == val then return true end end return false end local elem = {2,3} --i have 4 cars in game, ID 1 ID 2 ID 3 ID 4 to test, if i enter in the cars with ID 2 and 3 chatbox return "yes" else return "no" addEventHandler( "onVehicleEnter", resourceRoot, function( player ) local vehicles = vehicles[ source ] if contains(elem, vehicles.vehicleID) then outputChatBox( "yes", player, 255, 204, 0 ) else outputChatBox ("No",player, 255,0,0) end end) Link to comment
Addlibs Posted October 12, 2018 Share Posted October 12, 2018 It's easier if you use the key in that table, since your contains function had to iterate the whole table (in cases where the ID wasn't in it), or iterate a part of the table until it found the ID (could be a lot of iterations for a larger table). I'm not sure if Lua's indexing does actually iterate any storage container under the hood, and even if it does, that would be done via C which is a lot faster. local IDsToCheck = {[2]=true, [3]=true} -- If you then index the table, you'll find that: -- ... -- IDsToCheck[0] = nil -- IDsToCheck[1] = nil -- IDsToCheck[2] = true -- IDsToCheck[3] = true -- IDsToCheck[4] = nil -- IDsToCheck[5] = nil -- ... -- In other words, everthing is nil except the IDs which you defined as true. addEventHandler("onVehicleEnter", resourceRoot, function(player) local vehID = vehicles[source].vehicleID if IDsToCheck[vehID] then -- evaluates nil if vehID isn't in IDsToCheck table, jump to else block; evaluates true if vehID is set to true, and executes the next block outputChatBox("ID matches", player, 255, 204, 0) else outputChatBox("Does not match", player, 255, 0, 0) end end ) 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