amlein Posted July 11, 2018 Share Posted July 11, 2018 (edited) Hi. I reaally need help with interior-system and interior-manager files in United Gaming file resources. I dont know how to scripting but i know the problem. When i enter and exit any building i cant get in any car. But when i restart interior-system script i will get in all the cars. What should i do ? this is interior system.lua server based. addEvent("onPlayerInteriorChange", true) intTable = {} safeTable = {} mysql = exports.mysql -- to check: -- payday -- to test -- /sell --[[ Interior types: TYPE 0: House TYPE 1: Business TYPE 2: Government (Unbuyable) TYPE 3: Rentable --]] -- Small hack function setElementDataEx(source, field, parameter, streamtoall, streamatall) exports['anticheat-system']:changeProtectedElementDataEx( source, field, parameter, streamtoall, streamatall) end -- End small hack function SmallestID( ) -- finds the smallest ID in the SQL instead of auto increment local result = mysql:query_fetch_assoc("SELECT MIN(e1.id+1) AS nextID FROM interiors AS e1 LEFT JOIN interiors AS e2 ON e1.id +1 = e2.id WHERE e2.id IS NULL") if result then local id = tonumber(result["nextID"]) or 1 return id end return false end function findProperty(thePlayer, dimension) local dbid = dimension or (thePlayer and getElementDimension( thePlayer ) or 0) if dbid > 0 then local possibleInteriors = getElementsByType("interior") for _, interior in ipairs(possibleInteriors) do local intID = getElementData(interior, "dbid") if intID == dbid then local interiorEntrance = getElementData(interior, "entrance") local interiorExit = getElementData(interior, "exit") local interiorStatus = getElementData(interior, "status") return dbid, interiorEntrance, interiorExit, interiorStatus[INTERIOR_TYPE], interior end end end return 0 end function cleanupProperty( id, donotdestroy) if id > 0 then if exports.mysql:query_free( "DELETE FROM dancers WHERE dimension = " .. mysql:escape_string(id) ) then local res = getResourceRootElement( getResourceFromName( "dancer-system" ) ) if res then for key, value in pairs( getElementsByType( "ped", res ) ) do if getElementDimension( value ) == id then destroyElement( value ) end end end end if exports.mysql:query_free( "DELETE FROM shops WHERE dimension = " .. mysql:escape_string(id) ) then local res = getResourceRootElement( getResourceFromName( "shop-system" ) ) if res then for key, value in pairs( getElementsByType( "ped", res ) ) do if getElementDimension( value ) == id then local npcID = getElementData( value, "dbid" ) exports.mysql:query_free( "DELETE FROM `shop_products` WHERE `npcID` = " .. mysql:escape_string(npcID) ) destroyElement( value ) end end end end if exports.mysql:query_free( "DELETE FROM atms WHERE dimension = " .. mysql:escape_string(id) ) then local res = getResourceRootElement( getResourceFromName( "bank-system" ) ) if res then for key, value in pairs( getElementsByType( "object", res ) ) do if getElementDimension( value ) == id then destroyElement( value ) end end end end -- if exports.mysql:query_free( "DELETE FROM `elevators` WHERE `dimensionwithin` = '" .. mysql:escape_string(id).."' OR `dimension` = '" .. mysql:escape_string(id).."'" ) then -- local res = getResourceRootElement( getResourceFromName( "elevator-system" ) ) -- if res then -- for key, value in pairs( getElementsByType( "elevator", res ) ) do -- if getElementDimension( value ) == id then -- destroyElement( value ) -- call( getResourceFromName( "elevator-system" ), "reloadOneElevator", value ) -- end -- end -- end -- end local resE = getResourceRootElement( getResourceFromName( "elevator-system" ) ) if resE then call( getResourceFromName( "elevator-system" ), "delElevatorsFromInterior", "MAXIME" , "PROPERTYCLEANUP", id ) end if not donotdestroy then local res1 = getResourceRootElement( getResourceFromName( "object-system" ) ) if res1 then exports['object-system']:removeInteriorObjects( tonumber(id) ) end end if safeTable[id] then local safe = safeTable[id] call( getResourceFromName( "item-system" ), "clearItems", safe ) destroyElement(safe) safeTable[id] = nil end setTimer ( function () call( getResourceFromName( "item-system" ), "deleteAllItemsWithinInt", id, 0, "CLEANUPINT" ) end, 3000, 1) end end function sellProperty(thePlayer, commandName, bla) if bla then outputChatBox("Use /sell to sell this place to another player.", thePlayer, 255, 0, 0) return end local dbid, entrance, exit, interiorType, interiorElement = findProperty( thePlayer ) if dbid > 0 then if interiorType == 2 then outputChatBox("You cannot sell a government property.", thePlayer, 255, 0, 0) elseif interiorType ~= 3 and commandName == "unrent" then outputChatBox("You do not rent this property.", thePlayer, 255, 0, 0) else local interiorStatus = getElementData(interiorElement, "status") if interiorStatus[INTERIOR_OWNER] == getElementData(thePlayer, "dbid") then publicSellProperty(thePlayer, dbid, true, true, false) cleanupProperty(dbid, true) exports.logs:dbLog(thePlayer, 37, { "in"..tostring(dbid) } , "SELLPROPERTY "..dbid) local addLog = mysql:query_free("INSERT INTO `interior_logs` (`intID`, `action`, `actor`) VALUES ('"..tostring(dbid).."', '"..commandName.."', '"..getElementData(thePlayer, "account:id").."')") or false if not addLog then outputDebugString("Failed to add interior logs.") end else outputChatBox("You do not own this property.", thePlayer, 255, 0, 0) end end else outputChatBox("You are not in a property.", thePlayer, 255, 0, 0) end end addCommandHandler("sellproperty", sellProperty, false, false) addCommandHandler("unrent", sellProperty, false, false) function publicSellProperty(thePlayer, dbid, showmessages, givemoney, CLEANUP) local dbid, entrance, exit, interiorType, interiorElement = findProperty( thePlayer, dbid ) local query = mysql:query_free("UPDATE interiors SET owner=-1, locked=1, safepositionX=NULL, safepositionY=NULL, safepositionZ=NULL, safepositionRZ=NULL WHERE id='" .. dbid .. "'") if query then local interiorStatus = getElementData(interiorElement, "status") if getElementDimension(thePlayer) == dbid and not CLEANUP then setElementInterior(thePlayer, entrance[INTERIOR_INT]) setCameraInterior(thePlayer, entrance[INTERIOR_INT]) setElementDimension(thePlayer, entrance[INTERIOR_DIM]) setElementPosition(thePlayer, entrance[INTERIOR_X], entrance[INTERIOR_Y], entrance[INTERIOR_Z]) exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "interiormarker", false, false, false) end if safeTable[dbid] then local safe = safeTable[dbid] if safe then exports['item-system']:clearItems(safe) destroyElement(safe) safeTable[dbid] = nil else end end if interiorType == 0 or interiorType == 1 then if interiorStatus[INTERIOR_OWNER] == getElementData(thePlayer, "dbid") then local money = math.ceil(interiorStatus[INTERIOR_COST] * 2/3) if givemoney then exports.global:giveMoney(thePlayer, money) exports.global:takeMoney(getTeamFromName("Government of Los Santos"), money, true) end if showmessages then if CLEANUP == "FORCESELL" then local hiddenAdmin = getElementData(thePlayer, "hiddenadmin") local adminTitle = exports.global:getPlayerAdminTitle(thePlayer) local adminUsername = getElementData(thePlayer, "account:username") if hiddenAdmin == 0 then exports.global:sendMessageToAdmins("[INTERIOR]: "..adminTitle.." ".. getPlayerName(thePlayer):gsub("_", " ").." ("..adminUsername..") has force-sold interior #"..dbid.." ("..getElementData(interiorElement,"name")..").") else exports.global:sendMessageToAdmins("[INTERIOR]: A hidden admin has force-sold interior #"..dbid.." ("..getElementData(interiorElement,"name")..").") end else outputChatBox("You sold your property for " .. exports.global:formatMoney(money) .. "$.", thePlayer, 0, 255, 0) end end -- take all keys call( getResourceFromName( "item-system" ), "deleteAll", 4, dbid ) call( getResourceFromName( "item-system" ), "deleteAll", 5, dbid ) triggerClientEvent(thePlayer, "removeBlipAtXY", thePlayer, interiorType, entrance[INTERIOR_X], entrance[INTERIOR_Y], entrance[INTERIOR_Z]) else if showmessages then if CLEANUP == "FORCESELL" then local hiddenAdmin = getElementData(thePlayer, "hiddenadmin") local adminTitle = exports.global:getPlayerAdminTitle(thePlayer) local adminUsername = getElementData(thePlayer, "account:username") if hiddenAdmin == 0 then exports.global:sendMessageToAdmins("[INTERIOR]: "..adminTitle.." ".. getPlayerName(thePlayer):gsub("_", " ").." ("..adminUsername..") has force-sold interior #"..dbid.." ("..getElementData(interiorElement,"name")..").") else exports.global:sendMessageToAdmins("[INTERIOR]: A hidden admin has force-sold interior #"..dbid.." ("..getElementData(interiorElement,"name")..").") end else outputChatBox("You set this property to unowned.", thePlayer, 0, 255, 0) end end end else if showmessages then if CLEANUP == "FORCESELL" then local hiddenAdmin = getElementData(thePlayer, "hiddenadmin") local adminTitle = exports.global:getPlayerAdminTitle(thePlayer) local adminUsername = getElementData(thePlayer, "account:username") if hiddenAdmin == 0 then exports.global:sendMessageToAdmins("[INTERIOR]: "..adminTitle.." ".. getPlayerName(thePlayer):gsub("_", " ").." ("..adminUsername..") has force-sold interior #"..dbid.." ("..getElementData(interiorElement,"name")..").") else exports.global:sendMessageToAdmins("[INTERIOR]: A hidden admin has force-sold interior #"..dbid.." ("..getElementData(interiorElement,"name")..").") end else outputChatBox("You are no longer renting this property.", thePlayer, 0, 255, 0) end end call( getResourceFromName( "item-system" ), "deleteAll", 4, dbid ) call( getResourceFromName( "item-system" ), "deleteAll", 5, dbid ) triggerClientEvent(thePlayer, "removeBlipAtXY", thePlayer, interiorType, entrance[INTERIOR_X], entrance[INTERIOR_Y], entrance[INTERIOR_Z]) end realReloadInterior(dbid) else outputChatBox("Error 504914 - Report on forums.", thePlayer, 255, 0, 0) end end function sellTo(thePlayer, commandName, targetPlayerName) -- only works in dimensions local dbid, entrance, exit, interiorType, interiorElement = findProperty( thePlayer ) if dbid > 0 and not isPedInVehicle( thePlayer ) then local interiorStatus = getElementData(interiorElement, "status") if interiorStatus[INTERIOR_TYPE] == 2 then outputChatBox("You cannot sell a government property.", thePlayer, 255, 0, 0) elseif not targetPlayerName then outputChatBox("SYNTAX: /" .. commandName .. " [partial player name / id]", thePlayer, 255, 194, 14) outputChatBox("Sells the Property you're in to that Player.", thePlayer, 255, 194, 14) outputChatBox("Ask the buyer to use /pay to recieve the money for the Property.", thePlayer, 255, 194, 14) else local targetPlayer, targetPlayerName = exports.global:findPlayerByPartialNick(thePlayer, targetPlayerName) if targetPlayer and getElementData(targetPlayer, "dbid") then local px, py, pz = getElementPosition(thePlayer) local tx, ty, tz = getElementPosition(targetPlayer) if getDistanceBetweenPoints3D(px, py, pz, tx, ty, tz) < 10 and getElementDimension(targetPlayer) == getElementDimension(thePlayer) then if interiorStatus[INTERIOR_OWNER] == getElementData(thePlayer, "dbid") or exports.global:isPlayerFullAdmin(thePlayer) or exports.donators:hasPlayerPerk(thePlayer, 14) then if getElementData(targetPlayer, "dbid") ~= interiorStatus[INTERIOR_OWNER] then if exports.global:hasSpaceForItem(targetPlayer, 4, dbid) then local query = mysql:query_free("UPDATE interiors SET owner = '" .. getElementData(targetPlayer, "dbid") .. "' WHERE id='" .. dbid .. "'") if query then local keytype = 4 if interiorType == 1 then keytype = 5 end call( getResourceFromName( "item-system" ), "deleteAll", 4, dbid ) call( getResourceFromName( "item-system" ), "deleteAll", 5, dbid ) exports.global:giveItem(targetPlayer, keytype, dbid) triggerClientEvent(thePlayer, "removeBlipAtXY", thePlayer, interiorType, entrance[INTERIOR_X], entrance[INTERIOR_Y], entrance[INTERIOR_Z]) triggerClientEvent(targetPlayer, "createBlipAtXY", targetPlayer, interiorType, entrance[INTERIOR_X], entrance[INTERIOR_Y], entrance[INTERIOR_Z]) if interiorType == 0 or interiorType == 1 then outputChatBox("You've successfully sold your property to " .. targetPlayerName .. ".", thePlayer, 0, 255, 0) outputChatBox((getPlayerName(thePlayer):gsub("_", " ")) .. " sold you this property.", targetPlayer, 0, 255, 0) else outputChatBox(targetPlayerName .. " has taken over your rent contract.", thePlayer, 0, 255, 0) outputChatBox("You did take over " .. getPlayerName(thePlayer):gsub("_", " ") .. "'s renting contract.", targetPlayer, 0, 255, 0) end exports.logs:dbLog(thePlayer, 37, { targetPlayer, "in"..tostring(dbid) } , "SELLPROPERTY "..getPlayerName(thePlayer).." => "..targetPlayerName) local adminID = getElementData(thePlayer, "account:id") local addLog = mysql:query_free("INSERT INTO `interior_logs` (`intID`, `action`, `actor`) VALUES ('"..tostring(dbid).."', '"..commandName.." to "..targetPlayerName.."', '"..adminID.."')") or false if not addLog then outputDebugString("Failed to add interior logs.") end realReloadInterior(dbid) else outputChatBox("Error 09002 - Report on Forums.", thePlayer, 255, 0, 0) end else outputChatBox(targetPlayerName .. " has no space for the property keys.", thePlayer, 255, 0, 0) end else outputChatBox("You can't sell your own property to yourself.", thePlayer, 255, 0, 0) end else outputChatBox("This property is not yours.", thePlayer, 255, 0, 0) end else outputChatBox("You are too far away from " .. targetPlayerName .. ".", thePlayer, 255, 0, 0) end end end end end addCommandHandler("sell", sellTo) function realReloadInterior(interiorID) local dbid, entrance, exit, inttype, interiorElement = exports['interior-system']:findProperty( false, interiorID ) if dbid > 0 then if safeTable[dbid] then destroyElement(safeTable[dbid]) safeTable[dbid] = false end triggerClientEvent("deleteInteriorElement", interiorElement, tonumber(dbid)) destroyElement(interiorElement) reloadOneInterior(tonumber(dbid), false) else --outputChatBox("You suck") --outputDebugString("Tried to reload interior without ID.") end end local stats_numberOfInts = 0 -- CONVERTED function reloadOneInterior(id) --[[if (hasCoroutine==nil) then hasCoroutine = false end]] local row = mysql:query_fetch_assoc("SELECT * FROM `interiors` LEFT JOIN `interior_business` ON `interiors`.`id` = `interior_business`.`intID` WHERE `id` = '" .. id .."' AND `deleted` = '0'") 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 interiorElement = createElement("interior", "int"..tostring(row.id)) setElementDataEx(interiorElement, "dbid", row.id, true) setElementDataEx(interiorElement, "entrance", { row.x, row.y, row.z, row.interiorwithin, row.dimensionwithin, row.angle, 0 }, true) setElementDataEx(interiorElement, "exit", {row.interiorx, row.interiory, row.interiorz, row.interior, row.id, row.angleexit, 0 }, true ) setElementDataEx(interiorElement, "status", { row.type, row.disabled == 1, row.locked == 1, row.owner, row.cost, row.supplies}, true ) setElementDataEx(interiorElement, "name", row.name, true ) setElementDataEx(interiorElement, "adminnote", string.sub(tostring(row.adminnote),1,100) , true ) --setElementDataEx(interiorElement, "isLightOn", row.isLightOn == 1, true) if row.safepositionX and row.safepositionY and row.safepositionZ ~= mysql_null() and row.safepositionRZ then setElementDataEx(interiorElement, "safe", {row.safepositionX, row.safepositionY, row.safepositionZ, 0, 0, row.safepositionRZ}, false) local tempobject = createObject(2332, row.safepositionX, row.safepositionY, row.safepositionZ, 0, 0, row.safepositionRZ) setElementInterior(tempobject, row.interior) setElementDimension(tempobject, row.id) safeTable[row.id] = tempobject else setElementDataEx(interiorElement, "safe", false, true) end if row.businessNote then setElementDataEx(interiorElement, "business:note", row.businessNote , true) end outputDebugString( "[INTERIOR] LOADED INT #" .. id.." ("..row.name..")" ) return true else outputDebugString( "[INTERIOR] LOADING FAILED Invalid Int #" .. id ) return false end end end --[[local threads = { } function resume() for key, value in ipairs(threads) do coroutine.resume(value) end end]] function loadAllInteriors() local players = exports.pool:getPoolElementsByType("player") for k, thePlayer in ipairs(players) do exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "interiormarker", false, false, false) end local timerDelay = 100 local result = mysql:query("SELECT `id` FROM `interiors` WHERE `deleted` = '0'") if (result) then while true do local row = mysql:fetch_assoc(result) if not row then break end setTimer(reloadOneInterior, timerDelay, 1, row.id) timerDelay = timerDelay + 100 stats_numberOfInts = stats_numberOfInts + 1 end mysql:free_result(result) setTimer(function () triggerClientEvent("interior:showLoadingProgress" ,getRootElement(), stats_numberOfInts, timerDelay) end, 5000, 1) end end addEventHandler("onResourceStart", getResourceRootElement(getThisResource()), loadAllInteriors) function buyInterior(player, pickup, cost, isHouse, isRentable) if isRentable then local result = mysql:query_fetch_assoc( "SELECT COUNT(*) as 'cntval' FROM `interiors` WHERE `owner` = " .. getElementData(player, "dbid") .. " AND `type` = 3" ) if result then local count = tonumber(result['cntval']) if count ~= 0 then outputChatBox("You are already renting another house.", player, 255, 0, 0) return end end elseif not exports.global:hasSpaceForItem(player, 4, 1) then outputChatBox("You do not have the space for the keys.", player, 255, 0, 0) return end if exports.global:takeMoney(player, cost) then if (isHouse) then outputChatBox("Congratulations! You have just bought this house for $" .. exports.global:formatMoney(cost) .. ".", player, 255, 194, 14) exports.global:giveMoney( getTeamFromName("Government of Los Santos"), cost ) elseif (isRentable) then outputChatBox("Congratulations! You are now renting this property for $" .. exports.global:formatMoney(cost) .. ".", player, 255, 194, 14) else outputChatBox("Congratulations! You have just bought this business for $" .. exports.global:formatMoney(cost) .. ".", player, 255, 194, 14) exports.global:giveMoney( getTeamFromName("Government of Los Santos"), cost ) end local charid = getElementData(player, "dbid") local pickupid = getElementData(pickup, "dbid") mysql:query_free( "UPDATE interiors SET owner='" .. charid .. "', locked=0 WHERE id='" .. pickupid .. "'") local interiorEntrance = getElementData(pickup, "entrance") -- make sure it's an unqiue key call( getResourceFromName( "item-system" ), "deleteAll", 4, pickupid ) call( getResourceFromName( "item-system" ), "deleteAll", 5, pickupid ) if (isHouse) or (isRentable) then exports.global:giveItem(player, 4, pickupid) else exports.global:giveItem(player, 5, pickupid) end exports.logs:dbLog(thePlayer, 37, { "in"..tostring(pickupid) } , "BUYPROPERTY $"..cost) realReloadInterior(tonumber(pickupid)) triggerClientEvent(player, "createBlipAtXY", player, interiorEntrance[INTERIOR_TYPE], interiorEntrance[INTERIOR_X], interiorEntrance[INTERIOR_Y]) else outputChatBox("Sorry, you cannot afford to purchase this property.", player, 255, 194, 14) end end --[[ function vehicleStartEnter(thePlayer) local marker = getElementData(thePlayer, "interiormarker") local x, y, z = getElementPosition(thePlayer) if marker then cancelEvent() end end addEventHandler("onVehicleStartEnter", getRootElement(), vehicleStartEnter) addEventHandler("onVehicleStartExit", getRootElement(), vehicleStartEnter)]] -- I guess I'll test this on my local server before we put it in, make sure miniguns dont fall from the sky and everyone turns into a clown. -Bean --[[function vehicleStartEnter(thePlayer) local marker = getElementData(thePlayer, "interiormarker") local x, y, z = getElementPosition(thePlayer) local lastDistance = 1 -- This is the distanceBetweenPoints3D, I'm sure we could make it less, but this should do if they are on the interior marker, right? for _, interior in ipairs(possibleInteriors) do local interiorEntrance = getElementData(interior, "entrance") local interiorExit = getElementData(interior, "exit") local posX, posY, posZ = getElementPosition(thePlayer) local dimension = getElementDimension(thePlayer) for _, point in ipairs( { interiorEntrance, interiorExit } ) do if (point[5] == dimension) then local distance = getDistanceBetweenPoints3D(posX, posY, posZ, point[1], point[2], point[3]) if (distance < lastDistance) then found = interior -- Set it to the interior ID so that it knows there's something there. lastDistance = distance end end end end if marker and found then -- If it's there, then you cancel, not just because the event wants us to. cancelEvent() else exports['anticheat-system']:changeProtectedElementDataEx(thePlayer, "interiormarker", nil, nil, nil) -- If it's not found, then let them enter the car, and clear the element data so it's not there anymore. end end addEventHandler("onVehicleStartEnter", getRootElement(), vehicleStartEnter) addEventHandler("onVehicleStartExit", getRootElement(), vehicleStartEnter)]] function enterInterior( ) if source and client then local canEnter, errorCode, errorMsg = canEnterInterior(source) -- Checks for disabled and locked ints. if canEnter then setPlayerInsideInterior( source, client ) elseif isInteriorForSale(source) then local interiorStatus = getElementData(source, "status") local cost = interiorStatus[INTERIOR_COST] local isHouse = interiorStatus[INTERIOR_TYPE] == 0 local isRentable = interiorStatus[INTERIOR_TYPE] == 3 buyInterior(client, source, cost, isHouse, isRentable) else outputChatBox(errorMsg, client, 255, 0, 0) end end end addEvent("interior:enter", true) addEventHandler("interior:enter", getRootElement(), enterInterior) -- NOT CONVERTED function setPlayerInsideInterior(theInterior, thePlayer) local teleportTo = nil -- does the player want to go in? local pedCurrentDimension = getElementDimension( thePlayer ) local interiorEntrance = getElementData(theInterior, "entrance") local interiorExit = getElementData(theInterior, "exit") local interiorStatus = getElementData(theInterior, "status") if (interiorEntrance[INTERIOR_DIM] == pedCurrentDimension) then --[[ We want to go inside, Check for a fee ***REMOVED.*** if getElementData( thePlayer, "adminduty" ) ~= 1 and not exports.global:hasItem( thePlayer, 5, getElementData( theInterior, "dbid" ) ) and not (getElementData(thePlayer,"ESbadge")) and not (getElementData(thePlayer,"PDbadge"))and not (getElementData(thePlayer,"SheriffBadge")) and not (getElementData(thePlayer,"GOVbadge")) and not (getElementData(thePlayer,"SANbadge")) then local fee = interiorEntrance[INTERIOR_FEE] if fee and fee > 0 then if not exports.global:takeMoney( thePlayer, fee ) then outputChatBox( "You don't have enough money with you to enter this interior.", thePlayer, 255, 0, 0 ) return else local ownerid = interiorStatus[INTERIOR_OWNER] local query = mysql:query_free( "UPDATE characters SET bankmoney = bankmoney + " .. fee .. " WHERE id = " .. 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" ) + fee, false ) break end end end else outputChatBox( "Error 100.6 - Report on Forums.", thePlayer, 255, 0, 0 ) end end end end]] -- We've passed the feecheck, yet we still want to go inside. teleportTo = interiorExit else -- We'd like to leave this building, kthxhopefullybye. if (getElementData(thePlayer, "snake")==true) then return end teleportTo = interiorEntrance end if teleportTo then triggerClientEvent(thePlayer, "setPlayerInsideInterior", theInterior, teleportTo, theInterior) doorGoThru(theInterior) local dbid = getElementData(theInterior, "dbid") mysql:query_free("UPDATE `interiors` SET `lastused`=NOW() WHERE `id`='" .. mysql:escape_string(dbid) .. "'") end end --[[ SAFES ]] function addSafeAtPosition( thePlayer, x, y, z, rotz ) local dbid = getElementDimension( thePlayer ) local interior = getElementInterior( thePlayer ) if dbid == 0 then return 2 elseif dbid >= 20000 then -- Vehicle Interiors local vid = dbid - 20000 if exports['vehicle-system']:getSafe( vid ) then outputChatBox("There is already a safe in this property. Type /movesafe to move it.", thePlayer, 255, 0, 0) return 1 elseif exports.global:hasItem( thePlayer, 3, vid ) then z = z - 0.5 rotz = rotz + 180 if exports.mysql:query_free( "UPDATE vehicles SET safepositionX='" .. x .. "', safepositionY='" .. y .. "', safepositionZ='" .. z .. "', safepositionRZ='" .. rotz .. "' WHERE id='" .. vid .. "'") then if exports['vehicle-system']:addSafe( vid, x, y, z, rotz, interior ) then return 0 end end return 1 end elseif dbid >= 19000 then -- temp vehicle interiors return 2 elseif ((exports.global:hasItem( thePlayer, 5, dbid ) or exports.global:hasItem( thePlayer, 4, dbid))) then if safeTable[dbid] then outputChatBox("There is already a safe in this property. Type /movesafe to move it.", thePlayer, 255, 0, 0) return 1 else z = z - 0.5 rotz = rotz + 180 mysql:query_free( "UPDATE interiors SET safepositionX='" .. x .. "', safepositionY='" .. y .. "', safepositionZ='" .. z .. "', safepositionRZ='" .. rotz .. "' WHERE id='" .. dbid .. "'") local tempobject = createObject(2332, x, y, z, 0, 0, rotz) setElementInterior(tempobject, interior) setElementDimension(tempobject, dbid) safeTable[dbid] = tempobject call( getResourceFromName( "item-system" ), "clearItems", tempobject ) return 0 end end return 3 end function moveSafe ( thePlayer, commandName ) local x,y,z = getElementPosition( thePlayer ) local rotz = getPedRotation( thePlayer ) local dbid = getElementDimension( thePlayer ) local interior = getElementInterior( thePlayer ) if (dbid < 19000 and (exports.global:hasItem( thePlayer, 5, dbid ) or exports.global:hasItem( thePlayer, 4, dbid))) or (dbid >= 20000 and exports.global:hasItem(thePlayer, 3, dbid - 20000)) then z = z - 0.5 rotz = rotz + 180 if dbid >= 20000 and exports['vehicle-system']:getSafe(dbid-20000) then local safe = exports['vehicle-system']:getSafe(dbid-20000) exports.mysql:query_free("UPDATE vehicles SET safepositionX='" .. x .. "', safepositionY='" .. y .. "', safepositionZ='" .. z .. "', safepositionRZ='" .. rotz .. "' WHERE id='" .. (dbid-20000) .. "'") setElementPosition(safe, x, y, z) setObjectRotation(safe, 0, 0, rotz) elseif dbid > 0 and safeTable[dbid] then local safe = safeTable[dbid] exports.mysql:query_free("UPDATE interiors SET safepositionX='" .. x .. "', safepositionY='" .. y .. "', safepositionZ='" .. z .. "', safepositionRZ='" .. rotz .. "' WHERE id='" .. dbid .. "'") -- Update the name in the sql. setElementPosition(safe, x, y, z) setObjectRotation(safe, 0, 0, rotz) else outputChatBox("You need a safe to move!", thePlayer, 255, 0, 0) end else outputChatBox("You need the keys of this interior to move the Safe.", thePlayer, 255, 0, 0) end end addCommandHandler("movesafe", moveSafe) local function hasKey( source, key ) if exports.global:hasItem(source, 4, key) or exports.global:hasItem(source, 5,key) then return true, false else if getElementData(source, "adminduty") == 1 then return true, true else return false, false end end return false, false end function lockUnlockHouseEvent(player, checkdistance) if (player) then source = player end local itemValue = nil local found = nil local foundpoint = nil local minDistance = 5 local interiorName = "" local pPosX, pPosY, pPosZ = getElementPosition(source) local dimension = getElementDimension(source) local canEnter, byAdmin = nil local possibleInteriors = getElementsByType("interior") for _, interior in ipairs(possibleInteriors) do local interiorEntrance = getElementData(interior, "entrance") local interiorExit = getElementData(interior, "exit") for _, point in ipairs( { interiorEntrance, interiorExit } ) do if (point[INTERIOR_DIM] == dimension) then local distance = getDistanceBetweenPoints3D(pPosX, pPosY, pPosZ, point[INTERIOR_X], point[INTERIOR_Y], point[INTERIOR_Z]) or 20 if (distance < minDistance) then local interiorID = getElementData(interior, "dbid") canEnter, byAdmin = hasKey(source, interiorID) if canEnter then -- house found found = interior foundpoint = point itemValue = interiorID minDistance = distance interiorName = getElementData(interior, "name") end end end end end -- For elevators already local possibleElevators = getElementsByType("elevator") for _, elevator in ipairs(possibleElevators) do local elevatorEntrance = getElementData(elevator, "entrance") local elevatorExit = getElementData(elevator, "exit") for _, point in ipairs( { elevatorEntrance, elevatorExit } ) do if (point[INTERIOR_DIM] == dimension) then local distance = getDistanceBetweenPoints3D(pPosX, pPosY, pPosZ, point[INTERIOR_X], point[INTERIOR_Y], point[INTERIOR_Z]) if (distance < minDistance) then if hasKey(source, elevatorEntrance[INTERIOR_DIM]) and elevatorEntrance[INTERIOR_DIM] ~= 0 then found = elevator foundpoint = point itemValue = elevatorEntrance[INTERIOR_DIM] minDistance = distance elseif hasKey(source, elevatorExit[INTERIOR_DIM]) and elevatorExit[INTERIOR_DIM] ~= 0 then found = elevator foundpoint = point itemValue = elevatorExit[INTERIOR_DIM] minDistance = distance end end end end end if (checkdistance) then return found, minDistance end if found and itemValue then local dbid, entrance, exit, interiorType, interiorElement = findProperty( source, itemValue ) local interiorStatus = getElementData(interiorElement, "status") local locked = interiorStatus[INTERIOR_LOCKED] and 1 or 0 locked = 1 - locked -- Invert status local newRealLockedValue = false mysql:query_free("UPDATE interiors SET locked='" .. mysql:escape_string(locked) .. "' WHERE id='" .. mysql:escape_string(itemValue) .. "' LIMIT 1") if locked == 0 then doorUnlockSound(interiorElement) if byAdmin then if getElementData(source, "hiddenadmin") == 0 then local adminTitle = exports.global:getPlayerAdminTitle(source) local adminUsername = getElementData(source, "account:username") exports.global:sendMessageToAdmins("[INTERIOR]: "..adminTitle.." ".. getPlayerName(source):gsub("_", " ").. " ("..adminUsername..") has unlocked Interior ID #"..itemValue.." without key.") exports.global:sendLocalText(source, " * The door should be now open *", 255, 51, 102, 30, {}, true) exports["interior-manager"]:addInteriorLogs(itemValue, "unlock without key", source) end else exports.global:sendLocalMeAction(source, "puts the key in the door to unlock it.") end exports.logs:dbLog(source, 31, { "in"..tostring(itemValue) }, "UNLOCK INTERIOR") else --:~ doorLockSound(interiorElement) newRealLockedValue = true if byAdmin then if getElementData(source, "hiddenadmin") == 0 then local adminTitle = exports.global:getPlayerAdminTitle(source) local adminUsername = getElementData(source, "account:username") exports.global:sendMessageToAdmins("[INTERIOR]: "..adminTitle.." ".. getPlayerName(source):gsub("_", " ").. " ("..adminUsername..") has locked Interior ID #"..itemValue.." without key.") exports.global:sendLocalText(source, " * The door should be now locked *", 255, 51, 102, 30, {}, true) exports["interior-manager"]:addInteriorLogs(itemValue, "lock without key", source) end else exports.global:sendLocalMeAction(source, "puts the key in the door to lock it.") end exports.logs:dbLog(source, 31, { "in"..tostring(itemValue) }, "LOCK INTERIOR") end interiorStatus[INTERIOR_LOCKED] = newRealLockedValue exports['anticheat-system']:changeProtectedElementDataEx(interiorElement, "status", interiorStatus, true) else cancelEvent( ) end end addEvent( "lockUnlockHouse",false ) addEventHandler( "lockUnlockHouse", getRootElement(), lockUnlockHouseEvent) function doorUnlockSound(house) if (house) then if (getElementType(house) == "interior") then local interiorEntrance = getElementData(house, "entrance") local interiorExit = getElementData(house, "exit") for index, nearbyPlayer in ipairs(getElementsByType("player")) do if isElement(nearbyPlayer) then if ((getDistanceBetweenPoints3D(interiorEntrance[INTERIOR_X], interiorEntrance[INTERIOR_Y], interiorEntrance[INTERIOR_Z], getElementPosition(nearbyPlayer)) < 20) and getElementDimension(nearbyPlayer) == interiorEntrance[INTERIOR_DIM]) or ((getDistanceBetweenPoints3D(interiorExit[INTERIOR_X], interiorExit[INTERIOR_Y], interiorExit[INTERIOR_Z], getElementPosition(nearbyPlayer)) < 20) and getElementDimension(nearbyPlayer) == interiorExit[INTERIOR_DIM]) then local logged = getElementData(nearbyPlayer, "loggedin") if logged == 1 then triggerClientEvent(nearbyPlayer, "doorUnlockSound", source) end end end end else -- It would be 0 local found = nil local minDistance = 20 local pPosX, pPosY, pPosZ = getElementPosition(source) local dimension = getElementDimension(source) local possibleInteriors = getElementsByType("interior") for _, interior in ipairs(possibleInteriors) do local interiorEntrance = getElementData(interior, "entrance") local interiorExit = getElementData(interior, "exit") for _, point in ipairs( { interiorEntrance, interiorExit } ) do if (point[INTERIOR_DIM] == dimension) then local distance = getDistanceBetweenPoints3D(pPosX, pPosY, pPosZ, point[INTERIOR_X], point[INTERIOR_Y], point[INTERIOR_Z]) or 20 if (distance < minDistance) then found = interior minDistance = distance end end end end end if found then triggerEvent("doorUnlockSound", source, found) end end end function doorLockSound(house) if (house) then if (getElementType(house) == "interior") then local interiorEntrance = getElementData(house, "entrance") local interiorExit = getElementData(house, "exit") for index, nearbyPlayer in ipairs(getElementsByType("player")) do if isElement(nearbyPlayer) then if ((getDistanceBetweenPoints3D(interiorEntrance[INTERIOR_X], interiorEntrance[INTERIOR_Y], interiorEntrance[INTERIOR_Z], getElementPosition(nearbyPlayer)) < 20) and getElementDimension(nearbyPlayer) == interiorEntrance[INTERIOR_DIM]) or ((getDistanceBetweenPoints3D(interiorExit[INTERIOR_X], interiorExit[INTERIOR_Y], interiorExit[INTERIOR_Z], getElementPosition(nearbyPlayer)) < 20) and getElementDimension(nearbyPlayer) == interiorExit[INTERIOR_DIM]) then local logged = getElementData(nearbyPlayer, "loggedin") if logged == 1 then triggerClientEvent(nearbyPlayer, "doorLockSound", source) end end end end else -- It would be 0 local found = nil local minDistance = 20 local pPosX, pPosY, pPosZ = getElementPosition(source) local dimension = getElementDimension(source) local possibleInteriors = getElementsByType("interior") for _, interior in ipairs(possibleInteriors) do local interiorEntrance = getElementData(interior, "entrance") local interiorExit = getElementData(interior, "exit") for _, point in ipairs( { interiorEntrance, interiorExit } ) do if (point[INTERIOR_DIM] == dimension) then local distance = getDistanceBetweenPoints3D(pPosX, pPosY, pPosZ, point[INTERIOR_X], point[INTERIOR_Y], point[INTERIOR_Z]) or 20 if (distance < minDistance) then found = interior minDistance = distance end end end end end if found then triggerEvent("doorLockSound", source, found) end end end function doorGoThru(house) if (house) then if (getElementType(house) == "interior") then local interiorEntrance = getElementData(house, "entrance") local interiorExit = getElementData(house, "exit") for index, nearbyPlayer in ipairs(getElementsByType("player")) do if isElement(nearbyPlayer) then if ((getDistanceBetweenPoints3D(interiorEntrance[INTERIOR_X], interiorEntrance[INTERIOR_Y], interiorEntrance[INTERIOR_Z], getElementPosition(nearbyPlayer)) < 20) and getElementDimension(nearbyPlayer) == interiorEntrance[INTERIOR_DIM]) or ((getDistanceBetweenPoints3D(interiorExit[INTERIOR_X], interiorExit[INTERIOR_Y], interiorExit[INTERIOR_Z], getElementPosition(nearbyPlayer)) < 20) and getElementDimension(nearbyPlayer) == interiorExit[INTERIOR_DIM]) then local logged = getElementData(nearbyPlayer, "loggedin") if logged == 1 then triggerClientEvent(nearbyPlayer, "doorGoThru", source) end end end end else -- It would be 0 local found = nil local minDistance = 20 local pPosX, pPosY, pPosZ = getElementPosition(source) local dimension = getElementDimension(source) local possibleInteriors = getElementsByType("interior") for _, interior in ipairs(possibleInteriors) do local interiorEntrance = getElementData(interior, "entrance") local interiorExit = getElementData(interior, "exit") for _, point in ipairs( { interiorEntrance, interiorExit } ) do if (point[INTERIOR_DIM] == dimension) then local distance = getDistanceBetweenPoints3D(pPosX, pPosY, pPosZ, point[INTERIOR_X], point[INTERIOR_Y], point[INTERIOR_Z]) or 20 if (distance < minDistance) then found = interior minDistance = distance end end end end end if found then triggerEvent("doorGoThru", source, found) end end end addEvent( "lockUnlockHouseID",true ) addEventHandler( "lockUnlockHouseID", getRootElement(), function( id ) local hasKey1, byAdmin = hasKey(source, id) if id and tonumber(id) and hasKey1 then local result = mysql:query_fetch_assoc( "SELECT 1-locked as 'val' FROM interiors WHERE id = " .. id) local locked = 0 if result then locked = tonumber( result["val"] ) end local newRealLockedValue = false mysql:query_free("UPDATE interiors SET locked='" .. locked .. "' WHERE id='" .. id .. "' LIMIT 1") if locked == 0 then if byAdmin then if getElementData(source, "hiddenadmin") == 0 then local adminTitle = exports.global:getPlayerAdminTitle(source) local adminUsername = getElementData(source, "account:username") exports.global:sendMessageToAdmins("[INTERIOR]: "..adminTitle.." ".. getPlayerName(source):gsub("_", " ").. " ("..adminUsername..") has unlocked Interior ID #"..id.." without key.") exports.global:sendLocalText(source, " * The door should be now open *", 255, 51, 102, 30, {}, true) exports["interior-manager"]:addInteriorLogs(id, "unlock without key", source) end else exports.global:sendLocalMeAction(source, "puts the key in the door to unlock it.") end exports.logs:dbLog(source, 31, { "in"..tostring(id) }, "UNLOCK INTERIOR") else newRealLockedValue = true if byAdmin then if getElementData(source, "hiddenadmin") == 0 then local adminTitle = exports.global:getPlayerAdminTitle(source) local adminUsername = getElementData(source, "account:username") exports.global:sendMessageToAdmins("[INTERIOR]: "..adminTitle.." ".. getPlayerName(source):gsub("_", " ").. " ("..adminUsername..") has locked Interior ID #"..id.." without key.") exports.global:sendLocalText(source, " * The door should be now closed *", 255, 51, 102, 30, {}, true) exports["interior-manager"]:addInteriorLogs(id, "lock without key", source) end else exports.global:sendLocalMeAction(source, "puts the key in the door to lock it.") end exports.logs:dbLog(source, 31, { "in"..tostring(id) }, "LOCK INTERIOR") end local dbid, entrance, exit, interiorType, interiorElement = findProperty( source, id ) if interiorElement then local interiorStatus = getElementData(interiorElement, "status") interiorStatus[INTERIOR_LOCKED] = newRealLockedValue exports['anticheat-system']:changeProtectedElementDataEx(interiorElement, "status", interiorStatus, true) end else cancelEvent( ) end end ) function findParent( element, dimension ) local dbid, entrance, exit, type, interiorElement = findProperty( element, dimension ) return interiorElement end addEventHandler("onPlayerInteriorChange", getRootElement( ), function( a, b, toDimension, toInterior) if toDimension then setElementDimension(source, toDimension) end if toInterior then setElementInterior(source, toInterior) end local vehicle = getPedOccupiedVehicle( source ) if not vehicle then --setPedGravity(source, 0) end triggerEvent("texture-system:loadCustomTextures", source) end ) function playerKnocking(house) if (house) then if isElement(house) and (getElementType(house) == "interior") then local interiorEntrance = getElementData(house, "entrance") local interiorExit = getElementData(house, "exit") for index, nearbyPlayer in ipairs(getElementsByType("player")) do if isElement(nearbyPlayer) then if ((getDistanceBetweenPoints3D(interiorEntrance[INTERIOR_X], interiorEntrance[INTERIOR_Y], interiorEntrance[INTERIOR_Z], getElementPosition(nearbyPlayer)) < 20) and getElementDimension(nearbyPlayer) == interiorEntrance[INTERIOR_DIM]) or ((getDistanceBetweenPoints3D(interiorExit[INTERIOR_X], interiorExit[INTERIOR_Y], interiorExit[INTERIOR_Z], getElementPosition(nearbyPlayer)) < 20) and getElementDimension(nearbyPlayer) == interiorExit[INTERIOR_DIM]) then local logged = getElementData(nearbyPlayer, "loggedin") if logged == 1 then triggerClientEvent(nearbyPlayer, "playerKnock", source) end end end end else -- It would be 0 local found = nil local minDistance = 20 local pPosX, pPosY, pPosZ = getElementPosition(source) local dimension = getElementDimension(source) local possibleInteriors = getElementsByType("interior") for _, interior in ipairs(possibleInteriors) do local interiorEntrance = getElementData(interior, "entrance") local interiorExit = getElementData(interior, "exit") for _, point in ipairs( { interiorEntrance, interiorExit } ) do if (point[INTERIOR_DIM] == dimension) then local distance = getDistanceBetweenPoints3D(pPosX, pPosY, pPosZ, point[INTERIOR_X], point[INTERIOR_Y], point[INTERIOR_Z]) or 20 if (distance < minDistance) then found = interior minDistance = distance end end end end end if found then triggerEvent("onKnocking", source, found) end end end addEvent("onKnocking", true) addEventHandler("onKnocking", getRootElement(), playerKnocking) function client_requestHUDinfo() -- Client = client -- Source = interior element if not isElement(source) or (getElementType(source) ~= "interior" and getElementType(source) ~= "elevator") then return end exports['anticheat-system']:changeProtectedElementDataEx( client, "interiormarker", true, false, false ) local interiorID, interiorName, interiorStatus, interiorEntrance, interiorExit = nil if getElementType(source) == "elevator" then local playerDimension = getElementDimension(client) local elevatorEntranceDimension = getElementData(source, "entrance")[INTERIOR_DIM] local elevatorExitDimension = getElementData(source, "exit")[INTERIOR_DIM] if playerDimension ~= elevatorEntranceDimension and elevatorEntranceDimension ~= 0 then local dbid, entrance, exit, type, interiorElement = findProperty( client, elevatorEntranceDimension ) if dbid and interiorElement then interiorID = getElementData(interiorElement, "dbid") interiorName = getElementData(interiorElement,"name") interiorStatus = getElementData(interiorElement, "status") interiorEntrance = getElementData(interiorElement, "entrance") interiorExit = getElementData(interiorElement, "exit") end elseif elevatorExitDimension ~= 0 then local dbid, entrance, exit, type, interiorElement = findProperty( client, elevatorExitDimension ) if dbid and interiorElement then interiorID = getElementData(interiorElement, "dbid") interiorName = getElementData(interiorElement,"name") interiorStatus = getElementData(interiorElement, "status") interiorEntrance = getElementData(interiorElement, "entrance") interiorExit = getElementData(interiorElement, "exit") end end if not dbid then interiorID = -1 interiorName = "None" interiorStatus = { } interiorEntrance = { } interiorStatus[INTERIOR_TYPE] = 2 interiorStatus[INTERIOR_COST] = 0 interiorStatus[INTERIOR_OWNER] = -1 interiorEntrance[INTERIOR_FEE] = 0 end else interiorName = getElementData(source,"name") interiorStatus = getElementData(source, "status") interiorEntrance = getElementData(source, "entrance") interiorExit = getElementData(source, "exit") end local interiorOwnerName = exports['cache']:getCharacterName(interiorStatus[INTERIOR_OWNER]) or "None" local interiorType = interiorStatus[INTERIOR_TYPE] or 2 local interiorCost = interiorStatus[INTERIOR_COST] or 0 local interiorBizNote = getElementData(source, "business:note") or false triggerClientEvent(client, "displayInteriorName", source, interiorName or "Elevator", interiorOwnerName, interiorType or 2, interiorCost or 0, interiorID or -1, interiorBizNote) end addEvent("interior:requestHUD", true) addEventHandler("interior:requestHUD", getRootElement(), client_requestHUDinfo) addEvent("int:updatemarker", true) addEventHandler("int:updatemarker", getRootElement(), function( newState ) exports['anticheat-system']:changeProtectedElementDataEx(client, "interiormarker", newState, false, true) -- No sync at all: function is only called from client thusfar has the actual state itself end ) --INTERIOR LIGHT BY MAXIME --[[function toggleInteriorLights(thePlayer, commandName) local playerInterior = getElementInterior(thePlayer) if (playerInterior==0) then outputChatBox("There is no light out here.", thePlayer, 255, 0, 0) else local possibleInteriors = getElementsByType("interior") for _, interior in ipairs(possibleInteriors) do if getElementData(interior, "dbid") == playerInterior then if getElementData(interior, "isLightOn") then setElementDataEx(interior, "isLightOn", false, true ) updateLight(false, playerInterior) exports.global:sendLocalText(thePlayer, "*"..getPlayerName(thePlayer):gsub("_", " ").." turns off the lights.", 255, 51, 102, 30, {}, true) local mQuery1 = mysql:query_free("UPDATE `interiors` SET `isLightOn` = '0' WHERE `id` = '"..tostring(playerInterior).."'") if not mQuery1 then outputDebugString("[SQL] Failed to update interior light status") end break else setElementDataEx(interior, "isLightOn", true, true ) updateLight(true, playerInterior) exports.global:sendLocalText(thePlayer, "*"..getPlayerName(thePlayer):gsub("_", " ").." turns on the lights.", 255, 51, 102, 30, {}, true) local mQuery1 = mysql:query_free("UPDATE `interiors` SET `isLightOn` = '1' WHERE `id` = '"..tostring(playerInterior).."'") if not mQuery1 then outputDebugString("[SQL] Failed to update interior light status") end break end end end end end addCommandHandler("toglight", toggleInteriorLights) addCommandHandler("togglelight", toggleInteriorLights) function updateLight(status, playerInterior) local possiblePlayers = getElementsByType("player") for _, player in ipairs(possiblePlayers) do if getElementInterior(player) == playerInterior then triggerClientEvent ( player, "updateLightStatus", player, status ) end end end addEvent("setInteriorLight", true) addEventHandler("setInteriorLight", getRootElement(), updateLight) ]] and this is interior system.lua client based. gInteriorName, gOwnerName, gBuyMessage, gBizMessage = nil timer = nil intNameFont = guiCreateFont( "intNameFont.ttf", 30 ) --AngryBird BizNoteFont = guiCreateFont( "BizNote.ttf", 21 ) -- Message on enter function showIntName(name, ownerName, inttype, cost, ID, bizMsg) bizMessage = bizMsg if (isElement(gInteriorName) and guiGetVisible(gInteriorName)) then if isTimer(timer) then killTimer(timer) timer = nil end destroyElement(gInteriorName) gInteriorName = nil if isElement(gOwnerName) then destroyElement(gOwnerName) gOwnerName = nil end if (gBuyMessage) then destroyElement(gBuyMessage) gBuyMessage = nil end if (gBizMessage) then destroyElement(gBizMessage) gBizMessage = nil end end if name == "None" then return elseif name then if (inttype==3) then -- Interior name and Owner for rented gInteriorName = guiCreateLabel(0.0, 0.84, 1.0, 0.3, tostring(name), true) guiSetFont(gInteriorName,intNameFont) guiLabelSetHorizontalAlign(gInteriorName, "center", true) --guiSetAlpha(gInteriorName, 0.0) if (exports.global:isPlayerAdmin(getLocalPlayer()) and getElementData(getLocalPlayer(), "adminduty") == 1) or exports.global:hasItem(getLocalPlayer(), 4, ID) then gOwnerName = guiCreateLabel(0.0, 0.90, 1.0, 0.3, "Rented by: " .. tostring(ownerName), true) guiSetFont(gOwnerName, "default") guiLabelSetHorizontalAlign(gOwnerName, "center", true) --guiSetAlpha(gOwnerName, 0.0) end else -- Interior name and Owner for the rest --outputDebugString((name or "nil").." - "..(tostring(bizMsg) or "nil")) if bizMessage then gInteriorName = guiCreateLabel(0.0, 0.80, 1.0, 0.3, tostring(name), true) gBizMessage = guiCreateLabel(0.0, 0.864, 1.0, 0.3, tostring(bizMessage), true) guiLabelSetHorizontalAlign(gBizMessage, "center", true) --guiSetAlpha(gBizMessage, 0.0) guiSetFont(gBizMessage, BizNoteFont) else gInteriorName = guiCreateLabel(0.0, 0.84, 1.0, 0.3, tostring(name), true) end guiSetFont(gInteriorName, intNameFont) guiLabelSetHorizontalAlign(gInteriorName, "center", true) --guiSetAlpha(gInteriorName, 0.0) if (exports.global:isPlayerAdmin(getLocalPlayer()) and getElementData(getLocalPlayer(), "adminduty") == 1) or exports.global:hasItem(getLocalPlayer(), 4, ID) or exports.global:hasItem(getLocalPlayer(), 5, ID) then gOwnerName = guiCreateLabel(0.0, 0.90, 1.0, 0.3, "Owner: " .. tostring(ownerName), true) guiSetFont(gOwnerName, "default") guiLabelSetHorizontalAlign(gOwnerName, "center", true) --guiSetAlpha(gOwnerName, 0.0) end end if (ownerName=="None") and (inttype==3) then -- Unowned type 3 (rentable) gBuyMessage = guiCreateLabel(0.0, 0.915, 1.0, 0.3, "Press F to rent for $" .. tostring(exports.global:formatMoney(cost)) .. ".", true) guiSetFont(gBuyMessage, "default") guiLabelSetHorizontalAlign(gBuyMessage, "center", true) --guiSetAlpha(gBuyMessage, 0.0) elseif (ownerName=="None") and (inttype<2) then -- Unowned any other type gBuyMessage = guiCreateLabel(0.0, 0.915, 1.0, 0.3, "Press F to buy for $" .. tostring(exports.global:formatMoney(cost)) .. ".", true) guiSetFont(gBuyMessage, "default") guiLabelSetHorizontalAlign(gBuyMessage, "center", true) --guiSetAlpha(gBuyMessage, 0.0) else local msg = "Press F to enter." --[[if fee and fee > 0 then msg = "Entrance Fee: $" .. exports.global:formatMoney(fee) if exports.global:hasMoney( getLocalPlayer(), fee ) then msg = msg .. "\nPress F to enter." end end]] gBuyMessage = guiCreateLabel(0.0, 0.915, 1.0, 0.3, msg, true) guiSetFont(gBuyMessage, "default") guiLabelSetHorizontalAlign(gBuyMessage, "center", true) --guiSetAlpha(gBuyMessage, 0.0) end setTimer(function() destroyElement(gInteriorName) gInteriorName = nil if isElement(gOwnerName) then destroyElement(gOwnerName) gOwnerName = nil end if (gBuyMessage) then destroyElement(gBuyMessage) gBuyMessage = nil end if (gBizMessage) then destroyElement(gBizMessage) gBizMessage = nil end end, 3000, 1) --timer = setTimer(fadeMessage, 50, 20, true) end end function fadeMessage(fadein) local alpha = guiGetAlpha(gInteriorName) if (fadein) and (alpha) then local newalpha = alpha + 0.05 guiSetAlpha(gInteriorName, newalpha) if isElement(gOwnerName) then guiSetAlpha(gOwnerName, newalpha) end if (gBuyMessage) then guiSetAlpha(gBuyMessage, newalpha) end if gBizMessage then guiSetAlpha(gBizMessage, newalpha) end if(newalpha>=1.0) then timer = setTimer(hideIntName, 5000, 1) end elseif (alpha) then local newalpha = alpha - 0.05 guiSetAlpha(gInteriorName, newalpha) if isElement(gOwnerName) then guiSetAlpha(gOwnerName, newalpha) end if (gBuyMessage) then guiSetAlpha(gBuyMessage, newalpha) end if (gBizMessage) then guiSetAlpha(gBizMessage, newalpha) end if(newalpha<=0.0) then destroyElement(gInteriorName) gInteriorName = nil if isElement(gOwnerName) then destroyElement(gOwnerName) gOwnerName = nil end if (gBuyMessage) then destroyElement(gBuyMessage) gBuyMessage = nil end if (gBizMessage) then destroyElement(gBizMessage) gBizMessage = nil end end end end function hideIntName() setTimer(fadeMessage, 50, 20, false) end addEvent("displayInteriorName", true ) addEventHandler("displayInteriorName", getRootElement(), showIntName) -- Creation of clientside blips function createBlipsFromTable(interiors) -- remove existing house blips for key, value in ipairs(getElementsByType("blip")) do local blipicon = getBlipIcon(value) if (blipicon == 31 or blipicon == 32) then destroyElement(value) end end -- spawn the new ones for key, value in ipairs(interiors) do createBlipAtXY(interiors[key][1], interiors[key][2], interiors[key][3]) end end addEvent("createBlipsFromTable", true) addEventHandler("createBlipsFromTable", getRootElement(), createBlipsFromTable) function createBlipAtXY(inttype, x, y) if inttype == 3 then inttype = 0 end createBlip(x, y, 10, 31+inttype, 2, 255, 0, 0, 255, 0, 300) end addEvent("createBlipAtXY", true) addEventHandler("createBlipAtXY", getRootElement(), createBlipAtXY) function removeBlipAtXY(inttype, x, y) if inttype == 3 or type(inttype) ~= 'number' then inttype = 0 end for key, value in ipairs(getElementsByType("blip")) do local bx, by, bz = getElementPosition(value) local icon = getBlipIcon(value) if (icon==31+inttype and bx==x and by==y) then destroyElement(value) break end end end addEvent("removeBlipAtXY", true) addEventHandler("removeBlipAtXY", getRootElement(), removeBlipAtXY) ------ local wBizNote, wRightClick, ax, ay = nil local house = nil local houseID = nil local sx, sy = guiGetScreenSize( ) function showHouseMenu( ) guiSetInputEnabled(true) showCursor(true) ax = math.max( math.min( sx - 160, ax - 75 ), 10 ) ay = math.max( math.min( sx - 210, ay - 100 ), 10 ) wRightClick = guiCreateWindow(ax, ay, 150, 200, (getElementData(house, "name") or ("Interior ID #"..tostring( houseID ))), false) guiWindowSetSizable(wRightClick, false) bLock = guiCreateButton(0.05, 0.13, 0.9, 0.1, "Lock/Unlock", true, wRightClick) addEventHandler("onClientGUIClick", bLock, lockUnlockHouse, false) bKnock = guiCreateButton(0.05, 0.27, 0.9, 0.1, "Knock on Door", true, wRightClick) addEventHandler("onClientGUIClick", bKnock, knockHouse, false) if hasKey(houseID) then bBizNote = guiCreateButton(0.05, 0.41, 0.9, 0.1, "Edit Greeting Msg", true, wRightClick) addEventHandler("onClientGUIClick", bBizNote, function() local width, height = 506, 103 local sx, sy = guiGetScreenSize() local posX = (sx/2)-(width/2) local posY = (sy/2)-(height/2) wBizNote = guiCreateWindow(posX,posY,width,height,"Edit Business Greeting Message - "..(getElementData(house, "name") or ("Interior ID #"..tostring( houseID ))),false) local eBizNote = guiCreateEdit(9,22,488,40,"",false,wBizNote) local bRemove = guiCreateButton(9,68,163,28,"Remove",false,wBizNote) local bSave = guiCreateButton(172,68,163,28,"Save",false,wBizNote) local bCancel = guiCreateButton(335,68,163,28,"Cancel",false,wBizNote) addEventHandler("onClientGUIClick", bRemove, function() if triggerServerEvent("businessSystem:setBizNote", getLocalPlayer(), getLocalPlayer(), houseID) then hideHouseMenu() end end, false) addEventHandler("onClientGUIClick", bSave, function() if triggerServerEvent("businessSystem:setBizNote", getLocalPlayer(), getLocalPlayer(), houseID, guiGetText(eBizNote)) then hideHouseMenu() end end, false) addEventHandler("onClientGUIClick", bCancel, function() if wBizNote then destroyElement(wBizNote) wBizNote = nil end end, false) end, false) bCloseMenu = guiCreateButton(0.05, 0.55, 0.9, 0.1, "Close Menu", true, wRightClick) else bCloseMenu = guiCreateButton(0.05, 0.41, 0.9, 0.1, "Close Menu", true, wRightClick) end addEventHandler("onClientGUIClick", bCloseMenu, hideHouseMenu, false) end local lastKnocked = 0 function knockHouse() local tick = getTickCount( ) if tick - lastKnocked > 5000 then triggerServerEvent("onKnocking", getLocalPlayer(), house) hideHouseMenu() lastKnocked = tick else outputChatBox("Please wait a bit before knocking again.", 255, 0, 0) end end function lockUnlockHouse( ) local tick = getTickCount( ) if tick - lastKnocked > 2000 then local px, py, pz = getElementPosition(getLocalPlayer()) local interiorEntrance = getElementData(house, "entrance") local interiorExit = getElementData(house, "exit") local x, y, z = getElementPosition(house) if getDistanceBetweenPoints3D(interiorEntrance[INTERIOR_X], interiorEntrance[INTERIOR_Y], interiorEntrance[INTERIOR_Z], px, py, pz) < 5 then triggerServerEvent( "lockUnlockHouseID", getLocalPlayer( ), houseID ) elseif getDistanceBetweenPoints3D(interiorExit[INTERIOR_X], interiorExit[INTERIOR_Y], interiorExit[INTERIOR_Z], px, py, pz) < 5 then triggerServerEvent( "lockUnlockHouseID", getLocalPlayer( ), houseID ) end hideHouseMenu() end end function hideHouseMenu( ) if wRightClick then destroyElement( wRightClick ) wRightClick = nil showCursor( false ) end if wBizNote then destroyElement(wBizNote) wBizNote = nil end house = nil houseID = nil guiSetInputEnabled(false) showCursor(false) end -- local function hasKey( key ) -- return exports.global:hasItem(getLocalPlayer(), 4, key) or exports.global:hasItem(getLocalPlayer(), 5,key) -- end function hasKey( key ) if exports.global:hasItem(getLocalPlayer(), 4, key) or exports.global:hasItem(getLocalPlayer(), 5,key) then return true, false else if getElementData(getLocalPlayer(), "adminduty") == 1 then return true, true else return false, false end end return false, false end function clickHouse(button, state, absX, absY, wx, wy, wz, e) if (button == "right") and (state=="down") and not e then if getElementData(getLocalPlayer(), "exclusiveGUI") then return end local element, id = nil, nil local px, py, pz = getElementPosition(getLocalPlayer()) local x, y, z = nil local interiorres = getResourceRootElement(getResourceFromName("interior-system")) local elevatorres = getResourceRootElement(getResourceFromName("elevator-system")) for key, value in ipairs(getElementsByType("pickup")) do if isElementStreamedIn(value) then x, y, z = getElementPosition(value) local minx, miny, minz, maxx, maxy, maxz local offset = 4 minx = x - offset miny = y - offset minz = z - offset maxx = x + offset maxy = y + offset maxz = z + offset if (wx >= minx and wx <=maxx) and (wy >= miny and wy <=maxy) and (wz >= minz and wz <=maxz) then local dbid = getElementData(getElementParent( value ), "dbid") if getElementType(getElementParent( value )) == "interior" then -- house found element = getElementParent( value ) id = dbid break elseif getElementType(getElementParent( value ) ) == "elevator" then -- it's an elevator if getElementData(value, "dim") and getElementData(value, "dim") ~= 0 then element = getElementParent( value ) id = getElementData(value, "dim") break elseif getElementData( getElementData( value, "other" ), "dim") and getElementData( getElementData( value, "other" ), "dim") ~= 0 then element = value id = getElementData( getElementData( value, "other" ), "dim") break end end end end end if element then if getDistanceBetweenPoints3D(x, y, z, px, py, pz) < 5 then ax, ay = getScreenFromWorldPosition(x, y, z, 0, false) if ax then hideHouseMenu() house = element houseID = id showHouseMenu() end else outputChatBox("You are too far away from this house.", 255, 0, 0) end else hideHouseMenu() end end end addEventHandler("onClientClick", getRootElement(), clickHouse, true) addEvent("playerKnock", true) addEventHandler("playerKnock", root, function() outputChatBox(" * Knocks can be heard coming from the door. * ((" .. getPlayerName(source):gsub("_"," ") .. "))", 255, 51, 102) playSound("knocking.mp3") end ) addEvent("doorUnlockSound", true) addEventHandler("doorUnlockSound", root, function() --outputChatBox(" * Knocks can be heard coming from the door. * ((" .. getPlayerName(source):gsub("_"," ") .. "))", 255, 51, 102) playSound("doorUnlockSound.mp3") end ) addEvent("doorLockSound", true) addEventHandler("doorLockSound", root, function() --outputChatBox(" * Knocks can be heard coming from the door. * ((" .. getPlayerName(source):gsub("_"," ") .. "))", 255, 51, 102) playSound("doorLockSound.mp3") end ) addEvent("doorGoThru", true) addEventHandler("doorGoThru", root, function() --outputChatBox(" * Knocks can be heard coming from the door. * ((" .. getPlayerName(source):gsub("_"," ") .. "))", 255, 51, 102) playSound("doorGoThru.mp3") end ) local cache = { } function findProperty(thePlayer, dimension) local dbid = dimension or getElementDimension( thePlayer ) if dbid > 0 then if cache[ dbid ] then return unpack( cache[ dbid ] ) end -- find the entrance and exit local entrance, exit = nil, nil for key, value in pairs(getElementsByType( "pickup", getResourceRootElement() )) do if getElementData(value, "dbid") == dbid then entrance = value break end end if entrance then cache[ dbid ] = { dbid, entrance } return dbid, entrance end end cache[ dbid ] = { 0 } return 0 end function findParent( element, dimension ) local dbid, entrance = findProperty( element, dimension ) return entrance end -- local inttimer = nil addEvent( "setPlayerInsideInterior", true ) addEventHandler( "setPlayerInsideInterior", getRootElement( ), function( targetLocation, targetInterior) if inttimer then return end if targetLocation[INTERIOR_DIM] ~= 0 then setGravity(0) end setElementFrozen(getLocalPlayer(), true) setElementPosition(getLocalPlayer(), targetLocation[INTERIOR_X], targetLocation[INTERIOR_Y], targetLocation[INTERIOR_Z], true) setElementInterior(getLocalPlayer(), targetLocation[INTERIOR_INT]) setCameraInterior(targetLocation[INTERIOR_INT]) setElementDimension(getLocalPlayer(), targetLocation[INTERIOR_DIM]) if targetLocation[INTERIOR_ANGLE] then setPedRotation(getLocalPlayer(), targetLocation[INTERIOR_ANGLE]) end triggerServerEvent("onPlayerInteriorChange", getLocalPlayer(), 0, 0, targetLocation[INTERIOR_DIM], targetLocation[INTERIOR_INT]) inttimer = setTimer(onPlayerPutInInteriorSecond, 1000, 1, targetLocation[INTERIOR_DIM], targetLocation[INTERIOR_INT]) engineSetAsynchronousLoading ( false, true ) -- if tonumber(targetLocation[INTERIOR_DIM]) == 0 then -- updateLightStatus(1) -- else --:~ -- outputDebugString(tostring(getElementData(targetInterior, "isLightOn"))) -- updateLightStatus(getElementData(targetInterior, "isLightOn")) -- outputChatBox("'/toglight' to switch on/off the lights in this interior") -- end local adminnote = tostring(getElementData(targetInterior, "adminnote")) if string.sub(tostring(adminnote),1,8) ~= "userdata" and adminnote ~= "\n" and getElementData(getLocalPlayer(), "adminduty") == 1 then outputChatBox("[INT MONITOR]: "..adminnote:gsub("\n", " ").."[..]", 255,0,0) outputChatBox("'/checkint "..getElementData(targetInterior, "dbid").." 'for details.",255,255,0) end end ) function onPlayerPutInInteriorSecond(dimension, interior) setCameraInterior(interior) local safeToSpawn = true if(getResourceFromName("object-system"))then safeToSpawn = exports['object-system']:isSafeToSpawn() end if (safeToSpawn) then inttimer = nil if isElement(getLocalPlayer()) then setTimer(onPlayerPutInInteriorThird, 1000, 1) end else setTimer(onPlayerPutInInteriorSecond, 1000, 1, dimension, interior) end end function onPlayerPutInInteriorThird() setGravity(0.008) setElementFrozen(getLocalPlayer(), false) engineSetAsynchronousLoading ( true, false ) end function cPKnock() if (getElementDimension(getLocalPlayer()) > 20000) then triggerServerEvent("onVehicleKnocking", getLocalPlayer()) else triggerServerEvent("onKnocking", getLocalPlayer(), 0) end end addCommandHandler("knock", cPKnock) local starttime = false local function updateIconAlpha( ) local time = getTickCount( ) - starttime -- if time > 20000 then -- removeIcon( ) -- else time = time % 1000 local alpha = 0 if time < 500 then alpha = time / 500 else alpha = 1 - ( time - 500 ) / 500 end guiSetAlpha(help_icon, alpha) guiSetAlpha(icon_label_shadow, alpha) guiSetAlpha(icon_label, alpha) --end end function showLoadingProgress(stats_numberOfInts, delayTime) if help_icon then removeIcon() end local title = stats_numberOfInts.." interiors(ETA: "..string.sub(tostring((tonumber(delayTime)-5000)/(60*1000)), 1, 3).." minutes) are being loaded. Don't panic if your house hasn't appeared yet. " local screenwidth, screenheight = guiGetScreenSize() help_icon = guiCreateStaticImage(screenwidth-25,6,20,20,"icon.png",false) icon_label_shadow = guiCreateLabel(screenwidth-829,11,800,20,title,false) guiSetFont(icon_label_shadow,"default-bold-small") guiLabelSetColor(icon_label_shadow,0,0,0) guiLabelSetHorizontalAlign(icon_label_shadow,"right",true) icon_label = guiCreateLabel(screenwidth-830,10,800,20,title,false) guiSetFont(icon_label,"default-bold-small") guiLabelSetHorizontalAlign(icon_label,"right",true) starttime = getTickCount( ) updateIconAlpha( ) addEventHandler( "onClientRender", getRootElement( ), updateIconAlpha ) setTimer(function () if help_icon then removeIcon() end end, delayTime+10000 , 1) end addEvent("interior:showLoadingProgress",true) addEventHandler("interior:showLoadingProgress",getRootElement(),showLoadingProgress) --addCommandHandler("fu",showLoadingProgress) function removeIcon() removeEventHandler( "onClientRender", getRootElement( ), updateIconAlpha ) destroyElement(icon_label_shadow) destroyElement(icon_label) destroyElement(help_icon) icon_label_shadow, icon_label, help_icon = nil end Edited July 11, 2018 by amlein i dont added the codes before 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