/** * @overview Life of German Reallife - Tuning tuning.js * @author hydrant * @copyright (c) 2008 - 2018 Life of German */ import * as NativeUI from '../libs/NativeUI'; const Menu = NativeUI.Menu; const UIMenuItem = NativeUI.UIMenuItem; const BadgeStyle = NativeUI.BadgeStyle; const Point = NativeUI.Point; const Color = NativeUI.Color; let screenRes = mp.game.graphics.getScreenResolution(0, 0); import vehicleColors from './colors'; import moneyformat from '../moneyformat'; export default function tuning(globalData: IGlobalData) { var keyBound = false; var currentPrimaryColor: number; var currentSecondaryColor: number; const disableInput = [75, 278, 279, 280, 281, 23, 59, 60, 71, 72, 74]; const carModTypes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 18, 22, -1, 25, 27, 28, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 46, 48, 69]; const carModSlotName = [ { Slot: 0, Name: "Spoiler", Price: 2000 }, { Slot: 1, Name: "Frontstoßstange", Price: 2000}, { Slot: 2, Name: "Heckstoßstange", Price: 2000 }, { Slot: 3, Name: "Seitenschweller", Price: 2000 }, { Slot: 4, Name: "Auspuff", Price: 2000 }, { Slot: 5, Name: "Rahmen", Price: 2000 }, { Slot: 6, Name: "Kühlergrill", Price: 2000 }, { Slot: 7, Name: "Motorhaube", Price: 2000 }, { Slot: 8, Name: "Extra 1", Price: 2000 }, { Slot: 9, Name: "Extra 2", Price: 2000 }, { Slot: 10, Name: "Dach", Price: 2000 }, { Slot: 11, Name: "Motor", Price: 2000 }, { Slot: 12, Name: "Bremsen", Price: 2000 }, { Slot: 13, Name: "Getriebe", Price: 2000 }, { Slot: 14, Name: "Hupe", Price: 2000 }, { Slot: 15, Name: "Federung", Price: 2000 }, { Slot: 18, Name: "Turbo", Price: 2000 }, { Slot: 22, Name: "Licht", Price: 2000 }, { Slot: 23, Name: "Reifen", Price: 2000 }, { Slot: -1, Name: "Lackierung", Price: 2000 }, { Slot: 25, Name: "Nummernschildhalter", Price: 2000 }, { Slot: 27, Name: "Innenausstatung", Price: 2000 }, { Slot: 28, Name: "Wackelkopf", Price: 2000 }, { Slot: 33, Name: "Lenkrad", Price: 2000 }, { Slot: 34, Name: "Schalthebel", Price: 2000 }, { Slot: 35, Name: "Schild", Price: 2000 }, { Slot: 38, Name: "Hydraulik", Price: 2000 }, { Slot: 39, Name: "Motorabdeckung", Price: 2000 }, { Slot: 40, Name: "Luftfilter", Price: 2000 }, { Slot: 41, Name: "Domstrebe", Price: 2000 }, { Slot: 42, Name: "Scheinwerferabdeckung", Price: 2000 }, { Slot: 43, Name: "Nebelscheinwerfer", Price: 2000 }, { Slot: 44, Name: "Dach-Extra", Price: 2000 }, { Slot: 46, Name: "Fenster", Price: 2000 }, { Slot: 48, Name: "Design", Price: 2000 } ]; const customPartNames = [ { Model: 1093792632, Names: [ { Slot: 8, Name: "Lüftungsschlitze" }, { Slot: 43, Name: "Motorhaubenstifte" } ] }, { Model: 223240013, Names: [ { Slot: 9, Name: "Heckkotflügel" } ] }, { Model: 1031562256, Names: [ { Slot: 5, Name: "Stoßdämpfer" } ] }, { Model: 3308022675, Names: [ { Slot: 9, Name: "Kotflügel" } ] } ]; const doorOpeners = [ { Model: 3308022675, Doors: [ { Slot: 5, Door: 4 } ] } ]; var mainMenu: NativeUI.Menu; mp.events.add('showTuningInfo', () => { //mp.game.ui.setTextComponentFormat('STRING'); //mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um dein Fahrzeug zu modifizieren'); //mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1); mp.events.call("renderHelpTextOnScreen", "~s~Drücke ~g~E ~s~um dein Fahrzeug zu modifizieren") mp.keys.bind(0x45, false, keyPressHandler); keyBound = true; }); mp.events.add('hideTuningInfo', (unbind) => { mp.game.ui.clearHelp(true); mp.gui.chat.show(true); if (mp.players.local.vehicle) { mp.players.local.vehicle.setLights(0); } if (typeof mainMenu !== "undefined" && unbind) { mainMenu.Close(); globalData.InTuning = false; } if (keyBound && unbind) { mp.keys.unbind(0x45, false, keyPressHandler); keyBound = false; } }); function keyPressHandler() { mp.events.callRemote("startPlayerTuning"); } mp.events.add("render", () => { if (globalData.InTuning) { disableInput.forEach((input) => { mp.game.controls.disableControlAction(1, input, true); }); } }); var currentMod = new Array(); var currentActiveModItem = new Array(); var currentSelectedItem: VehicleModMenuItem = null; mp.events.add("showTuningMenu", () => { mp.events.call("hideTuningInfo", false); mp.gui.chat.show(false); var localPlayer = mp.players.local; var localVehicle = localPlayer.vehicle; localVehicle.setHalt(1.0, 1, false); globalData.InMenu = true; globalData.InTuning = true; localVehicle.setLights(1); var carName = mp.game.ui.getLabelText(mp.game.vehicle.getDisplayNameFromVehicleModel(localVehicle.model)); mainMenu = new Menu("Fahrzeugwerkstatt", carName, new Point(0, screenRes.y / 3), null, null); var repairItem = new UIMenuItem("Fahrzeug reparieren"); mainMenu.AddItem(repairItem); repairItem.BackColor = new Color(94, 94, 94); repairItem.HighlightedBackColor = new Color(105, 105, 105); carModTypes.forEach((modType) => { var mod: number = null; if (modType === 22) { // Lichter var hlColor = localVehicle.getVariable("headlightColor"); if (typeof hlColor !== "number" || isNaN(hlColor) || hlColor < 0 || hlColor === 255) { mod = -1; } else if (hlColor === 13) mod = 0; else mod = hlColor + 1; } else if (modType === 18) { // Turbo var toggle = localVehicle.isToggleModOn(modType); mod = toggle ? 0 : -1; } else if (modType == -1) { // Lackierungen var colorItem = new UIMenuItem("Lackierungen"); var colorMenu = getColorMenu(); mainMenu.AddItem(colorItem); mainMenu.BindMenuToItem(colorMenu, colorItem); return; } var num = localVehicle.getNumMods(modType); if (num === 0 && modType !== 18 && modType !== 22 && modType !== -1) return; var modName = localVehicle.getModSlotName(modType) || "nix gefunden"; modName = mp.game.ui.getLabelText(modName); if (modName === "NULL") { for (var x = 0; x < carModSlotName.length; x++) { var tmpSlot = carModSlotName[x]; if (tmpSlot.Slot == modType) { modName = tmpSlot.Name; break; } } } var price = getModSlotPrice(modType); if (mod === null) { mod = localVehicle.getMod(modType); } var modNum = localVehicle.getNumMods(modType); if (modType === 18) modNum = 1; if (modType === 22) modNum = 14; var modMenu = new Menu(modName, carName, new Point(0, screenRes.y / 3), null, null); modMenu.Visible = false; var menuItem = new UIMenuItem(modName); mainMenu.AddItem(menuItem); mainMenu.BindMenuToItem(modMenu, menuItem); currentMod[modType] = mod; for (var x = -1; x < modNum; x++) { var modText = ""; if (x === -1) { modText = "Serie"; } else { modText = mp.game.ui.getLabelText(localVehicle.getModTextLabel(modType, x)); if (modText === "NULL") modText = getModName(localVehicle, modType, x); } var item = new VehicleModMenuItem(modText); item.price = price; modMenu.AddItem(item); if (x === mod) { item.SetRightBadge(BadgeStyle.Car); currentActiveModItem[modType] = item; modMenu.CurrentSelection = x; } else { item.SetRightLabel("$"+ moneyformat(price)); } } modMenu.IndexChange.on((index: number) => { if (modType === 18) return; if (modType === 22) { setHeadlightsColor(localVehicle, index); return; } localVehicle.setMod(modType, index - 1); }); modMenu.MenuOpen.on(() => { if (modType === 22) { localVehicle.setLights(2); } }); modMenu.ItemSelect.on((item: VehicleModMenuItem, index: number) => { if (currentMod[modType] == index - 1) { return; } currentSelectedItem = item; mp.events.callRemote("setVehicleMod", modType, index, price); }); modMenu.MenuClose.on(() => { if (modType === 18) return; if (modType === 22) { localVehicle.setLights(1); setHeadlightsColor(localVehicle, currentMod[22] + 1); return; } localVehicle.setMod(modType, currentMod[modType]); }); }); mainMenu.ItemSelect.on((item: NativeUI.UIMenuItem, index: number) => { if (item === repairItem) { mp.events.callRemote("repairVehicle"); }; }); mainMenu.Visible = true; mainMenu.MenuClose.on(() => { localVehicle.setLights(0); globalData.InTuning = false; globalData.InMenu = false; mp.events.call("hideTuningInfo", false); }); }); mp.events.add("SERVER:Tuning_ModSucessfull", (modType: number, index: number) => { currentMod[modType] = index - 1; currentActiveModItem[modType].SetRightLabel("$" + moneyformat(currentSelectedItem.price)); currentActiveModItem[modType].SetRightBadge(NativeUI.BadgeStyle.None); currentSelectedItem.SetRightBadge(BadgeStyle.Car); currentSelectedItem.SetRightLabel(""); currentActiveModItem[modType] = currentSelectedItem; }); mp.events.add("playerLeaveVehicle", () => { if (keyBound) { mp.events.call("hideTuningInfo", true); } }); function getModName(vehicle: VehicleMp, slot: number, mod: number) { var modName = vehicle.getModTextLabel(slot, mod); var realModName = mp.game.ui.getLabelText(modName); if (slot === 11) { switch (mod) { case 0: realModName = "EMS Verbesserung 1"; break; case 1: realModName = "EMS Verbesserung 2"; break; case 2: realModName = "EMS Verbesserung 3"; break; case 3: realModName = "EMS Verbesserung 4"; break; } } else if (slot === 12) { switch (mod) { case 0: realModName = "Straßenbremsen"; break; case 1: realModName = "Sportbremsen"; break; case 2: realModName = "Rennbremsen"; break; case 3: realModName = "Wettkampfbremsen"; break; } } else if (slot === 13) { switch (mod) { case 0: realModName = "Straßengetriebe"; break; case 1: realModName = "Sportgetriebe"; break; case 2: realModName = "Renngetriebe"; break; case 3: realModName = "Wettkampfgetriebe"; } } else if (slot === 15) { switch (mod) { case 0: realModName = "Tiefere Federung"; break; case 1: realModName = "Straßenfederung"; break; case 2: realModName = "Sportfederung"; break; case 3: realModName = "Rennfederung"; break; case 4: realModName = "Wettkampffederung"; break; } } else if (slot === 18) { realModName = "Turbotuning"; } else if (slot === 22) { switch (mod) { case 0: realModName = "Xenon Licht"; break; case 1: realModName = "Weißes Licht"; break; case 2: realModName = "Blaues Licht"; break; case 3: realModName = "Hell-blaues Licht"; break; case 4: realModName = "Grünes Licht"; break; case 5: realModName = "Hell-grünes Licht"; break; case 6: realModName = "Hell-gelbes Licht"; break; case 7: realModName = "Gelbes Licht"; break; case 8: realModName = "Orangenes Licht"; break; case 9: realModName = "Rotes Licht"; break; case 10: realModName = "Hell-pinkes Licht"; break; case 11: realModName = "Pinkes Licht"; break; case 12: realModName = "Lila Licht"; break; case 13: realModName = "Schwarzlicht"; break; } } return realModName; } function getModSlotPrice(modType: number): number { return carModSlotName.filter(x => x.Slot == modType)[0].Price; } function setHeadlightsColor(vehicle, index) { if (!vehicle) { return; } var color = index - 2; if (index === 0) color = -1; if (index === 1) color = 13; if (typeof color !== "number" || isNaN(color) || color < 0 || color === 255) { // Disable vehicle.toggleMod(22, false); mp.game.invoke("0xE41033B25D003A07", vehicle.handle, 255); } else { // Enable vehicle.toggleMod(22, true); mp.game.invoke("0xE41033B25D003A07", vehicle.handle, color); } } function getColorMenu(): NativeUI.Menu { var currentColors = mp.players.local.vehicle.getColours(0, 0); currentPrimaryColor = currentColors.colorPrimary; currentSecondaryColor = currentColors.colorSecondary; var primaryColor = getSingleColorMenu("Primärfarbe", currentPrimaryColor, primaryColorSelect, primaryColorChange); var secondaryColor = getSingleColorMenu("Sekundärfarbe", currentSecondaryColor, secondaryColorSelect, secondaryColorChange); var menu = new Menu("Lackierungen", "Ändere die Farbe deines Fahrzeugs", new Point(0, screenRes.y / 3)); var primaryColorItem = new UIMenuItem("Primärfarbe"); var secondaryColorItem = new UIMenuItem("Sekundärfarbe"); secondaryColor.MenuClose.on(() => { mp.players.local.vehicle.setColours(currentPrimaryColor, currentSecondaryColor); }); primaryColor.MenuClose.on(() => { mp.players.local.vehicle.setColours(currentPrimaryColor, currentSecondaryColor); }); menu.AddItem(primaryColorItem); menu.AddItem(secondaryColorItem); menu.BindMenuToItem(primaryColor, primaryColorItem); menu.BindMenuToItem(secondaryColor, secondaryColorItem); return menu; } function getSingleColorMenu(title: string, currentColor: number, onSelect: (color: number) => void, onChange: (color: number) => void): NativeUI.Menu { var menu = new Menu(title, "Ändere die Farbe deines Fahrzeugs", new Point(0, screenRes.y / 3)); var colorCategories = Object.keys(vehicleColors); var currentColorItem: NativeUI.UIMenuItem = null; colorCategories.forEach(category => { var categoryItem = new UIMenuItem(category); menu.AddItem(categoryItem); var categoryMenu = new Menu(category, "Ändere die Farbe deines Fahrzeugs", new Point(0, screenRes.y / 3)); var categoryColors = Object.keys(vehicleColors[category]); categoryColors.forEach(categoryColor => { var color = vehicleColors[category][categoryColor]; var colorItem = new UIMenuItem(categoryColor); colorItem.Data = color; if (color === currentColor) { colorItem.SetRightBadge(BadgeStyle.Car); currentColorItem = colorItem; } categoryMenu.AddItem(colorItem); }); menu.BindMenuToItem(categoryMenu, categoryItem); categoryMenu.IndexChange.on((index, item: NativeUI.UIMenuItem) => { onChange(item.Data); }); categoryMenu.ItemSelect.on((item: NativeUI.UIMenuItem, index: number) => { currentColorItem.SetRightBadge(BadgeStyle.None); item.SetRightBadge(BadgeStyle.Car); currentColorItem = item; onSelect(item.Data); }); }); return menu; } function primaryColorChange(color: number) { mp.players.local.vehicle.setColours(color, currentSecondaryColor); } function primaryColorSelect(color: number) { currentPrimaryColor = color; mp.events.callRemote("CLIENT:TuningManager_SetVehicleColor", true, color); } function secondaryColorChange(color: number) { mp.players.local.vehicle.setColours(currentPrimaryColor, color); } function secondaryColorSelect(color: number) { currentSecondaryColor = color; mp.events.callRemote("CLIENT:TuningManager_SetVehicleColor", false, color); } class VehicleModMenuItem extends UIMenuItem { public price: number; } }