-- ============================================================================ -- Sentinel Guard - Shared Utilities -- ============================================================================ -- Common utility functions used across the system local Utils = {} -- ============================================================================ -- Calculate distance between two points -- ============================================================================ function Utils.getDistance(x1, y1, z1, x2, y2, z2) if not x1 or not y1 or not z1 or not x2 or not y2 or not z2 then return 0 end local dx = x2 - x1 local dy = y2 - y1 local dz = z2 - z1 return math.sqrt(dx * dx + dy * dy + dz * dz) end -- ============================================================================ -- Calculate distance between two players -- ============================================================================ function Utils.getPlayerDistance(player1, player2) if not isElement(player1) or not isElement(player2) then return 0 end local x1, y1, z1 = getElementPosition(player1) local x2, y2, z2 = getElementPosition(player2) return Utils.getDistance(x1, y1, z1, x2, y2, z2) end -- ============================================================================ -- Get player speed -- ============================================================================ function Utils.getPlayerSpeed(player) if not isElement(player) or getElementType(player) ~= "player" then return 0 end local vx, vy, vz = getElementVelocity(player) if not vx or not vy or not vz then return 0 end return math.sqrt(vx * vx + vy * vy + vz * vz) end -- ============================================================================ -- Get vehicle speed -- ============================================================================ function Utils.getVehicleSpeed(vehicle) if not isElement(vehicle) or getElementType(vehicle) ~= "vehicle" then return 0 end local vx, vy, vz = getElementVelocity(vehicle) if not vx or not vy or not vz then return 0 end return math.sqrt(vx * vx + vy * vy + vz * vz) end -- ============================================================================ -- Convert speed to km/h -- ============================================================================ function Utils.speedToKmh(speed) return speed * 180 end -- ============================================================================ -- Convert speed to mph -- ============================================================================ function Utils.speedToMph(speed) return speed * 111.847 end -- ============================================================================ -- Check if player is in vehicle -- ============================================================================ function Utils.isPlayerInVehicle(player) if not isElement(player) or getElementType(player) ~= "player" then return false end return getPedOccupiedVehicle(player) ~= nil end -- ============================================================================ -- Get player vehicle -- ============================================================================ function Utils.getPlayerVehicle(player) if not isElement(player) or getElementType(player) ~= "player" then return nil end return getPedOccupiedVehicle(player) end -- ============================================================================ -- Check if player is dead -- ============================================================================ function Utils.isPlayerDead(player) if not isElement(player) or getElementType(player) ~= "player" then return false end return getElementHealth(player) <= 0 end -- ============================================================================ -- Get player health -- ============================================================================ function Utils.getPlayerHealth(player) if not isElement(player) or getElementType(player) ~= "player" then return 0 end return getElementHealth(player) end -- ============================================================================ -- Get player armor -- ============================================================================ function Utils.getPlayerArmor(player) if not isElement(player) or getElementType(player) ~= "player" then return 0 end return getPedArmor(player) end -- ============================================================================ -- Check if player is admin -- ============================================================================ function Utils.isPlayerAdmin(player) if not isElement(player) or getElementType(player) ~= "player" then return false end local account = getPlayerAccount(player) if not account or isGuestAccount(account) then return false end local accountName = getAccountName(account) return isObjectInACLGroup("user." .. accountName, aclGetGroup("Admin")) end -- ============================================================================ -- Format timestamp to readable date -- ============================================================================ function Utils.formatTimestamp(timestamp) return os.date("%Y-%m-%d %H:%M:%S", math.floor(timestamp / 1000)) end -- ============================================================================ -- Get current time formatted -- ============================================================================ function Utils.getCurrentTimeFormatted() return os.date("%Y-%m-%d %H:%M:%S") end -- ============================================================================ -- Get current timestamp -- ============================================================================ function Utils.getCurrentTimestamp() return getTickCount() end -- ============================================================================ -- Check if string is empty -- ============================================================================ function Utils.isEmpty(str) return str == nil or str == "" or str == false end -- ============================================================================ -- Trim string -- ============================================================================ function Utils.trim(str) if not str then return "" end return str:match("^%s*(.-)%s*$") end -- ============================================================================ -- Split string by delimiter -- ============================================================================ function Utils.split(str, delimiter) if not str or not delimiter then return {} end local result = {} local pattern = "([^" .. delimiter .. "]+)" for match in str:gmatch(pattern) do table.insert(result, match) end return result end -- ============================================================================ -- Join table with delimiter -- ============================================================================ function Utils.join(table, delimiter) if not table or not delimiter then return "" end return table.concat(table, delimiter) end -- ============================================================================ -- Check if value is in table -- ============================================================================ function Utils.isInTable(value, table) if not table then return false end for _, v in ipairs(table) do if v == value then return true end end return false end -- ============================================================================ -- Get table size -- ============================================================================ function Utils.getTableSize(table) if not table then return 0 end local count = 0 for _ in pairs(table) do count = count + 1 end return count end -- ============================================================================ -- Deep copy table -- ============================================================================ function Utils.deepCopy(table) if not table then return {} end local result = {} for k, v in pairs(table) do if type(v) == "table" then result[k] = Utils.deepCopy(v) else result[k] = v end end return result end -- ============================================================================ -- Merge tables -- ============================================================================ function Utils.mergeTables(table1, table2) if not table1 then table1 = {} end if not table2 then return table1 end for k, v in pairs(table2) do table1[k] = v end return table1 end -- ============================================================================ -- Check if player is in range -- ============================================================================ function Utils.isPlayerInRange(player, x, y, z, range) if not isElement(player) or getElementType(player) ~= "player" then return false end local px, py, pz = getElementPosition(player) local distance = Utils.getDistance(px, py, pz, x, y, z) return distance <= range end -- ============================================================================ -- Get player name -- ============================================================================ function Utils.getPlayerName(player) if not isElement(player) or getElementType(player) ~= "player" then return "Unknown" end return getPlayerName(player) end -- ============================================================================ -- Get player serial -- ============================================================================ function Utils.getPlayerSerial(player) if not isElement(player) or getElementType(player) ~= "player" then return "Unknown" end return getPlayerSerial(player) end -- ============================================================================ -- Get player IP -- ============================================================================ function Utils.getPlayerIP(player) if not isElement(player) or getElementType(player) ~= "player" then return "Unknown" end return getPlayerIP(player) end -- ============================================================================ -- Get player account -- ============================================================================ function Utils.getPlayerAccount(player) if not isElement(player) or getElementType(player) ~= "player" then return nil end local account = getPlayerAccount(player) if account and not isGuestAccount(account) then return getAccountName(account) end return nil end -- ============================================================================ -- Round number -- ============================================================================ function Utils.round(num, decimals) if not num then return 0 end decimals = decimals or 0 local multiplier = 10 ^ decimals return math.floor(num * multiplier + 0.5) / multiplier end -- ============================================================================ -- Check if number is valid -- ============================================================================ function Utils.isValidNumber(num) return type(num) == "number" and num == num and num ~= math.huge and num ~= -math.huge end return Utils