Scenery targets refactored and updated (#65)
Changed scenery targets to now be taken from trigger zones instead based on object ID
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 146 KiB |
@@ -38,23 +38,27 @@
|
||||
<p>
|
||||
Bridges, buildings or other type of targets that are baked into the map are awesome targets.<br>
|
||||
We wanted to make sure they were easily integrated in Spearhead.
|
||||
</p>
|
||||
|
||||
All you will need to do is right click on the scenery object you want added. <br>
|
||||
You will then get the option to "Assign as...", click this and you'll see a new trigger zone created. <br>
|
||||
It's best not to edit the triggerzone, but you can rename it however you like. <br>
|
||||
|
||||
Scenery objects will always be a specific "target" in the mission.
|
||||
<note-box type="info" title="Implementation details">
|
||||
Spearhead detects scenery targets by the trigger zone name. A zone named <strong>scenerytarget_[freeform]</strong> or
|
||||
<strong>scenerytargets</strong> (case-insensitive) will be scanned and any scenery objects that has the attribute "Buildings" inside the zone
|
||||
will be added as mission scenery targets.
|
||||
</note-box>
|
||||
|
||||
<p>
|
||||
Scenery targets are treated like mission targets: they are included in the mission completion calculation
|
||||
(their `IsAlive()` state is checked) and their state is persisted/updated when missions spawn or resume.
|
||||
</p>
|
||||
|
||||
<note-box type="warning" title="Changing IDs">
|
||||
Be aware that Object IDs can change when maps are updated and edited and the "Assign as..." action will have to be performed again.
|
||||
Due to Object IDs changing when maps are updated and edited the "Assign as..." functionality does not work for scenery targets.
|
||||
Hence the need to use trigger zones to define them.
|
||||
</note-box>
|
||||
|
||||
|
||||
<p>Here's two images showing how a bridge is added to a mission.</p>
|
||||
<img src="/img/bridge.png" style="max-height: 35remrem;"/>
|
||||
<img src="/img/bridge_added.png" style="max-height: 35remrem;"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
Binary file not shown.
@@ -979,6 +979,90 @@ do -- INIT DCS_UTIL
|
||||
|
||||
end
|
||||
|
||||
---@param zone SpearheadTriggerZone
|
||||
---@return Array<SpearheadSceneryObject> sceneryObjects
|
||||
function DCS_UTIL.getSceneryObjectsInZone(zone)
|
||||
---@type Volume
|
||||
local volume
|
||||
|
||||
if(zone.zone_type == "Cilinder") then
|
||||
local y = land.getHeight({ x = zone.location.x, y = zone.location.y })
|
||||
---@type Sphere
|
||||
local sphere = {
|
||||
id = world.VolumeType.SPHERE,
|
||||
params = {
|
||||
point = { x = zone.location.x, y = y, z = zone.location.y },
|
||||
radius = zone.radius
|
||||
}
|
||||
}
|
||||
volume = sphere
|
||||
else
|
||||
local minX = nil
|
||||
local maxX = nil
|
||||
local minZ = nil
|
||||
local maxZ = nil
|
||||
|
||||
for _, point in pairs(zone.verts) do
|
||||
if minX == nil or point.x < minX then
|
||||
minX = point.x
|
||||
end
|
||||
if maxX == nil or point.x > maxX then
|
||||
maxX = point.x
|
||||
end
|
||||
if minZ == nil or point.y < minZ then
|
||||
minZ = point.y
|
||||
end
|
||||
if maxZ == nil or point.y > maxZ then
|
||||
maxZ = point.y
|
||||
end
|
||||
end
|
||||
|
||||
if(minX == nil or maxX == nil or minZ == nil or maxZ == nil) then
|
||||
return {}
|
||||
end
|
||||
|
||||
---@type Vec3
|
||||
local min = {
|
||||
x = minX,
|
||||
y = land.getHeight({ x = minX, y = minZ }) - 100,
|
||||
z = minZ
|
||||
}
|
||||
|
||||
---@type Vec3
|
||||
local max = {
|
||||
x = maxX,
|
||||
y = land.getHeight({ x = maxX, y = maxZ }) + 500,
|
||||
z = maxZ
|
||||
}
|
||||
|
||||
---@type Box
|
||||
local box = {
|
||||
id = world.VolumeType.BOX,
|
||||
params = {
|
||||
min = min,
|
||||
max = max
|
||||
}
|
||||
}
|
||||
volume = box
|
||||
end
|
||||
|
||||
---@type Array<SpearheadSceneryObject>
|
||||
local sceneryObjects = {}
|
||||
|
||||
---@param object SceneryObject
|
||||
local onFound = function(object)
|
||||
if object and object:isExist() and
|
||||
object:hasAttribute("Buildings")
|
||||
then
|
||||
local obj = Spearhead.classes.stageClasses.Groups.SpearheadSceneryObject.New(object["id_"])
|
||||
table.insert(sceneryObjects, obj)
|
||||
end
|
||||
end
|
||||
|
||||
world.searchObjects(Object.Category.SCENERY, volume, onFound)
|
||||
return sceneryObjects
|
||||
end
|
||||
|
||||
---@param group Group
|
||||
function DCS_UTIL.getUnitTypeFromGroup(group)
|
||||
for _, unit in pairs(group:getUnits()) do
|
||||
|
||||
@@ -186,21 +186,15 @@ function Database.New(Logger)
|
||||
table.insert(self._tables.SupplyHubZones, zone_name)
|
||||
end
|
||||
|
||||
if zone_data.properties then
|
||||
for _, kvPair in pairs(zone_data.properties) do
|
||||
if kvPair.key and kvPair.key == "OBJECT ID" then
|
||||
local objectID = tonumber(kvPair.value)
|
||||
if objectID then
|
||||
local sceneryObject = Spearhead.classes.stageClasses.Groups.SpearheadSceneryObject.New(objectID)
|
||||
if lowered == "scenerytarget" or lowered == "scenerytargets" then
|
||||
local sceneryObjects = Spearhead.DcsUtil.getSceneryObjectsInZone(zone_data)
|
||||
for _, sceneryObject in pairs(sceneryObjects) do
|
||||
table.insert(self._tables.AllSceneryObjects, sceneryObject)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
self._logger:debug("initiated zone tables, continuing with descriptions")
|
||||
do --load markers
|
||||
if env.mission.drawings and env.mission.drawings.layers then
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user