diff --git a/client/main.lua b/client/main.lua index d7ed321f..402fe787 100644 --- a/client/main.lua +++ b/client/main.lua @@ -46,63 +46,124 @@ lib.callback('ox_doorlock:getDoors', false, function(data) for _, door in pairs(doors) do local double = door.doors door.distance = #(coords - door.coords) - - if double then - if door.distance < 80 then - for i = 1, 2 do - if not double[i].entity and IsModelValid(double[i].model) then - local entity = GetClosestObjectOfType(double[i].coords.x, double[i].coords.y, double[i].coords.z, 1.0, double[i].model, false, false, false) - + if door.iplName and door.iplName ~= "" then + if IsIplActive(door.iplName) then + if double then + if door.distance < 80 then + for i = 1, 2 do + if not double[i].entity and IsModelValid(double[i].model) then + local entity = GetClosestObjectOfType(double[i].coords.x, double[i].coords.y, double[i].coords.z, 1.0, double[i].model, false, false, false) + + if entity ~= 0 then + double[i].entity = entity + Entity(entity).state.doorId = door.id + end + end + end + + if door.distance < 20 then + nearbyDoors[#nearbyDoors + 1] = door + end + else + for i = 1, 2 do + double[i].entity = nil + end + end + elseif door.distance < 80 then + if not door.entity and IsModelValid(door.model) then + local entity = GetClosestObjectOfType(door.coords.x, door.coords.y, door.coords.z, 1.0, door.model, false, false, false) + if entity ~= 0 then - double[i].entity = entity + local min, max = GetModelDimensions(door.model) + local points = { + GetOffsetFromEntityInWorldCoords(entity, min.x, min.y, min.z).xy, + GetOffsetFromEntityInWorldCoords(entity, min.x, min.y, max.z).xy, + GetOffsetFromEntityInWorldCoords(entity, min.x, max.y, max.z).xy, + GetOffsetFromEntityInWorldCoords(entity, min.x, max.y, min.z).xy, + GetOffsetFromEntityInWorldCoords(entity, max.x, min.y, min.z).xy, + GetOffsetFromEntityInWorldCoords(entity, max.x, min.y, max.z).xy, + GetOffsetFromEntityInWorldCoords(entity, max.x, max.y, max.z).xy, + GetOffsetFromEntityInWorldCoords(entity, max.x, max.y, min.z).xy + } + + local centroid = vec2(0, 0) + + for i = 1, 8 do + centroid += points[i] + end + + centroid = centroid / 8 + door.coords = vec3(centroid.x, centroid.y, door.coords.z) + door.entity = entity Entity(entity).state.doorId = door.id end end - end - - if door.distance < 20 then - nearbyDoors[#nearbyDoors + 1] = door - end - else - for i = 1, 2 do - double[i].entity = nil + + if door.distance < 20 then + nearbyDoors[#nearbyDoors + 1] = door + end + elseif door.entity then + door.entity = nil end end - elseif door.distance < 80 then - if not door.entity and IsModelValid(door.model) then - local entity = GetClosestObjectOfType(door.coords.x, door.coords.y, door.coords.z, 1.0, door.model, false, false, false) - - if entity ~= 0 then - local min, max = GetModelDimensions(door.model) - local points = { - GetOffsetFromEntityInWorldCoords(entity, min.x, min.y, min.z).xy, - GetOffsetFromEntityInWorldCoords(entity, min.x, min.y, max.z).xy, - GetOffsetFromEntityInWorldCoords(entity, min.x, max.y, max.z).xy, - GetOffsetFromEntityInWorldCoords(entity, min.x, max.y, min.z).xy, - GetOffsetFromEntityInWorldCoords(entity, max.x, min.y, min.z).xy, - GetOffsetFromEntityInWorldCoords(entity, max.x, min.y, max.z).xy, - GetOffsetFromEntityInWorldCoords(entity, max.x, max.y, max.z).xy, - GetOffsetFromEntityInWorldCoords(entity, max.x, max.y, min.z).xy - } - - local centroid = vec2(0, 0) - - for i = 1, 8 do - centroid += points[i] + else + if double then + if door.distance < 80 then + for i = 1, 2 do + if not double[i].entity and IsModelValid(double[i].model) then + local entity = GetClosestObjectOfType(double[i].coords.x, double[i].coords.y, double[i].coords.z, 1.0, double[i].model, false, false, false) + + if entity ~= 0 then + double[i].entity = entity + Entity(entity).state.doorId = door.id + end + end end - centroid = centroid / 8 - door.coords = vec3(centroid.x, centroid.y, door.coords.z) - door.entity = entity - Entity(entity).state.doorId = door.id + if door.distance < 20 then + nearbyDoors[#nearbyDoors + 1] = door + end + else + for i = 1, 2 do + double[i].entity = nil + end end - end + elseif door.distance < 80 then + if not door.entity and IsModelValid(door.model) then + local entity = GetClosestObjectOfType(door.coords.x, door.coords.y, door.coords.z, 1.0, door.model, false, false, false) + + if entity ~= 0 then + local min, max = GetModelDimensions(door.model) + local points = { + GetOffsetFromEntityInWorldCoords(entity, min.x, min.y, min.z).xy, + GetOffsetFromEntityInWorldCoords(entity, min.x, min.y, max.z).xy, + GetOffsetFromEntityInWorldCoords(entity, min.x, max.y, max.z).xy, + GetOffsetFromEntityInWorldCoords(entity, min.x, max.y, min.z).xy, + GetOffsetFromEntityInWorldCoords(entity, max.x, min.y, min.z).xy, + GetOffsetFromEntityInWorldCoords(entity, max.x, min.y, max.z).xy, + GetOffsetFromEntityInWorldCoords(entity, max.x, max.y, max.z).xy, + GetOffsetFromEntityInWorldCoords(entity, max.x, max.y, min.z).xy + } + + local centroid = vec2(0, 0) + + for i = 1, 8 do + centroid += points[i] + end - if door.distance < 20 then - nearbyDoors[#nearbyDoors + 1] = door + centroid = centroid / 8 + door.coords = vec3(centroid.x, centroid.y, door.coords.z) + door.entity = entity + Entity(entity).state.doorId = door.id + end + end + + if door.distance < 20 then + nearbyDoors[#nearbyDoors + 1] = door + end + elseif door.entity then + door.entity = nil end - elseif door.entity then - door.entity = nil end end diff --git a/server/convert.lua b/server/convert.lua index 2d5799ee..c4562fe9 100644 --- a/server/convert.lua +++ b/server/convert.lua @@ -85,6 +85,7 @@ MySQL.ready(function() maxDistance = door.maxDistance or door.distance, doorRate = door.doorRate and door.doorRate + 0.0 or nil, state = door.locked and 1 or 0, + iplName = door.iplName or nil, passcode = door.passcode, doors = double and { { diff --git a/server/main.lua b/server/main.lua index f39e0580..57459182 100644 --- a/server/main.lua +++ b/server/main.lua @@ -46,7 +46,8 @@ local function encodeData(door) state = door.state, unlockSound = door.unlockSound, passcode = door.passcode, - lockpickDifficulty = door.lockpickDifficulty + lockpickDifficulty = door.lockpickDifficulty, + iplName = door.iplName }) end @@ -120,6 +121,7 @@ local function createDoor(id, door, name) local double = door.doors door.id = id door.name = name + door.iplName = door.iplName or "" if double then for i = 1, 2 do diff --git a/web/src/layouts/settings/Submit.tsx b/web/src/layouts/settings/Submit.tsx index 02a9de6c..3a8262ac 100644 --- a/web/src/layouts/settings/Submit.tsx +++ b/web/src/layouts/settings/Submit.tsx @@ -101,6 +101,7 @@ const Submit: React.FC = () => { useStore.setState( { name: '', + iplName: clipboard.iplName, passcode: clipboard.passcode, autolock: clipboard.autolock, items: clipboard.items, diff --git a/web/src/layouts/settings/views/general/components/Inputs.tsx b/web/src/layouts/settings/views/general/components/Inputs.tsx index 0ff17863..b9ac9dbf 100644 --- a/web/src/layouts/settings/views/general/components/Inputs.tsx +++ b/web/src/layouts/settings/views/general/components/Inputs.tsx @@ -11,6 +11,7 @@ const Inputs: React.FC = () => { // state.doorRate, // ]); const doorName = useStore((state) => state.name); + const iplName = useStore((state) => state.iplName); const passcode = useStore((state) => state.passcode); const autolockInterval = useStore((state) => state.autolock); const interactDistance = useStore((state) => state.maxDistance); @@ -25,6 +26,7 @@ const Inputs: React.FC = () => { // ]); const setDoorName = useSetters((setter) => setter.setName); + const setIplName = useSetters((setter) => setter.setIplName); const setPasscode = useSetters((setter) => setter.setPasscode); const setAutolockInterval = useSetters((setter) => setter.setAutolock); const setInteractDistance = useSetters((setter) => setter.setMaxDistance); @@ -34,6 +36,7 @@ const Inputs: React.FC = () => { <> setDoorName(value)} /> + setIplName(value)} /> setPasscode(value)} /> ([ data: [ { name: 'Door name', + iplName: '', passcode: 'Supersecret123', autolock: 300, id: 0, diff --git a/web/src/store/index.ts b/web/src/store/index.ts index 7132b1b1..07ee5346 100644 --- a/web/src/store/index.ts +++ b/web/src/store/index.ts @@ -6,6 +6,7 @@ export type NumberField = number | null | undefined; export interface StoreState { id?: number; name: StringField; + iplName: StringField | null; passcode: StringField; autolock: NumberField; items: { name: StringField; metadata?: StringField; remove: boolean | null }[]; @@ -30,6 +31,7 @@ interface StateSetters { setLockSound: (value: StoreState['lockSound']) => void; setUnlockSound: (value: StoreState['unlockSound']) => void; setName: (value: StoreState['name']) => void; + setIplName: (value: StoreState['iplName']) => void; setPasscode: (value: StoreState['passcode']) => void; setAutolock: (value: StoreState['autolock']) => void; setItems: (fn: (state: StoreState['items']) => StoreState['items']) => void; @@ -43,6 +45,7 @@ interface StateSetters { export const useStore = create(() => ({ name: '', + iplName: '', passcode: '', autolock: 0, items: [{ name: '', metadata: '', remove: false }], @@ -69,6 +72,7 @@ export const useSetters = create((set: SetState, get setLockSound: (value) => useStore.setState({ lockSound: value }), setUnlockSound: (value) => useStore.setState({ unlockSound: value }), setName: (value) => useStore.setState({ name: value }), + setIplName: (value) => useStore.setState({ iplName: value }), setPasscode: (value: StoreState['passcode']) => useStore.setState({ passcode: value }), setAutolock: (value: StoreState['autolock']) => useStore.setState({ autolock: value }), // @ts-ignore