Fixed unit payloads, spread update load from mission update

This commit is contained in:
Pax1601 2023-02-14 22:48:17 +01:00
parent 0564b4b01f
commit 433b4bdf56
13 changed files with 1349 additions and 60 deletions

View File

@ -43,9 +43,9 @@ body {
#visibility-control-panel {
position: absolute;
left: 430px;
left: 230px;
height: 30px;
width: 110;
width: 150;
top: 10px;
z-index: 1000;
display: flex;

View File

@ -34,6 +34,7 @@ var climbButton: Button;
var descendButton: Button;
var userVisibilityButton: Button;
var aiVisibilityButton: Button;
var uncontrolledVisibilityButton: Button;
var weaponVisibilityButton: Button;
var deadVisibilityButton: Button;
@ -70,10 +71,12 @@ function setup() {
/* Visibility buttons */
userVisibilityButton = new Button("user-visibility-button", ["images/buttons/user-full.svg", "images/buttons/user-partial.svg", "images/buttons/user-none.svg", "images/buttons/user-hidden.svg"], () => { getUnitsManager().forceUpdate() });
aiVisibilityButton = new Button("ai-visibility-button", ["images/buttons/ai-full.svg", "images/buttons/ai-partial.svg", "images/buttons/ai-none.svg", "images/buttons/ai-hidden.svg"], () => { getUnitsManager().forceUpdate() });
uncontrolledVisibilityButton = new Button("uncontrolled-visibility-button", ["images/buttons/ai-full.svg", "images/buttons/ai-partial.svg", "images/buttons/ai-none.svg", "images/buttons/ai-hidden.svg"], () => { getUnitsManager().forceUpdate() });
weaponVisibilityButton = new Button("weapon-visibility-button", ["images/buttons/weapon-partial.svg", "images/buttons/weapon-none.svg", "images/buttons/weapon-hidden.svg"], () => { getUnitsManager().forceUpdate() });
deadVisibilityButton = new Button("dead-visibility-button", ["images/buttons/dead.svg", "images/buttons/dead-hidden.svg"], () => { getUnitsManager().forceUpdate() });
aiVisibilityButton.setState(1);
uncontrolledVisibilityButton.setState(3);
weaponVisibilityButton.setState(1);
deadVisibilityButton.setState(1);
@ -148,6 +151,7 @@ export function getVisibilitySettings() {
var visibility = {
user: "",
ai: "",
uncontrolled: "",
weapon: "",
dead: ""
};
@ -174,6 +178,17 @@ export function getVisibilitySettings() {
visibility.ai = "hidden"; break;
}
switch (uncontrolledVisibilityButton.getState()) {
case 0:
visibility.uncontrolled = "full"; break;
case 1:
visibility.uncontrolled = "partial"; break;
case 2:
visibility.uncontrolled = "none"; break;
case 3:
visibility.uncontrolled = "hidden"; break;
}
switch (weaponVisibilityButton.getState()) {
case 0:
visibility.weapon = "partial"; break;

View File

@ -2,7 +2,7 @@ import * as L from "leaflet"
import { getSelectionWheel, getSelectionScroll, getUnitsManager, getActiveCoalition, getMouseInfoPanel } from "..";
import { spawnAircraft, spawnGroundUnit, spawnSmoke } from "../dcs/dcs";
import { bearing, distance, zeroAppend } from "../other/utils";
import { payloadNames } from "../units/payloadNames";
import { aircraftDatabase, getAircraftLabelsByRole, getLoadoutsByName, getLoadoutNamesByRole } from "../units/aircraftDatabase";
import { unitTypes } from "../units/unitTypes";
import { BoxSelect } from "./boxselect";
@ -278,6 +278,23 @@ export class Map extends L.Map {
}
/* Spawning menus */
#aircraftSpawnMenu(e: SpawnEvent) {
var options = [
{ 'coalition': true, 'tooltip': 'CAP', 'src': 'spawnCAP.png', 'callback': () => this.#selectAircraft(e, "cap") },
{ 'coalition': true, 'tooltip': 'CAS', 'src': 'spawnCAS.png', 'callback': () => this.#selectAircraft(e, "cas") },
{ 'coalition': true, 'tooltip': 'Strike', 'src': 'spawnStrike.png', 'callback': () => this.#selectAircraft(e, "strike") },
{ 'coalition': true, 'tooltip': 'Recce', 'src': 'spawnStrike.png', 'callback': () => this.#selectAircraft(e, "reconnaissance") },
{ 'coalition': true, 'tooltip': 'Tanker', 'src': 'spawnTanker.png', 'callback': () => this.#selectAircraft(e, "tanker") },
{ 'coalition': true, 'tooltip': 'AWACS', 'src': 'spawnAWACS.png', 'callback': () => this.#selectAircraft(e, "awacs") },
{ 'coalition': true, 'tooltip': 'Drone', 'src': 'spawnDrone.png', 'callback': () => this.#selectAircraft(e, "drone") },
{ 'coalition': true, 'tooltip': 'Transport', 'src': 'spawnTransport.png', 'callback': () => this.#selectAircraft(e, "transport") },
]
if (e.airbaseName != null)
this.showSelectionScroll(e, "Spawn at " + e.airbaseName, options, () => {}, true);
else
this.showSelectionScroll(e, "Spawn air unit", options, () => {}, true);
}
#groundUnitSpawnMenu(e: SpawnEvent) {
var options = [
{'coalition': true, 'tooltip': 'Howitzer', 'src': 'spawnHowitzer.png', 'callback': () => this.#selectGroundUnit(e, "Howitzers")},
@ -308,50 +325,31 @@ export class Map extends L.Map {
}
#aircraftSpawnMenu(e: SpawnEvent) {
var options = [
{ 'coalition': true, 'tooltip': 'CAP', 'src': 'spawnCAP.png', 'callback': () => this.#selectAircraft(e, "CAP") },
{ 'coalition': true, 'tooltip': 'CAS', 'src': 'spawnCAS.png', 'callback': () => this.#selectAircraft(e, "CAS") },
{ 'coalition': true, 'tooltip': 'Tanker', 'src': 'spawnTanker.png', 'callback': () => this.#selectAircraft(e, "tanker") },
{ 'coalition': true, 'tooltip': 'AWACS', 'src': 'spawnAWACS.png', 'callback': () => this.#selectAircraft(e, "awacs") },
{ 'coalition': true, 'tooltip': 'Strike', 'src': 'spawnStrike.png', 'callback': () => this.#selectAircraft(e, "strike") },
{ 'coalition': true, 'tooltip': 'Drone', 'src': 'spawnDrone.png', 'callback': () => this.#selectAircraft(e, "drone") },
{ 'coalition': true, 'tooltip': 'Transport', 'src': 'spawnTransport.png', 'callback': () => this.#selectAircraft(e, "transport") },
]
if (e.airbaseName != null)
this.showSelectionScroll(e, "Spawn at " + e.airbaseName, options, () => {}, true);
else
this.showSelectionScroll(e, "Spawn air unit", options, () => {}, true);
}
/* Show unit selection for air units */
#selectAircraft(e: SpawnEvent, group: string) {
#selectAircraft(e: SpawnEvent, role: string) {
this.hideSelectionWheel();
this.hideSelectionScroll();
var options = unitTypes.air[group];
if (options != undefined)
options.sort();
else
options = [];
var options = getAircraftLabelsByRole(role);
this.showSelectionScroll(e, "Select aircraft", options, (unitType: string) => {
this.hideSelectionWheel();
this.hideSelectionScroll();
this.#unitSelectPayload(e, unitType);
this.#unitSelectPayload(e, unitType, role);
}, true);
}
/* Show weapon selection for air units */
#unitSelectPayload(e: SpawnEvent, unitType: string) {
#unitSelectPayload(e: SpawnEvent, unitType: string, role: string) {
this.hideSelectionWheel();
this.hideSelectionScroll();
var options = [];
options = payloadNames[unitType]
var options = getLoadoutNamesByRole(unitType, role);
//options = payloadNames[unitType]
if (options != undefined && options.length > 0) {
options.sort();
this.showSelectionScroll({x: e.x, y: e.y, latlng: e.latlng}, "Select loadout", options, (payloadName: string) => {
this.showSelectionScroll({x: e.x, y: e.y, latlng: e.latlng}, "Select loadout", options, (loadoutName: string) => {
this.hideSelectionWheel();
this.hideSelectionScroll();
spawnAircraft(unitType, e.latlng, getActiveCoalition(), payloadName, e.airbaseName);
var loadout = getLoadoutsByName(unitType, loadoutName);
spawnAircraft(unitType, e.latlng, getActiveCoalition(), loadout.code, e.airbaseName);
}, true);
}
else {

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -12,6 +12,7 @@ var pathIcon = new Icon({
export class Unit {
ID: number = -1;
AI: boolean = false;
formation: string = "";
name: string = "";
unitName: string = "";
@ -387,6 +388,9 @@ export class Unit {
export class AirUnit extends Unit {
getHidden() {
if (this.AI == false && getVisibilitySettings().uncontrolled === "hidden")
return true
if (this.alive)
{
if (this.flags.user && getVisibilitySettings().user === "hidden")
@ -421,6 +425,9 @@ export class GroundUnit extends Unit {
}
getHidden() {
if (this.AI == false && getVisibilitySettings().uncontrolled === "hidden")
return true
if (this.alive)
{
if (this.flags.user && getVisibilitySettings().user === "hidden")
@ -441,6 +448,9 @@ export class NavyUnit extends Unit {
}
getHidden() {
if (this.AI == false && getVisibilitySettings().uncontrolled === "hidden")
return true
if (this.alive)
{
if (this.flags.user && getVisibilitySettings().user === "hidden")

View File

@ -8,6 +8,7 @@ export interface MarkerOptions {
human: boolean
coalitionID: number
type: any
AI: boolean
}
export interface MarkerData {
@ -21,6 +22,7 @@ export class UnitMarker extends L.Marker {
#unitName: string
#name: string
#human: boolean
#AI: boolean
#alive: boolean = true
#selected: boolean = false
@ -29,6 +31,7 @@ export class UnitMarker extends L.Marker {
this.#unitName = options.unitName;
this.#name = options.name;
this.#human = options.human;
this.#AI = options.AI;
var symbol = new Symbol(this.#computeMarkerCode(options), { size: 25 });
var img = symbol.asCanvas().toDataURL('image/png');
@ -127,6 +130,10 @@ export class UnitMarker extends L.Marker {
return this.#human;
}
getAI() {
return this.#AI;
}
getAlive() {
return this.#alive;
}
@ -226,7 +233,7 @@ export class AirUnitMarker extends UnitMarker {
else if (!this.getAlive())
return "none";
else
return getVisibilitySettings().ai;
return this.getAI()? getVisibilitySettings().ai: getVisibilitySettings().uncontrolled;
}
}
@ -247,7 +254,7 @@ export class GroundUnitMarker extends UnitMarker {
else if (!this.getAlive())
return "none";
else
return getVisibilitySettings().ai;
return this.getAI()? getVisibilitySettings().ai: getVisibilitySettings().uncontrolled;
}
}
@ -259,7 +266,7 @@ export class NavyUnitMarker extends UnitMarker {
if (!this.getAlive())
return "none";
else
return getVisibilitySettings().ai;
return this.getAI()? getVisibilitySettings().ai: getVisibilitySettings().uncontrolled;
}
}

View File

@ -39,7 +39,8 @@ export class UnitsManager {
name: data.name,
human: data.human,
coalitionID: data.coalitionID,
type: data.type
type: data.type,
AI: data.AI
}
this.#units[ID] = new constructor(ID, options);
}
@ -112,10 +113,13 @@ export class UnitsManager {
this.deselectAllUnits();
for (let ID in this.#units)
{
var latlng = new LatLng(this.#units[ID].latitude, this.#units[ID].longitude);
if (bounds.contains(latlng))
if (this.#units[ID].getHidden() == false)
{
this.#units[ID].setSelected(true);
var latlng = new LatLng(this.#units[ID].latitude, this.#units[ID].longitude);
if (bounds.contains(latlng))
{
this.#units[ID].setSelected(true);
}
}
}
}

View File

@ -1,6 +1,7 @@
<div class="olympus-panel" id="visibility-control-panel">
<div class="olympus-button" id="user-visibility-button"></div>
<div class="olympus-button" id="ai-visibility-button"></div>
<div class="olympus-button" id="uncontrolled-visibility-button"></div>
<div class="olympus-button" id="weapon-visibility-button"></div>
<div class="olympus-button" id="dead-visibility-button"></div>
</div>

View File

@ -1,5 +1,8 @@
Olympus = {}
Olympus.groupIndex = 0
Olympus.groupStep = 40
function Olympus.notify(message, displayFor)
trigger.action.outText(message, displayFor)
end
@ -18,30 +21,44 @@ function Olympus.setMissionData(arg, time)
end
-- Units tactical data
-- TODO find some way to spread the load of getting this data (split)
local unitsData = {}
local startIndex = Olympus.groupIndex
local endIndex = startIndex + Olympus.groupStep
local index = 0
for groupName, gp in pairs(mist.DBs.groupsByName) do
if groupName ~= nil then
local group = Group.getByName(groupName)
if group ~= nil then
local controller = group:getController()
for index, unit in pairs(group:getUnits()) do
local table = {}
table["targets"] = {}
table["targets"]["visual"] = controller:getDetectedTargets(1)
table["targets"]["radar"] = controller:getDetectedTargets(4)
table["targets"]["rwr"] = controller:getDetectedTargets(16)
table["targets"]["other"] = controller:getDetectedTargets(2, 8, 32)
index = index + 1
if index > startIndex then
if groupName ~= nil then
local group = Group.getByName(groupName)
if group ~= nil then
local controller = group:getController()
for index, unit in pairs(group:getUnits()) do
local table = {}
table["targets"] = {}
table["targets"]["visual"] = controller:getDetectedTargets(1)
table["targets"]["radar"] = controller:getDetectedTargets(4)
table["targets"]["rwr"] = controller:getDetectedTargets(16)
table["targets"]["other"] = controller:getDetectedTargets(2, 8, 32)
table["hasTask"] = controller:hasTask()
table["ammo"] = unit:getAmmo()
table["fuel"] = unit:getFuel()
table["life"] = unit:getLife() / unit:getLife0()
unitsData[unit:getObjectID()] = table
table["hasTask"] = controller:hasTask()
table["ammo"] = unit:getAmmo()
table["fuel"] = unit:getFuel()
table["life"] = unit:getLife() / unit:getLife0()
unitsData[unit:getObjectID()] = table
end
end
end
end
if index == endIndex then
break
end
end
if index ~= endIndex then
Olympus.groupIndex = 0
else
Olympus.groupIndex = endIndex
end
-- Airbases data
@ -67,7 +84,7 @@ function Olympus.setMissionData(arg, time)
local command = "Olympus.missionData = " .. Olympus.serializeTable(missionData) .. "\n" .. "Olympus.OlympusDLL.setMissionData()"
net.dostring_in("export", command)
return time + 5
return time + 1
end
function Olympus.serializeTable(val, name, skipnewlines, depth)

View File

@ -12,6 +12,7 @@ public:
void appendCommand(Command* command);
void execute(lua_State* L);
void handleRequest(wstring key, json::value value);
private:
list<Command*> commands;

View File

@ -65,9 +65,9 @@ void Scheduler::handleRequest(wstring key, json::value value)
wstring unitName = unit->getUnitName();
json::value path = value[L"path"];
list<Coords> newPath;
for (auto const& e : path.as_object())
for (int i = 1; i <= path.as_object().size(); i++)
{
wstring WP = e.first;
wstring WP = to_wstring(i);
double lat = path[WP][L"lat"].as_double();
double lng = path[WP][L"lng"].as_double();
log(unitName + L" set path destination " + WP + L" (" + to_wstring(lat) + L", " + to_wstring(lng) + L")");

View File

@ -98,6 +98,7 @@ json::value Unit::json()
auto json = json::value::object();
json[L"alive"] = alive;
json[L"AI"] = AI;
json[L"name"] = json::value::string(name);
json[L"unitName"] = json::value::string(unitName);
json[L"groupName"] = json::value::string(groupName);