In my "Elevator-System" folder have 3 files.
"c_elevator_system"
"meta"
"s_elevator_system"
in "c_elevator_system"
addEventHandler( "onClientPlayerVehicleEnter", getLocalPlayer(),
function( vehicle )
setElementData( vehicle, "groundoffset", 0.2 + getElementDistanceFromCentreOfMassToBaseOfModel( vehicle ) )
end
)
addEvent( "CantFallOffBike", true )
addEventHandler( "CantFallOffBike", getLocalPlayer(),
function( )
setPedCanBeKnockedOffBike( getLocalPlayer(), false )
setTimer( setPedCanBeKnockedOffBike, 1050, 1, getLocalPlayer(), true )
end
)
On "s_elevator_system"
mysql = exports.mysql addEvent("onPlayerInteriorChange", true) -- Defines INTERIOR_X = 1 INTERIOR_Y = 2 INTERIOR_Z = 3 INTERIOR_INT = 4 INTERIOR_DIM = 5 INTERIOR_ANGLE = 6 INTERIOR_FEE = 7 INTERIOR_TYPE = 1 INTERIOR_DISABLED = 2 INTERIOR_LOCKED = 3 INTERIOR_OWNER = 4 INTERIOR_COST = 5 INTERIOR_SUPPLIES = 6 -- Small hack function setElementDataEx(source, field, parameter, streamtoall, streamatall) exports['anticheat-system']:changeProtectedElementDataEx( source, field, parameter, streamtoall, streamatall) end -- End small hack function createElevator(thePlayer, commandName, interior, dimension, ix, iy, iz) if (exports.global:isPlayerSuperAdmin(thePlayer)) or (exports.donators:hasPlayerPerk(thePlayer,14) and exports.global:isPlayerFullAdmin(thePlayer)) then if not (interior) or not (dimension) or not (ix) or not (iy) or not (iz) then outputChatBox("SINTAKSE: /" .. commandName .. " [interjera ID] [Dimensijas ID] [X] [Y] [Z]", thePlayer, 255, 194, 14) else local x, y, z = getElementPosition(thePlayer) interior = tonumber(interior) dimension = tonumber(dimension) local interiorwithin = getElementInterior(thePlayer) local dimensionwithin = getElementDimension(thePlayer) ix = tonumber(ix) iy = tonumber(iy) iz = tonumber(iz) id = SmallestElevatorID() if id then local query = mysql:query_free("INSERT INTO elevators SET id='" .. mysql:escape_string(id) .. "', x='" .. mysql:escape_string(x) .. "', y='" .. mysql:escape_string(y) .. "', z='" .. mysql:escape_string(z) .. "', tpx='" .. mysql:escape_string(ix) .. "', tpy='" .. mysql:escape_string(iy) .. "', tpz='" .. mysql:escape_string(iz) .. "', dimensionwithin='" .. mysql:escape_string(dimensionwithin) .. "', interiorwithin='" .. mysql:escape_string(interiorwithin) .. "', dimension='" .. mysql:escape_string(dimension) .. "', interior='" .. mysql:escape_string(interior) .. "'") if (query) then --reloadOneElevator(id, true) loadOneElevator(id) outputChatBox("Elevator created with ID #" .. id .. "!", thePlayer, 0, 255, 0) end else outputChatBox("There was an error while creating an elevator. Try again.", thePlayer, 255, 0, 0) end end end end addCommandHandler("addelevator", createElevator, false, false) function findElevator(elevatorID) elevatorID = tonumber(elevatorID) if elevatorID > 0 then local possibleInteriors = getElementsByType("elevator") for _, elevator in ipairs(possibleInteriors) do local eleID = getElementData(elevator, "dbid") if eleID == elevatorID then local elevatorEntrance = getElementData(elevator, "entrance") local elevatorExit = getElementData(elevator, "exit") local elevatorStatus = getElementData(elevator, "status") return elevatorID, elevatorEntrance, elevatorExit, elevatorStatus, elevator end end end return 0 end function findElevatorElement(elevatorID) elevatorID = tonumber(elevatorID) if elevatorID > 0 then local possibleInteriors = getElementsByType("elevator") for _, elevator in ipairs(possibleInteriors) do local eleID = getElementData(elevator, "dbid") if eleID == elevatorID then return elevator end end end return false end function reloadOneElevator(elevatorID, skipcheck) local dbid, entrance, exit, status, elevatorElement = findElevator( elevatorID ) if (dbid > 0 or skipcheck)then local realElevatorElement = findElevatorElement(dbid) if not realElevatorElement then outputDebugString("[reloadOneElevator] Can't find element") end triggerClientEvent("deleteInteriorElement", realElevatorElement, tonumber(dbid)) destroyElement(realElevatorElement) loadOneElevator(tonumber(dbid), false) else --outputDebugString("You suckx2") outputDebugString("Tried to reload elevator without ID.") end end function loadOneElevator(elevatorID, hasCoroutine) if (hasCoroutine==nil) then hasCoroutine = false end local row = mysql:query_fetch_assoc("SELECT id, x, y, z, tpx, tpy, tpz, dimensionwithin, interiorwithin, dimension, interior, car, disabled FROM `elevators` WHERE id = " .. elevatorID ) if row then --if (hasCoroutine) then -- coroutine.yield() --end if row then for k, v in pairs( row ) do if v == null then row[k] = nil else row[k] = tonumber(v) or v end end local elevatorElement = createElement("elevator", "ele"..tostring(row.id)) setElementDataEx(elevatorElement, "dbid", row.id, true) -- X Y Z Interior Dimension Angle Entree fee setElementDataEx(elevatorElement, "entrance", { row.x, row.y, row.z, row.interiorwithin, row.dimensionwithin, 0, 0 }, true ) setElementDataEx(elevatorElement, "exit", { row.tpx, row.tpy, row.tpz, row.interior, row.dimension, 0, 0 }, true ) -- Type Is diabled? setElementDataEx(elevatorElement, "status", { row.car, row.disabled == 1 } , true ) setElementDataEx(elevatorElement, "name", row.name, true ) return true end end end function loadAllElevators(res) local result = mysql:query("SELECT id FROM elevators") local counter = 0 if (result) then while true do local row = mysql:fetch_assoc(result) if not row then break end loadOneElevator(row.id) end mysql:free_result(result) end end addEventHandler("onResourceStart", getResourceRootElement(), loadAllElevators) function isInteriorLocked(dimension) local result = mysql:query_fetch_assoc("SELECT type, locked FROM `interiors` WHERE id = " .. mysql:escape_string(dimension)) local locked = false if result then if tonumber(result["rype"]) ~= 2 and tonumber(result["locked"]) == 1 then locked = true end end return locked end function enterElevator(goingin) local pickup = source local player = client if getElementType(pickup) ~= "elevator" then return end local elevatorStatus = getElementData(pickup, "status") if elevatorStatus[iNTERIOR_TYPE] == 3 then outputChatBox("Paraustot durvju rokturi, tu konstatē ka durvis ir aizslēgtas.", player, 255, 0,0, true) return end vehicle = getPedOccupiedVehicle( player ) if ( ( vehicle and elevatorStatus[iNTERIOR_TYPE] ~= 0 and getVehicleOccupant( vehicle ) == player ) or not vehicle ) then if not vehicle and elevatorStatus[iNTERIOR_TYPE] == 2 then outputChatBox( "This entrance is for vehicles only.", player, 255, 0, 0 ) return end if elevatorStatus[iNTERIOR_DISABLED] then outputChatBox( "This interior is currently disabled.", player, 255, 0, 0 ) return end local currentCP = nil local otherCP = nil if goingin then currentCP = getElementData(pickup, "entrance") otherCP = getElementData(pickup, "exit") else currentCP = getElementData(pickup, "exit") otherCP = getElementData(pickup, "entrance") end local locked = false if currentCP[iNTERIOR_DIM] == 0 and otherCP[iNTERIOR_DIM] ~= 0 then -- entering a house locked = isInteriorLocked(otherCP[iNTERIOR_DIM]) elseif currentCP[iNTERIOR_DIM] ~= 0 and otherCP[iNTERIOR_DIM] == 0 then -- leaving a house locked = isInteriorLocked(currentCP[iNTERIOR_DIM]) elseif currentCP[iNTERIOR_DIM] ~= 0 and otherCP[iNTERIOR_DIM] ~= 0 and currentCP[iNTERIOR_DIM] ~= otherCP[iNTERIOR_DIM] then -- changing between two houses locked = isInteriorLocked(currentCP[iNTERIOR_DIM]) or isInteriorLocked(otherCP[iNTERIOR_DIM]) else -- Moving in the same dimension locked = false end if locked then outputChatBox("Paraustot durvju rokturi, tu konstatē ka durvis ir aizslēgtas.", player, 255, 0,0, true) return end -- check for entrance fee local dbid, entrance, exit, interiorType, interiorElement = call( getResourceFromName( "interior-system" ), "findProperty", player, otherCP[iNTERIOR_DIM] ) if dbid > 0 then local interiorEntrance = getElementData(interiorElement, "entrance") local interiorStatus = getElementData(interiorElement, "status") if currentCP[iNTERIOR_DIM] ~= otherCP[iNTERIOR_DIM] and interiorElement then if getElementData( player, "adminduty" ) ~= 1 and not exports.global:hasItem( player, 5, otherCP[iNTERIOR_DIM] ) then if interiorEntrance[iNTERIOR_FEE] and interiorEntrance[iNTERIOR_FEE] > 0 then if not exports.global:takeMoney( player, interiorEntrance[iNTERIOR_FEE] ) then outputChatBox( "Jums nepietiek naudas, lai iekļūti šinī īpašumā.", player, 255, 0, 0 ) return else local ownerid = interiorStatus[iNTERIOR_OWNER] local query = mysql:query_free("UPDATE characters SET bankmoney = bankmoney + '" .. mysql:escae_string(interiorEntrance[iNTERIOR_FEE]) .. "' WHERE id = '" .. mysql:escape_string(ownerid).."'" ) if query then for k, v in pairs( getElementsByType( "player" ) ) do if isElement( v ) then if getElementData( v, "dbid" ) == ownerid then exports['anticheat-system']:changeProtectedElementDataEx( v, "businessprofit", getElementData( v, "businessprofit" ) + interiorEntrance[iNTERIOR_FEE], false ) break end end end else outputChatBox( "Error 9019 - Report on Forums.", player, 255, 0, 0 ) end end end end end else dbid, entrance, exit, interiorType, interiorElement = call( getResourceFromName( "interior-system" ), "findProperty", player, currentCP[iNTERIOR_DIM] ) end if vehicle then