9 Commits

Author SHA1 Message Date
github-actions
b5fdd8a160 chore: bump version to v3.30.8 2025-05-15 22:26:37 +00:00
Edward
ba790f9830 feat(imports/getClosestPlayer): Implement ignorePlayerId on the server (#11)
Co-authored-by: Edward <24864616+Edward-Bakker@users.noreply.github.com>
2025-05-07 20:40:33 +02:00
Mats
9ec43862a2 chore(locales): update norwegian translation (#10) 2025-05-05 05:56:38 +02:00
ANTOND.
2d2575963d ci(create-release): bump version before running build script (#9) 2025-05-04 20:03:35 +02:00
uShifty
8039539158 feat(package/getNearbyVehicles): Implement getNearbyVehicles (#8) 2025-05-04 18:00:08 +02:00
Sergio
f59beb2af6 feat(imports/marker): Added invert property (#4)
MarkerType alias was replaced for an enum.
The type property in MarkerProps class is now optional, MarkerType or an integer (UpsideDownCone if missing).
The properties inside color are now defined as integers.
Added invert property, documented by CFX as drawOnEnts.
Added marker_mt metatable that stores default properties and draw method.

Signed-off-by: Sergio <89666307+feelfreetofee@users.noreply.github.com>
2025-05-04 17:59:18 +02:00
Zoo
ab0dac8fde chore(package/interface): add label to progressCircle (#2) 2025-05-04 17:59:02 +02:00
Zoo
4491ad3599 fix(zones/shared): ensure safe removal of zones from entering and exiting lists (#1)
Co-authored-by: toshko <toshko0003@gmail.com>
2025-05-04 17:58:50 +02:00
ANTOND.
a9728663ca ci(create-release): use github app token 2025-05-04 01:50:09 +02:00
13 changed files with 152 additions and 165 deletions

View File

@@ -1,10 +1,8 @@
const fs = require('fs');
const fxManifest = await Bun.file('./fxmanifest.lua').text();
const version = process.env.TGT_RELEASE_VERSION;
const newVersion = version.replace('v', '');
let newVersion = process.env.TGT_RELEASE_VERSION;
newVersion = newVersion.replace('v', '')
const manifestFile = fs.readFileSync('fxmanifest.lua', { encoding: 'utf8' });
const newFileContent = fxManifest.replace(/\bversion\s+(.*)$/gm, `version '${newVersion}'`);
const newFileContent = manifestFile.replace(/\bversion\s+(.*)$/gm, `version '${newVersion}'`);
fs.writeFileSync('fxmanifest.lua', newFileContent);
await Bun.write('./fxmanifest.lua', newFileContent);

View File

@@ -1,10 +1,6 @@
const fs = require('fs');
const packageJson = await Bun.file('./package/package.json').json();
const version = process.env.TGT_RELEASE_VERSION;
const newVersion = version.replace('v', '');
const newVersion = process.env.TGT_RELEASE_VERSION;
packageJson.version = newVersion.replace('v', '');
const packageFile = fs.readFileSync('package/package.json', { encoding: 'utf8' });
const newFileContent = packageFile.replace(/"version":\s+"(.*)",$/gm, `"version": "${newVersion}",`);
fs.writeFileSync('package/package.json', newFileContent);
await Bun.write('./package/package.json', JSON.stringify(packageJson, null, 2));

View File

@@ -7,44 +7,43 @@ on:
jobs:
create-release:
if: github.actor_id != 210085057
runs-on: ubuntu-latest
steps:
- name: Get latest code
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.repository.default_branch }}
- name: Install zip
run: sudo apt install zip
- name: Setup Bun
- name: Install Bun
uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Install package dependencies
run: bun install
working-directory: package
- name: Generate GitHub App token
id: app_token
uses: tibdex/github-app-token@v2
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Install web dependencies
run: bun install
working-directory: web
- name: Run web build script
run: bun run build
working-directory: web
- name: Get latest code
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ github.event.repository.default_branch }}
token: ${{ steps.app_token.outputs.token }}
- name: Bump package version
run: bun .github/actions/bump-package-version.js
run: bun run .github/actions/bump-package-version.js
env:
TGT_RELEASE_VERSION: ${{ github.ref_name }}
- name: Bump manifest version
run: bun .github/actions/bump-manifest-version.js
run: bun run .github/actions/bump-manifest-version.js
env:
TGT_RELEASE_VERSION: ${{ github.ref_name }}
- name: Push version bump change
uses: EndBug/add-and-commit@v9
with:
@@ -53,25 +52,23 @@ jobs:
default_author: github_actions
message: 'chore: bump version to ${{ github.ref_name }}'
- name: Update tag
uses: EndBug/latest-tag@v1
with:
ref: ${{ github.ref_name }}
- name: Publish package to npm registry
run: bun publish --access public
- name: Install package dependencies
run: bun install --frozen-lockfile
working-directory: package
env:
NPM_CONFIG_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Install zip
run: sudo apt install zip
- name: Install web dependencies
run: bun install --frozen-lockfile
working-directory: web
- name: Run web build script
run: bun run build
working-directory: web
- name: Bundle files
run: |
mkdir -p ./temp/ox_lib
mkdir -p ./temp/ox_lib/web/
mkdir -p ./temp/ox_lib/web
cp ./{LICENSE,README.md,fxmanifest.lua,init.lua} ./temp/ox_lib
cp -r ./{imports,resource,locales} ./temp/ox_lib
cp -r ./web/build ./temp/ox_lib/web/
@@ -79,11 +76,18 @@ jobs:
- name: Create release
uses: 'marvinpinto/action-automatic-releases@v1.2.1'
id: auto_release
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
prerelease: false
files: ox_lib.zip
- name: Update tag
uses: EndBug/latest-tag@v1
with:
ref: ${{ github.ref_name }}
- name: Publish package to npm registry
run: bun publish --access public
working-directory: package
env:
CI: false
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_CONFIG_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@@ -6,7 +6,7 @@ rdr3_warning 'I acknowledge that this is a prerelease build of RedM, and I am aw
name 'ox_lib'
author 'Overextended'
version '3.30.7'
version '3.30.8'
license 'LGPL-3.0-or-later'
repository 'https://github.com/communityox/ox_lib'
description 'A library of shared functions to utilise in other resources.'

View File

@@ -8,25 +8,29 @@
---@param coords vector3 The coords to check from.
---@param maxDistance? number The max distance to check.
---@param ignorePlayerId? number|false The player server ID to ignore.
---@return number? playerId
---@return number? playerPed
---@return vector3? playerCoords
function lib.getClosestPlayer(coords, maxDistance)
function lib.getClosestPlayer(coords, maxDistance, ignorePlayerId)
local players = GetActivePlayers()
local closestId, closestPed, closestCoords
maxDistance = maxDistance or 2.0
for i = 1, #players do
local playerId = players[i]
local playerPed = GetPlayerPed(playerId)
local playerCoords = GetEntityCoords(playerPed)
local distance = #(coords - playerCoords)
if distance < maxDistance then
maxDistance = distance
closestId = playerId
closestPed = playerPed
closestCoords = playerCoords
if not ignorePlayerId or playerId ~= ignorePlayerId then
local playerPed = GetPlayerPed(playerId)
local playerCoords = GetEntityCoords(playerPed)
local distance = #(coords - playerCoords)
if distance < maxDistance then
maxDistance = distance
closestId = playerId
closestPed = playerPed
closestCoords = playerCoords
end
end
end

View File

@@ -9,14 +9,8 @@
---@diagnostic disable: param-type-mismatch
lib.marker = {}
local defaultRotation = vector3(0, 0, 0)
local defaultDirection = vector3(0, 0, 0)
local defaultColor = { r = 255, g = 255, b = 255, a = 100 }
local defaultSize = { width = 2, height = 1 }
local defaultTextureDict = nil
local defaultTextureName = nil
local markerTypesMap = {
---@enum (key) MarkerType
local markerTypes = {
UpsideDownCone = 0,
VerticalCylinder = 1,
ThickChevronUp = 2,
@@ -63,58 +57,12 @@ local markerTypesMap = {
Unknown43 = 43,
}
---@alias MarkerType
---| "UpsideDownCone"
---| "VerticalCylinder"
---| "ThickChevronUp"
---| "ThinChevronUp"
---| "CheckeredFlagRect"
---| "CheckeredFlagCircle"
---| "VerticleCircle"
---| "PlaneModel"
---| "LostMCTransparent"
---| "LostMC"
---| "Number0"
---| "Number1"
---| "Number2"
---| "Number3"
---| "Number4"
---| "Number5"
---| "Number6"
---| "Number7"
---| "Number8"
---| "Number9"
---| "ChevronUpx1"
---| "ChevronUpx2"
---| "ChevronUpx3"
---| "HorizontalCircleFat"
---| "ReplayIcon"
---| "HorizontalCircleSkinny"
---| "HorizontalCircleSkinny_Arrow"
---| "HorizontalSplitArrowCircle"
---| "DebugSphere"
---| "DollarSign"
---| "HorizontalBars"
---| "WolfHead"
---| "QuestionMark"
---| "PlaneSymbol"
---| "HelicopterSymbol"
---| "BoatSymbol"
---| "CarSymbol"
---| "MotorcycleSymbol"
---| "BikeSymbol"
---| "TruckSymbol"
---| "ParachuteSymbol"
---| "Unknown41"
---| "SawbladeSymbol"
---| "Unknown43"
---@class MarkerProps
---@field type MarkerType | number
---@field type? MarkerType | integer
---@field coords { x: number, y: number, z: number }
---@field width? number
---@field height? number
---@field color? { r: number, g: number, b: number, a: number }
---@field color? { r: integer, g: integer, b: integer, a: integer }
---@field rotation? { x: number, y: number, z: number }
---@field direction? { x: number, y: number, z: number }
---@field bobUpAndDown? boolean
@@ -122,9 +70,25 @@ local markerTypesMap = {
---@field rotate? boolean
---@field textureDict? string
---@field textureName? string
---@field invert? boolean
---@param self MarkerProps
local function drawMarker(self)
local vector3_zero = vector3(0, 0, 0)
local marker_mt = {
type = 0,
width = 2.,
height = 1.,
color = {r = 255, g = 100, b = 0, a = 100},
rotation = vector3_zero,
direction = vector3_zero,
bobUpAndDown = false,
faceCamera = false,
rotate = false,
invert = false,
}
marker_mt.__index = marker_mt
function marker_mt:draw()
DrawMarker(
self.type,
self.coords.x, self.coords.y, self.coords.z,
@@ -132,40 +96,19 @@ local function drawMarker(self)
self.rotation.x, self.rotation.y, self.rotation.z,
self.width, self.width, self.height,
self.color.r, self.color.g, self.color.b, self.color.a,
self.bobUpAndDown, self.faceCamera, 2, self.rotate, self.textureDict, self.textureName, false)
self.bobUpAndDown, self.faceCamera, 2, self.rotate, self.textureDict, self.textureName, self.invert)
end
---@param options MarkerProps
function lib.marker.new(options)
local markerType
if type(options.type) == "string" then
markerType = markerTypesMap[options.type]
if markerType == nil then
error(("unknown marker type '%s'"):format(options.type))
end
elseif type(options.type) == "number" then
markerType = options.type
else
error(("expected marker type to have type 'string' or 'number' (received %s)"):format(type(options.type)))
end
options.type =
type(options.type) == 'string' and markerTypes[options.type]
or type(options.type) == 'number' and options.type or nil
local self = {}
self.type = markerType
self.coords = options.coords
self.color = options.color or defaultColor
self.width = options.width or defaultSize.width
self.height = options.height or defaultSize.height
self.rotation = options.rotation or defaultRotation
self.direction = options.direction or defaultDirection
self.bobUpAndDown = type(options.bobUpAndDown) == 'boolean' and options.bobUpAndDown
self.faceCamera = type(options.faceCamera) ~= 'boolean' or options.faceCamera
self.rotate = type(options.rotate) == 'boolean' and options.rotate
self.textureDict = options.textureDict or defaultTextureDict
self.textureName = options.textureName or defaultTextureName
self.draw = drawMarker
local self = setmetatable(options, marker_mt)
self.width += 0.0
self.height += 0.0
self.width += .0
self.height += .0
return self
end

View File

@@ -122,8 +122,15 @@ local function removeZone(zone)
insideZones[zone.id] = nil
table.remove(exitingZones, exitingZones:indexOf(zone))
table.remove(enteringZones, enteringZones:indexOf(zone))
local exitingIndex = exitingZones:indexOf(zone)
if exitingIndex then
table.remove(exitingZones, exitingIndex)
end
local enteringIndex = enteringZones:indexOf(zone)
if enteringIndex then
table.remove(enteringZones, enteringIndex)
end
end
CreateThread(function()

View File

@@ -9,25 +9,25 @@
"settings": {
"locale": "Endre språk",
"locale_description": "Nåværende språk: ${language} (%s)",
"notification_audio": "Varslings lyd",
"notification_position": "Varslings posisjon"
"notification_audio": "Varslingslyd",
"notification_position": "Varslingsposisjon"
},
"position": {
"bottom": "Bunn",
"bottom-left": "Bunn-venstre",
"bottom-right": "Bunn-høyre",
"center-left": "Senter-venstre",
"center-right": "Senter-høyre",
"top": "Top",
"top-left": "Top-venstre",
"top-right": "Top-høyre"
"bottom": "Nederst",
"bottom-left": "Nederst til venstre",
"bottom-right": "Nederst til høyre",
"center-left": "Midten venstre",
"center-right": "Midten høyre",
"top": "Øverst",
"top-left": "Øverst til venstre",
"top-right": "Øverst til høyre"
}
},
"open_radial_menu": "Åpne radial menyen",
"open_radial_menu": "Åpne radialmenyen",
"cancel_progress": "Avbryt den nåværende progresjonsbaren",
"txadmin_announcement": "Server annonsering fra %s",
"txadmin_announcement": "Serverannonsering fra %s",
"txadmin_dm": "Direktemelding fra %s",
"txadmin_warn": "Du har fått en advarsel fra %s",
"txadmin_warn_content": "%s \nAction ID: %s",
"txadmin_scheduledrestart": "Planlagt Omstart"
"txadmin_scheduledrestart": "Planlagt omstart"
}

View File

@@ -12,6 +12,7 @@ interface PropProps {
}
interface ProgressProps {
label?: string;
duration: number;
position?: 'middle' | 'bottom';
useWhileDead?: boolean;

View File

@@ -1,11 +1,13 @@
{
"name": "@communityox/ox_lib",
"author": "Overextended",
"version": "3.30.7",
"version": "3.30.8",
"description": "JS/TS wrapper for ox_lib exports",
"main": "./shared/index.js",
"types": "./shared/index.d.ts",
"sideEffects": ["./shared/resource/locale/index.js"],
"sideEffects": [
"./shared/resource/locale/index.js"
],
"scripts": {
"compile": "tsc",
"prepare": "npm run compile"
@@ -40,4 +42,4 @@
"@types/react": "^18.2.66",
"prettier": "^2.8.8"
}
}
}

View File

@@ -1,5 +1,7 @@
export * from './resource';
export const context: 'server' | 'client' = IsDuplicityVersion() ? 'server' : 'client';
// https://www.raygesualdo.com/posts/flattening-object-keys-with-typescript-types/
export type FlattenObjectKeys<T extends Record<string, any>, Key = keyof T> = Key extends string
? T[Key] extends Record<string, unknown>

View File

@@ -0,0 +1,29 @@
import { cache } from '../cache/index';
import { context } from 'shared';
import { Vector3 } from "@nativewrappers/client";
interface NearbyVehicle {
vehicle: number;
coords: Vector3;
}
export function getNearbyVehicles(coords: Vector3, maxDistance: number = 2.0, includePlayerVehicle: boolean = false): NearbyVehicle[] {
const vehicles = GetGamePool('CVehicle');
const nearbyVehicles: NearbyVehicle[] = [];
for (const vehicle of vehicles) {
if (context === 'server' || !cache.vehicle || vehicle !== cache.vehicle || includePlayerVehicle) {
const vehicleCoords = Vector3.fromArray(GetEntityCoords(vehicle, true));
const distance = vehicleCoords.distance(coords);
if (distance < maxDistance && NetworkGetEntityIsNetworked(vehicle) ) {
nearbyVehicles.push({
vehicle,
coords: vehicleCoords
});
}
}
}
return nearbyVehicles;
}

View File

@@ -1,3 +1,4 @@
export * from './version';
export * from './cache';
export * from './locale'
export * from './locale';
export * from './getNearbyVehicles';