385 lines
		
	
	
		
			No EOL
		
	
	
		
			13 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			385 lines
		
	
	
		
			No EOL
		
	
	
		
			13 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- Copyright (C) 2023 reFlow Store, licensed under Software Subscription License Agreement
 | |
| 
 | |
| ---@class Bridge
 | |
| Bridge = {}
 | |
| Bridge.Resource = GetCurrentResourceName()
 | |
| Bridge.Name = GetResourceMetadata(Bridge.Resource, 'bridge', 0)
 | |
| Bridge.Version = GetResourceMetadata(Bridge.Name, 'version', 0)
 | |
| Bridge.Context = IsDuplicityVersion() and 'server' or 'client'
 | |
| Bridge.DebugMode = GetConvar('bridge:debug', 'false') == 'true' and true or false
 | |
| Bridge.Locale = GetConvar('bridge:locale', 'en')
 | |
| Bridge.Disabled = {}
 | |
| Bridge.Framework = nil
 | |
| Bridge.FrameworkName = nil
 | |
| Bridge.FrameworkEvent = nil
 | |
| Bridge.FrameworkPrefix = nil
 | |
| Bridge.Inventory = nil
 | |
| Bridge.InventoryDisabled = false
 | |
| Bridge.InventoryName = nil
 | |
| Bridge.InventoryEvent = nil
 | |
| Bridge.InventoryImagePath = nil
 | |
| Bridge.Target = nil
 | |
| Bridge.TargetName = nil
 | |
| Bridge.Zone = nil
 | |
| Bridge.ZoneName = nil
 | |
| Bridge.Database = nil
 | |
| Bridge.DatabaseName = nil
 | |
| 
 | |
| ---@class Cache
 | |
| Cache = {}
 | |
| 
 | |
| ---@class Framework
 | |
| Framework = {}
 | |
| 
 | |
| ---@class Target
 | |
| Target = {}
 | |
| 
 | |
| ---@class Zone
 | |
| Zone = {}
 | |
| 
 | |
| ---@class Database
 | |
| Database = {}
 | |
| 
 | |
| if not Bridge.Name then
 | |
|     print('[^1BRIDGE ERROR^0]')
 | |
|     print(('^3%s^0'):format("Bridge Not Found, Bridge Tag Must Be Included In Resource Manifest."))
 | |
|     return
 | |
| end
 | |
| 
 | |
| if not _VERSION:find('5.4') then
 | |
|     print('[^1BRIDGE ERROR^0]')
 | |
|     print(('^3%s^0'):format("Lua 5.4 Must Be Enabled In The Resource Manifest."))
 | |
|     return
 | |
| end
 | |
| 
 | |
| if GetResourceState(Bridge.Name) ~= 'started' then
 | |
|     print('[^1BRIDGE ERROR^0]')
 | |
|     print(('^3%s %s^0'):format(Bridge.Name, "Must Be Started Before This Resource."))
 | |
|     return
 | |
| end
 | |
| 
 | |
| -- ❗ FRAMEWORK VERSION ❗
 | |
| if Bridge.DebugMode then 
 | |
|     print(('[^2BRIDGE^0] ^1Version^0 %s'):format(Bridge.Version))
 | |
| end
 | |
| 
 | |
| -- ❗ MODULE DISABLE ❗
 | |
| for i = 1, GetNumResourceMetadata(Bridge.Resource, 'bridge_disable') do
 | |
|     local name = GetResourceMetadata(Bridge.Resource, 'bridge_disable', i - 1)
 | |
|     Bridge.Disabled[name] = true
 | |
|     if Bridge.DebugMode then print(('[^2BRIDGE^0] ^1Module Disabled^0 %s'):format(name)) end
 | |
| end
 | |
| 
 | |
| -- ❗ DATABASE DETECTION ❗
 | |
| 
 | |
| -- ❕ OVERRIDE DATABASE ❕
 | |
| if GetConvar('bridge:database', '') ~= '' then
 | |
