local imageloader; local Element = _G.Element or {}; local _type = type; local _assert = assert; local _ipairs = ipairs; local _getElementType = getElementType; local _getPlayerAccount = getPlayerAccount; local _getPlayerName = getPlayerName; local _getAccountName = getAccountName; local _isObjectInACLGroup = isObjectInACLGroup; local _aclGetGroup = aclGetGroup; local _isElement = isElement; local _getElementData = getElementData; local _getElementMatrix = getElementMatrix; local _getPedTask = getPedTask; local _isPedDoingGangDriveby = isPedDoingGangDriveby; local _getElementPosition = getElementPosition; local _getElementInterior = getElementInterior; local _getElementDimension = getElementDimension; local _getElementsWithinRange = getElementsWithinRange; local _getElementModel = getElementModel; local _setElementModel = setElementModel; local _getElementID = getElementID; local _setElementID = setElementID; local _createVehicle = createVehicle; local _createPed = createPed; local _createObject = createObject; local _createBuilding = createBuilding; local IDS_PEDS = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312 } local IDS_VEHICLES = { 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611 } local isDefaultObjectID = function(id) if id >= 30000 and id <= 30541 then return false end -- check if outside object id range if id < 321 or id > 18630 then return false end -- check if ids are unused/reserved for other purposes if id >= 374 and id <= 614 then return false end if id >= 11682 and id <= 12799 then return false end if id >= 15065 and id <= 15999 then return false end return true end local function isDefaultID(elementType, id) id = tonumber(id) if not id then return false end if not elementType then -- Check all IDs if isDefaultObjectID(id) then return true, 'object' end for i = 1, #IDS_PEDS do local id2 = IDS_PEDS[i] if id2 == id then return true, 'ped' end end for i = 1, #IDS_VEHICLES do local id2 = IDS_VEHICLES[i] if id2 == id then return true, 'vehicle' end end elseif elementType == "ped" or elementType == "player" then for i = 1, #IDS_PEDS do local id2 = IDS_PEDS[i] if id2 == id then return true, 'ped' end end elseif elementType == "object" or elementType == "pickup" then if isDefaultObjectID(id) then return true, 'object' end elseif elementType == "vehicle" then for i = 1, #IDS_VEHICLES do local id2 = IDS_VEHICLES[i] if id2 == id then return true, 'vehicle' end end end return false end -- Validator Functions -- function isElementValid(Target) if _type(Target) ~= 'userdata' then return false end if not _isElement(Target) then return false end return true end function isElementPlayer(Target) if _type(Target) ~= 'userdata' then return false end if not _isElement(Target) then return false end if _getElementType(Target) == 'player' then return true end return false end function isElementPed(Target) if _type(Target) ~= 'userdata' then return false end if not _isElement(Target) then return false end if _getElementType(Target) == 'ped' then return true end return false end function isElementVehicle(Target) if _type(Target) ~= 'userdata' then return false end if not _isElement(Target) then return false end if _getElementType(Target) == 'vehicle' then return true end return false end -- Player/Ped Functions -- function isElementInACL(Target, Acls) if not isElement(Target) or not Target:IsPlayer() then return false, 'Defina um jogador válido para a verificação.' end local account = Target:GetAccountName() if not account then return false end if Acls and type(Acls) == 'string' then Acls = { Acls } end if (account ~= 'guest') then if Acls and type(Acls) == 'table' then for _, v in _ipairs(Acls) do local Group = _aclGetGroup(v) if (Group and _isObjectInACLGroup('user.'..account, Group)) then return true, v end end end end return false end function isElementInData(Target, Datas) if not isElement(Target) or not Target:IsPlayer() then return false, 'Defina um jogador válido para a verificação.' end for _, v in _ipairs(Datas) do if _getElementData(Target, v) then return true, v end end return false end function getElementName(Target) if Target:IsPlayer() then local PlayerName = _getPlayerName(Target) return PlayerName and PlayerName:gsub('_', ' ') or 'N/A' elseif Target:IsPed() then local PedName = getElementID(Target) or tostring('ped:'..getElementModel(Target)) return PedName and PedName:gsub('_', ' ') or 'N/A' elseif Target:IsObject() then local ObjectName = getElementID(Target) or tostring('object:'..getElementModel(Target)) return ObjectName and ObjectName:gsub('_', ' ') or 'N/A' end return 'N/A' end function getElementAccountName(Target) if not isElement(Target) or not Target:IsPlayer() then return false, 'Defina um jogador válido para a verificação.' end local AccountName = _getAccountName(_getPlayerAccount(Target)) return AccountName and AccountName ~= 'guest' and AccountName or false end function getPlayerFromAccountName(AccountName) if _type(AccountName) ~= 'string' then return false, 'Defina um nome de conta válido para a verificação.' end for i, player in ipairs(getElementsByType('player')) do if isElement(player) and player:GetAccountName() == AccountName then return player end end return false end function getElementPositionFromElementOffset(Target, offX, offY, offZ) if (not isElement(Target)) then return 0, 0, 0 end local m = _getElementMatrix(Target) local x = offX * m[1][1] + offY * m[2][1] + offZ * m[3][1] + m[4][1] local y = offX * m[1][2] + offY * m[2][2] + offZ * m[3][2] + m[4][2] local z = offX * m[1][3] + offY * m[2][3] + offZ * m[3][3] + m[4][3] return x, y, z end function isElementAiming(Target) if not _isElement(Target) then return false end if not (Target:IsPed() or Target:IsPlayer()) then return false end return _getPedTask(Target, 'secondary', 0) == 'TASK_SIMPLE_USE_GUN' or _isPedDoingGangDriveby(Target) or false end function getElementNearestElement(Target, ElementType, Distance) if not _isElement(Target) then return false end if not Distance then Distance = 10 end local Result = false local Dist = nil local tx, ty, tz = _getElementPosition(Target) local _ElementType = _getElementType(Target) local tInterior = _getElementInterior(Target) local tDimension = _getElementDimension(Target) local Elements = getElementsWithinRange(tx, ty, tz, Distance, ElementType or _ElementType, tInterior, tDimension) or {} local get3D = type(getDistance3D) == 'function' and getDistance3D or getDistanceBetweenPoints3D; for i = 1, #Elements do local Element = Elements[i] if Element ~= Target then local x, y, z = _getElementPosition(Element) if not Dist then Result = Element Dist = get3D(tx, ty, tz, x, y, z) else local newDist = get3D(tx, ty, tz, x, y, z) if newDist <= Dist then Result = Element Dist = newDist end end end end return Result, Dist end function isElementDefaultID(Target) if not _isElement(Target) then return false end local _ID = _getElementID(Target) local MType, isRegex; if _type(_ID) == 'string' then MType, isRegex = _ID:match('^%s*["\']?(%a+):([%w_%-]+)["\']?%s*$') if isRegex then _ID = tonumber(isRegex) end end if not tonumber(_ID) then return true end local _ModelID = _getElementModel(Target) if _ModelID == _ID then return true end return isDefaultID(_getElementType(Target), _ID) end function isElementObject(Target) if _type(Target) ~= 'userdata' then return false end if not _isElement(Target) then return false end if _getElementType(Target) == 'object' then return true end return false end function isElementBuilding(Target) if _type(Target) ~= 'userdata' then return false end if not _isElement(Target) then return false end if _getElementType(Target) == 'building' then return true end return false end function createObject(Model, ...) local ModelType = _type(Model) _assert(ModelType == 'number' or ModelType == 'string', 'O modelo deve ser um número ou uma string ('..ModelType..')') local Resource = getResourceFromName('nc_models'); local models = Resource and getResourceState(Resource) == 'running' and exports['nc_models']; if not models then return _createObject(Model, ...) end local isNewModels, ErrorMessage, Data = models:isValidReplace(Model, 'object') if isNewModels then local _OBJECT = _createObject(Data.Parent, ...) if _isElement(_OBJECT) then _setElementID(_OBJECT, 'object:'..(ModelType == 'string' and Model or tostring(Model)):gsub('object:', '')) end return _OBJECT else return _createObject(Model, ...) end end function createBuilding(Model, ...) local ModelType = _type(Model) _assert(ModelType == 'number' or ModelType == 'string', 'O modelo deve ser um número ou uma string ('..ModelType..')') local Resource = getResourceFromName('nc_models'); local models = Resource and getResourceState(Resource) == 'running' and exports['nc_models']; if not models then return _createBuilding(Model, ...) end local isNewModels, ErrorMessage, Data = models:isValidReplace(Model, 'building') if isNewModels then local _BUILDING = _createBuilding(Data.Parent, ...) if isElement(_BUILDING) then _setElementID(_BUILDING, 'building:'..(ModelType == 'string' and Model or tostring(Model)):gsub('building:', '')) end return _BUILDING else return _createBuilding(Model, ...) end end function createPed(Model, ...) local ModelType = _type(Model) _assert(ModelType == 'number' or ModelType == 'string', 'O modelo deve ser um número ou uma string ('..ModelType..')') local Resource = getResourceFromName('nc_models'); local models = Resource and getResourceState(Resource) == 'running' and exports['nc_models']; if not models then return _createPed(Model, ...) end local isNewModels, ErrorMessage, Data = models:isValidReplace(Model, 'ped') if isNewModels then local _PED = _createPed(Data.Parent, ...) if _isElement(_PED) then _setElementID(_PED, 'ped:'..(ModelType == 'string' and Model or tostring(Model)):gsub('ped:', '')) end return _PED else return _createPed(Model, ...) end end function createVehicle(Model, ...) local ModelType = _type(Model) _assert(ModelType == 'number' or ModelType == 'string', 'O modelo deve ser um número ou uma string ('..ModelType..')') local Resource = getResourceFromName('nc_models'); local models = Resource and getResourceState(Resource) == 'running' and exports['nc_models']; if not models then return _createVehicle(Model, ...) end local isNewModels, ErrorMessage, Data = models:isValidReplace(Model, 'vehicle') if isNewModels then local _VEHICLE = _createVehicle(Parent, ...) if _isElement(_VEHICLE) then _setElementID(_VEHICLE, 'vehicle:'..(ModelType == 'string' and Model or tostring(Model)):gsub('vehicle:', '')) end return _VEHICLE else return _createVehicle(Model, ...) end end function setElementModel(Target, Model) assert(isElement(Target), 'Defina um elemento válido para a verificação.') assert(type(Model) == 'number' or type(Model) == 'string', 'O modelo deve ser um número ou uma string ('..type(Model)..')') local Resource = getResourceFromName('nc_models'); local models = Resource and getResourceState(Resource) == 'running' and exports['nc_models']; if not models then return _setElementModel(Target, Model) end local ElementType = _getElementType(Target) if ElementType == 'player' then ElementType = 'ped' end local ModelType = _type(Model) local isOutSideID = isDefaultID(ElementType, Model) if isOutSideID then if ElementType == 'object' then local isNewModels, ErrorMessage, Data = models:isValidReplace(Model, 'object') if isNewModels then return _setElementID(Target, 'object:'..(ModelType == 'string' and Model or tostring(Model)):gsub('object:', '')) end elseif ElementType == 'building' then local isNewModels, ErrorMessage, Data = models:isValidReplace(Model, 'building') if isNewModels then return _setElementID(Target, 'building:'..(ModelType == 'string' and Model or tostring(Model)):gsub('building:', '')) end elseif ElementType == 'ped' then local isNewModels, ErrorMessage, Data = models:isValidReplace(Model, 'ped') if isNewModels then return _setElementID(Target, 'ped:'..(ModelType == 'string' and Model or tostring(Model)):gsub('ped:', '')) end elseif ElementType == 'vehicle' then local isNewModels, ErrorMessage, Data = models:isValidReplace(Model, 'vehicle') if isNewModels then return _setElementID(Target, 'vehicle:'..(ModelType == 'string' and Model or tostring(Model)):gsub('vehicle:', '')) end else return false, 'O modelo não é válido para o elemento.' end end return _setElementModel(Target, Model) end if isOOPEnabled() then Element.IsBuilding = function (Target) return isElementBuilding(Target) end Element.IsObject = function (Target) return isElementObject(Target) end Element.IsPed = function (Target) return isElementPed(Target) end Element.IsPlayer = function (Target) return isElementPlayer(Target) end Element.IsVehicle = function (Target) return isElementVehicle(Target) end Element.IsDefaultID = function (Target) return isElementDefaultID(Target) end Element.IsValid = function (Target) return isElementValid(Target) end Element.GetName = function (Target) return getElementName(Target) end Element.GetAccountName = function (Target) return getElementAccountName(Target) end Element.GetPositionFromElementOffset = function (Target, offX, offY, offZ) return getElementPositionFromElementOffset(Target, offX, offY, offZ) end Element.IsAiming = function (Target) return isElementAiming(Target) end Element.GetNearestElement = function (Target, ElementType, Distance) return getElementNearestElement(Target, ElementType, Distance) end Element.IsInACL = function (Target, Acls) return isElementInACL(Target, Acls) end Element.IsInData = function (Target, Datas) return isElementInData(Target, Datas) end if _G.Object then _G.Object.create = function (Target, ...) return createObject(Target, ...) end end if _G.Building then _G.Building.create = function (Target, ...) return createBuilding(Target, ...) end end if _G.Ped then _G.Ped.create = function (Target, ...) return createPed(Target, ...) end end if _G.Vehicle then _G.Vehicle.create = function (Target, ...) return createVehicle(Target, ...) end end end _G._createObject = _createObject; _G._createBuilding = _createBuilding; _G._createPed = _createPed; _G._createVehicle = _createVehicle; return Element;