Skip to content
This repository was archived by the owner on Apr 29, 2025. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 107 additions & 46 deletions client/main.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions server/convert.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
{
Expand Down
4 changes: 3 additions & 1 deletion server/main.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions web/src/layouts/settings/Submit.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ const Submit: React.FC = () => {
useStore.setState(
{
name: '',
iplName: clipboard.iplName,
passcode: clipboard.passcode,
autolock: clipboard.autolock,
items: clipboard.items,
Expand Down
3 changes: 3 additions & 0 deletions web/src/layouts/settings/views/general/components/Inputs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -34,6 +36,7 @@ const Inputs: React.FC = () => {
<>
<Grid columns={2} sx={{ fontSize: 16 }}>
<Input label="Door name" type="text" value={doorName || ''} setValue={(value: string) => setDoorName(value)} />
<Input label="Ipl name" type="text" value={iplName || ''} setValue={(value: string) => setIplName(value)} />
<Input label="Passcode" type="text" value={passcode || ''} setValue={(value: string) => setPasscode(value)} />
<Input
label="Autolock Interval"
Expand Down
1 change: 1 addition & 0 deletions web/src/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ debugData<DoorColumn[]>([
data: [
{
name: 'Door name',
iplName: '',
passcode: 'Supersecret123',
autolock: 300,
id: 0,
Expand Down
4 changes: 4 additions & 0 deletions web/src/store/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 }[];
Expand All @@ -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;
Expand All @@ -43,6 +45,7 @@ interface StateSetters {

export const useStore = create<StoreState>(() => ({
name: '',
iplName: '',
passcode: '',
autolock: 0,
items: [{ name: '', metadata: '', remove: false }],
Expand All @@ -69,6 +72,7 @@ export const useSetters = create<StateSetters>((set: SetState<StateSetters>, 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
Expand Down