|     Bridge.Database = GetConvar('bridge:database', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OVERRIDE DATABASE NAME ❕
 | |
| if GetConvar('bridge:databasename', '') ~= '' then
 | |
|     Bridge.DatabaseName = GetConvar('bridge:databasename', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OXMYSQL ❕
 | |
| if not Bridge.Database and GetResourceState('oxmysql') ~= 'missing' then
 | |
|     if not Bridge.DatabaseName then Bridge.DatabaseName = 'oxmysql' end
 | |
|     Bridge.Database = 'oxmysql'
 | |
| end
 | |
| 
 | |
| -- ❕ CUSTOM DATABASE ❕
 | |
| -- if not Bridge.Database and GetResourceState('custom') ~= 'missing' then
 | |
| --     if not Bridge.DatabaseName then Bridge.DatabaseName = 'custom' end
 | |
| --     Bridge.Database = 'custom'
 | |
| -- end
 | |
| 
 | |
| if not Bridge.Disabled['database'] and not Bridge.Database then
 | |
|     print('[^1BRIDGE ERROR^0]')
 | |
|     print(('^3%s^0'):format("No Compatible Database Resource Found. Please ensure you're using a supported database and that it's running before the bridge."))
 | |
|     return
 | |
| end
 | |
| 
 | |
| -- ❗ FRAMEWORK DETECTION ❗
 | |
| 
 | |
| -- ❕ OVERRIDE FRAMEWORK ❕
 | |
| if GetConvar('bridge:framework', '') ~= '' then
 | |
|     Bridge.Framework = GetConvar('bridge:framework', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OVERRIDE FRAMEWORK NAME ❕
 | |
| if GetConvar('bridge:frameworkname', '') ~= '' then
 | |
|     Bridge.FrameworkName = GetConvar('bridge:frameworkname', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OVERRIDE FRAMEWORK EVENT ❕
 | |
| if GetConvar('bridge:frameworkevent', '') ~= '' then
 | |
|     Bridge.FrameworkEvent = GetConvar('bridge:frameworkevent', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OVERRIDE FRAMEWORK PREFIX ❕
 | |
| if GetConvar('bridge:frameworkprefix', '') ~= '' then
 | |
|     Bridge.FrameworkPrefix = GetConvar('bridge:frameworkprefix', '')
 | |
| end
 | |
| 
 | |
| -- ❕ ESX ❕ 
 | |
| if not Bridge.Framework and GetResourceState('es_extended') ~= 'missing' then
 | |
|     if not Bridge.FrameworkName then Bridge.FrameworkName = 'es_extended' end
 | |
|     if not Bridge.FrameworkEvent then Bridge.FrameworkEvent = 'esx:getSharedObject' end
 | |
|     if not Bridge.FrameworkPrefix then Bridge.FrameworkPrefix = 'esx' end
 | |
|     Bridge.Framework = 'esx'
 | |
| end
 | |
| 
 | |
| -- ❕ QBox ❕
 | |
| if not Bridge.Framework and GetResourceState('qbx_core') ~= 'missing' then
 | |
|     if not Bridge.FrameworkName then Bridge.FrameworkName = 'qbx_core' end
 | |
|     if not Bridge.FrameworkPrefix then Bridge.FrameworkPrefix = 'QBCore' end
 | |
|     Bridge.Framework = 'qbox'
 | |
| end
 | |
| 
 | |
| -- ❕ QBCore ❕
 | |
| if not Bridge.Framework and GetResourceState('qb-core') ~= 'missing' then
 | |
|     if not Bridge.FrameworkName then Bridge.FrameworkName = 'qb-core' end
 | |
|     if not Bridge.FrameworkEvent then Bridge.FrameworkEvent = 'QBCore:GetObject' end
 | |
|     if not Bridge.FrameworkPrefix then Bridge.FrameworkPrefix = 'QBCore' end
 | |
|     Bridge.Framework = 'qb'
 | |
| end
 | |
| 
 | |
| -- ❕ CUSTOM FRAMEWORK ❕
 | |
| -- if not Bridge.Framework and GetResourceState('custom') ~= 'missing' then
 | |
| --     if not Bridge.FrameworkName then Bridge.FrameworkName = 'custom' end
 | |
| --     Bridge.Framework = 'custom'
 | |
| -- end
 | |
| 
 | |
| if not Bridge.Disabled['framework'] and not Bridge.Framework then
 | |
|     print('[^1BRIDGE ERROR^0]')
 | |
|     print(('^3%s^0'):format("No Compatible Framework Resource Found. Please ensure you're using a supported framework and that it's running before the bridge."))
 | |
|     return
 | |
| end
 | |
| 
 | |
| -- ❗ INVENTORY DETECTION ❗
 | |
| 
 | |
| -- ❕ OVERRIDE INVENTORY ❕
 | |
| if GetConvar('bridge:inventory', '') ~= '' then
 | |
|     Bridge.Inventory = GetConvar('bridge:inventory', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OVERRIDE INVENTORY NAME ❕
 | |
| if GetConvar('bridge:inventoryname', '') ~= '' then
 | |
|     Bridge.InventoryName = GetConvar('bridge:inventoryname', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OVERRIDE INVENTORY PATH ❕
 | |
| if GetConvar('bridge:inventoryimagepath', '') ~= '' then
 | |
|     Bridge.InventoryImagePath = GetConvar('bridge:inventoryimagepath', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OVERRIDE INVENTORY EVENT ❕
 | |
| if GetConvar('bridge:inventoryevent', '') ~= '' then
 | |
|     Bridge.InventoryEvent = GetConvar('bridge:inventoryevent', '')
 | |
| end
 | |
| 
 | |
| -- ❕ QB-INVENTORY | LJ-INVENTORY | AJ-INVENTORY | AX-INVENTORY | PS-INVENTORY ❕
 | |
| if not Bridge.Inventory and Bridge.Framework == 'qb' and (GetResourceState('qb-inventory') ~= 'missing' or GetResourceState('lj-inventory') ~= 'missing' or GetResourceState('aj-inventory') ~= 'missing' or GetResourceState('ax-inventory') ~= 'missing' or GetResourceState('ps-inventory') ~= 'missing') then
 | |
|     
 | |
|     if not Bridge.InventoryName then 
 | |
|         if GetResourceState('qb-inventory') ~= 'missing' then Bridge.InventoryName = 'qb-inventory' end
 | |
|         if GetResourceState('lj-inventory') ~= 'missing' then Bridge.InventoryName = 'lj-inventory' end
 | |
|         if GetResourceState('aj-inventory') ~= 'missing' then Bridge.InventoryName = 'aj-inventory' end
 | |
|         if GetResourceState('ax-inventory') ~= 'missing' then Bridge.InventoryName = 'ax-inventory' end
 | |
|         if GetResourceState('ps-inventory') ~= 'missing' then Bridge.InventoryName = 'ps-inventory' end
 | |
|     end
 | |
| 
 | |
|     Bridge.InventoryImagePath = ('%s/html/images/'):format(Bridge.InventoryName)
 | |
|     Bridge.Inventory = 'qb-inventory'
 | |
| end
 | |
| 
 | |
| -- ❕ AK47_INVENTORY ❕
 | |
| if not Bridge.Inventory and GetResourceState('ak47_inventory') ~= 'missing' then
 | |
|     if not Bridge.InventoryName then Bridge.InventoryName = 'ak47_inventory' end
 | |
|     Bridge.InventoryImagePath = ('%s/html/images/'):format(Bridge.InventoryName)
 | |
|     Bridge.Inventory = 'ak47_inventory'
 | |
| end
 | |
| 
 | |
| -- ❕ OX_INVENTORY ❕
 | |
| if not Bridge.Inventory and GetResourceState('ox_inventory') ~= 'missing' then
 | |
|     if not Bridge.InventoryName then Bridge.InventoryName = 'ox_inventory' end
 | |
|     Bridge.InventoryImagePath = ('%s/web/images/'):format(Bridge.InventoryName)
 | |
|     Bridge.Inventory = 'ox_inventory'
 | |
| end
 | |
| 
 | |
| -- ❕ QS-INVENTORY ❕
 | |
| if not Bridge.Inventory and GetResourceState('qs-inventory') ~= 'missing' then
 | |
|     if not Bridge.InventoryName then Bridge.InventoryName = 'qs-inventory' end
 | |
|     Bridge.InventoryImagePath = ('%s/html/images/'):format(Bridge.InventoryName)
 | |
|     Bridge.Inventory = 'qs-inventory'
 | |
| end
 | |
| 
 | |
| -- ❕ CODEM-INVENTORY ❕
 | |
| if not Bridge.Inventory and GetResourceState('codem-inventory') ~= 'missing' then
 | |
|     if not Bridge.InventoryName then Bridge.InventoryName = 'codem-inventory' end
 | |
|     Bridge.InventoryImagePath = ('%s/html/itemimages/'):format(Bridge.InventoryName)
 | |
|     Bridge.Inventory = 'codem-inventory'
 | |
| end
 | |
| 
 | |
| -- ❕ TGIANN-INVENTORY ❕
 | |
| if not Bridge.Inventory and GetResourceState('tgiann-inventory') ~= 'missing' then
 | |
|     if not Bridge.InventoryName then Bridge.InventoryName = 'tgiann-inventory' end
 | |
|     Bridge.InventoryImagePath = 'inventory_images/images/'
 | |
|     Bridge.Inventory = 'tgiann-inventory'
 | |
| end
 | |
| 
 | |
| -- ❕ CUSTOM INVENTORY ❕
 | |
| -- if not Bridge.Inventory and GetResourceState('inventory') ~= 'missing' then
 | |
| --     if not Bridge.InventoryName then Bridge.InventoryName = 'inventory' end
 | |
| --     Bridge.Inventory = 'inventory'
 | |
| -- end
 | |
| 
 | |
| if not Bridge.Disabled['inventory'] and not Bridge.Inventory then
 | |
|     print('[^1BRIDGE ERROR^0]')
 | |
|     print(('^3%s^0'):format("No Compatible Inventory Resource Found. Please ensure you're using a supported inventory and that it's running before the bridge."))
 | |
|     return
 | |
| end
 | |
| 
 | |
| -- ❗ TARGET DETECTION ❗
 | |
| 
 | |
| -- ❕ OVERRIDE TARGET ❕
 | |
| if GetConvar('bridge:target', '') ~= '' then
 | |
|     Bridge.Target = GetConvar('bridge:target', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OVERRIDE TARGET NAME ❕
 | |
| if GetConvar('bridge:targetname', '') ~= '' then
 | |
|     Bridge.TargetName = GetConvar('bridge:targetname', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OX_TARGET ❕
 | |
| if not Bridge.Target and GetResourceState('ox_target') ~= 'missing' then
 | |
|     if not Bridge.TargetName then Bridge.TargetName = 'ox_target' end
 | |
|     Bridge.Target = 'ox_target'
 | |
| end
 | |
| 
 | |
| -- ❕ QB-TARGET ❕
 | |
| if not Bridge.Target and GetResourceState('qb-target') ~= 'missing' then
 | |
|     if not Bridge.TargetName then Bridge.TargetName = 'qb-target' end
 | |
|     Bridge.Target = 'qb-target'
 | |
| end
 | |
| 
 | |
| -- ❕ QTARGET ❕
 | |
| if not Bridge.Target and GetResourceState('qtarget') ~= 'missing' then
 | |
|     if not Bridge.TargetName then Bridge.TargetName = 'qtarget' end
 | |
|     Bridge.Target = 'qtarget'
 | |
| end
 | |
| 
 | |
| -- ❕ CUSTOM TARGET ❕
 | |
| -- if not Bridge.Target and GetResourceState('target') ~= 'missing' then
 | |
| --     if not Bridge.TargetName then Bridge.TargetName = 'target' end
 | |
| --     Bridge.Target = 'target'
 | |
| -- end
 | |
| 
 | |
| if not Bridge.Disabled['target'] and not Bridge.TargetName then
 | |
|     print('[^1BRIDGE ERROR^0]')
 | |
|     print(('^3%s^0'):format("No Compatible Target Resource Found. Please ensure you're using a supported target and that it's running before the bridge."))
 | |
|     return
 | |
| end
 | |
| 
 | |
| -- ❗ ZONES DETECTION ❗
 | |
| 
 | |
| -- ❕ OVERRIDE ZONE ❕
 | |
| if GetConvar('bridge:zone', '') ~= '' then
 | |
|     Bridge.Zone = GetConvar('bridge:zone', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OVERRIDE ZONE NAME ❕
 | |
| if GetConvar('bridge:zonename', '') ~= '' then
 | |
|     Bridge.ZoneName = GetConvar('bridge:zonename', '')
 | |
| end
 | |
| 
 | |
| -- ❕ OX_LIB ❕
 | |
| if not Bridge.Zone and GetResourceState('ox_lib') ~= 'missing' then
 | |
|     if not Bridge.ZoneName then Bridge.ZoneName = 'ox_lib' end
 | |
|     Bridge.Zone = 'ox_lib'
 | |
| end
 | |
| 
 | |
| -- ❕ PolyZone ❕
 | |
| if not Bridge.Zone and GetResourceState('PolyZone') ~= 'missing' then
 | |
|     if not Bridge.ZoneName then Bridge.ZoneName = 'PolyZone' end
 | |
|     Bridge.Zone = 'polyzone'
 | |
| end
 | |
| 
 | |
| -- ❕ CUSTOM ZONE ❕
 | |
| -- if not Bridge.Zone and GetResourceState('zone') ~= 'missing' then
 | |
| --     if not Bridge.ZoneName then Bridge.ZoneName = 'zone' end
 | |
| --     Bridge.Zone = 'zone'
 | |
| -- end
 | |
| 
 | |
| if not Bridge.Disabled['zone'] and not Bridge.ZoneName then
 | |
|     print('[^1BRIDGE ERROR^0]')
 | |
|     print(('^3%s^0'):format("No Compatible Zone Resource Found. Please ensure you're using a supported zone resource and that it's running before the bridge."))
 | |
|     return
 | |
| end
 | |
| 
 | |
| /*
 | |
| if not Bridge.Disabled['dispatch'] and not Bridge.DispatchName then
 | |
|     print('[^1BRIDGE ERROR^0]')
 | |
|     print(('^3%s^0'):format("No Compatible Dispatch Resource Found. Please ensure you're using a supported dispatch resource and that it's running before the bridge."))
 | |
|     return
 | |
| end
 | |
| */
 | |
| 
 | |
| -- ❗ LOADERS ❗
 | |
| 
 | |
| -- ❕ LOAD MODULE LOADER ❕
 | |
| local resource = LoadResourceFile(Bridge.Name, 'shared/loader.lua')
 | |
| if not resource then return error('Unable To Load Module Loader') end
 | |
| local moduleloader, err = load(resource, ('@@%s/%s'):format(Bridge.Name, 'shared/loader.lua'))
 | |
| if not moduleloader or err then return error(err) end
 | |
| moduleloader()
 | |
| 
 | |
| -- ❕ LOAD UTILS ❕
 | |
| module(('utils/%s'):format(Bridge.Context))
 | |
| 
 | |
| module('utils/shared')
 | |
| 
 | |
| -- ❕ LOAD VERSION ❕
 | |
| module('shared/version')
 | |
| 
 | |
| -- ❕ LOAD CACHE ❕
 | |
| if not Bridge.Disabled['cache'] then
 | |
|     module(('cache/%s'):format(Bridge.Context))
 | |
| end
 | |
| 
 | |
| -- ❕ LOAD POINTS ❕
 | |
| if not Bridge.Disabled['points'] then
 | |
|     module(('points/%s'):format(Bridge.Context))
 | |
| end
 | |
| 
 | |
| -- ❕ LOAD DATABASE ❕
 | |
| if not Bridge.Disabled['database'] then
 | |
|     module(('database/%s/%s'):format(Bridge.Database, Bridge.Context))
 | |
| end
 | |
| 
 | |
| -- ❕ LOAD FRAMEWORK ❕
 | |
| if not Bridge.Disabled['framework'] then
 | |
|     module(('framework/%s/%s'):format(Bridge.Framework, Bridge.Context))
 | |
| end
 | |
| 
 | |
| -- ❕ LOAD INVENTORY ❕
 | |
| if not Bridge.Disabled['inventory'] then
 | |
|     module(('inventory/%s/%s'):format(Bridge.Inventory, Bridge.Context))
 | |
| end
 | |
| 
 | |
| -- ❕ LOAD TARGET ❕
 | |
| if not Bridge.Disabled['target'] then
 | |
|     module(('target/%s/%s'):format(Bridge.Target, Bridge.Context))
 | |
| end
 | |
| 
 | |
| -- ❕ LOAD ZONE ❕
 | |
| if not Bridge.Disabled['zone'] then
 | |
|     module(('zone/%s/%s'):format(Bridge.Zone, Bridge.Context))
 | |
| end
 | |
| 
 | |
| -- ❕ LOAD LOCALE ❕
 | |
| if not Bridge.Disabled['locale'] then
 | |
|     module('shared/locale')
 | |
| end | 
