Jump to content

Help with elevators


Recommended Posts

In my "Elevator-System" folder have 3 files.

"c_elevator_system"

"meta" :D

"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
Link to comment
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

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