-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathAutoAssignTrailer.js
More file actions
356 lines (225 loc) · 14 KB
/
Copy pathAutoAssignTrailer.js
File metadata and controls
356 lines (225 loc) · 14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
// ==UserScript==
// @name Auto-Assign Trailes to Vehicles
// @namespace http://tampermonkey.net/
// @version 1.3.0
// @description weist automatisch Anhänger entsprechenden Zugfahrzeugen zu.
// @author Silberfighter
// @match https://www.leitstellenspiel.de/
// @icon https://www.google.com/s2/favicons?sz=64&domain=leitstellenspiel.de
// @require https://raw.githubusercontent.com/floflo3299/LSS-Scripts/main/HelperScripts/HelperMethods.js
// @require https://raw.githubusercontent.com/floflo3299/LSS-Scripts/main/HelperScripts/UTF16Converter.js
// @grant GM_addStyle
// ==/UserScript==
(async function() {
// createOrAssigneDropdownmenu("autoAssignTrailer", "auto Assign Trailer", autoBuyVehiclesFromStartScreen);
createOrAssigneDropdownmenu("autoAssignTrailer", "auto Assign Trailer", showOwnCustomOverlay);
var links = [
//------------ab hier bearbeiten
// Was das Skript macht: Es weißt einem aktuell noch nicht zugewiesenem Anhänger ein entsprechendes Fahrzeug eines festgelgenten Fahrzeug-Typens zu
// - es ignoriert Anhänger, welche bereits einem Zugfahrzeug zugewiesen ist
// - es weist einem Fahrzeug maximal ein Anhänger zu. Fahrzeuge, die bereits als Zugfahrzeug eingesetzt werden, werden nicht nochmal zugewiesen
// - es kontrolliert nicht, ob das Fahrzeug ein valides Zugfahrzeug vom entsprechenden Anhänger ist. Dies muss der Spieler sicherstellen
// - das Zugfahrzeug wird zufällig ausgewählt. Entsprechende Namensgebungen (z.B. Fahrzeug/Anhänger eine speziellen Gruppe) werden nicht berücksichtigt
// - wenn kein passendes Zugfahrzeug vorhanden ist (weil alle bereits als Zugfahrzeug hinterlegt sind oder gar keins vorhanden ist), wird dem Anhänger kein Zugfahrzeug zugewiesen
// Wie das Skript richtig eingestellt wird:
// erstelle einen Eintrag wie folgt und füge ihn unterhalb der markierten Zeile ein
// [Fahrzeug-ID des Anhängers, Fahrzeug-ID des Zugfahrzeug],
// dies sieht dann z.B. wie folgt aus:
//[102,123],
// 102 ist die ID des "Anh 7" vom THW, 123 die ID vom Fahrzeug-Typ "LKW 7 Lbw (WP)"
// diese Zeile sorgt also dafür, dass dem Anh 7 LKW 7 Lbw (WP) als Zugfahrzeug zugewiesen wird. Stelle sicher, dass hinter der eckigen Klammer ein Komma eingefügt wird
// Unterhalb befindet sich meine aktuelle Einstellung. Diese dient als Beispiel wie die Einträge schlussendlich aussehen sollen. Lösche oder passe die Einträge entsprechend deinen Vorlieben an bevor du das Skript ein erstes Mal ausführst.
// Der Text nach den beiden // dient lediglich als Hinweis, wofür die IDs stehen und hat keine Auswirkung
// WICHTIG: nachdem die Einträge entsprechend den eigenen Vorlieben abgeänder wurden und gespeichert wurde, lade Leitstellenspiel neu, damit die Änderungen übernommen werden
// Zum Aktivieren des automatischen Zuweisens öffnet das Menü "Skripte", welches sich auf der Hauptseite oben in der Reihe (wo auch eure Credits angezeigt werden) ganz links befindet.
// Wählt dort "auto Assign Trailer" oder in deutsch "automatisches Anhänger-Zuweisen" aus.
// Falls du mehrere Zugfahrzeuge für den selben Anhängertyp hast, füge den Eintrag mehrfach hinzu. Z.B. kann in der Wasserrettungswache das MZB-Anhänger sowohl vom GW-Taucher als auch GW-Wasserrettung gezogen werden.
// Falls beide Fahrzeuge als Zugfahrzeug infrage kommen sollen, füge es wie folgt hinzu:
// [70,63], //MZB GW-Taucher
// [70,64], //MZB GW-Wasserrettung
//---- AB HIER EINTRÄGE EINFÜGEN
[102,123], //Anh 7 LKW 7 Lbw (WP)
[101,100], //Anh SwPu MLW 4
[43,42], //BRmG R LKW K 9
[44,45], //Anh DLE MLW 5
[110,41], //NEA50 MzGW (FGr N)
[112,122], //NEA200 LKW 7 Lbw (E)
[70,63], //MZB GW-Taucher
[70,64], //MZB GW-Wasserrettung
[146,145], //Anh FüLa FüKomKw
[132,133], //Anh FKH Bt LKW
];
// setzte es auf true => wenn eine aktuelle Anhänger-Zugfahrzeug-Zuweisung nicht den obigen Einstellungen entspricht, wird es korrigiert.
// z.B. aktuell gibt es einen Anh DLE, welcher von einem GKW gezogen wird, die Einstellungen legen aber einen MLW 5 fest, wird dieser "Fehler" behoben und der MLW 5 wird zugewiesen
// setzte es auf false => "falsche" Zuweisungen werden nicht behoben
const fix_wrong_assignments = false;
//------------ab hier nur bearbeiten, wenn ihr wisst was ihr macht
var currentlyRunning = false
async function autoBuyVehiclesFromStartScreen(){
if (currentlyRunning){
return
}
currentlyRunning = true
/*if (!sessionStorage.c2Vehicles || JSON.parse(sessionStorage.c2Vehicles).lastUpdate < (new Date().getTime() - 5 * 1000 * 60) || JSON.parse(sessionStorage.c2Vehicles).userId != user_id) {
await fetchAllVehiclesV2().then(data => sessionStorage.setItem('c2Vehicles', JSON.stringify({ lastUpdate: new Date().getTime(), value: LZString.compressToUTF16(JSON.stringify(data)), userId: user_id })));
}
var allVehicles = JSON.parse(LZString.decompressFromUTF16(JSON.parse(sessionStorage.c2Vehicles).value));*/
var allVehicles = await fetchAllVehiclesV2()
console.log(`Anzahl Fahrzeuge: ${allVehicles.length}`)
document.getElementById(baseID + "WaitMessage").className = "hidden";
for(var i = 0; i < links.length; i++){
//check if it's the first entry for this trailerID and collect the possible tracting vehicles
let firstEntry = true;
let possibleVehicleIDs = [];
for(var j = 0; j < links.length; j++){
if(links[i][0] == links[j][0]){
possibleVehicleIDs = possibleVehicleIDs.concat([links[j][1]]);
if(j < i){
firstEntry = false;
}
}
}
if(!firstEntry){
continue;
}
let foundTrailers = allVehicles.filter(e => e.vehicle_type == links[i][0]);
//console.log(foundTrailers.length);
//console.log(links[i]);
let foundTowingVehicle = allVehicles.filter(e => possibleVehicleIDs.indexOf(e.vehicle_type) >= 0);
for(var n = 0; n < foundTrailers.length; n++){
messageText.innerText = (links.length-i)+" Fahrzeugtypen verbleibend\n"+(foundTrailers.length-n-1)+" Fahrzeuge vom aktuellen Typ verbleibend\nFENSTER NICHT SCHLIEßEN";
//if(foundTrailers[n].tractive_vehicle_id == null || vehicleAssignedMultipleTimes(allVehicles, foundTrailers[n].tractive_vehicle_id)){
if(foundTrailers[n].tractive_vehicle_id == null || foundTrailers[n].tractive_random == true ||
fix_wrong_assignments && foundTrailers[n].tractive_vehicle_id != null && foundTrailers[n].tractive_random == false && foundTowingVehicle.findIndex(obj => obj.id == foundTrailers[n].tractive_vehicle_id) == -1){ // wenn Zugfahrzeug existiert, aber kein zulässiges ist, weise es neu zu
//diese IF-Abfrage kann nur true sein, wenn ein Zugfahrzeug vorhanden ist, aber es kein zulässiges Zugfahrzeug ist
if(foundTrailers[n].tractive_vehicle_id != null){
let index = allVehicles.findIndex((obj => obj.id == foundTrailers[n].id));
allVehicles[index].tractive_vehicle_id = null
foundTrailers[n].tractive_vehicle_id = null
//perform API call in case, that there is no new available traction vehicle
await $.post("https://www.leitstellenspiel.de/vehicles/"+ foundTrailers[n].id, {"_method": "put", "authenticity_token": $("meta[name=csrf-token]").attr("content"), "vehicle[tractive_random]": 1, "vehicle[tractive_vehicle_id]": NaN});
await delay(500);
}
//console.log("assigne trailer" + foundTrailers[n].id);
let possibleVehicles = foundTowingVehicle.filter(e => e.building_id == foundTrailers[n].building_id);
for(j = 0; j < possibleVehicles.length; j++){
if(vehicleAlreadyAssigned(allVehicles, possibleVehicles[j].id) == 0){
//console.log(foundTrailers[n].id);
//console.log(possibleVehicles[j].id);
//console.log("");
await $.post("https://www.leitstellenspiel.de/vehicles/"+ foundTrailers[n].id, {"_method": "put", "authenticity_token": $("meta[name=csrf-token]").attr("content"), "vehicle[tractive_random]": 0, "vehicle[tractive_vehicle_id]": possibleVehicles[j].id});
await delay(500);
let index = allVehicles.findIndex((obj => obj.id == foundTrailers[n].id));
//console.log(allVehicles[index])
allVehicles[index].tractive_vehicle_id = possibleVehicles[j].id
//console.log(allVehicles[index])
break;
}
}
}//else{
// await $.post("https://www.leitstellenspiel.de/vehicles/"+ foundTrailers[n].id, {"_method": "put", "authenticity_token": $("meta[name=csrf-token]").attr("content"), "vehicle[tractive_random]": 0, "vehicle[tractive_vehicle_id]": foundTrailers[n].tractive_vehicle_id});
// await delay(500);
//}
//await $.post("https://www.leitstellenspiel.de/vehicles/"+ foundTrailers[n].id, {"_method": "put", "authenticity_token": $("meta[name=csrf-token]").attr("content"), "vehicle[tractive_random]": 1, "vehicle[tractive_vehicle_id]": null});
//await delay(500);
//}
//console.log("remaining Vehicle Types " + (links.length - i));
}
}
messageText.innerText = "Zuweisung abgeschlossen";
currentlyRunning = false
}
function vehicleAlreadyAssigned(allVehicles, vehicleId){
let assignedVehicles = allVehicles.filter(e => e.tractive_vehicle_id == Number(vehicleId));
//console.log(assignedVehicles.length)
//console.log("pot vehicle" + vehicleId)
return assignedVehicles.length > 0;
}
function vehicleAssignedMultipleTimes(allVehicles, vehicleId){
let assignedVehicles = allVehicles.filter(e => e.tractive_vehicle_id == Number(vehicleId));
return assignedVehicles.length > 1;
}
function delay(time) {
return new Promise(resolve => setTimeout(resolve, time));
}
let baseID = "TrailerAssignment";
// Create the overlay container
var overlayContainer = document.createElement('div');
overlayContainer.id = baseID + '-overlay-container';
document.body.appendChild(overlayContainer);
// Create the overlay content
var overlayContent = document.createElement('div');
overlayContent.id = baseID + '-overlay-content';
overlayContent.className = "modal-content";
overlayContainer.appendChild(overlayContent);
/* // Create the close button
var closeButton = document.createElement('button');
closeButton.className = "close";
closeButton.setAttribute("type","button");
closeButton.innerHTML = `<span aria-hidden="true">×</span>`;
closeButton.addEventListener('click', hideOwnCustomOverlay);
overlayContent.appendChild(closeButton);*/
// Customize the overlay styles
GM_addStyle(`
#`+baseID+`-overlay-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9999;
background-color: rgba(0, 0, 0, 0.5);
display: none;
}
#`+baseID+`-overlay-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 20px;
border-radius: 5px;
width: 650px;
height: 650px;
max-width: calc(100vw - 40px);
max-height: calc(100vh - 40px);
overflow-y: auto;
box-sizing: border-box;
}
`);
// Function to show the overlay
async function showOwnCustomOverlay() {
document.getElementById(baseID + "-overlay-container").style.display = 'block';
document.getElementById(baseID + "WaitMessage").className = "";
autoBuyVehiclesFromStartScreen()
}
// Function to hide the overlay
function hideOwnCustomOverlay() {
document.getElementById(baseID + "-overlay-container").style.display = 'none';
}
// Add event listener to toggle the overlay on click
overlayContainer.addEventListener('click', function(event) {
if (event.target === overlayContainer) {
overlayContainer.style.display = 'none';
//event.stopPropagation(); // Prevent the click event from propagating to underlying elements
}
});
overlayContent.innerHTML += `
<div class="overlay-header" id="`+baseID+`OverlayHeader">
<div>
<h1 id="`+baseID+`WaitMessage" class="hidden" style="color:red;"><center>BITTE WARTEN, Daten laden</center></h1>
</div>
</div>
<div class="overlay-body" id="`+baseID+`OverlayBody">
</div>
`;
let messageText;
if(document.getElementById(baseID+"MessagetTxt")){
messageText = document.getElementById(baseID+"MessagetTxt");
}else{
messageText = document.createElement("div");
messageText.id = baseID+"MessagetTxt";
messageText.style.fontSize = "x-large";
messageText.style.fontWeight = "900";
document.getElementById(baseID + "OverlayBody").appendChild(messageText);
}
})();