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 deathSeconds; var initTasks; 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 = 0; var deathTime; 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); globalData.InMenu = false; globalData.InInput = 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.InInput = false; }); break; case pointsTaskMenuLSPD: factionInteractionMenu.Visible = false; mp.gui.chat.activate(true); mp.gui.cursor.show(true, true); globalData.InMenu = false; globalData.InInput = 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.InInput = 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.InInput = true; var input = new InputHelper("Wie hoch soll der Ticketbetrag sein ?", globalData); mp.gui.cursor.show(true, true); input.show(); input.getValue(amount => { globalData.InInput = false; mp.events.call("CLIENT:InteractionMenu_LSPD_Ticket2", amount); mp.gui.cursor.show(false, false); }); }); mp.events.add("CLIENT:InteractionMenu_LSPD_Ticket2", (ticketPrice) => { globalData.InInput = true; var input = new InputHelper("Um welches Vergehen handelt es sich ?", globalData); mp.gui.cursor.show(true, true); input.show(); input.getValue(ticketReason => { globalData.InInput = 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.InInput = true; var input = new InputHelper("Wieviele Punkte werden vergeben ?", globalData); mp.gui.cursor.show(true, true); input.show(); input.getValue(amount => { globalData.InInput = 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.InInput = false; mp.gui.cursor.show(false, false); mp.gui.chat.activate(true); } else if (!globalData.InInput) { globalData.InInput = 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.InInput) { wantedlistBrowser.destroy(); wantedlistBrowser = null; globalData.InInput = 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; 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); */ } } 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; } }); factionInteractionMenu.MenuClose.on(() => { mp.gui.chat.activate(true); globalData.InMenu = false; }); }); mp.events.add("showMedicTasks", (type, taskList, deathTimes) => { tasks = JSON.parse(taskList); deathSeconds = JSON.parse(deathTimes); 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 / 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, index); 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(); deathTime = deathSeconds[index]; 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, index); 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("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("cutMedicEarnings", () => { deadRespawned = true; }); mp.events.add("destroyMedicTaskCheckpoint", () => { activeCheckpoint.destroy(); activeTask = null; timeLeft = 0; mp.events.callRemote("MedicTaskTimeout"); }); mp.events.add('playerEnterCheckpoint', (activeCheckpoint) => { if (deadRespawned == true) { activeCheckpoint.destroy(); mp.events.callRemote("PayCutMedicEarnings"); activeTask = null; deadRespawned = false; timeLeft = 0; } else if (activeTask.Type == 1){ activeCheckpoint.destroy(); mp.events.callRemote("delHealTaskAsMedic", activeTask.Victim); activeTask = null; } }); 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); } } var currentDate = new Date(); if (deadRespawned == false) { timeLeft = Math.round(Math.abs(Math.floor(currentDate.getTime() / 1000) - deathTime - 30)); if (timeLeft < 1) mp.events.call("cutMedicEarnings"); } else { timeLeft = Math.round(Math.abs(Math.floor(currentDate.getTime() / 1000) - deathTime - 60)); if (timeLeft < 1) mp.events.call("destroyMedicTaskCheckpoint"); } /*DEBUG TIMER für die Zeit die man noch hat zur Wiederbelebung if (deadRespawned == false) { mp.game.graphics.drawText(timeLeft.toString() + "s ", [0.5, 0.88], { font: 7, color: [60, 179, 113, 255], scale: [0.3, 0.3], outline: true, centre: true }); } else { { mp.game.graphics.drawText(timeLeft.toString() + "s", [0.5, 0.88], { font: 7, color: [255, 203, 145, 255], scale: [0.3, 0.3], outline: true, centre: true }); } } */ } }); }