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 newTasks; var sorting = 0; var firstSorting = true; var activeTask = null; var activeCheckpoint; var taskStart; var taskFinish; var taskRange; var ambulanceImagePos; var rangeLeft; var sortText; var deadRespawned = false; var timeLeft = null; var ticketName: string; var pointsName: string; var factionInteractionMenu; var healTaskMenuMedic; var reviveTaskMenuMedic; var insDate; /*mp.events.add("updateFactionBlips", (type, taskList) => { }); });*/ mp.events.add("showFactionInteractionLSPD", (userFactionId, isDuty, userFactionName, isFactionLeader) => { //LSPD let ticketTaskMenuLSPD; let pointsTaskMenuLSPD; let wantedsMenuLSPD 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 / 3), null, null); 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); wantedsMenuLSPD = new UIMenuItem("Verbrecher Liste"); factionInteractionMenu.AddItem(wantedsMenuLSPD); /*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); 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); globalData.InMenu = false; }); break; case pointsTaskMenuLSPD: factionInteractionMenu.Visible = false; mp.gui.chat.activate(true); mp.gui.cursor.show(true, true); 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); globalData.InMenu = false; }); break case wantedsMenuLSPD: factionInteractionMenu.Visible = false; mp.gui.chat.activate(true); globalData.InMenu = false; mp.events.callRemote("CLIENT:wantedlist"); break; } }); factionInteractionMenu.MenuClose.on(() => { mp.gui.chat.activate(true); globalData.InMenu = false; }); } } }); mp.events.add("CLIENT:InteractionMenu_LSPD_Ticket", (name) => { ticketName = name; globalData.InMenu = true; var input = new InputHelper("Wie hoch soll der Ticketbetrag sein ?", globalData); mp.gui.cursor.show(true, true); input.show(); input.getValue(amount => { globalData.InMenu = false; mp.events.call("CLIENT:InteractionMenu_LSPD_Ticket2", amount); mp.gui.cursor.show(false, false); }); }); mp.events.add("CLIENT:InteractionMenu_LSPD_Ticket2", (ticketPrice) => { globalData.InMenu = true; var input = new InputHelper("Um welches Vergehen handelt es sich ?", globalData); mp.gui.cursor.show(true, true); input.show(); input.getValue(ticketReason => { globalData.InMenu = false; 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; globalData.InMenu = true; var input = new InputHelper("Wieviele Punkte werden vergeben ?", globalData); mp.gui.cursor.show(true, true); input.show(); input.getValue(amount => { globalData.InMenu = false; 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); }); }); var wantedlistBrowser: BrowserMp = null; var wList; mp.events.add("showWantedlist", (playersJson) => { if (wantedlistBrowser !== null) { wantedlistBrowser.destroy(); wantedlistBrowser = null; globalData.InMenu = false; mp.gui.cursor.show(false, false); mp.gui.chat.activate(true); } else if (!globalData.InMenu) { globalData.InMenu = true; wantedlistBrowser = mp.browsers.new('package://assets/html/Wantedlist/wanteds.html'); mp.gui.chat.activate(false); mp.gui.cursor.show(true, true); wList = JSON.parse(playersJson); wList.forEach((player) => { wantedlistBrowser.execute(`ad_row('${JSON.stringify(player.Id)}','${JSON.stringify(player.Name)}','${JSON.stringify(player.wanted)}');`); }); } }); mp.events.add("removeWantedlist", () => { if (wantedlistBrowser == null) { return; } else if (globalData.InMenu) { wantedlistBrowser.destroy(); wantedlistBrowser = null; globalData.InMenu = false; mp.gui.cursor.show(false, false); mp.gui.chat.activate(true); } }); //Medic mp.events.add("showFactionInteractionMedic", (userFactionId, isDuty, userFactionName, isFactionLeader, reviveTaskCountMedic, healTaskCountMedic, fireTaskCountMedic) => { mp.gui.chat.activate(false); globalData.InMenu = true; 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 / 3), null, null); //Medic let reviveTaskMenuMedic; let healTaskMenuMedic; let fireTaskMenuMedic; let deleteCheckpointItem; 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"); //wenn die funktion dafür vorhanden ist wird das wieder eingebunden fireTaskMenuMedic.SetRightLabel(fPM + fireTaskCountMedic); factionInteractionMenu.AddItem(fireTaskMenuMedic); */ if (activeTask.Type == 1 && activeCheckpoint && mp.checkpoints.exists(activeCheckpoint)) { deleteCheckpointItem = new UIMenuItem("~r~Checkpoint löschen"); } } } 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; case healTaskMenuMedic: mp.events.callRemote("loadMedicTasks", 1) factionInteractionMenu.Close(); mp.gui.chat.activate(true); globalData.InMenu = false; break; case deleteCheckpointItem: 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) => { tasks = JSON.parse(taskList); //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 / 3), 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, tasks[index].Victim); mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y); activeCheckpoint = mp.checkpoints.new(1, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0, { direction: new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 5), 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 = tasks[index]; } } }); reviveTaskMenuMedic.Open(); reviveTaskMenuMedic.MenuClose.on(() => { reviveTaskMenuMedic.Visible = false; globalData.InMenu = false; }); break; case 1: healTaskMenuMedic = new Menu("Heal", "\u00c4lteste zu erst", new Point(0, screenRes.y / 3), null, null); let aTask1; for (var i = 0; i < tasks.length; i++) { if (tasks[i].MedicName === "none") { aTask1 = new UIMenuItem("~g~" + tasks[i].Victim); } else { aTask1 = new UIMenuItem("~r~" + tasks[i].Victim); } aTask1.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"); healTaskMenuMedic.AddItem(aTask1); } let backItem1 = new UIMenuItem("Zur\u00fcck", "Zur\u00fcck zur Fraktionsinteraktion."); backItem1.BackColor = new Color(213, 0, 0); backItem1.HighlightedBackColor = new Color(229, 57, 53); healTaskMenuMedic.AddItem(backItem1); healTaskMenuMedic.ItemSelect.on((item, index) => { if (item === backItem1) { healTaskMenuMedic.Close(); factionInteractionMenu.Visible = true; } else { if (tasks[index].MedicName === "none") { mp.game.graphics.requestStreamedTextureDict("medicimages", true); mp.events.callRemote("updateMedicTask", 1, tasks[index].Victim); mp.game.ui.setNewWaypoint(tasks[index].Position.x, tasks[index].Position.y); activeCheckpoint = mp.checkpoints.new(1, new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 2), 3.0, { direction: new mp.Vector3(tasks[index].Position.x, tasks[index].Position.y, tasks[index].Position.z - 5), color: [255, 0, 0, 150], visible: true, dimension: 0 }); healTaskMenuMedic.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 = tasks[index]; } } }); healTaskMenuMedic.Open(); healTaskMenuMedic.MenuClose.on(() => { healTaskMenuMedic.Visible = false; globalData.InMenu = false; }); case 2: break; } }); mp.events.add('playerEnterCheckpoint', (activeCheckpoint) => { if (activeTask.Type == 1) { activeCheckpoint.destroy(); activeCheckpoint = null; activeTask = null; timeLeft = null; } }); mp.events.add("destroyMedicTaskCheckpoint", () => { if (activeCheckpoint && mp.checkpoints.exists(activeCheckpoint)) { activeCheckpoint.destroy(); activeCheckpoint = null; activeTask = null; timeLeft = null; } }); mp.events.add('setTaskTimeLeft', (taskTimeLeft) => { if (activeTask) { timeLeft = taskTimeLeft; } }); function renderMedicGui() { 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); } } if (timeLeft != null) { if (deadRespawned == false) { if (timeLeft < 1) mp.events.call("destroyMedicTaskCheckpoint"); mp.game.graphics.drawText(timeLeft + "s", [0.5, 0.85], { font: 7, color: [60, 179, 113, 255], scale: [0.5, 0.5], outline: true, centre: true }); } else { { mp.game.graphics.drawText(timeLeft + "s", [0.5, 0.85], { font: 7, color: [255, 203, 145, 255], scale: [0.5, 0.5], outline: true, centre: true }); } } } } } mp.events.add('render', () => { renderMedicGui(); }); }