This commit is contained in:
UIRP.Hetzner 2025-04-05 22:25:06 +00:00
parent 11019465a1
commit 7cedbd835c
635 changed files with 147980 additions and 3 deletions

View File

@ -0,0 +1,26 @@
### 2025-04-05 21:18:19.133
setr "txAdmin-locale" "en"
### 2025-04-05 21:18:19.183
set "txAdmin-serverName" "UIRP-5M"
### 2025-04-05 21:18:19.234
set "txAdmin-checkPlayerJoin" "true"
### 2025-04-05 21:18:19.284
set "txAdmin-menuAlignRight" "false"
### 2025-04-05 21:18:19.335
set "txAdmin-menuPageKey" "Tab"
### 2025-04-05 21:18:19.385
set "txAdmin-playerModePtfx" "true"
### 2025-04-05 21:18:19.436
set "txAdmin-hideAdminInPunishments" "true"
### 2025-04-05 21:18:19.486
set "txAdmin-hideAdminInMessages" "false"
### 2025-04-05 21:18:19.537
set "txAdmin-hideDefaultAnnouncement" "false"
### 2025-04-05 21:18:19.587
set "txAdmin-hideDefaultDirectMessage" "false"
### 2025-04-05 21:18:19.638
set "txAdmin-hideDefaultWarning" "false"
### 2025-04-05 21:18:19.689
set "txAdmin-hideDefaultScheduledRestartWarning" "false"
### 2025-04-05 21:18:19.739
txaEvent "configChanged" "{}"

1
resources/[core]/PolyZone/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
polyzone_created_zones.txt

View File

@ -0,0 +1,226 @@
BoxZone = {}
-- Inherits from PolyZone
setmetatable(BoxZone, { __index = PolyZone })
-- Utility functions
local rad, cos, sin = math.rad, math.cos, math.sin
function PolyZone.rotate(origin, point, theta)
if theta == 0.0 then return point end
local p = point - origin
local pX, pY = p.x, p.y
theta = rad(theta)
local cosTheta = cos(theta)
local sinTheta = sin(theta)
local x = pX * cosTheta - pY * sinTheta
local y = pX * sinTheta + pY * cosTheta
return vector2(x, y) + origin
end
function BoxZone.calculateMinAndMaxZ(minZ, maxZ, scaleZ, offsetZ)
local minScaleZ, maxScaleZ, minOffsetZ, maxOffsetZ = scaleZ[1] or 1.0, scaleZ[2] or 1.0, offsetZ[1] or 0.0, offsetZ[2] or 0.0
if (minZ == nil and maxZ == nil) or (minScaleZ == 1.0 and maxScaleZ == 1.0 and minOffsetZ == 0.0 and maxOffsetZ == 0.0) then
return minZ, maxZ
end
if minScaleZ ~= 1.0 or maxScaleZ ~= 1.0 then
if minZ ~= nil and maxZ ~= nil then
local halfHeight = (maxZ - minZ) / 2
local centerZ = minZ + halfHeight
minZ = centerZ - halfHeight * minScaleZ
maxZ = centerZ + halfHeight * maxScaleZ
else
print(string.format(
"[PolyZone] Warning: The minZ/maxZ of a BoxZone can only be scaled if both minZ and maxZ are non-nil (minZ=%s, maxZ=%s)",
tostring(minZ),
tostring(maxZ)
))
end
end
if minZ then minZ = minZ - minOffsetZ end
if maxZ then maxZ = maxZ + maxOffsetZ end
return minZ, maxZ
end
local function _calculateScaleAndOffset(options)
-- Scale and offset tables are both formatted as {forward, back, left, right, up, down}
-- or if symmetrical {forward/back, left/right, up/down}
local scale = options.scale or {1.0, 1.0, 1.0, 1.0, 1.0, 1.0}
local offset = options.offset or {0.0, 0.0, 0.0, 0.0, 0.0, 0.0}
assert(#scale == 3 or #scale == 6, "Scale must be of length 3 or 6")
assert(#offset == 3 or #offset == 6, "Offset must be of length 3 or 6")
if #scale == 3 then
scale = {scale[1], scale[1], scale[2], scale[2], scale[3], scale[3]}
end
if #offset == 3 then
offset = {offset[1], offset[1], offset[2], offset[2], offset[3], offset[3]}
end
local minOffset = vector3(offset[3], offset[2], offset[6])
local maxOffset = vector3(offset[4], offset[1], offset[5])
local minScale = vector3(scale[3], scale[2], scale[6])
local maxScale = vector3(scale[4], scale[1], scale[5])
return minOffset, maxOffset, minScale, maxScale
end
local function _calculatePoints(center, length, width, minScale, maxScale, minOffset, maxOffset)
local halfLength, halfWidth = length / 2, width / 2
local min = vector3(-halfWidth, -halfLength, 0.0)
local max = vector3(halfWidth, halfLength, 0.0)
min = min * minScale - minOffset
max = max * maxScale + maxOffset
-- Box vertices
local p1 = center.xy + vector2(min.x, min.y)
local p2 = center.xy + vector2(max.x, min.y)
local p3 = center.xy + vector2(max.x, max.y)
local p4 = center.xy + vector2(min.x, max.y)
return {p1, p2, p3, p4}
end
-- Debug drawing functions
function BoxZone:TransformPoint(point)
-- Overriding TransformPoint function to take into account rotation and position offset
return PolyZone.rotate(self.startPos, point, self.offsetRot) + self.offsetPos
end
-- Initialization functions
local function _initDebug(zone, options)
if options.debugBlip then zone:addDebugBlip() end
if not options.debugPoly then
return
end
Citizen.CreateThread(function()
while not zone.destroyed do
zone:draw(false)
Citizen.Wait(0)
end
end)
end
local defaultMinOffset, defaultMaxOffset, defaultMinScale, defaultMaxScale = vector3(0.0, 0.0, 0.0), vector3(0.0, 0.0, 0.0), vector3(1.0, 1.0, 1.0), vector3(1.0, 1.0, 1.0)
local defaultScaleZ, defaultOffsetZ = {defaultMinScale.z, defaultMaxScale.z}, {defaultMinOffset.z, defaultMaxOffset.z}
function BoxZone:new(center, length, width, options)
local minOffset, maxOffset, minScale, maxScale = defaultMinOffset, defaultMaxOffset, defaultMinScale, defaultMaxScale
local scaleZ, offsetZ = defaultScaleZ, defaultOffsetZ
if options.scale ~= nil or options.offset ~= nil then
minOffset, maxOffset, minScale, maxScale = _calculateScaleAndOffset(options)
scaleZ, offsetZ = {minScale.z, maxScale.z}, {minOffset.z, maxOffset.z}
end
local points = _calculatePoints(center, length, width, minScale, maxScale, minOffset, maxOffset)
local min = points[1]
local max = points[3]
local size = max - min
local minZ, maxZ = BoxZone.calculateMinAndMaxZ(options.minZ, options.maxZ, scaleZ, offsetZ)
options.minZ = minZ
options.maxZ = maxZ
-- Box Zones don't use the grid optimization because they are already rectangles/cubes
options.useGrid = false
-- Pre-setting all these values to avoid PolyZone:new() having to calculate them
options.min = min
options.max = max
options.size = size
options.center = center
options.area = size.x * size.y
local zone = PolyZone:new(points, options)
zone.length = length
zone.width = width
zone.startPos = center.xy
zone.offsetPos = vector2(0.0, 0.0)
zone.offsetRot = options.heading or 0.0
zone.minScale, zone.maxScale = minScale, maxScale
zone.minOffset, zone.maxOffset = minOffset, maxOffset
zone.scaleZ, zone.offsetZ = scaleZ, offsetZ
zone.isBoxZone = true
setmetatable(zone, self)
self.__index = self
return zone
end
function BoxZone:Create(center, length, width, options)
local zone = BoxZone:new(center, length, width, options)
_initDebug(zone, options)
return zone
end
-- Helper functions
function BoxZone:isPointInside(point)
if self.destroyed then
print("[PolyZone] Warning: Called isPointInside on destroyed zone {name=" .. self.name .. "}")
return false
end
local startPos = self.startPos
local actualPos = point.xy - self.offsetPos
if #(actualPos - startPos) > self.boundingRadius then
return false
end
local rotatedPoint = PolyZone.rotate(startPos, actualPos, -self.offsetRot)
local pX, pY, pZ = rotatedPoint.x, rotatedPoint.y, point.z
local min, max = self.min, self.max
local minX, minY, maxX, maxY = min.x, min.y, max.x, max.y
local minZ, maxZ = self.minZ, self.maxZ
if pX < minX or pX > maxX or pY < minY or pY > maxY then
return false
end
if (minZ and pZ < minZ) or (maxZ and pZ > maxZ) then
return false
end
return true
end
function BoxZone:getHeading()
return self.offsetRot
end
function BoxZone:setHeading(heading)
if not heading then
return
end
self.offsetRot = heading
end
function BoxZone:setCenter(center)
if not center or center == self.center then
return
end
self.center = center
self.startPos = center.xy
self.points = _calculatePoints(self.center, self.length, self.width, self.minScale, self.maxScale, self.minOffset, self.maxOffset)
end
function BoxZone:getLength()
return self.length
end
function BoxZone:setLength(length)
if not length or length == self.length then
return
end
self.length = length
self.points = _calculatePoints(self.center, self.length, self.width, self.minScale, self.maxScale, self.minOffset, self.maxOffset)
end
function BoxZone:getWidth()
return self.width
end
function BoxZone:setWidth(width)
if not width or width == self.width then
return
end
self.width = width
self.points = _calculatePoints(self.center, self.length, self.width, self.minScale, self.maxScale, self.minOffset, self.maxOffset)
end

View File

@ -0,0 +1,98 @@
CircleZone = {}
-- Inherits from PolyZone
setmetatable(CircleZone, { __index = PolyZone })
function CircleZone:draw(forceDraw)
if not forceDraw and not self.debugPoly then return end
local center = self.center
local debugColor = self.debugColor
local r, g, b = debugColor[1], debugColor[2], debugColor[3]
if self.useZ then
local radius = self.radius
DrawMarker(28, center.x, center.y, center.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, radius, radius, radius, r, g, b, 48, false, false, 2, nil, nil, false)
else
local diameter = self.diameter
DrawMarker(1, center.x, center.y, -500.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, diameter, diameter, 1000.0, r, g, b, 96, false, false, 2, nil, nil, false)
end
end
local function _initDebug(zone, options)
if options.debugBlip then zone:addDebugBlip() end
if not options.debugPoly then
return
end
Citizen.CreateThread(function()
while not zone.destroyed do
zone:draw(false)
Citizen.Wait(0)
end
end)
end
function CircleZone:new(center, radius, options)
options = options or {}
local zone = {
name = tostring(options.name) or nil,
center = center,
radius = radius + 0.0,
diameter = radius * 2.0,
useZ = options.useZ or false,
debugPoly = options.debugPoly or false,
debugColor = options.debugColor or {0, 255, 0},
data = options.data or {},
isCircleZone = true,
}
if zone.useZ then
assert(type(zone.center) == "vector3", "Center must be vector3 if useZ is true {center=" .. center .. "}")
end
setmetatable(zone, self)
self.__index = self
return zone
end
function CircleZone:Create(center, radius, options)
local zone = CircleZone:new(center, radius, options)
_initDebug(zone, options)
return zone
end
function CircleZone:isPointInside(point)
if self.destroyed then
print("[PolyZone] Warning: Called isPointInside on destroyed zone {name=" .. self.name .. "}")
return false
end
local center = self.center
local radius = self.radius
if self.useZ then
return #(point - center) < radius
else
return #(point.xy - center.xy) < radius
end
end
function CircleZone:getRadius()
return self.radius
end
function CircleZone:setRadius(radius)
if not radius or radius == self.radius then
return
end
self.radius = radius
self.diameter = radius * 2.0
end
function CircleZone:getCenter()
return self.center
end
function CircleZone:setCenter(center)
if not center or center == self.center then
return
end
self.center = center
end

View File

@ -0,0 +1,369 @@
local mapMinX, mapMinY, mapMaxX, mapMaxY = -3700, -4400, 4500, 8000
local xDivisions = 34
local yDivisions = 50
local xDelta = (mapMaxX - mapMinX) / xDivisions
local yDelta = (mapMaxY - mapMinY) / yDivisions
ComboZone = {}
-- Finds all values in tblA that are not in tblB, using the "id" property
local function tblDifference(tblA, tblB)
local diff
for _, a in ipairs(tblA) do
local found = false
for _, b in ipairs(tblB) do
if b.id == a.id then
found = true
break
end
end
if not found then
diff = diff or {}
diff[#diff+1] = a
end
end
return diff
end
local function _differenceBetweenInsideZones(insideZones, newInsideZones)
local insideZonesCount, newInsideZonesCount = #insideZones, #newInsideZones
if insideZonesCount == 0 and newInsideZonesCount == 0 then
-- No zones to check
return false, nil, nil
elseif insideZonesCount == 0 and newInsideZonesCount > 0 then
-- Was in no zones last check, but in 1 or more zones now (just entered all zones in newInsideZones)
return true, copyTbl(newInsideZones), nil
elseif insideZonesCount > 0 and newInsideZonesCount == 0 then
-- Was in 1 or more zones last check, but in no zones now (just left all zones in insideZones)
return true, nil, copyTbl(insideZones)
end
-- Check for zones that were in insideZones, but are not in newInsideZones (zones the player just left)
local leftZones = tblDifference(insideZones, newInsideZones)
-- Check for zones that are in newInsideZones, but were not in insideZones (zones the player just entered)
local enteredZones = tblDifference(newInsideZones, insideZones)
local isDifferent = enteredZones ~= nil or leftZones ~= nil
return isDifferent, enteredZones, leftZones
end
local function _getZoneBounds(zone)
local center = zone.center
local radius = zone.radius or zone.boundingRadius
local minY = (center.y - radius - mapMinY) // yDelta
local maxY = (center.y + radius - mapMinY) // yDelta
local minX = (center.x - radius - mapMinX) // xDelta
local maxX = (center.x + radius - mapMinX) // xDelta
return minY, maxY, minX, maxX
end
local function _removeZoneByFunction(predicateFn, zones)
if predicateFn == nil or zones == nil or #zones == 0 then return end
for i=1, #zones do
local possibleZone = zones[i]
if possibleZone and predicateFn(possibleZone) then
table.remove(zones, i)
return possibleZone
end
end
return nil
end
local function _addZoneToGrid(grid, zone)
local minY, maxY, minX, maxX = _getZoneBounds(zone)
for y=minY, maxY do
local row = grid[y] or {}
for x=minX, maxX do
local cell = row[x] or {}
cell[#cell+1] = zone
row[x] = cell
end
grid[y] = row
end
end
local function _getGridCell(pos)
local x = (pos.x - mapMinX) // xDelta
local y = (pos.y - mapMinY) // yDelta
return x, y
end
function ComboZone:draw(forceDraw)
local zones = self.zones
for i=1, #zones do
local zone = zones[i]
if zone and not zone.destroyed then
zone:draw(forceDraw)
end
end
end
local function _initDebug(zone, options)
if options.debugBlip then zone:addDebugBlip() end
if not options.debugPoly then
return
end
Citizen.CreateThread(function()
while not zone.destroyed do
zone:draw(false)
Citizen.Wait(0)
end
end)
end
function ComboZone:new(zones, options)
options = options or {}
local useGrid = options.useGrid
if useGrid == nil then useGrid = true end
local grid = {}
-- Add a unique id for each zone in the ComboZone and add to grid cache
for i=1, #zones do
local zone = zones[i]
if zone then
zone.id = i
end
if useGrid then _addZoneToGrid(grid, zone) end
end
local zone = {
name = tostring(options.name) or nil,
zones = zones,
useGrid = useGrid,
grid = grid,
debugPoly = options.debugPoly or false,
data = options.data or {},
isComboZone = true,
}
setmetatable(zone, self)
self.__index = self
return zone
end
function ComboZone:Create(zones, options)
local zone = ComboZone:new(zones, options)
_initDebug(zone, options)
AddEventHandler("polyzone:pzcomboinfo", function ()
zone:printInfo()
end)
return zone
end
function ComboZone:getZones(point)
if not self.useGrid then
return self.zones
end
local grid = self.grid
local x, y = _getGridCell(point)
local row = grid[y]
if row == nil or row[x] == nil then
return nil
end
return row[x]
end
function ComboZone:AddZone(zone)
local zones = self.zones
local newIndex = #zones+1
zone.id = newIndex
zones[newIndex] = zone
if self.useGrid then
_addZoneToGrid(self.grid, zone)
end
if self.debugBlip then zone:addDebugBlip() end
end
function ComboZone:RemoveZone(nameOrFn)
local predicateFn = nameOrFn
if type(nameOrFn) == "string" then
-- Create on the fly predicate function if nameOrFn is a string (zone name)
predicateFn = function (zone) return zone.name == nameOrFn end
elseif type(nameOrFn) ~= "function" then
return nil
end
-- Remove from zones table
local zone = _removeZoneByFunction(predicateFn, self.zones)
if not zone then return nil end
-- Remove from grid cache
local grid = self.grid
local minY, maxY, minX, maxX = _getZoneBounds(zone)
for y=minY, maxY do
local row = grid[y]
if row then
for x=minX, maxX do
_removeZoneByFunction(predicateFn, row[x])
end
end
end
return zone
end
function ComboZone:isPointInside(point, zoneName)
if self.destroyed then
print("[PolyZone] Warning: Called isPointInside on destroyed zone {name=" .. self.name .. "}")
return false, {}
end
local zones = self:getZones(point)
if not zones or #zones == 0 then return false end
for i=1, #zones do
local zone = zones[i]
if zone and (zoneName == nil or zoneName == zone.name) and zone:isPointInside(point) then
return true, zone
end
end
return false, nil
end
function ComboZone:isPointInsideExhaustive(point, insideZones)
if self.destroyed then
print("[PolyZone] Warning: Called isPointInside on destroyed zone {name=" .. self.name .. "}")
return false, {}
end
if insideZones ~= nil then
insideZones = clearTbl(insideZones)
else
insideZones = {}
end
local zones = self:getZones(point)
if not zones or #zones == 0 then return false, insideZones end
for i=1, #zones do
local zone = zones[i]
if zone and zone:isPointInside(point) then
insideZones[#insideZones+1] = zone
end
end
return #insideZones > 0, insideZones
end
function ComboZone:destroy()
PolyZone.destroy(self)
local zones = self.zones
for i=1, #zones do
local zone = zones[i]
if zone and not zone.destroyed then
zone:destroy()
end
end
end
function ComboZone:onPointInOut(getPointCb, onPointInOutCb, waitInMS)
-- Localize the waitInMS value for performance reasons (default of 500 ms)
local _waitInMS = 500
if waitInMS ~= nil then _waitInMS = waitInMS end
Citizen.CreateThread(function()
local isInside = nil
local insideZone = nil
while not self.destroyed do
if not self.paused then
local point = getPointCb()
local newIsInside, newInsideZone = self:isPointInside(point)
if newIsInside ~= isInside then
onPointInOutCb(newIsInside, point, newInsideZone or insideZone)
isInside = newIsInside
insideZone = newInsideZone
end
end
Citizen.Wait(_waitInMS)
end
end)
end
function ComboZone:onPointInOutExhaustive(getPointCb, onPointInOutCb, waitInMS)
-- Localize the waitInMS value for performance reasons (default of 500 ms)
local _waitInMS = 500
if waitInMS ~= nil then _waitInMS = waitInMS end
Citizen.CreateThread(function()
local isInside, insideZones = nil, {}
local newIsInside, newInsideZones = nil, {}
while not self.destroyed do
if not self.paused then
local point = getPointCb()
newIsInside, newInsideZones = self:isPointInsideExhaustive(point, newInsideZones)
local isDifferent, enteredZones, leftZones = _differenceBetweenInsideZones(insideZones, newInsideZones)
if newIsInside ~= isInside or isDifferent then
isInside = newIsInside
insideZones = copyTbl(newInsideZones)
onPointInOutCb(isInside, point, insideZones, enteredZones, leftZones)
end
end
Citizen.Wait(_waitInMS)
end
end)
end
function ComboZone:onPlayerInOut(onPointInOutCb, waitInMS)
self:onPointInOut(PolyZone.getPlayerPosition, onPointInOutCb, waitInMS)
end
function ComboZone:onPlayerInOutExhaustive(onPointInOutCb, waitInMS)
self:onPointInOutExhaustive(PolyZone.getPlayerPosition, onPointInOutCb, waitInMS)
end
function ComboZone:addEvent(eventName, zoneName)
if self.events == nil then self.events = {} end
local internalEventName = eventPrefix .. eventName
RegisterNetEvent(internalEventName)
self.events[eventName] = AddEventHandler(internalEventName, function (...)
if self:isPointInside(PolyZone.getPlayerPosition(), zoneName) then
TriggerEvent(eventName, ...)
end
end)
end
function ComboZone:removeEvent(name)
PolyZone.removeEvent(self, name)
end
function ComboZone:addDebugBlip()
self.debugBlip = true
local zones = self.zones
for i=1, #zones do
local zone = zones[i]
if zone then zone:addDebugBlip() end
end
end
function ComboZone:printInfo()
local zones = self.zones
local polyCount, boxCount, circleCount, entityCount, comboCount = 0, 0, 0, 0, 0
for i=1, #zones do
local zone = zones[i]
if zone then
if zone.isEntityZone then entityCount = entityCount + 1
elseif zone.isCircleZone then circleCount = circleCount + 1
elseif zone.isComboZone then comboCount = comboCount + 1
elseif zone.isBoxZone then boxCount = boxCount + 1
elseif zone.isPolyZone then polyCount = polyCount + 1 end
end
end
local name = self.name ~= nil and ("\"" .. self.name .. "\"") or nil
print("-----------------------------------------------------")
print("[PolyZone] Info for ComboZone { name = " .. tostring(name) .. " }:")
print("[PolyZone] Total zones: " .. #zones)
if boxCount > 0 then print("[PolyZone] BoxZones: " .. boxCount) end
if circleCount > 0 then print("[PolyZone] CircleZones: " .. circleCount) end
if polyCount > 0 then print("[PolyZone] PolyZones: " .. polyCount) end
if entityCount > 0 then print("[PolyZone] EntityZones: " .. entityCount) end
if comboCount > 0 then print("[PolyZone] ComboZones: " .. comboCount) end
print("-----------------------------------------------------")
end
function ComboZone:setPaused(paused)
self.paused = paused
end
function ComboZone:isPaused()
return self.paused
end

View File

@ -0,0 +1,143 @@
EntityZone = {}
-- Inherits from BoxZone
setmetatable(EntityZone, { __index = BoxZone })
-- Utility functions
local deg, atan2 = math.deg, math.atan2
local function GetRotation(entity)
local fwdVector = GetEntityForwardVector(entity)
return deg(atan2(fwdVector.y, fwdVector.x))
end
local function _calculateMinAndMaxZ(entity, dimensions, scaleZ, offsetZ)
local min, max = dimensions[1], dimensions[2]
local minX, minY, minZ, maxX, maxY, maxZ = min.x, min.y, min.z, max.x, max.y, max.z
-- Bottom vertices
local p1 = GetOffsetFromEntityInWorldCoords(entity, minX, minY, minZ).z
local p2 = GetOffsetFromEntityInWorldCoords(entity, maxX, minY, minZ).z
local p3 = GetOffsetFromEntityInWorldCoords(entity, maxX, maxY, minZ).z
local p4 = GetOffsetFromEntityInWorldCoords(entity, minX, maxY, minZ).z
-- Top vertices
local p5 = GetOffsetFromEntityInWorldCoords(entity, minX, minY, maxZ).z
local p6 = GetOffsetFromEntityInWorldCoords(entity, maxX, minY, maxZ).z
local p7 = GetOffsetFromEntityInWorldCoords(entity, maxX, maxY, maxZ).z
local p8 = GetOffsetFromEntityInWorldCoords(entity, minX, maxY, maxZ).z
local entityMinZ = math.min(p1, p2, p3, p4, p5, p6, p7, p8)
local entityMaxZ = math.max(p1, p2, p3, p4, p5, p6, p7, p8)
return BoxZone.calculateMinAndMaxZ(entityMinZ, entityMaxZ, scaleZ, offsetZ)
end
-- Initialization functions
local function _initDebug(zone, options)
if options.debugBlip then zone:addDebugBlip() end
if not options.debugPoly and not options.debugBlip then
return
end
Citizen.CreateThread(function()
local entity = zone.entity
local shouldDraw = options.debugPoly
while not zone.destroyed do
UpdateOffsets(entity, zone)
if shouldDraw then zone:draw(false) end
Citizen.Wait(0)
end
end)
end
function EntityZone:new(entity, options)
assert(DoesEntityExist(entity), "Entity does not exist")
local min, max = GetModelDimensions(GetEntityModel(entity))
local dimensions = {min, max}
local length = max.y - min.y
local width = max.x - min.x
local pos = GetEntityCoords(entity)
local zone = BoxZone:new(pos, length, width, options)
if options.useZ == true then
options.minZ, options.maxZ = _calculateMinAndMaxZ(entity, dimensions, zone.scaleZ, zone.offsetZ)
else
options.minZ = nil
options.maxZ = nil
end
zone.entity = entity
zone.dimensions = dimensions
zone.useZ = options.useZ
zone.damageEventHandlers = {}
zone.isEntityZone = true
setmetatable(zone, self)
self.__index = self
return zone
end
function EntityZone:Create(entity, options)
local zone = EntityZone:new(entity, options)
_initDebug(zone, options)
return zone
end
function UpdateOffsets(entity, zone)
local pos = GetEntityCoords(entity)
local rot = GetRotation(entity)
zone.offsetPos = pos.xy - zone.startPos
zone.offsetRot = rot - 90.0
if zone.useZ then
zone.minZ, zone.maxZ = _calculateMinAndMaxZ(entity, zone.dimensions, zone.scaleZ, zone.offsetZ)
end
if zone.debugBlip then SetBlipCoords(zone.debugBlip, pos.x, pos.y, 0.0) end
end
-- Helper functions
function EntityZone:isPointInside(point)
local entity = self.entity
if entity == nil then
print("[PolyZone] Error: Called isPointInside on Entity zone with no entity {name=" .. self.name .. "}")
return false
end
UpdateOffsets(entity, self)
return BoxZone.isPointInside(self, point)
end
function EntityZone:onEntityDamaged(onDamagedCb)
local entity = self.entity
if not entity then
print("[PolyZone] Error: Called onEntityDamage on Entity Zone with no entity {name=" .. self.name .. "}")
return
end
self.damageEventHandlers[#self.damageEventHandlers + 1] = AddEventHandler('gameEventTriggered', function (name, args)
if self.destroyed or self.paused then
return
end
if name == 'CEventNetworkEntityDamage' then
local victim, attacker, victimDied, weaponHash, isMelee = args[1], args[2], args[4], args[5], args[10]
--print(entity, victim, attacker, victimDied, weaponHash, isMelee)
if victim ~= entity then return end
onDamagedCb(victimDied == 1, attacker, weaponHash, isMelee == 1)
end
end)
end
function EntityZone:destroy()
for i=1, #self.damageEventHandlers do
print("Destroying damageEventHandler:", self.damageEventHandlers[i])
RemoveEventHandler(self.damageEventHandlers[i])
end
self.damageEventHandlers = {}
PolyZone.destroy(self)
end
function EntityZone:addDebugBlip()
local blip = PolyZone.addDebugBlip(self)
self.debugBlip = blip
return blip
end

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019-2021 Michael Afrin
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,51 @@
# PolyZone
PolyZone is a FiveM mod to define zones of different shapes and test whether a point is inside or outside of the zone
![PolyZone around the prison](https://i.imgur.com/InKNaoL.jpg)
## Download
Click [here](https://github.com/mkafrin/PolyZone/releases) to go to the releases page and download the latest release
## Using PolyZone in a Script
In order to use PolyZone in your script, you must _at least_ include PolyZone's client.lua directly in your __resource.lua or fxmanifest.lua. You can do that by using FiveM's @ syntax for importing resource files:
```lua
client_scripts {
'@PolyZone/client.lua',
'your_scripts_client.lua',
}
```
This will allow you to create PolyZones in your script, but will not import other zones, such as CircleZone, BoxZone, etc. All the other zones are extra, and require their own explicit imports. Here is a `client_scripts` value that will include all the zones. Note the relative order of these imports, as the ordering is necessary! Many zones rely on each other, for example EntityZone inherits from BoxZone, and all zones inherit from PolyZone (client.lua).
```lua
client_scripts {
'@PolyZone/client.lua',
'@PolyZone/BoxZone.lua',
'@PolyZone/EntityZone.lua',
'@PolyZone/CircleZone.lua',
'@PolyZone/ComboZone.lua',
'your_scripts_client.lua'
}
```
## Documentation
For additional information on how to use PolyZone, please take a look at the [wiki](https://github.com/mkafrin/PolyZone/wiki)
## Troubleshooting and Support
For help troubleshooting issues you've encountered (that aren't in the FAQ), or to suggest new features, use the [issues page](https://github.com/mkafrin/PolyZone/issues). Just a reminder though, I do this in my free time and so there is no guarantee an issue will be fixed or a feature will be added. In lieu of my limited time, I will prioritize issues and bugs over features.
## FAQ - Frequently Asked Questions
**I'm getting the error `attempt to index a nil value` when creating a zone, what's wrong?**
> Did you include all the necessary scripts in your \_\_resource.lua or fxmanifest.lua? Remember some zones require other zones, like EntityZone.lua requires BoxZone.lua and BoxZone.lua requires client.lua.
**I'm getting no errors, but I can't see my zone in the right place when I turn on debug drawing**
> If you are using them, is minZ and maxZ set correctly? Or if you are using a CircleZone with useZ=true, is your center's Z value correct? If using a PolyZone, did you manually select all your points, or use the creation script? If you did it manually, the ordering of the points could be causing issues. Are you using the correct option to enable debug drawing? For PolyZones, you can use `debugPoly` and `debugGrid`, but for other zones, `debugPoly` is the only one that works.
**Is PolyZone faster than a distance check?**
> There's a page in the wiki for that, [here](https://github.com/mkafrin/PolyZone/wiki/Is-PolyZone-faster-than-a-distance-check%3F).
## License
**Please see the LICENSE file. That file will always overrule anything mentioned in the README.md or wiki**

View File

@ -0,0 +1,601 @@
eventPrefix = '__PolyZone__:'
PolyZone = {}
local defaultColorWalls = {0, 255, 0}
local defaultColorOutline = {255, 0, 0}
local defaultColorGrid = {255, 255, 255}
-- Utility functions
local abs = math.abs
local function _isLeft(p0, p1, p2)
local p0x = p0.x
local p0y = p0.y
return ((p1.x - p0x) * (p2.y - p0y)) - ((p2.x - p0x) * (p1.y - p0y))
end
local function _wn_inner_loop(p0, p1, p2, wn)
local p2y = p2.y
if (p0.y <= p2y) then
if (p1.y > p2y) then
if (_isLeft(p0, p1, p2) > 0) then
return wn + 1
end
end
else
if (p1.y <= p2y) then
if (_isLeft(p0, p1, p2) < 0) then
return wn - 1
end
end
end
return wn
end
function addBlip(pos)
local blip = AddBlipForCoord(pos.x, pos.y, 0.0)
SetBlipColour(blip, 7)
SetBlipDisplay(blip, 8)
SetBlipScale(blip, 1.0)
SetBlipAsShortRange(blip, true)
return blip
end
function clearTbl(tbl)
-- Only works with contiguous (array-like) tables
if tbl == nil then return end
for i=1, #tbl do
tbl[i] = nil
end
return tbl
end
function copyTbl(tbl)
-- Only a shallow copy, and only works with contiguous (array-like) tables
if tbl == nil then return end
local ret = {}
for i=1, #tbl do
ret[i] = tbl[i]
end
return ret
end
-- Winding Number Algorithm - http://geomalgorithms.com/a03-_inclusion.html
local function _windingNumber(point, poly)
local wn = 0 -- winding number counter
-- loop through all edges of the polygon
for i = 1, #poly - 1 do
wn = _wn_inner_loop(poly[i], poly[i + 1], point, wn)
end
-- test last point to first point, completing the polygon
wn = _wn_inner_loop(poly[#poly], poly[1], point, wn)
-- the point is outside only when this winding number wn===0, otherwise it's inside
return wn ~= 0
end
-- Detects intersection between two lines
local function _isIntersecting(a, b, c, d)
-- Store calculations in local variables for performance
local ax_minus_cx = a.x - c.x
local bx_minus_ax = b.x - a.x
local dx_minus_cx = d.x - c.x
local ay_minus_cy = a.y - c.y
local by_minus_ay = b.y - a.y
local dy_minus_cy = d.y - c.y
local denominator = ((bx_minus_ax) * (dy_minus_cy)) - ((by_minus_ay) * (dx_minus_cx))
local numerator1 = ((ay_minus_cy) * (dx_minus_cx)) - ((ax_minus_cx) * (dy_minus_cy))
local numerator2 = ((ay_minus_cy) * (bx_minus_ax)) - ((ax_minus_cx) * (by_minus_ay))
-- Detect coincident lines
if denominator == 0 then return numerator1 == 0 and numerator2 == 0 end
local r = numerator1 / denominator
local s = numerator2 / denominator
return (r >= 0 and r <= 1) and (s >= 0 and s <= 1)
end
-- https://rosettacode.org/wiki/Shoelace_formula_for_polygonal_area#Lua
local function _calculatePolygonArea(points)
local function det2(i,j)
return points[i].x*points[j].y-points[j].x*points[i].y
end
local sum = #points>2 and det2(#points,1) or 0
for i=1,#points-1 do sum = sum + det2(i,i+1)end
return abs(0.5 * sum)
end
-- Debug drawing functions
function _drawWall(p1, p2, minZ, maxZ, r, g, b, a)
local bottomLeft = vector3(p1.x, p1.y, minZ)
local topLeft = vector3(p1.x, p1.y, maxZ)
local bottomRight = vector3(p2.x, p2.y, minZ)
local topRight = vector3(p2.x, p2.y, maxZ)
DrawPoly(bottomLeft,topLeft,bottomRight,r,g,b,a)
DrawPoly(topLeft,topRight,bottomRight,r,g,b,a)
DrawPoly(bottomRight,topRight,topLeft,r,g,b,a)
DrawPoly(bottomRight,topLeft,bottomLeft,r,g,b,a)
end
function PolyZone:TransformPoint(point)
-- No point transform necessary for regular PolyZones, unlike zones like Entity Zones, whose points can be rotated and offset
return point
end
function PolyZone:draw(forceDraw)
if not forceDraw and not self.debugPoly and not self.debugGrid then return end
local zDrawDist = 45.0
local oColor = self.debugColors.outline or defaultColorOutline
local oR, oG, oB = oColor[1], oColor[2], oColor[3]
local wColor = self.debugColors.walls or defaultColorWalls
local wR, wG, wB = wColor[1], wColor[2], wColor[3]
local plyPed = PlayerPedId()
local plyPos = GetEntityCoords(plyPed)
local minZ = self.minZ or plyPos.z - zDrawDist
local maxZ = self.maxZ or plyPos.z + zDrawDist
local points = self.points
for i=1, #points do
local point = self:TransformPoint(points[i])
DrawLine(point.x, point.y, minZ, point.x, point.y, maxZ, oR, oG, oB, 164)
if i < #points then
local p2 = self:TransformPoint(points[i+1])
DrawLine(point.x, point.y, maxZ, p2.x, p2.y, maxZ, oR, oG, oB, 184)
_drawWall(point, p2, minZ, maxZ, wR, wG, wB, 48)
end
end
if #points > 2 then
local firstPoint = self:TransformPoint(points[1])
local lastPoint = self:TransformPoint(points[#points])
DrawLine(firstPoint.x, firstPoint.y, maxZ, lastPoint.x, lastPoint.y, maxZ, oR, oG, oB, 184)
_drawWall(firstPoint, lastPoint, minZ, maxZ, wR, wG, wB, 48)
end
end
function PolyZone.drawPoly(poly, forceDraw)
PolyZone.draw(poly, forceDraw)
end
-- Debug drawing all grid cells that are completly within the polygon
local function _drawGrid(poly)
local minZ = poly.minZ
local maxZ = poly.maxZ
if not minZ or not maxZ then
local plyPed = PlayerPedId()
local plyPos = GetEntityCoords(plyPed)
minZ = plyPos.z - 46.0
maxZ = plyPos.z - 45.0
end
local lines = poly.lines
local color = poly.debugColors.grid or defaultColorGrid
local r, g, b = color[1], color[2], color[3]
for i=1, #lines do
local line = lines[i]
local min = line.min
local max = line.max
DrawLine(min.x + 0.0, min.y + 0.0, maxZ + 0.0, max.x + 0.0, max.y + 0.0, maxZ + 0.0, r, g, b, 196)
end
end
local function _pointInPoly(point, poly)
local x = point.x
local y = point.y
local min = poly.min
local minX = min.x
local minY = min.y
local max = poly.max
-- Checks if point is within the polygon's bounding box
if x < minX or
x > max.x or
y < minY or
y > max.y then
return false
end
-- Checks if point is within the polygon's height bounds
local minZ = poly.minZ
local maxZ = poly.maxZ
local z = point.z
if (minZ and z < minZ) or (maxZ and z > maxZ) then
return false
end
-- Returns true if the grid cell associated with the point is entirely inside the poly
local grid = poly.grid
if grid then
local gridDivisions = poly.gridDivisions
local size = poly.size
local gridPosX = x - minX
local gridPosY = y - minY
local gridCellX = (gridPosX * gridDivisions) // size.x
local gridCellY = (gridPosY * gridDivisions) // size.y
local gridCellValue = grid[gridCellY + 1][gridCellX + 1]
if gridCellValue == nil and poly.lazyGrid then
gridCellValue = _isGridCellInsidePoly(gridCellX, gridCellY, poly)
grid[gridCellY + 1][gridCellX + 1] = gridCellValue
end
if gridCellValue then return true end
end
return _windingNumber(point, poly.points)
end
-- Grid creation functions
-- Calculates the points of the rectangle that make up the grid cell at grid position (cellX, cellY)
local function _calculateGridCellPoints(cellX, cellY, poly)
local gridCellWidth = poly.gridCellWidth
local gridCellHeight = poly.gridCellHeight
local min = poly.min
-- min added to initial point, in order to shift the grid cells to the poly's starting position
local x = cellX * gridCellWidth + min.x
local y = cellY * gridCellHeight + min.y
return {
vector2(x, y),
vector2(x + gridCellWidth, y),
vector2(x + gridCellWidth, y + gridCellHeight),
vector2(x, y + gridCellHeight),
vector2(x, y)
}
end
function _isGridCellInsidePoly(cellX, cellY, poly)
gridCellPoints = _calculateGridCellPoints(cellX, cellY, poly)
local polyPoints = {table.unpack(poly.points)}
-- Connect the polygon to its starting point
polyPoints[#polyPoints + 1] = polyPoints[1]
-- If none of the points of the grid cell are in the polygon, the grid cell can't be in it
local isOnePointInPoly = false
for i=1, #gridCellPoints - 1 do
local cellPoint = gridCellPoints[i]
local x = cellPoint.x
local y = cellPoint.y
if _windingNumber(cellPoint, poly.points) then
isOnePointInPoly = true
-- If we are drawing the grid (poly.lines ~= nil), we need to go through all the points,
-- and therefore can't break out of the loop early
if poly.lines then
if not poly.gridXPoints[x] then poly.gridXPoints[x] = {} end
if not poly.gridYPoints[y] then poly.gridYPoints[y] = {} end
poly.gridXPoints[x][y] = true
poly.gridYPoints[y][x] = true
else break end
end
end
if isOnePointInPoly == false then
return false
end
-- If any of the grid cell's lines intersects with any of the polygon's lines
-- then the grid cell is not completely within the poly
for i=1, #gridCellPoints - 1 do
local gridCellP1 = gridCellPoints[i]
local gridCellP2 = gridCellPoints[i+1]
for j=1, #polyPoints - 1 do
if _isIntersecting(gridCellP1, gridCellP2, polyPoints[j], polyPoints[j+1]) then
return false
end
end
end
return true
end
local function _calculateLinesForDrawingGrid(poly)
local lines = {}
for x, tbl in pairs(poly.gridXPoints) do
local yValues = {}
-- Turn dict/set of values into array
for y, _ in pairs(tbl) do yValues[#yValues + 1] = y end
if #yValues >= 2 then
table.sort(yValues)
local minY = yValues[1]
local lastY = yValues[1]
for i=1, #yValues do
local y = yValues[i]
-- Checks for breaks in the grid. If the distance between the last value and the current one
-- is greater than the size of a grid cell, that means the line between them must go outside the polygon.
-- Therefore, a line must be created between minY and the lastY, and a new line started at the current y
if y - lastY > poly.gridCellHeight + 0.01 then
lines[#lines+1] = {min=vector2(x, minY), max=vector2(x, lastY)}
minY = y
elseif i == #yValues then
-- If at the last point, create a line between minY and the last point
lines[#lines+1] = {min=vector2(x, minY), max=vector2(x, y)}
end
lastY = y
end
end
end
-- Setting nil to allow the GC to clear it out of memory, since we no longer need this
poly.gridXPoints = nil
-- Same as above, but for gridYPoints instead of gridXPoints
for y, tbl in pairs(poly.gridYPoints) do
local xValues = {}
for x, _ in pairs(tbl) do xValues[#xValues + 1] = x end
if #xValues >= 2 then
table.sort(xValues)
local minX = xValues[1]
local lastX = xValues[1]
for i=1, #xValues do
local x = xValues[i]
if x - lastX > poly.gridCellWidth + 0.01 then
lines[#lines+1] = {min=vector2(minX, y), max=vector2(lastX, y)}
minX = x
elseif i == #xValues then
lines[#lines+1] = {min=vector2(minX, y), max=vector2(x, y)}
end
lastX = x
end
end
end
poly.gridYPoints = nil
return lines
end
-- Calculate for each grid cell whether it is entirely inside the polygon, and store if true
local function _createGrid(poly, options)
poly.gridArea = 0.0
poly.gridCellWidth = poly.size.x / poly.gridDivisions
poly.gridCellHeight = poly.size.y / poly.gridDivisions
Citizen.CreateThread(function()
-- Calculate all grid cells that are entirely inside the polygon
local isInside = {}
local gridCellArea = poly.gridCellWidth * poly.gridCellHeight
for y=1, poly.gridDivisions do
Citizen.Wait(0)
isInside[y] = {}
for x=1, poly.gridDivisions do
if _isGridCellInsidePoly(x-1, y-1, poly) then
poly.gridArea = poly.gridArea + gridCellArea
isInside[y][x] = true
end
end
end
poly.grid = isInside
poly.gridCoverage = poly.gridArea / poly.area
-- A lot of memory is used by this pre-calc. Force a gc collect after to clear it out
collectgarbage("collect")
if options.debugGrid then
local coverage = string.format("%.2f", poly.gridCoverage * 100)
print("[PolyZone] Debug: Grid Coverage at " .. coverage .. "% with " .. poly.gridDivisions
.. " divisions. Optimal coverage for memory usage and startup time is 80-90%")
Citizen.CreateThread(function()
poly.lines = _calculateLinesForDrawingGrid(poly)
-- A lot of memory is used by this pre-calc. Force a gc collect after to clear it out
collectgarbage("collect")
end)
end
end)
end
-- Initialization functions
local function _calculatePoly(poly, options)
if not poly.min or not poly.max or not poly.size or not poly.center or not poly.area then
local minX, minY = math.maxinteger, math.maxinteger
local maxX, maxY = math.mininteger, math.mininteger
for _, p in ipairs(poly.points) do
minX = math.min(minX, p.x)
minY = math.min(minY, p.y)
maxX = math.max(maxX, p.x)
maxY = math.max(maxY, p.y)
end
poly.min = vector2(minX, minY)
poly.max = vector2(maxX, maxY)
poly.size = poly.max - poly.min
poly.center = (poly.max + poly.min) / 2
poly.area = _calculatePolygonArea(poly.points)
end
poly.boundingRadius = math.sqrt(poly.size.y * poly.size.y + poly.size.x * poly.size.x) / 2
if poly.useGrid and not poly.lazyGrid then
if options.debugGrid then
poly.gridXPoints = {}
poly.gridYPoints = {}
poly.lines = {}
end
_createGrid(poly, options)
elseif poly.useGrid then
local isInside = {}
for y=1, poly.gridDivisions do
isInside[y] = {}
end
poly.grid = isInside
poly.gridCellWidth = poly.size.x / poly.gridDivisions
poly.gridCellHeight = poly.size.y / poly.gridDivisions
end
end
local function _initDebug(poly, options)
if options.debugBlip then poly:addDebugBlip() end
local debugEnabled = options.debugPoly or options.debugGrid
if not debugEnabled then
return
end
Citizen.CreateThread(function()
while not poly.destroyed do
poly:draw(false)
if options.debugGrid and poly.lines then
_drawGrid(poly)
end
Citizen.Wait(0)
end
end)
end
function PolyZone:new(points, options)
if not points then
print("[PolyZone] Error: Passed nil points table to PolyZone:Create() {name=" .. options.name .. "}")
return
end
if #points < 3 then
print("[PolyZone] Warning: Passed points table with less than 3 points to PolyZone:Create() {name=" .. options.name .. "}")
end
options = options or {}
local useGrid = options.useGrid
if useGrid == nil then useGrid = true end
local lazyGrid = options.lazyGrid
if lazyGrid == nil then lazyGrid = true end
local poly = {
name = tostring(options.name) or nil,
points = points,
center = options.center,
size = options.size,
max = options.max,
min = options.min,
area = options.area,
minZ = tonumber(options.minZ) or nil,
maxZ = tonumber(options.maxZ) or nil,
useGrid = useGrid,
lazyGrid = lazyGrid,
gridDivisions = tonumber(options.gridDivisions) or 30,
debugColors = options.debugColors or {},
debugPoly = options.debugPoly or false,
debugGrid = options.debugGrid or false,
data = options.data or {},
isPolyZone = true,
}
if poly.debugGrid then poly.lazyGrid = false end
_calculatePoly(poly, options)
setmetatable(poly, self)
self.__index = self
return poly
end
function PolyZone:Create(points, options)
local poly = PolyZone:new(points, options)
_initDebug(poly, options)
return poly
end
function PolyZone:isPointInside(point)
if self.destroyed then
print("[PolyZone] Warning: Called isPointInside on destroyed zone {name=" .. self.name .. "}")
return false
end
return _pointInPoly(point, self)
end
function PolyZone:destroy()
self.destroyed = true
if self.debugPoly or self.debugGrid then
print("[PolyZone] Debug: Destroying zone {name=" .. self.name .. "}")
end
end
-- Helper functions
function PolyZone.getPlayerPosition()
return GetEntityCoords(PlayerPedId())
end
HeadBone = 0x796e;
function PolyZone.getPlayerHeadPosition()
return GetPedBoneCoords(PlayerPedId(), HeadBone);
end
function PolyZone.ensureMetatable(zone)
if zone.isComboZone then
setmetatable(zone, ComboZone)
elseif zone.isEntityZone then
setmetatable(zone, EntityZone)
elseif zone.isBoxZone then
setmetatable(zone, BoxZone)
elseif zone.isCircleZone then
setmetatable(zone, CircleZone)
elseif zone.isPolyZone then
setmetatable(zone, PolyZone)
end
end
function PolyZone:onPointInOut(getPointCb, onPointInOutCb, waitInMS)
-- Localize the waitInMS value for performance reasons (default of 500 ms)
local _waitInMS = 500
if waitInMS ~= nil then _waitInMS = waitInMS end
Citizen.CreateThread(function()
local isInside = false
while not self.destroyed do
if not self.paused then
local point = getPointCb()
local newIsInside = self:isPointInside(point)
if newIsInside ~= isInside then
onPointInOutCb(newIsInside, point)
isInside = newIsInside
end
end
Citizen.Wait(_waitInMS)
end
end)
end
function PolyZone:onPlayerInOut(onPointInOutCb, waitInMS)
self:onPointInOut(PolyZone.getPlayerPosition, onPointInOutCb, waitInMS)
end
function PolyZone:addEvent(eventName)
if self.events == nil then self.events = {} end
local internalEventName = eventPrefix .. eventName
RegisterNetEvent(internalEventName)
self.events[eventName] = AddEventHandler(internalEventName, function (...)
if self:isPointInside(PolyZone.getPlayerPosition()) then
TriggerEvent(eventName, ...)
end
end)
end
function PolyZone:removeEvent(eventName)
if self.events and self.events[eventName] then
RemoveEventHandler(self.events[eventName])
self.events[eventName] = nil
end
end
function PolyZone:addDebugBlip()
return addBlip(self.center or self:getBoundingBoxCenter())
end
function PolyZone:setPaused(paused)
self.paused = paused
end
function PolyZone:isPaused()
return self.paused
end
function PolyZone:getBoundingBoxMin()
return self.min
end
function PolyZone:getBoundingBoxMax()
return self.max
end
function PolyZone:getBoundingBoxSize()
return self.size
end
function PolyZone:getBoundingBoxCenter()
return self.center
end

View File

@ -0,0 +1,113 @@
local function handleInput(useZ, heading, length, width, center)
if not useZ then
local scaleDelta, headingDelta = 0.2, 5
BlockWeaponWheelThisFrame()
if IsDisabledControlPressed(0, 36) then -- ctrl held down
scaleDelta, headingDelta = 0.05, 1
end
if IsDisabledControlJustPressed(0, 81) then -- scroll wheel down just pressed
if IsDisabledControlPressed(0, 19) then -- alt held down
return heading, length, math.max(0.0, width - scaleDelta), center
end
if IsDisabledControlPressed(0, 21) then -- shift held down
return heading, math.max(0.0, length - scaleDelta), width, center
end
return (heading - headingDelta) % 360, length, width, center
end
if IsDisabledControlJustPressed(0, 99) then -- scroll wheel up just pressed
if IsDisabledControlPressed(0, 19) then -- alt held down
return heading, length, math.max(0.0, width + scaleDelta), center
end
if IsDisabledControlPressed(0, 21) then -- shift held down
return heading, math.max(0.0, length + scaleDelta), width, center
end
return (heading + headingDelta) % 360, length, width, center
end
end
local rot = GetGameplayCamRot(2)
center = handleArrowInput(center, rot.z)
return heading, length, width, center
end
function handleZ(minZ, maxZ)
local delta = 0.2
if IsDisabledControlPressed(0, 36) then -- ctrl held down
delta = 0.05
end
BlockWeaponWheelThisFrame()
if IsDisabledControlJustPressed(0, 81) then -- scroll wheel down just pressed
if IsDisabledControlPressed(0, 19) then -- alt held down
return minZ - delta, maxZ
end
if IsDisabledControlPressed(0, 21) then -- shift held down
return minZ, maxZ - delta
end
return minZ - delta, maxZ - delta
end
if IsDisabledControlJustPressed(0, 99) then -- scroll wheel up just pressed
if IsDisabledControlPressed(0, 19) then -- alt held down
return minZ + delta, maxZ
end
if IsDisabledControlPressed(0, 21) then -- shift held down
return minZ, maxZ + delta
end
return minZ + delta, maxZ + delta
end
return minZ, maxZ
end
function boxStart(name, heading, length, width, minHeight, maxHeight)
local center = GetEntityCoords(PlayerPedId())
createdZone = BoxZone:Create(center, length, width, {name = tostring(name)})
local useZ, minZ, maxZ = false, center.z - 1.0, center.z + 3.0
if minHeight then
minZ = center.z - minHeight
createdZone.minZ = minZ
end
if maxHeight then
maxZ = center.z + maxHeight
createdZone.maxZ = maxZ
end
Citizen.CreateThread(function()
while createdZone do
if IsDisabledControlJustPressed(0, 20) then -- Z pressed
useZ = not useZ
if useZ then
createdZone.debugColors.walls = {255, 0, 0}
else
createdZone.debugColors.walls = {0, 255, 0}
end
end
heading, length, width, center = handleInput(useZ, heading, length, width, center)
if useZ then
minZ, maxZ = handleZ(minZ, maxZ)
createdZone.minZ = minZ
createdZone.maxZ = maxZ
end
createdZone:setLength(length)
createdZone:setWidth(width)
createdZone:setHeading(heading)
createdZone:setCenter(center)
Wait(0)
end
end)
end
function boxFinish()
TriggerServerEvent("polyzone:printBox",
{name=createdZone.name, center=createdZone.center, length=createdZone.length, width=createdZone.width, heading=createdZone.offsetRot, minZ=createdZone.minZ, maxZ=createdZone.maxZ})
end

View File

@ -0,0 +1,54 @@
local function handleInput(radius, center, useZ)
local delta = 0.05
BlockWeaponWheelThisFrame()
if IsDisabledControlPressed(0, 36) then -- ctrl held down
delta = 0.01
end
if IsDisabledControlJustPressed(0, 81) then -- scroll wheel down just pressed
if IsDisabledControlPressed(0, 19) then -- alt held down
return radius, vector3(center.x, center.y, center.z - delta), useZ
end
return math.max(0.0, radius - delta), center, useZ
end
if IsDisabledControlJustPressed(0, 99) then -- scroll wheel up just pressed
if IsDisabledControlPressed(0, 19) then -- alt held down
return radius, vector3(center.x, center.y, center.z + delta), useZ
end
return radius + delta, center, useZ
end
if IsDisabledControlJustPressed(0, 20) then -- Z pressed
return radius, center, not useZ
end
local rot = GetGameplayCamRot(2)
center = handleArrowInput(center, rot.z)
return radius, center, useZ
end
function circleStart(name, radius, useZ)
local center = GetEntityCoords(PlayerPedId())
useZ = useZ or false
createdZone = CircleZone:Create(center, radius, {name = tostring(name), useZ = useZ})
Citizen.CreateThread(function()
while createdZone do
radius, center, useZ = handleInput(radius, center, useZ)
createdZone:setRadius(radius)
createdZone:setCenter(center)
createdZone.useZ = useZ
Wait(0)
end
end)
end
function circleFinish()
TriggerServerEvent("polyzone:printCircle",
{name=createdZone.name, center=createdZone.center, radius=createdZone.radius, useZ=createdZone.useZ})
end

View File

@ -0,0 +1,60 @@
local minZ, maxZ = nil, nil
local function handleInput(center)
local rot = GetGameplayCamRot(2)
center = handleArrowInput(center, rot.z)
return center
end
function polyStart(name)
local coords = GetEntityCoords(PlayerPedId())
createdZone = PolyZone:Create({vector2(coords.x, coords.y)}, {name = tostring(name), useGrid=false})
Citizen.CreateThread(function()
while createdZone do
-- Have to convert the point to a vector3 prior to calling handleInput,
-- then convert it back to vector2 afterwards
lastPoint = createdZone.points[#createdZone.points]
lastPoint = vector3(lastPoint.x, lastPoint.y, 0.0)
lastPoint = handleInput(lastPoint)
createdZone.points[#createdZone.points] = lastPoint.xy
Wait(0)
end
end)
minZ, maxZ = coords.z, coords.z
end
function polyFinish()
TriggerServerEvent("polyzone:printPoly",
{name=createdZone.name, points=createdZone.points, minZ=minZ, maxZ=maxZ})
end
RegisterNetEvent("polyzone:pzadd")
AddEventHandler("polyzone:pzadd", function()
if createdZone == nil or createdZoneType ~= 'poly' then
return
end
local coords = GetEntityCoords(PlayerPedId())
if (coords.z > maxZ) then
maxZ = coords.z
end
if (coords.z < minZ) then
minZ = coords.z
end
createdZone.points[#createdZone.points + 1] = vector2(coords.x, coords.y)
end)
RegisterNetEvent("polyzone:pzundo")
AddEventHandler("polyzone:pzundo", function()
if createdZone == nil or createdZoneType ~= 'poly' then
return
end
createdZone.points[#createdZone.points] = nil
if #createdZone.points == 0 then
TriggerEvent("polyzone:pzcancel")
end
end)

View File

@ -0,0 +1,68 @@
RegisterCommand("pzcreate", function(src, args)
local zoneType = args[1]
if zoneType == nil then
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0},
multiline = true,
args = {"Me", "Please add zone type to create (poly, circle, box)!"}
})
return
end
if zoneType ~= 'poly' and zoneType ~= 'circle' and zoneType ~= 'box' then
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0},
multiline = true,
args = {"Me", "Zone type must be one of: poly, circle, box"}
})
return
end
local name = nil
if #args >= 2 then name = args[2]
else name = GetUserInput("Enter name of zone:") end
if name == nil or name == "" then
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0},
multiline = true,
args = {"Me", "Please add a name!"}
})
return
end
TriggerEvent("polyzone:pzcreate", zoneType, name, args)
end)
RegisterCommand("pzadd", function(src, args)
TriggerEvent("polyzone:pzadd")
end)
RegisterCommand("pzundo", function(src, args)
TriggerEvent("polyzone:pzundo")
end)
RegisterCommand("pzfinish", function(src, args)
TriggerEvent("polyzone:pzfinish")
end)
RegisterCommand("pzlast", function(src, args)
TriggerEvent("polyzone:pzlast")
end)
RegisterCommand("pzcancel", function(src, args)
TriggerEvent("polyzone:pzcancel")
end)
RegisterCommand("pzcomboinfo", function (src, args)
TriggerEvent("polyzone:pzcomboinfo")
end)
Citizen.CreateThread(function()
TriggerEvent('chat:addSuggestion', '/pzcreate', 'Starts creation of a zone for PolyZone of one of the available types: circle, box, poly', {
{name="zoneType", help="Zone Type (required)"},
})
TriggerEvent('chat:addSuggestion', '/pzadd', 'Adds point to zone.', {})
TriggerEvent('chat:addSuggestion', '/pzundo', 'Undoes the last point added.', {})
TriggerEvent('chat:addSuggestion', '/pzfinish', 'Finishes and prints zone.', {})
TriggerEvent('chat:addSuggestion', '/pzlast', 'Starts creation of the last zone you finished (only works on BoxZone and CircleZone)', {})
TriggerEvent('chat:addSuggestion', '/pzcancel', 'Cancel zone creation.', {})
TriggerEvent('chat:addSuggestion', '/pzcomboinfo', 'Prints some useful info for all created ComboZones', {})
end)

View File

@ -0,0 +1,158 @@
lastCreatedZoneType = nil
lastCreatedZone = nil
createdZoneType = nil
createdZone = nil
drawZone = false
RegisterNetEvent("polyzone:pzcreate")
AddEventHandler("polyzone:pzcreate", function(zoneType, name, args)
if createdZone ~= nil then
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0},
multiline = true,
args = {"Me", "A shape is already being created!"}
})
return
end
if zoneType == 'poly' then
polyStart(name)
elseif zoneType == "circle" then
local radius = nil
if #args >= 3 then radius = tonumber(args[3])
else radius = tonumber(GetUserInput("Enter radius:")) end
if radius == nil then
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0},
multiline = true,
args = {"Me", "CircleZone requires a radius (must be a number)!"}
})
return
end
circleStart(name, radius)
elseif zoneType == "box" then
local length = nil
if #args >= 3 then length = tonumber(args[3])
else length = tonumber(GetUserInput("Enter length:")) end
if length == nil or length < 0.0 then
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0},
multiline = true,
args = {"Me", "BoxZone requires a length (must be a positive number)!"}
})
return
end
local width = nil
if #args >= 4 then width = tonumber(args[4])
else width = tonumber(GetUserInput("Enter width:")) end
if width == nil or width < 0.0 then
TriggerEvent('chat:addMessage', {
color = { 255, 0, 0},
multiline = true,
args = {"Me", "BoxZone requires a width (must be a positive number)!"}
})
return
end
boxStart(name, 0, length, width)
else
return
end
createdZoneType = zoneType
drawZone = true
disableControlKeyInput()
drawThread()
end)
RegisterNetEvent("polyzone:pzfinish")
AddEventHandler("polyzone:pzfinish", function()
if createdZone == nil then
return
end
if createdZoneType == 'poly' then
polyFinish()
elseif createdZoneType == "circle" then
circleFinish()
elseif createdZoneType == "box" then
boxFinish()
end
TriggerEvent('chat:addMessage', {
color = { 0, 255, 0},
multiline = true,
args = {"Me", "Check PolyZone's root folder for polyzone_created_zones.txt to get the zone!"}
})
lastCreatedZoneType = createdZoneType
lastCreatedZone = createdZone
drawZone = false
createdZone = nil
createdZoneType = nil
end)
RegisterNetEvent("polyzone:pzlast")
AddEventHandler("polyzone:pzlast", function()
if createdZone ~= nil or lastCreatedZone == nil then
return
end
if lastCreatedZoneType == 'poly' then
TriggerEvent('chat:addMessage', {
color = { 0, 255, 0},
multiline = true,
args = {"Me", "The command pzlast only supports BoxZone and CircleZone for now"}
})
end
local name = GetUserInput("Enter name (or leave empty to reuse last zone's name):")
if name == nil then
return
elseif name == "" then
name = lastCreatedZone.name
end
createdZoneType = lastCreatedZoneType
if createdZoneType == 'box' then
local minHeight, maxHeight
if lastCreatedZone.minZ then
minHeight = lastCreatedZone.center.z - lastCreatedZone.minZ
end
if lastCreatedZone.maxZ then
maxHeight = lastCreatedZone.maxZ - lastCreatedZone.center.z
end
boxStart(name, lastCreatedZone.offsetRot, lastCreatedZone.length, lastCreatedZone.width, minHeight, maxHeight)
elseif createdZoneType == 'circle' then
circleStart(name, lastCreatedZone.radius, lastCreatedZone.useZ)
end
drawZone = true
disableControlKeyInput()
drawThread()
end)
RegisterNetEvent("polyzone:pzcancel")
AddEventHandler("polyzone:pzcancel", function()
if createdZone == nil then
return
end
TriggerEvent('chat:addMessage', {
color = {255, 0, 0},
multiline = true,
args = {"Me", "Zone creation canceled!"}
})
drawZone = false
createdZone = nil
createdZoneType = nil
end)
-- Drawing
function drawThread()
Citizen.CreateThread(function()
while drawZone do
if createdZone then
createdZone:draw(true)
end
Wait(0)
end
end)
end

View File

@ -0,0 +1,75 @@
-- GetUserInput function inspired by vMenu (https://github.com/TomGrobbe/vMenu/blob/master/vMenu/CommonFunctions.cs)
function GetUserInput(windowTitle, defaultText, maxInputLength)
-- Create the window title string.
local resourceName = string.upper(GetCurrentResourceName())
local textEntry = resourceName .. "_WINDOW_TITLE"
if windowTitle == nil then
windowTitle = "Enter:"
end
AddTextEntry(textEntry, windowTitle)
-- Display the input box.
DisplayOnscreenKeyboard(1, textEntry, "", defaultText or "", "", "", "", maxInputLength or 30)
Wait(0)
-- Wait for a result.
while true do
local keyboardStatus = UpdateOnscreenKeyboard();
if keyboardStatus == 3 then -- not displaying input field anymore somehow
return nil
elseif keyboardStatus == 2 then -- cancelled
return nil
elseif keyboardStatus == 1 then -- finished editing
return GetOnscreenKeyboardResult()
else
Wait(0)
end
end
end
function handleArrowInput(center, heading)
delta = 0.05
if IsDisabledControlPressed(0, 36) then -- ctrl held down
delta = 0.01
end
if IsDisabledControlPressed(0, 172) then -- arrow up
local newCenter = PolyZone.rotate(center.xy, vector2(center.x, center.y + delta), heading)
return vector3(newCenter.x, newCenter.y, center.z)
end
if IsDisabledControlPressed(0, 173) then -- arrow down
local newCenter = PolyZone.rotate(center.xy, vector2(center.x, center.y - delta), heading)
return vector3(newCenter.x, newCenter.y, center.z)
end
if IsDisabledControlPressed(0, 174) then -- arrow left
local newCenter = PolyZone.rotate(center.xy, vector2(center.x - delta, center.y), heading)
return vector3(newCenter.x, newCenter.y, center.z)
end
if IsDisabledControlPressed(0, 175) then -- arrow right
local newCenter = PolyZone.rotate(center.xy, vector2(center.x + delta, center.y), heading)
return vector3(newCenter.x, newCenter.y, center.z)
end
return center
end
function disableControlKeyInput()
Citizen.CreateThread(function()
while drawZone do
DisableControlAction(0, 36, true) -- Ctrl
DisableControlAction(0, 19, true) -- Alt
DisableControlAction(0, 20, true) -- 'Z'
DisableControlAction(0, 21, true) -- Shift
DisableControlAction(0, 81, true) -- Scroll Wheel Down
DisableControlAction(0, 99, true) -- Scroll Wheel Up
DisableControlAction(0, 172, true) -- Arrow Up
DisableControlAction(0, 173, true) -- Arrow Down
DisableControlAction(0, 174, true) -- Arrow Left
DisableControlAction(0, 175, true) -- Arrow Right
Wait(0)
end
end)
end

View File

@ -0,0 +1,56 @@
Config = Config or {}
Config.ConfigFormatEnabled = false
-- Default Format
-- Name: TestBox | 2022-04-13T22:46:17Z
-- BoxZone:Create(vector3(-344.16, -103.25, 39.02), 1, 1, {
-- name = "TestBox",
-- heading = 0,
-- --debugPoly = true
-- })
-- Name: TestCircle | 2022-04-13T22:46:39Z
-- CircleZone:Create(vector3(-344.16, -103.25, 39.02), 1.0, {
-- name = "TestCircle",
-- useZ = false,
-- --debugPoly = true
-- })
-- Name: TestPoly | 2022-04-13T22:46:55Z
-- PolyZone:Create({
-- vector2(-344.15713500977, -103.24993896484),
-- vector2(-343.69491577148, -100.99839019775),
-- vector2(-345.53350830078, -102.00588226318)
-- }, {
-- name = "TestPoly",
-- minZ = 39.015644073486,
-- maxZ = 39.015865325928
-- })
-- Config Format
-- Name: TestBox | 2022-04-13T22:34:48Z
-- coords = vector3(-342.92, -102.09, 39.02),
-- length = 1,
-- width = 1,
-- name = "TestBox",
-- heading = 0,
-- debugPoly = true
-- Name: TestCircle | 2022-04-13T22:35:09Z
-- coords = vector3(-342.92, -102.09, 39.02),
-- radius = 1.0,
-- name = "TestCircle",
-- useZ = false,
-- debugPoly = true
-- Name: TestPoly | 2022-04-13T22:35:43Z
-- points = {
-- vector2(-342.91537475586, -102.09281158447),
-- vector2(-344.09732055664, -104.0821762085),
-- vector2(-342.01580810547, -105.60903167725)
-- },
-- name = "TestPoly",
-- minZ = 39.015701293945,
-- maxZ = 39.015705108643,
-- debugPoly = true

View File

@ -0,0 +1,109 @@
RegisterNetEvent("polyzone:printPoly")
AddEventHandler("polyzone:printPoly", function(zone)
local created_zones = LoadResourceFile(GetCurrentResourceName(), "polyzone_created_zones.txt") or ""
local output = created_zones .. parsePoly(zone)
SaveResourceFile(GetCurrentResourceName(), "polyzone_created_zones.txt", output, -1)
end)
RegisterNetEvent("polyzone:printCircle")
AddEventHandler("polyzone:printCircle", function(zone)
local created_zones = LoadResourceFile(GetCurrentResourceName(), "polyzone_created_zones.txt") or ""
local output = created_zones .. parseCircle(zone)
SaveResourceFile(GetCurrentResourceName(), "polyzone_created_zones.txt", output, -1)
end)
RegisterNetEvent("polyzone:printBox")
AddEventHandler("polyzone:printBox", function(zone)
local created_zones = LoadResourceFile(GetCurrentResourceName(), "polyzone_created_zones.txt") or ""
local output = created_zones .. parseBox(zone)
SaveResourceFile(GetCurrentResourceName(), "polyzone_created_zones.txt", output, -1)
end)
function round(num, numDecimalPlaces)
local mult = 10^(numDecimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
end
function printoutHeader(name)
return "-- Name: " .. name .. " | " .. os.date("!%Y-%m-%dT%H:%M:%SZ\n")
end
function parsePoly(zone)
if Config.ConfigFormatEnabled then
local printout = printoutHeader(zone.name)
printout = printout .. "points = {\n"
for i = 1, #zone.points do
if i ~= #zone.points then
printout = printout .. " vector2(" .. tostring(zone.points[i].x) .. ", " .. tostring(zone.points[i].y) .."),\n"
else
printout = printout .. " vector2(" .. tostring(zone.points[i].x) .. ", " .. tostring(zone.points[i].y) ..")\n"
end
end
printout = printout .. "},\nname = \"" .. zone.name .. "\",\n--minZ = " .. zone.minZ .. ",\n--maxZ = " .. zone.maxZ .. ",\n--debugPoly = true\n\n"
return printout
else
local printout = printoutHeader(zone.name)
printout = printout .. "PolyZone:Create({\n"
for i = 1, #zone.points do
if i ~= #zone.points then
printout = printout .. " vector2(" .. tostring(zone.points[i].x) .. ", " .. tostring(zone.points[i].y) .."),\n"
else
printout = printout .. " vector2(" .. tostring(zone.points[i].x) .. ", " .. tostring(zone.points[i].y) ..")\n"
end
end
printout = printout .. "}, {\n name = \"" .. zone.name .. "\",\n --minZ = " .. zone.minZ .. ",\n --maxZ = " .. zone.maxZ .. "\n})\n\n"
return printout
end
end
function parseCircle(zone)
if Config.ConfigFormatEnabled then
local printout = printoutHeader(zone.name)
printout = printout .. "coords = "
printout = printout .. "vector3(" .. tostring(round(zone.center.x, 2)) .. ", " .. tostring(round(zone.center.y, 2)) .. ", " .. tostring(round(zone.center.z, 2)) .."),\n"
printout = printout .. "radius = " .. tostring(zone.radius) .. ",\n"
printout = printout .. "name = \"" .. zone.name .. "\",\nuseZ = " .. tostring(zone.useZ) .. ",\n--debugPoly = true\n\n"
return printout
else
local printout = printoutHeader(zone.name)
printout = printout .. "CircleZone:Create("
printout = printout .. "vector3(" .. tostring(round(zone.center.x, 2)) .. ", " .. tostring(round(zone.center.y, 2)) .. ", " .. tostring(round(zone.center.z, 2)) .."), "
printout = printout .. tostring(zone.radius) .. ", "
printout = printout .. "{\n name = \"" .. zone.name .. "\",\n useZ = " .. tostring(zone.useZ) .. ",\n --debugPoly = true\n})\n\n"
return printout
end
end
function parseBox(zone)
if Config.ConfigFormatEnabled then
local printout = printoutHeader(zone.name)
printout = printout .. "coords = "
printout = printout .. "vector3(" .. tostring(round(zone.center.x, 2)) .. ", " .. tostring(round(zone.center.y, 2)) .. ", " .. tostring(round(zone.center.z, 2)) .."),\n"
printout = printout .. "length = " .. tostring(zone.length) .. ",\n"
printout = printout .. "width = " .. tostring(zone.width) .. ",\n"
printout = printout .. "name = \"" .. zone.name .. "\",\nheading = " .. zone.heading .. ",\n--debugPoly = true"
if zone.minZ then
printout = printout .. ",\nminZ = " .. tostring(round(zone.minZ, 2))
end
if zone.maxZ then
printout = printout .. ",\nmaxZ = " .. tostring(round(zone.maxZ, 2))
end
printout = printout .. "\n\n"
return printout
else
local printout = printoutHeader(zone.name)
printout = printout .. "BoxZone:Create("
printout = printout .. "vector3(" .. tostring(round(zone.center.x, 2)) .. ", " .. tostring(round(zone.center.y, 2)) .. ", " .. tostring(round(zone.center.z, 2)) .."), "
printout = printout .. tostring(zone.length) .. ", "
printout = printout .. tostring(zone.width) .. ", "
printout = printout .. "{\n name = \"" .. zone.name .. "\",\n heading = " .. zone.heading .. ",\n --debugPoly = true"
if zone.minZ then
printout = printout .. ",\n minZ = " .. tostring(round(zone.minZ, 2))
end
if zone.maxZ then
printout = printout .. ",\n maxZ = " .. tostring(round(zone.maxZ, 2))
end
printout = printout .. "\n})\n\n"
return printout
end
end

View File

@ -0,0 +1,20 @@
games {'gta5'}
fx_version 'cerulean'
description 'Define zones of different shapes and test whether a point is inside or outside of the zone'
version '2.6.2'
client_scripts {
'client.lua',
'BoxZone.lua',
'EntityZone.lua',
'CircleZone.lua',
'ComboZone.lua',
'creation/client/*.lua'
}
server_scripts {
'creation/server/*.lua',
'server.lua'
}

View File

@ -0,0 +1,10 @@
local eventPrefix = '__PolyZone__:'
function triggerZoneEvent(eventName, ...)
TriggerClientEvent(eventPrefix .. eventName, -1, ...)
end
RegisterNetEvent("PolyZone:TriggerZoneEvent")
AddEventHandler("PolyZone:TriggerZoneEvent", triggerZoneEvent)
exports("TriggerZoneEvent", triggerZoneEvent)

View File

@ -0,0 +1,29 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**First of all**
Did you try disabling `bob74_ipl` to see if the issue is still there? Yes/No
Did you use the latest version of `bob74_ipl` ? Yes/No
Did you use an up to date server [artifact](https://runtime.fivem.net/artifacts/fivem/build_server_windows/master/) ? Yes/No
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Coordinates or map screenshot of the location.
**Expected behavior**
A clear and concise description of what you expected to happen, a screenshot from GTA Online if relevant is welcome.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Versions**
- Game build version
- Resource version

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2024 Bob74
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,195 @@
# Fix holes and customize the map (Updated to Bottom Dollar Bounties DLC)
The purpose of this script is to fix the holes in the map by loading zones that arent loaded by default. Ive added quite a lot of places to load, based on [Mikeehs script](https://forum.fivem.net/t/release-load-unloaded-ipls/5911). If you just want to fix the holes in the map, then use this resource as provided.
This resource has been completely rewritten from scratch since v2.0. You can customize almost every storymode and online purchasable interiors from your own resources.
## Download
- Latest version: https://github.com/Bob74/bob74_ipl/releases/latest
- Source code: https://github.com/Bob74/bob74_ipl
## [Wiki](https://github.com/Bob74/bob74_ipl/wiki)
- The Wiki has been created to help you customize your interiors as you wish. It contains every function you can use for each interior.
- Each Wiki page has an example at the bottom of the page to show how you can use it in your own resource.
- Also at the bottom of the Wiki will show you the default values set by `IPL_NAME.LoadDefault()`.
## Install
1. Download the [latest version](https://github.com/Bob74/bob74_ipl/releases/latest).
2. Extract `bob74_ipl.zip` and copy the `bob74_ipl` into your `resources` folder.
3. Add `start bob74_ipl` to your your `server.cfg` file.
## Screenshots
- [After Hours Album](https://imgur.com/a/Qg96l0D)
- [Misc. Album](https://imgur.com/a/cs9Ip4d)
- [IPL Fix Album](https://imgur.com/a/1Sfl4)
## Changelog
<details><summary>Click to view</summary>
(DD/MM/YYYY)
---
24/08/2024 - 2.3.2
- Added Kosatka and "The Music Locker" interiors.
- Removed `Citizen` prefix from code.
10/08/2024 - 2.3.1
- Fix world not rendering when inside security offices
- Fix typos in "Los Santos Tuners" files
02/07/2024 - 2.3.0
- Added "Bottom Dollar Bounties" support
14/04/2024 - 2.2.1
- Allow disabling San Andreas Mercenaries fixes
- Allow setting base game cargo ship as sunk
- Rename `ChopShopSalvage.Ipl.Load()` to `ChopShopSalvage.Ipl.Exterior.Load()`
- Rename `DrugWarsFreakshop.Ipl.Load()` to `DrugWarsFreakshop.Ipl.Exterior.Load()`
- Rename `DrugWarsGarage.Ipl.Load()` to `DrugWarsGarage.Ipl.Exterior.Load()`
06/04/2024 - 2.2.0
- Added "Los Santos Drug Wars" support
- Added "San Andreas Mercenaries" support
- Added "The Chop Shop" support
- Added missing base IPLs
27/03/2024 - 2.1.4
- North Yankton improvements (https://github.com/Bob74/bob74_ipl/pull/131 @TheIndra55)
05/12/2023 - 2.1.3
- Added missing train track near Davis Quartz (https://github.com/Bob74/bob74_ipl/pull/129 @TheIndra55)
10/01/2023 - 2.1.2
- Fix native and update native names (@NeenGame )
24/10/2022 - 2.1.1
- Fix vespucci beach wall hole
- Fix Boat House Door in Sandy Shores
- Fix GTA 5 24/7 Roof in Sandy Shores
- Fix Industrial Building near Lesters Warehouse
- Fix Collision Holes near Lost MC compound
11/10/2022 - 2.1.0a
- Make Doomsday Facility Objects non network
03/08/2022 - 2.1.0
- Added "The Criminal Enterprises" support
02/05/2022 - 2.0.15
- Reformatted code
- Removed unused .gitignore
- Bumped version in fxmanifest.lua
- Improved performance
21/04/2022 - 2.0.14
- Fix casino penthouse carpet patterns colors
12/02/2022 - 2.0.13a
- Fix Music Roof
12/02/2022 - 2.0.13
- Added Contract IPLs: Garage, Studio, Offices, Music Roof, Billboards
10/02/2022 - 2.0.12
- Fix FIB roof
07/02/2022 - 2.0.11
- Added Tuners IPLs: Garage, Meth Lab, Meetup
18/01/2022 - 2.0.10b
- Change water in yachts to be non-networked.
01/08/2021 - 2.0.10a
- Improved performance
- Fixed hole in the FIB fountain
- Fixed error appearing if casino IPL is loaded, but the game build is not sufficient
- Fixed a few typos in the README file
19/07/2021 - 2.0.10
- Added Diamond Casino IPLs: Casino, Garage, VIP garage, Penthouse
- Import: Forced refresh of CEO Garages
- Updated fxmanifest fx_version to cerulean
- Updated IPL list link in fxmanifest nad removed outdated Props list and Interior ID list
- Fixed export typo in `michael.lua`
- Removed unnecessary space in north_yankton IPL
27/05/2020 - 2.0.9a
- Fixed disabling Pillbox Hospital
- Fixed `ResetInteriorVariables`
23/04/2020 - 2.0.9
- Replaced deprecated __resource.lua with fxmanifest.lua
- Added ferris wheel on the Del Perro Pier
- Reformatted client.lua
20/10/2019 - 2.0.8
- Nightclubs: Added dry ice emitters
- Heist & Gunrunning: Added water to the yachts hot tubs (to enable/disable)
- Offices: Added a way to open and close the safes
- Facility: Added privacy glass
- Moved Bahama Mamas and PillBox Hospital in their own files
- Fixed error `ReleaseNamedRendertarget`
- Cleaned and optimized the code
22/03/2019 - 2.0.7c
- CEO Offices: Changed the default loaded garage to ImportCEOGarage4.Part.Garage2 in order to avoid Office glitches
15/01/2019 - 2.0.7b
- Nightclubs: Fixed a typo for the fake lights
15/01/2019 - 2.0.7a
- Nightclubs: Added the ability to set no podium (using `AfterHoursNightclubs.Interior.Podium.none`)
14/01/2019 - 2.0.7
- Changed the way Trevors trailer is handled and added a Wiki entry.
- Added a way to open or close Zancudos gates with a Wiki entry.
12/01/2019 - 2.0.6
- Added nightclubs interior and exteriors
- Removed Zancudo gates by default (file bob74_ipl/gtav/base.lua: RequestIpl("CS3_07_MPGates") is now commented)
29/12/2018 - 2.0.5a
- Fixed the name of the BikerClubhouse1 export
19/12/2018 - 2.0.5
- Fixed a typo that prevents the printers, security stuff, and cash piles to spawn in the counterfeit cash factory
10/11/2018 - 2.0.4
- Fixed an issue where the clubhouse2 lower walls wouldnt be colored on the first resource start
- Fixed gang members names using an old format
- Disabled the Mod shop from CEO garage 3 (ImportCEOGarage3) because it is overlapping with CEO office 3 (FinanceOffice3)
08/11/2018 - 2.0.3
- Added biker gangs name, missions, and members pictures
- Added CEO office organizations name
05/11/2018 - 2.0.1
- Removed overlapping Zancudo River
- Added the trailer near Zancudo River
04/11/2018 - 2.0.0
- Plugin totally rewritten
- Support for all DLC (up to The Doomsday Heist)
- Ability to easily customize story mode and online purchasable interiors
- You can still use it as it is if you want IPL and interiors to be loaded, the plugin sets a default style for each one
- Check out the Wiki to find out how: https://github.com/Bob74/bob74_ipl/wiki
26/06/2017
- Added optional IPL
- Bunkers exteriors (enabled)
- Bunkers interior
- CEO Offices
- Bikers places (some are still buggy)
- Import/Export locations
- Removed the trick to open Losts safehouse since the last update already opens it
19/06/2017
- Fix hole in Zancudo River
- Fix hole in Cassidy Creek
- Add optional graffiti on some billboards (enabled by default)
- Opened Losts safehouse interior
14/06/2017
- Original release
</details>

View File

@ -0,0 +1,223 @@
CreateThread(function()
-- ====================================================================
-- =--------------------- [GTA V: Single player] ---------------------=
-- ====================================================================
-- Michael: -802.311, 175.056, 72.8446
Michael.LoadDefault()
-- Simeon: -47.16170 -1115.3327 26.5
Simeon.LoadDefault()
-- Franklin's aunt: -9.96562, -1438.54, 31.1015
FranklinAunt.LoadDefault()
-- Franklin
Franklin.LoadDefault()
-- Floyd: -1150.703, -1520.713, 10.633
Floyd.LoadDefault()
-- Trevor: 1985.48132, 3828.76757, 32.5
TrevorsTrailer.LoadDefault()
-- Bahama Mamas: -1388.0013, -618.41967, 30.819599
BahamaMamas.Enable(true)
-- Pillbox hospital: 307.1680, -590.807, 43.280
PillboxHospital.Enable(true)
-- Zancudo Gates (GTAO like): -1600.30100000, 2806.73100000, 18.79683000
ZancudoGates.LoadDefault()
-- Other
Ammunations.LoadDefault()
LesterFactory.LoadDefault()
StripClub.LoadDefault()
CargoShip.LoadDefault()
Graffitis.Enable(true)
-- UFO
UFO.Hippie.Enable(false) -- 2490.47729, 3774.84351, 2414.035
UFO.Chiliad.Enable(false) -- 501.52880000, 5593.86500000, 796.23250000
UFO.Zancudo.Enable(false) -- -2051.99463, 3237.05835, 1456.97021
-- Red Carpet: 300.5927, 199.7589, 104.3776
RedCarpet.Enable(false)
-- North Yankton: 3217.697, -4834.826, 111.8152
NorthYankton.Enable(false)
-- ====================================================================
-- =-------------------------- [GTA Online] --------------------------=
-- ====================================================================
GTAOApartmentHi1.LoadDefault() -- -35.31277 -580.4199 88.71221 (4 Integrity Way, Apt 30)
GTAOApartmentHi2.LoadDefault() -- -1477.14 -538.7499 55.5264 (Dell Perro Heights, Apt 7)
GTAOHouseHi1.LoadDefault() -- -169.286 486.4938 137.4436 (3655 Wild Oats Drive)
GTAOHouseHi2.LoadDefault() -- 340.9412 437.1798 149.3925 (2044 North Conker Avenue)
GTAOHouseHi3.LoadDefault() -- 373.023 416.105 145.7006 (2045 North Conker Avenue)
GTAOHouseHi4.LoadDefault() -- -676.127 588.612 145.1698 (2862 Hillcrest Avenue)
GTAOHouseHi5.LoadDefault() -- -763.107 615.906 144.1401 (2868 Hillcrest Avenue)
GTAOHouseHi6.LoadDefault() -- -857.798 682.563 152.6529 (2874 Hillcrest Avenue)
GTAOHouseHi7.LoadDefault() -- 120.5 549.952 184.097 (2677 Whispymound Drive)
GTAOHouseHi8.LoadDefault() -- -1288 440.748 97.69459 (2133 Mad Wayne Thunder)
GTAOHouseMid1.LoadDefault() -- 347.2686 -999.2955 -99.19622
GTAOHouseLow1.LoadDefault() -- 261.4586 -998.8196 -99.00863
-- ====================================================================
-- =------------------------ [DLC: High life] ------------------------=
-- ====================================================================
HLApartment1.LoadDefault() -- -1468.14 -541.815 73.4442 (Dell Perro Heights, Apt 4)
HLApartment2.LoadDefault() -- -915.811 -379.432 113.6748 (Richard Majestic, Apt 2)
HLApartment3.LoadDefault() -- -614.86 40.6783 97.60007 (Tinsel Towers, Apt 42)
HLApartment4.LoadDefault() -- -773.407 341.766 211.397 (EclipseTowers, Apt 3)
HLApartment5.LoadDefault() -- -18.07856 -583.6725 79.46569 (4 Integrity Way, Apt 28)
HLApartment6.LoadDefault() -- -609.56690000 51.28212000 -183.98080
-- ====================================================================
-- =-------------------------- [DLC: Heists] -------------------------=
-- ====================================================================
HeistCarrier.Enable(true) -- 3082.3117, -4717.1191, 15.2622
HeistYacht.LoadDefault() -- -2043.974,-1031.582, 11.981
-- ====================================================================
-- =--------------- [DLC: Executives & Other Criminals] --------------=
-- ====================================================================
ExecApartment1.LoadDefault() -- -787.7805 334.9232 215.8384 (EclipseTowers, Penthouse Suite 1)
ExecApartment2.LoadDefault() -- -773.2258 322.8252 194.8862 (EclipseTowers, Penthouse Suite 2)
ExecApartment3.LoadDefault() -- -787.7805 334.9232 186.1134 (EclipseTowers, Penthouse Suite 3)
-- ====================================================================
-- =-------------------- [DLC: Finance & Felony] --------------------=
-- ====================================================================
FinanceOffice1.LoadDefault() -- -141.1987, -620.913, 168.8205 (Arcadius Business Centre)
FinanceOffice2.LoadDefault() -- -75.8466, -826.9893, 243.3859 (Maze Bank Building)
FinanceOffice3.LoadDefault() -- -1579.756, -565.0661, 108.523 (Lom Bank)
FinanceOffice4.LoadDefault() -- -1392.667, -480.4736, 72.04217 (Maze Bank West)
-- ====================================================================
-- =-------------------------- [DLC: Bikers] -------------------------=
-- ====================================================================
BikerCocaine.LoadDefault() -- Cocaine lockup: 1093.6, -3196.6, -38.99841
BikerCounterfeit.LoadDefault() -- Counterfeit cash factory: 1121.897, -3195.338, -40.4025
BikerDocumentForgery.LoadDefault() -- Document forgery: 1165, -3196.6, -39.01306
BikerMethLab.LoadDefault() -- Meth lab: 1009.5, -3196.6, -38.99682
BikerWeedFarm.LoadDefault() -- Weed farm: 1051.491, -3196.536, -39.14842
BikerClubhouse1.LoadDefault() -- 1107.04, -3157.399, -37.51859
BikerClubhouse2.LoadDefault() -- 998.4809, -3164.711, -38.90733
-- ====================================================================
-- =---------------------- [DLC: Import/Export] ----------------------=
-- ====================================================================
ImportCEOGarage1.LoadDefault() -- Arcadius Business Centre
ImportCEOGarage2.LoadDefault() -- Maze Bank Building /!\ Do not load parts Garage1, Garage2 and Garage3 at the same time (overlaping issues)
ImportCEOGarage3.LoadDefault() -- Lom Bank /!\ Do not load parts Garage1, Garage2 and Garage3 at the same time (overlaping issues)
ImportCEOGarage4.LoadDefault() -- Maze Bank West /!\ Do not load parts Garage1, Garage2 and Garage3 at the same time (overlaping issues)
ImportVehicleWarehouse.LoadDefault() -- Vehicle warehouse: 994.5925, -3002.594, -39.64699
-- ====================================================================
-- =------------------------ [DLC: Gunrunning] -----------------------=
-- ====================================================================
GunrunningBunker.LoadDefault() -- 892.6384, -3245.8664, -98.2645
GunrunningYacht.LoadDefault() -- -1363.724, 6734.108, 2.44598
-- ====================================================================
-- =---------------------- [DLC: Smuggler's Run] ---------------------=
-- ====================================================================
SmugglerHangar.LoadDefault() -- -1267.0 -3013.135 -49.5
-- ====================================================================
-- =-------------------- [DLC: The Doomsday Heist] -------------------=
-- ====================================================================
DoomsdayFacility.LoadDefault()
-- ====================================================================
-- =----------------------- [DLC: After Hours] -----------------------=
-- ====================================================================
AfterHoursNightclubs.LoadDefault() -- -1604.664, -3012.583, -78.000
-- ====================================================================
-- =------------------- [DLC: Diamond Casino Resort] -----------------=
-- ====================================================================
if GetGameBuildNumber() >= 2060 then
DiamondCasino.LoadDefault() -- 1100.000, 220.000, -50.000
DiamondPenthouse.LoadDefault() -- 976.636, 70.295, 115.164
end
-- ====================================================================
-- =-------------------- [DLC: Cayo Perico Heist] --------------------=
-- ====================================================================
if GetGameBuildNumber() >= 2189 then
CayoPericoNightclub.LoadDefault() -- 1550.0, 250.0, -50.0
CayoPericoSubmarine.LoadDefault() -- 1560.0, 400.0, -50.0
end
-- ====================================================================
-- =------------------- [DLC: Los Santos Tuners] ---------------------=
-- ====================================================================
if GetGameBuildNumber() >= 2372 then
TunerGarage.LoadDefault() -- -1350.0, 160.0, -100.0
TunerMethLab.LoadDefault() -- 981.9999, -143.0, -50.0
TunerMeetup.LoadDefault() -- -2000.0, 1113.211, -25.36243
end
-- ====================================================================
-- =------------------- [DLC: Los Santos The Contract] ---------------------=
-- ====================================================================
if GetGameBuildNumber() >= 2545 then
MpSecurityGarage.LoadDefault() -- -1071.4387, -77.033875, -93.525505
MpSecurityMusicRoofTop.LoadDefault() -- -592.6896, 273.1052, 116.302444
MpSecurityStudio.LoadDefault() -- -1000.7252, -70.559875, -98.10669
MpSecurityBillboards.LoadDefault() -- -592.6896, 273.1052, 116.302444
MpSecurityOffice1.LoadDefault() -- -1021.86084, -427.74564, 68.95764
MpSecurityOffice2.LoadDefault() -- 383.4156, -59.878227, 108.4595
MpSecurityOffice3.LoadDefault() -- -1004.23035, -761.2084, 66.99069
MpSecurityOffice4.LoadDefault() -- -587.87213, -716.84937, 118.10156
end
-- ====================================================================
-- =------------------- [DLC: The Criminal Enterprise] ---------------------=
-- ====================================================================
if GetGameBuildNumber() >= 2699 then
CriminalEnterpriseSmeonFix.LoadDefault() -- -50.2248, -1098.8325, 26.049742
CriminalEnterpriseVehicleWarehouse.LoadDefault() -- 800.13696, -3001.4297, -65.14074
CriminalEnterpriseWarehouse.LoadDefault() -- 849.1047, -3000.209, -45.974354
end
-- ====================================================================
-- =------------------- [DLC: Los Santos Drug Wars] ------------------=
-- ====================================================================
if GetGameBuildNumber() >= 2802 then
DrugWarsFreakshop.LoadDefault() -- 570.9713, -420.0727, -70.000
DrugWarsGarage.LoadDefault() -- 519.2477, -2618.788, -50.000
DrugWarsLab.LoadDefault() -- 483.4252, -2625.071, -50.000
end
-- ====================================================================
-- =------------------- [DLC: San Andreas Mercenaries] ---------------=
-- ====================================================================
if GetGameBuildNumber() >= 2944 then
MercenariesClub.LoadDefault() -- 1202.407, -3251.251, -50.000
MercenariesLab.LoadDefault() -- -1916.119, 3749.719, -100.000
MercenariesFixes.LoadDefault()
end
-- ====================================================================
-- =------------------- [DLC: The Chop Shop] -------------------------=
-- ====================================================================
if GetGameBuildNumber() >= 3095 then
ChopShopCargoShip.LoadDefault() -- -344.4349, -4062.832, 17.000
ChopShopCartelGarage.LoadDefault() -- 1220.133, -2277.844, -50.000
ChopShopLifeguard.LoadDefault() -- -1488.153, -1021.166, 5.000
ChopShopSalvage.LoadDefault() -- 1077.276, -2274.876, -50.000
end
-- ====================================================================
-- =------------------ [DLC: Bottom Dollar Bounties] -----------------=
-- ====================================================================
if GetGameBuildNumber() >= 3258 then
SummerCarrier.LoadDefault() -- -3208.03, 3954.54, 14.0
SummerOffice.LoadDefault() -- 565.886, -2688.761, -50.0
end
end)

View File

@ -0,0 +1,703 @@
-- Nightclub: -1604.664 -3012.583 -78.000
exports('GetAfterHoursNightclubsObject', function()
return AfterHoursNightclubs
end)
AfterHoursNightclubs = {
interiorId = 271617,
Ipl = {
Interior = {
ipl = "ba_int_placement_ba_interior_0_dlc_int_01_ba_milo_",
Load = function()
EnableIpl(AfterHoursNightclubs.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(AfterHoursNightclubs.Ipl.Interior.ipl, false)
end
}
},
Interior = {
Name = {
galaxy = "Int01_ba_clubname_01",
studio = "Int01_ba_clubname_02",
omega = "Int01_ba_clubname_03",
technologie = "Int01_ba_clubname_04",
gefangnis = "Int01_ba_clubname_05",
maisonette = "Int01_ba_clubname_06",
tony = "Int01_ba_clubname_07",
palace = "Int01_ba_clubname_08",
paradise = "Int01_ba_clubname_09",
Set = function(name, refresh)
AfterHoursNightclubs.Interior.Name.Clear(false)
SetIplPropState(AfterHoursNightclubs.interiorId, name, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(AfterHoursNightclubs.Interior.Name) do
if type(value) == "string" then
SetIplPropState(AfterHoursNightclubs.interiorId, value, false, refresh)
end
end
end
},
Style = {
trad = "Int01_ba_Style01",
edgy = "Int01_ba_Style02",
glam = "Int01_ba_Style03",
Set = function(style, refresh)
AfterHoursNightclubs.Interior.Style.Clear(false)
SetIplPropState(AfterHoursNightclubs.interiorId, style, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(AfterHoursNightclubs.Interior.Style) do
if type(value) == "string" then
SetIplPropState(AfterHoursNightclubs.interiorId, value, false, refresh)
end
end
end
},
Podium = {
none = "",
trad = "Int01_ba_style01_podium",
edgy = "Int01_ba_style02_podium",
glam = "Int01_ba_style03_podium",
Set = function(podium, refresh)
AfterHoursNightclubs.Interior.Podium.Clear(false)
SetIplPropState(AfterHoursNightclubs.interiorId, podium, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(AfterHoursNightclubs.Interior.Podium) do
if type(value) == "string" then
SetIplPropState(AfterHoursNightclubs.interiorId, value, false, refresh)
end
end
end
},
Speakers = {
none = "",
basic = "Int01_ba_equipment_setup",
upgrade = {
"Int01_ba_equipment_setup",
"Int01_ba_equipment_upgrade"
},
Set = function(speakers, refresh)
AfterHoursNightclubs.Interior.Speakers.Clear(false)
SetIplPropState(AfterHoursNightclubs.interiorId, speakers, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(AfterHoursNightclubs.Interior.Speakers) do
if type(value) == "string" then
SetIplPropState(AfterHoursNightclubs.interiorId, value, false, refresh)
end
end
end
},
Security = {
off = "",
on = "Int01_ba_security_upgrade",
Set = function(security, refresh)
AfterHoursNightclubs.Interior.Security.Clear(false)
SetIplPropState(AfterHoursNightclubs.interiorId, security, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(AfterHoursNightclubs.interiorId, AfterHoursNightclubs.Interior.Security.on, false, refresh)
end
},
Turntables = {
none = "",
style01 = "Int01_ba_dj01",
style02 = "Int01_ba_dj02",
style03 = "Int01_ba_dj03",
style04 = "Int01_ba_dj04",
Set = function(turntables, refresh)
AfterHoursNightclubs.Interior.Turntables.Clear(false)
if turntables ~= "" then
SetIplPropState(AfterHoursNightclubs.interiorId, turntables, true, refresh)
else
if refresh then
RefreshInterior(AfterHoursNightclubs.interiorId)
end
end
end,
Clear = function(refresh)
for key, value in pairs(AfterHoursNightclubs.Interior.Turntables) do
if type(value) == "string" then
SetIplPropState(AfterHoursNightclubs.interiorId, value, false, refresh)
end
end
end
},
Lights = {
Droplets = {
yellow = "DJ_01_Lights_01",
green = "DJ_02_Lights_01",
white = "DJ_03_Lights_01",
purple = "DJ_04_Lights_01",
Set = function(light, refresh)
AfterHoursNightclubs.Interior.Lights.Droplets.Clear(false)
SetIplPropState(AfterHoursNightclubs.interiorId, light, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(AfterHoursNightclubs.Interior.Lights.Droplets) do
if type(value) == "string" then
SetIplPropState(AfterHoursNightclubs.interiorId, value, false, refresh)
end
end
end
},
Neons = {
yellow = "DJ_01_Lights_02",
white = "DJ_02_Lights_02",
purple = "DJ_03_Lights_02",
cyan = "DJ_04_Lights_02",
Set = function(light, refresh)
AfterHoursNightclubs.Interior.Lights.Neons.Clear(false)
SetIplPropState(AfterHoursNightclubs.interiorId, light, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(AfterHoursNightclubs.Interior.Lights.Neons) do
if type(value) == "string" then
SetIplPropState(AfterHoursNightclubs.interiorId, value, false, refresh)
end
end
end
},
Bands = {
yellow = "DJ_01_Lights_03",
green = "DJ_02_Lights_03",
white = "DJ_03_Lights_03",
cyan = "DJ_04_Lights_03",
Set = function(light, refresh)
AfterHoursNightclubs.Interior.Lights.Bands.Clear(false)
SetIplPropState(AfterHoursNightclubs.interiorId, light, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(AfterHoursNightclubs.Interior.Lights.Bands) do
if type(value) == "string" then
SetIplPropState(AfterHoursNightclubs.interiorId, value, false, refresh)
end
end
end
},
Lasers = {
yellow = "DJ_01_Lights_04",
green = "DJ_02_Lights_04",
white = "DJ_03_Lights_04",
purple = "DJ_04_Lights_04",
Set = function(light, refresh)
AfterHoursNightclubs.Interior.Lights.Lasers.Clear(false)
SetIplPropState(AfterHoursNightclubs.interiorId, light, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(AfterHoursNightclubs.Interior.Lights.Lasers) do
if type(value) == "string" then
SetIplPropState(AfterHoursNightclubs.interiorId, value, false, refresh)
end
end
end
},
Clear = function()
AfterHoursNightclubs.Interior.Lights.Droplets.Clear()
AfterHoursNightclubs.Interior.Lights.Neons.Clear()
AfterHoursNightclubs.Interior.Lights.Bands.Clear()
AfterHoursNightclubs.Interior.Lights.Lasers.Clear()
end
},
Bar = {
Enable = function(state, refresh)
SetIplPropState(AfterHoursNightclubs.interiorId, "Int01_ba_bar_content", state, refresh)
end
},
Booze = {
A = "Int01_ba_booze_01",
B = "Int01_ba_booze_02",
C = "Int01_ba_booze_03",
Enable = function(booze, state, refresh)
if type(booze) == "table" then
for key, value in pairs(booze) do
if type(value) == "string" then
SetIplPropState(AfterHoursNightclubs.interiorId, booze, state, refresh)
end
end
else
SetIplPropState(AfterHoursNightclubs.interiorId, booze, state, refresh)
end
end
},
Trophy = {
Color = {
bronze = 0,
silver = 1,
gold = 2
},
number1 = "Int01_ba_trophy01",
battler = "Int01_ba_trophy02",
dancer = "Int01_ba_trophy03",
Enable = function(trophy, state, color, refresh)
SetIplPropState(AfterHoursNightclubs.interiorId, trophy, state, refresh)
SetInteriorEntitySetColor(AfterHoursNightclubs.interiorId, trophy, color)
end
},
DryIce = {
scale = 5.0,
Emitters = {
{
pos = vector3(-1602.932, -3019.1, -79.99),
rot = vector3(0.0, -10.0, 66.0)
},
{
pos = vector3(-1593.238, -3017.05, -79.99),
rot = vector3(0.0, -10.0, 110.0)
},
{
pos = vector3(-1597.134, -3008.2, -79.99),
rot = vector3(0.0, -10.0, -122.53)
},
{
pos = vector3(-1589.966, -3008.518, -79.99),
rot = vector3(0.0, -10.0, -166.97)
}
},
Enable = function(state)
if state then
RequestNamedPtfxAsset("scr_ba_club")
while not HasNamedPtfxAssetLoaded("scr_ba_club") do
Wait(0)
end
for key, emitter in pairs(AfterHoursNightclubs.Interior.DryIce.Emitters) do
UseParticleFxAsset("scr_ba_club")
StartParticleFxLoopedAtCoord("scr_ba_club_smoke_machine", emitter.pos.x, emitter.pos.y, emitter.pos.z, emitter.rot.x, emitter.rot.y, emitter.rot.z, AfterHoursNightclubs.Interior.DryIce.scale, false, false, false, true)
end
else
local radius = 1.0
for key, emitter in pairs(AfterHoursNightclubs.Interior.DryIce.Emitters) do
RemoveParticleFxInRange(emitter.pos.x, emitter.pos.y, emitter.pos.z, radius)
end
end
end,
},
Details = {
clutter = "Int01_ba_Clutter", -- Clutter and graffitis
worklamps = "Int01_ba_Worklamps", -- Work lamps + trash
truck = "Int01_ba_deliverytruck", -- Truck parked in the garage
dryIce = "Int01_ba_dry_ice", -- Dry ice machines (no effects)
lightRigsOff = "light_rigs_off", -- All light rigs at once but turned off
roofLightsOff = "Int01_ba_lightgrid_01", -- Fake lights
floorTradLights = "Int01_ba_trad_lights", -- Floor lights meant to go with the trad style
chest = "Int01_ba_trophy04", -- Chest on the VIP desk
vaultAmmunations = "Int01_ba_trophy05", -- (inside vault) Ammunations
vaultMeth = "Int01_ba_trophy07", -- (inside vault) Meth bag
vaultFakeID = "Int01_ba_trophy08", -- (inside vault) Fake ID
vaultWeed = "Int01_ba_trophy09", -- (inside vault) Opened weed bag
vaultCoke = "Int01_ba_trophy10", -- (inside vault) Coke doll
vaultCash = "Int01_ba_trophy11", -- (inside vault) Scrunched fake money
Enable = function(details, state, refresh)
SetIplPropState(AfterHoursNightclubs.interiorId, details, state, refresh)
end
}
},
-- 760, -1337, 27
Mesa = {
id = 0,
Barrier = {
Enable = function(state)
if state == nil then
state = true
end
AfterHoursNightclubs.Barrier.Enable(AfterHoursNightclubs.Mesa.id, state)
end
},
Posters = {
Enable = function(poster, state)
if state == nil then
state = true
end
AfterHoursNightclubs.Posters.Enable(AfterHoursNightclubs.Mesa.id, poster, state)
end,
Clear = function()
AfterHoursNightclubs.Posters.Clear(AfterHoursNightclubs.Mesa.id)
end
}
},
-- 348, -979, 30
MissionRow = {
id = 1,
Barrier = {
Enable = function(state)
if state == nil then
state = true
end
AfterHoursNightclubs.Barrier.Enable(AfterHoursNightclubs.MissionRow.id, state)
end
},
Posters = {
Enable = function(poster, state)
if state == nil then
state = true
end
AfterHoursNightclubs.Posters.Enable(AfterHoursNightclubs.MissionRow.id, poster, state)
end,
Clear = function()
AfterHoursNightclubs.Posters.Clear(AfterHoursNightclubs.MissionRow.id)
end
}
},
-- -118, -1260, 30
Strawberry = {
id = 2,
Barrier = {
Enable = function(state)
if state == nil then
state = true
end
AfterHoursNightclubs.Barrier.Enable(AfterHoursNightclubs.Strawberry.id, state)
end
},
Posters = {
Enable = function(poster, state)
if state == nil then
state = true
end
AfterHoursNightclubs.Posters.Enable(AfterHoursNightclubs.Strawberry.id, poster, state)
end,
Clear = function()
AfterHoursNightclubs.Posters.Clear(AfterHoursNightclubs.Strawberry.id)
end
}
},
-- 9, 221, 109
VinewoodWest = {
id = 3,
Barrier = {
Enable = function(state)
if state == nil then
state = true
end
AfterHoursNightclubs.Barrier.Enable(AfterHoursNightclubs.VinewoodWest.id, state)
end
},
Posters = {
Enable = function(poster, state)
if state == nil then
state = true
end
AfterHoursNightclubs.Posters.Enable(AfterHoursNightclubs.VinewoodWest.id, poster, state)
end,
Clear = function()
AfterHoursNightclubs.Posters.Clear(AfterHoursNightclubs.VinewoodWest.id)
end
}
},
-- 868, -2098, 31
Cypress = {
id = 4,
Barrier = {
Enable = function(state)
if state == nil then
state = true
end
AfterHoursNightclubs.Barrier.Enable(AfterHoursNightclubs.Cypress.id, state)
end
},
Posters = {
Enable = function(poster, state)
if state == nil then
state = true
end
AfterHoursNightclubs.Posters.Enable(AfterHoursNightclubs.Cypress.id, poster, state)
end,
Clear = function()
AfterHoursNightclubs.Posters.Clear(AfterHoursNightclubs.Cypress.id)
end
}
},
-- -1287, -647, 27
DelPerro = {
id = 5,
Barrier = {
Enable = function(state)
if state == nil then
state = true
end
AfterHoursNightclubs.Barrier.Enable(AfterHoursNightclubs.DelPerro.id, state)
end
},
Posters = {
Enable = function(poster, state)
if state == nil then
state = true
end
AfterHoursNightclubs.Posters.Enable(AfterHoursNightclubs.DelPerro.id, poster, state)
end,
Clear = function()
AfterHoursNightclubs.Posters.Clear(AfterHoursNightclubs.DelPerro.id)
end
}
},
-- -680, -2461, 14
Airport = {
id = 6,
Barrier = {
Enable = function(state)
if state == nil then
state = true
end
AfterHoursNightclubs.Barrier.Enable(AfterHoursNightclubs.Airport.id, state)
end
},
Posters = {
Enable = function(poster, state)
if state == nil then
state = true
end
AfterHoursNightclubs.Posters.Enable(AfterHoursNightclubs.Airport.id, poster, state)
end,
Clear = function()
AfterHoursNightclubs.Posters.Clear(AfterHoursNightclubs.Airport.id)
end
}
},
-- 192, -3168, 6
Elysian = {
id = 7,
Barrier = {
Enable = function(state)
if state == nil then
state = true
end
AfterHoursNightclubs.Barrier.Enable(AfterHoursNightclubs.Elysian.id, state)
end
},
Posters = {
Enable = function(poster, state)
if state == nil then
state = true
end
AfterHoursNightclubs.Posters.Enable(AfterHoursNightclubs.Elysian.id, poster, state)
end,
Clear = function()
AfterHoursNightclubs.Posters.Clear(AfterHoursNightclubs.Elysian.id)
end
}
},
-- 373, 254, 103
Vinewood = {
id = 8,
Barrier = {
Enable = function(state)
if state == nil then
state = true
end
AfterHoursNightclubs.Barrier.Enable(AfterHoursNightclubs.Vinewood.id, state)
end
},
Posters = {
Enable = function(poster, state)
if state == nil then
state = true
end
AfterHoursNightclubs.Posters.Enable(AfterHoursNightclubs.Vinewood.id, poster, state)
end,
Clear = function()
AfterHoursNightclubs.Posters.Clear(AfterHoursNightclubs.Vinewood.id)
end
}
},
-- -1171, -1150, 6
Vespucci = {
id = 9,
Barrier = {
Enable = function(state)
if state == nil then
state = true
end
AfterHoursNightclubs.Barrier.Enable(AfterHoursNightclubs.Vespucci.id, state)
end
},
Posters = {
Enable = function(poster, state)
if state == nil then
state = true
end
AfterHoursNightclubs.Posters.Enable(AfterHoursNightclubs.Vespucci.id, poster, state)
end,
Clear = function()
AfterHoursNightclubs.Posters.Clear(AfterHoursNightclubs.Vespucci.id)
end
}
},
Barrier = {
barrier = "ba_barriers_caseX",
Enable = function(clubId, state)
value = AfterHoursNightclubs.Barrier.barrier:gsub("caseX", "case" .. tostring(clubId))
EnableIpl(value, state)
end
},
Posters = {
forSale = "ba_caseX_forsale",
dixon = "ba_caseX_dixon",
madonna = "ba_caseX_madonna",
solomun = "ba_caseX_solomun",
taleOfUs = "ba_caseX_taleofus",
Enable = function(clubId, poster, state)
if type(poster) == "table" then
for key, value in pairs(poster) do
if type(value) == "string" then
value = value:gsub("caseX", "case" .. tostring(clubId))
EnableIpl(value, state)
end
end
else
poster = poster:gsub("caseX", "case" .. tostring(clubId))
EnableIpl(poster, state)
end
end,
Clear = function(clubId)
for key, value in pairs(AfterHoursNightclubs.Posters) do
if type(value) == "string" then
value = value:gsub("caseX", "case" .. tostring(clubId))
EnableIpl(value, false)
end
end
end
},
LoadDefault = function()
-- Interior setup
AfterHoursNightclubs.Ipl.Interior.Load()
AfterHoursNightclubs.Interior.Name.Set(AfterHoursNightclubs.Interior.Name.galaxy)
AfterHoursNightclubs.Interior.Style.Set(AfterHoursNightclubs.Interior.Style.edgy)
AfterHoursNightclubs.Interior.Podium.Set(AfterHoursNightclubs.Interior.Podium.edgy)
AfterHoursNightclubs.Interior.Speakers.Set(AfterHoursNightclubs.Interior.Speakers.upgrade)
AfterHoursNightclubs.Interior.Security.Set(AfterHoursNightclubs.Interior.Security.on)
AfterHoursNightclubs.Interior.Turntables.Set(AfterHoursNightclubs.Interior.Turntables.style01)
AfterHoursNightclubs.Interior.Lights.Bands.Set(AfterHoursNightclubs.Interior.Lights.Bands.cyan)
AfterHoursNightclubs.Interior.Bar.Enable(true)
AfterHoursNightclubs.Interior.Booze.Enable(AfterHoursNightclubs.Interior.Booze, true)
AfterHoursNightclubs.Interior.Trophy.Enable(AfterHoursNightclubs.Interior.Trophy.number1, true, AfterHoursNightclubs.Interior.Trophy.Color.gold)
RefreshInterior(AfterHoursNightclubs.interiorId)
-- Exterior IPL
AfterHoursNightclubs.Mesa.Barrier.Enable(true)
AfterHoursNightclubs.Mesa.Posters.Enable(AfterHoursNightclubs.Posters, true)
AfterHoursNightclubs.Mesa.Posters.Enable(AfterHoursNightclubs.Posters.forSale, false)
AfterHoursNightclubs.MissionRow.Barrier.Enable(true)
AfterHoursNightclubs.MissionRow.Posters.Enable(AfterHoursNightclubs.Posters, true)
AfterHoursNightclubs.MissionRow.Posters.Enable(AfterHoursNightclubs.Posters.forSale, false)
AfterHoursNightclubs.Strawberry.Barrier.Enable(true)
AfterHoursNightclubs.Strawberry.Posters.Enable(AfterHoursNightclubs.Posters, true)
AfterHoursNightclubs.Strawberry.Posters.Enable(AfterHoursNightclubs.Posters.forSale, false)
AfterHoursNightclubs.VinewoodWest.Barrier.Enable(true)
AfterHoursNightclubs.VinewoodWest.Posters.Enable(AfterHoursNightclubs.Posters, true)
AfterHoursNightclubs.VinewoodWest.Posters.Enable(AfterHoursNightclubs.Posters.forSale, false)
AfterHoursNightclubs.Cypress.Barrier.Enable(true)
AfterHoursNightclubs.Cypress.Posters.Enable(AfterHoursNightclubs.Posters, true)
AfterHoursNightclubs.Cypress.Posters.Enable(AfterHoursNightclubs.Posters.forSale, false)
AfterHoursNightclubs.DelPerro.Barrier.Enable(true)
AfterHoursNightclubs.DelPerro.Posters.Enable(AfterHoursNightclubs.Posters, true)
AfterHoursNightclubs.DelPerro.Posters.Enable(AfterHoursNightclubs.Posters.forSale, false)
AfterHoursNightclubs.Airport.Barrier.Enable(true)
AfterHoursNightclubs.Airport.Posters.Enable(AfterHoursNightclubs.Posters, true)
AfterHoursNightclubs.Airport.Posters.Enable(AfterHoursNightclubs.Posters.forSale, false)
AfterHoursNightclubs.Elysian.Barrier.Enable(true)
AfterHoursNightclubs.Elysian.Posters.Enable(AfterHoursNightclubs.Posters, true)
AfterHoursNightclubs.Elysian.Posters.Enable(AfterHoursNightclubs.Posters.forSale, false)
AfterHoursNightclubs.Vinewood.Barrier.Enable(true)
AfterHoursNightclubs.Vinewood.Posters.Enable(AfterHoursNightclubs.Posters, true)
AfterHoursNightclubs.Vinewood.Posters.Enable(AfterHoursNightclubs.Posters.forSale, false)
AfterHoursNightclubs.Vespucci.Barrier.Enable(true)
AfterHoursNightclubs.Vespucci.Posters.Enable(AfterHoursNightclubs.Posters, true)
AfterHoursNightclubs.Vespucci.Posters.Enable(AfterHoursNightclubs.Posters.forSale, false)
end
}

View File

@ -0,0 +1,388 @@
-- Clubhouse1: 1107.04, -3157.399, -37.51859
exports('GetBikerClubhouse1Object', function()
return BikerClubhouse1
end)
BikerClubhouse1 = {
interiorId = 246273,
Ipl = {
Interior = {
ipl = "bkr_biker_interior_placement_interior_0_biker_dlc_int_01_milo",
Load = function()
EnableIpl(BikerClubhouse1.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(BikerClubhouse1.Ipl.Interior.ipl, false)
end
}
},
Walls = {
brick = "walls_01",
plain = "walls_02",
Color = {
sable = 0,
yellowGray = 1,
red = 2,
brown = 3,
yellow = 4,
lightYellow = 5,
lightYellowGray = 6,
lightGray = 7,
orange = 8,
gray = 9
},
Set = function(walls, color, refresh)
if color == nil then
color = 0
end
BikerClubhouse1.Walls.Clear(false)
SetIplPropState(BikerClubhouse1.interiorId, walls, true, refresh)
SetInteriorEntitySetColor(BikerClubhouse1.interiorId, walls, color)
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.Walls.brick,
BikerClubhouse1.Walls.plain
}, false, refresh)
end
},
Furnitures = {
A = "furnishings_01",
B = "furnishings_02",
Set = function(furn, color, refresh)
if color == nil then
color = 0
end
BikerClubhouse1.Furnitures.Clear(false)
SetIplPropState(BikerClubhouse1.interiorId, furn, true, refresh)
SetInteriorEntitySetColor(BikerClubhouse1.interiorId, furn, color)
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.Furnitures.A,
BikerClubhouse1.Furnitures.B
}, false, refresh)
end
},
Decoration = {
A = "decorative_01",
B = "decorative_02",
Set = function(deco, refresh)
BikerClubhouse1.Decoration.Clear(false)
SetIplPropState(BikerClubhouse1.interiorId, deco, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.Decoration.A,
BikerClubhouse1.Decoration.B
}, false, refresh)
end
},
Mural = {
none = "",
rideFree = "mural_01",
mods = "mural_02",
brave = "mural_03",
fist = "mural_04",
forest = "mural_05",
mods2 = "mural_06",
rideForever = "mural_07",
heart = "mural_08",
route68 = "mural_09",
Set = function(mural, refresh)
BikerClubhouse1.Mural.Clear(false)
if mural ~= "" then
SetIplPropState(BikerClubhouse1.interiorId, mural, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse1.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.Mural.rideFree,
BikerClubhouse1.Mural.mods,
BikerClubhouse1.Mural.brave,
BikerClubhouse1.Mural.fist,
BikerClubhouse1.Mural.forest,
BikerClubhouse1.Mural.mods2,
BikerClubhouse1.Mural.rideForever,
BikerClubhouse1.Mural.heart,
BikerClubhouse1.Mural.route68
}, false, refresh)
end
},
GunLocker = {
none = "",
on = "gun_locker",
off = "no_gun_locker",
Set = function(locker, refresh)
BikerClubhouse1.GunLocker.Clear(false)
if locker ~= "" then
SetIplPropState(BikerClubhouse1.interiorId, locker, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse1.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.GunLocker.on,
BikerClubhouse1.GunLocker.off
}, false, refresh)
end
},
ModBooth = {
none = "",
on = "mod_booth",
off = "no_mod_booth",
Set = function(mod, refresh)
BikerClubhouse1.ModBooth.Clear(false)
if mod ~= "" then
SetIplPropState(BikerClubhouse1.interiorId, mod, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse1.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.ModBooth.on,
BikerClubhouse1.ModBooth.off
}, false, refresh)
end
},
Meth = {
none = "",
stage1 = "meth_stash1",
stage2 = {
"meth_stash1",
"meth_stash2"
},
stage3 = {
"meth_stash1",
"meth_stash2",
"meth_stash3"
},
Set = function(stage, refresh)
BikerClubhouse1.Meth.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse1.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse1.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.Meth.stage1,
BikerClubhouse1.Meth.stage2,
BikerClubhouse1.Meth.stage3
}, false, refresh)
end
},
Cash = {
none = "",
stage1 = "cash_stash1",
stage2 = {
"cash_stash1",
"cash_stash2"
},
stage3 = {
"cash_stash1",
"cash_stash2",
"cash_stash3"
},
Set = function(stage, refresh)
BikerClubhouse1.Cash.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse1.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse1.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.Cash.stage1,
BikerClubhouse1.Cash.stage2,
BikerClubhouse1.Cash.stage3
}, false, refresh)
end
},
Weed = {
none = "",
stage1 = "weed_stash1",
stage2 = {
"weed_stash1",
"weed_stash2"
},
stage3 = {
"weed_stash1",
"weed_stash2",
"weed_stash3"
},
Set = function(stage, refresh)
BikerClubhouse1.Weed.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse1.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse1.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.Weed.stage1,
BikerClubhouse1.Weed.stage2,
BikerClubhouse1.Weed.stage3
}, false, refresh)
end
},
Coke = {
none = "",
stage1 = "coke_stash1",
stage2 = {
"coke_stash1",
"coke_stash2"
},
stage3 = {
"coke_stash1",
"coke_stash2",
"coke_stash3"
},
Set = function(stage, refresh)
BikerClubhouse1.Coke.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse1.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse1.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.Coke.stage1,
BikerClubhouse1.Coke.stage2,
BikerClubhouse1.Coke.stage3
}, false, refresh)
end
},
Counterfeit = {
none = "",
stage1 = "counterfeit_stash1",
stage2 = {
"counterfeit_stash1",
"counterfeit_stash2"
},
stage3 = {
"counterfeit_stash1",
"counterfeit_stash2",
"counterfeit_stash3"
},
Set = function(stage, refresh)
BikerClubhouse1.Counterfeit.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse1.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse1.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.Counterfeit.stage1,
BikerClubhouse1.Counterfeit.stage2,
BikerClubhouse1.Counterfeit.stage3
}, false, refresh)
end
},
Documents = {
none = "",
stage1 = "id_stash1",
stage2 = {
"id_stash1",
"id_stash2"
},
stage3 = {
"id_stash1",
"id_stash2",
"id_stash3"
},
Set = function(stage, refresh)
BikerClubhouse1.Documents.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse1.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse1.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse1.interiorId, {
BikerClubhouse1.Documents.stage1,
BikerClubhouse1.Documents.stage2,
BikerClubhouse1.Documents.stage3
}, false, refresh)
end
},
LoadDefault = function()
BikerClubhouse1.Ipl.Interior.Load()
BikerClubhouse1.Walls.Set(BikerClubhouse1.Walls.plain, BikerClubhouse1.Walls.Color.brown)
BikerClubhouse1.Furnitures.Set(BikerClubhouse1.Furnitures.A, 3)
BikerClubhouse1.Decoration.Set(BikerClubhouse1.Decoration.A)
BikerClubhouse1.Mural.Set(BikerClubhouse1.Mural.rideFree)
BikerClubhouse1.ModBooth.Set(BikerClubhouse1.ModBooth.none)
BikerClubhouse1.GunLocker.Set(BikerClubhouse1.GunLocker.none)
BikerClubhouse1.Meth.Set(BikerClubhouse1.Meth.none)
BikerClubhouse1.Cash.Set(BikerClubhouse1.Cash.none)
BikerClubhouse1.Coke.Set(BikerClubhouse1.Coke.none)
BikerClubhouse1.Weed.Set(BikerClubhouse1.Weed.none)
BikerClubhouse1.Counterfeit.Set(BikerClubhouse1.Counterfeit.none)
BikerClubhouse1.Documents.Set(BikerClubhouse1.Documents.none)
RefreshInterior(BikerClubhouse1.interiorId)
end
}

View File

@ -0,0 +1,402 @@
-- Clubhouse2: 998.4809, -3164.711, -38.90733
exports('GetBikerClubhouse2Object', function()
return BikerClubhouse2
end)
BikerClubhouse2 = {
interiorId = 246529,
Ipl = {
Interior = {
ipl = "bkr_biker_interior_placement_interior_1_biker_dlc_int_02_milo",
Load = function()
EnableIpl(BikerClubhouse2.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(BikerClubhouse2.Ipl.Interior.ipl, false)
end
}
},
Walls = {
brick = "walls_01",
plain = "walls_02",
Color = {
greenAndGray = 1,
multicolor = 2,
orangeAndGray = 3,
blue = 4,
lightBlueAndSable = 5,
greenAndRed = 6,
yellowAndGray = 7,
red = 8,
fuchsiaAndGray = 9
},
Set = function(walls, color, refresh)
if color == nil then
color = 0
end
BikerClubhouse2.Walls.Clear(false)
SetIplPropState(BikerClubhouse2.interiorId, walls, true, refresh)
SetInteriorEntitySetColor(BikerClubhouse2.interiorId, walls, color)
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.Walls.brick,
BikerClubhouse2.Walls.plain
}, false, refresh)
end
},
LowerWalls = {
default = "lower_walls_default",
SetColor = function(color, refresh)
SetIplPropState(BikerClubhouse2.interiorId, BikerClubhouse2.LowerWalls.default, true, refresh)
SetInteriorEntitySetColor(BikerClubhouse2.interiorId, BikerClubhouse2.LowerWalls.default, color)
end,
},
Furnitures = {
A = "furnishings_01",
B = "furnishings_02",
-- Colors for "furnishings_01" only
Color = {
turquoise = 0,
darkBrown = 1,
brown = 2,
-- 3 equal 1
brown2 = 4,
gray = 5,
red = 6,
darkGray = 7,
black = 8,
red2 = 9
},
Set = function(furn, color, refresh)
if color == nil then
color = 0
end
BikerClubhouse2.Furnitures.Clear(false)
SetIplPropState(BikerClubhouse2.interiorId, furn, true, refresh)
SetInteriorEntitySetColor(BikerClubhouse2.interiorId, furn, color)
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.Furnitures.A,
BikerClubhouse2.Furnitures.B
}, false, refresh)
end
},
Decoration = {
A = "decorative_01",
B = "decorative_02",
Set = function(deco, refresh)
BikerClubhouse2.Decoration.Clear(false)
SetIplPropState(BikerClubhouse2.interiorId, deco, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.Decoration.A,
BikerClubhouse2.Decoration.B
}, false, refresh)
end
},
Mural = {
none = "",
death1 = "mural_01",
cityColor1 = "mural_02",
death2 = "mural_03",
cityColor2 = "mural_04",
graffitis = "mural_05",
cityColor3 = "mural_06",
cityColor4 = "mural_07",
cityBlack = "mural_08",
death3 = "mural_09",
Set = function(mural, refresh)
BikerClubhouse2.Mural.Clear(false)
if mural ~= "" then
SetIplPropState(BikerClubhouse2.interiorId, mural, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse2.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.Mural.death1,
BikerClubhouse2.Mural.cityColor1,
BikerClubhouse2.Mural.death2,
BikerClubhouse2.Mural.cityColor2,
BikerClubhouse2.Mural.graffitis,
BikerClubhouse2.Mural.cityColor3,
BikerClubhouse2.Mural.cityColor4,
BikerClubhouse2.Mural.cityBlack,
BikerClubhouse2.Mural.death3
}, false, refresh)
end
},
GunLocker = {
on = "gun_locker",
off = "no_gun_locker",
Set = function(locker, refresh)
BikerClubhouse2.GunLocker.Clear(false)
if locker ~= "" then
SetIplPropState(BikerClubhouse2.interiorId, locker, true, refresh)
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.GunLocker.on,
BikerClubhouse2.GunLocker.off
}, false, refresh)
end
},
ModBooth = {
none = "",
on = "mod_booth",
off = "no_mod_booth",
Set = function(mod, refresh)
BikerClubhouse2.ModBooth.Clear(false)
if mod ~= "" then
SetIplPropState(BikerClubhouse2.interiorId, mod, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse2.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.ModBooth.on,
BikerClubhouse2.ModBooth.off
}, false, refresh)
end
},
Meth = {
none = "",
stage1 = "meth_small",
stage2 = {
"meth_small",
"meth_medium"
},
stage3 = {
"meth_small",
"meth_medium",
"meth_large"
},
Set = function(stage, refresh)
BikerClubhouse2.Meth.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse2.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse2.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.Meth.stage1,
BikerClubhouse2.Meth.stage2,
BikerClubhouse2.Meth.stage3
}, false, refresh)
end
},
Cash = {
none = "",
stage1 = "cash_small",
stage2 = {
"cash_small",
"cash_medium"
},
stage3 = {
"cash_small",
"cash_medium",
"cash_large"
},
Set = function(stage, refresh)
BikerClubhouse2.Cash.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse2.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse2.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.Cash.stage1,
BikerClubhouse2.Cash.stage2,
BikerClubhouse2.Cash.stage3
}, false, refresh)
end
},
Weed = {
none = "",
stage1 = "weed_small",
stage2 = {
"weed_small",
"weed_medium"
},
stage3 = {
"weed_small",
"weed_medium",
"weed_large"
},
Set = function(stage, refresh)
BikerClubhouse2.Weed.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse2.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse2.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.Weed.stage1,
BikerClubhouse2.Weed.stage2,
BikerClubhouse2.Weed.stage3
}, false, refresh)
end
},
Coke = {
none = "",
stage1 = "coke_small",
stage2 = {
"coke_small",
"coke_medium"
},
stage3 = {
"coke_small",
"coke_medium",
"coke_large"
},
Set = function(stage, refresh)
BikerClubhouse2.Coke.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse2.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse2.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.Coke.stage1,
BikerClubhouse2.Coke.stage2,
BikerClubhouse2.Coke.stage3
}, false, refresh)
end
},
Counterfeit = {
none = "",
stage1 = "counterfeit_small",
stage2 = {
"counterfeit_small",
"counterfeit_medium"
},
stage3 = {
"counterfeit_small",
"counterfeit_medium",
"counterfeit_large"
},
Set = function(stage, refresh)
BikerClubhouse2.Counterfeit.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse2.interiorId, stage, true, refresh)
else
if refresh then
RefreshInterior(BikerClubhouse2.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.Counterfeit.stage1,
BikerClubhouse2.Counterfeit.stage2,
BikerClubhouse2.Counterfeit.stage3
}, false, refresh)
end
},
Documents = {
none = "",
stage1 = "id_small",
stage2 = {
"id_small",
"id_medium"
},
stage3 = {
"id_small",
"id_medium",
"id_large"
},
Set = function(stage, refresh)
BikerClubhouse2.Documents.Clear(false)
if stage ~= "" then
SetIplPropState(BikerClubhouse2.interiorId, stage, true, refresh)
else
if refresh then RefreshInterior(BikerClubhouse2.interiorId) end
end
end,
Clear = function(refresh)
SetIplPropState(BikerClubhouse2.interiorId, {
BikerClubhouse2.Documents.stage1,
BikerClubhouse2.Documents.stage2,
BikerClubhouse2.Documents.stage3
}, false, refresh)
end
},
LoadDefault = function()
BikerClubhouse2.Ipl.Interior.Load()
BikerClubhouse2.Walls.Set(BikerClubhouse2.Walls.brick, BikerClubhouse2.Walls.Color.red)
BikerClubhouse2.LowerWalls.SetColor(BikerClubhouse2.Walls.Color.red)
BikerClubhouse2.Furnitures.Set(BikerClubhouse2.Furnitures.B, BikerClubhouse2.Furnitures.Color.black)
BikerClubhouse2.Decoration.Set(BikerClubhouse2.Decoration.B)
BikerClubhouse2.Mural.Set(BikerClubhouse2.Mural.death3)
BikerClubhouse2.ModBooth.Set(BikerClubhouse2.ModBooth.off)
BikerClubhouse2.GunLocker.Set(BikerClubhouse2.GunLocker.off)
BikerClubhouse2.Meth.Set(BikerClubhouse2.Meth.none)
BikerClubhouse2.Cash.Set(BikerClubhouse2.Cash.none)
BikerClubhouse2.Coke.Set(BikerClubhouse2.Coke.none)
BikerClubhouse2.Weed.Set(BikerClubhouse2.Weed.none)
BikerClubhouse2.Counterfeit.Set(BikerClubhouse2.Counterfeit.none)
BikerClubhouse2.Documents.Set(BikerClubhouse2.Documents.none)
RefreshInterior(BikerClubhouse2.interiorId)
end
}

View File

@ -0,0 +1,98 @@
-- Cocaine lockup: 1093.6, -3196.6, -38.99841
exports('GetBikerCocaineObject', function()
return BikerCocaine
end)
BikerCocaine = {
interiorId = 247553,
Ipl = {
Interior = {
ipl = "bkr_biker_interior_placement_interior_4_biker_dlc_int_ware03_milo",
Load = function()
EnableIpl(BikerCocaine.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(BikerCocaine.Ipl.Interior.ipl, false)
end
}
},
Style = {
none = "",
basic = {
"set_up",
"equipment_basic",
"coke_press_basic",
"production_basic",
"table_equipment"
},
upgrade = {
"set_up",
"equipment_upgrade",
"coke_press_upgrade",
"production_upgrade",
"table_equipment_upgrade"
},
Set = function(style, refresh)
BikerCocaine.Style.Clear(false)
if style ~= "" then
SetIplPropState(BikerCocaine.interiorId, style, true, refresh)
else
if refresh then
RefreshInterior(BikerCocaine.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerCocaine.interiorId, {
BikerCocaine.Style.basic,
BikerCocaine.Style.upgrade
}, false, refresh)
end
},
Security = {
none = "",
basic = "security_low",
upgrade = "security_high",
Set = function(security, refresh)
BikerCocaine.Security.Clear(false)
if security ~= "" then
SetIplPropState(BikerCocaine.interiorId, security, true, refresh)
else
if refresh then
RefreshInterior(BikerCocaine.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerCocaine.interiorId, {
BikerCocaine.Security.basic,
BikerCocaine.Security.upgrade
}, false, refresh)
end
},
Details = {
cokeBasic1 = "coke_cut_01", -- On the basic tables
cokeBasic2 = "coke_cut_02", -- On the basic tables
cokeBasic3 = "coke_cut_03", -- On the basic tables
cokeUpgrade1 = "coke_cut_04", -- On the upgraded tables
cokeUpgrade2 = "coke_cut_05", -- On the upgraded tables
Enable = function(details, state, refresh)
SetIplPropState(BikerCocaine.interiorId, details, state, refresh)
end
},
LoadDefault = function()
BikerCocaine.Ipl.Interior.Load()
BikerCocaine.Style.Set(BikerCocaine.Style.basic)
BikerCocaine.Security.Set(BikerCocaine.Security.none)
RefreshInterior(BikerCocaine.interiorId)
end
}

View File

@ -0,0 +1,206 @@
-- Counterfeit cash factory: 1121.897, -3195.338, -40.4025
exports('GetBikerCounterfeitObject', function()
return BikerCounterfeit
end)
BikerCounterfeit = {
interiorId = 247809,
Ipl = {
Interior = {
ipl = "bkr_biker_interior_placement_interior_5_biker_dlc_int_ware04_milo",
Load = function()
EnableIpl(BikerCounterfeit.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(BikerCounterfeit.Ipl.Interior.ipl, false)
end
}
},
Printer = {
none = "",
basic = "counterfeit_standard_equip_no_prod",
basicProd = "counterfeit_standard_equip",
upgrade = "counterfeit_upgrade_equip_no_prod",
upgradeProd = "counterfeit_upgrade_equip",
Set = function(printer, refresh)
BikerCounterfeit.Printer.Clear(false)
if printer ~= "" then
SetIplPropState(BikerCounterfeit.interiorId, printer, true, refresh)
else
if refresh then
RefreshInterior(BikerCounterfeit.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerCounterfeit.interiorId, {
BikerCounterfeit.Printer.basic,
BikerCounterfeit.Printer.basicProd,
BikerCounterfeit.Printer.upgrade,
BikerCounterfeit.Printer.upgradeProd
}, false, refresh)
end
},
Security = {
basic = "counterfeit_low_security",
upgrade = "counterfeit_security",
Set = function(security, refresh)
BikerCounterfeit.Security.Clear(false)
SetIplPropState(BikerCounterfeit.interiorId, security, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerCounterfeit.interiorId, {
BikerCounterfeit.Security.basic,
BikerCounterfeit.Security.upgrade
}, false, refresh)
end
},
Dryer1 = {
none = "",
on = "dryera_on",
off = "dryera_off",
open = "dryera_open",
Set = function(dryer, refresh)
BikerCounterfeit.Dryer1.Clear(false)
if dryer ~= "" then
SetIplPropState(BikerCounterfeit.interiorId, dryer, true, refresh)
else
if refresh then
RefreshInterior(BikerCounterfeit.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerCounterfeit.interiorId, {
BikerCounterfeit.Dryer1.on,
BikerCounterfeit.Dryer1.off,
BikerCounterfeit.Dryer1.open
}, false, refresh)
end
},
Dryer2 = {
none = "",
on = "dryerb_on",
off = "dryerb_off",
open = "dryerb_open",
Set = function(dryer, refresh)
BikerCounterfeit.Dryer2.Clear(false)
if dryer ~= "" then
SetIplPropState(BikerCounterfeit.interiorId, dryer, true, refresh)
else
if refresh then
RefreshInterior(BikerCounterfeit.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerCounterfeit.interiorId, {
BikerCounterfeit.Dryer2.on,
BikerCounterfeit.Dryer2.off,
BikerCounterfeit.Dryer2.open
}, false, refresh)
end
},
Dryer3 = {
none = "",
on = "dryerc_on",
off = "dryerc_off",
open = "dryerc_open",
Set = function(dryer, refresh)
BikerCounterfeit.Dryer3.Clear(false)
if dryer ~= "" then
SetIplPropState(BikerCounterfeit.interiorId, dryer, true, refresh)
else
if refresh then
RefreshInterior(BikerCounterfeit.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerCounterfeit.interiorId, {
BikerCounterfeit.Dryer3.on,
BikerCounterfeit.Dryer3.off,
BikerCounterfeit.Dryer3.open
}, false, refresh)
end
},
Dryer4 = {
none = "",
on = "dryerd_on",
off = "dryerd_off",
open = "dryerd_open",
Set = function(dryer, refresh)
BikerCounterfeit.Dryer4.Clear(false)
if dryer ~= "" then
SetIplPropState(BikerCounterfeit.interiorId, dryer, true, refresh)
else
if refresh then
RefreshInterior(BikerCounterfeit.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerCounterfeit.interiorId, {
BikerCounterfeit.Dryer4.on,
BikerCounterfeit.Dryer4.off,
BikerCounterfeit.Dryer4.open
}, false, refresh)
end
},
Details = {
Cash10 = {
A = "counterfeit_cashpile10a",
B = "counterfeit_cashpile10b",
C = "counterfeit_cashpile10c",
D = "counterfeit_cashpile10d",
},
Cash20 = {
A = "counterfeit_cashpile20a",
B = "counterfeit_cashpile20b",
C = "counterfeit_cashpile20c",
D = "counterfeit_cashpile20d",
},
Cash100 = {
A = "counterfeit_cashpile100a",
B = "counterfeit_cashpile100b",
C = "counterfeit_cashpile100c",
D = "counterfeit_cashpile100d",
},
chairs = "special_chairs", -- Brown chairs at the end of the room
cutter = "money_cutter", -- Money cutting machine
furnitures = "counterfeit_setup", -- Paper, counting machines, cups
Enable = function(details, state, refresh)
SetIplPropState(BikerCounterfeit.interiorId, details, state, refresh)
end
},
LoadDefault = function()
BikerCounterfeit.Ipl.Interior.Load()
BikerCounterfeit.Printer.Set(BikerCounterfeit.Printer.basicProd)
BikerCounterfeit.Security.Set(BikerCounterfeit.Security.upgrade)
BikerCounterfeit.Dryer1.Set(BikerCounterfeit.Dryer1.open)
BikerCounterfeit.Dryer2.Set(BikerCounterfeit.Dryer2.on)
BikerCounterfeit.Dryer3.Set(BikerCounterfeit.Dryer3.on)
BikerCounterfeit.Dryer4.Set(BikerCounterfeit.Dryer4.on)
BikerCounterfeit.Details.Enable(BikerCounterfeit.Details.cutter, true)
BikerCounterfeit.Details.Enable(BikerCounterfeit.Details.furnitures, true)
BikerCounterfeit.Details.Enable(BikerCounterfeit.Details.Cash100, true)
RefreshInterior(BikerCounterfeit.interiorId)
end
}

View File

@ -0,0 +1,107 @@
-- Document forgery: 1165, -3196.6, -39.01306
exports('GetBikerDocumentForgeryObject', function()
return BikerDocumentForgery
end)
BikerDocumentForgery = {
interiorId = 246785,
Ipl = {
Interior = {
ipl = "bkr_biker_interior_placement_interior_6_biker_dlc_int_ware05_milo",
Load = function()
EnableIpl(BikerDocumentForgery.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(BikerDocumentForgery.Ipl.Interior.ipl, false)
end
}
},
Style = {
basic = "interior_basic",
upgrade = "interior_upgrade",
Set = function(style, refresh)
BikerDocumentForgery.Style.Clear(false)
SetIplPropState(BikerDocumentForgery.interiorId, style, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerDocumentForgery.interiorId, {
BikerDocumentForgery.Style.basic,
BikerDocumentForgery.Style.upgrade
}, false, refresh)
end
},
Equipment = {
none = "",
basic = "equipment_basic",
upgrade = "equipment_upgrade",
Set = function(eqpt, refresh)
BikerDocumentForgery.Equipment.Clear(false)
if eqpt ~= "" then
SetIplPropState(BikerDocumentForgery.interiorId, eqpt, true, refresh)
else
if refresh then
RefreshInterior(BikerDocumentForgery.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerDocumentForgery.interiorId, {
BikerDocumentForgery.Equipment.basic,
BikerDocumentForgery.Equipment.upgrade
}, false, refresh)
end
},
Security = {
basic = "security_low",
upgrade = "security_high",
Set = function(security, refresh)
BikerDocumentForgery.Security.Clear(false)
SetIplPropState(BikerDocumentForgery.interiorId, security, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerDocumentForgery.interiorId, {
BikerDocumentForgery.Security.basic,
BikerDocumentForgery.Security.upgrade
}, false, refresh)
end
},
Details = {
Chairs = {
A = "chair01",
B = "chair02",
C = "chair03",
D = "chair04",
E = "chair05",
F = "chair06",
G = "chair07"
},
production = "production", -- Papers, pencils
furnitures = "set_up", -- Printers, shredders
clutter = "clutter", -- Pizza boxes, cups
Enable = function(details, state, refresh)
SetIplPropState(BikerDocumentForgery.interiorId, details, state, refresh)
end
},
LoadDefault = function()
BikerDocumentForgery.Ipl.Interior.Load()
BikerDocumentForgery.Style.Set(BikerDocumentForgery.Style.basic)
BikerDocumentForgery.Security.Set(BikerDocumentForgery.Security.basic)
BikerDocumentForgery.Equipment.Set(BikerDocumentForgery.Equipment.basic)
BikerDocumentForgery.Details.Enable(BikerDocumentForgery.Details.production, false)
BikerDocumentForgery.Details.Enable(BikerDocumentForgery.Details.setup, false)
BikerDocumentForgery.Details.Enable(BikerDocumentForgery.Details.clutter, false)
BikerDocumentForgery.Details.Enable(BikerDocumentForgery.Details.Chairs, true)
RefreshInterior(BikerDocumentForgery.interiorId)
end
}

View File

@ -0,0 +1,608 @@
exports('GetBikerGangObject', function()
return BikerGang
end)
AddEventHandler('onClientResourceStop', function(res)
if GetCurrentResourceName() ~= res then
return
end
BikerGang.Clubhouse.ClearAll()
end)
BikerGang = {
Name = {
Colors = {
black = 0,
gray = 1,
white = 2,
orange = 3,
red = 4,
green = 5,
yellow = 6,
blue = 7
},
Fonts = {
font1 = 0,
font2 = 1,
font3 = 2,
font4 = 3,
font5 = 4,
font6 = 5,
font7 = 6,
font8 = 7,
font9 = 8,
font10 = 9,
font11 = 10,
font12 = 11,
font13 = 12
},
name = "",
color = 0,
font = 0,
Set = function(name, color, font)
BikerGang.Name.name = name
BikerGang.Name.color = color
BikerGang.Name.font = font
BikerGang.Clubhouse.ClubName.stage = 0
end
},
Emblem = {
Logo = {
eagle = "MPClubPreset1",
skull = "MPClubPreset2",
ace = "MPClubPreset3",
brassKnuckles = "MPClubPreset4",
UR = "MPClubPreset5",
fox = "MPClubPreset6",
city = "MPClubPreset7",
dices = "MPClubPreset8",
target = "MPClubPreset9"
},
emblem = "MPClubPreset1",
rot = 90.0, -- Rotation for 0.0 to 360.0
Set = function(logo, rotation)
BikerGang.Emblem.emblem = logo
BikerGang.Emblem.rot = rotation
BikerGang.Clubhouse.Emblem.stage = 0
end
},
Clubhouse = {
interiorId1 = 246273,
interiorId2 = 246529,
Members = {
President = {
needToLoad = false,
loaded = false,
renderId = -1,
textureDict = "",
pedheadshot = -1,
target = "memorial_wall_president",
prop = "bkr_prop_rt_memorial_president",
stage = 0,
Init = function()
DrawEmptyRect(BikerGang.Clubhouse.Members.President.target, BikerGang.Clubhouse.Members.President.prop)
end,
Enable = function(state)
BikerGang.Clubhouse.Members.President.needToLoad = state
end,
Set = function(ped)
BikerGang.Clubhouse.Members.Set(BikerGang.Clubhouse.Members.President, ped)
end,
Clear = function()
BikerGang.Clubhouse.Members.Clear(BikerGang.Clubhouse.Members.President)
end
},
VicePresident = {
needToLoad = false,
loaded = false,
renderId = -1,
textureDict = "",
pedheadshot = -1,
target = "memorial_wall_vice_president",
prop = "bkr_prop_rt_memorial_vice_pres",
stage = 0,
Init = function()
DrawEmptyRect(BikerGang.Clubhouse.Members.VicePresident.target, BikerGang.Clubhouse.Members.VicePresident.prop)
end,
Enable = function(state)
BikerGang.Clubhouse.Members.VicePresident.needToLoad = state
end,
Set = function(ped)
BikerGang.Clubhouse.Members.Set(BikerGang.Clubhouse.Members.VicePresident, ped)
end,
Clear = function()
BikerGang.Clubhouse.Members.Clear(BikerGang.Clubhouse.Members.VicePresident)
end
},
RoadCaptain = {
needToLoad = false,
loaded = false,
renderId = -1,
textureDict = "",
pedheadshot = -1,
target = "memorial_wall_active_01",
prop = "bkr_prop_rt_memorial_active_01",
stage = 0,
Init = function()
DrawEmptyRect(BikerGang.Clubhouse.Members.RoadCaptain.target, BikerGang.Clubhouse.Members.RoadCaptain.prop)
end,
Enable = function(state)
BikerGang.Clubhouse.Members.RoadCaptain.needToLoad = state
end,
Set = function(ped)
BikerGang.Clubhouse.Members.Set(BikerGang.Clubhouse.Members.RoadCaptain, ped)
end,
Clear = function()
BikerGang.Clubhouse.Members.Clear(BikerGang.Clubhouse.Members.RoadCaptain)
end
},
Enforcer = {
needToLoad = false,
loaded = false,
renderId = -1,
textureDict = "",
pedheadshot = -1,
target = "memorial_wall_active_02",
prop = "bkr_prop_rt_memorial_active_02",
stage = 0,
Init = function()
DrawEmptyRect(BikerGang.Clubhouse.Members.Enforcer.target, BikerGang.Clubhouse.Members.Enforcer.prop)
end,
Enable = function(state)
BikerGang.Clubhouse.Members.Enforcer.needToLoad = state
end,
Set = function(ped)
BikerGang.Clubhouse.Members.Set(BikerGang.Clubhouse.Members.Enforcer, ped)
end,
Clear = function()
BikerGang.Clubhouse.Members.Clear(BikerGang.Clubhouse.Members.Enforcer)
end
},
SergeantAtArms = {
needToLoad = false,
loaded = false,
renderId = -1,
textureDict = "",
pedheadshot = -1,
target = "memorial_wall_active_03",
prop = "bkr_prop_rt_memorial_active_03",
stage = 0,
Init = function()
DrawEmptyRect(BikerGang.Clubhouse.Members.SergeantAtArms.target, BikerGang.Clubhouse.Members.SergeantAtArms.prop)
end,
Enable = function(state)
BikerGang.Clubhouse.Members.SergeantAtArms.needToLoad = state
end,
Set = function(ped)
BikerGang.Clubhouse.Members.Set(BikerGang.Clubhouse.Members.SergeantAtArms, ped)
end,
Clear = function()
BikerGang.Clubhouse.Members.Clear(BikerGang.Clubhouse.Members.SergeantAtArms)
end
},
Set = function(member, ped)
member.Clear()
member.pedheadshot = GetPedheadshot(ped)
if member.pedheadshot ~= -1 then
member.textureDict = GetPedheadshotTxdString(member.pedheadshot)
local IsTextureDictLoaded = LoadStreamedTextureDict(member.textureDict)
if not IsTextureDictLoaded then
print("ERROR: BikerClubhouseDrawMembers - Textures dictionnary \"" .. tostring(member.textureDict) .. "\" cannot be loaded.")
end
else
print("ERROR: BikerClubhouseDrawMembers - PedHeadShot not ready.")
end
end,
Clear = function(member)
if IsNamedRendertargetRegistered(member.target) then
ReleaseNamedRendertarget(GetHashKey(member.target))
end
if member.pedheadshot ~= -1 then
UnregisterPedheadshot(member.pedheadshot)
end
if member.textureDict ~= "" then
SetStreamedTextureDictAsNoLongerNeeded(member.textureDict)
end
member.renderId = -1
member.textureDict = ""
member.pedheadshot = -1
member.stage = 0
end
},
ClubName = {
needToLoad = false,
loaded = false,
target = "clubname_blackboard_01a",
prop = "bkr_prop_clubhouse_blackboard_01a",
renderId = -1,
movieId = -1,
stage = 0,
Init = function()
DrawEmptyRect(BikerGang.Clubhouse.ClubName.target, BikerGang.Clubhouse.ClubName.prop)
end,
Enable = function(state)
BikerGang.Clubhouse.ClubName.needToLoad = state
end,
Clear = function()
if IsNamedRendertargetRegistered(BikerGang.Clubhouse.ClubName.target) then
ReleaseNamedRendertarget(GetHashKey(BikerGang.Clubhouse.ClubName.target))
end
if HasScaleformMovieFilenameLoaded(BikerGang.Clubhouse.ClubName.movieId) then
SetScaleformMovieAsNoLongerNeeded(BikerGang.Clubhouse.ClubName.movieId)
end
BikerGang.Clubhouse.ClubName.renderId = -1
BikerGang.Clubhouse.ClubName.movieId = -1
BikerGang.Clubhouse.ClubName.stage = 0
end
},
Emblem = {
needToLoad = false,
loaded = false,
target = "clubhouse_table",
prop = "bkr_prop_rt_clubhouse_table",
renderId = -1,
movieId = -1,
stage = 0,
Enable = function(state)
BikerGang.Clubhouse.Emblem.needToLoad = state
end,
Init = function()
DrawEmptyRect(BikerGang.Clubhouse.Emblem.target, BikerGang.Clubhouse.Emblem.prop)
end,
Clear = function()
if IsNamedRendertargetRegistered(BikerGang.Clubhouse.Emblem.target) then
ReleaseNamedRendertarget(GetHashKey(BikerGang.Clubhouse.Emblem.target))
end
BikerGang.Clubhouse.Emblem.renderId = -1
BikerGang.Clubhouse.Emblem.stage = 0
end
},
MissionsWall = {
Missions = {
Titles = {
byThePoundUpper = "BDEAL_DEALN",
byThePound = "DEAL_DEALN",
prisonerOfWarUpper = "BIGM_RESCN",
prisonerOfWar = "CELL_BIKER_RESC",
gunsForHire = "LR_INTRO_ST",
weaponOfChoice = "CELL_BIKER_CK",
gunrunningUpper = "GB_BIGUNLOAD_U",
gunrunning = "GB_BIGUNLOAD_T",
nineTenthsOfTheLawUpper = "SB_INTRO_TITLE",
nineTenthsOfTheLaw = "SB_MENU_TITLE",
jailbreakUpper = "FP_INTRO_TITLE",
jailbreak = "FP_MENU_TITLE",
crackedUpper = "SC_INTRO_TITLE",
cracked = "SC_MENU_TITLE",
fragileGoodsUpper = "DV_SH_BIG",
fragileGoods = "DV_SH_TITLE",
torchedUpper = "BA_SH_BIG",
torched = "BA_SH_TITLE",
outriderUpper = "SHU_SH_BIG",
outrider = "SHU_SH_TITLE"
},
Descriptions = {
byThePound = "DEAL_DEALND",
prisonerOfWar = "CELL_BIKER_RESD",
gunsForHire = "GFH_MENU_DESC",
weaponOfChoice = "CELL_BIKER_CKD",
gunrunning = "GB_BIGUNLOAD_D",
nineTenthsOfTheLaw = "SB_MENU_DESC",
jailbreak = "FP_MENU_DESC",
cracked = "SC_MENU_DESC",
fragileGoods = "DV_MENU_DESC",
torched = "BA_MENU_DESC",
outrider = "SHU_MENU_DESC"
},
Pictures = {
byThePound = "CHM_IMG0", -- Pickup car parked
prisonerOfWar = "CHM_IMG8", -- Police with man down
gunsForHire = "CHM_IMG4", -- Limo
weaponOfChoice = "CHM_IMG10", -- Prisoner being beaten
gunrunning = "CHM_IMG3", -- Shipment
nineTenthsOfTheLaw = "CHM_IMG6", -- Wheeling
jailbreak = "CHM_IMG5", -- Prison bus
cracked = "CHM_IMG1", -- Safe
fragileGoods = "CHM_IMG2", -- Lost Van
torched = "CHM_IMG9", -- Explosive crate
outrider = "CHM_IMG7" -- Sport ride
},
},
needToLoad = false,
loaded = false,
target = "clubhouse_Plan_01a",
prop = "bkr_prop_rt_clubhouse_plan_01a",
renderId = -1,
movieId = -1,
stage = 0,
Position = {
none = -1,
left = 0,
middle = 1,
right = 2
},
Init = function()
if not DrawEmptyRect(BikerGang.Clubhouse.MissionsWall.target, BikerGang.Clubhouse.MissionsWall.prop) then
print("ERROR: BikerGang.Clubhouse.MissionsWall.Init() - DrawEmptyRect - Timeout")
end
end,
Enable = function(state)
BikerGang.Clubhouse.MissionsWall.needToLoad = state
end,
SelectMission = function(position)
if BikerGang.Clubhouse.MissionsWall.movieId ~= -1 then
BeginScaleformMovieMethod(BikerGang.Clubhouse.MissionsWall.movieId, "SET_SELECTED_MISSION")
ScaleformMovieMethodAddParamInt(position) -- Mission index 0 to 2 (-1 = no mission)
EndScaleformMovieMethod()
end
end,
SetMission = function(position, title, desc, textDict, x, y)
if BikerGang.Clubhouse.MissionsWall.needToLoad then
if not HasScaleformMovieFilenameLoaded(BikerGang.Clubhouse.MissionsWall.movieId) then
BikerGang.Clubhouse.MissionsWall.movieId = LoadScaleform("BIKER_MISSION_WALL")
end
if BikerGang.Clubhouse.MissionsWall.movieId ~= -1 then
if position > -1 then
BeginScaleformMovieMethod(BikerGang.Clubhouse.MissionsWall.movieId, "SET_MISSION")
ScaleformMovieMethodAddParamInt(position) -- Mission index 0 to 2 (-1 = no mission)
ScaleformMovieMethodAddParamTextureNameString(title)
ScaleformMovieMethodAddParamTextureNameString(desc)
ScaleformMovieMethodAddParamPlayerNameString(textDict)
ScaleformMovieMethodAddParamFloat(x) -- Mission 0: world coordinates X
ScaleformMovieMethodAddParamFloat(y) -- Mission 0: world coordinates Y
EndScaleformMovieMethod()
else
-- Remove all missions
for key, value in pairs(BikerGang.Clubhouse.MissionsWall.Position) do
BikerGang.Clubhouse.MissionsWall.RemoveMission(value)
end
BikerGang.Clubhouse.MissionsWall.SelectMission(BikerGang.Clubhouse.MissionsWall.Position.none)
end
end
end
end,
RemoveMission = function(position)
BeginScaleformMovieMethod(BikerGang.Clubhouse.MissionsWall.movieId, "HIDE_MISSION")
ScaleformMovieMethodAddParamInt(position)
EndScaleformMovieMethod()
end,
Clear = function()
-- Removing missions
BikerGang.Clubhouse.MissionsWall.SelectMission(BikerGang.Clubhouse.MissionsWall.Position.none)
BikerGang.Clubhouse.MissionsWall.SetMission(BikerGang.Clubhouse.MissionsWall.Position.none)
-- Releasing handles
if IsNamedRendertargetRegistered(BikerGang.Clubhouse.MissionsWall.prop) then
ReleaseNamedRendertarget(GetHashKey(BikerGang.Clubhouse.MissionsWall.prop))
end
if HasScaleformMovieFilenameLoaded(BikerGang.Clubhouse.MissionsWall.movieId) then
SetScaleformMovieAsNoLongerNeeded(BikerGang.Clubhouse.MissionsWall.movieId)
end
-- Resetting
BikerGang.Clubhouse.MissionsWall.renderId = -1
BikerGang.Clubhouse.MissionsWall.movieId = -1
BikerGang.Clubhouse.MissionsWall.stage = 0
end
},
ClearAll = function()
BikerGang.Clubhouse.ClubName.Clear()
BikerGang.Clubhouse.ClubName.loaded = false
BikerGang.Clubhouse.Emblem.Clear()
BikerGang.Clubhouse.Emblem.loaded = false
BikerGang.Clubhouse.MissionsWall.Clear()
BikerGang.Clubhouse.MissionsWall.loaded = false
for key, member in pairs(BikerGang.Clubhouse.Members) do
if type(member) == "table" then
member.Clear()
member.loaded = false
end
end
end
}
}
CreateThread(function()
-- Removing the black texture
BikerGang.Clubhouse.Members.President.Init()
BikerGang.Clubhouse.Members.VicePresident.Init()
BikerGang.Clubhouse.Members.RoadCaptain.Init()
BikerGang.Clubhouse.Members.Enforcer.Init()
BikerGang.Clubhouse.Members.SergeantAtArms.Init()
BikerGang.Clubhouse.ClubName.Init()
BikerGang.Clubhouse.Emblem.Init()
BikerGang.Clubhouse.MissionsWall.Init()
while true do
if BikerGang.Clubhouse.ClubName.needToLoad or BikerGang.Clubhouse.Emblem.needToLoad or BikerGang.Clubhouse.MissionsWall.needToLoad or BikerGang.Clubhouse.Members.President.needToLoad or BikerGang.Clubhouse.Members.VicePresident.needToLoad or BikerGang.Clubhouse.Members.RoadCaptain.needToLoad or BikerGang.Clubhouse.Members.Enforcer.needToLoad or BikerGang.Clubhouse.Members.SergeantAtArms.needToLoad then
-- If we are inside a clubhouse, then we load
if Global.Biker.isInsideClubhouse1 or Global.Biker.isInsideClubhouse2 then
-- Club name
if BikerGang.Clubhouse.ClubName.needToLoad then
DrawClubName(BikerGang.Name.name, BikerGang.Name.color, BikerGang.Name.font)
BikerGang.Clubhouse.ClubName.loaded = true
elseif BikerGang.Clubhouse.ClubName.loaded then
BikerGang.Clubhouse.ClubName.Clear()
BikerGang.Clubhouse.ClubName.loaded = false
end
-- Emblem
if BikerGang.Clubhouse.Emblem.needToLoad then
DrawEmblem(BikerGang.Emblem.emblem, BikerGang.Emblem.rot)
BikerGang.Clubhouse.Emblem.loaded = true
elseif BikerGang.Clubhouse.Emblem.loaded then
BikerGang.Clubhouse.Emblem.Clear()
BikerGang.Clubhouse.Emblem.loaded = false
end
-- Missions wall
if BikerGang.Clubhouse.MissionsWall.needToLoad then
DrawMissions()
BikerGang.Clubhouse.MissionsWall.loaded = true
elseif BikerGang.Clubhouse.MissionsWall.loaded then
BikerGang.Clubhouse.MissionsWall.Clear()
BikerGang.Clubhouse.MissionsWall.loaded = false
end
-- Members: President
for key, member in pairs(BikerGang.Clubhouse.Members) do
if type(member) == "table" then
if member.needToLoad then
DrawMember(member)
member.loaded = true
elseif member.loaded then
member.Clear()
member.loaded = false
end
end
end
Wait(0) -- We need to call all this every frame
else
-- Not in a clubhouse
Wait(1000)
end
else
-- No load needed
Wait(1000)
end
end
end)
function DrawClubName(name, color, font)
if BikerGang.Clubhouse.ClubName.stage == 0 then
if BikerGang.Clubhouse.ClubName.renderId == -1 then
BikerGang.Clubhouse.ClubName.renderId = CreateNamedRenderTargetForModel(BikerGang.Clubhouse.ClubName.target, BikerGang.Clubhouse.ClubName.prop)
end
if BikerGang.Clubhouse.ClubName.movieId == -1 then
BikerGang.Clubhouse.ClubName.movieId = RequestScaleformMovie("CLUBHOUSE_NAME")
end
BikerGang.Clubhouse.ClubName.stage = 1
elseif BikerGang.Clubhouse.ClubName.stage == 1 then
if HasScaleformMovieLoaded(BikerGang.Clubhouse.ClubName.movieId) then
local parameters = {
p0 = {type = "string", value = name},
p1 = {type = "int", value = color},
p2 = {type = "int", value = font}
}
SetupScaleform(BikerGang.Clubhouse.ClubName.movieId, "SET_CLUBHOUSE_NAME", parameters)
BikerGang.Clubhouse.ClubName.stage = 2
else
BikerGang.Clubhouse.ClubName.movieId = RequestScaleformMovie("CLUBHOUSE_NAME")
end
elseif BikerGang.Clubhouse.ClubName.stage == 2 then
SetTextRenderId(BikerGang.Clubhouse.ClubName.renderId)
SetScriptGfxDrawOrder(4)
SetScriptGfxDrawBehindPausemenu(true)
SetScriptGfxAlign(73, 73)
DrawScaleformMovie(BikerGang.Clubhouse.ClubName.movieId, 0.0975, 0.105, 0.235, 0.35, 255, 255, 255, 255, 0)
SetTextRenderId(GetDefaultScriptRendertargetRenderId())
ResetScriptGfxAlign()
end
end
function DrawEmblem(texturesDict, rotation)
if BikerGang.Clubhouse.Emblem.stage == 0 then
if BikerGang.Clubhouse.Emblem.renderId == -1 then
BikerGang.Clubhouse.Emblem.renderId = CreateNamedRenderTargetForModel(BikerGang.Clubhouse.Emblem.target, BikerGang.Clubhouse.Emblem.prop)
end
local IsTextureDictLoaded = LoadStreamedTextureDict(texturesDict)
if not IsTextureDictLoaded then
print("ERROR: DrawEmblem - Textures dictionnary cannot be loaded.")
end
BikerGang.Clubhouse.Emblem.stage = 1
elseif BikerGang.Clubhouse.Emblem.stage == 1 then
BikerGang.Clubhouse.Emblem.renderId = CreateNamedRenderTargetForModel(BikerGang.Clubhouse.Emblem.target, BikerGang.Clubhouse.Emblem.prop)
BikerGang.Clubhouse.Emblem.stage = 2
elseif BikerGang.Clubhouse.Emblem.stage == 2 then
SetTextRenderId(BikerGang.Clubhouse.Emblem.renderId)
SetScriptGfxAlign(73, 73)
SetScriptGfxDrawOrder(4)
SetScriptGfxDrawBehindPausemenu(true)
DrawInteractiveSprite(texturesDict, texturesDict, 0.5, 0.5, 1.0, 1.0, rotation, 255, 255, 255, 255);
ResetScriptGfxAlign()
SetTextRenderId(GetDefaultScriptRendertargetRenderId())
end
end
function DrawMissions()
if BikerGang.Clubhouse.MissionsWall.stage == 0 then
if BikerGang.Clubhouse.MissionsWall.renderId == -1 then
BikerGang.Clubhouse.MissionsWall.renderId = CreateNamedRenderTargetForModel(BikerGang.Clubhouse.MissionsWall.target, BikerGang.Clubhouse.MissionsWall.prop)
end
BikerGang.Clubhouse.MissionsWall.stage = 1
elseif BikerGang.Clubhouse.MissionsWall.stage == 1 then
if HasScaleformMovieLoaded(BikerGang.Clubhouse.MissionsWall.movieId) then
BikerGang.Clubhouse.MissionsWall.stage = 2
else
BikerGang.Clubhouse.MissionsWall.movieId = RequestScaleformMovie("BIKER_MISSION_WALL")
end
elseif BikerGang.Clubhouse.MissionsWall.stage == 2 then
SetTextRenderId(BikerGang.Clubhouse.MissionsWall.renderId)
SetScriptGfxDrawOrder(4)
SetScriptGfxDrawBehindPausemenu(false)
DrawScaleformMovie(BikerGang.Clubhouse.MissionsWall.movieId, 0.5, 0.5, 1.0, 1.0, 255, 255, 255, 255, 0)
SetTextRenderId(GetDefaultScriptRendertargetRenderId())
SetScaleformFitRendertarget(BikerGang.Clubhouse.MissionsWall.movieId, true)
end
end
function DrawMember(member)
if member.stage == 0 then
member.stage = 1
elseif member.stage == 1 then
member.renderId = CreateNamedRenderTargetForModel(member.target, member.prop)
member.stage = 2
elseif member.stage == 2 then
if HasStreamedTextureDictLoaded(member.textureDict) then
SetTextRenderId(member.renderId)
SetScriptGfxAlign(73, 73)
DrawInteractiveSprite(member.textureDict, member.textureDict, 0.5, 0.5, 1.0, 1.0, 0.0, 255, 255, 255, 255)
ResetScriptGfxAlign()
SetTextRenderId(GetDefaultScriptRendertargetRenderId())
end
end
end

View File

@ -0,0 +1,87 @@
-- Meth lab: 1009.5, -3196.6, -38.99682
exports('GetBikerMethLabObject', function()
return BikerMethLab
end)
BikerMethLab = {
interiorId = 247041,
Ipl = {
Interior = {
ipl = "bkr_biker_interior_placement_interior_2_biker_dlc_int_ware01_milo",
Load = function()
EnableIpl(BikerMethLab.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(BikerMethLab.Ipl.Interior.ipl, false)
end
}
},
Style = {
none = "",
empty = "meth_lab_empty",
basic = {
"meth_lab_basic",
"meth_lab_setup"
},
upgrade = {
"meth_lab_upgrade",
"meth_lab_setup"
},
Set = function(style, refresh)
BikerMethLab.Style.Clear(false)
if style ~= "" then
SetIplPropState(BikerMethLab.interiorId, style, true, refresh)
else
if refresh then
RefreshInterior(BikerMethLab.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerMethLab.interiorId, {
BikerMethLab.Style.empty,
BikerMethLab.Style.basic,
BikerMethLab.Style.upgrade
}, false, refresh)
end
},
Security = {
none = "",
upgrade = "meth_lab_security_high",
Set = function(security, refresh)
BikerMethLab.Security.Clear(false)
if security ~= "" then
SetIplPropState(BikerMethLab.interiorId, security, true, refresh)
else
if refresh then
RefreshInterior(BikerMethLab.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(BikerMethLab.interiorId, BikerMethLab.Security.upgrade, false, refresh)
end
},
Details = {
production = "meth_lab_production", -- Products
Enable = function(details, state, refresh)
SetIplPropState(BikerMethLab.interiorId, details, state, refresh)
end
},
LoadDefault = function()
BikerMethLab.Ipl.Interior.Load()
BikerMethLab.Style.Set(BikerMethLab.Style.empty)
BikerMethLab.Security.Set(BikerMethLab.Security.none)
BikerMethLab.Details.Enable(BikerMethLab.Details.production, false)
RefreshInterior(BikerMethLab.interiorId)
end
}

View File

@ -0,0 +1,549 @@
-- Weed farm: 1051.491, -3196.536, -39.14842
exports('GetBikerWeedFarmObject', function()
return BikerWeedFarm
end)
BikerWeedFarm = {
interiorId = 247297,
Ipl = {
Interior = {
ipl = "bkr_biker_interior_placement_interior_3_biker_dlc_int_ware02_milo",
Load = function()
EnableIpl(BikerWeedFarm.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(BikerWeedFarm.Ipl.Interior.ipl, false)
end
},
},
Style = {
basic = "weed_standard_equip",
upgrade = "weed_upgrade_equip",
Set = function(style, refresh)
BikerWeedFarm.Style.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, style, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Style.basic,
BikerWeedFarm.Style.upgrade
}, false, refresh)
end
},
Security = {
basic = "weed_low_security",
upgrade = "weed_security_upgrade",
Set = function(security, refresh)
BikerWeedFarm.Security.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, security, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Security.basic,
BikerWeedFarm.Security.upgrade
}, false, refresh)
end
},
Plant1 = {
Stage = {
small = "weed_growtha_stage1",
medium = "weed_growtha_stage2",
full = "weed_growtha_stage3",
Set = function(stage, refresh)
BikerWeedFarm.Plant1.Stage.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, stage, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant1.Stage.small,
BikerWeedFarm.Plant1.Stage.medium,
BikerWeedFarm.Plant1.Stage.full
}, false, refresh)
end
},
Light = {
basic = "light_growtha_stage23_standard",
upgrade = "light_growtha_stage23_upgrade",
Set = function(light, refresh)
BikerWeedFarm.Plant1.Light.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, light, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant1.Light.basic,
BikerWeedFarm.Plant1.Light.upgrade
}, false, refresh)
end
},
Hose = {
Enable = function(state, refresh)
SetIplPropState(BikerWeedFarm.interiorId, "weed_hosea", state, refresh)
end
},
Set = function(stage, upgrade, refresh)
BikerWeedFarm.Plant1.Stage.Set(stage, false)
BikerWeedFarm.Plant1.Light.Set(upgrade, false)
BikerWeedFarm.Plant1.Hose.Enable(true, true)
end,
Clear = function(refresh)
BikerWeedFarm.Plant1.Stage.Clear()
BikerWeedFarm.Plant1.Light.Clear()
BikerWeedFarm.Plant1.Hose.Enable(false, true)
end
},
Plant2 = {
Stage = {
small = "weed_growthb_stage1",
medium = "weed_growthb_stage2",
full = "weed_growthb_stage3",
Set = function(stage, refresh)
BikerWeedFarm.Plant2.Stage.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, stage, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant2.Stage.small,
BikerWeedFarm.Plant2.Stage.medium,
BikerWeedFarm.Plant2.Stage.full
}, false, refresh)
end
},
Light = {
basic = "light_growthb_stage23_standard",
upgrade = "light_growthb_stage23_upgrade",
Set = function(light, refresh)
BikerWeedFarm.Plant2.Light.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, light, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant2.Light.basic,
BikerWeedFarm.Plant2.Light.upgrade
}, false, refresh)
end
},
Hose = {
Enable = function(state, refresh)
SetIplPropState(BikerWeedFarm.interiorId, "weed_hoseb", state, refresh)
end
},
Set = function(stage, upgrade, refresh)
BikerWeedFarm.Plant2.Stage.Set(stage, false)
BikerWeedFarm.Plant2.Light.Set(upgrade, false)
BikerWeedFarm.Plant2.Hose.Enable(true, true)
end,
Clear = function(refresh)
BikerWeedFarm.Plant2.Stage.Clear()
BikerWeedFarm.Plant2.Light.Clear()
BikerWeedFarm.Plant2.Hose.Enable(false, true)
end
},
Plant3 = {
Stage = {
small = "weed_growthc_stage1",
medium = "weed_growthc_stage2",
full = "weed_growthc_stage3",
Set = function(stage, refresh)
BikerWeedFarm.Plant3.Stage.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, stage, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant3.Stage.small,
BikerWeedFarm.Plant3.Stage.medium,
BikerWeedFarm.Plant3.Stage.full
}, false, refresh)
end
},
Light = {
basic = "light_growthc_stage23_standard",
upgrade = "light_growthc_stage23_upgrade",
Set = function(light, refresh)
BikerWeedFarm.Plant3.Light.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, light, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant3.Light.basic,
BikerWeedFarm.Plant3.Light.upgrade
}, false, refresh)
end
},
Hose = {
Enable = function(state, refresh)
SetIplPropState(BikerWeedFarm.interiorId, "weed_hosec", state, refresh)
end
},
Set = function(stage, upgrade, refresh)
BikerWeedFarm.Plant3.Stage.Set(stage, false)
BikerWeedFarm.Plant3.Light.Set(upgrade, false)
BikerWeedFarm.Plant3.Hose.Enable(true, true)
end,
Clear = function(refresh)
BikerWeedFarm.Plant3.Stage.Clear()
BikerWeedFarm.Plant3.Light.Clear()
BikerWeedFarm.Plant3.Hose.Enable(false, true)
end
},
Plant4 = {
Stage = {
small = "weed_growthd_stage1",
medium = "weed_growthd_stage2",
full = "weed_growthd_stage3",
Set = function(stage, refresh)
BikerWeedFarm.Plant4.Stage.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, stage, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant4.Stage.small,
BikerWeedFarm.Plant4.Stage.medium,
BikerWeedFarm.Plant4.Stage.full
}, false, refresh)
end
},
Light = {
basic = "light_growthd_stage23_standard",
upgrade = "light_growthd_stage23_upgrade",
Set = function(light, refresh)
BikerWeedFarm.Plant4.Light.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, light, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant4.Light.basic,
BikerWeedFarm.Plant4.Light.upgrade
}, false, refresh)
end
},
Hose = {
Enable = function(state, refresh)
SetIplPropState(BikerWeedFarm.interiorId, "weed_hosed", state, refresh)
end
},
Set = function(stage, upgrade, refresh)
BikerWeedFarm.Plant4.Stage.Set(stage, false)
BikerWeedFarm.Plant4.Light.Set(upgrade, false)
BikerWeedFarm.Plant4.Hose.Enable(true, true)
end,
Clear = function(refresh)
BikerWeedFarm.Plant4.Stage.Clear()
BikerWeedFarm.Plant4.Light.Clear()
BikerWeedFarm.Plant4.Hose.Enable(false, true)
end
},
Plant5 = {
Stage = {
small = "weed_growthe_stage1",
medium = "weed_growthe_stage2",
full = "weed_growthe_stage3",
Set = function(stage, refresh)
BikerWeedFarm.Plant5.Stage.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, stage, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant5.Stage.small,
BikerWeedFarm.Plant5.Stage.medium,
BikerWeedFarm.Plant5.Stage.full
}, false, refresh)
end
},
Light = {
basic = "light_growthe_stage23_standard",
upgrade = "light_growthe_stage23_upgrade",
Set = function(light, refresh)
BikerWeedFarm.Plant5.Light.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, light, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant5.Light.basic,
BikerWeedFarm.Plant5.Light.upgrade
}, false, refresh)
end
},
Hose = {
Enable = function(state, refresh)
SetIplPropState(BikerWeedFarm.interiorId, "weed_hosee", state, refresh)
end
},
Set = function(stage, upgrade, refresh)
BikerWeedFarm.Plant5.Stage.Set(stage, false)
BikerWeedFarm.Plant5.Light.Set(upgrade, false)
BikerWeedFarm.Plant5.Hose.Enable(true, true)
end,
Clear = function(refresh)
BikerWeedFarm.Plant5.Stage.Clear()
BikerWeedFarm.Plant5.Light.Clear()
BikerWeedFarm.Plant5.Hose.Enable(false, true)
end
},
Plant6 = {
Stage = {
small = "weed_growthf_stage1",
medium = "weed_growthf_stage2",
full = "weed_growthf_stage3",
Set = function(stage, refresh)
BikerWeedFarm.Plant6.Stage.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, stage, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant6.Stage.small,
BikerWeedFarm.Plant6.Stage.medium,
BikerWeedFarm.Plant6.Stage.full
}, false, refresh)
end
},
Light = {
basic = "light_growthf_stage23_standard",
upgrade = "light_growthf_stage23_upgrade",
Set = function(light, refresh)
BikerWeedFarm.Plant6.Light.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, light, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant6.Light.basic,
BikerWeedFarm.Plant6.Light.upgrade
}, false, refresh)
end
},
Hose = {
Enable = function(state, refresh)
SetIplPropState(BikerWeedFarm.interiorId, "weed_hosef", state, refresh)
end
},
Set = function(stage, upgrade, refresh)
BikerWeedFarm.Plant6.Stage.Set(stage, false)
BikerWeedFarm.Plant6.Light.Set(upgrade, false)
BikerWeedFarm.Plant6.Hose.Enable(true, true)
end,
Clear = function(refresh)
BikerWeedFarm.Plant6.Stage.Clear()
BikerWeedFarm.Plant6.Light.Clear()
BikerWeedFarm.Plant6.Hose.Enable(false, true)
end
},
Plant7 = {
Stage = {
small = "weed_growthg_stage1",
medium = "weed_growthg_stage2",
full = "weed_growthg_stage3",
Set = function(stage, refresh)
BikerWeedFarm.Plant7.Stage.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, stage, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant7.Stage.small,
BikerWeedFarm.Plant7.Stage.medium,
BikerWeedFarm.Plant7.Stage.full
}, false, refresh)
end
},
Light = {
basic = "light_growthg_stage23_standard",
upgrade = "light_growthg_stage23_upgrade",
Set = function(light, refresh)
BikerWeedFarm.Plant7.Light.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, light, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant7.Light.basic,
BikerWeedFarm.Plant7.Light.upgrade
}, false, refresh)
end
},
Hose = {
Enable = function(state, refresh)
SetIplPropState(BikerWeedFarm.interiorId, "weed_hoseg", state, refresh)
end
},
Set = function(stage, upgrade, refresh)
BikerWeedFarm.Plant7.Stage.Set(stage, false)
BikerWeedFarm.Plant7.Light.Set(upgrade, false)
BikerWeedFarm.Plant7.Hose.Enable(true, true)
end,
Clear = function(refresh)
BikerWeedFarm.Plant7.Stage.Clear()
BikerWeedFarm.Plant7.Light.Clear()
BikerWeedFarm.Plant7.Hose.Enable(false, true)
end
},
Plant8 = {
Stage = {
small = "weed_growthh_stage1",
medium = "weed_growthh_stage2",
full = "weed_growthh_stage3",
Set = function(stage, refresh)
BikerWeedFarm.Plant8.Stage.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, stage, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant8.Stage.small,
BikerWeedFarm.Plant8.Stage.medium,
BikerWeedFarm.Plant8.Stage.full
}, false, refresh)
end
},
Light = {
basic = "light_growthh_stage23_standard",
upgrade = "light_growthh_stage23_upgrade",
Set = function(light, refresh)
BikerWeedFarm.Plant8.Light.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, light, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant8.Light.basic,
BikerWeedFarm.Plant8.Light.upgrade
}, false, refresh)
end
},
Hose = {
Enable = function(state, refresh)
SetIplPropState(BikerWeedFarm.interiorId, "weed_hoseh", state, refresh)
end
},
Set = function(stage, upgrade, refresh)
BikerWeedFarm.Plant8.Stage.Set(stage, false)
BikerWeedFarm.Plant8.Light.Set(upgrade, false)
BikerWeedFarm.Plant8.Hose.Enable(true, true)
end,
Clear = function(refresh)
BikerWeedFarm.Plant8.Stage.Clear()
BikerWeedFarm.Plant8.Light.Clear()
BikerWeedFarm.Plant8.Hose.Enable(false, true)
end
},
Plant9 = {
Stage = {
small = "weed_growthi_stage1",
medium = "weed_growthi_stage2",
full = "weed_growthi_stage3",
Set = function(stage, refresh)
BikerWeedFarm.Plant9.Stage.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, stage, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant9.Stage.small,
BikerWeedFarm.Plant9.Stage.medium,
BikerWeedFarm.Plant9.Stage.full
}, false, refresh)
end
},
Light = {
basic = "light_growthi_stage23_standard",
upgrade = "light_growthi_stage23_upgrade",
Set = function(light, refresh)
BikerWeedFarm.Plant9.Light.Clear(false)
SetIplPropState(BikerWeedFarm.interiorId, light, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(BikerWeedFarm.interiorId, {
BikerWeedFarm.Plant9.Light.basic,
BikerWeedFarm.Plant9.Light.upgrade
}, false, refresh)
end
},
Hose = {
Enable = function(state, refresh)
SetIplPropState(BikerWeedFarm.interiorId, "weed_hosei", state, refresh)
end
},
Set = function(stage, upgrade, refresh)
BikerWeedFarm.Plant9.Stage.Set(stage, false)
BikerWeedFarm.Plant9.Light.Set(upgrade, false)
BikerWeedFarm.Plant9.Hose.Enable(true, true)
end,
Clear = function(refresh)
BikerWeedFarm.Plant9.Stage.Clear()
BikerWeedFarm.Plant9.Light.Clear()
BikerWeedFarm.Plant9.Hose.Enable(false, true)
end
},
Details = {
production = "weed_production", -- Weed on the tables
fans = "weed_set_up", -- Fans + mold buckets
drying = "weed_drying", -- Drying weed hooked to the ceiling
chairs = "weed_chairs", -- Chairs at the tables
Enable = function(details, state, refresh)
SetIplPropState(BikerWeedFarm.interiorId, details, state, refresh)
end
},
LoadDefault = function()
BikerWeedFarm.Ipl.Interior.Load()
BikerWeedFarm.Style.Set(BikerWeedFarm.Style.upgrade)
BikerWeedFarm.Security.Set(BikerWeedFarm.Security.basic)
BikerWeedFarm.Details.Enable(BikerWeedFarm.Details.drying, false)
BikerWeedFarm.Details.Enable(BikerWeedFarm.Details.chairs, false)
BikerWeedFarm.Details.Enable(BikerWeedFarm.Details.production, false)
BikerWeedFarm.Details.Enable({
BikerWeedFarm.Details.production,
BikerWeedFarm.Details.chairs,
BikerWeedFarm.Details.drying
}, true)
BikerWeedFarm.Plant1.Set(BikerWeedFarm.Plant1.Stage.medium, BikerWeedFarm.Plant1.Light.basic)
BikerWeedFarm.Plant2.Set(BikerWeedFarm.Plant2.Stage.full, BikerWeedFarm.Plant2.Light.basic)
BikerWeedFarm.Plant3.Set(BikerWeedFarm.Plant3.Stage.medium, BikerWeedFarm.Plant3.Light.basic)
BikerWeedFarm.Plant4.Set(BikerWeedFarm.Plant4.Stage.full, BikerWeedFarm.Plant4.Light.basic)
BikerWeedFarm.Plant5.Set(BikerWeedFarm.Plant5.Stage.medium, BikerWeedFarm.Plant5.Light.basic)
BikerWeedFarm.Plant6.Set(BikerWeedFarm.Plant6.Stage.full, BikerWeedFarm.Plant6.Light.basic)
BikerWeedFarm.Plant7.Set(BikerWeedFarm.Plant7.Stage.medium, BikerWeedFarm.Plant7.Light.basic)
BikerWeedFarm.Plant8.Set(BikerWeedFarm.Plant8.Stage.full, BikerWeedFarm.Plant8.Light.basic)
BikerWeedFarm.Plant9.Set(BikerWeedFarm.Plant9.Stage.full, BikerWeedFarm.Plant9.Light.basic)
RefreshInterior(BikerWeedFarm.interiorId)
end
}

View File

@ -0,0 +1,70 @@
exports('GetDiamondCasinoObject', function()
return DiamondCasino
end)
DiamondCasino = {
Ipl = {
Building = {
ipl = {
"hei_dlc_windows_casino",
"hei_dlc_casino_aircon",
"vw_dlc_casino_door",
"hei_dlc_casino_door"
},
Load = function()
EnableIpl(DiamondCasino.Ipl.Building.ipl, true)
end,
Remove = function()
EnableIpl(DiamondCasino.Ipl.Building.ipl, false)
end
},
Main = {
ipl = "vw_casino_main",
-- Normal Version: 1110.20, 216.60 -49.45
-- Heist Version: 2490.67, -280.40, -58.71
Load = function()
EnableIpl(DiamondCasino.Ipl.Main.ipl, true)
end,
Remove = function()
EnableIpl(DiamondCasino.Ipl.Main.ipl, false)
end
},
Garage = {
ipl = "vw_casino_garage",
-- Loading Bay Garage: 2536.276, -278.98, -64.722
-- Vault Lobby: 2483.151, -278.58, -70.694
-- Vault: 2516.765, -238.056, -70.737
Load = function()
EnableIpl(DiamondCasino.Ipl.Garage.ipl, true)
end,
Remove = function()
EnableIpl(DiamondCasino.Ipl.Garage.ipl, false)
end
},
Carpark = {
ipl = "vw_casino_carpark",
-- Carpark Garage: 1380.000 200.000 -50.000
-- VIP Carpark Garage: 1295.000 230.000 -50.000
Load = function()
EnableIpl(DiamondCasino.Ipl.Carpark.ipl, true)
end,
Remove = function()
EnableIpl(DiamondCasino.Ipl.Carpark.ipl, false)
end
}
},
LoadDefault = function()
DiamondCasino.Ipl.Building.Load()
DiamondCasino.Ipl.Main.Load()
DiamondCasino.Ipl.Carpark.Load()
DiamondCasino.Ipl.Garage.Load()
end
}

View File

@ -0,0 +1,335 @@
exports('GetDiamondPenthouseObject', function()
return DiamondPenthouse
end)
-- Penthouse: 976.636 70.295 115.164
DiamondPenthouse = {
interiorId = 274689,
Ipl = {
Interior = {
ipl = "vw_casino_penthouse",
Load = function()
EnableIpl(DiamondPenthouse.Ipl.Interior.ipl, true)
SetIplPropState(DiamondPenthouse.interiorId, "Set_Pent_Tint_Shell", true, true)
end,
Remove = function()
EnableIpl(DiamondPenthouse.Ipl.Interior.ipl, false)
end
}
},
Colors = {
default = 0,
sharp = 1,
vibrant = 2,
timeless = 3
},
Interior = {
Walls = {
SetColor = function(color, refresh)
SetInteriorEntitySetColor(DiamondPenthouse.interiorId, "Set_Pent_Tint_Shell", color)
if refresh then
RefreshInterior(DiamondPenthouse.interiorId)
end
end
},
Pattern = {
pattern01 = "Set_Pent_Pattern_01",
pattern02 = "Set_Pent_Pattern_02",
pattern03 = "Set_Pent_Pattern_03",
pattern04 = "Set_Pent_Pattern_04",
pattern05 = "Set_Pent_Pattern_05",
pattern06 = "Set_Pent_Pattern_06",
pattern07 = "Set_Pent_Pattern_07",
pattern08 = "Set_Pent_Pattern_08",
pattern09 = "Set_Pent_Pattern_09",
Set = function(pattern, refresh)
DiamondPenthouse.Interior.Pattern.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, pattern, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.Pattern) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end,
SetColor = function(pattern, color, refresh)
SetInteriorEntitySetColor(DiamondPenthouse.interiorId, pattern, color)
if refresh then
RefreshInterior(DiamondPenthouse.interiorId)
end
end
},
SpaBar = {
open = "Set_Pent_Spa_Bar_Open",
closed = "Set_Pent_Spa_Bar_Closed",
Set = function(state, refresh)
DiamondPenthouse.Interior.SpaBar.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, state, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.SpaBar) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
MediaBar = {
open = "Set_Pent_Media_Bar_Open",
closed = "Set_Pent_Media_Bar_Closed",
Set = function(state, refresh)
DiamondPenthouse.Interior.MediaBar.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, state, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.MediaBar) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
Dealer = {
open = "Set_Pent_Dealer",
closed = "Set_Pent_NoDealer",
Set = function(state, refresh)
DiamondPenthouse.Interior.Dealer.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, state, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.Dealer) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
Arcade = {
none = "",
retro = "Set_Pent_Arcade_Retro",
modern = "Set_Pent_Arcade_Modern",
Set = function(arcade, refresh)
DiamondPenthouse.Interior.Arcade.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, arcade, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.Arcade) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
Clutter = {
bar = "Set_Pent_Bar_Clutter",
clutter01 = "Set_Pent_Clutter_01",
clutter02 = "Set_Pent_Clutter_02",
clutter03 = "Set_Pent_Clutter_03",
Set = function(clutter, refresh)
DiamondPenthouse.Interior.Clutter.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, clutter, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.Clutter) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
BarLight = {
none = "",
light0 = "set_pent_bar_light_0",
light1 = "set_pent_bar_light_01",
light2 = "set_pent_bar_light_02",
Set = function(light, refresh)
DiamondPenthouse.Interior.BarLight.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, light, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.BarLight) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
BarParty = {
none = "",
party0 = "set_pent_bar_party_0",
party1 = "set_pent_bar_party_1",
party2 = "set_pent_bar_party_2",
partyafter = "set_pent_bar_party_after",
Set = function(party, refresh)
DiamondPenthouse.Interior.BarParty.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, party, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.BarParty) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
Blockers = {
Guest = {
enabled = "Set_Pent_GUEST_BLOCKER",
disabled = "",
Set = function(blocker, refresh)
DiamondPenthouse.Interior.Blockers.Guest.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, blocker, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.Blockers.Guest) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
Lounge = {
enabled = "Set_Pent_LOUNGE_BLOCKER",
disabled = "",
Set = function(blocker, refresh)
DiamondPenthouse.Interior.Blockers.Lounge.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, blocker, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.Blockers.Lounge) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
Office = {
enabled = "Set_Pent_OFFICE_BLOCKER",
disabled = "",
Set = function(blocker, refresh)
DiamondPenthouse.Interior.Blockers.Office.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, blocker, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.Blockers.Office) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
Cinema = {
enabled = "Set_Pent_CINE_BLOCKER",
disabled = "",
Set = function(blocker, refresh)
DiamondPenthouse.Interior.Blockers.Cinema.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, blocker, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.Blockers.Cinema) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
Spa = {
enabled = "Set_Pent_SPA_BLOCKER",
disabled = "",
Set = function(blocker, refresh)
DiamondPenthouse.Interior.Blockers.Spa.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, blocker, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.Blockers.Spa) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
Bar = {
enabled = "Set_Pent_BAR_BLOCKER",
disabled = "",
Set = function(blocker, refresh)
DiamondPenthouse.Interior.Blockers.Bar.Clear(false)
SetIplPropState(DiamondPenthouse.interiorId, blocker, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(DiamondPenthouse.Interior.Blockers.Bar) do
if type(value) == "string" then
SetIplPropState(DiamondPenthouse.interiorId, value, false, refresh)
end
end
end
},
EnableAllBlockers = function()
DiamondPenthouse.Interior.Blockers.Bar.Set(DiamondPenthouse.Interior.Blockers.Bar.enabled)
DiamondPenthouse.Interior.Blockers.Guest.Set(DiamondPenthouse.Interior.Blockers.Guest.enabled)
DiamondPenthouse.Interior.Blockers.Spa.Set(DiamondPenthouse.Interior.Blockers.Spa.enabled)
DiamondPenthouse.Interior.Blockers.Cinema.Set(DiamondPenthouse.Interior.Blockers.Cinema.enabled)
DiamondPenthouse.Interior.Blockers.Lounge.Set(DiamondPenthouse.Interior.Blockers.Lounge.enabled)
DiamondPenthouse.Interior.Blockers.Office.Set(DiamondPenthouse.Interior.Blockers.Office.enabled)
end,
DisableAllBlockers = function()
DiamondPenthouse.Interior.Blockers.Bar.Set(DiamondPenthouse.Interior.Blockers.Bar.disabled)
DiamondPenthouse.Interior.Blockers.Guest.Set(DiamondPenthouse.Interior.Blockers.Guest.disabled)
DiamondPenthouse.Interior.Blockers.Spa.Set(DiamondPenthouse.Interior.Blockers.Spa.disabled)
DiamondPenthouse.Interior.Blockers.Cinema.Set(DiamondPenthouse.Interior.Blockers.Cinema.disabled)
DiamondPenthouse.Interior.Blockers.Lounge.Set(DiamondPenthouse.Interior.Blockers.Lounge.disabled)
DiamondPenthouse.Interior.Blockers.Office.Set(DiamondPenthouse.Interior.Blockers.Office.disabled)
end
}
},
LoadDefault = function()
local styleColor = DiamondPenthouse.Colors.sharp
local stylePattern = DiamondPenthouse.Interior.Pattern.pattern01
DiamondPenthouse.Ipl.Interior.Load()
DiamondPenthouse.Interior.Walls.SetColor(styleColor)
DiamondPenthouse.Interior.Pattern.Set(stylePattern)
DiamondPenthouse.Interior.Pattern.SetColor(stylePattern, styleColor)
DiamondPenthouse.Interior.SpaBar.Set(DiamondPenthouse.Interior.SpaBar.open)
DiamondPenthouse.Interior.MediaBar.Set(DiamondPenthouse.Interior.MediaBar.open)
DiamondPenthouse.Interior.Dealer.Set(DiamondPenthouse.Interior.Dealer.open)
RefreshInterior(DiamondPenthouse.interiorId)
end
}

View File

@ -0,0 +1,3 @@
CreateThread(function()
RequestIpl("h4_ch2_mansion_final")
end)

View File

@ -0,0 +1,207 @@
-- The Music Locker: 1550.0, 250.0, -50.0
exports('GetCayoPericoNightclub', function()
return CayoPericoNightclub
end)
CayoPericoNightclub = {
interiorId = 281089,
Ipl = {
Posters = {
palmstraxx = "h4_clubposter_palmstraxx",
moodymann = "h4_clubposter_moodymann",
keinemusik = "h4_clubposter_keinemusik",
Enable = function(poster, state)
EnableIpl(poster, state)
end
}
},
Security = {
security = "int01_ba_security_upgrade",
Enable = function(state, refresh)
SetIplPropState(CayoPericoNightclub.interiorId, CayoPericoNightclub.Security.security, state, refresh)
end
},
Speakers = {
basic = "int01_ba_equipment_setup",
upgrade = {
"int01_ba_equipment_setup",
"int01_ba_equipment_upgrade"
},
Set = function(speakers, refresh)
CayoPericoNightclub.Speakers.Clear(false)
SetIplPropState(CayoPericoNightclub.interiorId, speakers, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(CayoPericoNightclub.interiorId, {
CayoPericoNightclub.Speakers.basic,
CayoPericoNightclub.Speakers.upgrade
}, false, refresh)
end
},
Podium = {
podium = "int01_ba_style02_podium",
Enable = function(state, refresh)
SetIplPropState(CayoPericoNightclub.interiorId, CayoPericoNightclub.Podium.podium, state, refresh)
end
},
Turntables = {
style01 = "int01_ba_dj01",
style02 = "int01_ba_dj02",
style03 = "int01_ba_dj03",
style04 = "int01_ba_dj04",
style05 = "int01_ba_dj_palms_trax",
style06 = "int01_ba_dj_keinemusik",
style07 = "int01_ba_dj_moodyman",
Set = function(style, refresh)
CayoPericoNightclub.Turntables.Clear(false)
SetIplPropState(CayoPericoNightclub.interiorId, style, true, refresh)
end,
Clear = function(refresh)
for key, value in pairs(CayoPericoNightclub.Turntables) do
if type(value) == "string" then
SetIplPropState(CayoPericoNightclub.interiorId, value, false, refresh)
end
end
end
},
Bar = {
bar = "int01_ba_bar_content",
Enable = function(state, refresh)
SetIplPropState(CayoPericoNightclub.interiorId, CayoPericoNightclub.Bar.bar, state, refresh)
end
},
Screen = {
front = "int01_ba_lights_screen",
back = "int01_ba_screen",
Enable = function(screen, state, refresh)
SetIplPropState(CayoPericoNightclub.interiorId, screen, state, refresh)
end
},
Lights = {
Droplets = {
style01 = "dj_01_lights_01",
style02 = "dj_02_lights_01",
style03 = "dj_03_lights_01",
style04 = "dj_04_lights_01",
Set = function(lights, refresh)
CayoPericoNightclub.Lights.Droplets.Clear(false)
SetIplPropState(CayoPericoNightclub.interiorId, lights, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(CayoPericoNightclub.interiorId, {
CayoPericoNightclub.Lights.Droplets.style01,
CayoPericoNightclub.Lights.Droplets.style02,
CayoPericoNightclub.Lights.Droplets.style03,
CayoPericoNightclub.Lights.Droplets.style04
}, false, refresh)
end
},
Neons = {
style01 = "dj_01_lights_02",
style02 = "dj_02_lights_02",
style03 = "dj_03_lights_02",
style04 = "dj_04_lights_02",
Set = function(lights, refresh)
CayoPericoNightclub.Lights.Neons.Clear(false)
SetIplPropState(CayoPericoNightclub.interiorId, lights, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(CayoPericoNightclub.interiorId, {
CayoPericoNightclub.Lights.Neons.style01,
CayoPericoNightclub.Lights.Neons.style02,
CayoPericoNightclub.Lights.Neons.style03,
CayoPericoNightclub.Lights.Neons.style04
}, false, refresh)
end
},
Bands = {
style01 = "dj_01_lights_03",
style02 = "dj_02_lights_03",
style03 = "dj_03_lights_03",
style04 = "dj_04_lights_03",
Set = function(lights, refresh)
CayoPericoNightclub.Lights.Bands.Clear(false)
SetIplPropState(CayoPericoNightclub.interiorId, lights, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(CayoPericoNightclub.interiorId, {
CayoPericoNightclub.Lights.Bands.style01,
CayoPericoNightclub.Lights.Bands.style02,
CayoPericoNightclub.Lights.Bands.style03,
CayoPericoNightclub.Lights.Bands.style04
}, false, refresh)
end
},
Lasers = {
style01 = "dj_01_lights_04",
style02 = "dj_02_lights_04",
style03 = "dj_03_lights_04",
style04 = "dj_04_lights_04",
Set = function(lights, refresh)
CayoPericoNightclub.Lights.Lasers.Clear(false)
SetIplPropState(CayoPericoNightclub.interiorId, lights, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(CayoPericoNightclub.interiorId, {
CayoPericoNightclub.Lights.Lasers.style01,
CayoPericoNightclub.Lights.Lasers.style02,
CayoPericoNightclub.Lights.Lasers.style03,
CayoPericoNightclub.Lights.Lasers.style04
}, false, refresh)
end
},
Clear = function(refresh)
CayoPericoNightclub.Lights.Droplets.Clear(refresh)
CayoPericoNightclub.Lights.Neons.Clear(refresh)
CayoPericoNightclub.Lights.Bands.Clear(refresh)
CayoPericoNightclub.Lights.Lasers.Clear(refresh)
end
},
LoadDefault = function()
-- Interior
CayoPericoNightclub.Security.Enable(true, false)
CayoPericoNightclub.Speakers.Set(CayoPericoNightclub.Speakers.basic, false)
CayoPericoNightclub.Podium.Enable(true, false)
CayoPericoNightclub.Turntables.Set(CayoPericoNightclub.Turntables.style01, false)
CayoPericoNightclub.Bar.Enable(true, false)
CayoPericoNightclub.Screen.Enable(CayoPericoNightclub.Screen.front, true, false)
CayoPericoNightclub.Lights.Lasers.Set(CayoPericoNightclub.Lights.Lasers.style04, false)
-- Exterior
CayoPericoNightclub.Ipl.Posters.Enable(CayoPericoNightclub.Ipl.Posters.palmstraxx, true)
CayoPericoNightclub.Ipl.Posters.Enable(CayoPericoNightclub.Ipl.Posters.moodymann, true)
CayoPericoNightclub.Ipl.Posters.Enable(CayoPericoNightclub.Ipl.Posters.keinemusik, true)
RefreshInterior(CayoPericoNightclub.interiorId)
end
}

View File

@ -0,0 +1,71 @@
-- Submarine: 1560.0, 400.0, -50.0
exports('GetCayoPericoSubmarine', function()
return CayoPericoSubmarine
end)
CayoPericoSubmarine = {
interiorId = 281345,
Workshop = {
brig = "entity_set_brig",
workshop = "entity_set_weapons",
Set = function(room, refresh)
CayoPericoSubmarine.Workshop.Clear(false)
SetIplPropState(CayoPericoSubmarine.interiorId, room, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(CayoPericoSubmarine.interiorId, {
CayoPericoSubmarine.Workshop.brig,
CayoPericoSubmarine.Workshop.workshop
}, false, refresh)
end
},
Chairs = {
chairs = "entity_set_guide",
Enable = function(state, refresh)
SetIplPropState(CayoPericoSubmarine.interiorId, CayoPericoSubmarine.Chairs.chairs, state, refresh)
end
},
Lights = {
on = "entity_set_hatch_lights_on",
off = "entity_set_hatch_lights_off",
Set = function(lights, refresh)
CayoPericoSubmarine.Lights.Clear(false)
SetIplPropState(CayoPericoSubmarine.interiorId, lights, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(CayoPericoSubmarine.interiorId, {
CayoPericoSubmarine.Lights.on,
CayoPericoSubmarine.Lights.off
}, false, refresh)
end
},
Details = {
bomb = "entity_set_demolition",
torch = "entity_set_acetylene",
cutter = "entity_set_plasma",
fingerprint = "entity_set_fingerprint",
suppressors = "entity_set_suppressors",
jammer = "entity_set_jammer",
Enable = function(details, state, refresh)
SetIplPropState(CayoPericoSubmarine.interiorId, details, state, refresh)
end
},
LoadDefault = function()
CayoPericoSubmarine.Workshop.Set(CayoPericoSubmarine.Workshop.brig, false)
CayoPericoSubmarine.Chairs.Enable(true, false)
CayoPericoSubmarine.Lights.Set(CayoPericoSubmarine.Lights.off, false)
RefreshInterior(CayoPericoSubmarine.interiorId)
end
}

View File

@ -0,0 +1,7 @@
CreateThread(function()
RequestIpl("m23_2_acp_collision_fixes_01")
RequestIpl("m23_2_acp_collision_fixes_02")
RequestIpl("m23_2_tug_collision")
RequestIpl("m23_2_hei_yacht_collision_fixes")
RequestIpl("m23_2_vinewood_garage")
end)

View File

@ -0,0 +1,24 @@
-- Cargo ship: -344.4349, -4062.832, 17.000
exports('GetChopShopCargoShipObject', function()
return ChopShopCargoShip
end)
ChopShopCargoShip = {
Ipl = {
ipl = {
"m23_2_cargoship",
"m23_2_cargoship_bridge"
},
Load = function()
EnableIpl(ChopShopCargoShip.Ipl.ipl, true)
end,
Remove = function()
EnableIpl(ChopShopCargoShip.Ipl.ipl, false)
end
},
LoadDefault = function()
ChopShopCargoShip.Ipl.Load()
end
}

View File

@ -0,0 +1,22 @@
-- Cartel Garage: 1220.133, -2277.844, -50.000
exports('GetChopShopCartelGarageObject', function()
return ChopShopCartelGarage
end)
ChopShopCartelGarage = {
interiorId = 293633,
Entities = {
entities = "mp2023_02_dlc_int_6_cb",
Enable = function(state, refresh)
SetIplPropState(ChopShopCartelGarage.interiorId, ChopShopCartelGarage.Entities.entities, state, refresh)
end
},
LoadDefault = function()
ChopShopCartelGarage.Entities.Enable(true, false)
RefreshInterior(ChopShopCartelGarage.interiorId)
end
}

View File

@ -0,0 +1,21 @@
-- Lifeguard: -1488.153, -1021.166, 5.000
exports('GetChopShopLifeguardObject', function()
return ChopShopLifeguard
end)
ChopShopLifeguard = {
Ipl = {
ipl = "m23_2_lifeguard_access",
Load = function()
EnableIpl(ChopShopLifeguard.Ipl.ipl, true)
end,
Remove = function()
EnableIpl(ChopShopLifeguard.Ipl.ipl, false)
end
},
LoadDefault = function()
ChopShopLifeguard.Ipl.Load()
end
}

View File

@ -0,0 +1,115 @@
-- Salvage Yard: 1077.276, -2274.876, -50.000
exports('GetChopShopSalvageObject', function()
return ChopShopSalvage
end)
ChopShopSalvage = {
interiorId = 293377,
Ipl = {
Exterior = {
ipl = {
"m23_2_sp1_03_reds",
"m23_2_sc1_03_reds",
"m23_2_id2_04_reds",
"m23_2_cs1_05_reds",
"m23_2_cs4_11_reds",
},
Load = function()
EnableIpl(ChopShopSalvage.Ipl.Exterior.ipl, true)
end,
Remove = function()
EnableIpl(ChopShopSalvage.Ipl.Exterior.ipl, false)
end
}
},
Style = {
basic = {
"set_mechanic_basic",
"set_safe_basic"
},
upgrade = {
"set_mechanic_upgrade",
"set_safe_upgrade"
},
Set = function(style, refresh)
ChopShopSalvage.Style.Clear(false)
SetIplPropState(ChopShopSalvage.interiorId, style, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(ChopShopSalvage.interiorId, {
ChopShopSalvage.Style.basic,
ChopShopSalvage.Style.upgrade
}, false, refresh)
end
},
Lift1 = {
down = "set_car_lift_01_down",
up = "set_car_lift_01_up",
Set = function(lift, refresh)
ChopShopSalvage.Lift1.Clear(false)
SetIplPropState(ChopShopSalvage.interiorId, lift, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(ChopShopSalvage.interiorId, {
ChopShopSalvage.Lift1.down,
ChopShopSalvage.Lift1.up
}, false, refresh)
end
},
Lift2 = {
down = "set_car_lift_02_down",
up = "set_car_lift_02_up",
Set = function(lift, refresh)
ChopShopSalvage.Lift2.Clear(false)
SetIplPropState(ChopShopSalvage.interiorId, lift, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(ChopShopSalvage.interiorId, {
ChopShopSalvage.Lift2.down,
ChopShopSalvage.Lift2.up
}, false, refresh)
end
},
Tint = {
gray = 1,
red = 2,
blue = 3,
orange = 4,
yellow = 5,
green = 6,
pink = 7,
teal = 8,
darkGray = 9,
SetColor = function(color, refresh)
SetIplPropState(ChopShopSalvage.interiorId, "set_tint_b", true, refresh)
SetInteriorEntitySetColor(ChopShopSalvage.interiorId, "set_tint_b", color)
end
},
LoadDefault = function()
-- Exterior
ChopShopSalvage.Ipl.Exterior.Load()
-- Interior
ChopShopSalvage.Tint.SetColor(ChopShopSalvage.Tint.gray, false)
ChopShopSalvage.Style.Set(ChopShopSalvage.Style.upgrade, false)
ChopShopSalvage.Lift1.Set(ChopShopSalvage.Lift1.up, false)
ChopShopSalvage.Lift2.Set(ChopShopSalvage.Lift2.up, false)
RefreshInterior(ChopShopSalvage.interiorId)
end
}

View File

@ -0,0 +1,421 @@
-- DoomsdayFacility: 345.00000000 4842.00000000 -60.00000000
exports('GetDoomsdayFacilityObject', function()
return DoomsdayFacility
end)
DoomsdayFacility = {
interiorId = 269313,
Ipl = {
Interior = {
ipl = "xm_x17dlc_int_placement_interior_33_x17dlc_int_02_milo_",
Load = function(color)
EnableIpl(DoomsdayFacility.Ipl.Interior.ipl, true)
SetIplPropState(DoomsdayFacility.interiorId, "set_int_02_shell", true, true)
end,
Remove = function()
EnableIpl(DoomsdayFacility.Ipl.Interior.ipl, false)
end
},
Exterior = {
ipl = {
"xm_hatch_01_cutscene", -- 1286.924 2846.06 49.39426
"xm_hatch_02_cutscene", -- 18.633 2610.834 86.0
"xm_hatch_03_cutscene", -- 2768.574 3919.924 45.82
"xm_hatch_04_cutscene", -- 3406.90 5504.77 26.28
"xm_hatch_06_cutscene", -- 1.90 6832.18 15.82
"xm_hatch_07_cutscene", -- -2231.53 2418.42 12.18
"xm_hatch_08_cutscene", -- -6.92 3327.0 41.63
"xm_hatch_09_cutscene", -- 2073.62 1748.77 104.51
"xm_hatch_10_cutscene", -- 1874.35 284.34 164.31
"xm_hatch_closed", -- Closed hatches (all)
"xm_siloentranceclosed_x17", -- Closed silo: 598.4869 5556.846 716.7615
"xm_bunkerentrance_door", -- Bunker entrance closed door: 2050.85 2950.0 47.75
"xm_hatches_terrain", -- Terrain adjustments for facilities (all) + silo
"xm_hatches_terrain_lod"
},
Load = function()
EnableIpl(DoomsdayFacility.Ipl.Exterior.ipl, true)
end,
Remove = function()
EnableIpl(DoomsdayFacility.Ipl.Exterior.ipl, false)
end
}
},
Colors = {
utility = 1,
expertise = 2,
altitude = 3,
power = 4,
authority = 5,
influence = 6,
order = 7,
empire = 8,
supremacy = 9
},
Walls = {
SetColor = function(color, refresh)
SetInteriorEntitySetColor(DoomsdayFacility.interiorId, "set_int_02_shell", color)
if refresh then
RefreshInterior(DoomsdayFacility.interiorId)
end
end
},
Decals = {
none = "",
style01 = "set_int_02_decal_01",
style02 = "set_int_02_decal_02",
style03 = "set_int_02_decal_03",
style04 = "set_int_02_decal_04",
style05 = "set_int_02_decal_05",
style06 = "set_int_02_decal_06",
style07 = "set_int_02_decal_07",
style08 = "set_int_02_decal_08",
style09 = "set_int_02_decal_09",
Set = function(decal, refresh)
DoomsdayFacility.Decals.Clear(refresh)
if decal ~= "" then
SetIplPropState(DoomsdayFacility.interiorId, decal, true, refresh)
else
if refresh then
RefreshInterior(DoomsdayFacility.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(DoomsdayFacility.interiorId, {
DoomsdayFacility.Decals.style01, DoomsdayFacility.Decals.style02, DoomsdayFacility.Decals.style03,
DoomsdayFacility.Decals.style04, DoomsdayFacility.Decals.style05, DoomsdayFacility.Decals.style06,
DoomsdayFacility.Decals.style07, DoomsdayFacility.Decals.style08, DoomsdayFacility.Decals.style09
}, false, refresh)
end
},
Lounge = {
utility = "set_int_02_lounge1",
prestige = "set_int_02_lounge2",
premier = "set_int_02_lounge3",
Set = function(lounge, color, refresh)
DoomsdayFacility.Lounge.Clear(false)
SetIplPropState(DoomsdayFacility.interiorId, lounge, true, refresh)
SetInteriorEntitySetColor(DoomsdayFacility.interiorId, lounge, color)
end,
Clear = function(refresh)
SetIplPropState(DoomsdayFacility.interiorId, {
DoomsdayFacility.Lounge.utility,
DoomsdayFacility.Lounge.prestige,
DoomsdayFacility.Lounge.premier
}, false, refresh)
end
},
Sleeping = {
none = "set_int_02_no_sleep",
utility = "set_int_02_sleep",
prestige = "set_int_02_sleep2",
premier = "set_int_02_sleep3",
Set = function(sleep, color, refresh)
DoomsdayFacility.Sleeping.Clear(false)
SetIplPropState(DoomsdayFacility.interiorId, sleep, true, refresh)
SetInteriorEntitySetColor(DoomsdayFacility.interiorId, sleep, color)
end,
Clear = function(refresh)
SetIplPropState(DoomsdayFacility.interiorId, {
DoomsdayFacility.Sleeping.none,
DoomsdayFacility.Sleeping.utility,
DoomsdayFacility.Sleeping.prestige,
DoomsdayFacility.Sleeping.premier
}, false, refresh)
end
},
Security = {
off = "set_int_02_no_security",
on = "set_int_02_security",
Set = function(security, color, refresh)
DoomsdayFacility.Security.Clear(false)
SetIplPropState(DoomsdayFacility.interiorId, security, true, refresh)
SetInteriorEntitySetColor(DoomsdayFacility.interiorId, security, color)
end,
Clear = function(refresh)
SetIplPropState(DoomsdayFacility.interiorId, {
DoomsdayFacility.Security.off,
DoomsdayFacility.Security.on
}, false, refresh)
end
},
Cannon = {
off = "set_int_02_no_cannon",
on = "set_int_02_cannon",
Set = function(cannon, color, refresh)
DoomsdayFacility.Cannon.Clear(false)
SetIplPropState(DoomsdayFacility.interiorId, cannon, true, refresh)
SetInteriorEntitySetColor(DoomsdayFacility.interiorId, cannon, color)
end,
Clear = function(refresh)
SetIplPropState(DoomsdayFacility.interiorId, {
DoomsdayFacility.Cannon.off,
DoomsdayFacility.Cannon.on
}, false, refresh)
end
},
PrivacyGlass = {
controlModelHash = `xm_prop_x17_tem_control_01`,
Bedroom = {
Enable = function(state)
local handle = GetClosestObjectOfType(367.99, 4827.745, -59.0, 1.0, `xm_prop_x17_l_glass_03`, false, false, false)
if state then
if handle == 0 then
local model = `xm_prop_x17_l_glass_03`
RequestModel(model)
while not HasModelLoaded(model) do
Wait(0)
end
local privacyGlass = CreateObject(model, 367.99, 4827.745, -59.0, false, false, false)
SetEntityAsMissionEntity(privacyGlass, true, 0)
SetEntityCompletelyDisableCollision(privacyGlass, false, 0)
SetEntityInvincible(privacyGlass, true)
SetEntityAlpha(privacyGlass, 254, false)
end
else
if handle ~= 0 then
SetEntityAsMissionEntity(handle, false, false)
DeleteEntity(handle)
end
end
end,
Control = {
position = vector3(372.115, 4827.504, -58.47),
rotation = vector3(0.0, 0.0, 0.0),
Enable = function(state)
local handle = GetClosestObjectOfType(DoomsdayFacility.PrivacyGlass.Bedroom.Control.position.x, DoomsdayFacility.PrivacyGlass.Bedroom.Control.position.y, DoomsdayFacility.PrivacyGlass.Bedroom.Control.position.z, 1.0, DoomsdayFacility.PrivacyGlass.controlModelHash, false, false, false)
if state then
if handle == 0 then
RequestModel(DoomsdayFacility.PrivacyGlass.controlModelHash)
while not HasModelLoaded(DoomsdayFacility.PrivacyGlass.controlModelHash) do
Wait(0)
end
local privacyGlass = CreateObjectNoOffset(DoomsdayFacility.PrivacyGlass.controlModelHash, DoomsdayFacility.PrivacyGlass.Bedroom.Control.position.x, DoomsdayFacility.PrivacyGlass.Bedroom.Control.position.y, DoomsdayFacility.PrivacyGlass.Bedroom.Control.position.z, false, false, false)
SetEntityRotation(privacyGlass, DoomsdayFacility.PrivacyGlass.Bedroom.Control.rotation.x, DoomsdayFacility.PrivacyGlass.Bedroom.Control.rotation.y, DoomsdayFacility.PrivacyGlass.Bedroom.Control.rotation.z, 2, true)
FreezeEntityPosition(privacyGlass, true)
SetEntityAsMissionEntity(privacyGlass, false, false)
end
else
if handle ~= 0 then
SetEntityAsMissionEntity(handle, false, false)
DeleteEntity(handle)
end
end
end,
}
},
Lounge = {
Glasses = {
{
modelHash = `xm_prop_x17_l_door_glass_01`,
entityHash = `xm_prop_x17_l_door_frame_01`,
entityPos = vector3(359.22, 4846.043, -58.85)
},
{
modelHash = `xm_prop_x17_l_door_glass_01`,
entityHash = `xm_prop_x17_l_door_frame_01`,
entityPos = vector3(369.066, 4846.273, -58.85)
},
{
modelHash = `xm_prop_x17_l_glass_01`,
entityHash = `xm_prop_x17_l_frame_01`,
entityPos = vector3(358.843, 4845.103, -60.0)
},
{
modelHash = `xm_prop_x17_l_glass_02`,
entityHash = `xm_prop_x17_l_frame_02`,
entityPos = vector3(366.309, 4847.281, -60.0)
},
{
modelHash = `xm_prop_x17_l_glass_03`,
entityHash = `xm_prop_x17_l_frame_03`,
entityPos = vector3(371.194, 4841.27, -60.0)
}
},
Enable = function(state)
for key, glass in pairs(DoomsdayFacility.PrivacyGlass.Lounge.Glasses) do
local handle = GetClosestObjectOfType(glass.entityPos.x, glass.entityPos.y, glass.entityPos.z, 1.0, glass.modelHash, false, false, false)
if state then
if handle == 0 then
local entityToAttach = GetClosestObjectOfType(glass.entityPos.x, glass.entityPos.y, glass.entityPos.z, 1.0, glass.entityHash, false, false, false)
if entityToAttach ~= 0 then
RequestModel(glass.modelHash)
while not HasModelLoaded(glass.modelHash) do
Wait(0)
end
local privacyGlass = CreateObject(glass.modelHash, glass.entityPos.x, glass.entityPos.y, glass.entityPos.z, false, false, false)
SetEntityAsMissionEntity(privacyGlass, true, false)
SetEntityCompletelyDisableCollision(privacyGlass, false, 0)
SetEntityInvincible(privacyGlass, true)
SetEntityAlpha(privacyGlass, 254, false)
AttachEntityToEntity(privacyGlass, entityToAttach, -1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0, 0, 0, 0, 2, 1)
end
end
else
if handle ~= 0 then
SetEntityAsMissionEntity(handle, false, false)
DeleteEntity(handle)
end
end
end
end,
Control = {
position = vector3(367.317, 4846.729, -58.448),
rotation = vector3(0.0, 0.0, -16.0),
Enable = function(state)
local handle = GetClosestObjectOfType(DoomsdayFacility.PrivacyGlass.Lounge.Control.position.x, DoomsdayFacility.PrivacyGlass.Lounge.Control.position.y, DoomsdayFacility.PrivacyGlass.Lounge.Control.position.z, 1.0, DoomsdayFacility.PrivacyGlass.controlModelHash, false, false, false)
if state then
if handle == 0 then
RequestModel(DoomsdayFacility.PrivacyGlass.controlModelHash)
while not HasModelLoaded(DoomsdayFacility.PrivacyGlass.controlModelHash) do
Wait(0)
end
local privacyGlass = CreateObjectNoOffset(DoomsdayFacility.PrivacyGlass.controlModelHash, DoomsdayFacility.PrivacyGlass.Lounge.Control.position.x, DoomsdayFacility.PrivacyGlass.Lounge.Control.position.y, DoomsdayFacility.PrivacyGlass.Lounge.Control.position.z, false, false, false)
SetEntityRotation(privacyGlass, DoomsdayFacility.PrivacyGlass.Lounge.Control.rotation.x, DoomsdayFacility.PrivacyGlass.Lounge.Control.rotation.y, DoomsdayFacility.PrivacyGlass.Lounge.Control.rotation.z, 2, true)
FreezeEntityPosition(privacyGlass, true)
SetEntityAsMissionEntity(privacyGlass, false, false)
end
else
if handle ~= 0 then
SetEntityAsMissionEntity(handle, false, false)
DeleteEntity(handle)
end
end
end
}
}
},
Details = {
KhanjaliParts = {
A = "Set_Int_02_Parts_Panther1",
B = "Set_Int_02_Parts_Panther2",
C = "Set_Int_02_Parts_Panther3"
},
RiotParts = {
A = "Set_Int_02_Parts_Riot1",
B = "Set_Int_02_Parts_Riot2",
C = "Set_Int_02_Parts_Riot3"
},
ChenoParts = {
A = "Set_Int_02_Parts_Cheno1",
B = "Set_Int_02_Parts_Cheno2",
C = "Set_Int_02_Parts_Cheno3"
},
ThrusterParts = {
A = "Set_Int_02_Parts_Thruster1",
B = "Set_Int_02_Parts_Thruster2",
C = "Set_Int_02_Parts_Thruster3"
},
AvengerParts = {
A = "Set_Int_02_Parts_Avenger1",
B = "Set_Int_02_Parts_Avenger2",
C = "Set_Int_02_Parts_Avenger3"
},
Outfits = {
paramedic = "Set_Int_02_outfit_paramedic",
morgue = "Set_Int_02_outfit_morgue",
serverFarm = "Set_Int_02_outfit_serverfarm",
iaa = "Set_Int_02_outfit_iaa",
stealAvenger = "Set_Int_02_outfit_steal_avenger",
foundry = "Set_Int_02_outfit_foundry",
riot = "Set_Int_02_outfit_riot_van",
stromberg = "Set_Int_02_outfit_stromberg",
submarine = "Set_Int_02_outfit_sub_finale",
predator = "Set_Int_02_outfit_predator",
khanjali = "Set_Int_02_outfit_khanjali",
volatol = "Set_Int_02_outfit_volatol"
},
Trophies = {
eagle = "set_int_02_trophy1",
iaa = "set_int_02_trophy_iaa",
submarine = "set_int_02_trophy_sub",
SetColor = function(color, refresh)
SetInteriorEntitySetColor(DoomsdayFacility.interiorId, "set_int_02_trophy_sub", color)
if refresh then
RefreshInterior(DoomsdayFacility.interiorId)
end
end
},
Clutter = {
A = "set_int_02_clutter1",
B = "set_int_02_clutter2",
C = "set_int_02_clutter3",
D = "set_int_02_clutter4",
E = "set_int_02_clutter5"
},
crewEmblem = "set_int_02_crewemblem",
Enable = function(details, state, refresh)
SetIplPropState(DoomsdayFacility.interiorId, details, state, refresh)
end
},
LoadDefault = function()
DoomsdayFacility.Ipl.Exterior.Load()
DoomsdayFacility.Ipl.Interior.Load()
DoomsdayFacility.Walls.SetColor(DoomsdayFacility.Colors.utility)
DoomsdayFacility.Decals.Set(DoomsdayFacility.Decals.style01)
DoomsdayFacility.Lounge.Set(DoomsdayFacility.Lounge.premier, DoomsdayFacility.Colors.utility)
DoomsdayFacility.Sleeping.Set(DoomsdayFacility.Sleeping.premier, DoomsdayFacility.Colors.utility)
DoomsdayFacility.Security.Set(DoomsdayFacility.Security.on, DoomsdayFacility.Colors.utility)
DoomsdayFacility.Cannon.Set(DoomsdayFacility.Cannon.on, DoomsdayFacility.Colors.utility)
-- Privacy glass remote
DoomsdayFacility.PrivacyGlass.Bedroom.Control.Enable(true)
DoomsdayFacility.PrivacyGlass.Lounge.Control.Enable(true)
DoomsdayFacility.Details.Enable(DoomsdayFacility.Details.crewEmblem, false)
DoomsdayFacility.Details.Enable(DoomsdayFacility.Details.AvengerParts, true)
DoomsdayFacility.Details.Enable(DoomsdayFacility.Details.Outfits, true)
DoomsdayFacility.Details.Enable(DoomsdayFacility.Details.Trophies, true)
DoomsdayFacility.Details.Trophies.SetColor(DoomsdayFacility.Colors.utility)
DoomsdayFacility.Details.Enable({
DoomsdayFacility.Details.Clutter.A,
DoomsdayFacility.Details.Clutter.B
}, true)
RefreshInterior(DoomsdayFacility.interiorId)
end
}

View File

@ -0,0 +1,5 @@
CreateThread(function()
RequestIpl("xm3_collision_fixes")
RequestIpl("xm3_sum2_fix")
RequestIpl("xm3_security_fix")
end)

View File

@ -0,0 +1,51 @@
-- Freakshop: 570.9713, -420.0727, -70.000
exports('GetDrugWarsFreakshopObject', function()
return DrugWarsFreakshop
end)
DrugWarsFreakshop = {
interiorId = 290817,
Ipl = {
Exterior = {
ipl = {
"xm3_warehouse",
"xm3_warehouse_grnd"
},
Load = function()
EnableIpl(DrugWarsFreakshop.Ipl.Exterior.ipl, true)
end,
Remove = function()
EnableIpl(DrugWarsFreakshop.Ipl.Exterior.ipl, false)
end
}
},
Door = {
opened = "entity_set_roller_door_open",
closed = "entity_set_roller_door_closed",
Set = function(door, refresh)
DrugWarsFreakshop.Door.Clear()
SetIplPropState(DrugWarsFreakshop.interiorId, door, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(DrugWarsFreakshop.interiorId, {
DrugWarsFreakshop.Door.opened,
DrugWarsFreakshop.Door.closed
}, false, refresh)
end
},
LoadDefault = function()
-- Exterior
DrugWarsFreakshop.Ipl.Exterior.Load()
-- Interior
DrugWarsFreakshop.Door.Set(DrugWarsFreakshop.Door.closed, false)
RefreshInterior(DrugWarsFreakshop.interiorId)
end
}

View File

@ -0,0 +1,114 @@
-- Eclipse Boulevard Garage: 519.2477, -2618.788, -50.000
exports('GetDrugWarsGarageObject', function()
return DrugWarsGarage
end)
DrugWarsGarage = {
interiorId = 290561,
Ipl = {
Exterior = {
ipl = "xm3_garage_fix",
Load = function()
EnableIpl(DrugWarsGarage.Ipl.Exterior.ipl, true)
end,
Remove = function()
EnableIpl(DrugWarsGarage.Ipl.Exterior.ipl, false)
end
}
},
Banner = {
model = `ss1_13_clth_ss1_13`,
position = vector3(-277.1116, 281.5493, 98.6691),
Hide = function()
CreateModelHide(DrugWarsGarage.Banner.position, 10.0, DrugWarsGarage.Banner.model, true)
end,
Restore = function()
RemoveModelHide(DrugWarsGarage.Banner.position, 10.0, DrugWarsGarage.Banner.model, false)
end
},
Numbering = {
none = "",
level1 = "entity_set_numbers_01",
level2 = "entity_set_numbers_02",
level3 = "entity_set_numbers_03",
level4 = "entity_set_numbers_04",
level5 = "entity_set_numbers_05",
Set = function(num, refresh)
DrugWarsGarage.Numbering.Clear(false)
if num ~= "" then
SetIplPropState(DrugWarsGarage.interiorId, num, true, refresh)
else
if refresh then
RefreshInterior(DrugWarsGarage.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(DrugWarsGarage.interiorId, {
DrugWarsGarage.Numbering.level1,
DrugWarsGarage.Numbering.level2,
DrugWarsGarage.Numbering.level3,
DrugWarsGarage.Numbering.level4,
DrugWarsGarage.Numbering.level5
}, false, refresh)
end
},
Style = {
immaculate = "entity_set_shell_01",
industrial = "entity_set_shell_02",
indulgent = "entity_set_shell_03",
Set = function(style, refresh)
DrugWarsGarage.Style.Clear(false)
SetIplPropState(DrugWarsGarage.interiorId, style, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(DrugWarsGarage.interiorId, {
DrugWarsGarage.Style.immaculate,
DrugWarsGarage.Style.industrial,
DrugWarsGarage.Style.indulgent
}, false, refresh)
end
},
Tint = {
white = 1,
gray = 2,
black = 3,
purple = 4,
orange = 5,
yellow = 6,
blue = 7,
red = 8,
green = 9,
lightBlue = 10,
lightGreen = 11,
SetColor = function(color, refresh)
SetIplPropState(DrugWarsGarage.interiorId, "entity_set_tint_01", true, refresh)
SetInteriorEntitySetColor(DrugWarsGarage.interiorId, "entity_set_tint_01", color)
end
},
LoadDefault = function()
-- Exterior
DrugWarsGarage.Ipl.Exterior.Load()
DrugWarsGarage.Banner.Hide()
-- Interior
DrugWarsGarage.Numbering.Set(DrugWarsGarage.Numbering.level1, false)
DrugWarsGarage.Style.Set(DrugWarsGarage.Style.immaculate, false)
DrugWarsGarage.Tint.SetColor(DrugWarsGarage.Tint.white, false)
RefreshInterior(DrugWarsGarage.interiorId)
end
}

View File

@ -0,0 +1,38 @@
-- Acid Lab: 483.4252, -2625.071, -50.000
exports('GetDrugWarsLabObject', function()
return DrugWarsLab
end)
DrugWarsLab = {
interiorId = 290305,
Details = {
products = {
"set_product_01",
"set_product_02",
"set_product_03",
"set_product_04",
"set_product_05"
},
supplies = {
"set_supplies_01",
"set_supplies_02",
"set_supplies_03",
"set_supplies_04",
"set_supplies_05",
},
equipment = "set_equipment_upgrade",
Enable = function(details, state, refresh)
SetIplPropState(DrugWarsLab.interiorId, details, state, refresh)
end
},
LoadDefault = function()
DrugWarsLab.Details.Enable(DrugWarsLab.Details.products, true, false)
DrugWarsLab.Details.Enable(DrugWarsLab.Details.supplies, true, false)
DrugWarsLab.Details.Enable(DrugWarsLab.Details.equipment, true, false)
RefreshInterior(DrugWarsLab.interiorId)
end
}

View File

@ -0,0 +1,12 @@
-- Train crash: 2630.595, 1458.144, 25.3669
exports('GetDrugWarsTrainCrashObject', function()
return DrugWarsTrainCrash
end)
DrugWarsTrainCrash = {
ipl = "xm3_train_crash",
Enable = function(state)
EnableIpl(DrugWarsTrainCrash.ipl, state)
end
}

View File

@ -0,0 +1,136 @@
-- Apartment 1: -787.78050000 334.92320000 215.83840000
exports('GetExecApartment1Object', function()
return ExecApartment1
end)
ExecApartment1 = {
currentInteriorId = -1,
Style = {
Theme = {
modern = {
interiorId = 227329,
ipl = "apa_v_mp_h_01_a"
},
moody = {
interiorId = 228097,
ipl = "apa_v_mp_h_02_a"
},
vibrant = {
interiorId = 228865,
ipl = "apa_v_mp_h_03_a"
},
sharp = {
interiorId = 229633,
ipl = "apa_v_mp_h_04_a"
},
monochrome = {
interiorId = 230401,
ipl = "apa_v_mp_h_05_a"
},
seductive = {
interiorId = 231169,
ipl = "apa_v_mp_h_06_a"
},
regal = {
interiorId = 231937,
ipl = "apa_v_mp_h_07_a"
},
aqua = {
interiorId = 232705,
ipl = "apa_v_mp_h_08_a"
}
},
Set = function(style, refresh)
if type(style) == "table" then
ExecApartment1.Style.Clear()
ExecApartment1.currentInteriorId = style.interiorId
EnableIpl(style.ipl, true)
if refresh then
RefreshInterior(style.interiorId)
end
end
end,
Clear = function()
for key, value in pairs(ExecApartment1.Style.Theme) do
SetIplPropState(value.interiorId, {
"Apart_Hi_Strip_A",
"Apart_Hi_Strip_B",
"Apart_Hi_Strip_C"
}, false)
SetIplPropState(value.interiorId, {
"Apart_Hi_Booze_A",
"Apart_Hi_Booze_B",
"Apart_Hi_Booze_C"
}, false)
SetIplPropState(value.interiorId, {
"Apart_Hi_Smokes_A",
"Apart_Hi_Smokes_B",
"Apart_Hi_Smokes_C"
}, false, true)
EnableIpl(value.ipl, false)
end
end
},
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(ExecApartment1.currentInteriorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(ExecApartment1.currentInteriorId, details, state, refresh)
end
},
Smoke = {
none = "",
stage1 = "Apart_Hi_Smokes_A",
stage2 = "Apart_Hi_Smokes_B",
stage3 = "Apart_Hi_Smokes_C",
Set = function(smoke, refresh)
ExecApartment1.Smoke.Clear(false)
if smoke ~= nil then
SetIplPropState(ExecApartment1.currentInteriorId, smoke, true, refresh)
else
if refresh then
RefreshInterior(ExecApartment1.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(ExecApartment1.currentInteriorId, {
ExecApartment1.Smoke.stage1,
ExecApartment1.Smoke.stage2,
ExecApartment1.Smoke.stage3
}, false, refresh)
end
},
LoadDefault = function()
ExecApartment1.Style.Set(ExecApartment1.Style.Theme.modern, true)
ExecApartment1.Strip.Enable({
ExecApartment1.Strip.A,
ExecApartment1.Strip.B,
ExecApartment1.Strip.C
}, false)
ExecApartment1.Booze.Enable({
ExecApartment1.Booze.A,
ExecApartment1.Booze.B,
ExecApartment1.Booze.C
}, false)
ExecApartment1.Smoke.Set(ExecApartment1.Smoke.none)
end
}

View File

@ -0,0 +1,135 @@
-- Apartment 2: -773.22580000 322.82520000 194.88620000
exports('GetExecApartment2Object', function()
return ExecApartment2
end)
ExecApartment2 = {
currentInteriorId = -1,
Style = {
Theme = {
modern = {
interiorId = 227585,
ipl = "apa_v_mp_h_01_b"
},
moody = {
interiorId = 228353,
ipl = "apa_v_mp_h_02_b"
},
vibrant = {
interiorId = 229121,
ipl = "apa_v_mp_h_03_b"
},
sharp = {
interiorId = 229889,
ipl = "apa_v_mp_h_04_b"
},
monochrome = {
interiorId = 230657,
ipl = "apa_v_mp_h_05_b"
},
seductive = {
interiorId = 231425,
ipl = "apa_v_mp_h_06_b"
},
regal = {
interiorId = 232193,
ipl = "apa_v_mp_h_07_b"
},
aqua = {
interiorId = 232961,
ipl = "apa_v_mp_h_08_b"
}
},
Set = function(style, refresh)
if type(style) == "table" then
ExecApartment2.Style.Clear()
ExecApartment2.currentInteriorId = style.interiorId
EnableIpl(style.ipl, true)
if refresh then
RefreshInterior(style.interiorId)
end
end
end,
Clear = function()
for key, value in pairs(ExecApartment2.Style.Theme) do
SetIplPropState(value.interiorId, {
"Apart_Hi_Strip_A",
"Apart_Hi_Strip_B",
"Apart_Hi_Strip_C"}, false)
SetIplPropState(value.interiorId, {
"Apart_Hi_Booze_A",
"Apart_Hi_Booze_B",
"Apart_Hi_Booze_C"
}, false)
SetIplPropState(value.interiorId, {
"Apart_Hi_Smokes_A",
"Apart_Hi_Smokes_B",
"Apart_Hi_Smokes_C"
}, false, true)
EnableIpl(value.ipl, false)
end
end
},
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(ExecApartment2.currentInteriorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(ExecApartment2.currentInteriorId, details, state, refresh)
end
},
Smoke = {
none = "",
stage1 = "Apart_Hi_Smokes_A",
stage2 = "Apart_Hi_Smokes_B",
stage3 = "Apart_Hi_Smokes_C",
Set = function(smoke, refresh)
ExecApartment2.Smoke.Clear(false)
if smoke ~= nil then
SetIplPropState(ExecApartment2.currentInteriorId, smoke, true, refresh)
else
if refresh then
RefreshInterior(ExecApartment2.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(ExecApartment2.currentInteriorId, {
ExecApartment2.Smoke.stage1,
ExecApartment2.Smoke.stage2,
ExecApartment2.Smoke.stage3
}, false, refresh)
end
},
LoadDefault = function()
ExecApartment2.Style.Set(ExecApartment2.Style.Theme.seductive, true)
ExecApartment2.Strip.Enable({
ExecApartment2.Strip.A,
ExecApartment2.Strip.B,
ExecApartment2.Strip.C
}, false)
ExecApartment2.Booze.Enable({
ExecApartment2.Booze.A,
ExecApartment2.Booze.B,
ExecApartment2.Booze.C
}, false)
ExecApartment2.Smoke.Set(ExecApartment2.Smoke.none)
end
}

View File

@ -0,0 +1,136 @@
-- Apartment 3: -787.78050000 334.92320000 186.11340000
exports('GetExecApartment3Object', function()
return ExecApartment3
end)
ExecApartment3 = {
currentInteriorId = -1,
Style = {
Theme = {
modern = {
interiorId = 227841,
ipl = "apa_v_mp_h_01_c"
},
moody = {
interiorId = 228609,
ipl = "apa_v_mp_h_02_c"
},
vibrant = {
interiorId = 229377,
ipl = "apa_v_mp_h_03_c"
},
sharp = {
interiorId = 230145,
ipl = "apa_v_mp_h_04_c"
},
monochrome = {
interiorId = 230913,
ipl = "apa_v_mp_h_05_c"
},
seductive = {
interiorId = 231681,
ipl = "apa_v_mp_h_06_c"
},
regal = {
interiorId = 232449,
ipl = "apa_v_mp_h_07_c"
},
aqua = {
interiorId = 233217,
ipl = "apa_v_mp_h_08_c"
}
},
Set = function(style, refresh)
if type(style) == "table" then
ExecApartment3.Style.Clear()
ExecApartment3.currentInteriorId = style.interiorId
EnableIpl(style.ipl, true)
if refresh then
RefreshInterior(style.interiorId)
end
end
end,
Clear = function()
for key, value in pairs(ExecApartment3.Style.Theme) do
SetIplPropState(value.interiorId, {
"Apart_Hi_Strip_A",
"Apart_Hi_Strip_B",
"Apart_Hi_Strip_C"
}, false)
SetIplPropState(value.interiorId, {
"Apart_Hi_Booze_A",
"Apart_Hi_Booze_B",
"Apart_Hi_Booze_C"
}, false)
SetIplPropState(value.interiorId, {
"Apart_Hi_Smokes_A",
"Apart_Hi_Smokes_B",
"Apart_Hi_Smokes_C"
}, false, true)
EnableIpl(value.ipl, false)
end
end
},
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(ExecApartment3.currentInteriorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(ExecApartment3.currentInteriorId, details, state, refresh)
end
},
Smoke = {
none = "",
stage1 = "Apart_Hi_Smokes_A",
stage2 = "Apart_Hi_Smokes_B",
stage3 = "Apart_Hi_Smokes_C",
Set = function(smoke, refresh)
ExecApartment3.Smoke.Clear(false)
if smoke ~= nil then
SetIplPropState(ExecApartment3.currentInteriorId, smoke, true, refresh)
else
if refresh then
RefreshInterior(ExecApartment3.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(ExecApartment3.currentInteriorId, {
ExecApartment3.Smoke.stage1,
ExecApartment3.Smoke.stage2,
ExecApartment3.Smoke.stage3
}, false, refresh)
end
},
LoadDefault = function()
ExecApartment3.Style.Set(ExecApartment3.Style.Theme.sharp, true)
ExecApartment3.Strip.Enable({
ExecApartment3.Strip.A,
ExecApartment3.Strip.B,
ExecApartment3.Strip.C
}, false)
ExecApartment3.Booze.Enable({
ExecApartment3.Booze.A,
ExecApartment3.Booze.B,
ExecApartment3.Booze.C
}, false)
ExecApartment3.Smoke.Set(ExecApartment3.Smoke.none)
end
}

View File

@ -0,0 +1,324 @@
-- Office 1: -141.1987, -620.913, 168.8205 (Arcadius Business Centre)
exports('GetFinanceOffice1Object', function()
return FinanceOffice1
end)
FinanceOffice1 = {
currentInteriorId = -1,
currentSafeDoors = {
hashL = "",
hashR = ""
},
Style = {
Theme = {
warm = {
interiorId = 236289,
ipl = "ex_dt1_02_office_01a",
safe = "ex_prop_safedoor_office1a"
},
classical = {
interiorId = 236545,
ipl = "ex_dt1_02_office_01b",
safe = "ex_prop_safedoor_office1b"
},
vintage = {
interiorId = 236801,
ipl = "ex_dt1_02_office_01c",
safe = "ex_prop_safedoor_office1c"
},
contrast = {
interiorId = 237057,
ipl = "ex_dt1_02_office_02a",
safe = "ex_prop_safedoor_office2a"
},
rich = {
interiorId = 237313,
ipl = "ex_dt1_02_office_02b",
safe = "ex_prop_safedoor_office2a"
},
cool = {
interiorId = 237569,
ipl = "ex_dt1_02_office_02c",
safe = "ex_prop_safedoor_office2a"
},
ice = {
interiorId = 237825,
ipl = "ex_dt1_02_office_03a",
safe = "ex_prop_safedoor_office3a"
},
conservative = {
interiorId = 238081,
ipl = "ex_dt1_02_office_03b",
safe = "ex_prop_safedoor_office3a"
},
polished = {
interiorId = 238337,
ipl = "ex_dt1_02_office_03c",
safe = "ex_prop_safedoor_office3c"
}
},
Set = function(style, refresh)
if refresh == nil then
refresh = false
end
if type(style) == "table" then
FinanceOffice1.Style.Clear()
FinanceOffice1.currentInteriorId = style.interiorId
FinanceOffice1.currentSafeDoors = {
hashL = GetHashKey(style.safe .. "_l"),
hashR = GetHashKey(style.safe .. "_r")
}
EnableIpl(style.ipl, true)
if refresh then
RefreshInterior(style.interiorId)
end
end
end,
Clear = function()
for themeKey, themeValue in pairs(FinanceOffice1.Style.Theme) do
for swagKey, swagValue in pairs(FinanceOffice1.Swag) do
if type(swagValue) == "table" then
SetIplPropState(themeValue.interiorId, {
swagValue.A,
swagValue.B,
swagValue.C
}, false)
end
end
SetIplPropState(themeValue.interiorId, "office_chairs", false, false)
SetIplPropState(themeValue.interiorId, "office_booze", false, true)
FinanceOffice1.currentSafeDoors = {
hashL = 0,
hashR = 0
}
EnableIpl(themeValue.ipl, false)
end
end
},
Safe = {
doorHeadingL = 96.0, -- Only need the heading of the Left door to get the Right ones
Position = vector3(-124.25, -641.30, 168.870), -- Approximately between the two doors
-- These values are checked from "doorHandler.lua" and
isLeftDoorOpen = false,
isRightDoorOpen = false,
-- Safe door API
Open = function(doorSide)
if doorSide:lower() == "left" then
FinanceOffice1.Safe.isLeftDoorOpen = true
elseif doorSide:lower() == "right" then
FinanceOffice1.Safe.isRightDoorOpen = true
else
print("[bob74_ipl] Warning: " .. doorSide .. " is not a correct value. Valid values are: left right")
end
end,
Close = function(doorSide)
if doorSide:lower() == "left" then
FinanceOffice1.Safe.isLeftDoorOpen = false
elseif doorSide:lower() == "right" then
FinanceOffice1.Safe.isRightDoorOpen = false
else
print("[bob74_ipl] Warning: " .. doorSide .. " is not a correct value. Valid values are: left right")
end
end,
-- Internal use only
SetDoorState = function(doorSide, open)
local doorHandle = 0
local heading = FinanceOffice1.Safe.doorHeadingL
if doorSide:lower() == "left" then
doorHandle = FinanceOffice1.Safe.GetDoorHandle(FinanceOffice1.currentSafeDoors.hashL)
if open then
heading = heading - 90.0
end
elseif doorSide:lower() == "right" then
doorHandle = FinanceOffice1.Safe.GetDoorHandle(FinanceOffice1.currentSafeDoors.hashR)
heading = heading - 180
if open then
heading = heading + 90.0
end
end
if doorHandle == 0 then
print("[bob74_ipl] Warning: " .. doorSide .. " safe door handle is 0")
return
end
SetEntityHeading(doorHandle, heading)
end,
-- /!\ handle changes whenever the interior is refreshed /!\
GetDoorHandle = function(doorHash)
local timeout = 4
local doorHandle = GetClosestObjectOfType(FinanceOffice1.Safe.Position.x, FinanceOffice1.Safe.Position.y, FinanceOffice1.Safe.Position.z, 5.0, doorHash, false, false, false)
while doorHandle == 0 do
Wait(25)
doorHandle = GetClosestObjectOfType(FinanceOffice1.Safe.Position.x, FinanceOffice1.Safe.Position.y, FinanceOffice1.Safe.Position.z, 5.0, doorHash, false, false, false)
timeout = timeout - 1
if timeout <= 0 then
break
end
end
return doorHandle
end
},
Swag = {
Cash = {
A = "cash_set_01",
B = "cash_set_02",
C = "cash_set_03",
D = "cash_set_04",
E = "cash_set_05",
F = "cash_set_06",
G = "cash_set_07",
H = "cash_set_08",
I = "cash_set_09",
J = "cash_set_10",
K = "cash_set_11",
L = "cash_set_12",
M = "cash_set_13",
N = "cash_set_14",
O = "cash_set_15",
P = "cash_set_16",
Q = "cash_set_17",
R = "cash_set_18",
S = "cash_set_19",
T = "cash_set_20",
U = "cash_set_21",
V = "cash_set_22",
W = "cash_set_23",
X = "cash_set_24"
},
BoozeCigs = {
A = "swag_booze_cigs",
B = "swag_booze_cigs2",
C = "swag_booze_cigs3"
},
Counterfeit = {
A = "swag_counterfeit",
B = "swag_counterfeit2",
C = "swag_counterfeit3"
},
DrugBags = {
A = "swag_drugbags",
B = "swag_drugbags2",
C = "swag_drugbags3"
},
DrugStatue = {
A = "swag_drugstatue",
B = "swag_drugstatue2",
C = "swag_drugstatue3"
},
Electronic = {
A = "swag_electronic",
B = "swag_electronic2",
C = "swag_electronic3"
},
FurCoats = {
A = "swag_furcoats",
B = "swag_furcoats2",
C = "swag_furcoats3"
},
Gems = {
A = "swag_gems",
B = "swag_gems2",
C = "swag_gems3"
},
Guns = {
A = "swag_guns",
B = "swag_guns2",
C = "swag_guns3"
},
Ivory = {
A = "swag_ivory",
B = "swag_ivory2",
C = "swag_ivory3"
},
Jewel = {
A = "swag_jewelwatch",
B = "swag_jewelwatch2",
C = "swag_jewelwatch3"
},
Med = {
A = "swag_med",
B = "swag_med2",
C = "swag_med3"
},
Painting = {
A = "swag_art",
B = "swag_art2",
C = "swag_art3"
},
Pills = {
A = "swag_pills",
B = "swag_pills2",
C = "swag_pills3"
},
Silver = {
A = "swag_silver",
B = "swag_silver2",
C = "swag_silver3"
},
Enable = function(details, state, refresh)
SetIplPropState(FinanceOffice1.currentInteriorId, details, state, refresh)
end
},
Chairs = {
off = "",
on = "office_chairs",
Set = function(chairs, refresh)
FinanceOffice1.Chairs.Clear(false)
if chairs ~= nil then
SetIplPropState(FinanceOffice1.currentInteriorId, chairs, true, refresh)
else
if refresh then
RefreshInterior(FinanceOffice1.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(FinanceOffice1.currentInteriorId, FinanceOffice1.Chairs.on, false, refresh)
end
},
Booze = {
off = "",
on = "office_booze",
Set = function(booze, refresh)
FinanceOffice1.Booze.Clear(false)
if booze ~= nil then
SetIplPropState(FinanceOffice1.currentInteriorId, booze, true, refresh)
else
if refresh then
RefreshInterior(FinanceOffice1.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(FinanceOffice1.currentInteriorId, FinanceOffice1.Booze.on, false, refresh)
end
},
LoadDefault = function()
FinanceOffice1.Style.Set(FinanceOffice1.Style.Theme.polished)
FinanceOffice1.Chairs.Set(FinanceOffice1.Chairs.on, true)
end
}

View File

@ -0,0 +1,324 @@
-- Office 2: -75.8466, -826.9893, 243.3859 (Maze Bank Building)
exports('GetFinanceOffice2Object', function()
return FinanceOffice2
end)
FinanceOffice2 = {
currentInteriorId = -1,
currentSafeDoors = {
hashL = "",
hashR = ""
},
Style = {
Theme = {
warm = {
interiorId = 238593,
ipl = "ex_dt1_11_office_01a",
safe = "ex_prop_safedoor_office1a"
},
classical = {
interiorId = 238849,
ipl = "ex_dt1_11_office_01b",
safe = "ex_prop_safedoor_office1b"
},
vintage = {
interiorId = 239105,
ipl = "ex_dt1_11_office_01c",
safe = "ex_prop_safedoor_office1c"
},
contrast = {
interiorId = 239361,
ipl = "ex_dt1_11_office_02a",
safe = "ex_prop_safedoor_office2a"
},
rich = {
interiorId = 239617,
ipl = "ex_dt1_11_office_02b",
safe = "ex_prop_safedoor_office2a"
},
cool = {
interiorId = 239873,
ipl = "ex_dt1_11_office_02c",
safe = "ex_prop_safedoor_office2a"
},
ice = {
interiorId = 240129,
ipl = "ex_dt1_11_office_03a",
safe = "ex_prop_safedoor_office3a"
},
conservative = {
interiorId = 240385,
ipl = "ex_dt1_11_office_03b",
safe = "ex_prop_safedoor_office3a"
},
polished = {
interiorId = 240641,
ipl = "ex_dt1_11_office_03c",
safe = "ex_prop_safedoor_office3c"
}
},
Set = function(style, refresh)
if refresh == nil then
refresh = false
end
if type(style) == "table" then
FinanceOffice2.Style.Clear()
FinanceOffice2.currentInteriorId = style.interiorId
FinanceOffice2.currentSafeDoors = {
hashL = GetHashKey(style.safe .. "_l"),
hashR = GetHashKey(style.safe .. "_r")
}
EnableIpl(style.ipl, true)
if refresh then
RefreshInterior(style.interiorId)
end
end
end,
Clear = function()
for themeKey, themeValue in pairs(FinanceOffice2.Style.Theme) do
for swagKey, swagValue in pairs(FinanceOffice2.Swag) do
if type(swagValue) == "table" then
SetIplPropState(themeValue.interiorId, {
swagValue.A,
swagValue.B,
swagValue.C
}, false)
end
end
SetIplPropState(themeValue.interiorId, "office_chairs", false, false)
SetIplPropState(themeValue.interiorId, "office_booze", false, true)
FinanceOffice2.currentSafeDoors = {
hashL = 0,
hashR = 0
}
EnableIpl(themeValue.ipl, false)
end
end
},
Safe = {
doorHeadingL = 250.0, -- Only need the heading of the Left door to get the Right ones
Position = vector3(-82.593, -801.0, 243.385), -- Approximately between the two doors
-- These values are checked from "doorHandler.lua" and
isLeftDoorOpen = false,
isRightDoorOpen = false,
-- Safe door API
Open = function(doorSide)
if doorSide:lower() == "left" then
FinanceOffice2.Safe.isLeftDoorOpen = true
elseif doorSide:lower() == "right" then
FinanceOffice2.Safe.isRightDoorOpen = true
else
print("[bob74_ipl] Warning: " .. doorSide .. " is not a correct value. Valid values are: left right")
end
end,
Close = function(doorSide)
if doorSide:lower() == "left" then
FinanceOffice2.Safe.isLeftDoorOpen = false
elseif doorSide:lower() == "right" then
FinanceOffice2.Safe.isRightDoorOpen = false
else
print("[bob74_ipl] Warning: " .. doorSide .. " is not a correct value. Valid values are: left right")
end
end,
-- Internal use only
SetDoorState = function(doorSide, open)
local doorHandle = 0
local heading = FinanceOffice2.Safe.doorHeadingL
if doorSide:lower() == "left" then
doorHandle = FinanceOffice2.Safe.GetDoorHandle(FinanceOffice2.currentSafeDoors.hashL)
if open then
heading = heading - 90.0
end
elseif doorSide:lower() == "right" then
doorHandle = FinanceOffice2.Safe.GetDoorHandle(FinanceOffice2.currentSafeDoors.hashR)
heading = heading - 180
if open then
heading = heading + 90.0
end
end
if doorHandle == 0 then
print("[bob74_ipl] Warning: " .. doorSide .. " safe door handle is 0")
return
end
SetEntityHeading(doorHandle, heading)
end,
-- /!\ handle changes whenever the interior is refreshed /!\
GetDoorHandle = function(doorHash)
local timeout = 4
local doorHandle = GetClosestObjectOfType(FinanceOffice2.Safe.Position.x, FinanceOffice2.Safe.Position.y, FinanceOffice2.Safe.Position.z, 5.0, doorHash, false, false, false)
while doorHandle == 0 do
Wait(25)
doorHandle = GetClosestObjectOfType(FinanceOffice2.Safe.Position.x, FinanceOffice2.Safe.Position.y, FinanceOffice2.Safe.Position.z, 5.0, doorHash, false, false, false)
timeout = timeout - 1
if timeout <= 0 then
break
end
end
return doorHandle
end
},
Swag = {
Cash = {
A = "cash_set_01",
B = "cash_set_02",
C = "cash_set_03",
D = "cash_set_04",
E = "cash_set_05",
F = "cash_set_06",
G = "cash_set_07",
H = "cash_set_08",
I = "cash_set_09",
J = "cash_set_10",
K = "cash_set_11",
L = "cash_set_12",
M = "cash_set_13",
N = "cash_set_14",
O = "cash_set_15",
P = "cash_set_16",
Q = "cash_set_17",
R = "cash_set_18",
S = "cash_set_19",
T = "cash_set_20",
U = "cash_set_21",
V = "cash_set_22",
W = "cash_set_23",
X = "cash_set_24"
},
BoozeCigs = {
A = "swag_booze_cigs",
B = "swag_booze_cigs2",
C = "swag_booze_cigs3"
},
Counterfeit = {
A = "swag_counterfeit",
B = "swag_counterfeit2",
C = "swag_counterfeit3"
},
DrugBags = {
A = "swag_drugbags",
B = "swag_drugbags2",
C = "swag_drugbags3"
},
DrugStatue = {
A = "swag_drugstatue",
B = "swag_drugstatue2",
C = "swag_drugstatue3"
},
Electronic = {
A = "swag_electronic",
B = "swag_electronic2",
C = "swag_electronic3"
},
FurCoats = {
A = "swag_furcoats",
B = "swag_furcoats2",
C = "swag_furcoats3"
},
Gems = {
A = "swag_gems",
B = "swag_gems2",
C = "swag_gems3"
},
Guns = {
A = "swag_guns",
B = "swag_guns2",
C = "swag_guns3"
},
Ivory = {
A = "swag_ivory",
B = "swag_ivory2",
C = "swag_ivory3"
},
Jewel = {
A = "swag_jewelwatch",
B = "swag_jewelwatch2",
C = "swag_jewelwatch3"
},
Med = {
A = "swag_med",
B = "swag_med2",
C = "swag_med3"
},
Painting = {
A = "swag_art",
B = "swag_art2",
C = "swag_art3"
},
Pills = {
A = "swag_pills",
B = "swag_pills2",
C = "swag_pills3"
},
Silver = {
A = "swag_silver",
B = "swag_silver2",
C = "swag_silver3"
},
Enable = function(details, state, refresh)
SetIplPropState(FinanceOffice2.currentInteriorId, details, state, refresh)
end
},
Chairs = {
off = "",
on = "office_chairs",
Set = function(chairs, refresh)
FinanceOffice2.Chairs.Clear(false)
if chairs ~= nil then
SetIplPropState(FinanceOffice2.currentInteriorId, chairs, true, refresh)
else
if refresh then
RefreshInterior(FinanceOffice2.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(FinanceOffice2.currentInteriorId, FinanceOffice2.Chairs.on, false, refresh)
end
},
Booze = {
off = "",
on = "office_booze",
Set = function(booze, refresh)
FinanceOffice2.Booze.Clear(false)
if booze ~= nil then
SetIplPropState(FinanceOffice2.currentInteriorId, booze, true, refresh)
else
if refresh then
RefreshInterior(FinanceOffice2.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(FinanceOffice2.currentInteriorId, FinanceOffice2.Booze.on, false, refresh)
end
},
LoadDefault = function()
FinanceOffice2.Style.Set(FinanceOffice2.Style.Theme.warm)
FinanceOffice2.Chairs.Set(FinanceOffice2.Chairs.on, true)
end
}

View File

@ -0,0 +1,324 @@
-- Office 3: -1579.756, -565.0661, 108.523 (Lom Bank)
exports('GetFinanceOffice3Object', function()
return FinanceOffice3
end)
FinanceOffice3 = {
currentInteriorId = -1,
currentSafeDoors = {
hashL = "",
hashR = ""
},
Style = {
Theme = {
warm = {
interiorId = 240897,
ipl = "ex_sm_13_office_01a",
safe = "ex_prop_safedoor_office1a"
},
classical = {
interiorId = 241153,
ipl = "ex_sm_13_office_01b",
safe = "ex_prop_safedoor_office1b"
},
vintage = {
interiorId = 241409,
ipl = "ex_sm_13_office_01c",
safe = "ex_prop_safedoor_office1c"
},
contrast = {
interiorId = 241665,
ipl = "ex_sm_13_office_02a",
safe = "ex_prop_safedoor_office2a"
},
rich = {
interiorId = 241921,
ipl = "ex_sm_13_office_02b",
safe = "ex_prop_safedoor_office2a"
},
cool = {
interiorId = 242177,
ipl = "ex_sm_13_office_02c",
safe = "ex_prop_safedoor_office2a"
},
ice = {
interiorId = 242433,
ipl = "ex_sm_13_office_03a",
safe = "ex_prop_safedoor_office3a"
},
conservative = {
interiorId = 242689,
ipl = "ex_sm_13_office_03b",
safe = "ex_prop_safedoor_office3a"
},
polished = {
interiorId = 242945,
ipl = "ex_sm_13_office_03c",
safe = "ex_prop_safedoor_office3c"
}
},
Set = function(style, refresh)
if refresh == nil then
refresh = false
end
if type(style) == "table" then
FinanceOffice3.Style.Clear()
FinanceOffice3.currentInteriorId = style.interiorId
FinanceOffice3.currentSafeDoors = {
hashL = GetHashKey(style.safe .. "_l"),
hashR = GetHashKey(style.safe .. "_r")
}
EnableIpl(style.ipl, true)
if refresh then
RefreshInterior(style.interiorId)
end
end
end,
Clear = function()
for themeKey, themeValue in pairs(FinanceOffice3.Style.Theme) do
for swagKey, swagValue in pairs(FinanceOffice3.Swag) do
if type(swagValue) == "table" then
SetIplPropState(themeValue.interiorId, {
swagValue.A,
swagValue.B,
swagValue.C
}, false)
end
end
SetIplPropState(themeValue.interiorId, "office_chairs", false, false)
SetIplPropState(themeValue.interiorId, "office_booze", false, true)
FinanceOffice3.currentSafeDoors = {
hashL = 0,
hashR = 0
}
EnableIpl(themeValue.ipl, false)
end
end
},
Safe = {
doorHeadingL = 126.0, -- Only need the heading of the Left door to get the Right ones
Position = vector3(-1554.08, -573.7122, 108.5272), -- Approximately between the two doors
-- These values are checked from "doorHandler.lua" and
isLeftDoorOpen = false,
isRightDoorOpen = false,
-- Safe door API
Open = function(doorSide)
if doorSide:lower() == "left" then
FinanceOffice3.Safe.isLeftDoorOpen = true
elseif doorSide:lower() == "right" then
FinanceOffice3.Safe.isRightDoorOpen = true
else
print("[bob74_ipl] Warning: " .. doorSide .. " is not a correct value. Valid values are: left right")
end
end,
Close = function(doorSide)
if doorSide:lower() == "left" then
FinanceOffice3.Safe.isLeftDoorOpen = false
elseif doorSide:lower() == "right" then
FinanceOffice3.Safe.isRightDoorOpen = false
else
print("[bob74_ipl] Warning: " .. doorSide .. " is not a correct value. Valid values are: left right")
end
end,
-- Internal use only
SetDoorState = function(doorSide, open)
local doorHandle = 0
local heading = FinanceOffice3.Safe.doorHeadingL
if doorSide:lower() == "left" then
doorHandle = FinanceOffice3.Safe.GetDoorHandle(FinanceOffice3.currentSafeDoors.hashL)
if open then
heading = heading - 90.0
end
elseif doorSide:lower() == "right" then
doorHandle = FinanceOffice3.Safe.GetDoorHandle(FinanceOffice3.currentSafeDoors.hashR)
heading = heading - 180
if open then
heading = heading + 90.0
end
end
if doorHandle == 0 then
print("[bob74_ipl] Warning: " .. doorSide .. " safe door handle is 0")
return
end
SetEntityHeading(doorHandle, heading)
end,
-- /!\ handle changes whenever the interior is refreshed /!\
GetDoorHandle = function(doorHash)
local timeout = 4
local doorHandle = GetClosestObjectOfType(FinanceOffice3.Safe.Position.x, FinanceOffice3.Safe.Position.y, FinanceOffice3.Safe.Position.z, 5.0, doorHash, false, false, false)
while doorHandle == 0 do
Wait(25)
doorHandle = GetClosestObjectOfType(FinanceOffice3.Safe.Position.x, FinanceOffice3.Safe.Position.y, FinanceOffice3.Safe.Position.z, 5.0, doorHash, false, false, false)
timeout = timeout - 1
if timeout <= 0 then
break
end
end
return doorHandle
end
},
Swag = {
Cash = {
A = "cash_set_01",
B = "cash_set_02",
C = "cash_set_03",
D = "cash_set_04",
E = "cash_set_05",
F = "cash_set_06",
G = "cash_set_07",
H = "cash_set_08",
I = "cash_set_09",
J = "cash_set_10",
K = "cash_set_11",
L = "cash_set_12",
M = "cash_set_13",
N = "cash_set_14",
O = "cash_set_15",
P = "cash_set_16",
Q = "cash_set_17",
R = "cash_set_18",
S = "cash_set_19",
T = "cash_set_20",
U = "cash_set_21",
V = "cash_set_22",
W = "cash_set_23",
X = "cash_set_24"
},
BoozeCigs = {
A = "swag_booze_cigs",
B = "swag_booze_cigs2",
C = "swag_booze_cigs3"
},
Counterfeit = {
A = "swag_counterfeit",
B = "swag_counterfeit2",
C = "swag_counterfeit3"
},
DrugBags = {
A = "swag_drugbags",
B = "swag_drugbags2",
C = "swag_drugbags3"
},
DrugStatue = {
A = "swag_drugstatue",
B = "swag_drugstatue2",
C = "swag_drugstatue3"
},
Electronic = {
A = "swag_electronic",
B = "swag_electronic2",
C = "swag_electronic3"
},
FurCoats = {
A = "swag_furcoats",
B = "swag_furcoats2",
C = "swag_furcoats3"
},
Gems = {
A = "swag_gems",
B = "swag_gems2",
C = "swag_gems3"
},
Guns = {
A = "swag_guns",
B = "swag_guns2",
C = "swag_guns3"
},
Ivory = {
A = "swag_ivory",
B = "swag_ivory2",
C = "swag_ivory3"
},
Jewel = {
A = "swag_jewelwatch",
B = "swag_jewelwatch2",
C = "swag_jewelwatch3"
},
Med = {
A = "swag_med",
B = "swag_med2",
C = "swag_med3"
},
Painting = {
A = "swag_art",
B = "swag_art2",
C = "swag_art3"
},
Pills = {
A = "swag_pills",
B = "swag_pills2",
C = "swag_pills3"
},
Silver = {
A = "swag_silver",
B = "swag_silver2",
C = "swag_silver3"
},
Enable = function(details, state, refresh)
SetIplPropState(FinanceOffice3.currentInteriorId, details, state, refresh)
end
},
Chairs = {
off = "",
on = "office_chairs",
Set = function(chairs, refresh)
FinanceOffice3.Chairs.Clear(false)
if chairs ~= nil then
SetIplPropState(FinanceOffice3.currentInteriorId, chairs, true, refresh)
else
if refresh then
RefreshInterior(FinanceOffice3.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(FinanceOffice3.currentInteriorId, FinanceOffice3.Chairs.on, false, refresh)
end
},
Booze = {
off = "",
on = "office_booze",
Set = function(booze, refresh)
FinanceOffice3.Booze.Clear(false)
if booze ~= nil then
SetIplPropState(FinanceOffice3.currentInteriorId, booze, true, refresh)
else
if refresh then
RefreshInterior(FinanceOffice3.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(FinanceOffice3.currentInteriorId, FinanceOffice3.Booze.on, false, refresh)
end
},
LoadDefault = function()
FinanceOffice3.Style.Set(FinanceOffice3.Style.Theme.conservative)
FinanceOffice3.Chairs.Set(FinanceOffice3.Chairs.on, true)
end
}

View File

@ -0,0 +1,324 @@
-- Office 4: -1392.667, -480.4736, 72.04217 (Maze Bank West)
exports('GetFinanceOffice4Object', function()
return FinanceOffice4
end)
FinanceOffice4 = {
currentInteriorId = -1,
currentSafeDoors = {
hashL = "",
hashR = ""
},
Style = {
Theme = {
warm = {
interiorId = 243201,
ipl = "ex_sm_15_office_01a",
safe = "ex_prop_safedoor_office1a"
},
classical = {
interiorId = 243457,
ipl = "ex_sm_15_office_01b",
safe = "ex_prop_safedoor_office1b"
},
vintage = {
interiorId = 243713,
ipl = "ex_sm_15_office_01c",
safe = "ex_prop_safedoor_office1c"
},
contrast = {
interiorId = 243969,
ipl = "ex_sm_15_office_02a",
safe = "ex_prop_safedoor_office2a"
},
rich = {
interiorId = 244225,
ipl = "ex_sm_15_office_02b",
safe = "ex_prop_safedoor_office2a"
},
cool = {
interiorId = 244481,
ipl = "ex_sm_15_office_02c",
safe = "ex_prop_safedoor_office2a"
},
ice = {
interiorId = 244737,
ipl = "ex_sm_15_office_03a",
safe = "ex_prop_safedoor_office3a"
},
conservative = {
interiorId = 244993,
ipl = "ex_sm_15_office_03b",
safe = "ex_prop_safedoor_office3a"
},
polished = {
interiorId = 245249,
ipl = "ex_sm_15_office_03c",
safe = "ex_prop_safedoor_office3c"
}
},
Set = function(style, refresh)
if refresh == nil then
refresh = false
end
if type(style) == "table" then
FinanceOffice4.Style.Clear()
FinanceOffice4.currentInteriorId = style.interiorId
FinanceOffice4.currentSafeDoors = {
hashL = GetHashKey(style.safe .. "_l"),
hashR = GetHashKey(style.safe .. "_r")
}
EnableIpl(style.ipl, true)
if refresh then
RefreshInterior(style.interiorId)
end
end
end,
Clear = function()
for themeKey, themeValue in pairs(FinanceOffice4.Style.Theme) do
for swagKey, swagValue in pairs(FinanceOffice4.Swag) do
if type(swagValue) == "table" then
SetIplPropState(themeValue.interiorId, {
swagValue.A,
swagValue.B,
swagValue.C
}, false)
end
end
SetIplPropState(themeValue.interiorId, "office_chairs", false, false)
SetIplPropState(themeValue.interiorId, "office_booze", false, true)
FinanceOffice4.currentSafeDoors = {
hashL = 0,
hashR = 0
}
EnableIpl(themeValue.ipl, false)
end
end
},
Safe = {
doorHeadingL = 188.0, -- Only need the heading of the Left door to get the Right ones
Position = vector3(-1372.905, -462.08, 72.05), -- Approximately between the two doors
-- These values are checked from "doorHandler.lua" and
isLeftDoorOpen = false,
isRightDoorOpen = false,
-- Safe door API
Open = function(doorSide)
if doorSide:lower() == "left" then
FinanceOffice4.Safe.isLeftDoorOpen = true
elseif doorSide:lower() == "right" then
FinanceOffice4.Safe.isRightDoorOpen = true
else
print("[bob74_ipl] Warning: " .. doorSide .. " is not a correct value. Valid values are: left right")
end
end,
Close = function(doorSide)
if doorSide:lower() == "left" then
FinanceOffice4.Safe.isLeftDoorOpen = false
elseif doorSide:lower() == "right" then
FinanceOffice4.Safe.isRightDoorOpen = false
else
print("[bob74_ipl] Warning: " .. doorSide .. " is not a correct value. Valid values are: left right")
end
end,
-- Internal use only
SetDoorState = function(doorSide, open)
local doorHandle = 0
local heading = FinanceOffice4.Safe.doorHeadingL
if doorSide:lower() == "left" then
doorHandle = FinanceOffice4.Safe.GetDoorHandle(FinanceOffice4.currentSafeDoors.hashL)
if open then
heading = heading - 90.0
end
elseif doorSide:lower() == "right" then
doorHandle = FinanceOffice4.Safe.GetDoorHandle(FinanceOffice4.currentSafeDoors.hashR)
heading = heading - 180
if open then
heading = heading + 90.0
end
end
if doorHandle == 0 then
print("[bob74_ipl] Warning: " .. doorSide .. " safe door handle is 0")
return
end
SetEntityHeading(doorHandle, heading)
end,
-- /!\ handle changes whenever the interior is refreshed /!\
GetDoorHandle = function(doorHash)
local timeout = 4
local doorHandle = GetClosestObjectOfType(FinanceOffice4.Safe.Position.x, FinanceOffice4.Safe.Position.y, FinanceOffice4.Safe.Position.z, 5.0, doorHash, false, false, false)
while doorHandle == 0 do
Wait(25)
doorHandle = GetClosestObjectOfType(FinanceOffice4.Safe.Position.x, FinanceOffice4.Safe.Position.y, FinanceOffice4.Safe.Position.z, 5.0, doorHash, false, false, false)
timeout = timeout - 1
if timeout <= 0 then
break
end
end
return doorHandle
end
},
Swag = {
Cash = {
A = "cash_set_01",
B = "cash_set_02",
C = "cash_set_03",
D = "cash_set_04",
E = "cash_set_05",
F = "cash_set_06",
G = "cash_set_07",
H = "cash_set_08",
I = "cash_set_09",
J = "cash_set_10",
K = "cash_set_11",
L = "cash_set_12",
M = "cash_set_13",
N = "cash_set_14",
O = "cash_set_15",
P = "cash_set_16",
Q = "cash_set_17",
R = "cash_set_18",
S = "cash_set_19",
T = "cash_set_20",
U = "cash_set_21",
V = "cash_set_22",
W = "cash_set_23",
X = "cash_set_24"
},
BoozeCigs = {
A = "swag_booze_cigs",
B = "swag_booze_cigs2",
C = "swag_booze_cigs3"
},
Counterfeit = {
A = "swag_counterfeit",
B = "swag_counterfeit2",
C = "swag_counterfeit3"
},
DrugBags = {
A = "swag_drugbags",
B = "swag_drugbags2",
C = "swag_drugbags3"
},
DrugStatue = {
A = "swag_drugstatue",
B = "swag_drugstatue2",
C = "swag_drugstatue3"
},
Electronic = {
A = "swag_electronic",
B = "swag_electronic2",
C = "swag_electronic3"
},
FurCoats = {
A = "swag_furcoats",
B = "swag_furcoats2",
C = "swag_furcoats3"
},
Gems = {
A = "swag_gems",
B = "swag_gems2",
C = "swag_gems3"
},
Guns = {
A = "swag_guns",
B = "swag_guns2",
C = "swag_guns3"
},
Ivory = {
A = "swag_ivory",
B = "swag_ivory2",
C = "swag_ivory3"
},
Jewel = {
A = "swag_jewelwatch",
B = "swag_jewelwatch2",
C = "swag_jewelwatch3"
},
Med = {
A = "swag_med",
B = "swag_med2",
C = "swag_med3"
},
Painting = {
A = "swag_art",
B = "swag_art2",
C = "swag_art3"
},
Pills = {
A = "swag_pills",
B = "swag_pills2",
C = "swag_pills3"
},
Silver = {
A = "swag_silver",
B = "swag_silver2",
C = "swag_silver3"
},
Enable = function(details, state, refresh)
SetIplPropState(FinanceOffice4.currentInteriorId, details, state, refresh)
end
},
Chairs = {
off = "",
on = "office_chairs",
Set = function(chairs, refresh)
FinanceOffice4.Chairs.Clear(false)
if chairs ~= nil then
SetIplPropState(FinanceOffice4.currentInteriorId, chairs, true, refresh)
else
if refresh then
RefreshInterior(FinanceOffice4.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(FinanceOffice4.currentInteriorId, FinanceOffice4.Chairs.on, false, refresh)
end
},
Booze = {
off = "",
on = "office_booze",
Set = function(booze, refresh)
FinanceOffice4.Booze.Clear(false)
if booze ~= nil then
SetIplPropState(FinanceOffice4.currentInteriorId, booze, true, refresh)
else
if refresh then
RefreshInterior(FinanceOffice4.currentInteriorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(FinanceOffice4.currentInteriorId, FinanceOffice4.Booze.on, false, refresh)
end
},
LoadDefault = function()
FinanceOffice4.Style.Set(FinanceOffice4.Style.Theme.cool)
FinanceOffice4.Chairs.Set(FinanceOffice4.Chairs.on, true)
end
}

View File

@ -0,0 +1,162 @@
exports('GetFinanceOrganizationObject', function()
return FinanceOrganization
end)
AddEventHandler('onClientResourceStop', function(res)
if GetCurrentResourceName() ~= res then
return
end
FinanceOrganization.Office.Clear()
end)
FinanceOrganization = {
Name = {
Colors = {
black = 0,
gray = 1,
yellow = 2,
blue = 3,
orange = 5,
red = 6,
green = 7
},
Fonts = {
font1 = 0,
font2 = 1,
font3 = 2,
font4 = 3,
font5 = 4,
font6 = 5,
font7 = 6,
font8 = 7,
font9 = 8,
font10 = 9,
font11 = 10,
font12 = 11,
font13 = 12
},
Style = {
normal = 3,
light = 1
},
name = "",
style = 0,
color = 0,
font = 0,
Set = function(name, style, color, font)
FinanceOrganization.Name.name = name
FinanceOrganization.Name.style = style
FinanceOrganization.Name.color = color
FinanceOrganization.Name.font = font
FinanceOrganization.Office.stage = 0
end
},
Office = {
needToLoad = false,
loaded = false,
target = "prop_ex_office_text",
prop = "ex_prop_ex_office_text",
renderId = -1,
movieId = -1,
stage = 0,
Init = function()
DrawEmptyRect(FinanceOrganization.Office.target, FinanceOrganization.Office.prop)
end,
Enable = function(state)
FinanceOrganization.Office.needToLoad = state
end,
Clear = function()
if IsNamedRendertargetRegistered(FinanceOrganization.Office.target) then
ReleaseNamedRendertarget(GetHashKey(FinanceOrganization.Office.target))
end
if HasScaleformMovieFilenameLoaded(FinanceOrganization.Office.movieId) then
SetScaleformMovieAsNoLongerNeeded(FinanceOrganization.Office.movieId)
end
FinanceOrganization.Office.renderId = -1
FinanceOrganization.Office.movieId = -1
FinanceOrganization.Office.stage = 0
end
}
}
CreateThread(function()
FinanceOrganization.Office.Init()
while true do
if FinanceOrganization.Office.needToLoad then
-- Need to load
if Global.FinanceOffices.isInsideOffice1 or Global.FinanceOffices.isInsideOffice2 or Global.FinanceOffices.isInsideOffice3 or Global.FinanceOffices.isInsideOffice4 then
DrawOrganizationName(FinanceOrganization.Name.name, FinanceOrganization.Name.style, FinanceOrganization.Name.color, FinanceOrganization.Name.font)
FinanceOrganization.Office.loaded = true
Wait(0) -- We need to call all this every frame
else
Wait(1000) -- We are not inside an office
end
elseif FinanceOrganization.Office.loaded then
-- Loaded and need to unload
FinanceOrganization.Office.Clear()
FinanceOrganization.Office.loaded = false
Wait(1000) -- We can wait longer when we don't need to display text
else
-- Not needed to load
Wait(1000) -- We can wait longer when we don't need to display text
end
end
end)
function DrawOrganizationName(name, style, color, font)
if FinanceOrganization.Office.stage == 0 then
if FinanceOrganization.Office.renderId == -1 then
FinanceOrganization.Office.renderId = CreateNamedRenderTargetForModel(FinanceOrganization.Office.target, FinanceOrganization.Office.prop)
end
if FinanceOrganization.Office.movieId == -1 then
FinanceOrganization.Office.movieId = RequestScaleformMovie("ORGANISATION_NAME")
end
FinanceOrganization.Office.stage = 1
elseif FinanceOrganization.Office.stage == 1 then
if HasScaleformMovieLoaded(FinanceOrganization.Office.movieId) then
local parameters = {
p0 = {
type = "string",
value = name
},
p1 = {
type = "int",
value = style
},
p2 = {
type = "int",
value = color
},
p3 = {
type = "int",
value = font
}
}
SetupScaleform(FinanceOrganization.Office.movieId, "SET_ORGANISATION_NAME", parameters)
FinanceOrganization.Office.stage = 2
else
FinanceOrganization.Office.movieId = RequestScaleformMovie("ORGANISATION_NAME")
end
elseif FinanceOrganization.Office.stage == 2 then
SetTextRenderId(FinanceOrganization.Office.renderId)
SetScriptGfxDrawOrder(4)
SetScriptGfxDrawBehindPausemenu(true)
SetScriptGfxAlign(73, 73)
DrawScaleformMovie(FinanceOrganization.Office.movieId, 0.196, 0.245, 0.46, 0.66, 255, 255, 255, 255, 0)
SetTextRenderId(GetDefaultScriptRendertargetRenderId())
ResetScriptGfxAlign()
end
end

View File

@ -0,0 +1,155 @@
exports('GetGunrunningBunkerObject', function()
return GunrunningBunker
end)
GunrunningBunker = {
interiorId = 258561,
Ipl = {
Interior = {
ipl = "gr_grdlc_interior_placement_interior_1_grdlc_int_02_milo_",
-- Load interiors IPLs.
Load = function()
EnableIpl(GunrunningBunker.Ipl.Interior.ipl, true)
end,
-- Remove interiors IPLs.
Remove = function()
EnableIpl(GunrunningBunker.Ipl.Interior.ipl, false)
end
},
Exterior = {
ipl = {
"gr_case0_bunkerclosed", -- Desert: 848.6175, 2996.567, 45.81612
"gr_case1_bunkerclosed",-- SmokeTree: 2126.785, 3335.04, 48.21422
"gr_case2_bunkerclosed", -- Scrapyard: 2493.654, 3140.399, 51.28789
"gr_case3_bunkerclosed", -- Oilfields: 481.0465, 2995.135, 43.96672
"gr_case4_bunkerclosed", -- RatonCanyon: -391.3216, 4363.728, 58.65862
"gr_case5_bunkerclosed", -- Grapeseed: 1823.961, 4708.14, 42.4991
"gr_case6_bunkerclosed", -- Farmhouse: 1570.372, 2254.549, 78.89397
"gr_case7_bunkerclosed", -- Paletto: -783.0755, 5934.686, 24.31475
"gr_case9_bunkerclosed", -- Route68: 24.43542, 2959.705, 58.35517
"gr_case10_bunkerclosed", -- Zancudo: -3058.714, 3329.19, 12.5844
"gr_case11_bunkerclosed" -- Great Ocean Highway: -3180.466, 1374.192, 19.9597
},
-- Load exteriors IPLs.
Load = function()
EnableIpl(GunrunningBunker.Ipl.Exterior.ipl, true)
end,
-- Remove exteriors IPLs.
Remove = function()
EnableIpl(GunrunningBunker.Ipl.Exterior.ipl, false)
end
}
},
Style = {
default = "Bunker_Style_A",
blue = "Bunker_Style_B",
yellow = "Bunker_Style_C",
-- Set the style (color) of the bunker.
-- style: Wall color (values: GunrunningBunker.Style.default / GunrunningBunker.Style.blue / GunrunningBunker.Style.yellow)
-- refresh: Reload the whole interior (values: true / false)
Set = function(style, refresh)
GunrunningBunker.Style.Clear(false)
SetIplPropState(GunrunningBunker.interiorId, style, true, refresh)
end,
-- Removes the style.
-- refresh: Reload the whole interior (values: true / false)
Clear = function(refresh)
SetIplPropState(GunrunningBunker.interiorId, {
GunrunningBunker.Style.default,
GunrunningBunker.Style.blue,
GunrunningBunker.Style.yellow
}, false, refresh)
end
},
Tier = {
default = "standard_bunker_set",
upgrade = "upgrade_bunker_set",
-- Set the tier (quality) of the bunker.
-- tier: Upgrade state (values: GunrunningBunker.Tier.default / GunrunningBunker.Tier.upgrade)
-- refresh: Reload the whole interior (values: true / false)
Set = function(tier, refresh)
GunrunningBunker.Tier.Clear(false)
SetIplPropState(GunrunningBunker.interiorId, tier, true, refresh)
end,
-- Removes the tier.
-- refresh: Reload the whole interior (values: true / false)
Clear = function(refresh)
SetIplPropState(GunrunningBunker.interiorId, {
GunrunningBunker.Tier.default,
GunrunningBunker.Tier.upgrade
}, false, refresh)
end
},
Security = {
noEntryGate = "",
default = "standard_security_set",
upgrade = "security_upgrade",
-- Set the security stage of the bunker.
-- security: Upgrade state (values: GunrunningBunker.Security.default / GunrunningBunker.Security.upgrade)
-- refresh: Reload the whole interior (values: true / false)
Set = function(security, refresh)
GunrunningBunker.Security.Clear(false)
if security ~= "" then
SetIplPropState(GunrunningBunker.interiorId, security, true, refresh)
else
if refresh then
RefreshInterior(GunrunningBunker.interiorId)
end
end
end,
-- Removes the security.
-- refresh: Reload the whole interior (values: true / false)
Clear = function(refresh)
SetIplPropState(GunrunningBunker.interiorId, {
GunrunningBunker.Security.default,
GunrunningBunker.Security.upgrade
}, false, refresh)
end
},
Details = {
office = "Office_Upgrade_set", -- Office interior
officeLocked = "Office_blocker_set", -- Metal door blocking access to the office
locker = "gun_locker_upgrade", -- Locker next to the office door
rangeLights = "gun_range_lights", -- Lights next to the shooting range
rangeWall = "gun_wall_blocker", -- Wall blocking access to the shooting range
rangeLocked = "gun_range_blocker_set", -- Metal door blocking access to the shooting range
schematics = "Gun_schematic_set", -- Gun schematic on the table and whiteboard
-- Enable or disable a detail.
-- details: Prop to enable or disable (values: GunrunningBunker.Details.office / GunrunningBunker.Details.officeLocked / GunrunningBunker.Details.locker...)
-- state: Enable or Disable (values: true / false)
-- refresh: Reload the whole interior (values: true / false)
Enable = function(details, state, refresh)
SetIplPropState(GunrunningBunker.interiorId, details, state, refresh)
end
},
LoadDefault = function()
GunrunningBunker.Ipl.Interior.Load()
GunrunningBunker.Ipl.Exterior.Load()
GunrunningBunker.Style.Set(GunrunningBunker.Style.default)
GunrunningBunker.Tier.Set(GunrunningBunker.Tier.default)
GunrunningBunker.Security.Set(GunrunningBunker.Security.default)
GunrunningBunker.Details.Enable(GunrunningBunker.Details.office, true)
GunrunningBunker.Details.Enable(GunrunningBunker.Details.officeLocked, false)
GunrunningBunker.Details.Enable(GunrunningBunker.Details.locker, true)
GunrunningBunker.Details.Enable(GunrunningBunker.Details.rangeLights, true)
GunrunningBunker.Details.Enable(GunrunningBunker.Details.rangeWall, false)
GunrunningBunker.Details.Enable(GunrunningBunker.Details.rangeLocked, false)
GunrunningBunker.Details.Enable(GunrunningBunker.Details.schematics, false)
-- Must be called in order to spawn or remove the props
RefreshInterior(GunrunningBunker.interiorId)
end
}

View File

@ -0,0 +1,57 @@
-- Gunrunning Yacht: -1363.724, 6734.108, 2.44598
exports('GetGunrunningYachtObject', function()
return GunrunningYacht
end)
GunrunningYacht = {
ipl = {
"gr_heist_yacht2",
"gr_heist_yacht2_bar",
"gr_heist_yacht2_bar_lod",
"gr_heist_yacht2_bedrm",
"gr_heist_yacht2_bedrm_lod",
"gr_heist_yacht2_bridge",
"gr_heist_yacht2_bridge_lod",
"gr_heist_yacht2_enginrm",
"gr_heist_yacht2_enginrm_lod",
"gr_heist_yacht2_lod",
"gr_heist_yacht2_lounge",
"gr_heist_yacht2_lounge_lod",
"gr_heist_yacht2_slod",
},
Enable = function(state)
EnableIpl(GunrunningYacht.ipl, state)
end,
Water = {
modelHash = `apa_mp_apa_yacht_jacuzzi_ripple1`,
Enable = function(state)
local handle = GetClosestObjectOfType(-1369.0, 6736.0, 5.40, 5.0, GunrunningYacht.Water.modelHash, false, false, false)
if state then
-- Enable
if handle == 0 then
RequestModel(GunrunningYacht.Water.modelHash)
while not HasModelLoaded(GunrunningYacht.Water.modelHash) do
Wait(0)
end
local water = CreateObjectNoOffset(GunrunningYacht.Water.modelHash, -1369.0, 6736.0, 5.40, false, false, false)
SetEntityAsMissionEntity(water, false, false)
end
else
-- Disable
if handle ~= 0 then
SetEntityAsMissionEntity(handle, false, false)
DeleteEntity(handle)
end
end
end
},
LoadDefault = function()
GunrunningYacht.Enable(true)
end
}

View File

@ -0,0 +1,28 @@
-- Heist Carrier: 3082.3117 -4717.1191 15.2622
exports('GetHeistCarrierObject', function()
return HeistCarrier
end)
HeistCarrier = {
ipl = {
"hei_carrier",
"hei_carrier_int1",
"hei_carrier_int1_lod",
"hei_carrier_int2",
"hei_carrier_int2_lod",
"hei_carrier_int3",
"hei_carrier_int3_lod",
"hei_carrier_int4",
"hei_carrier_int4_lod",
"hei_carrier_int5",
"hei_carrier_int5_lod",
"hei_carrier_int6",
"hei_carrier_int6_lod",
"hei_carrier_lod",
"hei_carrier_slod"
},
Enable = function(state)
EnableIpl(HeistCarrier.ipl, state)
end
}

View File

@ -0,0 +1,57 @@
-- Heist Yatch: -2043.974,-1031.582, 11.981
exports('GetHeistYachtObject', function()
return HeistYacht
end)
HeistYacht = {
ipl = {
"hei_yacht_heist",
"hei_yacht_heist_bar",
"hei_yacht_heist_bar_lod",
"hei_yacht_heist_bedrm",
"hei_yacht_heist_bedrm_lod",
"hei_yacht_heist_bridge",
"hei_yacht_heist_bridge_lod",
"hei_yacht_heist_enginrm",
"hei_yacht_heist_enginrm_lod",
"hei_yacht_heist_lod",
"hei_yacht_heist_lounge",
"hei_yacht_heist_lounge_lod",
"hei_yacht_heist_slod"
},
Enable = function(state)
EnableIpl(HeistYacht.ipl, state)
end,
Water = {
modelHash = `apa_mp_apa_yacht_jacuzzi_ripple1`,
Enable = function(state)
local handle = GetClosestObjectOfType(-2023.773, -1038.0, 5.40, 5.0, HeistYacht.Water.modelHash, false, false, false)
if state then
-- Enable
if handle == 0 then
RequestModel(HeistYacht.Water.modelHash)
while not HasModelLoaded(HeistYacht.Water.modelHash) do
Wait(0)
end
local water = CreateObjectNoOffset(HeistYacht.Water.modelHash, -2023.773, -1038.0, 5.40, false, false, false)
SetEntityAsMissionEntity(water, false, false)
end
else
-- Disable
if handle ~= 0 then
SetEntityAsMissionEntity(handle, false, false)
DeleteEntity(handle)
end
end
end
},
LoadDefault = function()
HeistYacht.Enable(true)
end
}

View File

@ -0,0 +1,69 @@
-- Apartment 1: -1462.28100000, -539.62760000, 72.44434000
exports('GetHLApartment1Object', function()
return HLApartment1
end)
HLApartment1 = {
interiorId = 145921,
Ipl = {
Interior = {
ipl = "mpbusiness_int_placement_interior_v_mp_apt_h_01_milo_",
Load = function()
EnableIpl(HLApartment1.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(HLApartment1.Ipl.Interior.ipl, false)
end
}
},
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment1.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment1.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment1.interiorId, details, state, refresh)
end
},
LoadDefault = function()
HLApartment1.Ipl.Interior.Load()
HLApartment1.Strip.Enable({
HLApartment1.Strip.A,
HLApartment1.Strip.B,
HLApartment1.Strip.C
}, false)
HLApartment1.Booze.Enable({
HLApartment1.Booze.A,
HLApartment1.Booze.B,
HLApartment1.Booze.C
}, false)
HLApartment1.Smoke.Enable({
HLApartment1.Smoke.A,
HLApartment1.Smoke.B,
HLApartment1.Smoke.C
}, false)
RefreshInterior(HLApartment1.interiorId)
end
}

View File

@ -0,0 +1,69 @@
-- Apartment 2: -914.90260000, -374.87310000, 112.6748
exports('GetHLApartment2Object', function()
return HLApartment2
end)
HLApartment2 = {
interiorId = 146177,
Ipl = {
Interior = {
ipl = "mpbusiness_int_placement_interior_v_mp_apt_h_01_milo__1",
Load = function()
EnableIpl(HLApartment2.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(HLApartment2.Ipl.Interior.ipl, false)
end
},
},
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment2.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment2.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment2.interiorId, details, state, refresh)
end
},
LoadDefault = function()
HLApartment2.Ipl.Interior.Load()
HLApartment2.Strip.Enable({
HLApartment2.Strip.A,
HLApartment2.Strip.B,
HLApartment2.Strip.C
}, false)
HLApartment2.Booze.Enable({
HLApartment2.Booze.A,
HLApartment2.Booze.B,
HLApartment2.Booze.C
}, false)
HLApartment2.Smoke.Enable({
HLApartment2.Smoke.A,
HLApartment2.Smoke.B,
HLApartment2.Smoke.C
}, false)
RefreshInterior(HLApartment2.interiorId)
end
}

View File

@ -0,0 +1,69 @@
-- Apartment 3: -609.56690000, 51.28212000, 96.60023000
exports('GetHLApartment3Object', function()
return HLApartment3
end)
HLApartment3 = {
interiorId = 146689,
Ipl = {
Interior = {
ipl = "mpbusiness_int_placement_interior_v_mp_apt_h_01_milo__2",
Load = function()
EnableIpl(HLApartment3.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(HLApartment3.Ipl.Interior.ipl, false)
end
}
},
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment3.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment3.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment3.interiorId, details, state, refresh)
end
},
LoadDefault = function()
HLApartment3.Ipl.Interior.Load()
HLApartment3.Strip.Enable({
HLApartment3.Strip.A,
HLApartment3.Strip.B,
HLApartment3.Strip.C
}, false)
HLApartment3.Booze.Enable({
HLApartment3.Booze.A,
HLApartment3.Booze.B,
HLApartment3.Booze.C
}, false)
HLApartment3.Smoke.Enable({
HLApartment3.Smoke.A,
HLApartment3.Smoke.B,
HLApartment3.Smoke.C
}, false)
RefreshInterior(HLApartment3.interiorId)
end
}

View File

@ -0,0 +1,69 @@
-- Apartment 4: -778.50610000, 331.31600000, 210.39720
exports('GetHLApartment4Object', function()
return HLApartment4
end)
HLApartment4 = {
interiorId = 146945,
Ipl = {
Interior = {
ipl = "mpbusiness_int_placement_interior_v_mp_apt_h_01_milo__3",
Load = function()
EnableIpl(HLApartment4.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(HLApartment4.Ipl.Interior.ipl, false)
end
},
},
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment4.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment4.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment4.interiorId, details, state, refresh)
end
},
LoadDefault = function()
HLApartment4.Ipl.Interior.Load()
HLApartment4.Strip.Enable({
HLApartment4.Strip.A,
HLApartment4.Strip.B,
HLApartment4.Strip.C
}, false)
HLApartment4.Booze.Enable({
HLApartment4.Booze.A,
HLApartment4.Booze.B,
HLApartment4.Booze.C
}, false)
HLApartment4.Smoke.Enable({
HLApartment4.Smoke.A,
HLApartment4.Smoke.B,
HLApartment4.Smoke.C
}, false)
RefreshInterior(HLApartment4.interiorId)
end
}

View File

@ -0,0 +1,69 @@
-- Apartment 5: -22.61353000, -590.14320000, 78.430910
exports('GetHLApartment5Object', function()
return HLApartment5
end)
HLApartment5 = {
interiorId = 147201,
Ipl = {
Interior = {
ipl = "mpbusiness_int_placement_interior_v_mp_apt_h_01_milo__4",
Load = function()
EnableIpl(HLApartment5.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(HLApartment5.Ipl.Interior.ipl, false)
end
},
},
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment5.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment5.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment5.interiorId, details, state, refresh)
end
},
LoadDefault = function()
HLApartment5.Ipl.Interior.Load()
HLApartment5.Strip.Enable({
HLApartment5.Strip.A,
HLApartment5.Strip.B,
HLApartment5.Strip.C
}, false)
HLApartment5.Booze.Enable({
HLApartment5.Booze.A,
HLApartment5.Booze.B,
HLApartment5.Booze.C
}, false)
HLApartment5.Smoke.Enable({
HLApartment5.Smoke.A,
HLApartment5.Smoke.B,
HLApartment5.Smoke.C
}, false)
RefreshInterior(HLApartment5.interiorId)
end
}

View File

@ -0,0 +1,69 @@
-- Apartment 6: -609.56690000, 51.28212000, -183.98080
exports('GetHLApartment6Object', function()
return HLApartment6
end)
HLApartment6 = {
interiorId = 147457,
Ipl = {
Interior = {
ipl = "mpbusiness_int_placement_interior_v_mp_apt_h_01_milo__5",
Load = function()
EnableIpl(HLApartment6.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(HLApartment6.Ipl.Interior.ipl, false)
end
}
},
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment6.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment6.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(HLApartment6.interiorId, details, state, refresh)
end
},
LoadDefault = function()
HLApartment6.Ipl.Interior.Load()
HLApartment6.Strip.Enable({
HLApartment6.Strip.A,
HLApartment6.Strip.B,
HLApartment6.Strip.C
}, false)
HLApartment6.Booze.Enable({
HLApartment6.Booze.A,
HLApartment6.Booze.B,
HLApartment6.Booze.C
}, false)
HLApartment6.Smoke.Enable({
HLApartment6.Smoke.A,
HLApartment6.Smoke.B,
HLApartment6.Smoke.C
}, false)
RefreshInterior(HLApartment6.interiorId)
end
}

View File

@ -0,0 +1,202 @@
-- Garage 1: Arcadius Business Centre
exports('GetImportCEOGarage1Object', function()
return ImportCEOGarage1
end)
ImportCEOGarage1 = {
Part = {
Garage1 = { -- -191.0133, -579.1428, 135.0000
interiorId = 253441,
ipl = "imp_dt1_02_cargarage_a"
},
Garage2 = { -- -117.4989, -568.1132, 135.0000
interiorId = 253697,
ipl = "imp_dt1_02_cargarage_b"
},
Garage3 = { -- -136.0780, -630.1852, 135.0000
interiorId = 253953,
ipl = "imp_dt1_02_cargarage_c"
},
ModShop = { -- -146.6166, -596.6301, 166.0000
interiorId = 254209,
ipl = "imp_dt1_02_modgarage"
},
Load = function(part)
EnableIpl(part.ipl, true)
end,
Remove = function(part)
EnableIpl(part.ipl, false)
end,
Clear = function()
EnableIpl({
ImportCEOGarage1.Part.Garage1.ipl,
ImportCEOGarage1.Part.Garage2.ipl,
ImportCEOGarage1.Part.Garage3.ipl
}, false)
end,
},
Style = {
concrete = "garage_decor_01",
plain = "garage_decor_02",
marble = "garage_decor_03",
wooden = "garage_decor_04",
Set = function(part, style, refresh)
ImportCEOGarage1.Style.Clear(part)
SetIplPropState(part.interiorId, style, true, refresh)
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage1.Style.concrete,
ImportCEOGarage1.Style.plain,
ImportCEOGarage1.Style.marble,
ImportCEOGarage1.Style.wooden
}, false, true)
end
},
Numbering = {
none = "",
Level1 = {
style1 = "numbering_style01_n1",
style2 = "numbering_style02_n1",
style3 = "numbering_style03_n1",
style4 = "numbering_style04_n1",
style5 = "numbering_style05_n1",
style6 = "numbering_style06_n1",
style7 = "numbering_style07_n1",
style8 = "numbering_style08_n1",
style9 = "numbering_style09_n1"
},
Level2 = {
style1 = "numbering_style01_n2",
style2 = "numbering_style02_n2",
style3 = "numbering_style03_n2",
style4 = "numbering_style04_n2",
style5 = "numbering_style05_n2",
style6 = "numbering_style06_n2",
style7 = "numbering_style07_n2",
style8 = "numbering_style08_n2",
style9 = "numbering_style09_n2"
},
Level3 = {
style1 = "numbering_style01_n3",
style2 = "numbering_style02_n3",
style3 = "numbering_style03_n3",
style4 = "numbering_style04_n3",
style5 = "numbering_style05_n3",
style6 = "numbering_style06_n3",
style7 = "numbering_style07_n3",
style8 = "numbering_style08_n3",
style9 = "numbering_style09_n3"
},
Set = function(part, num, refresh)
ImportCEOGarage1.Numbering.Clear(part)
if num ~= nil then
SetIplPropState(part.interiorId, num, true, refresh)
else
if refresh then
RefreshInterior(part.interiorId)
end
end
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage1.Numbering.Level1,
ImportCEOGarage1.Numbering.Level2,
ImportCEOGarage1.Numbering.Level3
}, false, true)
end
},
Lighting = {
none = "",
style1 = "lighting_option01",
style2 = "lighting_option02",
style3 = "lighting_option03",
style4 = "lighting_option04",
style5 = "lighting_option05",
style6 = "lighting_option06",
style7 = "lighting_option07",
style8 = "lighting_option08",
style9 = "lighting_option09",
Set = function(part, light, refresh)
ImportCEOGarage1.Lighting.Clear(part)
if light ~= nil then
SetIplPropState(part.interiorId, light, true, refresh)
else
if refresh then
RefreshInterior(part.interiorId)
end
end
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage1.Lighting.style1, ImportCEOGarage1.Lighting.style2, ImportCEOGarage1.Lighting.style3,
ImportCEOGarage1.Lighting.style4, ImportCEOGarage1.Lighting.style5, ImportCEOGarage1.Lighting.style6,
ImportCEOGarage1.Lighting.style7, ImportCEOGarage1.Lighting.style8, ImportCEOGarage1.Lighting.style9
}, false, true)
end
},
ModShop = {
Floor = {
default = "",
city = "floor_vinyl_01",
seabed = "floor_vinyl_02",
aliens = "floor_vinyl_03",
clouds = "floor_vinyl_04",
money = "floor_vinyl_05",
zebra = "floor_vinyl_06",
blackWhite = "floor_vinyl_07",
barcode = "floor_vinyl_08",
paintbrushBW = "floor_vinyl_09",
grid = "floor_vinyl_10",
splashes = "floor_vinyl_11",
squares = "floor_vinyl_12",
mosaic = "floor_vinyl_13",
paintbrushColor = "floor_vinyl_14",
curvesColor = "floor_vinyl_15",
marbleBrown = "floor_vinyl_16",
marbleBlue = "floor_vinyl_17",
marbleBW = "floor_vinyl_18",
maze = "floor_vinyl_19",
Set = function(floor, refresh)
ImportCEOGarage1.ModShop.Floor.Clear()
if floor ~= nil then
SetIplPropState(ImportCEOGarage1.Part.ModShop.interiorId, floor, true, refresh)
else
if refresh then
RefreshInterior(ImportCEOGarage1.Part.ModShop.interiorId)
end
end
end,
Clear = function()
SetIplPropState(ImportCEOGarage1.Part.ModShop.interiorId, {
ImportCEOGarage1.ModShop.Floor.city, ImportCEOGarage1.ModShop.Floor.seabed, ImportCEOGarage1.ModShop.Floor.aliens,
ImportCEOGarage1.ModShop.Floor.clouds, ImportCEOGarage1.ModShop.Floor.money, ImportCEOGarage1.ModShop.Floor.zebra,
ImportCEOGarage1.ModShop.Floor.blackWhite, ImportCEOGarage1.ModShop.Floor.barcode, ImportCEOGarage1.ModShop.Floor.paintbrushBW,
ImportCEOGarage1.ModShop.Floor.grid, ImportCEOGarage1.ModShop.Floor.splashes, ImportCEOGarage1.ModShop.Floor.squares,
ImportCEOGarage1.ModShop.Floor.mosaic, ImportCEOGarage1.ModShop.Floor.paintbrushColor, ImportCEOGarage1.ModShop.Floor.curvesColor,
ImportCEOGarage1.ModShop.Floor.marbleBrown, ImportCEOGarage1.ModShop.Floor.marbleBlue, ImportCEOGarage1.ModShop.Floor.marbleBW,
ImportCEOGarage1.ModShop.Floor.maze
}, false, true)
end
}
},
LoadDefault = function()
ImportCEOGarage1.Part.Load(ImportCEOGarage1.Part.Garage1)
ImportCEOGarage1.Style.Set(ImportCEOGarage1.Part.Garage1, ImportCEOGarage1.Style.concrete)
ImportCEOGarage1.Numbering.Set(ImportCEOGarage1.Part.Garage1, ImportCEOGarage1.Numbering.Level1.style1)
ImportCEOGarage1.Lighting.Set(ImportCEOGarage1.Part.Garage1, ImportCEOGarage1.Lighting.style1, true)
ImportCEOGarage1.Part.Load(ImportCEOGarage1.Part.ModShop)
ImportCEOGarage1.ModShop.Floor.Set(ImportCEOGarage1.ModShop.Floor.default, true)
end
}

View File

@ -0,0 +1,201 @@
-- Garage 2: Maze Bank Building
exports('GetImportCEOGarage2Object', function()
return ImportCEOGarage2
end)
ImportCEOGarage2 = {
Part = {
Garage1 = { -- -84.2193, -823.0851, 221.0000
interiorId = 254465,
ipl = "imp_dt1_11_cargarage_a"
},
Garage2 = { -- -69.8627, -824.7498, 221.0000
interiorId = 254721,
ipl = "imp_dt1_11_cargarage_b"
},
Garage3 = { -- -80.4318, -813.2536, 221.0000
interiorId = 254977,
ipl = "imp_dt1_11_cargarage_c"
},
ModShop = { -- -73.9039, -821.6204, 284.0000
interiorId = 255233,
ipl = "imp_dt1_11_modgarage"
},
Load = function(part)
EnableIpl(part.ipl, true)
end,
Remove = function(part)
EnableIpl(part.ipl, false)
end,
Clear = function()
EnableIpl({
ImportCEOGarage2.Part.Garage1.ipl,
ImportCEOGarage2.Part.Garage2.ipl,
ImportCEOGarage2.Part.Garage3.ipl
}, false)
end,
},
Style = {
concrete = "garage_decor_01",
plain = "garage_decor_02",
marble = "garage_decor_03",
wooden = "garage_decor_04",
Set = function(part, style, refresh)
ImportCEOGarage2.Style.Clear(part)
SetIplPropState(part.interiorId, style, true, refresh)
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage2.Style.concrete,
ImportCEOGarage2.Style.plain,
ImportCEOGarage2.Style.marble,
ImportCEOGarage2.Style.wooden
}, false, true)
end
},
Numbering = {
none = "",
Level1 = {
style1 = "numbering_style01_n1",
style2 = "numbering_style02_n1",
style3 = "numbering_style03_n1",
style4 = "numbering_style04_n1",
style5 = "numbering_style05_n1",
style6 = "numbering_style06_n1",
style7 = "numbering_style07_n1",
style8 = "numbering_style08_n1",
style9 = "numbering_style09_n1"
},
Level2 = {
style1 = "numbering_style01_n2",
style2 = "numbering_style02_n2",
style3 = "numbering_style03_n2",
style4 = "numbering_style04_n2",
style5 = "numbering_style05_n2",
style6 = "numbering_style06_n2",
style7 = "numbering_style07_n2",
style8 = "numbering_style08_n2",
style9 = "numbering_style09_n2"
},
Level3 = {
style1 = "numbering_style01_n3",
style2 = "numbering_style02_n3",
style3 = "numbering_style03_n3",
style4 = "numbering_style04_n3",
style5 = "numbering_style05_n3",
style6 = "numbering_style06_n3",
style7 = "numbering_style07_n3",
style8 = "numbering_style08_n3",
style9 = "numbering_style09_n3"
},
Set = function(part, num, refresh)
ImportCEOGarage2.Numbering.Clear(part)
if num ~= nil then
SetIplPropState(part.interiorId, num, true, refresh)
else
if refresh then
RefreshInterior(part.interiorId)
end
end
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage2.Numbering.Level1,
ImportCEOGarage2.Numbering.Level2,
ImportCEOGarage2.Numbering.Level3
}, false, true)
end
},
Lighting = {
none = "",
style1 = "lighting_option01",
style2 = "lighting_option02",
style3 = "lighting_option03",
style4 = "lighting_option04",
style5 = "lighting_option05",
style6 = "lighting_option06",
style7 = "lighting_option07",
style8 = "lighting_option08",
style9 = "lighting_option09",
Set = function(part, light, refresh)
ImportCEOGarage2.Lighting.Clear(part)
if light ~= nil then
SetIplPropState(part.interiorId, light, true, refresh)
else
if refresh then
RefreshInterior(part.interiorId)
end
end
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage2.Lighting.style1, ImportCEOGarage2.Lighting.style2, ImportCEOGarage2.Lighting.style3,
ImportCEOGarage2.Lighting.style4, ImportCEOGarage2.Lighting.style5, ImportCEOGarage2.Lighting.style6,
ImportCEOGarage2.Lighting.style7, ImportCEOGarage2.Lighting.style8, ImportCEOGarage2.Lighting.style9
}, false, true)
end
},
ModShop = {
Floor = {
default = "",
city = "floor_vinyl_01",
seabed = "floor_vinyl_02",
aliens = "floor_vinyl_03",
clouds = "floor_vinyl_04",
money = "floor_vinyl_05",
zebra = "floor_vinyl_06",
blackWhite = "floor_vinyl_07",
barcode = "floor_vinyl_08",
paintbrushBW = "floor_vinyl_09",
grid = "floor_vinyl_10",
splashes = "floor_vinyl_11",
squares = "floor_vinyl_12",
mosaic = "floor_vinyl_13",
paintbrushColor = "floor_vinyl_14",
curvesColor = "floor_vinyl_15",
marbleBrown = "floor_vinyl_16",
marbleBlue = "floor_vinyl_17",
marbleBW = "floor_vinyl_18",
maze = "floor_vinyl_19",
Set = function(floor, refresh)
ImportCEOGarage2.ModShop.Floor.Clear()
if floor ~= nil then
SetIplPropState(ImportCEOGarage2.Part.ModShop.interiorId, floor, true, refresh)
else
if refresh then
RefreshInterior(ImportCEOGarage2.Part.ModShop.interiorId)
end
end
end,
Clear = function()
SetIplPropState(ImportCEOGarage2.Part.ModShop.interiorId, {
ImportCEOGarage2.ModShop.Floor.city, ImportCEOGarage2.ModShop.Floor.seabed, ImportCEOGarage2.ModShop.Floor.aliens,
ImportCEOGarage2.ModShop.Floor.clouds, ImportCEOGarage2.ModShop.Floor.money, ImportCEOGarage2.ModShop.Floor.zebra,
ImportCEOGarage2.ModShop.Floor.blackWhite, ImportCEOGarage2.ModShop.Floor.barcode, ImportCEOGarage2.ModShop.Floor.paintbrushBW,
ImportCEOGarage2.ModShop.Floor.grid, ImportCEOGarage2.ModShop.Floor.splashes, ImportCEOGarage2.ModShop.Floor.squares,
ImportCEOGarage2.ModShop.Floor.mosaic, ImportCEOGarage2.ModShop.Floor.paintbrushColor, ImportCEOGarage2.ModShop.Floor.curvesColor,
ImportCEOGarage2.ModShop.Floor.marbleBrown, ImportCEOGarage2.ModShop.Floor.marbleBlue, ImportCEOGarage2.ModShop.Floor.marbleBW,
ImportCEOGarage2.ModShop.Floor.maze
}, false, true)
end
}
},
LoadDefault = function()
ImportCEOGarage2.Part.Load(ImportCEOGarage2.Part.Garage1)
ImportCEOGarage2.Style.Set(ImportCEOGarage2.Part.Garage1, ImportCEOGarage2.Style.concrete, false)
ImportCEOGarage2.Numbering.Set(ImportCEOGarage2.Part.Garage1, ImportCEOGarage2.Numbering.Level1.style1, false)
ImportCEOGarage2.Lighting.Set(ImportCEOGarage2.Part.Garage1, ImportCEOGarage2.Lighting.style1, true)
ImportCEOGarage2.Part.Load(ImportCEOGarage2.Part.ModShop)
ImportCEOGarage2.ModShop.Floor.Set(ImportCEOGarage2.ModShop.Floor.default, true)
end
}

View File

@ -0,0 +1,201 @@
-- Garage 3: Lom Bank
exports('GetImportCEOGarage3Object', function()
return ImportCEOGarage3
end)
ImportCEOGarage3 = {
Part = {
Garage1 = { -- -1581.1120, -567.2450, 85.5000
interiorId = 255489,
ipl = "imp_sm_13_cargarage_a"
},
Garage2 = { -- -1568.7390, -562.0455, 85.5000
interiorId = 255745,
ipl = "imp_sm_13_cargarage_b"
},
Garage3 = { -- -1563.5570, -574.4314, 85.5000
interiorId = 256001,
ipl = "imp_sm_13_cargarage_c"
},
ModShop = { -- -1578.0230, -576.4251, 104.2000
interiorId = 256257,
ipl = "imp_sm_13_modgarage"
},
Load = function(part)
EnableIpl(part.ipl, true)
end,
Remove = function(part)
EnableIpl(part.ipl, false)
end,
Clear = function()
EnableIpl({
ImportCEOGarage3.Part.Garage1.ipl,
ImportCEOGarage3.Part.Garage2.ipl,
ImportCEOGarage3.Part.Garage3.ipl
}, false)
end,
},
Style = {
concrete = "garage_decor_01",
plain = "garage_decor_02",
marble = "garage_decor_03",
wooden = "garage_decor_04",
Set = function(part, style, refresh)
ImportCEOGarage3.Style.Clear(part)
SetIplPropState(part.interiorId, style, true, refresh)
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage3.Style.concrete,
ImportCEOGarage3.Style.plain,
ImportCEOGarage3.Style.marble,
ImportCEOGarage3.Style.wooden
}, false, true)
end
},
Numbering = {
none = "",
Level1 = {
style1 = "numbering_style01_n1",
style2 = "numbering_style02_n1",
style3 = "numbering_style03_n1",
style4 = "numbering_style04_n1",
style5 = "numbering_style05_n1",
style6 = "numbering_style06_n1",
style7 = "numbering_style07_n1",
style8 = "numbering_style08_n1",
style9 = "numbering_style09_n1"
},
Level2 = {
style1 = "numbering_style01_n2",
style2 = "numbering_style02_n2",
style3 = "numbering_style03_n2",
style4 = "numbering_style04_n2",
style5 = "numbering_style05_n2",
style6 = "numbering_style06_n2",
style7 = "numbering_style07_n2",
style8 = "numbering_style08_n2",
style9 = "numbering_style09_n2"
},
Level3 = {
style1 = "numbering_style01_n3",
style2 = "numbering_style02_n3",
style3 = "numbering_style03_n3",
style4 = "numbering_style04_n3",
style5 = "numbering_style05_n3",
style6 = "numbering_style06_n3",
style7 = "numbering_style07_n3",
style8 = "numbering_style08_n3",
style9 = "numbering_style09_n3"
},
Set = function(part, num, refresh)
ImportCEOGarage3.Numbering.Clear(part)
if num ~= nil then
SetIplPropState(part.interiorId, num, true, refresh)
else
if refresh then
RefreshInterior(part.interiorId)
end
end
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage3.Numbering.Level1,
ImportCEOGarage3.Numbering.Level2,
ImportCEOGarage3.Numbering.Level3
}, false, true)
end
},
Lighting = {
none = "",
style1 = "lighting_option01",
style2 = "lighting_option02",
style3 = "lighting_option03",
style4 = "lighting_option04",
style5 = "lighting_option05",
style6 = "lighting_option06",
style7 = "lighting_option07",
style8 = "lighting_option08",
style9 = "lighting_option09",
Set = function(part, light, refresh)
ImportCEOGarage3.Lighting.Clear(part)
if light ~= nil then
SetIplPropState(part.interiorId, light, true, refresh)
else
if refresh then
RefreshInterior(part.interiorId)
end
end
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage3.Lighting.style1, ImportCEOGarage3.Lighting.style2, ImportCEOGarage3.Lighting.style3,
ImportCEOGarage3.Lighting.style4, ImportCEOGarage3.Lighting.style5, ImportCEOGarage3.Lighting.style6,
ImportCEOGarage3.Lighting.style7, ImportCEOGarage3.Lighting.style8, ImportCEOGarage3.Lighting.style9
}, false, true)
end
},
ModShop = {
Floor = {
default = "",
city = "floor_vinyl_01",
seabed = "floor_vinyl_02",
aliens = "floor_vinyl_03",
clouds = "floor_vinyl_04",
money = "floor_vinyl_05",
zebra = "floor_vinyl_06",
blackWhite = "floor_vinyl_07",
barcode = "floor_vinyl_08",
paintbrushBW = "floor_vinyl_09",
grid = "floor_vinyl_10",
splashes = "floor_vinyl_11",
squares = "floor_vinyl_12",
mosaic = "floor_vinyl_13",
paintbrushColor = "floor_vinyl_14",
curvesColor = "floor_vinyl_15",
marbleBrown = "floor_vinyl_16",
marbleBlue = "floor_vinyl_17",
marbleBW = "floor_vinyl_18",
maze = "floor_vinyl_19",
Set = function(floor, refresh)
ImportCEOGarage3.ModShop.Floor.Clear()
if floor ~= nil then
SetIplPropState(ImportCEOGarage3.Part.ModShop.interiorId, floor, true, refresh)
else
if refresh then
RefreshInterior(ImportCEOGarage3.Part.ModShop.interiorId)
end
end
end,
Clear = function()
SetIplPropState(ImportCEOGarage3.Part.ModShop.interiorId, {
ImportCEOGarage3.ModShop.Floor.city, ImportCEOGarage3.ModShop.Floor.seabed, ImportCEOGarage3.ModShop.Floor.aliens,
ImportCEOGarage3.ModShop.Floor.clouds, ImportCEOGarage3.ModShop.Floor.money, ImportCEOGarage3.ModShop.Floor.zebra,
ImportCEOGarage3.ModShop.Floor.blackWhite, ImportCEOGarage3.ModShop.Floor.barcode, ImportCEOGarage3.ModShop.Floor.paintbrushBW,
ImportCEOGarage3.ModShop.Floor.grid, ImportCEOGarage3.ModShop.Floor.splashes, ImportCEOGarage3.ModShop.Floor.squares,
ImportCEOGarage3.ModShop.Floor.mosaic, ImportCEOGarage3.ModShop.Floor.paintbrushColor, ImportCEOGarage3.ModShop.Floor.curvesColor,
ImportCEOGarage3.ModShop.Floor.marbleBrown, ImportCEOGarage3.ModShop.Floor.marbleBlue, ImportCEOGarage3.ModShop.Floor.marbleBW,
ImportCEOGarage3.ModShop.Floor.maze
}, false, true)
end
}
},
LoadDefault = function()
ImportCEOGarage3.Part.Load(ImportCEOGarage3.Part.Garage1)
ImportCEOGarage3.Style.Set(ImportCEOGarage3.Part.Garage1, ImportCEOGarage3.Style.concrete, false)
ImportCEOGarage3.Numbering.Set(ImportCEOGarage3.Part.Garage1, ImportCEOGarage3.Numbering.Level1.style1, false)
ImportCEOGarage3.Lighting.Set(ImportCEOGarage3.Part.Garage1, ImportCEOGarage3.Lighting.style1, true)
-- No mod shop since it overlapses CEO office
ImportCEOGarage3.Part.Remove(ImportCEOGarage3.Part.ModShop)
end
}

View File

@ -0,0 +1,204 @@
-- Garage 4: Maze Bank West
-- Be careful, ImportCEOGarage4.Part.Garage1 and ImportCEOGarage4.Part.Garage3 overlaps with FinanceOffice4
exports('GetImportCEOGarage4Object', function()
return ImportCEOGarage4
end)
ImportCEOGarage4 = {
Part = {
Garage1 = { -- -1388.8400, -478.7402, 56.1000
interiorId = 256513,
ipl = "imp_sm_15_cargarage_a"
},
Garage2 = { -- -1388.8600, -478.7574, 48.1000
interiorId = 256769,
ipl = "imp_sm_15_cargarage_b"
},
Garage3 = { -- -1374.6820, -474.3586, 56.1000
interiorId = 257025,
ipl = "imp_sm_15_cargarage_c"
},
ModShop = { -- -1391.2450, -473.9638, 77.2000
interiorId = 257281,
ipl = "imp_sm_15_modgarage"
},
Load = function(part)
EnableIpl(part.ipl, true)
end,
Remove = function(part)
EnableIpl(part.ipl, false)
end,
Clear = function()
EnableIpl({
ImportCEOGarage4.Part.Garage1.ipl,
ImportCEOGarage4.Part.Garage2.ipl,
ImportCEOGarage4.Part.Garage3.ipl
}, false)
end
},
Style = {
concrete = "garage_decor_01",
plain = "garage_decor_02",
marble = "garage_decor_03",
wooden = "garage_decor_04",
Set = function(part, style, refresh)
ImportCEOGarage4.Style.Clear(part)
SetIplPropState(part.interiorId, style, true, refresh)
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage4.Style.concrete,
ImportCEOGarage4.Style.plain,
ImportCEOGarage4.Style.marble,
ImportCEOGarage4.Style.wooden
}, false, true)
end
},
Numbering = {
none = "",
Level1 = {
style1 = "numbering_style01_n1",
style2 = "numbering_style02_n1",
style3 = "numbering_style03_n1",
style4 = "numbering_style04_n1",
style5 = "numbering_style05_n1",
style6 = "numbering_style06_n1",
style7 = "numbering_style07_n1",
style8 = "numbering_style08_n1",
style9 = "numbering_style09_n1"
},
Level2 = {
style1 = "numbering_style01_n2",
style2 = "numbering_style02_n2",
style3 = "numbering_style03_n2",
style4 = "numbering_style04_n2",
style5 = "numbering_style05_n2",
style6 = "numbering_style06_n2",
style7 = "numbering_style07_n2",
style8 = "numbering_style08_n2",
style9 = "numbering_style09_n2"
},
Level3 = {
style1 = "numbering_style01_n3",
style2 = "numbering_style02_n3",
style3 = "numbering_style03_n3",
style4 = "numbering_style04_n3",
style5 = "numbering_style05_n3",
style6 = "numbering_style06_n3",
style7 = "numbering_style07_n3",
style8 = "numbering_style08_n3",
style9 = "numbering_style09_n3"
},
Set = function(part, num, refresh)
ImportCEOGarage4.Numbering.Clear(part)
if num ~= nil then
SetIplPropState(part.interiorId, num, true, refresh)
else
if refresh then
RefreshInterior(part.interiorId)
end
end
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage4.Numbering.Level1,
ImportCEOGarage4.Numbering.Level2,
ImportCEOGarage4.Numbering.Level3
}, false, true)
end
},
Lighting = {
none = "",
style1 = "lighting_option01",
style2 = "lighting_option02",
style3 = "lighting_option03",
style4 = "lighting_option04",
style5 = "lighting_option05",
style6 = "lighting_option06",
style7 = "lighting_option07",
style8 = "lighting_option08",
style9 = "lighting_option09",
Set = function(part, light, refresh)
ImportCEOGarage4.Lighting.Clear(part)
if light ~= nil then
SetIplPropState(part.interiorId, light, true, refresh)
else
if refresh then
RefreshInterior(part.interiorId)
end
end
end,
Clear = function(part)
SetIplPropState(part.interiorId, {
ImportCEOGarage4.Lighting.style1, ImportCEOGarage4.Lighting.style2, ImportCEOGarage4.Lighting.style3,
ImportCEOGarage4.Lighting.style4, ImportCEOGarage4.Lighting.style5, ImportCEOGarage4.Lighting.style6,
ImportCEOGarage4.Lighting.style7, ImportCEOGarage4.Lighting.style8, ImportCEOGarage4.Lighting.style9
}, false, true)
end
},
ModShop = {
Floor = {
default = "",
city = "floor_vinyl_01",
seabed = "floor_vinyl_02",
aliens = "floor_vinyl_03",
clouds = "floor_vinyl_04",
money = "floor_vinyl_05",
zebra = "floor_vinyl_06",
blackWhite = "floor_vinyl_07",
barcode = "floor_vinyl_08",
paintbrushBW = "floor_vinyl_09",
grid = "floor_vinyl_10",
splashes = "floor_vinyl_11",
squares = "floor_vinyl_12",
mosaic = "floor_vinyl_13",
paintbrushColor = "floor_vinyl_14",
curvesColor = "floor_vinyl_15",
marbleBrown = "floor_vinyl_16",
marbleBlue = "floor_vinyl_17",
marbleBW = "floor_vinyl_18",
maze = "floor_vinyl_19",
Set = function(floor, refresh)
ImportCEOGarage4.ModShop.Floor.Clear()
if floor ~= nil then
SetIplPropState(ImportCEOGarage4.Part.ModShop.interiorId, floor, true, refresh)
else
if refresh then
RefreshInterior(ImportCEOGarage4.Part.ModShop.interiorId)
end
end
end,
Clear = function()
SetIplPropState(ImportCEOGarage4.Part.ModShop.interiorId, {
ImportCEOGarage4.ModShop.Floor.city, ImportCEOGarage4.ModShop.Floor.seabed, ImportCEOGarage4.ModShop.Floor.aliens,
ImportCEOGarage4.ModShop.Floor.clouds, ImportCEOGarage4.ModShop.Floor.money, ImportCEOGarage4.ModShop.Floor.zebra,
ImportCEOGarage4.ModShop.Floor.blackWhite, ImportCEOGarage4.ModShop.Floor.barcode, ImportCEOGarage4.ModShop.Floor.paintbrushBW,
ImportCEOGarage4.ModShop.Floor.grid, ImportCEOGarage4.ModShop.Floor.splashes, ImportCEOGarage4.ModShop.Floor.squares,
ImportCEOGarage4.ModShop.Floor.mosaic, ImportCEOGarage4.ModShop.Floor.paintbrushColor, ImportCEOGarage4.ModShop.Floor.curvesColor,
ImportCEOGarage4.ModShop.Floor.marbleBrown, ImportCEOGarage4.ModShop.Floor.marbleBlue, ImportCEOGarage4.ModShop.Floor.marbleBW,
ImportCEOGarage4.ModShop.Floor.maze
}, false, true)
end
}
},
LoadDefault = function()
ImportCEOGarage4.Part.Load(ImportCEOGarage4.Part.Garage2)
ImportCEOGarage4.Style.Set(ImportCEOGarage4.Part.Garage2, ImportCEOGarage4.Style.concrete, false)
ImportCEOGarage4.Numbering.Set(ImportCEOGarage4.Part.Garage2, ImportCEOGarage4.Numbering.Level1.style1, false)
ImportCEOGarage4.Lighting.Set(ImportCEOGarage4.Part.Garage2, ImportCEOGarage4.Lighting.style1, true)
ImportCEOGarage4.Part.Load(ImportCEOGarage4.Part.ModShop)
ImportCEOGarage4.ModShop.Floor.Set(ImportCEOGarage4.ModShop.Floor.default, true)
end
}

View File

@ -0,0 +1,96 @@
-- Vehicle warehouse
-- Upper: 994.5925, -3002.594, -39.64699
-- Lower: 969.5376, -3000.411, -48.64689
exports('GetImportVehicleWarehouseObject', function()
return ImportVehicleWarehouse
end)
ImportVehicleWarehouse = {
Upper = {
interiorId = 252673,
Ipl = {
Interior = {
ipl = "imp_impexp_interior_placement_interior_1_impexp_intwaremed_milo_",
Load = function()
EnableIpl(ImportVehicleWarehouse.Upper.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(ImportVehicleWarehouse.Upper.Ipl.Interior.ipl, false)
end
}
},
Style = {
basic = "basic_style_set",
branded = "branded_style_set",
urban = "urban_style_set",
Set = function(style, refresh)
ImportVehicleWarehouse.Upper.Style.Clear(false)
SetIplPropState(ImportVehicleWarehouse.Upper.interiorId, style, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(ImportVehicleWarehouse.Upper.interiorId, {
ImportVehicleWarehouse.Upper.Style.basic,
ImportVehicleWarehouse.Upper.Style.branded,
ImportVehicleWarehouse.Upper.Style.urban
}, false, refresh)
end
},
Details = {
floorHatch = "car_floor_hatch",
doorBlocker = "door_blocker", -- Invisible wall
Enable = function(details, state, refresh)
SetIplPropState(ImportVehicleWarehouse.Upper.interiorId, details, state, refresh)
end
}
},
Lower = {
interiorId = 253185,
Ipl = {
Interior = {
ipl = "imp_impexp_interior_placement_interior_3_impexp_int_02_milo_",
Load = function()
EnableIpl(ImportVehicleWarehouse.Lower.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(ImportVehicleWarehouse.Lower.Ipl.Interior.ipl, false)
end
}
},
Details = {
Pumps = {
pump1 = "pump_01",
pump2 = "pump_02",
pump3 = "pump_03",
pump4 = "pump_04",
pump5 = "pump_05",
pump6 = "pump_06",
pump7 = "pump_07",
pump8 = "pump_08"
},
Enable = function(details, state, refresh)
SetIplPropState(ImportVehicleWarehouse.Lower.interiorId, details, state, refresh)
end
}
},
LoadDefault = function()
ImportVehicleWarehouse.Upper.Ipl.Interior.Load()
ImportVehicleWarehouse.Upper.Style.Set(ImportVehicleWarehouse.Upper.Style.branded)
ImportVehicleWarehouse.Upper.Details.Enable(ImportVehicleWarehouse.Upper.Details.floorHatch, true)
ImportVehicleWarehouse.Upper.Details.Enable(ImportVehicleWarehouse.Upper.Details.doorBlocker, false)
RefreshInterior(ImportVehicleWarehouse.Upper.interiorId)
ImportVehicleWarehouse.Lower.Ipl.Interior.Load()
ImportVehicleWarehouse.Lower.Details.Enable(ImportVehicleWarehouse.Lower.Details.Pumps, true)
RefreshInterior(ImportVehicleWarehouse.Lower.interiorId)
end
}

View File

@ -0,0 +1,44 @@
-- Vinewood Car Club: 1202.407, -3251.251, -50.000
exports('GetMercenariesClubObject', function()
return MercenariesClub
end)
MercenariesClub = {
interiorId = 291841,
Style = {
empty = "entity_set_no_plus", -- The lamps if the podium is not there
club = {
"entity_set_plus",
"entity_set_backdrop_frames",
"entity_set_signs"
},
Set = function(style, refresh)
MercenariesClub.Style.Clear(false)
SetIplPropState(MercenariesClub.interiorId, style, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(MercenariesClub.interiorId, {
MercenariesClub.Style.empty,
MercenariesClub.Style.club
}, false, refresh)
end
},
Stairs = {
stairs = "entity_set_stairs",
Enable = function(state, refresh)
SetIplPropState(MercenariesClub.interiorId, MercenariesClub.Stairs.stairs, state, refresh)
end
},
LoadDefault = function()
MercenariesClub.Style.Set(MercenariesClub.Style.club, false)
MercenariesClub.Stairs.Enable(true, false)
RefreshInterior(MercenariesClub.interiorId)
end
}

View File

@ -0,0 +1,16 @@
-- Map fixes
exports('GetMercenariesFixesObject', function()
return MercenariesFixes
end)
MercenariesFixes = {
ipl = "m23_1_legacy_fixes",
Enable = function(state)
EnableIpl(MercenariesFixes.ipl, state)
end,
LoadDefault = function()
MercenariesFixes.Enable(true)
end
}

View File

@ -0,0 +1,28 @@
-- Fort Zancudo Lab: -1916.119, 3749.719, -100.000
exports('GetMercenariesLabObject', function()
return MercenariesLab
end)
MercenariesLab = {
interiorId = 292097,
Details = {
levers = "entity_set_levers",
crates = "entity_set_crates",
weapons = "entity_set_weapons",
lights = "entity_set_lift_lights",
Enable = function(details, state, refresh)
SetIplPropState(MercenariesLab.interiorId, details, state, refresh)
end
},
LoadDefault = function()
MercenariesLab.Details.Enable(MercenariesLab.Details.levers, true, false)
MercenariesLab.Details.Enable(MercenariesLab.Details.crates, true, false)
MercenariesLab.Details.Enable(MercenariesLab.Details.weapons, true, false)
MercenariesLab.Details.Enable(MercenariesLab.Details.lights, true, false)
RefreshInterior(MercenariesLab.interiorId)
end
}

View File

@ -0,0 +1,24 @@
exports('GetMpSecurityBillboardsObject', function()
return MpSecurityBillboards
end)
MpSecurityBillboards = {
Ipl = {
Interior = {
ipl = {
'sf_billboards',
}
},
Load = function()
EnableIpl(MpSecurityBillboards.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(MpSecurityBillboards.Ipl.Interior.ipl, false)
end,
},
LoadDefault = function()
MpSecurityBillboards.Ipl.Load()
end
}

View File

@ -0,0 +1,73 @@
exports('GetMpSecurityGarageObject', function()
return MpSecurityGarage
end)
MpSecurityGarage = {
InteriorId = 286721,
Ipl = {
Interior = {
ipl = {
'sf_int_placement_sec_interior_2_dlc_garage_sec_milo_'
}
},
Load = function()
EnableIpl(MpSecurityGarage.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(MpSecurityGarage.Ipl.Interior.ipl, false)
end
},
Entities = {
Entity_Set_Workshop_Wall = false,
Entity_Set_Wallpaper_01 = false,
Entity_Set_Wallpaper_02 = false,
Entity_Set_Wallpaper_03 = false,
Entity_Set_Wallpaper_04 = false,
Entity_Set_Wallpaper_05 = false,
Entity_Set_Wallpaper_06 = false,
Entity_Set_Wallpaper_07 = true,
Entity_Set_Wallpaper_08 = false,
Entity_Set_Wallpaper_09 = false,
Entity_Set_Art_1 = false,
Entity_Set_Art_2 = false,
Entity_Set_Art_3 = false,
Entity_Set_Art_1_NoMod = false,
Entity_Set_Art_2_NoMod = false,
Entity_Set_Art_3_NoMod = false,
entity_set_tints = true,
Entity_Set_Workshop_Lights = true,
Set = function(name, state)
for entity, _ in pairs(MpSecurityGarage.Entities) do
if entity == name then
MpSecurityGarage.Entities[entity] = state
MpSecurityGarage.Entities.Clear()
MpSecurityGarage.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(MpSecurityGarage.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(MpSecurityGarage.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(MpSecurityGarage.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(MpSecurityGarage.InteriorId, entity)
end
end
end
},
LoadDefault = function()
MpSecurityGarage.Ipl.Load()
MpSecurityGarage.Entities.Load()
RefreshInterior(MpSecurityGarage.interiorId)
end
}

View File

@ -0,0 +1,24 @@
exports('GetMpSecurityMusicRoofTopObject', function()
return MpSecurityMusicRoofTop
end)
MpSecurityMusicRoofTop = {
Ipl = {
Interior = {
ipl = {
'sf_musicrooftop'
}
},
Load = function()
EnableIpl(MpSecurityMusicRoofTop.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(MpSecurityMusicRoofTop.Ipl.Interior.ipl, false)
end
},
LoadDefault = function()
MpSecurityMusicRoofTop.Ipl.Load()
end
}

View File

@ -0,0 +1,106 @@
exports('GetMpSecurityOffice1Object', function()
return MpSecurityOffice1
end)
MpSecurityOffice1 = {
InteriorId = 287489,
Ipl = {
Interior = {
ipl = {
'sf_fixeroffice_bh1_05'
}
},
Load = function()
EnableIpl(MpSecurityOffice1.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(MpSecurityOffice1.Ipl.Interior.ipl, false)
end
},
Entities = {
Entity_Set_Armoury = false,
Entity_Set_Standard_Office = true,
Entity_Set_Blocker = false,
Entity_Set_Wpaper_1 = false,
Entity_Set_Wpaper_3 = false,
Entity_Set_Wpaper_2 = false,
Entity_Set_Wpaper_4 = false,
Entity_Set_Wpaper_5 = false,
Entity_Set_Wpaper_6 = false,
Entity_Set_Wpaper_7 = false,
Entity_Set_Wpaper_8 = true,
Entity_Set_Wpaper_9 = false,
Entity_Set_Moving = true,
Entity_Set_Tint_AG = true,
Entity_Set_Spare_Seats = true,
Entity_Set_Player_Seats = true,
Entity_Set_Player_Desk = true,
Entity_Set_M_Golf_Intro = true,
Entity_Set_M_Setup = true,
Entity_Set_M_Nightclub = true,
Entity_Set_M_Yacht = true,
Entity_Set_M_Promoter = true,
Entity_Set_M_Limo_Photo = true,
Entity_Set_M_Limo_Wallet = true,
Entity_Set_M_The_Way = true,
Entity_Set_M_Billionaire = true,
Entity_Set_M_Families = true,
Entity_Set_M_Ballas = true,
Entity_Set_M_Hood = true,
Entity_Set_M_Fire_Booth = true,
Entity_Set_M_50 = true,
Entity_Set_M_Taxi = true,
Entity_Set_M_Gone_Golfing = true,
Entity_Set_M_Motel = true,
Entity_Set_M_Construction = true,
Entity_Set_M_Hit_List = true,
Entity_Set_M_Tuner = true,
Entity_Set_M_Attack = true,
Entity_Set_M_Vehicles = true,
Entity_Set_M_Trip_01 = true,
Entity_Set_M_Trip_02 = true,
Entity_Set_M_Trip_03 = true,
Entity_set_disc_01 = true,
Entity_set_disc_02 = false,
Entity_set_disc_03 = false,
Entity_set_disc_04 = false,
Entity_set_disc_05 = false,
Entity_set_disc_06 = false,
Entity_Set_Art_1 = true,
Entity_Set_Art_2 = false,
Entity_Set_Art_3 = false,
Set = function(name, state)
for entity, _ in pairs(MpSecurityOffice1.Entities) do
if entity == name then
MpSecurityOffice1.Entities[entity] = state
MpSecurityOffice1.Entities.Clear()
MpSecurityOffice1.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(MpSecurityOffice1.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(MpSecurityOffice1.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(MpSecurityOffice1.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(MpSecurityOffice1.InteriorId, entity)
end
end
end
},
LoadDefault = function()
MpSecurityOffice1.Ipl.Load()
MpSecurityOffice1.Entities.Load()
RefreshInterior(MpSecurityOffice1.interiorId)
end
}

View File

@ -0,0 +1,106 @@
exports('GetMpSecurityOffice2Object', function()
return MpSecurityOffice2
end)
MpSecurityOffice2 = {
InteriorId = 288257,
Ipl = {
Interior = {
ipl = {
'sf_fixeroffice_hw1_08'
}
},
Load = function()
EnableIpl(MpSecurityOffice2.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(MpSecurityOffice2.Ipl.Interior.ipl, false)
end
},
Entities = {
Entity_Set_Armoury = true,
Entity_Set_Standard_Office = false,
Entity_Set_Blocker = false,
Entity_Set_Wpaper_1 = false,
Entity_Set_Wpaper_3 = false,
Entity_Set_Wpaper_2 = false,
Entity_Set_Wpaper_4 = false,
Entity_Set_Wpaper_5 = false,
Entity_Set_Wpaper_6 = false,
Entity_Set_Wpaper_7 = false,
Entity_Set_Wpaper_8 = false,
Entity_Set_Wpaper_9 = true,
Entity_Set_Moving = true,
Entity_Set_Tint_AG = true,
Entity_Set_Spare_Seats = true,
Entity_Set_Player_Seats = true,
Entity_Set_Player_Desk = true,
Entity_Set_M_Golf_Intro = true,
Entity_Set_M_Setup = true,
Entity_Set_M_Nightclub = true,
Entity_Set_M_Yacht = true,
Entity_Set_M_Promoter = true,
Entity_Set_M_Limo_Photo = true,
Entity_Set_M_Limo_Wallet = true,
Entity_Set_M_The_Way = true,
Entity_Set_M_Billionaire = true,
Entity_Set_M_Families = true,
Entity_Set_M_Ballas = true,
Entity_Set_M_Hood = true,
Entity_Set_M_Fire_Booth = true,
Entity_Set_M_50 = true,
Entity_Set_M_Taxi = true,
Entity_Set_M_Gone_Golfing = true,
Entity_Set_M_Motel = true,
Entity_Set_M_Construction = true,
Entity_Set_M_Hit_List = true,
Entity_Set_M_Tuner = true,
Entity_Set_M_Attack = true,
Entity_Set_M_Vehicles = true,
Entity_Set_M_Trip_01 = true,
Entity_Set_M_Trip_02 = true,
Entity_Set_M_Trip_03 = true,
Entity_set_disc_01 = false,
Entity_set_disc_02 = true,
Entity_set_disc_03 = false,
Entity_set_disc_04 = false,
Entity_set_disc_05 = false,
Entity_set_disc_06 = false,
Entity_Set_Art_1 = false,
Entity_Set_Art_2 = true,
Entity_Set_Art_3 = false,
Set = function(name, state)
for entity, _ in pairs(MpSecurityOffice2.Entities) do
if entity == name then
MpSecurityOffice2.Entities[entity] = state
MpSecurityOffice2.Entities.Clear()
MpSecurityOffice2.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(MpSecurityOffice2.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(MpSecurityOffice2.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(MpSecurityOffice2.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(MpSecurityOffice2.InteriorId, entity)
end
end
end
},
LoadDefault = function()
MpSecurityOffice2.Ipl.Load()
MpSecurityOffice2.Entities.Load()
RefreshInterior(MpSecurityOffice2.interiorId)
end
}

View File

@ -0,0 +1,105 @@
exports('GetMpSecurityOffice3Object', function()
return MpSecurityOffice3
end)
MpSecurityOffice3 = {
InteriorId = 288001,
Ipl = {
Interior = {
ipl = {
'sf_fixeroffice_kt1_05'
}
},
Load = function()
EnableIpl(MpSecurityOffice3.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(MpSecurityOffice3.Ipl.Interior.ipl, false)
end
},
Entities = {
Entity_Set_Armoury = false,
Entity_Set_Standard_Office = true,
Entity_Set_Blocker = false,
Entity_Set_Wpaper_1 = false,
Entity_Set_Wpaper_3 = false,
Entity_Set_Wpaper_2 = true,
Entity_Set_Wpaper_4 = false,
Entity_Set_Wpaper_5 = false,
Entity_Set_Wpaper_6 = false,
Entity_Set_Wpaper_7 = false,
Entity_Set_Wpaper_8 = false,
Entity_Set_Wpaper_9 = false,
Entity_Set_Moving = true,
Entity_Set_Tint_AG = true,
Entity_Set_Spare_Seats = true,
Entity_Set_Player_Seats = true,
Entity_Set_Player_Desk = true,
Entity_Set_M_Golf_Intro = true,
Entity_Set_M_Setup = true,
Entity_Set_M_Nightclub = true,
Entity_Set_M_Yacht = true,
Entity_Set_M_Promoter = true,
Entity_Set_M_Limo_Photo = true,
Entity_Set_M_Limo_Wallet = true,
Entity_Set_M_The_Way = true,
Entity_Set_M_Billionaire = true,
Entity_Set_M_Families = true,
Entity_Set_M_Ballas = true,
Entity_Set_M_Hood = true,
Entity_Set_M_Fire_Booth = true,
Entity_Set_M_50 = true,
Entity_Set_M_Taxi = true,
Entity_Set_M_Gone_Golfing = true,
Entity_Set_M_Motel = true,
Entity_Set_M_Construction = true,
Entity_Set_M_Hit_List = true,
Entity_Set_M_Tuner = true,
Entity_Set_M_Attack = true,
Entity_Set_M_Vehicles = true,
Entity_Set_M_Trip_01 = true,
Entity_Set_M_Trip_02 = true,
Entity_Set_M_Trip_03 = true,
Entity_set_disc_01 = false,
Entity_set_disc_02 = true,
Entity_set_disc_03 = false,
Entity_set_disc_04 = false,
Entity_set_disc_05 = false,
Entity_set_disc_06 = false,
Entity_Set_Art_1 = false,
Entity_Set_Art_2 = false,
Entity_Set_Art_3 = true,
Set = function(name, state)
for entity, _ in pairs(MpSecurityOffice3.Entities) do
if entity == name then
MpSecurityOffice3.Entities[entity] = state
MpSecurityOffice3.Entities.Clear()
MpSecurityOffice3.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(MpSecurityOffice3.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(MpSecurityOffice3.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(MpSecurityOffice3.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(MpSecurityOffice3.InteriorId, entity)
end
end
end
},
LoadDefault = function()
MpSecurityOffice3.Ipl.Load()
MpSecurityOffice3.Entities.Load()
RefreshInterior(MpSecurityOffice3.interiorId)
end
}

View File

@ -0,0 +1,106 @@
exports('GetMpSecurityOffice4Object', function()
return MpSecurityOffice4
end)
MpSecurityOffice4 = {
InteriorId = 287745,
Ipl = {
Interior = {
ipl = {
'sf_fixeroffice_kt1_08'
}
},
Load = function()
EnableIpl(MpSecurityOffice4.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(MpSecurityOffice4.Ipl.Interior.ipl, false)
end,
},
Entities = {
Entity_Set_Armoury = true,
Entity_Set_Standard_Office = false,
Entity_Set_Blocker = false,
Entity_Set_Wpaper_1 = false,
Entity_Set_Wpaper_3 = true,
Entity_Set_Wpaper_2 = false,
Entity_Set_Wpaper_4 = false,
Entity_Set_Wpaper_5 = false,
Entity_Set_Wpaper_6 = false,
Entity_Set_Wpaper_7 = false,
Entity_Set_Wpaper_8 = false,
Entity_Set_Wpaper_9 = false,
Entity_Set_Moving = true,
Entity_Set_Tint_AG = true,
Entity_Set_Spare_Seats = true,
Entity_Set_Player_Seats = true,
Entity_Set_Player_Desk = true,
Entity_Set_M_Golf_Intro = true,
Entity_Set_M_Setup = true,
Entity_Set_M_Nightclub = true,
Entity_Set_M_Yacht = true,
Entity_Set_M_Promoter = true,
Entity_Set_M_Limo_Photo = true,
Entity_Set_M_Limo_Wallet = true,
Entity_Set_M_The_Way = true,
Entity_Set_M_Billionaire = true,
Entity_Set_M_Families = true,
Entity_Set_M_Ballas = true,
Entity_Set_M_Hood = true,
Entity_Set_M_Fire_Booth = true,
Entity_Set_M_50 = true,
Entity_Set_M_Taxi = true,
Entity_Set_M_Gone_Golfing = true,
Entity_Set_M_Motel = true,
Entity_Set_M_Construction = true,
Entity_Set_M_Hit_List = true,
Entity_Set_M_Tuner = true,
Entity_Set_M_Attack = true,
Entity_Set_M_Vehicles = true,
Entity_Set_M_Trip_01 = true,
Entity_Set_M_Trip_02 = true,
Entity_Set_M_Trip_03 = true,
Entity_set_disc_01 = false,
Entity_set_disc_02 = false,
Entity_set_disc_03 = false,
Entity_set_disc_04 = false,
Entity_set_disc_05 = true,
Entity_set_disc_06 = false,
Entity_Set_Art_1 = true,
Entity_Set_Art_2 = false,
Entity_Set_Art_3 = false,
Set = function(name, state)
for entity, _ in pairs(MpSecurityOffice4.Entities) do
if entity == name then
MpSecurityOffice4.Entities[entity] = state
MpSecurityOffice4.Entities.Clear()
MpSecurityOffice4.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(MpSecurityOffice4.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(MpSecurityOffice4.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(MpSecurityOffice4.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(MpSecurityOffice4.InteriorId, entity)
end
end
end,
},
LoadDefault = function()
MpSecurityOffice4.Ipl.Load()
MpSecurityOffice4.Entities.Load()
RefreshInterior(MpSecurityOffice4.interiorId)
end
}

View File

@ -0,0 +1,60 @@
exports('GetMpSecurityStudioObject', function()
return MpSecurityStudio
end)
MpSecurityStudio = {
InteriorId = 286977,
Ipl = {
Interior = {
ipl = {
'sf_int_placement_sec_interior_1_dlc_studio_sec_milo_ '
}
},
Load = function()
EnableIpl(MpSecurityStudio.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(MpSecurityStudio.Ipl.Interior.ipl, false)
end,
},
Entities = {
Entity_Set_FIX_STU_EXT_P3A1 = false,
Entity_Set_FIX_TRIP1_INT_P2 = false,
Entity_Set_FIX_STU_EXT_P1 = false,
Entity_Set_Fire = true,
entity_set_default = true,
Set = function(name, state)
for entity, _ in pairs(MpSecurityStudio.Entities) do
if entity == name then
MpSecurityStudio.Entities[entity] = state
MpSecurityStudio.Entities.Clear()
MpSecurityStudio.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(MpSecurityStudio.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(MpSecurityStudio.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(MpSecurityStudio.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(MpSecurityStudio.InteriorId, entity)
end
end
end
},
LoadDefault = function()
MpSecurityStudio.Ipl.Load()
MpSecurityStudio.Entities.Load()
RefreshInterior(MpSecurityStudio.interiorId)
end
}

View File

@ -0,0 +1,333 @@
-- SmugglerHangar: -1267.0 -3013.135 -49.5
exports('GetSmugglerHangarObject', function()
return SmugglerHangar
end)
SmugglerHangar = {
interiorId = 260353,
Ipl = {
Interior = {
ipl = "sm_smugdlc_interior_placement_interior_0_smugdlc_int_01_milo_",
Load = function()
EnableIpl(SmugglerHangar.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(SmugglerHangar.Ipl.Interior.ipl, false)
end
}
},
Colors = {
colorSet1 = 1, -- sable, red, gray
colorSet2 = 2, -- white, blue, gray
colorSet3 = 3, -- gray, orange, blue
colorSet4 = 4, -- gray, blue, orange
colorSet5 = 5, -- gray, light gray, red
colorSet6 = 6, -- yellow, gray, light gray
colorSet7 = 7, -- light Black and white
colorSet8 = 8, -- dark Black and white
colorSet9 = 9 -- sable and gray
},
Walls = {
default = "set_tint_shell",
SetColor = function(color, refresh)
SetIplPropState(SmugglerHangar.interiorId, SmugglerHangar.Walls.default, true, refresh)
SetInteriorEntitySetColor(SmugglerHangar.interiorId, SmugglerHangar.Walls.default, color)
end,
},
Floor = {
Style = {
raw = "set_floor_1",
plain = "set_floor_2",
Set = function(floor, refresh)
SmugglerHangar.Floor.Style.Clear(false)
SetIplPropState(SmugglerHangar.interiorId, floor, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(SmugglerHangar.interiorId, {
SmugglerHangar.Floor.Style.raw,
SmugglerHangar.Floor.Style.plain
}, false, refresh)
end
},
Decals = {
decal1 = "set_floor_decal_1",
decal2 = "set_floor_decal_2",
decal4 = "set_floor_decal_3",
decal3 = "set_floor_decal_4",
decal5 = "set_floor_decal_5",
decal6 = "set_floor_decal_6",
decal7 = "set_floor_decal_7",
decal8 = "set_floor_decal_8",
decal9 = "set_floor_decal_9",
Set = function(decal, color, refresh)
if color == nil then
color = 1
end
SmugglerHangar.Floor.Decals.Clear(false)
SetIplPropState(SmugglerHangar.interiorId, decal, true, refresh)
SetInteriorEntitySetColor(SmugglerHangar.interiorId, decal, color)
end,
Clear = function(refresh)
SetIplPropState(SmugglerHangar.interiorId, {
SmugglerHangar.Floor.Decals.decal1,
SmugglerHangar.Floor.Decals.decal2,
SmugglerHangar.Floor.Decals.decal3,
SmugglerHangar.Floor.Decals.decal4,
SmugglerHangar.Floor.Decals.decal5,
SmugglerHangar.Floor.Decals.decal6,
SmugglerHangar.Floor.Decals.decal7,
SmugglerHangar.Floor.Decals.decal8,
SmugglerHangar.Floor.Decals.decal9
}, false, refresh)
end
}
},
Cranes = {
on = "set_crane_tint",
off = "",
Set = function(crane, color, refresh)
SmugglerHangar.Cranes.Clear()
if crane ~= "" then
SetIplPropState(SmugglerHangar.interiorId, crane, true, refresh)
SetInteriorEntitySetColor(SmugglerHangar.interiorId, crane, color)
else
if refresh then
RefreshInterior(SmugglerHangar.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(SmugglerHangar.interiorId, SmugglerHangar.Cranes.default, false, refresh)
end
},
ModArea = {
on = "set_modarea",
off = "",
Set = function(mod, color, refresh)
if color == nil then
color = 1
end
SmugglerHangar.ModArea.Clear(false)
if mod ~= "" then
SetIplPropState(SmugglerHangar.interiorId, mod, true, refresh)
SetInteriorEntitySetColor(SmugglerHangar.interiorId, mod, color)
else
if refresh then
RefreshInterior(SmugglerHangar.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(SmugglerHangar.interiorId, SmugglerHangar.ModArea.mod, false, refresh)
end
},
Office = {
basic = "set_office_basic",
modern = "set_office_modern",
traditional = "set_office_traditional",
Set = function(office, refresh)
SmugglerHangar.Office.Clear(false)
SetIplPropState(SmugglerHangar.interiorId, office, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(SmugglerHangar.interiorId, {
SmugglerHangar.Office.basic,
SmugglerHangar.Office.modern,
SmugglerHangar.Office.traditional
}, false, refresh)
end
},
Bedroom = {
Style = {
none = "",
modern = {
"set_bedroom_modern",
"set_bedroom_tint"
},
traditional = {
"set_bedroom_traditional",
"set_bedroom_tint"
},
Set = function(bed, color, refresh)
if color == nil then
color = 1
end
SmugglerHangar.Bedroom.Style.Clear(false)
if bed ~= "" then
SetIplPropState(SmugglerHangar.interiorId, bed, true, refresh)
SetInteriorEntitySetColor(SmugglerHangar.interiorId, "set_bedroom_tint", color)
else
if refresh then
RefreshInterior(SmugglerHangar.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(SmugglerHangar.interiorId, {
SmugglerHangar.Bedroom.Style.modern,
SmugglerHangar.Bedroom.Style.traditional
}, false, refresh)
end
},
Blinds = {
none = "",
opened = "set_bedroom_blinds_open",
closed = "set_bedroom_blinds_closed",
Set = function(blinds, refresh)
SmugglerHangar.Bedroom.Blinds.Clear(false)
if blinds ~= "" then
SetIplPropState(SmugglerHangar.interiorId, blinds, true, refresh)
else
if refresh then
RefreshInterior(SmugglerHangar.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(SmugglerHangar.interiorId, {
SmugglerHangar.Bedroom.Blinds.opened,
SmugglerHangar.Bedroom.Blinds.closed
}, false, refresh)
end
}
},
Lighting = {
FakeLights = {
none = "",
yellow = 2,
blue = 1,
white = 0,
Set = function(light, refresh)
SmugglerHangar.Lighting.FakeLights.Clear(false)
if light ~= "" then
SetIplPropState(SmugglerHangar.interiorId, "set_lighting_tint_props", true, refresh)
SetInteriorEntitySetColor(SmugglerHangar.interiorId, "set_lighting_tint_props", light)
else
if refresh then
RefreshInterior(SmugglerHangar.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(SmugglerHangar.interiorId, "set_lighting_tint_props", false, refresh)
end
},
Ceiling = {
none = "",
yellow = "set_lighting_hangar_a",
blue = "set_lighting_hangar_b",
white = "set_lighting_hangar_c",
Set = function(light, refresh)
SmugglerHangar.Lighting.Ceiling.Clear(false)
if light ~= "" then
SetIplPropState(SmugglerHangar.interiorId, light, true, refresh)
else
if refresh then
RefreshInterior(SmugglerHangar.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(SmugglerHangar.interiorId, {
SmugglerHangar.Lighting.Ceiling.yellow,
SmugglerHangar.Lighting.Ceiling.blue,
SmugglerHangar.Lighting.Ceiling.white
}, false, refresh)
end
},
Walls = {
none = "",
neutral = "set_lighting_wall_neutral",
blue = "set_lighting_wall_tint01",
orange = "set_lighting_wall_tint02",
lightYellow = "set_lighting_wall_tint03",
lightYellow2 = "set_lighting_wall_tint04",
dimmed = "set_lighting_wall_tint05",
strongYellow = "set_lighting_wall_tint06",
white = "set_lighting_wall_tint07",
lightGreen = "set_lighting_wall_tint08",
yellow = "set_lighting_wall_tint09",
Set = function(light, refresh)
SmugglerHangar.Lighting.Walls.Clear(false)
if light ~= "" then
SetIplPropState(SmugglerHangar.interiorId, light, true, refresh)
else
if refresh then
RefreshInterior(SmugglerHangar.interiorId)
end
end
end,
Clear = function(refresh)
SetIplPropState(SmugglerHangar.interiorId, {
SmugglerHangar.Lighting.Walls.neutral,
SmugglerHangar.Lighting.Walls.blue,
SmugglerHangar.Lighting.Walls.orange,
SmugglerHangar.Lighting.Walls.lightYellow,
SmugglerHangar.Lighting.Walls.lightYellow2,
SmugglerHangar.Lighting.Walls.dimmed,
SmugglerHangar.Lighting.Walls.strongYellow,
SmugglerHangar.Lighting.Walls.white,
SmugglerHangar.Lighting.Walls.lightGreen,
SmugglerHangar.Lighting.Walls.yellow
}, false, refresh)
end
}
},
Details = {
bedroomClutter = "set_bedroom_clutter",
Enable = function(details, state, refresh)
SetIplPropState(SmugglerHangar.interiorId, details, state, refresh)
end
},
LoadDefault = function()
SmugglerHangar.Ipl.Interior.Load()
SmugglerHangar.Walls.SetColor(SmugglerHangar.Colors.colorSet1)
SmugglerHangar.Cranes.Set(SmugglerHangar.Cranes.on, SmugglerHangar.Colors.colorSet1)
SmugglerHangar.Floor.Style.Set(SmugglerHangar.Floor.Style.plain)
SmugglerHangar.Floor.Decals.Set(SmugglerHangar.Floor.Decals.decal1, SmugglerHangar.Colors.colorSet1)
SmugglerHangar.Lighting.Ceiling.Set(SmugglerHangar.Lighting.Ceiling.yellow)
SmugglerHangar.Lighting.Walls.Set(SmugglerHangar.Lighting.Walls.neutral)
SmugglerHangar.Lighting.FakeLights.Set(SmugglerHangar.Lighting.FakeLights.yellow)
SmugglerHangar.ModArea.Set(SmugglerHangar.ModArea.on, SmugglerHangar.Colors.colorSet1)
SmugglerHangar.Office.Set(SmugglerHangar.Office.basic)
SmugglerHangar.Bedroom.Style.Set(SmugglerHangar.Bedroom.Style.modern, SmugglerHangar.Colors.colorSet1)
SmugglerHangar.Bedroom.Blinds.Set(SmugglerHangar.Bedroom.Blinds.opened)
SmugglerHangar.Details.Enable(SmugglerHangar.Details.bedroomClutter, false)
RefreshInterior(SmugglerHangar.interiorId)
end
}

View File

@ -0,0 +1,4 @@
CreateThread(function()
RequestIpl("m24_1_legacyfixes")
RequestIpl("m24_1_pizzasigns")
end)

View File

@ -0,0 +1,25 @@
-- Aircraft carrier: -3208.03, 3954.54, 14.0
exports('GetSummerCarrierObject', function()
return SummerCarrier
end)
SummerCarrier = {
ipl = {
"m24_1_carrier",
"m24_1_carrier_int1",
"m24_1_carrier_int2",
"m24_1_carrier_int3",
"m24_1_carrier_int4",
"m24_1_carrier_int5",
"m24_1_carrier_int6",
"m24_1_carrier_ladders"
},
Enable = function(state)
EnableIpl(SummerCarrier.ipl, state)
end,
LoadDefault = function()
SummerCarrier.Enable(true)
end
}

View File

@ -0,0 +1,114 @@
-- Bail office: 565.886, -2688.761, -50.0
exports('GetSummerOfficeObject', function()
return SummerOffice
end)
SummerOffice = {
interiorId = 295425,
Ipl = {
Exterior = {
ipl = {
"m24_1_bailoffice_davis",
"m24_1_bailoffice_delperro",
"m24_1_bailoffice_missionrow",
"m24_1_bailoffice_paletobay",
"m24_1_bailoffice_vinewood"
},
Load = function()
EnableIpl(SummerOffice.Ipl.Exterior.ipl, true)
end,
Remove = function()
EnableIpl(SummerOffice.Ipl.Exterior.ipl, false)
end
}
},
Style = {
vintage = "set_style_01",
patterns = "set_style_02",
teak = "set_style_03",
Set = function(style, refresh)
SummerOffice.Style.Clear(false)
SetIplPropState(SummerOffice.interiorId, style, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(SummerOffice.interiorId, {
SummerOffice.Style.vintage,
SummerOffice.Style.patterns,
SummerOffice.Style.teak
}, false, refresh)
end
},
Desk = {
files = "set_no_staff",
computers = "set_staff_upgrade",
Set = function(style, refresh)
SummerOffice.Desk.Clear(false)
SetIplPropState(SummerOffice.interiorId, style, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(SummerOffice.interiorId, {
SummerOffice.Desk.files,
SummerOffice.Desk.computers
}, false, refresh)
end
},
Gunsafe = {
cabinet = "set_gunsafe_off",
gunsafe = "set_gunsafe_on",
Set = function(style, refresh)
SummerOffice.Gunsafe.Clear(false)
SetIplPropState(SummerOffice.interiorId, style, true, refresh)
end,
Clear = function(refresh)
SetIplPropState(SummerOffice.interiorId, {
SummerOffice.Gunsafe.cabinet,
SummerOffice.Gunsafe.gunsafe
}, false, refresh)
end
},
Trophy = {
plaque = "set_trophy_10x",
badge = "set_trophy_24x",
handcuffs = "set_trophy_100x",
Enable = function(trophy, state, refresh)
SetIplPropState(SummerOffice.interiorId, trophy, state, refresh)
end
},
Plant = {
plant = "set_new_plant",
Enable = function(state, refresh)
SetIplPropState(SummerOffice.interiorId, SummerOffice.Plant.plant, state, refresh)
end
},
LoadDefault = function()
SummerOffice.Ipl.Exterior.Load()
SummerOffice.Style.Set(SummerOffice.Style.teak, false)
SummerOffice.Desk.Set(SummerOffice.Desk.files, false)
SummerOffice.Gunsafe.Set(SummerOffice.Gunsafe.cabinet, false)
SummerOffice.Trophy.Enable(SummerOffice.Trophy.plaque, true, false)
SummerOffice.Trophy.Enable(SummerOffice.Trophy.badge, true, false)
SummerOffice.Trophy.Enable(SummerOffice.Trophy.handcuffs, true, false)
SummerOffice.Plant.Enable(true, false)
RefreshInterior(SummerOffice.interiorId)
end
}

View File

@ -0,0 +1,94 @@
exports('GetTunerGarageObject', function()
return TunerGarage
end)
TunerGarage = {
InteriorId = 285953,
Ipl = {
Exterior = {
ipl = {
'tr_tuner_shop_burton',
'tr_tuner_shop_mesa',
'tr_tuner_shop_mission',
'tr_tuner_shop_rancho',
'tr_tuner_shop_strawberry'
}
},
Load = function()
EnableIpl(TunerGarage.Ipl.Exterior.ipl, true)
end,
Remove = function()
EnableIpl(TunerGarage.Ipl.Exterior.ipl, false)
end,
},
Entities = {
entity_set_bedroom = true,
entity_set_bedroom_empty = false,
entity_set_bombs = true,
entity_set_box_clutter = false,
entity_set_cabinets = false,
entity_set_car_lift_cutscene = true,
entity_set_car_lift_default = true,
entity_set_car_lift_purchase = true,
entity_set_chalkboard = false,
entity_set_container = false,
entity_set_cut_seats = false,
entity_set_def_table = false,
entity_set_drive = true,
entity_set_ecu = true,
entity_set_IAA = true,
entity_set_jammers = true,
entity_set_laptop = true,
entity_set_lightbox = true,
entity_set_methLab = false,
entity_set_plate = true,
entity_set_scope = true,
entity_set_style_1 = false,
entity_set_style_2 = false,
entity_set_style_3 = false,
entity_set_style_4 = false,
entity_set_style_5 = false,
entity_set_style_6 = false,
entity_set_style_7 = false,
entity_set_style_8 = false,
entity_set_style_9 = true,
entity_set_table = false,
entity_set_thermal = true,
entity_set_tints = true,
entity_set_train = true,
entity_set_virus = true,
Set = function(name, state)
for entity, _ in pairs(TunerGarage.Entities) do
if entity == name then
TunerGarage.Entities[entity] = state
TunerGarage.Entities.Clear()
TunerGarage.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(TunerGarage.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(TunerGarage.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(TunerGarage.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(TunerGarage.InteriorId, entity)
end
end
end
},
LoadDefault = function()
TunerGarage.Ipl.Load()
TunerGarage.Entities.Load()
RefreshInterior(TunerGarage.InteriorId)
end
}

View File

@ -0,0 +1,65 @@
-- Los Santos Car Meet: -2000.0, 1113.211, -25.36243
exports('GetTunerMeetupObject', function()
return TunerMeetup
end)
TunerMeetup = {
InteriorId = 285697,
Ipl = {
Exterior = {
ipl = {
'tr_tuner_meetup',
'tr_tuner_race_line'
}
},
Load = function()
EnableIpl(TunerMeetup.Ipl.Exterior.ipl, true)
end,
Remove = function()
EnableIpl(TunerMeetup.Ipl.Exterior.ipl, false)
end
},
Entities = {
entity_set_meet_crew = true,
entity_set_meet_lights = true,
entity_set_meet_lights_cheap = false,
entity_set_player = true,
entity_set_test_crew = false,
entity_set_test_lights = true,
entity_set_test_lights_cheap = false,
entity_set_time_trial = true,
Set = function(name, state)
for entity, _ in pairs(TunerMeetup.Entities) do
if entity == name then
TunerMeetup.Entities[entity] = state
TunerMeetup.Entities.Clear()
TunerMeetup.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(TunerMeetup.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(TunerMeetup.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(TunerMeetup.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(TunerMeetup.InteriorId, entity)
end
end
end
},
LoadDefault = function()
TunerMeetup.Ipl.Load()
TunerMeetup.Entities.Load()
RefreshInterior(TunerMeetup.InteriorId)
end
}

View File

@ -0,0 +1,42 @@
exports('GetTunerMethLabObject', function()
return TunerMethLab
end)
TunerMethLab = {
InteriorId = 284673,
Entities = {
tintable_walls = true,
Set = function(name, state)
for entity, _ in pairs(TunerMethLab.Entities) do
if entity == name then
TunerMethLab.Entities[entity] = state
TunerMethLab.Entities.Clear()
TunerMethLab.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(TunerMethLab.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(TunerMethLab.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(TunerMethLab.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(TunerMethLab.InteriorId, entity)
end
end
end
},
LoadDefault = function()
TunerMethLab.Entities.Load()
SetInteriorEntitySetColor(TunerMethLab.InteriorId, TunerMethLab.Entities.tintable_walls, 3)
RefreshInterior(TunerMethLab.InteriorId)
end
}

View File

@ -0,0 +1,157 @@
fx_version 'cerulean'
game 'gta5'
author 'Bob_74'
description 'Load and customize your map'
version '2.3.2'
lua54 "yes"
client_scripts {
"lib/common.lua"
, "lib/observers/interiorIdObserver.lua"
, "lib/observers/officeSafeDoorHandler.lua"
, "lib/observers/officeCullHandler.lua"
, "client.lua"
-- GTA V
, "gtav/base.lua" -- Base IPLs to fix holes
, "gtav/ammunations.lua"
, "gtav/bahama.lua"
, "gtav/cargoship.lua"
, "gtav/floyd.lua"
, "gtav/franklin.lua"
, "gtav/franklin_aunt.lua"
, "gtav/graffitis.lua"
, "gtav/pillbox_hospital.lua"
, "gtav/lester_factory.lua"
, "gtav/michael.lua"
, "gtav/north_yankton.lua"
, "gtav/red_carpet.lua"
, "gtav/simeon.lua"
, "gtav/stripclub.lua"
, "gtav/trevors_trailer.lua"
, "gtav/ufo.lua"
, "gtav/zancudo_gates.lua"
-- GTA Online
, "gta_online/apartment_hi_1.lua"
, "gta_online/apartment_hi_2.lua"
, "gta_online/house_hi_1.lua"
, "gta_online/house_hi_2.lua"
, "gta_online/house_hi_3.lua"
, "gta_online/house_hi_4.lua"
, "gta_online/house_hi_5.lua"
, "gta_online/house_hi_6.lua"
, "gta_online/house_hi_7.lua"
, "gta_online/house_hi_8.lua"
, "gta_online/house_mid_1.lua"
, "gta_online/house_low_1.lua"
-- DLC High Life
, "dlc_high_life/apartment1.lua"
, "dlc_high_life/apartment2.lua"
, "dlc_high_life/apartment3.lua"
, "dlc_high_life/apartment4.lua"
, "dlc_high_life/apartment5.lua"
, "dlc_high_life/apartment6.lua"
-- DLC Heists
, "dlc_heists/carrier.lua"
, "dlc_heists/yacht.lua"
-- DLC Executives & Other Criminals
, "dlc_executive/apartment1.lua"
, "dlc_executive/apartment2.lua"
, "dlc_executive/apartment3.lua"
-- DLC Finance & Felony
, "dlc_finance/office1.lua"
, "dlc_finance/office2.lua"
, "dlc_finance/office3.lua"
, "dlc_finance/office4.lua"
, "dlc_finance/organization.lua"
-- DLC Bikers
, "dlc_bikers/cocaine.lua"
, "dlc_bikers/counterfeit_cash.lua"
, "dlc_bikers/document_forgery.lua"
, "dlc_bikers/meth.lua"
, "dlc_bikers/weed.lua"
, "dlc_bikers/clubhouse1.lua"
, "dlc_bikers/clubhouse2.lua"
, "dlc_bikers/gang.lua"
-- DLC Import/Export
, "dlc_import/garage1.lua"
, "dlc_import/garage2.lua"
, "dlc_import/garage3.lua"
, "dlc_import/garage4.lua"
, "dlc_import/vehicle_warehouse.lua"
-- DLC Gunrunning
, "dlc_gunrunning/bunkers.lua"
, "dlc_gunrunning/yacht.lua"
-- DLC Smuggler's Run
, "dlc_smuggler/hangar.lua"
-- DLC Doomsday Heist
, "dlc_doomsday/facility.lua"
-- DLC After Hours
, "dlc_afterhours/nightclubs.lua"
-- DLC Diamond Casino (Requires forced build 2060 or higher)
, "dlc_casino/casino.lua"
, "dlc_casino/penthouse.lua"
-- DLC Cayo Perico Heist (Requires forced build 2189 or higher)
, "dlc_cayoperico/base.lua"
, "dlc_cayoperico/nightclub.lua"
, "dlc_cayoperico/submarine.lua"
-- DLC Tuners (Requires forced build 2372 or higher)
, "dlc_tuner/garage.lua"
, "dlc_tuner/meetup.lua"
, "dlc_tuner/methlab.lua"
-- DLC The Contract (Requires forced build 2545 or higher)
, "dlc_security/studio.lua"
, "dlc_security/billboards.lua"
, "dlc_security/musicrooftop.lua"
, "dlc_security/garage.lua"
, "dlc_security/office1.lua"
, "dlc_security/office2.lua"
, "dlc_security/office3.lua"
, "dlc_security/office4.lua"
-- DLC The Criminal Enterprises (Requires forced build 2699 or higher)
, "gta_mpsum2/simeonfix.lua"
, "gta_mpsum2/vehicle_warehouse.lua"
, "gta_mpsum2/warehouse.lua"
-- DLC Los Santos Drug Wars (Requires forced build 2802 or higher)
, "dlc_drugwars/base.lua"
, "dlc_drugwars/freakshop.lua"
, "dlc_drugwars/garage.lua"
, "dlc_drugwars/lab.lua"
, "dlc_drugwars/traincrash.lua"
-- DLC San Andreas Mercenaries (Requires forced build 2944 or higher)
, "dlc_mercenaries/club.lua"
, "dlc_mercenaries/lab.lua"
, "dlc_mercenaries/fixes.lua"
-- DLC The Chop Shop (Requires forced build 3095 or higher)
, "dlc_chopshop/base.lua"
, "dlc_chopshop/cargoship.lua"
, "dlc_chopshop/cartel_garage.lua"
, "dlc_chopshop/lifeguard.lua"
, "dlc_chopshop/salvage.lua"
-- DLC Bottom Dollar Bounties (Requires forced build 3258 or higher)
, "dlc_summer/base.lua"
, "dlc_summer/carrier.lua"
, "dlc_summer/office.lua"
}

View File

@ -0,0 +1,55 @@
exports('GetCriminalEnterpriseSmeonFixObject', function()
return CriminalEnterpriseSmeonFix
end)
CriminalEnterpriseSmeonFix = {
InteriorId = 7170,
Ipl = {
Interior = {
ipl = {
'reh_simeonfix',
}
},
Load = function()
EnableIpl(CriminalEnterpriseSmeonFix.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(CriminalEnterpriseSmeonFix.Ipl.Interior.ipl, false)
end
},
Entities = {
Set = function(name, state)
for entity, _ in pairs(CriminalEnterpriseSmeonFix.Entities) do
if entity == name then
CriminalEnterpriseSmeonFix.Entities[entity] = state
CriminalEnterpriseSmeonFix.Entities.Clear()
CriminalEnterpriseSmeonFix.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(CriminalEnterpriseSmeonFix.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(CriminalEnterpriseSmeonFix.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(CriminalEnterpriseSmeonFix.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(CriminalEnterpriseSmeonFix.InteriorId, entity)
end
end
end
},
LoadDefault = function()
CriminalEnterpriseSmeonFix.Ipl.Load()
CriminalEnterpriseSmeonFix.Entities.Load()
RefreshInterior(CriminalEnterpriseSmeonFix.interiorId)
end
}

View File

@ -0,0 +1,60 @@
exports('GetCriminalEnterpriseVehicleWarehouseObject', function()
return CriminalEnterpriseVehicleWarehouse
end)
CriminalEnterpriseVehicleWarehouse = {
InteriorId = 289537,
Ipl = {
Interior = {
ipl = {
'reh_int_placement_sum2_interior_0_dlc_int_03_sum2_milo_',
}
},
Load = function()
EnableIpl(CriminalEnterpriseVehicleWarehouse.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(CriminalEnterpriseVehicleWarehouse.Ipl.Interior.ipl, false)
end
},
Entities = {
entity_set_office = true,
entity_set_light_option_1 = true,
entity_set_light_option_2 = true,
entity_set_light_option_3 = true,
entity_set_tint_options = true,
Set = function(name, state)
for entity, _ in pairs(CriminalEnterpriseVehicleWarehouse.Entities) do
if entity == name then
CriminalEnterpriseVehicleWarehouse.Entities[entity] = state
CriminalEnterpriseVehicleWarehouse.Entities.Clear()
CriminalEnterpriseVehicleWarehouse.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(CriminalEnterpriseVehicleWarehouse.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(CriminalEnterpriseVehicleWarehouse.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(CriminalEnterpriseVehicleWarehouse.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(CriminalEnterpriseVehicleWarehouse.InteriorId, entity)
end
end
end
},
LoadDefault = function()
CriminalEnterpriseVehicleWarehouse.Ipl.Load()
CriminalEnterpriseVehicleWarehouse.Entities.Load()
RefreshInterior(CriminalEnterpriseVehicleWarehouse.interiorId)
end
}

View File

@ -0,0 +1,60 @@
exports('GetCriminalEnterpriseWarehouseObject', function()
return CriminalEnterpriseWarehouse
end)
CriminalEnterpriseWarehouse = {
InteriorId = 289793,
Ipl = {
Interior = {
ipl = {
'reh_int_placement_sum2_interior_1_dlc_int_04_sum2_milo_',
}
},
Load = function()
EnableIpl(CriminalEnterpriseWarehouse.Ipl.Interior.ipl, true)
end,
Remove = function()
EnableIpl(CriminalEnterpriseWarehouse.Ipl.Interior.ipl, false)
end
},
Entities = {
entity_set_style_1 = false,
entity_set_style_2 = false,
entity_set_style_3 = false,
entity_set_style_4 = false,
entity_set_style_5 = true,
Set = function(name, state)
for entity, _ in pairs(CriminalEnterpriseWarehouse.Entities) do
if entity == name then
CriminalEnterpriseWarehouse.Entities[entity] = state
CriminalEnterpriseWarehouse.Entities.Clear()
CriminalEnterpriseWarehouse.Entities.Load()
end
end
end,
Load = function()
for entity, state in pairs(CriminalEnterpriseWarehouse.Entities) do
if type(entity) == 'string' and state then
ActivateInteriorEntitySet(CriminalEnterpriseWarehouse.InteriorId, entity)
end
end
end,
Clear = function()
for entity, _ in pairs(CriminalEnterpriseWarehouse.Entities) do
if type(entity) == 'string' then
DeactivateInteriorEntitySet(CriminalEnterpriseWarehouse.InteriorId, entity)
end
end
end
},
LoadDefault = function()
CriminalEnterpriseWarehouse.Ipl.Load()
CriminalEnterpriseWarehouse.Entities.Load()
RefreshInterior(CriminalEnterpriseWarehouse.interiorId)
end
}

View File

@ -0,0 +1,56 @@
-- 4 Integrity Way, Apt 30
-- High end apartment 1: -35.31277 -580.4199 88.71221
exports('GetGTAOApartmentHi1Object', function()
return GTAOApartmentHi1
end)
GTAOApartmentHi1 = {
interiorId = 141313,
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOApartmentHi1.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOApartmentHi1.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOApartmentHi1.interiorId, details, state, refresh)
end
},
LoadDefault = function()
GTAOApartmentHi1.Strip.Enable({
GTAOApartmentHi1.Strip.A,
GTAOApartmentHi1.Strip.B,
GTAOApartmentHi1.Strip.C
}, false)
GTAOApartmentHi1.Booze.Enable({
GTAOApartmentHi1.Booze.A,
GTAOApartmentHi1.Booze.B,
GTAOApartmentHi1.Booze.C
}, false)
GTAOApartmentHi1.Smoke.Enable({
GTAOApartmentHi1.Smoke.A,
GTAOApartmentHi1.Smoke.B,
GTAOApartmentHi1.Smoke.C
}, false)
RefreshInterior(GTAOApartmentHi1.interiorId)
end
}

View File

@ -0,0 +1,57 @@
-- Dell Perro Heights, Apt 7
-- High end apartment 2: -1477.14 -538.7499 55.5264
exports('GetGTAOApartmentHi2Object', function()
return GTAOApartmentHi2
end)
GTAOApartmentHi2 = {
interiorId = 145665,
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOApartmentHi2.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOApartmentHi2.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOApartmentHi2.interiorId, details, state, refresh)
end
},
LoadDefault = function()
GTAOApartmentHi2.Strip.Enable({
GTAOApartmentHi2.Strip.A,
GTAOApartmentHi2.Strip.B,
GTAOApartmentHi2.Strip.C
}, false)
GTAOApartmentHi2.Booze.Enable({
GTAOApartmentHi2.Booze.A,
GTAOApartmentHi2.Booze.B,
GTAOApartmentHi2.Booze.C
}, false)
GTAOApartmentHi2.Smoke.Enable({
GTAOApartmentHi2.Smoke.A,
GTAOApartmentHi2.Smoke.B,
GTAOApartmentHi2.Smoke.C
}, false)
RefreshInterior(GTAOApartmentHi2.interiorId)
end
}

View File

@ -0,0 +1,57 @@
-- 3655 Wild Oats Drive
-- High end house 1: -169.286 486.4938 137.4436
exports('GetGTAOHouseHi1Object', function()
return GTAOHouseHi1
end)
GTAOHouseHi1 = {
interiorId = 207105,
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi1.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi1.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi1.interiorId, details, state, refresh)
end
},
LoadDefault = function()
GTAOHouseHi1.Strip.Enable({
GTAOHouseHi1.Strip.A,
GTAOHouseHi1.Strip.B,
GTAOHouseHi1.Strip.C
}, false)
GTAOHouseHi1.Booze.Enable({
GTAOHouseHi1.Booze.A,
GTAOHouseHi1.Booze.B,
GTAOHouseHi1.Booze.C
}, false)
GTAOHouseHi1.Smoke.Enable({
GTAOHouseHi1.Smoke.A,
GTAOHouseHi1.Smoke.B,
GTAOHouseHi1.Smoke.C
}, false)
RefreshInterior(GTAOHouseHi1.interiorId)
end
}

View File

@ -0,0 +1,57 @@
-- 2044 North Conker Avenue
-- High end house 2: 340.9412 437.1798 149.3925
exports('GetGTAOHouseHi2Object', function()
return GTAOHouseHi2
end)
GTAOHouseHi2 = {
interiorId = 206081,
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi2.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi2.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi2.interiorId, details, state, refresh)
end
},
LoadDefault = function()
GTAOHouseHi2.Strip.Enable({
GTAOHouseHi2.Strip.A,
GTAOHouseHi2.Strip.B,
GTAOHouseHi2.Strip.C
}, false)
GTAOHouseHi2.Booze.Enable({
GTAOHouseHi2.Booze.A,
GTAOHouseHi2.Booze.B,
GTAOHouseHi2.Booze.C
}, false)
GTAOHouseHi2.Smoke.Enable({
GTAOHouseHi2.Smoke.A,
GTAOHouseHi2.Smoke.B,
GTAOHouseHi2.Smoke.C
}, false)
RefreshInterior(GTAOHouseHi2.interiorId)
end
}

View File

@ -0,0 +1,57 @@
-- 2045 North Conker Avenue
-- High end house 3: 373.023 416.105 145.7006
exports('GetGTAOHouseHi3Object', function()
return GTAOHouseHi3
end)
GTAOHouseHi3 = {
interiorId = 206337,
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi3.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi3.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi3.interiorId, details, state, refresh)
end
},
LoadDefault = function()
GTAOHouseHi3.Strip.Enable({
GTAOHouseHi3.Strip.A,
GTAOHouseHi3.Strip.B,
GTAOHouseHi3.Strip.C
}, false)
GTAOHouseHi3.Booze.Enable({
GTAOHouseHi3.Booze.A,
GTAOHouseHi3.Booze.B,
GTAOHouseHi3.Booze.C
}, false)
GTAOHouseHi3.Smoke.Enable({
GTAOHouseHi3.Smoke.A,
GTAOHouseHi3.Smoke.B,
GTAOHouseHi3.Smoke.C
}, false)
RefreshInterior(GTAOHouseHi3.interiorId)
end
}

View File

@ -0,0 +1,57 @@
-- 2862 Hillcrest Avenue
-- High end house 4: -676.127 588.612 145.1698
exports('GetGTAOHouseHi4Object', function()
return GTAOHouseHi4
end)
GTAOHouseHi4 = {
interiorId = 208129,
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi4.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi4.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi4.interiorId, details, state, refresh)
end
},
LoadDefault = function()
GTAOHouseHi4.Strip.Enable({
GTAOHouseHi4.Strip.A,
GTAOHouseHi4.Strip.B,
GTAOHouseHi4.Strip.C
}, false)
GTAOHouseHi4.Booze.Enable({
GTAOHouseHi4.Booze.A,
GTAOHouseHi4.Booze.B,
GTAOHouseHi4.Booze.C
}, false)
GTAOHouseHi4.Smoke.Enable({
GTAOHouseHi4.Smoke.A,
GTAOHouseHi4.Smoke.B,
GTAOHouseHi4.Smoke.C
}, false)
RefreshInterior(GTAOHouseHi4.interiorId)
end
}

View File

@ -0,0 +1,57 @@
-- 2868 Hillcrest Avenue
-- High end house 5: -763.107 615.906 144.1401
exports('GetGTAOHouseHi5Object', function()
return GTAOHouseHi5
end)
GTAOHouseHi5 = {
interiorId = 207617,
Strip = {
A = "Apart_Hi_Strip_A",
B = "Apart_Hi_Strip_B",
C = "Apart_Hi_Strip_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi5.interiorId, details, state, refresh)
end
},
Booze = {
A = "Apart_Hi_Booze_A",
B = "Apart_Hi_Booze_B",
C = "Apart_Hi_Booze_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi5.interiorId, details, state, refresh)
end
},
Smoke = {
A = "Apart_Hi_Smokes_A",
B = "Apart_Hi_Smokes_B",
C = "Apart_Hi_Smokes_C",
Enable = function(details, state, refresh)
SetIplPropState(GTAOHouseHi5.interiorId, details, state, refresh)
end
},
LoadDefault = function()
GTAOHouseHi5.Strip.Enable({
GTAOHouseHi5.Strip.A,
GTAOHouseHi5.Strip.B,
GTAOHouseHi5.Strip.C
}, false)
GTAOHouseHi5.Booze.Enable({
GTAOHouseHi5.Booze.A,
GTAOHouseHi5.Booze.B,
GTAOHouseHi5.Booze.C
}, false)
GTAOHouseHi5.Smoke.Enable({
GTAOHouseHi5.Smoke.A,
GTAOHouseHi5.Smoke.B,
GTAOHouseHi5.Smoke.C
}, false)
RefreshInterior(GTAOHouseHi5.interiorId)
end
}

Some files were not shown because too many files have changed in this diff Show More