@bf6mods/cli 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/README.md +70 -0
  2. package/dist/cli/index.js +541 -76
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/resources/prepare/bf6.d.ts +2 -0
  5. package/dist/resources/prepare/tsconfig.json +14 -15
  6. package/dist/resources/prepare/types/config.ts +139 -4
  7. package/dist/resources/templates/All/package.json +1 -1
  8. package/dist/resources/templates/Basic/bf6.config.ts +5 -1
  9. package/package.json +48 -41
  10. package/dist/resources/templates/AcePursuit/src/index.ts +0 -3421
  11. package/dist/resources/templates/AcePursuit/src/levels.tscn +0 -6922
  12. package/dist/resources/templates/AcePursuit/src/strings.json +0 -191
  13. package/dist/resources/templates/All/bf6.config.ts +0 -6
  14. package/dist/resources/templates/BombSquad/src/index.ts +0 -3683
  15. package/dist/resources/templates/BombSquad/src/levels.tscn +0 -3212
  16. package/dist/resources/templates/BombSquad/src/strings.json +0 -123
  17. package/dist/resources/templates/Exfil/src/index.ts +0 -2393
  18. package/dist/resources/templates/Exfil/src/levels.tscn +0 -5600
  19. package/dist/resources/templates/Exfil/src/strings.json +0 -185
  20. package/dist/resources/templates/Vertigo/src/index.ts +0 -1948
  21. package/dist/resources/templates/Vertigo/src/levels.tscn +0 -6387
  22. package/dist/resources/templates/Vertigo/src/strings.json +0 -308
  23. /package/dist/resources/templates/{AcePursuit/src/config.json → AcePursuit.json} +0 -0
  24. /package/dist/resources/templates/{BombSquad/src/config.json → BombSquad.json} +0 -0
  25. /package/dist/resources/templates/{Exfil/src/config.json → Exfil.json} +0 -0
  26. /package/dist/resources/templates/{Vertigo/src/config.json → Vertigo.json} +0 -0
