import * as NativeUI from '../libs/NativeUI'; import InputHelper from '../inputhelper'; const Menu = NativeUI.Menu; const UIMenuItem = NativeUI.UIMenuItem; const UIMenuListItem = NativeUI.UIMenuListItem; const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem; const BadgeStyle = NativeUI.BadgeStyle; const Point = NativeUI.Point; const ItemsCollection = NativeUI.ItemsCollection; const Color = NativeUI.Color; export default function factionInteraction(globalData: IGlobalData) { var screenRes = mp.game.graphics.getScreenResolution(0, 0); var player = mp.players.local; var tasks; var initTasks; var newTasks; var sorting = 0; var firstSorting = true; var activeTask = false; var activeCheckpoint; var taskStart; var taskFinish; var taskRange; var ambulanceImagePos; var rangeLeft; var sortText; var ticketName: string; var pointsName: string; var factionInteractionMenu; var reviveTaskMenuMedic; /*mp.events.add("updateFactionBlips", (type, taskList) => { });*/ mp.events.add("showFactionInteractionLSPD", (userFactionId, isDuty, userFactionName, isFactionLeader) => { //LSPD let ticketTaskMenuLSPD; let pointsTaskMenuLSPD; if (userFactionId == 1 || userFactionId == 3) { if (isDuty) { mp.gui.chat.activate(false); globalData.InMenu = true; factionInteractionMenu = new Menu("Fraktionsinteraktion", userFactionName, new Point(0, screenRes.y / 2), null, null); if (isFactionLeader) { let leaderMenu = new UIMenuItem("Leadermen\u00fc", "Verwaltung der Fraktion"); leaderMenu.SetRightBadge(BadgeStyle.Star); factionInteractionMenu.AddItem(leaderMenu); } ticketTaskMenuLSPD = new UIMenuItem("Ticket ausstellen", "Einem Spieler ein Strafticket ausstellen."); factionInteractionMenu.AddItem(ticketTaskMenuLSPD); pointsTaskMenuLSPD = new UIMenuItem("Strafpunkte verteilen", "Einem Spieler Strafpunkte verteilen."); factionInteractionMenu.AddItem(pointsTaskMenuLSPD); /*TaskMenuLSPD = new UIMenuItem(""); TaskMenuLSPD.SetRightLabel(""); factionInteractionMenu.AddItem(TaskMenuLSPD);*/ //weiteres let cancelItem = new UIMenuItem("Schlie\u00dfen", "Schlie\u00dft die Fraktionsinteraktion."); cancelItem.BackColor = new Color(213, 0, 0); cancelItem.HighlightedBackColor = new Color(229, 57, 53); factionInteractionMenu.AddItem(cancelItem); factionInteractionMenu.Visible = true; factionInteractionMenu.ItemSelect.on((item) => { switch (item) { case cancelItem: factionInteractionMenu.Visible = false; mp.gui.chat.activate(true); globalData.InMenu = false; break; case ticketTaskMenuLSPD: factionInteractionMenu.Visible = false; mp.gui.chat.activate(true); mp.gui.cursor.show(true, true); globalData.InMenu = false; var input = new InputHelper("Welchem Spieler möchtest du ein Ticket geben (Name / ID)?", globalData); input.show(); input.getValue(name => { mp.events.call("CLIENT:InteractionMenu_LSPD_Ticket", name); mp.gui.cursor.show(false, false); }); break; case pointsTaskMenuLSPD: factionInteractionMenu.Visible = false; mp.gui.chat.activate(true); mp.gui.cursor.show(true, true); globalData.InMenu = false; var input = new InputHelper("Welchem Spieler möchtest du Strafpunkte geben (Name / ID)?", globalData); input.show(); input.getValue(name => { mp.events.call("CLIENT:InteractionMenu_LSPD_Points", name); }); break; } }); factionInteractionMenu.MenuClose.on(() => { mp.gui.chat.activate(true); globalData.InMenu = false; }); } } }); mp.events.add("CLIENT:InteractionMenu_LSPD_Ticket", (name) => { ticketName = name; var input = new InputHelper("Wie hoch soll der Ticketbetrag sein ?", globalData); mp.gui.cursor.show(true, true); input.show(); input.getValue(amount => { mp.events.call("CLIENT:InteractionMenu_LSPD_Ticket2", amount); mp.gui.cursor.show(false, false); }); }); mp.events.add("CLIENT:InteractionMenu_LSPD_Ticket2", (ticketPrice) => { var input = new InputHelper("Um welches Vergehen handelt es sich ?", globalData); mp.gui.cursor.show(true, true); input.show(); input.getValue(ticketReason => { mp.events.callRemote("CLIENT:InteractionMenu_LSPD_Ticket3", JSON.stringify(ticketName), ticketPrice, JSON.stringify(ticketReason)); mp.gui.cursor.show(false, false); }); }); mp.events.add("CLIENT:InteractionMenu_LSPD_Points", (name) => { pointsName = name; var input = new InputHelper("Wieviele Punkte werden vergeben ?", globalData); mp.gui.cursor.show(true, true); input.show(); input.getValue(amount => { mp.events.call("CLIENT:InteractionMenu_LSPD_Points2", amount); mp.gui.cursor.show(false, false); }); }); mp.events.add("CLIENT:InteractionMenu_LSPD_Points2", (pointsAmount) => { var input = new InputHelper("Um welches Vergehen handelt es sich ?", globalData); mp.gui.cursor.show(true, true); input.show(); input.getValue(pointsReason => { mp.events.callRemote("CLIENT:InteractionMenu_LSPD_Points3", JSON.stringify(pointsName), JSON.stringify(pointsAmount), JSON.stringify(pointsReason)); mp.gui.cursor.show(false, false); }); }); mp.events.add("showFactionInteractionMedic", (userFactionId, isDuty, userFactionName, isFactionLeader, reviveTaskCountMedic, healTaskCountMedic, fireTaskCountMedic) => { mp.gui.chat.activate(false); globalData.InMenu = true; //Medic var rPM = ((reviveTaskCountMedic === "0") ? "~r~" : "~g~"); var hPM = ((healTaskCountMedic === "0") ? "~r~" : "~g~"); var fPM = ((fireTaskCountMedic === "0") ? "~r~" : "~g~"); factionInteractionMenu = new Menu("Fraktionsinteraktion", userFactionName, new Point(0, screenRes.y / 2), null, null); if (isFactionLeader) { let leaderMenu = new UIMenuItem("Leadermen\u00fc", "Verwaltung der Fraktion"); leaderMenu.SetRightBadge(BadgeStyle.Star); factionInteractionMenu.AddItem(leaderMenu); } //Medic let reviveTaskMenuMedic; let healTaskMenuMedic; let fireTaskMenuMedic; if (userFactionId == 2) { if (isDuty) { reviveTaskMenuMedic = new UIMenuItem("Reviveauftr\u00e4ge"); reviveTaskMenuMedic.SetRightLabel(rPM + reviveTaskCountMedic) factionInteractionMenu.AddItem(reviveTaskMenuMedic); healTaskMenuMedic = new UIMenuItem("Healauftr\u00e4ge"); healTaskMenuMedic.SetRightLabel(hPM + healTaskCountMedic) factionInteractionMenu.AddItem(healTaskMenuMedic); fireTaskMenuMedic = new UIMenuItem("Feuerauftr\u00e4ge"); fireTaskMenuMedic.SetRightLabel(fPM + fireTaskCountMedic); factionInteractionMenu.AddItem(fireTaskMenuMedic); } } let cancelItem = new UIMenuItem("Schlie\u00dfen", "Schlie\u00dft die Fraktionsinteraktion."); cancelItem.BackColor = new Color(213, 0, 0); cancelItem.HighlightedBackColor = new Color(229, 57, 53); factionInteractionMenu.AddItem(cancelItem); factionInteractionMenu.Visible = true; factionInteractionMenu.ItemSelect.on((item) => { switch (item) { case cancelItem: factionInteractionMenu.Visible = false; mp.gui.chat.activate(true); globalData.InMenu = false; break; case reviveTaskMenuMedic: mp.events.callRemote("loadMedicTasks", 0) factionInteractionMenu.Close(); mp.gui.chat.activate(true); globalData.InMenu = false; break; } }); factionInteractionMenu.MenuClose.on(() => { mp.gui.chat.activate(true); globalData.InMenu = false; }); }); mp.events.add("showMedicTasks", (type, taskList) => { mp.gui.chat.push("zeuch kam an"); mp.gui.chat.push("type = " + type.toString()); tasks = JSON.parse(taskList); if (sorting === 0) { initTasks = tasks; } mp.events.call("sortFactionTasks", false); mp.gui.chat.activate(false); globalData.InMenu = true; switch (type) { case 0: reviveTaskMenuMedic = new Menu("Revives", "\u00c4lteste zu erst", new Point(0, screenRes.y / 2), null, null); let aTask; for (var i = 0; i < tasks.length; i++) { if (tasks[i].MedicName === "none") { aTask = new UIMenuItem("~g~" + tasks[i].Victim); } else { aTask = new UIMenuItem("~r~" + tasks[i].Victim); } aTask.SetRightLabel(mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, tasks[i].Position.x, tasks[i].Position.y, tasks[i].Position.z, true).toFixed(2).toString() + " ~g~m"); reviveTaskMenuMedic.AddItem(aTask); } let backItem = new UIMenuItem("Zur\u00fcck", "Zur\u00fcck zur Fraktionsinteraktion."); backItem.BackColor = new Color(213, 0, 0); backItem.HighlightedBackColor = new Color(229, 57, 53); reviveTaskMenuMedic.AddItem(backItem); reviveTaskMenuMedic.ItemSelect.on((item, index) => { if (item === backItem) { reviveTaskMenuMedic.Close(); factionInteractionMenu.Visible = true; } else { if (tasks[index].MedicName === "none") { mp.game.graphics.requestStreamedTextureDict("medicimages", true); mp.events.callRemote("updateMedicTask", 0, index, player.name); mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y); activeCheckpoint = mp.markers.new(1, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0, { color: [255, 0, 0, 150], visible: true, dimension: 0 }); reviveTaskMenuMedic.Close(); mp.gui.chat.activate(true); globalData.InMenu = false; ambulanceImagePos = 0.325 taskStart = player.position; taskFinish = tasks[index].Position; taskRange = mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z, true); activeTask = true; } } }); reviveTaskMenuMedic.Open(); reviveTaskMenuMedic.MenuClose.on(() => { reviveTaskMenuMedic.Visible = false; globalData.InMenu = false; }); break; case 1: break; case 2: break; } }); mp.events.add("sortFactionTasks", (sortByKey) => { if (firstSorting) { sortText = "Nach Uhrzeit"; firstSorting = false; //mp.gui.chat.push("Init Sort"); return; } else { if (sortByKey) { if (sorting < 1) { sorting++; } else { sorting = 0; } switch (sorting) { case 0: //Standartsortierung reviveTaskMenuMedic.Close(); factionInteractionMenu.Close(); sortText = "Nach Uhrzeit"; mp.events.call("showMedicTasks", 0, JSON.stringify(initTasks)); break; case 1: //Sortierung nach Metern (aufsteigend) for (var d = 0; d < tasks.length; d++) { for (var e = 0; e < tasks.length - 1; e++) { if (getDistance1(e) > getDistance2(e + 1)) { var tempTask = tasks[e]; tasks[e] = tasks[e + 1]; tasks[e + 1] = tempTask; mp.gui.chat.push("SWITCH"); } } } reviveTaskMenuMedic.Close(); factionInteractionMenu.Close(); sortText = "Entfernung aufsteigend"; mp.events.call("showMedicTasks", 0, JSON.stringify(tasks)); break; //case 2: //Sortierung nach Metern (absteigend) // mp.gui.chat.push("Sorting 2"); // sortText = "Entfernung absteigend"; // break; //case 3: //Sortierung nach Zeit (aufsteigend) // mp.gui.chat.push("Sorting 3"); // sortText = "Restzeit aufsteigend"; // break; //case 4: //Sortierung nach Zeit (absteigend) // mp.gui.chat.push("Sorting 4"); // sortText = "Restzeit absteigend"; // break; } } } }); function getDistance1(index) { return mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, newTasks[index].Position.x, newTasks[index].Position.y, newTasks[index].Position.z, true).toFixed(2); } function getDistance2(index) { return mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, newTasks[index].Position.x, newTasks[index].Position.y, newTasks[index].Position.z, true).toFixed(2); } mp.events.add('render', () => { if (activeTask) { rangeLeft = mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, taskFinish.x, taskFinish.y, taskFinish.z, true).toFixed(2); if (rangeLeft > 1.9) { ambulanceImagePos = 0.655 - (mp.game.gameplay.getDistanceBetweenCoords(player.position.x, player.position.y, player.position.z, taskFinish.x, taskFinish.y, taskFinish.z, true) / taskRange * 0.35); mp.game.graphics.drawRect(0.5, 0.945, 0.35, 0.025, 150, 0, 0, 200); mp.game.graphics.drawText(rangeLeft.toString() + "m", [0.5, 0.93], { font: 0, color: [255, 255, 255, 255], scale: [0.35, 0.35], outline: true, centre: true }); if (taskRange < rangeLeft) ambulanceImagePos = 0.3; mp.game.graphics.drawSprite("medicimages", "finish", 0.655, 0.898, 0.04, 0.07, 0, 255, 255, 255, 255); if (player.isInAnyVehicle(false)) { mp.game.graphics.drawSprite("medicimages", "ambulance", ambulanceImagePos + 0.01, 0.915, 0.04, 0.07, 0, 255, 255, 255, 255); } else { mp.game.graphics.drawSprite("medicimages", "running", ambulanceImagePos + 0.02, 0.915, 0.02, 0.035, 0, 255, 0, 0, 255); } } else { activeTask = false; activeCheckpoint.destroy(); } } }); }