placeRoadblock
Definition
-- @/lua/ge/extensions/gameplay/police.lua:62
local function placeRoadblock(vehIds, pos, rot, placeData) -- places a roadblock
if type(vehIds) ~= 'table' or not pos or not rot then return end
placeData = placeData or {}
placeData.width = placeData.width or 10 -- available width of roadblock
placeData.angle = placeData.angle or 0 -- angle offset for vehicles, in degrees
tempFwd:set(vecY:rotated(rot)) -- expected to be parallel to the road
tempUp:set(map.surfaceNormal(pos, 1))
tempRight:setCross(tempFwd, tempUp)
local amount = #vehIds
local transforms = {}
local newQuat = quat()
for i, id in ipairs(vehIds) do
local veh = getObjectByID(id)
if veh then
tempPos:set(veh:getInitialNodePosition(veh:getRefNodeId())) -- position offset of vehicle
-- make sure that the available space is validated
local sideSeg = placeData.width / amount
local sideDisp = lerp(sideSeg * (i - 1), sideSeg * i, 0.5) - placeData.width * 0.5
local dir = sign2(sideDisp)
tempFwd:setScaled2(tempRight, sideDisp)
tempFwd2:setScaled2(tempRight, dir)
local angle = placeData.angle
if placeData.centerAngle and sideDisp == 0 then -- unique rotation for center object
angle = placeData.centerAngle
end
-- calculate transform and offset for vehicle
newQuat:setFromDir(tempFwd2, tempUp)
newQuat:setMul2(newQuat, quatFromAxisAngle(tempUp, math.rad(angle * dir)))
tempFwd2:set(tempPos:rotated(newQuat)) -- actual direction vector for vehicle
local x, y, z = -tempFwd2.x, -tempFwd2.y, tempPos.z
tempPos:setAdd2(pos, tempFwd) -- actual position for vehicle
tempPos:setAddXYZ(x, y, z) -- offset adjustment
table.insert(transforms, {pos = vec3(tempPos), rot = quat(newQuat)})
end
end
core_multiSpawn.placeGroup(vehIds, {ignoreAdjust = true, ignoreSafe = true, customTransforms = transforms}) -- delays some frames to improve performance
end
Callers
@/lua/ge/extensions/flowgraph/nodes/gameplay/traffic/pursuitRoadblock.lua
local params = {angle = self.pinIn.angle.value, centerAngle = self.pinIn.centerAngle.value, width = self.pinIn.width.value}
gameplay_police.placeRoadblock(vehIds, vec3(self.pinIn.pos.value), quat(self.pinIn.rot.value), params)
end
@/lua/ge/extensions/gameplay/police.lua
placeRoadblock(newVehIds, spawnData.pos, quatFromDir(spawnData.dir, spawnData.normal), {angle = angle, centerAngle = 0, width = rbWidth})
if newPropIds then
if newPropIds then
placeRoadblock(policePropIds, spawnData.pos - spawnData.dir * (maxPropLength * 0.5 + 2), quatFromDir(spawnData.dir, spawnData.normal), {angle = -90, width = rbWidth})
end