forked from Simnation/Main
116 lines
3.7 KiB
Lua
116 lines
3.7 KiB
Lua
![]() |
Placeable = Placeable or {}
|
||
|
Utility = Utility or Require("lib/utility/client/utility.lua")
|
||
|
|
||
|
local activePlacementProp = nil
|
||
|
lib.locale()
|
||
|
|
||
|
-- Object placer --
|
||
|
local placementText = {
|
||
|
locale('placeable_object.place_object_place'),
|
||
|
locale('placeable_object.place_object_cancel'),
|
||
|
locale('placeable_object.place_object_scroll_up'),
|
||
|
locale('placeable_object.place_object_scroll_down')
|
||
|
}
|
||
|
|
||
|
local function finishPlacing()
|
||
|
Bridge.Notify.HideHelpText()
|
||
|
if activePlacementProp == nil then return end
|
||
|
DeleteObject(activePlacementProp)
|
||
|
activePlacementProp = nil
|
||
|
end
|
||
|
|
||
|
--[[
|
||
|
|
||
|
RegisterCommand('testplacement', function()
|
||
|
Placeable.PlaceObject("prop_cs_cardbox_01", 10, true, nil, 0.0)
|
||
|
end, false)
|
||
|
|
||
|
--]]
|
||
|
|
||
|
Placeable.PlaceObject = function(object, distance, snapToGround, allowedMats, offset)
|
||
|
distance = tonumber(distance or 10.0 )
|
||
|
if activePlacementProp then return end
|
||
|
|
||
|
if not object then Prints.Error('placeable_object.no_prop_defined') end
|
||
|
|
||
|
local propObject = type(object) == 'string' and joaat(object) or object
|
||
|
local heading = 0.0
|
||
|
local checkDist = distance or 10.0
|
||
|
|
||
|
Utility.LoadModel(propObject)
|
||
|
|
||
|
activePlacementProp = CreateObject(propObject, 1.0, 1.0, 1.0, false, true, true)
|
||
|
SetModelAsNoLongerNeeded(propObject)
|
||
|
SetEntityAlpha(activePlacementProp, 150, false)
|
||
|
SetEntityCollision(activePlacementProp, false, false)
|
||
|
SetEntityInvincible(activePlacementProp, true)
|
||
|
FreezeEntityPosition(activePlacementProp, true)
|
||
|
|
||
|
Bridge.Notify.ShowHelpText(type(placementText) == 'table' and table.concat(placementText))
|
||
|
|
||
|
local outLine = false
|
||
|
|
||
|
while activePlacementProp do
|
||
|
--local hit, _, coords, _, materialHash = lib.raycast.fromCamera(1, 4)
|
||
|
--local hit, _, coords, _, materialHash = lib.raycast.fromCamera(1, 4, nil)
|
||
|
local hit, _, coords, _, materialHash = lib.raycast.fromCamera(1, 4)
|
||
|
if hit then
|
||
|
if offset then
|
||
|
coords += offset
|
||
|
end
|
||
|
|
||
|
SetEntityCoords(activePlacementProp, coords.x, coords.y, coords.z, false, false, false, false)
|
||
|
local distCheck = #(GetEntityCoords(cache.ped) - coords)
|
||
|
SetEntityHeading(activePlacementProp, heading)
|
||
|
|
||
|
if snapToGround then
|
||
|
PlaceObjectOnGroundProperly(activePlacementProp)
|
||
|
end
|
||
|
|
||
|
if outLine then
|
||
|
outLine = false
|
||
|
SetEntityDrawOutline(activePlacementProp, false)
|
||
|
end
|
||
|
|
||
|
if (allowedMats and not allowedMats[materialHash]) or distCheck >= checkDist then
|
||
|
if not outLine then
|
||
|
outLine = true
|
||
|
SetEntityDrawOutline(activePlacementProp, true)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if IsControlJustReleased(0, 38) then
|
||
|
if not outLine and (not allowedMats or allowedMats[materialHash]) and distCheck < checkDist then
|
||
|
finishPlacing()
|
||
|
return coords, heading
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if IsControlJustReleased(0, 73) then
|
||
|
finishPlacing()
|
||
|
|
||
|
return nil, nil
|
||
|
end
|
||
|
|
||
|
if IsControlJustReleased(0, 14) then
|
||
|
heading = heading + 5
|
||
|
if heading > 360 then heading = 0.0 end
|
||
|
end
|
||
|
|
||
|
if IsControlJustReleased(0, 15) then
|
||
|
heading = heading - 5
|
||
|
if heading < 0 then
|
||
|
heading = 360.0
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
Placeable.StopPlacing = function()
|
||
|
if not activePlacementProp then return end
|
||
|
finishPlacing()
|
||
|
end
|
||
|
|
||
|
return Placeable
|
||
|
-- This is derrived and slightly altered from its creator and licensed under GPL-3.0 license Author:Zoo, the original is located here https://github.com/Renewed-Scripts/Renewed-Lib/tree/main
|