@@ -1,1948 +0,0 @@
1
-
2
- const debugJSPlayer = true;
3
- const debugTeam: boolean = false; // DISABLE BEFORE SHARING
4
-
5
- //////////////////// TEST VARIABLES ///////////////////
6
- const CaptureTimeRequired = 20;
7
- let CaptureProgress = 0;
8
-
9
- var CaptureM: CaptureManager;
10
- let HasBeenCaptured = false;
11
-
12
- enum CaptureState {
13
- Idle,
14
- Capturing,
15
- Contested,
16
- Victory
17
- }
18
-
19
- let CurrentCaptureState: CaptureState = CaptureState.Idle;
20
-
21
- var NormalizedGameTime = 0;
22
- var GameModeProgressThresholds = [0.05, 0.2, 0.4, 0.65, 0.9, 1];
23
-
24
- //////////////////////// Starting HQ ObjId ////////////////////////
25
- let Team1CurrentHQ = 1;
26
- let Team2CurrentHQ = 4;
27
- let Team3CurrentHQ = 7;
28
- let Team4CurrentHQ = 10;
29
-
30
- //////////////////// CHECKPOINT VFX VECTORS /////////////////////////
31
- let T1CP1L: mod.Vector = mod.CreateVector(9.7, 230.5, 107.5);
32
- let T1CP1R: mod.Vector = mod.CreateVector(20, 230.5, 107.5);
33
- let T1CP2L: mod.Vector = mod.CreateVector(111, 312.4, 101);
34
- let T1CP2R: mod.Vector = mod.CreateVector(111.3, 312.5, 112.4);
35
-
36
- let T2CP1L: mod.Vector = mod.CreateVector(96.8, 230.5, 114.2);
37
- let T2CP1R: mod.Vector = mod.CreateVector(96.8, 230.5, 125.7);
38
- let T2CP2L: mod.Vector = mod.CreateVector(111.6, 312.4, 197.6);
39
- let T2CP2R: mod.Vector = mod.CreateVector(111.4, 312.4, 209.2);
40
-
41
- let T3CP1L: mod.Vector = mod.CreateVector(89.6, 230.5, 201.8);
42
- let T3CP1R: mod.Vector = mod.CreateVector(78.1, 230.5, 201.8);
43
- let T3CP2L: mod.Vector = mod.CreateVector(-12.8, 312.4, 206.8);
44
- let T3CP2R: mod.Vector = mod.CreateVector(-12.8, 312.4, 195.3);
45
-
46
- let T4CP1L: mod.Vector = mod.CreateVector(2.1, 230.5, 195);
47
- let T4CP1R: mod.Vector = mod.CreateVector(2.1, 230.5, 183.5);
48
- let T4CP2L: mod.Vector = mod.CreateVector(-12.4, 312.4, 111);
49
- let T4CP2R: mod.Vector = mod.CreateVector(-12.4, 312.4, 99.5);
50
-
51
- let CapturePointLocation: mod.Vector = mod.CreateVector(49, 327, 153);
52
- ///////////////////////////////////////////////
53
- let team1Count: number = 0;
54
- let team2Count: number = 0;
55
- let team3Count: number = 0;
56
- let team4Count: number = 0;
57
-
58
- let gameOver = false;
59
- let vehicleSpawners: number[] = [];
60
- let vehicleListTable: mod.VehicleList[] = [mod.VehicleList.Abrams, mod.VehicleList.Eurocopter, mod.VehicleList.Quadbike];
61
- let weaponSpawners: any[] = [];
62
-
63
-
64
- let capturePointObjective: mod.CapturePoint;
65
-
66
- let hazardSpawn1: number;
67
- let hazardSpawn2: number;
68
- let hazardSpawn3: number;
69
- let hazards: mod.VehicleSpawner[] = [];
70
- let hazardpt1_1_1: mod.Vector = mod.CreateVector(-30.885, 132.6, -37.858);
71
- let hazardpt1_1_2: mod.Vector = mod.CreateVector(-32.693, 134.875, -29.312);
72
- let hazardpt1_1_3: mod.Vector = mod.CreateVector(-38, 136.05, -24.58);
73
- let hazardpt1_2_1: mod.Vector = mod.CreateVector(-89.573, 158, -3.817);
74
- let hazardpt1_2_2: mod.Vector = mod.CreateVector(-113.955, 161.979, -12.315);
75
-
76
- let hazardpt2_1_1: mod.Vector = mod.CreateVector(-103.183, 131.075, -73.018);
77
- let hazardpt2_1_2: mod.Vector = mod.CreateVector(-94.65, 133.783, -79.229);
78
- let hazardpt2_1_3: mod.Vector = mod.CreateVector(-88.113, 134.654, -79.229);
79
- let hazardpt2_2_1: mod.Vector = mod.CreateVector(-39.375, 152.541, -76.201);
80
- let hazardpt2_2_2: mod.Vector = mod.CreateVector(-45.539, 162.643, -30.805);
81
- let hazardpt2_2_3: mod.Vector = mod.CreateVector(-42.494, 165.173, -15.803);
82
- let hazardpt2_2_4: mod.Vector = mod.CreateVector(-50.072, 169.131, -1.931);
83
-
84
- let hazardpt1Cooldown: number = 0;
85
-
86
- let heliTrigger1Spawner: mod.Vector = mod.CreateVector(-73.5, 170, -67.4);
87
- let heliTrigger2Spawner: mod.Vector = mod.CreateVector(-55.5, 170, -70.4);
88
- let heliTrigger3Spawner: mod.Vector = mod.CreateVector(-85.3, 170, -67.5);
89
- let victoryPt: mod.Vector = mod.CreateVector(-86, 176, -43.5);
90
- let lobbySpawnPt: mod.Vector = mod.CreateVector(52, 307.5, 17);
91
-
92
- let initialPlayerCount: number = 0;
93
- let combatCountdownStarted = false;
94
- let combatStartDelayRemaining = 30;
95
- let combatStarted = false;
96
-
97
- let deathYPos: number = 160;
98
- let messageTime: number = 0;
99
-
100
- // UI
101
- let headerWidget: mod.UIWidget;
102
-
103
- type Widget= mod.UIWidget;
104
-
105
- const onlyUpTeleportID: number = 1;
106
- const quadBikeSpawnerInteract1: number = 8;
107
- const quadBikeSpawnerInteract2: number = 17;
108
- const quadBikeSpawnerInteract3: number = 18;
109
- const quadBikeSpawnerInteract4: number = 19;
110
-
111
- const ammoResupplyID: number = 11;
112
- const team1HQ2Teleport: number = 12;
113
- const team1Checkpoint1ID: number = 13;
114
- const team2Checkpoint1ID: number = 14;
115
- const team4Checkpoint1ID: number = 15;
116
- const team3Checkpoint1ID: number = 16;
117
- const team2HQ2Teleport: number = 21;
118
- const team3HQ2Teleport: number = 22;
119
- const team4HQ2Teleport: number = 23;
120
- const startInteractPointID: number = 25;
121
- const minimumInitialPlayerCount: number = 4;
122
- const BLACKCOLOR: number[] = [1, 1, 1];
123
- const REDCOLOR: number[] = [1, 0, 0];
124
-
125
- const team1HQ1: number = 1;
126
- const team2HQ1: number = 2;
127
- const team3HQ1: number = 3;
128
- const team4HQ1: number = 4;
129
-
130
- const team1HQ2: number = 5;
131
- const team2HQ2: number = 8;
132
- const team3HQ2: number = 7;
133
- const team4HQ2: number = 6;
134
-
135
- const messageRemainTime: number = 2;
136
-
137
- let vfxidx = 0;
138
-
139
- const AlarmSFX = mod.RuntimeSpawn_Common.SFX_Alarm;
140
-
141
- const vfxtest = [
142
- mod.RuntimeSpawn_Common.FX_BASE_Fire_L,
143
- mod.RuntimeSpawn_Common.FX_BASE_Fire_M,
144
- mod.RuntimeSpawn_Common.FX_BASE_Fire_M_NoSmoke,
145
- mod.RuntimeSpawn_Common.FX_BASE_Fire_Oil_Medium,
146
- mod.RuntimeSpawn_Common.FX_BASE_Fire_S,
147
- mod.RuntimeSpawn_Common.FX_BASE_Fire_S_NoSmoke,
148
- mod.RuntimeSpawn_Common.FX_BASE_Fire_XL,
149
- ]
150
-
151
- export function OngoingGlobal() {
152
- NormalizedGameTime = mod.GetMatchTimeElapsed() / mod.GetRoundTime()
153
- //CaptureM.CheckGameModeProgressThreshold();
154
- //console.log(`Elapsed Time: ${mod.GetMatchTimeElapsed()} Remaining Time: ${mod.GetMatchTimeRemaining()} Normalized: ${RemainingTime}`);
155
- }
156
-
157
- ///////////////////// Custom Capture Point //////////////////////////////
158
-
159
- export function OnPlayerEnterAreaTrigger(eventPlayer: mod.Player, eventAreaTrigger: mod.AreaTrigger) {
160
- //CapturePoint
161
- if (mod.GetObjId(eventAreaTrigger) === 21) {
162
- CaptureM.AddPlayerToList(eventPlayer);
163
-
164
- //Team 1 CheckPoints
165
- } else if (mod.GetObjId(eventAreaTrigger) === 22 && mod.GetObjId(mod.GetTeam(eventPlayer)) === 1) {
166
- if (Team1CurrentHQ === 1) {
167
- console.log("Activating Team 1 CheckPoint 1");
168
- mod.EnableHQ(mod.GetHQ(1), false);
169
- mod.EnableHQ(mod.GetHQ(2), true);
170
- MessageAllUI(MakeMessage(mod.stringkeys.team1Checkpoint1Activated), BLACKCOLOR);
171
- Team1CurrentHQ = 2;
172
- } else {
173
- console.log("Check point already active");
174
- }
175
- } else if (mod.GetObjId(eventAreaTrigger) === 23 && mod.GetObjId(mod.GetTeam(eventPlayer)) === 1) {
176
- if (Team1CurrentHQ === 1 || Team1CurrentHQ === 2) {
177
- console.log("Activating Team 1 CheckPoint 2");
178
- mod.EnableHQ(mod.GetHQ(1), false);
179
- mod.EnableHQ(mod.GetHQ(2), false);
180
- mod.EnableHQ(mod.GetHQ(3), true);
181
- MessageAllUI(MakeMessage(mod.stringkeys.team1Checkpoint2Activated), BLACKCOLOR);
182
- Team1CurrentHQ = 3;
183
- } else {
184
- console.log("Check point already active");
185
- }
186
-
187
- //Team 2 CheckPoints
188
- } else if (mod.GetObjId(eventAreaTrigger) === 24 && mod.GetObjId(mod.GetTeam(eventPlayer)) === 2) {
189
- if (Team2CurrentHQ === 4) {
190
- console.log("Activating Team 2 CheckPoint 1");
191
- mod.EnableHQ(mod.GetHQ(4), false);
192
- mod.EnableHQ(mod.GetHQ(5), true);
193
- MessageAllUI(MakeMessage(mod.stringkeys.team2Checkpoint1Activated), BLACKCOLOR);
194
- Team2CurrentHQ = 5;
195
- } else {
196
- console.log("Check point already active");
197
- }
198
- } else if (mod.GetObjId(eventAreaTrigger) === 25 && mod.GetObjId(mod.GetTeam(eventPlayer)) === 2) {
199
- if (Team2CurrentHQ === 4 || Team2CurrentHQ === 5) {
200
- console.log("Activating Team 2 CheckPoint 2");
201
- mod.EnableHQ(mod.GetHQ(4), false);
202
- mod.EnableHQ(mod.GetHQ(5), false);
203
- mod.EnableHQ(mod.GetHQ(6), true);
204
- MessageAllUI(MakeMessage(mod.stringkeys.team2Checkpoint2Activated), BLACKCOLOR);
205
- Team2CurrentHQ = 6;
206
- } else {
207
- console.log("Check point already active");
208
- }
209
-
210
- //Team 3 CheckPoints
211
- } else if (mod.GetObjId(eventAreaTrigger) === 26 && mod.GetObjId(mod.GetTeam(eventPlayer)) === 3) {
212
- if (Team3CurrentHQ === 7) {
213
- console.log("Activating Team 3 CheckPoint 1");
214
- mod.EnableHQ(mod.GetHQ(7), false);
215
- mod.EnableHQ(mod.GetHQ(8), true);
216
- MessageAllUI(MakeMessage(mod.stringkeys.team3Checkpoint1Activated), BLACKCOLOR);
217
- Team3CurrentHQ = 8;
218
- } else {
219
- console.log("Check point already active");
220
- }
221
-
222
- } else if (mod.GetObjId(eventAreaTrigger) === 27 && mod.GetObjId(mod.GetTeam(eventPlayer)) === 3) {
223
- if (Team3CurrentHQ === 7 || Team3CurrentHQ === 8) {
224
- console.log("Activating Team 3 CheckPoint 2");
225
- mod.EnableHQ(mod.GetHQ(7), false);
226
- mod.EnableHQ(mod.GetHQ(8), false);
227
- mod.EnableHQ(mod.GetHQ(9), true);
228
- MessageAllUI(MakeMessage(mod.stringkeys.team3Checkpoint2Activated), BLACKCOLOR);
229
- Team3CurrentHQ = 9;
230
- } else {
231
- console.log("Check point already active");
232
- }
233
-
234
- //Team 4 CheckPoints
235
- } else if (mod.GetObjId(eventAreaTrigger) === 28 && mod.GetObjId(mod.GetTeam(eventPlayer)) === 4) {
236
- if (Team4CurrentHQ === 10) {
237
- console.log("Activating Team 4 CheckPoint 1");
238
- mod.EnableHQ(mod.GetHQ(10), false);
239
- mod.EnableHQ(mod.GetHQ(11), true);
240
- MessageAllUI(MakeMessage(mod.stringkeys.team4Checkpoint1Activated), BLACKCOLOR);
241
- Team4CurrentHQ = 11;
242
- } else {
243
- console.log("Check point already active");
244
- }
245
-
246
- } else if (mod.GetObjId(eventAreaTrigger) === 29 && mod.GetObjId(mod.GetTeam(eventPlayer)) === 4) {
247
- if (Team4CurrentHQ === 10 || Team4CurrentHQ === 11) {
248
- console.log("Activating Team 4 CheckPoint 2");
249
- mod.EnableHQ(mod.GetHQ(10), false);
250
- mod.EnableHQ(mod.GetHQ(11), false);
251
- mod.EnableHQ(mod.GetHQ(12), true);
252
- MessageAllUI(MakeMessage(mod.stringkeys.team4Checkpoint2Activated), BLACKCOLOR);
253
- Team4CurrentHQ = 12;
254
- } else {
255
- console.log("Check point already active");
256
- }
257
- }
258
- }
259
-
260
-
261
- export function OnPlayerExitAreaTrigger(eventPlayer: mod.Player, eventAreaTrigger: mod.AreaTrigger) {
262
- if (mod.GetObjId(eventAreaTrigger) === 21) {
263
- CaptureM.RemovePlayerFromList(eventPlayer);
264
- }
265
- }
266
-
267
- class CaptureManager {
268
- CaptureProgress = CaptureTimeRequired;
269
- CurrentState: CaptureState = CaptureState.Idle;
270
- IsBeingCaptured = false;
271
- CurrentTeam: number | null = null;
272
- CapturingTeam: number | null = null;
273
- CollidingPlayers: mod.Player[] = [];
274
-
275
- async StartCaptureTimer() {
276
- while (!HasBeenCaptured) {
277
- const teamsPresent = this.GetUniqueTeams(this.CollidingPlayers);
278
- this.CheckGameModeProgressThreshold();
279
-
280
- if (teamsPresent.length === 0) {
281
- CurrentCaptureState = CaptureState.Idle;
282
-
283
- } else if (teamsPresent.length === 1) {
284
- this.CurrentTeam = mod.GetObjId(mod.GetTeam(this.CollidingPlayers[0]));
285
- console.log("CurrentTeam set: " + this.CurrentTeam);
286
-
287
- if (this.CapturingTeam === null) {
288
- this.CapturingTeam = this.CurrentTeam;
289
- CurrentCaptureState = CaptureState.Capturing;
290
- } else if (this.CapturingTeam === this.CurrentTeam) {
291
- CurrentCaptureState = CaptureState.Capturing;
292
- } else {
293
- this.CapturingTeam = this.CurrentTeam;
294
- CaptureProgress = CaptureTimeRequired;
295
- CurrentCaptureState = CaptureState.Capturing;
296
- }
297
-
298
- } else {
299
- CurrentCaptureState = CaptureState.Contested;
300
- }
301
-
302
- switch (CurrentCaptureState) {
303
- case CaptureState.Idle:
304
- CaptureProgress = CaptureTimeRequired;
305
- this.CapturingTeam = null;
306
- this.IsBeingCaptured = false;
307
- //this.ToggleAlarmSFX();
308
- //console.log("IDLE, time left: " + CaptureProgress);
309
- break;
310
-
311
- case CaptureState.Capturing:
312
- CaptureProgress--;
313
- this.IsBeingCaptured = true;
314
- //this.ToggleAlarmSFX();
315
- //this.CurrentTeam = mod.GetTeam(this.CollidingPlayers[0]);
316
- //console.log("CAPTURING, time left: " + CaptureProgress);
317
- MessageAllUI(MakeMessage(mod.stringkeys.CaptureTimerCountdown, this.CurrentTeam, CaptureProgress), REDCOLOR);
318
- break;
319
-
320
- case CaptureState.Contested:
321
- //console.log("CONTESTED, time left: " + CaptureProgress);
322
- MessageAllUI(MakeMessage(mod.stringkeys.CaptureTimerInterrupted), REDCOLOR);
323
- break;
324
- }
325
-
326
- if (CaptureProgress <= 0) {
327
- CurrentCaptureState = CaptureState.Victory;
328
- HasBeenCaptured = true;
329
- console.log("VICTORY");
330
- this.TriggerVictory(mod.GetTeam(this.CollidingPlayers[0]));
331
- //this.TriggerVictory(this.CollidingPlayers[0]);
332
- }
333
-
334
- //console.log("Tick 1s");
335
- await mod.Wait(1);
336
- }
337
- }
338
-
339
- async CheckGameModeProgressThreshold() {
340
- for (let i = 0; i < GameModeProgressThresholds.length; i++) {
341
- if (NormalizedGameTime >= GameModeProgressThresholds[i]) {
342
- await mod.Wait(0.25);
343
- console.log("TRUE, removing value: " + GameModeProgressThresholds[i]);
344
- mod.DisablePlayerJoin();
345
- GameModeProgressThresholds.splice(i, 1);
346
- i--;
347
- //console.log(GameModeProgressThresholds.length);
348
- }
349
- }
350
- }
351
-
352
- // async StartLateJoinTimer() {
353
- // while (!HasBeenCaptured)
354
- // console.log("Tick 0.5s");
355
- // await mod.Wait(0.5);
356
- // }
357
-
358
- ToggleAlarmSFX() {
359
- var StartSFX = mod.SpawnObject(AlarmSFX, mod.CreateVector(0, 0, 0), mod.CreateVector(0, 0, 0), mod.CreateVector(0, 0, 0));
360
- if (this.IsBeingCaptured) {
361
- mod.EnableSFX(StartSFX, true);
362
- mod.PlaySound(StartSFX, 80, mod.GetTeam(1));
363
- mod.PlaySound(StartSFX, 80, mod.GetTeam(2));
364
- mod.PlaySound(StartSFX, 80, mod.GetTeam(3));
365
- mod.PlaySound(StartSFX, 80, mod.GetTeam(4));
366
- } else {
367
- mod.EnableSFX(StartSFX, false);
368
- }
369
-
370
- }
371
-
372
- AddPlayerToList(eventPlayer: mod.Player) {
373
- this.CollidingPlayers.push(eventPlayer);
374
- //console.log("New list of colliding players: " + this.CollidingPlayers);
375
- //console.log("Obj Id: " + mod.GetObjId(eventPlayer));
376
- }
377
-
378
- RemovePlayerFromList(eventPlayer: mod.Player) {
379
- this.CollidingPlayers = this.CollidingPlayers.filter(player => mod.GetObjId(player) !== mod.GetObjId(eventPlayer));
380
- //console.log("Colliding player ids after removal: " + this.CollidingPlayers);
381
- //console.log("Obj Id: " + mod.GetObjId(eventPlayer));
382
- }
383
-
384
- GetUniqueTeams(players: mod.Player[]): number[] {
385
- const teamSet = new Set<number>();
386
-
387
- for (const player of players) {
388
- const teamId = mod.GetObjId(mod.GetTeam(player));
389
- //console.log("Team Id is: " + teamId);
390
- teamSet.add(teamId);
391
- }
392
-
393
- return Array.from(teamSet);
394
- }
395
-
396
- TriggerVictory(eventTeam: mod.Team) {
397
- console.log("Captured by Team: " + mod.GetObjId(eventTeam));
398
- MessageAllUI(MakeMessage(mod.stringkeys.VictoryMessage, mod.GetObjId(eventTeam)), REDCOLOR);
399
- mod.EndGameMode(eventTeam);
400
- this.CleanUpCustomUI();
401
-
402
- // if (mod.GetObjId(eventTeam) >= 3) {
403
- // console.log("DEBUG Captured by Team: " + mod.GetObjId(eventTeam));
404
- // MessageAllUI(MakeMessage(mod.stringkeys.VictoryMessage, mod.GetObjId(eventTeam)), REDCOLOR);
405
- // mod.EndGameMode(mod.GetTeam(1));
406
- // } else {
407
- // console.log("Captured by Team: " + mod.GetObjId(eventTeam));
408
- // MessageAllUI(MakeMessage(mod.stringkeys.VictoryMessage, mod.GetObjId(eventTeam)), REDCOLOR);
409
- // mod.EndGameMode(eventTeam);
410
- // }
411
- }
412
-
413
- async CleanUpCustomUI() {
414
- await mod.Wait(2);
415
- mod.DeleteAllUIWidgets();
416
- }
417
-
418
- }
419
-
420
- /////////////////////////////////////////////////////////////////////////
421
-
422
- // Use this as your "ready"/game startup function
423
- export async function OnGameModeStarted() {
424
- console.log("Vertigo Game Mode Started!!!");
425
- mod.SetFriendlyFire(false);
426
- CaptureM = new CaptureManager();
427
- mod.EnableAreaTrigger(mod.GetAreaTrigger(21), true);
428
-
429
- mod.SetAIToHumanDamageModifier(0.1);
430
-
431
- // HQs
432
- mod.EnableHQ(mod.GetHQ(2), false);
433
- mod.EnableHQ(mod.GetHQ(3), false);
434
- mod.EnableHQ(mod.GetHQ(5), false);
435
- mod.EnableHQ(mod.GetHQ(6), false);
436
- mod.EnableHQ(mod.GetHQ(8), false);
437
- mod.EnableHQ(mod.GetHQ(9), false);
438
- mod.EnableHQ(mod.GetHQ(11), false);
439
- mod.EnableHQ(mod.GetHQ(12), false);
440
-
441
- // Check point VFXs
442
- let T1CP1LVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T1CP1L, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
443
- let T1CP1RVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T1CP1R, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
444
- let T1CP2LVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T1CP2L, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
445
- let T1CP2RVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T1CP2R, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
446
- mod.EnableVFX(T1CP1LVFX, true);
447
- mod.EnableVFX(T1CP1RVFX, true);
448
- mod.EnableVFX(T1CP2LVFX, true);
449
- mod.EnableVFX(T1CP2RVFX, true);
450
-
451
- let T2CP1LVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T2CP1L, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
452
- let T2CP1RVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T2CP1R, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
453
- let T2CP2LVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T2CP2L, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
454
- let T2CP2RVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T2CP2R, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
455
- mod.EnableVFX(T2CP1LVFX, true);
456
- mod.EnableVFX(T2CP1RVFX, true);
457
- mod.EnableVFX(T2CP2LVFX, true);
458
- mod.EnableVFX(T2CP2RVFX, true);
459
-
460
- let T3CP1LVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T3CP1L, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
461
- let T3CP1RVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T3CP1R, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
462
- let T3CP2LVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T3CP2L, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
463
- let T3CP2RVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T3CP2R, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
464
- mod.EnableVFX(T3CP1LVFX, true);
465
- mod.EnableVFX(T3CP1RVFX, true);
466
- mod.EnableVFX(T3CP2LVFX, true);
467
- mod.EnableVFX(T3CP2RVFX, true);
468
-
469
- let T4CP1LVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T4CP1L, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
470
- let T4CP1RVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T4CP1R, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
471
- let T4CP2LVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T4CP2L, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
472
- let T4CP2RVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Sparks, T4CP2R, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
473
- mod.EnableVFX(T4CP1LVFX, true);
474
- mod.EnableVFX(T4CP1RVFX, true);
475
- mod.EnableVFX(T4CP2LVFX, true);
476
- mod.EnableVFX(T4CP2RVFX, true);
477
-
478
- let CPVFX = mod.SpawnObject(mod.RuntimeSpawn_Common.FX_Granite_Strike_Smoke_Marker_Green, CapturePointLocation, mod.CreateVector(0, 0, 0), mod.CreateVector(1, 1, 1));
479
- mod.EnableVFX(CPVFX, true);
480
-
481
-
482
- let startGameWorldIcon: mod.WorldIcon = mod.GetWorldIcon(25);
483
- mod.EnableWorldIconImage(startGameWorldIcon, true);
484
- mod.SetWorldIconText(startGameWorldIcon, MakeMessage(mod.stringkeys.worldIconStartGame));
485
- mod.EnableWorldIconText(startGameWorldIcon, true);
486
-
487
- mod.SetWorldIconText(mod.GetWorldIcon(1), MakeMessage(mod.stringkeys.corridorTeleport));
488
- mod.SetWorldIconText(mod.GetWorldIcon(3), MakeMessage(mod.stringkeys.topTeleport));
489
- mod.SetWorldIconText(mod.GetWorldIcon(12), MakeMessage(mod.stringkeys.Team1HQ2Teleport));
490
- mod.SetWorldIconText(mod.GetWorldIcon(21), MakeMessage(mod.stringkeys.Team2HQ2Teleport));
491
- mod.SetWorldIconText(mod.GetWorldIcon(22), MakeMessage(mod.stringkeys.Team3HQ2Teleport));
492
- mod.SetWorldIconText(mod.GetWorldIcon(23), MakeMessage(mod.stringkeys.Team4HQ2Teleport));
493
-
494
- mod.SetWorldIconText(mod.GetWorldIcon(26), MakeMessage(mod.stringkeys.GetAssaultRifle));
495
- mod.SetWorldIconText(mod.GetWorldIcon(27), MakeMessage(mod.stringkeys.GetAssaultRifle));
496
- mod.SetWorldIconText(mod.GetWorldIcon(28), MakeMessage(mod.stringkeys.GetAssaultRifle));
497
- mod.SetWorldIconText(mod.GetWorldIcon(29), MakeMessage(mod.stringkeys.GetAssaultRifle));
498
-
499
- mod.SetWorldIconText(mod.GetWorldIcon(team1Checkpoint1ID), MakeMessage(mod.stringkeys.Team1Checkpoint));
500
- mod.SetWorldIconText(mod.GetWorldIcon(team2Checkpoint1ID), MakeMessage(mod.stringkeys.Team2Checkpoint));
501
- mod.SetWorldIconText(mod.GetWorldIcon(team3Checkpoint1ID), MakeMessage(mod.stringkeys.Team3Checkpoint));
502
- mod.SetWorldIconText(mod.GetWorldIcon(team4Checkpoint1ID), MakeMessage(mod.stringkeys.Team4Checkpoint));
503
-
504
- capturePointObjective = mod.GetCapturePoint(1);
505
- mod.EnableGameModeObjective(capturePointObjective, true);
506
-
507
- // wait for required number of players to join the game.
508
- while (initialPlayerCount < minimumInitialPlayerCount) {
509
- await mod.Wait(1);
510
- }
511
-
512
- console.log("Adequate players have entered lobby. Begin the game.");
513
-
514
- await CombatCountdown();
515
-
516
- ForceSpawnPlayers();
517
-
518
-
519
- mod.EnableWorldIconImage(startGameWorldIcon, false);
520
- mod.EnableWorldIconText(startGameWorldIcon, false);
521
-
522
- let vfxStartPos: mod.Vector = mod.CreateVector(-136, 76.5, -127);
523
- let lengthNum: number = 25;
524
- let distanceBetween = 5;
525
- for (let k = 0; k < lengthNum; ++k) {
526
- let x = mod.XComponentOf(vfxStartPos) + k * distanceBetween;
527
-
528
- for (let i = 0; i < lengthNum; ++i) {
529
- let y = mod.YComponentOf(vfxStartPos);
530
- let z = mod.ZComponentOf(vfxStartPos) + i * distanceBetween;
531
- SpawnVFX(mod.CreateVector(x, y, z), mod.RuntimeSpawn_Common.FX_BASE_Fire_M_NoSmoke, mod.CreateVector(0, 0, 0));
532
- }
533
- }
534
-
535
- // There isn't a defined update loop, so you can create some here.
536
- // I have ThrottledUpdate, which updates every 1 second.
537
- while (true) {
538
- await mod.Wait(1);
539
- ThrottledUpdate();
540
- }
541
- }
542
-
543
- //-----------------------------------------------------------------------------------------------//
544
- //-----------------------------------------------------------------------------------------------//
545
- //-----------------------------------------------------------------------------------------------//
546
- //-----------------------------------------------------------------------------------------------//
547
- // Player Functions:
548
- //-----------------------------------------------------------------------------------------------//
549
-
550
- export async function OnPlayerJoinGame(player: mod.Player) {
551
-
552
- await mod.Wait(1);
553
-
554
- // Check if this is a human player or not.
555
- if (mod.GetSoldierState(player, mod.SoldierStateBool.IsAISoldier) == false) {
556
-
557
- if (!combatCountdownStarted) {
558
- mod.SetTeam(player, mod.GetTeam(1));
559
- }
560
- else {
561
- // Count up team sizes and add player to a team accordingly
562
-
563
- JsPlayer.playerInstances.forEach(p => {
564
- let teamId: number = mod.GetObjId(mod.GetTeam(p));
565
-
566
- switch (teamId) {
567
- case 1:
568
- team1Count++;
569
- case 2:
570
- team2Count++;
571
- case 3:
572
- team3Count++;
573
- case 4:
574
- team4Count++;
575
- default:
576
- console.log("Invalid team ID");
577
- }
578
- });
579
-
580
- const smallest: number = Math.min(team1Count, team2Count, team3Count, team4Count);
581
- if (team1Count == smallest && team2Count == smallest && team3Count == smallest && team4Count == smallest) {
582
- mod.SetTeam(player, mod.GetTeam(1));
583
- }
584
- else if (team1Count == smallest) {
585
- mod.SetTeam(player, mod.GetTeam(1));
586
- }
587
- else if (team2Count == smallest) {
588
- mod.SetTeam(player, mod.GetTeam(2));
589
- }
590
- else if (team3Count == smallest) {
591
- mod.SetTeam(player, mod.GetTeam(3));
592
- }
593
- else if (team4Count == smallest) {
594
- mod.SetTeam(player, mod.GetTeam(4));
595
- }
596
- }
597
-
598
- let jsPlayer = JsPlayer.get(player);
599
- if (!jsPlayer) {
600
- console.log("not a player");
601
- return;
602
- }
603
-
604
-
605
- // Show the pre-game lobby window, assuming combat hasn't started.
606
- if (!combatStarted){
607
- jsPlayer.lobbyUI.open();
608
- initialPlayerCount++;
609
- UpdateAllLobbyUI();
610
- }
611
-
612
- }
613
- else {
614
- // The player is not a human so we will ignore them.
615
- }
616
- }
617
-
618
- export async function OnPlayerLeaveGame(playerId: number) {
619
- // reduce player count.
620
- JsPlayer.removeInvalidJSPlayers(playerId);
621
-
622
- // Updated valid combatants count
623
-
624
- if (combatCountdownStarted && !gameOver) {
625
- //validCombatants = GetNumberOfPlayersOnTeam(combatTeam);
626
- //UpdateValidCombatantsUI();
627
- //CheckVictoryState();
628
- } else if (!combatCountdownStarted) {
629
- if (!gameOver) {
630
- initialPlayerCount--;
631
- UpdateAllLobbyUI();
632
- }
633
- }
634
- }
635
-
636
- export function OnPlayerDeployed(eventPlayer: mod.Player): void{
637
-
638
- if (!combatStarted) {
639
- mod.Teleport(eventPlayer, lobbySpawnPt, 0);
640
- mod.SetFriendlyFire(false);
641
- }
642
-
643
- // }
644
- // mod.Wait(0.5);
645
- //mod.RemovePlayerInventoryAtSlot(eventPlayer, mod.InventorySlots.PrimaryWeapon);
646
- // mod.RemovePlayerInventoryAtSlot(eventPlayer, mod.InventorySlots.GadgetOne);
647
- // mod.RemovePlayerInventoryAtSlot(eventPlayer, mod.InventorySlots.GadgetTwo);
648
- // mod.RemovePlayerInventoryAtSlot(eventPlayer, mod.InventorySlots.MiscGadget);
649
- // mod.RemovePlayerInventoryAtSlot(eventPlayer, mod.InventorySlots.ClassGadget);
650
- //mod.ReplacePlayerInventory(eventPlayer, mod.Throwables.SmokeGrenade);
651
- //mod.SetInventoryMagazineAmmo(eventPlayer, mod.InventorySlots.SecondaryWeapon, 1000);
652
- //mod.SetInventoryAmmo(eventPlayer, mod.InventorySlots.SecondaryWeapon, 100);
653
-
654
- }
655
-
656
-
657
- // Updates every 1 second
658
- function ThrottledUpdate() {
659
-
660
- if (!gameOver) {
661
- UpdateCheckpoints();
662
- PollAmmo();
663
- UpdateHazards();
664
- UpdateMessages();
665
- }
666
-
667
- }
668
-
669
-
670
- // Spawns an explosion at targetpoint and will also damage + knockback players
671
- async function Explosion(targetpoint: mod.Vector, damage: number, explosionRadius: number, vfx: mod.RuntimeSpawn_Common) {
672
-
673
- let flareVFX = mod.SpawnObject(vfx, targetpoint, mod.CreateVector(0, 0, 0), mod.CreateVector(2, 2, 2));
674
-
675
- mod.EnableVFX(flareVFX, true);
676
-
677
- let closePlayers = await GetPlayersInRange(targetpoint, explosionRadius);
678
-
679
- for (let index = 0; index < closePlayers.length; index++) {
680
- const closePlayer = closePlayers[index];
681
- mod.DealDamage(closePlayer, damage);
682
- }
683
- }
684
-
685
- // This actually for firing any VFX lol
686
- async function SpawnVFX(targetPoint: mod.Vector, vfx: any, rot: mod.Vector){
687
- let flareVFX = mod.SpawnObject(vfx, targetPoint, rot, mod.CreateVector(1, 1, 1));
688
- mod.EnableVFX(flareVFX, true);
689
- }
690
-
691
- function PollAmmo() {
692
- let p18MaxMagazine: number = 18;
693
- // Set p18 ammo to max every second
694
- JsPlayer.playerInstances.forEach(player => {
695
- if (mod.GetSoldierState(player, mod.SoldierStateBool.IsAlive) == true) {
696
- mod.SetInventoryMagazineAmmo(player, mod.InventorySlots.SecondaryWeapon, p18MaxMagazine);
697
- }
698
- });
699
- }
700
-
701
- async function UpdateMessages() {
702
- if (messageTime > 0) {
703
- messageTime--;
704
- if (messageTime <= 0) {
705
- HideAllMessageUI();
706
- messageTime = 0;
707
- }
708
- }
709
- }
710
-
711
- async function UpdateHazards(){
712
- // try area triggers again, this is stupid
713
- // let hazardTriggerDistance: number = 15
714
- // JsPlayer.playerInstances.forEach(player => {
715
- // if (mod.GetSoldierState(player, mod.SoldierStateBool.IsAlive) == true) {
716
- // let pos = mod.GetSoldierState(player, mod.SoldierStateVector.GetPosition);
717
- // if (hazardpt1Cooldown > 0) {
718
- // hazardpt1Cooldown--;
719
- // }
720
- // else {
721
- // let dis1 = mod.DistanceBetween(pos, hazardpt1_1_1);
722
- // let dis2 = mod.DistanceBetween(pos, hazardpt1_1_2);
723
- // let dis3 = mod.DistanceBetween(pos, hazardpt1_1_3);
724
-
725
- // if (dis < hazardTriggerDistance){
726
- // // Will need to break down hazards into smaller arrays for different locations
727
- // SpawnVehiclesFromSpawners(hazards, 1);
728
- // }
729
- // }
730
- // }
731
- // });
732
- }
733
-
734
- async function UpdateCheckpoints(){
735
- JsPlayer.playerInstances.forEach(player => {
736
- if (mod.GetSoldierState(player, mod.SoldierStateBool.IsAlive) == true) {
737
- let pos = mod.GetSoldierState(player, mod.SoldierStateVector.GetPosition);
738
- let testPos = mod.GetObjectPosition(player);
739
- //console.log("X = " + mod.XComponentOf(testPos));
740
- //console.log("Y = " + mod.YComponentOf(testPos));
741
- //console.log("Z = " + mod.ZComponentOf(testPos));
742
-
743
-
744
- if (mod.YComponentOf(pos) <= deathYPos) {
745
- mod.Kill(player);
746
- MessageAllUI(MakeMessage(mod.stringkeys.playerFell, player), REDCOLOR);
747
- }
748
-
749
- //WorldIconDistanceCheck(pos, mod.CreateVector(-120, 82, -18), [1, 2, 3, 12, 21, 22, 23]);
750
- //console.log("player pos x: " + mod.XComponentOf(pos));
751
- //WorldIconDistanceCheck(pos, mod.GetObjectPosition(mod.GetWorldIcon(30)), [30]);
752
- // WorldIconDistanceCheck(pos, mod.GetObjectPosition(mod.GetHQ(6)), [team2Checkpoint1ID, 27]);
753
- // WorldIconDistanceCheck(pos, mod.GetObjectPosition(mod.GetHQ(7)), [team3Checkpoint1ID, 28]);
754
- // WorldIconDistanceCheck(pos, mod.GetObjectPosition(mod.GetHQ(8)), [team4Checkpoint1ID, 29]);
755
- }
756
-
757
- });
758
-
759
- }
760
-
761
- function WorldIconDistanceCheck(playerPos: mod.Vector, checkPt: mod.Vector, iconIDs: number[]) {
762
- let dis: number = mod.DistanceBetween(playerPos, checkPt);
763
- let canDisable: boolean = true;
764
- if (dis < 10) {
765
- iconIDs.forEach(id => {
766
- console.log("SHOW");
767
- mod.EnableWorldIconText(mod.GetWorldIcon(id), true);
768
- mod.EnableWorldIconImage(mod.GetWorldIcon(id), true);
769
- });
770
- canDisable = false;
771
- }
772
- else {
773
- if (canDisable) {
774
- iconIDs.forEach(id => {
775
- console.log("HIDE");
776
- mod.EnableWorldIconText(mod.GetWorldIcon(id), false);
777
- mod.EnableWorldIconImage(mod.GetWorldIcon(id), false);
778
- });
779
- }
780
- }
781
- }
782
-
783
- async function GetPlayersInRange(point: mod.Vector, distance: number): Promise<mod.Player[]> {
784
-
785
- let closePlayers: mod.Player[] = [];
786
-
787
- JsPlayer.playerInstances.forEach(player => {
788
-
789
- if (mod.GetSoldierState(player, mod.SoldierStateBool.IsAlive) == true) {
790
-
791
- let pos = mod.GetSoldierState(player, mod.SoldierStateVector.GetPosition);
792
-
793
- let dis = mod.DistanceBetween(pos, point);
794
-
795
- if (dis <= distance) {
796
- closePlayers.push(player);
797
- }
798
- }
799
- });
800
-
801
- return closePlayers;
802
- }
803
-
804
- function SpawnVehicleSpawner(positionVector: mod.Vector, rotationVector: mod.Vector){
805
- let yOffset = 0;
806
- let idNum = mod.SpawnObject(mod.RuntimeSpawn_Common.VehicleSpawner, mod.CreateVector(mod.XComponentOf(positionVector), mod.YComponentOf(positionVector) + yOffset, mod.ZComponentOf(positionVector)), rotationVector, mod.CreateVector(1,1,1));
807
- vehicleSpawners.push(idNum);
808
- return idNum;
809
- }
810
-
811
-
812
- // Called whenever a player interacts with an object
813
- export async function OnPlayerInteract(player: mod.Player, interactPoint: any)
814
- {
815
- // ObjIds are assigned IN GODOT. I recommend assigning them to const numbers in the global scope
816
- let id = mod.GetObjId(interactPoint);
817
- if (id == onlyUpTeleportID){
818
- console.log("Teleport player");
819
- mod.Teleport(player, mod.CreateVector(-61.8, 114.3, -48), 0);
820
- }
821
- else if (id == quadBikeSpawnerInteract1){
822
- console.log("Spawn Vehicle Checkpoint 1");
823
- let quadSpawn = SpawnVehicleSpawner(mod.CreateVector(-148, 138.5, -8.75), mod.CreateVector(0, -68, 0));
824
- SpawnVehiclesFromSpawners([quadSpawn], 2);
825
- }
826
- else if (id == quadBikeSpawnerInteract2){
827
- console.log("Spawn Vehicle Checkpoint 2");
828
- let quadSpawn = SpawnVehicleSpawner(mod.CreateVector(-71.25, 138.5, 46), mod.CreateVector(0, -248, 0));
829
- SpawnVehiclesFromSpawners([quadSpawn], 2);
830
- }
831
- else if (id == quadBikeSpawnerInteract3){
832
- console.log("Spawn Vehicle Checkpoint 3");
833
- let quadSpawn = SpawnVehicleSpawner(mod.CreateVector(-26, 136.5, -149.5), mod.CreateVector(0, 22, 0));
834
- SpawnVehiclesFromSpawners([quadSpawn], 2);
835
- }
836
- else if (id == quadBikeSpawnerInteract4){
837
- console.log("Spawn Vehicle Checkpoint 4");
838
- let quadSpawn = SpawnVehicleSpawner(mod.CreateVector(-13.5, 136.5, -9.5), mod.CreateVector(0, -68, 0));
839
- SpawnVehiclesFromSpawners([quadSpawn], 2);
840
- }
841
- else if (id == ammoResupplyID){
842
- // mod.ReplacePlayerInventory(player, mod.PrimaryWeapons.USG_90);
843
- // mod.ReplacePlayerInventory(player, mod.Throwables.MiniFragGrenade);
844
- // mod.SetInventoryAmmo(player, mod.InventorySlots.PrimaryWeapon, 9999);
845
- // mod.SetInventoryMagazineAmmo(player, mod.InventorySlots.PrimaryWeapon, 9999);
846
- // mod.SetInventoryAmmo(player, mod.InventorySlots.Throwable, 9999);
847
- // mod.SetInventoryAmmo(player, mod.InventorySlots.GadgetOne, 9999);
848
- // mod.SetInventoryAmmo(player, mod.InventorySlots.GadgetTwo, 9999);
849
- // mod.SetInventoryAmmo(player, mod.InventorySlots.MiscGadget, 9999);
850
- // mod.SetInventoryAmmo(player, mod.InventorySlots.ClassGadget, 9999);
851
- }
852
- // else if (id == 99){
853
- // TestVFXSpawn();
854
- // }
855
- else if (id == team1HQ2Teleport){
856
- mod.Teleport(player, mod.CreateVector(-147.5, 138.5, -9), 0);
857
- }
858
- else if (id == team1Checkpoint1ID && mod.GetObjId(mod.GetTeam(player)) == mod.GetObjId(mod.GetTeam(1))){
859
- console.log("Update Team 1 Checkpoint");
860
- mod.EnableHQ(mod.GetHQ(team1HQ2), true);
861
- mod.EnableHQ(mod.GetHQ(team1HQ1), false);
862
- mod.SetWorldIconText(mod.GetWorldIcon(team1Checkpoint1ID), MakeMessage(mod.stringkeys.checkPointActivated));
863
- mod.EnableInteractPoint(mod.GetInteractPoint(team1Checkpoint1ID), false);
864
- MessageAllUI(MakeMessage(mod.stringkeys.team1CheckpointActivated), BLACKCOLOR);
865
- }
866
- else if (id == team1Checkpoint1ID && mod.GetObjId(mod.GetTeam(player)) != mod.GetObjId(mod.GetTeam(1))){
867
- console.log("Wrong team at team 1 checkpoint: player is ", mod.GetObjId(mod.GetTeam(player)), " , Checkpoint is for: ", mod.GetObjId(mod.GetTeam(1)));
868
- }
869
- else if (id == team4Checkpoint1ID && mod.GetObjId(mod.GetTeam(player)) == mod.GetObjId(mod.GetTeam(4))){
870
- console.log("Update Team 4 Checkpoint");
871
- mod.EnableHQ(mod.GetHQ(team4HQ2), true);
872
- mod.EnableHQ(mod.GetHQ(team4HQ1), false);
873
- mod.SetWorldIconText(mod.GetWorldIcon(team4Checkpoint1ID), MakeMessage(mod.stringkeys.checkPointActivated));
874
- mod.EnableInteractPoint(mod.GetInteractPoint(team4Checkpoint1ID), false);
875
- MessageAllUI(MakeMessage(mod.stringkeys.team4CheckpointActivated), BLACKCOLOR);
876
- }
877
- else if (id == team4Checkpoint1ID && mod.GetObjId(mod.GetTeam(player)) != mod.GetObjId(mod.GetTeam(4))){
878
- console.log("Wrong team at team 4 checkpoint: player is ", mod.GetObjId(mod.GetTeam(player)), " , Checkpoint is for: ", mod.GetObjId(mod.GetTeam(4)));
879
- }
880
- else if (id == team2Checkpoint1ID && mod.GetObjId(mod.GetTeam(player)) == mod.GetObjId(mod.GetTeam(2))){
881
- console.log("Update Team 2 Checkpoint");
882
- mod.EnableHQ(mod.GetHQ(team2HQ2), true);
883
- mod.EnableHQ(mod.GetHQ(team2HQ1), false);
884
- mod.SetWorldIconText(mod.GetWorldIcon(team2Checkpoint1ID), MakeMessage(mod.stringkeys.checkPointActivated));
885
- mod.EnableInteractPoint(mod.GetInteractPoint(team2Checkpoint1ID), false);
886
- MessageAllUI(MakeMessage(mod.stringkeys.team2CheckpointActivated), BLACKCOLOR);
887
- }
888
- else if (id == team2Checkpoint1ID && mod.GetObjId(mod.GetTeam(player)) != mod.GetObjId(mod.GetTeam(2))){
889
- console.log("Wrong team at team 2 checkpoint: player is ", mod.GetObjId(mod.GetTeam(player)), " , Checkpoint is for: ", mod.GetObjId(mod.GetTeam(2)));
890
- }
891
- else if (id == team3Checkpoint1ID && mod.GetObjId(mod.GetTeam(player)) == mod.GetObjId(mod.GetTeam(3))){
892
- console.log("Update Team 3 Checkpoint");
893
- mod.EnableHQ(mod.GetHQ(team3HQ2), true);
894
- mod.EnableHQ(mod.GetHQ(team3HQ1), false);
895
- mod.SetWorldIconText(mod.GetWorldIcon(team3Checkpoint1ID), MakeMessage(mod.stringkeys.checkPointActivated));
896
- mod.EnableInteractPoint(mod.GetInteractPoint(team3Checkpoint1ID), false);
897
- MessageAllUI(MakeMessage(mod.stringkeys.team3CheckpointActivated), BLACKCOLOR);
898
- }
899
- else if (id == team3Checkpoint1ID && mod.GetObjId(mod.GetTeam(player)) != mod.GetObjId(mod.GetTeam(3))){
900
- console.log("Wrong team at team 3 checkpoint: player is ", mod.GetObjId(mod.GetTeam(player)), " , Checkpoint is for: ", mod.GetObjId(mod.GetTeam(3)));
901
- }
902
- else if (id == team2HQ2Teleport) {
903
- mod.Teleport(player, mod.CreateVector(-12.9, 136, -8.25), 0);
904
- }
905
- else if (id == team3HQ2Teleport) {
906
- mod.Teleport(player, mod.CreateVector(-10.25, 136.1, -132), 0);
907
- }
908
- else if (id == team4HQ2Teleport) {
909
- mod.Teleport(player, mod.CreateVector(-44, 137.3, 35.3), 0);
910
- }
911
- else if (id == 98) {
912
- mod.Teleport(player, victoryPt, 0);
913
- }
914
- else if (id == startInteractPointID) {
915
- initialPlayerCount = minimumInitialPlayerCount;
916
- mod.EnableInteractPoint(mod.GetInteractPoint(startInteractPointID), false);
917
- }
918
- else if (id == 96) {
919
- console.log("MoveObjectOverTimeTest");
920
- mod.MoveObjectOverTime(mod.GetSpatialObject(60), mod.CreateVector(10, 10, 0), mod.CreateVector(0, 180, 0), 1, false, false);
921
- }
922
- else if (id == 69) {
923
- SpawnVFX(mod.CreateVector(-75, 66, -65), vfxtest[vfxidx], mod.CreateVector(0, 0, 0));
924
- vfxidx++;
925
- }
926
- }
927
-
928
- export function OnCapturePointCaptured(eventCapturePoint: mod.CapturePoint): void{
929
- gameOver = true;
930
- mod.EndGameMode(mod.GetCurrentOwnerTeam(eventCapturePoint));
931
- }
932
-
933
- async function SpawnVehiclesFromSpawners(vehicleSpawners: mod.VehicleSpawner[], spawnVehicleIdx: number){
934
- vehicleSpawners.forEach(spawner => {
935
- console.log("Attempting to spawn vehicle: ", spawnVehicleIdx, " from vehicle spawner: ");
936
- mod.SetVehicleSpawnerVehicleType(spawner, vehicleListTable[spawnVehicleIdx]);
937
- mod.SetVehicleSpawnerRespawnTime(spawner, 5);
938
- mod.ForceVehicleSpawnerSpawn(spawner);
939
- });
940
- }
941
-
942
- export async function OnVehicleSpawned(eventVehicle: mod.Vehicle){
943
- const vehPos = mod.GetVehicleState(eventVehicle, mod.VehicleStateVector.VehiclePosition);
944
- const explodePoint1 = mod.CreateVector(-62.859, 90, 33);
945
- const explodePt2 = mod.CreateVector(-72, 147, -77);
946
- let dist = mod.DistanceBetween(vehPos, explodePoint1);
947
- if (dist <= 15) {
948
- console.log("Explode Vehicle");
949
- await mod.Wait(0.5);
950
- mod.Kill(eventVehicle);
951
- }
952
-
953
- dist = mod.DistanceBetween(vehPos, explodePt2);
954
- if (dist <= 50){
955
- console.log("Explode Vehicle");
956
- await mod.Wait(0.5);
957
- mod.Kill(eventVehicle);
958
- }
959
- }
960
-
961
-
962
- function ForceSpawnPlayers() {
963
- console.log("Force Spawn Players");
964
- mod.EnableAllPlayerDeploy(true);
965
-
966
- console.log(JsPlayer.playerInstances.length, " Players to Spawn");
967
- let i = 0
968
- JsPlayer.playerInstances.forEach(player => {
969
- if (debugTeam) {
970
- mod.SetTeam(player, mod.GetTeam(4)); // Set to team to debug
971
- }
972
- else {
973
- let is_alive = mod.GetSoldierState(player, mod.SoldierStateBool.IsAlive);
974
- switch(i % 4) {
975
- case 0:
976
- console.log("add player to Team 1");
977
- if (mod.GetObjId(mod.GetTeam(player)) != 1) {
978
- mod.SetTeam(player, mod.GetTeam(1));
979
- }
980
-
981
- if (is_alive){
982
- mod.Teleport(player, mod.GetObjectPosition(mod.GetHQ(1)), 0);
983
- }
984
- break;
985
- case 1:
986
- console.log("add player to Team 2");
987
- if (mod.GetObjId(mod.GetTeam(player)) != 2) {
988
- mod.SetTeam(player, mod.GetTeam(2));
989
- }
990
-
991
- if (is_alive){
992
- mod.Teleport(player, mod.GetObjectPosition(mod.GetHQ(4)), 0);
993
- }
994
- break;
995
- case 2:
996
- console.log("add player to Team 3");
997
- if (mod.GetObjId(mod.GetTeam(player)) != 3) {
998
- mod.SetTeam(player, mod.GetTeam(3));
999
- }
1000
-
1001
- if (is_alive){
1002
- mod.Teleport(player, mod.GetObjectPosition(mod.GetHQ(7)), 0);
1003
- }
1004
- break;
1005
- case 3:
1006
- console.log("add player to Team 4");
1007
- if (mod.GetObjId(mod.GetTeam(player)) != 4) {
1008
- mod.SetTeam(player, mod.GetTeam(4));
1009
- }
1010
-
1011
- if (is_alive){
1012
- mod.Teleport(player, mod.GetObjectPosition(mod.GetHQ(10)), 0);
1013
- }
1014
- break;
1015
- }
1016
-
1017
- mod.DeployPlayer(player as mod.Player);
1018
- i++;
1019
-
1020
- }
1021
- });
1022
-
1023
- }
1024
-
1025
- async function CombatCountdown(): Promise<void> {
1026
- combatCountdownStarted = true;
1027
- console.log("Combat Countdown Started")
1028
-
1029
- while (combatStartDelayRemaining > -1) {
1030
- UpdateAllLobbyUI();
1031
- await mod.Wait(1);
1032
- combatStartDelayRemaining--;
1033
- }
1034
-
1035
- combatStarted = true;
1036
- mod.DisablePlayerJoin();
1037
- console.log("CombatStarted Set To True");
1038
- HideAllLobbyUI();
1039
- CaptureM.StartCaptureTimer();
1040
- //CaptureM.StartLateJoinTimer();
1041
- return Promise.resolve();
1042
-
1043
- }
1044
-
1045
-
1046
- function UpdateAllLobbyUI() {
1047
-
1048
- JsPlayer.playerInstances.forEach(player => {
1049
- let jsPlayer = JsPlayer.get(player);
1050
- if (!jsPlayer)
1051
- return;
1052
- jsPlayer.lobbyUI.refresh();
1053
- });
1054
- }
1055
-
1056
- function MessageAllUI(message: mod.Message, textColor: number[]) {
1057
- JsPlayer.playerInstances.forEach(player => {
1058
- let jsPlayer = JsPlayer.get(player);
1059
- if (!jsPlayer)
1060
- return;
1061
- if (jsPlayer.messageUI.isOpen()) {
1062
- jsPlayer.messageUI.refresh(message);
1063
- }
1064
- else {
1065
- jsPlayer.messageUI.open(message, textColor);
1066
- }
1067
- });
1068
- messageTime = messageRemainTime;
1069
- }
1070
-
1071
- function HideAllMessageUI() {
1072
- console.log("Hide all message UI");
1073
- JsPlayer.playerInstances.forEach(player => {
1074
- let jsPlayer = JsPlayer.get(player);
1075
- if (!jsPlayer)
1076
- return;
1077
- jsPlayer.messageUI.close();
1078
- });
1079
- }
1080
-
1081
- function HideAllLobbyUI() {
1082
- console.log("Hide lobby UI");
1083
- JsPlayer.playerInstances.forEach((player) => {
1084
- let jsPlayer = JsPlayer.get(player);
1085
- if (!jsPlayer)
1086
- return;
1087
- jsPlayer.lobbyUI.close();
1088
- });
1089
- }
1090
-
1091
- function MakeMessage(message: string, ...args: any[]) {
1092
- switch (args.length) {
1093
- case 0:
1094
- return mod.Message(message);
1095
- case 1:
1096
- return mod.Message(message, args[0]);
1097
- case 2:
1098
- return mod.Message(message, args[0], args[1]);
1099
- default:
1100
- return mod.Message(message, args[0], args[1], args[2]);
1101
- }
1102
- }
1103
-
1104
-
1105
- export function OnCapturePointCapturing(eventCapturePoint: mod.CapturePoint): void {
1106
- mod.DisplayNotificationMessage(MakeMessage(mod.stringkeys.teamCapture));
1107
- }
1108
-
1109
-
1110
- export function OnPlayerDied(eventPlayer: mod.Player, otherPlayer: mod.Player){
1111
- if (eventPlayer != otherPlayer){
1112
- SwapPlaces(eventPlayer, otherPlayer)
1113
- }
1114
- else {
1115
- console.log("Not Swaping Players")
1116
- }
1117
- }
1118
-
1119
- function SwapPlaces(victimPlayer: mod.Player, killerPlayer: mod.Player) {
1120
- if (!combatStarted) {
1121
- console.log("Not Swaping Players")
1122
- return;
1123
- }
1124
-
1125
- console.log("Swaping Players")
1126
- //let victimLocation = mod.GetSoldierState(victimPlayer, mod.SoldierStateVector.GetPosition);
1127
- let victimLocation = mod.GetSoldierState(victimPlayer, mod.SoldierStateVector.GetPosition);
1128
- victimLocation = mod.Add(victimLocation, mod.CreateVector(0, 2, 0));
1129
-
1130
- let killerLocation = mod.GetSoldierState(killerPlayer, mod.SoldierStateVector.GetPosition);
1131
-
1132
- let teleportVFX = mod.SpawnObject(
1133
- mod.RuntimeSpawn_Common.FX_BASE_Sparks_Pulse_L,
1134
- victimLocation,
1135
- mod.CreateVector(0, 0, 0),
1136
- mod.CreateVector(5, 5, 5)
1137
- );
1138
- let teleportTargetVFX = mod.SpawnObject(
1139
- mod.RuntimeSpawn_Common.FX_BASE_Sparks_Pulse_L,
1140
- killerLocation,
1141
- mod.CreateVector(0, 0, 0),
1142
- mod.CreateVector(5, 5, 5)
1143
- );
1144
-
1145
- let rotationAngle: number = FindAngleToLocation2D(
1146
- mod.XComponentOf(victimLocation),
1147
- mod.ZComponentOf(victimLocation),
1148
- mod.XComponentOf(killerLocation),
1149
- mod.ZComponentOf(killerLocation)
1150
- );
1151
-
1152
- let rotationAngle2: number = FindAngleToLocation2D(
1153
- mod.XComponentOf(killerLocation),
1154
- mod.ZComponentOf(killerLocation),
1155
- mod.XComponentOf(victimLocation),
1156
- mod.ZComponentOf(victimLocation)
1157
- );
1158
-
1159
- mod.EnableVFX(teleportVFX, true);
1160
- mod.EnableVFX(teleportTargetVFX, true);
1161
-
1162
- mod.Teleport(killerPlayer, victimLocation, rotationAngle);
1163
- mod.Teleport(victimPlayer, killerLocation, rotationAngle2);
1164
- }
1165
-
1166
- function FindAngleToLocation2D(currentX: number, currentY: number, targetX: number, targetY: number) {
1167
- const dx = targetX - currentX;
1168
- const dy = targetY - currentY;
1169
-
1170
- // Calculate the angle using atan2
1171
- const angle = Math.atan2(dx, dy);
1172
-
1173
- return angle;
1174
- }
1175
-
1176
- //-----------------------------------------------------------------------------------------------//
1177
- //-----------------------------------------------------------------------------------------------//
1178
- //-----------------------------------------------------------------------------------------------//
1179
- //-----------------------------------------------------------------------------------------------//
1180
- // Helper Functions:
1181
- //-----------------------------------------------------------------------------------------------//
1182
-
1183
- function GetRandomFloatInRange(max: number, min: number){
1184
- return Math.random() * (max - min) + min;
1185
- }
1186
-
1187
- function GetRandomInt(max: number): number {
1188
- return Math.floor(Math.random() * max);
1189
- }
1190
-
1191
- /// ----------------------------------- JS PLAYER --------------------------------------------------------------
1192
-
1193
- class JsPlayer {
1194
- player: mod.Player;
1195
- playerId: number;
1196
- maxHealth = 100;
1197
- currentHealth = 100;
1198
- bonusDamage = 0;
1199
-
1200
- isDeployed = false;
1201
- hasDeployed = false;
1202
-
1203
- playerNotificationWidget: mod.UIWidget|undefined;
1204
- playerhealthWidget: mod.UIWidget|undefined;
1205
-
1206
-
1207
- lobbyUI;
1208
- messageUI;
1209
-
1210
-
1211
- static playerInstances: mod.Player[] = [];
1212
-
1213
- constructor(player: mod.Player) {
1214
- this.player = player;
1215
- this.playerId = mod.GetObjId(player);
1216
- JsPlayer.playerInstances.push(this.player);
1217
- if (debugJSPlayer) {console.log("Vertigo Mode Adding Player [", mod.GetObjId(this.player), "] Creating JS Player: ", JsPlayer.playerInstances.length)};
1218
- //this.createPlayerNotificationUI();
1219
- this.lobbyUI = new LobbyUI(this);
1220
- this.messageUI = new MessageUI(this);
1221
- }
1222
-
1223
- // declare dictionary with int keys
1224
- static #allJsPlayers: { [key: number] : JsPlayer } = {};
1225
-
1226
- static get(player: mod.Player) {
1227
- if (!gameOver && mod.GetObjId(player) > -1) {
1228
- let index = mod.GetObjId(player);
1229
-
1230
- //if (instance == null){instance = 1000};
1231
- //if (debugJSPlayer) {console.log("Calling JSPlayer.get Instance [", instance, "] on Player [", index, "]")}
1232
-
1233
- let jsPlayer = this.#allJsPlayers[index];
1234
- if (!jsPlayer) {
1235
- jsPlayer = new JsPlayer(player);
1236
- this.#allJsPlayers[index] = jsPlayer;
1237
- }
1238
-
1239
- return jsPlayer;
1240
- }
1241
- return undefined;
1242
- }
1243
-
1244
- static removeInvalidJSPlayers(invalidPlayerId: number){
1245
- if (!gameOver){
1246
- if (debugJSPlayer) {console.log("Removing Invalid JSPlayers currently: ", JsPlayer.playerInstances.length)}
1247
- let allPlayersLength = Object.keys((JsPlayer.#allJsPlayers)).length;
1248
- if (debugJSPlayer) {console.log("#allJsPlayers Length: ", JsPlayer.playerInstances.length)}
1249
- let n = 0;
1250
- let indexToRemove = -1;
1251
- JsPlayer.playerInstances.forEach((indexPlayer) => {
1252
- if (mod.GetObjId(JsPlayer.playerInstances[n]) < 0){
1253
- indexToRemove = n;
1254
- }
1255
- n++
1256
- })
1257
-
1258
- delete this.#allJsPlayers[invalidPlayerId];
1259
-
1260
- if (indexToRemove > -1){
1261
- JsPlayer.playerInstances.splice(indexToRemove, 1)
1262
- }
1263
-
1264
- if (debugJSPlayer) {console.log("Player [", invalidPlayerId, "] removed. JSPlayers Remaining: ", JsPlayer.playerInstances.length)}
1265
- allPlayersLength = Object.keys((JsPlayer.#allJsPlayers)).length;
1266
- if (debugJSPlayer) {console.log("#allJsPlayers New Length: ", JsPlayer.playerInstances.length)}
1267
-
1268
- }
1269
- }
1270
-
1271
- static getAllAsArray() {
1272
- return Object.values(this.#allJsPlayers);
1273
- }
1274
-
1275
- static IsPlayer(id: number) {
1276
- if (!this.#allJsPlayers[id]) {
1277
- return false;
1278
- }
1279
- return true;
1280
- }
1281
-
1282
- static getRandomJsPlayer() {
1283
- let i = GetRandomInt(JsPlayer.playerInstances.length);
1284
- return JsPlayer.playerInstances[i];
1285
- }
1286
-
1287
- static getValidJsPlayer() {
1288
-
1289
- //console.log("M12 getValidJsPlayer: ")
1290
-
1291
- let aliveAndFreeJSPlayers: mod.Player[] = [];
1292
-
1293
- let n = JsPlayer.playerInstances.length;
1294
- //console.log("M12 getValidJsPlayer length: ", n)
1295
- for (let i = 0; i < n; i++) {
1296
- //console.log("M12 candidate player = ", JsPlayer.get(JsPlayer.playerInstances[i]))
1297
- let candidateJsPlayer = JsPlayer.get(JsPlayer.playerInstances[i]);
1298
- if (!candidateJsPlayer)
1299
- continue;
1300
- }
1301
-
1302
- if (aliveAndFreeJSPlayers.length > 0) {
1303
- let i = GetRandomInt(aliveAndFreeJSPlayers.length);
1304
- let validJsPlayer = aliveAndFreeJSPlayers[i];
1305
- //console.log("M12 Returning Valid JS Player: ", validJsPlayer)
1306
- return validJsPlayer as mod.Player
1307
- } else {
1308
- //console.log("M12 There are no Free & Alive JS Players")
1309
- return null;
1310
- }
1311
- }
1312
-
1313
- static anyJsPlayersAlive() {
1314
- let anyPlayersStillAlive = false;
1315
-
1316
- JsPlayer.playerInstances.forEach((player) => {
1317
- let jsPlayer = JsPlayer.get(player);
1318
- if (!jsPlayer)
1319
- return;
1320
- });
1321
-
1322
- if (anyPlayersStillAlive) {
1323
- return true;
1324
- } else {
1325
- return false;
1326
- }
1327
-
1328
- }
1329
-
1330
-
1331
- // createPlayerNotificationUI() {
1332
-
1333
- // this.playerNotificationWidget = ParseUI({
1334
- // type: "Text",
1335
- // textSize: 54,
1336
- // position: [0, 220, 0],
1337
- // size: [800, 80],
1338
- // anchor: mod.UIAnchor.TopCenter,
1339
- // bgColor: REDCOLOR,
1340
- // textLabel: MakeMessage(mod.stringkeys.youAreInJail),
1341
- // playerId: this.player,
1342
-
1343
- // })
1344
- // }
1345
- }
1346
-
1347
- class LobbyUI {
1348
- #jsPlayer;
1349
- #rootWidget: mod.UIWidget|undefined;
1350
-
1351
- #containerWidth = 700;
1352
- #containerHeight = 300;
1353
- #lineBreakHeight = 3;
1354
- #backgroundSpacing = 4;
1355
- #activeTabBgColor = BLACKCOLOR;
1356
-
1357
- #lobbyStatusText: mod.UIWidget|undefined;
1358
-
1359
- #isUIVisible = false;
1360
-
1361
- constructor(jsPlayer: JsPlayer) {
1362
- this.#jsPlayer = jsPlayer;
1363
- }
1364
-
1365
- open() {
1366
- if (!this.#rootWidget)
1367
- this.#create();
1368
- if (!this.#rootWidget)
1369
- return;
1370
- // this.refresh();
1371
- // this.refilterAttachmentsTab();
1372
- mod.SetUIWidgetVisible(this.#rootWidget, true);
1373
- this.#isUIVisible = true;
1374
- }
1375
-
1376
- close() {
1377
- if (this.#rootWidget) {
1378
- mod.SetUIWidgetVisible(this.#rootWidget, false);
1379
- this.#isUIVisible = false;
1380
- }
1381
- }
1382
-
1383
- isOpen() {
1384
- return this.#isUIVisible;
1385
- }
1386
-
1387
- refresh() {
1388
- if (!this.#lobbyStatusText)
1389
- {
1390
- console.log("Not the lobby status text");
1391
- return;
1392
- }
1393
- // refresh the lobby status text:
1394
- if (combatCountdownStarted) {
1395
- mod.SetUITextLabel(this.#lobbyStatusText, MakeMessage(mod.stringkeys.combatStartDelayCountdown, combatStartDelayRemaining));
1396
- } else {
1397
- mod.SetUITextLabel(this.#lobbyStatusText, MakeMessage(mod.stringkeys.waitingforplayersX, initialPlayerCount, 16));
1398
- }
1399
- }
1400
-
1401
- #create() {
1402
- // background:
1403
- this.#rootWidget = ParseUI({
1404
- type: "Container",
1405
- size: [this.#containerWidth, this.#containerHeight],
1406
- position: [0, 100],
1407
- anchor: mod.UIAnchor.TopCenter,
1408
- bgFill: mod.UIBgFill.Solid,
1409
- bgColor: this.#activeTabBgColor,
1410
- bgAlpha: 1,
1411
- playerId: this.#jsPlayer.player,
1412
- children: [{
1413
- // Black Background
1414
- type: "Container",
1415
- position: [0, 0],
1416
- size: [this.#containerWidth - this.#backgroundSpacing, this.#containerHeight - this.#backgroundSpacing],
1417
- anchor: mod.UIAnchor.Center,
1418
- bgFill: mod.UIBgFill.Solid,
1419
- bgColor: [0.1, 0.1, 0.1],
1420
- bgAlpha: 1
1421
- }, {
1422
- // Line Break Line
1423
- type: "Container",
1424
- position: [0, 100],
1425
- size: [this.#containerWidth - 50, this.#lineBreakHeight],
1426
- anchor: mod.UIAnchor.BottomCenter,
1427
- bgFill: mod.UIBgFill.Solid,
1428
- bgColor: BLACKCOLOR,
1429
- bgAlpha: 1
1430
- }, {
1431
- // Experience Title Text:
1432
- type: "Text",
1433
- textSize: 72,
1434
- position: [0, 25, 0],
1435
- size: [this.#containerWidth, 150],
1436
- anchor: mod.UIAnchor.TopCenter,
1437
- textAnchor: mod.UIAnchor.TopCenter,
1438
- bgAlpha: 0,
1439
- //bgColor: REDCOLOR,
1440
- textLabel: MakeMessage(mod.stringkeys.titleLineOne),
1441
- },
1442
- {
1443
- // Experience Title Text:
1444
- type: "Text",
1445
- textSize: 72,
1446
- position: [0, 90, 0],
1447
- size: [this.#containerWidth, 150],
1448
- anchor: mod.UIAnchor.TopCenter,
1449
- textAnchor: mod.UIAnchor.TopCenter,
1450
- bgAlpha: 0,
1451
- //bgColor: REDCOLOR,
1452
- textLabel: MakeMessage(mod.stringkeys.titleLineTwo),
1453
- }]
1454
- });
1455
- // lobby status text:
1456
- this.#lobbyStatusText = ParseUI({
1457
- type: "Text",
1458
- parent: this.#rootWidget,
1459
- textSize: 36,
1460
- position: [0, 30, 0],
1461
- size: [this.#containerWidth, 50],
1462
- anchor: mod.UIAnchor.BottomCenter,
1463
- textAnchor: mod.UIAnchor.Center,
1464
- bgAlpha: 0,
1465
- //bgColor: REDCOLOR,
1466
- textLabel: MakeMessage(mod.stringkeys.waitingforplayersX, initialPlayerCount, 16),
1467
- });
1468
- }
1469
- }
1470
-
1471
- class MessageUI {
1472
- #jsPlayer;
1473
- #rootWidget: mod.UIWidget|undefined;
1474
-
1475
- #containerWidth = 700;
1476
- #containerHeight = 100;
1477
- #lineBreakHeight = 3;
1478
- #backgroundSpacing = 4;
1479
- #activeTabBgColor = [0, 0, 0];
1480
-
1481
- #messageText: mod.UIWidget|undefined;
1482
-
1483
- #isUIVisible = false;
1484
-
1485
- constructor(jsPlayer: JsPlayer) {
1486
- this.#jsPlayer = jsPlayer;
1487
- }
1488
-
1489
- open(message: mod.Message, textColor: number[]) {
1490
- console.log("Open message UI");
1491
- if (!this.#rootWidget)
1492
- this.#create(message, textColor);
1493
- else {
1494
- this.refresh(message);
1495
- if (this.#messageText && textColor.length >= 3)
1496
- mod.SetUITextColor(this.#messageText, mod.CreateVector(textColor[0], textColor[1], textColor[2]));
1497
- }
1498
-
1499
- if (!this.#rootWidget)
1500
- return;
1501
-
1502
- mod.SetUIWidgetVisible(this.#rootWidget, true);
1503
- this.#isUIVisible = true;
1504
- }
1505
-
1506
- close() {
1507
- if (this.#rootWidget) {
1508
- mod.SetUIWidgetVisible(this.#rootWidget, false);
1509
- this.#isUIVisible = false;
1510
- }
1511
- }
1512
-
1513
- isOpen() {
1514
- return this.#isUIVisible;
1515
- }
1516
-
1517
- refresh(message: mod.Message) {
1518
- console.log("refresh message text with ", );
1519
- if (!this.#messageText)
1520
- {
1521
- console.log("Missing Message Text!");
1522
- return;
1523
- }
1524
- mod.SetUITextLabel(this.#messageText, message);
1525
-
1526
- }
1527
-
1528
- #create(message: mod.Message, textColor: number[]) {
1529
- // background:
1530
- this.#rootWidget = ParseUI({
1531
- type: "Container",
1532
- size: [this.#containerWidth, this.#containerHeight],
1533
- position: [0, 25],
1534
- anchor: mod.UIAnchor.TopCenter,
1535
- bgFill: mod.UIBgFill.Blur,
1536
- bgColor: this.#activeTabBgColor,
1537
- bgAlpha: 1,
1538
- playerId: this.#jsPlayer.player,
1539
- children: [{
1540
- // Black Background
1541
- type: "Container",
1542
- position: [0, 0],
1543
- size: [this.#containerWidth - this.#backgroundSpacing, this.#containerHeight - this.#backgroundSpacing],
1544
- anchor: mod.UIAnchor.Center,
1545
- bgFill: mod.UIBgFill.Blur,
1546
- bgColor: BLACKCOLOR,
1547
- bgAlpha: 1,
1548
- },
1549
- ]});
1550
- // message
1551
- this.#messageText = ParseUI({
1552
- type: "Text",
1553
- parent: this.#rootWidget,
1554
- textSize: 36,
1555
- position: [0, 30, 0],
1556
- size: [this.#containerWidth, 50],
1557
- anchor: mod.UIAnchor.BottomCenter,
1558
- textAnchor: mod.UIAnchor.Center,
1559
- bgAlpha: 0,
1560
- textColor: textColor,
1561
- //bgColor: [1, 0, 0],
1562
- textLabel: message,
1563
- });
1564
- }
1565
- }
1566
-
1567
-
1568
- //-----------------------------------------------------------------------------------------------//
1569
- //-----------------------------------------------------------------------------------------------//
1570
- //-----------------------------------------------------------------------------------------------//
1571
- //-----------------------------------------------------------------------------------------------//
1572
- // Helper functions to create UI from a JSON object tree:
1573
- //-----------------------------------------------------------------------------------------------//
1574
-
1575
- type UIVector = mod.Vector | number[];
1576
-
1577
- interface UIParams {
1578
- name: string;
1579
- type: string;
1580
- position: any;
1581
- size: any;
1582
- anchor: mod.UIAnchor;
1583
- parent: mod.UIWidget;
1584
- visible: boolean;
1585
- textLabel: string;
1586
- textColor: UIVector;
1587
- textAlpha: number;
1588
- textSize: number;
1589
- textAnchor: mod.UIAnchor;
1590
- padding: number;
1591
- bgColor: UIVector;
1592
- bgAlpha: number;
1593
- bgFill: mod.UIBgFill;
1594
- imageType: mod.UIImageType;
1595
- imageColor: UIVector;
1596
- imageAlpha: number;
1597
- teamId?: mod.Team;
1598
- playerId?: mod.Player;
1599
- children?: any[];
1600
- buttonEnabled: boolean;
1601
- buttonColorBase: UIVector;
1602
- buttonAlphaBase: number;
1603
- buttonColorDisabled: UIVector;
1604
- buttonAlphaDisabled: number;
1605
- buttonColorPressed: UIVector;
1606
- buttonAlphaPressed: number;
1607
- buttonColorHover: UIVector;
1608
- buttonAlphaHover: number;
1609
- buttonColorFocused: UIVector;
1610
- buttonAlphaFocused: number;
1611
- }
1612
-
1613
- function __asModVector(param: number[]|mod.Vector) {
1614
- if (Array.isArray(param))
1615
- return mod.CreateVector(param[0], param[1], param.length == 2 ? 0 : param[2]);
1616
- else
1617
- return param;
1618
- }
1619
-
1620
- function __asModMessage(param: string|mod.Message) {
1621
- if (typeof (param) === "string")
1622
- return mod.Message(param);
1623
- return param;
1624
- }
1625
-
1626
- function __fillInDefaultArgs(params: UIParams) {
1627
- if (!params.hasOwnProperty('name'))
1628
- params.name = "";
1629
- if (!params.hasOwnProperty('position'))
1630
- params.position = mod.CreateVector(0, 0, 0);
1631
- if (!params.hasOwnProperty('size'))
1632
- params.size = mod.CreateVector(100, 100, 0);
1633
- if (!params.hasOwnProperty('anchor'))
1634
- params.anchor = mod.UIAnchor.TopLeft;
1635
- if (!params.hasOwnProperty('parent'))
1636
- params.parent = mod.GetUIRoot();
1637
- if (!params.hasOwnProperty('visible'))
1638
- params.visible = true;
1639
- if (!params.hasOwnProperty('padding'))
1640
- params.padding = (params.type == "Container") ? 0 : 8;
1641
- if (!params.hasOwnProperty('bgColor'))
1642
- params.bgColor = mod.CreateVector(0.25, 0.25, 0.25);
1643
- if (!params.hasOwnProperty('bgAlpha'))
1644
- params.bgAlpha = 0.5;
1645
- if (!params.hasOwnProperty('bgFill'))
1646
- params.bgFill = mod.UIBgFill.Solid;
1647
- }
1648
-
1649
- function __setNameAndGetWidget(uniqueName: any, params: any) {
1650
- let widget = mod.FindUIWidgetWithName(uniqueName) as mod.UIWidget;
1651
- mod.SetUIWidgetName(widget, params.name);
1652
- return widget;
1653
- }
1654
-
1655
- const __cUniqueName = "----uniquename----";
1656
-
1657
- function __addUIContainer(params: UIParams) {
1658
- __fillInDefaultArgs(params);
1659
- let restrict = params.teamId ?? params.playerId;
1660
- if (restrict) {
1661
- mod.AddUIContainer(__cUniqueName,
1662
- __asModVector(params.position),
1663
- __asModVector(params.size),
1664
- params.anchor,
1665
- params.parent,
1666
- params.visible,
1667
- params.padding,
1668
- __asModVector(params.bgColor),
1669
- params.bgAlpha,
1670
- params.bgFill,
1671
- restrict);
1672
- } else {
1673
- mod.AddUIContainer(__cUniqueName,
1674
- __asModVector(params.position),
1675
- __asModVector(params.size),
1676
- params.anchor,
1677
- params.parent,
1678
- params.visible,
1679
- params.padding,
1680
- __asModVector(params.bgColor),
1681
- params.bgAlpha,
1682
- params.bgFill);
1683
- }
1684
- let widget = __setNameAndGetWidget(__cUniqueName, params);
1685
- if (params.children) {
1686
- params.children.forEach((childParams: any) => {
1687
- childParams.parent = widget;
1688
- __addUIWidget(childParams);
1689
- });
1690
- }
1691
- return widget;
1692
- }
1693
-
1694
- function __fillInDefaultTextArgs(params: UIParams) {
1695
- if (!params.hasOwnProperty('textLabel'))
1696
- params.textLabel = "";
1697
- if (!params.hasOwnProperty('textSize'))
1698
- params.textSize = 0;
1699
- if (!params.hasOwnProperty('textColor'))
1700
- params.textColor = mod.CreateVector(1, 1, 1);
1701
- if (!params.hasOwnProperty('textAlpha'))
1702
- params.textAlpha = 1;
1703
- if (!params.hasOwnProperty('textAnchor'))
1704
- params.textAnchor = mod.UIAnchor.CenterLeft;
1705
- }
1706
-
1707
- function __addUIText(params: UIParams) {
1708
- __fillInDefaultArgs(params);
1709
- __fillInDefaultTextArgs(params);
1710
- let restrict = params.teamId ?? params.playerId;
1711
- if (restrict) {
1712
- mod.AddUIText(__cUniqueName,
1713
- __asModVector(params.position),
1714
- __asModVector(params.size),
1715
- params.anchor,
1716
- params.parent,
1717
- params.visible,
1718
- params.padding,
1719
- __asModVector(params.bgColor),
1720
- params.bgAlpha,
1721
- params.bgFill,
1722
- __asModMessage(params.textLabel),
1723
- params.textSize,
1724
- __asModVector(params.textColor),
1725
- params.textAlpha,
1726
- params.textAnchor,
1727
- restrict);
1728
- } else {
1729
- mod.AddUIText(__cUniqueName,
1730
- __asModVector(params.position),
1731
- __asModVector(params.size),
1732
- params.anchor,
1733
- params.parent,
1734
- params.visible,
1735
- params.padding,
1736
- __asModVector(params.bgColor),
1737
- params.bgAlpha,
1738
- params.bgFill,
1739
- __asModMessage(params.textLabel),
1740
- params.textSize,
1741
- __asModVector(params.textColor),
1742
- params.textAlpha,
1743
- params.textAnchor);
1744
- }
1745
- return __setNameAndGetWidget(__cUniqueName, params);
1746
- }
1747
-
1748
- function __fillInDefaultImageArgs(params: any) {
1749
- if (!params.hasOwnProperty('imageType'))
1750
- params.imageType = mod.UIImageType.None;
1751
- if (!params.hasOwnProperty('imageColor'))
1752
- params.imageColor = mod.CreateVector(1, 1, 1);
1753
- if (!params.hasOwnProperty('imageAlpha'))
1754
- params.imageAlpha = 1;
1755
- }
1756
-
1757
- function __addUIImage(params: UIParams) {
1758
- __fillInDefaultArgs(params);
1759
- __fillInDefaultImageArgs(params);
1760
- let restrict = params.teamId ?? params.playerId;
1761
- if (restrict) {
1762
- mod.AddUIImage(__cUniqueName,
1763
- __asModVector(params.position),
1764
- __asModVector(params.size),
1765
- params.anchor,
1766
- params.parent,
1767
- params.visible,
1768
- params.padding,
1769
- __asModVector(params.bgColor),
1770
- params.bgAlpha,
1771
- params.bgFill,
1772
- params.imageType,
1773
- __asModVector(params.imageColor),
1774
- params.imageAlpha,
1775
- restrict);
1776
- } else {
1777
- mod.AddUIImage(__cUniqueName,
1778
- __asModVector(params.position),
1779
- __asModVector(params.size),
1780
- params.anchor,
1781
- params.parent,
1782
- params.visible,
1783
- params.padding,
1784
- __asModVector(params.bgColor),
1785
- params.bgAlpha,
1786
- params.bgFill,
1787
- params.imageType,
1788
- __asModVector(params.imageColor),
1789
- params.imageAlpha);
1790
- }
1791
- return __setNameAndGetWidget(__cUniqueName, params);
1792
- }
1793
-
1794
- function __fillInDefaultArg(params: any, argName: any, defaultValue: any) {
1795
- if (!params.hasOwnProperty(argName))
1796
- params[argName] = defaultValue;
1797
- }
1798
-
1799
- function __fillInDefaultButtonArgs(params: any) {
1800
- if (!params.hasOwnProperty('buttonEnabled'))
1801
- params.buttonEnabled = true;
1802
- if (!params.hasOwnProperty('buttonColorBase'))
1803
- params.buttonColorBase = mod.CreateVector(0.7, 0.7, 0.7);
1804
- if (!params.hasOwnProperty('buttonAlphaBase'))
1805
- params.buttonAlphaBase = 1;
1806
- if (!params.hasOwnProperty('buttonColorDisabled'))
1807
- params.buttonColorDisabled = mod.CreateVector(0.2, 0.2, 0.2);
1808
- if (!params.hasOwnProperty('buttonAlphaDisabled'))
1809
- params.buttonAlphaDisabled = 0.5;
1810
- if (!params.hasOwnProperty('buttonColorPressed'))
1811
- params.buttonColorPressed = mod.CreateVector(0.25, 0.25, 0.25);
1812
- if (!params.hasOwnProperty('buttonAlphaPressed'))
1813
- params.buttonAlphaPressed = 1;
1814
- if (!params.hasOwnProperty('buttonColorHover'))
1815
- params.buttonColorHover = mod.CreateVector(1,1,1);
1816
- if (!params.hasOwnProperty('buttonAlphaHover'))
1817
- params.buttonAlphaHover = 1;
1818
- if (!params.hasOwnProperty('buttonColorFocused'))
1819
- params.buttonColorFocused = mod.CreateVector(1,1,1);
1820
- if (!params.hasOwnProperty('buttonAlphaFocused'))
1821
- params.buttonAlphaFocused = 1;
1822
- }
1823
-
1824
- function __addUIButton(params: UIParams) {
1825
- __fillInDefaultArgs(params);
1826
- __fillInDefaultButtonArgs(params);
1827
- let restrict = params.teamId ?? params.playerId;
1828
- if (restrict) {
1829
- mod.AddUIButton(__cUniqueName,
1830
- __asModVector(params.position),
1831
- __asModVector(params.size),
1832
- params.anchor,
1833
- params.parent,
1834
- params.visible,
1835
- params.padding,
1836
- __asModVector(params.bgColor),
1837
- params.bgAlpha,
1838
- params.bgFill,
1839
- params.buttonEnabled,
1840
- __asModVector(params.buttonColorBase), params.buttonAlphaBase,
1841
- __asModVector(params.buttonColorDisabled), params.buttonAlphaDisabled,
1842
- __asModVector(params.buttonColorPressed), params.buttonAlphaPressed,
1843
- __asModVector(params.buttonColorHover), params.buttonAlphaHover,
1844
- __asModVector(params.buttonColorFocused), params.buttonAlphaFocused,
1845
- restrict);
1846
- } else {
1847
- mod.AddUIButton(__cUniqueName,
1848
- __asModVector(params.position),
1849
- __asModVector(params.size),
1850
- params.anchor,
1851
- params.parent,
1852
- params.visible,
1853
- params.padding,
1854
- __asModVector(params.bgColor),
1855
- params.bgAlpha,
1856
- params.bgFill,
1857
- params.buttonEnabled,
1858
- __asModVector(params.buttonColorBase), params.buttonAlphaBase,
1859
- __asModVector(params.buttonColorDisabled), params.buttonAlphaDisabled,
1860
- __asModVector(params.buttonColorPressed), params.buttonAlphaPressed,
1861
- __asModVector(params.buttonColorHover), params.buttonAlphaHover,
1862
- __asModVector(params.buttonColorFocused), params.buttonAlphaFocused);
1863
- }
1864
- return __setNameAndGetWidget(__cUniqueName, params);
1865
- }
1866
-
1867
- function __addUIWidget(params: UIParams) {
1868
- if (params == null)
1869
- return undefined;
1870
- if (params.type == "Container")
1871
- return __addUIContainer(params);
1872
- else if (params.type == "Text")
1873
- return __addUIText(params);
1874
- else if (params.type == "Image")
1875
- return __addUIImage(params);
1876
- else if (params.type == "Button")
1877
- return __addUIButton(params);
1878
- return undefined;
1879
- }
1880
-
1881
- export function ParseUI(...params: any[]) {
1882
- let widget: mod.UIWidget|undefined;
1883
- for (let a = 0; a < params.length; a++) {
1884
- widget = __addUIWidget(params[a] as UIParams);
1885
- }
1886
- return widget;
1887
- }
1888
-
1889
-
1890
-
1891
- ///////////////////////////// UI Progress BAR ////////////////////////////////////
1892
- // class ProgressBar {
1893
-
1894
- // currentPercentage;
1895
-
1896
- // constructor(parent, anchor, position, size, barColor) {
1897
- // var padding = 6;
1898
- // this.size = [size[0]-padding*2, size[1]-padding*2];
1899
- // this.widget = ParseUI({
1900
- // type: "Container",
1901
- // parent: parent,
1902
- // position: position,
1903
- // size: size,
1904
- // anchor: anchor,
1905
- // padding: 0,
1906
- // bgFill: mod.UIBgFill.Solid,
1907
- // bgColor: [0,0,0],
1908
- // bgAlpha: 1,
1909
- // children: [{
1910
- // type: "Container",
1911
- // size: size,
1912
- // bgFill: mod.UIBgFill.OutlineThin,
1913
- // bgColor: [1,1,1],
1914
- // bgAlpha: 1
1915
- // }]
1916
- // });
1917
- // this.bar = ParseUI({
1918
- // type: "Container",
1919
- // parent: this.widget,
1920
- // position: [padding, padding],
1921
- // size: [size[0]*0.5, size[1]],
1922
- // anchor: mod.UIAnchor.TopLeft,
1923
- // bgFill: mod.UIBgFill.Solid,
1924
- // bgColor: barColor,
1925
- // bgAlpha: 1
1926
- // });
1927
- // }
1928
-
1929
- // setProgress(fillPercent) {
1930
- // if (fillPercent > 0){
1931
- // mod.SetUIWidgetSize(this.bar, mod.CreateVector(this.size[0]*fillPercent, this.size[1], 0));
1932
- // }
1933
- // else {
1934
- // mod.SetUIWidgetSize(this.bar, mod.CreateVector(this.size[0]*0, this.size[1], 0));
1935
- // }
1936
-
1937
- // this.currentPercentage = fillPercent;
1938
- // }
1939
-
1940
- // open() {
1941
- // mod.SetUIWidgetVisible(this.widget, true);
1942
-
1943
-
1944
- // }
1945
- // close() {
1946
- // mod.SetUIWidgetVisible(this.widget, false);
1947
- // }
1948
- // }