diff --git a/ReallifeGamemode.Client/Business/cardealer.js b/ReallifeGamemode.Client/Business/cardealer.js
deleted file mode 100644
index 03dc910e..00000000
--- a/ReallifeGamemode.Client/Business/cardealer.js
+++ /dev/null
@@ -1,60 +0,0 @@
-const NativeUI = require('../nativeui');
-const Menu = NativeUI.Menu;
-const UIMenuItem = NativeUI.UIMenuItem;
-const UIMenuListItem = NativeUI.UIMenuListItem;
-const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
-const UIMenuSliderItem = NativeUI.UIMenuSliderItem;
-const BadgeStyle = NativeUI.BadgeStyle;
-const Point = NativeUI.Point;
-const ItemsCollection = NativeUI.ItemsCollection;
-const Color = NativeUI.Color;
-const ListItem = NativeUI.ListItem;
-
-const moneyFormat = require("../moneyformat");
-
-var shopMenu;
-
-mp.events.add('ShopVehicle_OpenMenu', (businessName, price) => {
- var veh = mp.players.local.vehicle;
- if (!veh) return;
- mp.gui.chat.show(false);
- shopMenu = new Menu("Fahrzeugkauf", "Kaufe ein neues Auto", new Point(50, 50));
-
- var carItem = new UIMenuItem("Fahrzeugname");
- carItem.SetRightLabel(mp.game.ui.getLabelText(mp.game.vehicle.getDisplayNameFromVehicleModel(veh.model)));
- shopMenu.AddItem(carItem);
-
- var shopItem = new UIMenuItem("Autohaus");
- shopItem.SetRightLabel(businessName);
- shopMenu.AddItem(shopItem);
-
- var priceItem = new UIMenuItem("Preis");
- priceItem.SetRightLabel("~g~$~s~ "+ moneyFormat(price));
- shopMenu.AddItem(priceItem);
-
- var saveItem = new UIMenuItem("Kaufen");
- saveItem.BackColor = new Color(0, 100, 0);
- saveItem.HighlightedBackColor = new Color(0, 150, 0);
- shopMenu.AddItem(saveItem);
-
- var cancelItem = new UIMenuItem("Abbrechen");
- cancelItem.BackColor = new Color(213, 0, 0);
- cancelItem.HighlightedBackColor = new Color(229, 57, 53);
- shopMenu.AddItem(cancelItem);
-
- shopMenu.ItemSelect.on((item, index) => {
- if (item === cancelItem) {
- shopMenu.Close();
- } else if (item === saveItem) {
- mp.events.callRemote("VehShop_BuyVehicle");
- shopMenu.Close();
- }
- });
-
- shopMenu.MenuClose.on(() => {
- mp.gui.chat.show(true);
- mp.players.local.taskLeaveVehicle(veh.handle, 0);
- });
-
- shopMenu.Open();
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Business/cardealer.ts b/ReallifeGamemode.Client/Business/cardealer.ts
new file mode 100644
index 00000000..391df9d5
--- /dev/null
+++ b/ReallifeGamemode.Client/Business/cardealer.ts
@@ -0,0 +1,63 @@
+import * as NativeUI from 'NativeUI';
+const Menu = NativeUI.Menu;
+const UIMenuItem = NativeUI.UIMenuItem;
+const UIMenuListItem = NativeUI.UIMenuListItem;
+const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
+const UIMenuSliderItem = NativeUI.UIMenuSliderItem;
+const BadgeStyle = NativeUI.BadgeStyle;
+const Point = NativeUI.Point;
+const ItemsCollection = NativeUI.ItemsCollection;
+const Color = NativeUI.Color;
+const ListItem = NativeUI.ListItem;
+
+import moneyFormat from '../moneyformat';
+
+export default function carDealer() {
+
+ var shopMenu;
+
+ mp.events.add('ShopVehicle_OpenMenu', (businessName, price) => {
+ var veh = mp.players.local.vehicle;
+ if (!veh) return;
+ mp.gui.chat.show(false);
+ shopMenu = new Menu("Fahrzeugkauf", "Kaufe ein neues Auto", new Point(50, 50), null, null);
+
+ var carItem = new UIMenuItem("Fahrzeugname");
+ carItem.SetRightLabel(mp.game.ui.getLabelText(mp.game.vehicle.getDisplayNameFromVehicleModel(veh.model)));
+ shopMenu.AddItem(carItem);
+
+ var shopItem = new UIMenuItem("Autohaus");
+ shopItem.SetRightLabel(businessName);
+ shopMenu.AddItem(shopItem);
+
+ var priceItem = new UIMenuItem("Preis");
+ priceItem.SetRightLabel("~g~$~s~ " + moneyFormat(price));
+ shopMenu.AddItem(priceItem);
+
+ var saveItem = new UIMenuItem("Kaufen");
+ saveItem.BackColor = new Color(0, 100, 0);
+ saveItem.HighlightedBackColor = new Color(0, 150, 0);
+ shopMenu.AddItem(saveItem);
+
+ var cancelItem = new UIMenuItem("Abbrechen");
+ cancelItem.BackColor = new Color(213, 0, 0);
+ cancelItem.HighlightedBackColor = new Color(229, 57, 53);
+ shopMenu.AddItem(cancelItem);
+
+ shopMenu.ItemSelect.on((item, index) => {
+ if (item === cancelItem) {
+ shopMenu.Close();
+ } else if (item === saveItem) {
+ mp.events.callRemote("VehShop_BuyVehicle");
+ shopMenu.Close();
+ }
+ });
+
+ shopMenu.MenuClose.on(() => {
+ mp.gui.chat.show(true);
+ mp.players.local.taskLeaveVehicle(veh.handle, 0);
+ });
+
+ shopMenu.Open();
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Business/main.js b/ReallifeGamemode.Client/Business/main.js
deleted file mode 100644
index d4745049..00000000
--- a/ReallifeGamemode.Client/Business/main.js
+++ /dev/null
@@ -1,143 +0,0 @@
-var keyBound = false;
-
-var closeMenu = false;
-
-var businessName;
-var businessMoney;
-var mainMenu;
-var bankMenu;
-
-const NativeUI = require("../nativeui");
-const Menu = NativeUI.Menu;
-const UIMenuItem = NativeUI.UIMenuItem;
-const UIMenuListItem = NativeUI.UIMenuListItem;
-const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
-const UIMenuSliderItem = NativeUI.UIMenuSliderItem;
-const BadgeStyle = NativeUI.BadgeStyle;
-const Point = NativeUI.Point;
-const ItemsCollection = NativeUI.ItemsCollection;
-const Color = NativeUI.Color;
-const ListItem = NativeUI.ListItem;
-
-const InputHelper = require("../inputhelper");
-
-mp.events.add('business_showHelp', (bizName, bizMoney) => {
- mp.game.ui.setTextComponentFormat('STRING');
- mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um dein Business zu verwalten');
- mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1);
-
- businessName = bizName;
- businessMoney = bizMoney;
-
- mp.keys.bind(0x45, false, keyPressHandler);
- keyBound = true;
-});
-
-mp.events.add('business_removeHelp', (unbind) => {
- mp.game.ui.clearHelp(true);
- mp.gui.chat.show(true);
-
- if (keyBound && unbind) {
- if (typeof mainMenu !== "undefined") mainMenu.Close();
- if (typeof bankMenu !== "undefined") {
- closeMenu = true;
- bankMenu.Close();
- }
-
- mp.keys.unbind(0x45, false, keyPressHandler);
- keyBound = false;
- }
-});
-
-mp.events.add('business_updateMoney', (newMoney) => {
- businessMoney = newMoney;
-});
-
-function keyPressHandler() {
- mp.events.call('business_removeHelp', false);
- mp.gui.chat.show(false);
-
- if (typeof mainMenu !== "undefined" && mainMenu.Visible) {
- return;
- }
-
- if (typeof bankMenu !== "undefined" && bankMenu.Visible) {
- return;
- }
-
- mainMenu = new Menu("Businessverwaltung", businessName, new Point(50, 50));
-
- var bankAccountItem = new UIMenuItem("Businesskasse", "Verwalte die Businesskasse");
- bankAccountItem.SetRightLabel("~g~~h~" + businessMoney);
- mainMenu.AddItem(bankAccountItem);
-
- //var partnerItem = new UIMenuItem("Inteilhaber", "Verwalte den Inteilhaber");
- //partnerItem.SetRightLabel("Niemand");
- //mainMenu.AddItem(partnerItem);
-
- mainMenu.Open();
-
- mainMenu.ItemSelect.on((item, index) => {
- if (item === bankAccountItem) {
- // manage bank account
-
- bankMenu = new Menu("Bankkonto", businessName, new Point(50, 50));
-
- var infoItem = new UIMenuItem("Aktueller Kontostand");
- infoItem.SetRightLabel("~g~~h~" + businessMoney);
- bankMenu.AddItem(infoItem);
-
- var depositItem = new UIMenuItem("Einzahlen", "Zahle Geld auf die Businesskasse ein");
- bankMenu.AddItem(depositItem);
-
- var withdrawItem = new UIMenuItem("Auszahlen", "Zahle Geld von der Businesskasse aus");
- bankMenu.AddItem(withdrawItem);
-
- bankMenu.ItemSelect.on((item, index) => {
- if (item === depositItem) {
- var depositInput = new InputHelper("Wie viel Geld möchtest du auf deine Businesskasse einzahlen?");
- depositInput.show();
- depositInput.getValue((data) => {
- var amount = parseInt(data);
- if (isNaN(amount)) {
- mp.game.graphics.notify('~r~Du musst eine Nummer eingeben!');
- return;
- }
-
- mp.events.callRemote('Business_DepositMoney', amount);
- });
- } else if (item === withdrawItem) {
- var withdrawInput = new InputHelper("Wie viel Geld möchtest du von deiner Businesskasse abheben?");
- withdrawInput.show();
- withdrawInput.getValue((data) => {
- var amount = parseInt(data);
- if (isNaN(amount)) {
- mp.game.graphics.notify('~r~Du musst eine Nummer eingeben!');
- return;
- }
-
- mp.events.callRemote('Business_WithdrawMoney', amount);
- });
- }
- });
-
- bankMenu.MenuClose.on(() => {
- if (closeMenu) {
- closeMenu = false;
- return;
- }
- mainMenu.Visible = true;
- });
-
- bankMenu.Visible = true;
- mainMenu.Visible = false;
-
- } else if (item === partnerItem) {
- // manage partner
- }
- });
-
- mainMenu.MenuClose.on(() => {
- mp.events.call('business_removeHelp', false);
- });
-}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Business/main.ts b/ReallifeGamemode.Client/Business/main.ts
new file mode 100644
index 00000000..614ec8e7
--- /dev/null
+++ b/ReallifeGamemode.Client/Business/main.ts
@@ -0,0 +1,147 @@
+import * as NativeUI from 'NativeUI';
+const Menu = NativeUI.Menu;
+const UIMenuItem = NativeUI.UIMenuItem;
+const UIMenuListItem = NativeUI.UIMenuListItem;
+const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
+const UIMenuSliderItem = NativeUI.UIMenuSliderItem;
+const BadgeStyle = NativeUI.BadgeStyle;
+const Point = NativeUI.Point;
+const ItemsCollection = NativeUI.ItemsCollection;
+const Color = NativeUI.Color;
+const ListItem = NativeUI.ListItem;
+
+import InputHelper from '../inputhelper';
+
+export default function business() {
+
+ var keyBound = false;
+
+ var closeMenu = false;
+
+ var businessName;
+ var businessMoney;
+ var mainMenu;
+ var bankMenu;
+
+ mp.events.add('business_showHelp', (bizName, bizMoney) => {
+ mp.game.ui.setTextComponentFormat('STRING');
+ mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um dein Business zu verwalten');
+ mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1);
+
+ businessName = bizName;
+ businessMoney = bizMoney;
+
+ mp.keys.bind(0x45, false, keyPressHandler);
+ keyBound = true;
+ });
+
+ mp.events.add('business_removeHelp', (unbind) => {
+ mp.game.ui.clearHelp(true);
+ mp.gui.chat.show(true);
+
+ if (keyBound && unbind) {
+ if (typeof mainMenu !== "undefined") mainMenu.Close();
+ if (typeof bankMenu !== "undefined") {
+ closeMenu = true;
+ bankMenu.Close();
+ }
+
+ mp.keys.unbind(0x45, false, keyPressHandler);
+ keyBound = false;
+ }
+ });
+
+ mp.events.add('business_updateMoney', (newMoney) => {
+ businessMoney = newMoney;
+ });
+
+ function keyPressHandler() {
+ mp.events.call('business_removeHelp', false);
+ mp.gui.chat.show(false);
+
+ if (typeof mainMenu !== "undefined" && mainMenu.Visible) {
+ return;
+ }
+
+ if (typeof bankMenu !== "undefined" && bankMenu.Visible) {
+ return;
+ }
+
+ mainMenu = new Menu("Businessverwaltung", businessName, new Point(50, 50), null, null);
+
+ var bankAccountItem = new UIMenuItem("Businesskasse", "Verwalte die Businesskasse");
+ bankAccountItem.SetRightLabel("~g~~h~" + businessMoney);
+ mainMenu.AddItem(bankAccountItem);
+
+ //var partnerItem = new UIMenuItem("Inteilhaber", "Verwalte den Inteilhaber");
+ //partnerItem.SetRightLabel("Niemand");
+ //mainMenu.AddItem(partnerItem);
+
+ mainMenu.Open();
+
+ mainMenu.ItemSelect.on((item, index) => {
+ if (item === bankAccountItem) {
+ // manage bank account
+
+ bankMenu = new Menu("Bankkonto", businessName, new Point(50, 50), null, null);
+
+ var infoItem = new UIMenuItem("Aktueller Kontostand");
+ infoItem.SetRightLabel("~g~~h~" + businessMoney);
+ bankMenu.AddItem(infoItem);
+
+ var depositItem = new UIMenuItem("Einzahlen", "Zahle Geld auf die Businesskasse ein");
+ bankMenu.AddItem(depositItem);
+
+ var withdrawItem = new UIMenuItem("Auszahlen", "Zahle Geld von der Businesskasse aus");
+ bankMenu.AddItem(withdrawItem);
+
+ bankMenu.ItemSelect.on((item, index) => {
+ if (item === depositItem) {
+ var depositInput = new InputHelper("Wie viel Geld möchtest du auf deine Businesskasse einzahlen?");
+ depositInput.show();
+ depositInput.getValue((data) => {
+ var amount = parseInt(data);
+ if (isNaN(amount)) {
+ mp.game.graphics.notify('~r~Du musst eine Nummer eingeben!');
+ return;
+ }
+
+ mp.events.callRemote('Business_DepositMoney', amount);
+ });
+ } else if (item === withdrawItem) {
+ var withdrawInput = new InputHelper("Wie viel Geld möchtest du von deiner Businesskasse abheben?");
+ withdrawInput.show();
+ withdrawInput.getValue((data) => {
+ var amount = parseInt(data);
+ if (isNaN(amount)) {
+ mp.game.graphics.notify('~r~Du musst eine Nummer eingeben!');
+ return;
+ }
+
+ mp.events.callRemote('Business_WithdrawMoney', amount);
+ });
+ }
+ });
+
+ bankMenu.MenuClose.on(() => {
+ if (closeMenu) {
+ closeMenu = false;
+ return;
+ }
+ mainMenu.Visible = true;
+ });
+
+ bankMenu.Visible = true;
+ mainMenu.Visible = false;
+
+ }
+ //else if (item === partnerItem) {
+ // // manage partner
+ //}
+ });
+
+ mainMenu.MenuClose.on(() => {
+ mp.events.call('business_removeHelp', false);
+ });
+ }
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/CharCreator/data.js b/ReallifeGamemode.Client/CharCreator/data.ts
similarity index 97%
rename from ReallifeGamemode.Client/CharCreator/data.js
rename to ReallifeGamemode.Client/CharCreator/data.ts
index 39b67d3d..bb827216 100644
--- a/ReallifeGamemode.Client/CharCreator/data.js
+++ b/ReallifeGamemode.Client/CharCreator/data.ts
@@ -119,18 +119,23 @@ const hairList = [
const eyeColors = ["Green", "Emerald", "Light Blue", "Ocean Blue", "Light Brown", "Dark Brown", "Hazel", "Dark Gray", "Light Gray", "Pink", "Yellow", "Purple", "Blackout", "Shades of Gray", "Tequila Sunrise", "Atomic", "Warp", "ECola", "Space Ranger", "Ying Yang", "Bullseye", "Lizard", "Dragon", "Extra Terrestrial", "Goat", "Smiley", "Possessed", "Demon", "Infected", "Alien", "Undead", "Zombie"];
-exports = {
- fathers: fathers,
- mothers: mothers,
- fatherNames: fatherNames,
- motherNames: motherNames,
- featureNames: featureNames,
- appearanceNames: appearanceNames,
- appearanceItemNames: appearanceItemNames,
- hairList: hairList,
- eyeColors: eyeColors,
- maxHairColor: 64,
- maxEyeColor: 32,
- maxBlushColor: 27,
- maxLipstickColor: 32
+const maxHairColor = 64;
+const maxEyeColor = 32;
+const maxBlushColor = 27;
+const maxLipstickColor = 32;
+
+export {
+ fathers,
+ mothers,
+ fatherNames,
+ motherNames,
+ featureNames,
+ appearanceNames,
+ appearanceItemNames,
+ hairList,
+ eyeColors,
+ maxHairColor,
+ maxEyeColor,
+ maxBlushColor,
+ maxLipstickColor
};
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/CharCreator/index.js b/ReallifeGamemode.Client/CharCreator/index.js
deleted file mode 100644
index 07642af4..00000000
--- a/ReallifeGamemode.Client/CharCreator/index.js
+++ /dev/null
@@ -1,564 +0,0 @@
- // shitcode will be better in the future
-// , \u00dc, \u00fc
-// , \u00c4, \u00e4
-// , \u00d6, \u00f6
-// \u00df
-
-var creatorHairMenu;
-
-const NativeUI = require("../nativeui");
-const Data = require("./data");
-
-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;
-
-const creatorCoords = {
- camera: new mp.Vector3(402.8664, -997.5515, -98.5),
- cameraLookAt: new mp.Vector3(402.8664, -996.4108, -98.5)
-};
-
-const localPlayer = mp.players.local;
-
-function getRandomInt(min, max) {
- return Math.floor(Math.random() * (max - min + 1)) + min;
-}
-
-function colorForOverlayIdx(index) {
- let color;
-
- switch (index) {
- case 1:
- color = beardColorItem.Index;
- break;
-
- case 2:
- color = eyebrowColorItem.Index;
- break;
-
- case 5:
- color = blushColorItem.Index;
- break;
-
- case 8:
- color = lipstickColorItem.Index;
- break;
-
- case 10:
- color = chestHairColorItem.Index;
- break;
-
- default:
- color = 0;
- }
-
- return color;
-}
-
-function updateParents() {
- localPlayer.setHeadBlendData(
- // shape
- Data.mothers[motherItem.Index],
- Data.fathers[fatherItem.Index],
- 0,
-
- // skin
- Data.mothers[motherItem.Index],
- Data.fathers[fatherItem.Index],
- 0,
-
- // mixes
- similarityItem.Index * 0.01,
- skinSimilarityItem.Index * 0.01,
- 0.0,
-
- false
- );
-}
-
-function updateFaceFeature(index) {
- localPlayer.setFaceFeature(index, parseFloat(featureItems[index].SelectedValue));
-}
-
-function updateAppearance(index) {
- let overlayID = (appearanceItems[index].Index == 0) ? 255 : appearanceItems[index].Index - 1;
- localPlayer.setHeadOverlay(index, overlayID, appearanceOpacityItems[index].Index * 0.01, colorForOverlayIdx(index), 0);
-}
-
-function updateHairAndColors() {
- localPlayer.setComponentVariation(2, Data.hairList[currentGender][hairItem.Index].ID, 0, 2);
- localPlayer.setHairColor(hairColorItem.Index, hairHighlightItem.Index);
- localPlayer.setEyeColor(eyeColorItem.Index);
- localPlayer.setHeadOverlayColor(1, 1, beardColorItem.Index, 0);
- localPlayer.setHeadOverlayColor(2, 1, eyebrowColorItem.Index, 0);
- localPlayer.setHeadOverlayColor(5, 2, blushColorItem.Index, 0);
- localPlayer.setHeadOverlayColor(8, 2, lipstickColorItem.Index, 0);
- localPlayer.setHeadOverlayColor(10, 1, chestHairColorItem.Index, 0);
-}
-
-function applyCreatorOutfit() {
- if (currentGender == 0) {
- localPlayer.setDefaultComponentVariation();
- localPlayer.setComponentVariation(3, 15, 0, 2);
- localPlayer.setComponentVariation(4, 21, 0, 2);
- localPlayer.setComponentVariation(6, 34, 0, 2);
- localPlayer.setComponentVariation(8, 15, 0, 2);
- localPlayer.setComponentVariation(11, 15, 0, 2);
- } else {
- localPlayer.setDefaultComponentVariation();
- localPlayer.setComponentVariation(3, 15, 0, 2);
- localPlayer.setComponentVariation(4, 10, 0, 2);
- localPlayer.setComponentVariation(6, 35, 0, 2);
- localPlayer.setComponentVariation(8, 15, 0, 2);
- localPlayer.setComponentVariation(11, 15, 0, 2);
- }
-}
-
-function fillHairMenu() {
- hairItem = new UIMenuListItem("Haar", "Deine Haare", new ItemsCollection(Data.hairList[currentGender].map(h => h.Name)));
- creatorHairMenu.AddItem(hairItem);
-
- hairColorItem = new UIMenuListItem("Haarfarbe", "Deine Haarfarbe", new ItemsCollection(hairColors));
- creatorHairMenu.AddItem(hairColorItem);
-
- hairHighlightItem = new UIMenuListItem("Haarstr\u00e4hnen", "Farbe deiner Haarstr\u00e4hnen", new ItemsCollection(hairColors));
- creatorHairMenu.AddItem(hairHighlightItem);
-
- eyebrowColorItem = new UIMenuListItem("Augenbrauen Farbe", "Farbe deiner Augenbrauen", new ItemsCollection(hairColors));
- creatorHairMenu.AddItem(eyebrowColorItem);
-
- beardColorItem = new UIMenuListItem("Farbe der Gesichtsbehaarung", "Farbe deiner Gesichtsbehaarung", new ItemsCollection(hairColors));
- creatorHairMenu.AddItem(beardColorItem);
-
- eyeColorItem = new UIMenuListItem("Augenfarbe", "Farbe deiner Augen", new ItemsCollection(Data.eyeColors));
- creatorHairMenu.AddItem(eyeColorItem);
-
- blushColorItem = new UIMenuListItem("Rouge", "Farbe des Rouges.", new ItemsCollection(blushColors));
- creatorHairMenu.AddItem(blushColorItem);
-
- lipstickColorItem = new UIMenuListItem("Lippenstift Farbe", "Farbe deines Lippenstifts.", new ItemsCollection(lipstickColors));
- creatorHairMenu.AddItem(lipstickColorItem);
-
- chestHairColorItem = new UIMenuListItem("Farbe der Brustbehaarung", "Farbe deiner Brustbehaarung", new ItemsCollection(hairColors));
- creatorHairMenu.AddItem(chestHairColorItem);
-
- creatorHairMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4lliges Haar & Farben"));
- creatorHairMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Zur\u00fccksetzen von Haar & Farben"));
-}
-
-function resetParentsMenu(refresh = false) {
- fatherItem.Index = 0;
- motherItem.Index = 0;
- similarityItem.Index = (currentGender == 0) ? 100 : 0;
- skinSimilarityItem.Index = (currentGender == 0) ? 100 : 0;
-
- updateParents();
- if (refresh) creatorParentsMenu.RefreshIndex();
-}
-
-function resetFeaturesMenu(refresh = false) {
- for (let i = 0; i < Data.featureNames.length; i++) {
- featureItems[i].Index = 100;
- updateFaceFeature(i);
- }
-
- if (refresh) creatorFeaturesMenu.RefreshIndex();
-}
-
-function resetAppearanceMenu(refresh = false) {
- for (let i = 0; i < Data.appearanceNames.length; i++) {
- appearanceItems[i].Index = 0;
- appearanceOpacityItems[i].Index = 100;
- updateAppearance(i);
- }
-
- if (refresh) creatorAppearanceMenu.RefreshIndex();
-}
-
-function resetHairAndColorsMenu(refresh = false) {
- hairItem.Index = 0;
- hairColorItem.Index = 0;
- hairHighlightItem.Index = 0;
- eyebrowColorItem.Index = 0;
- beardColorItem.Index = 0;
- eyeColorItem.Index = 0;
- blushColorItem.Index = 0;
- lipstickColorItem.Index = 0;
- chestHairColorItem.Index = 0;
- updateHairAndColors();
-
- if (refresh) creatorHairMenu.RefreshIndex();
-}
-
-let currentGender = 0;
-let creatorMenus = [];
-let creatorCamera;
-
-// color arrays
-let hairColors = [];
-for (let i = 0; i < Data.maxHairColor; i++) hairColors.push(i.toString());
-
-let blushColors = [];
-for (let i = 0; i < Data.maxBlushColor; i++) blushColors.push(i.toString());
-
-let lipstickColors = [];
-for (let i = 0; i < Data.maxLipstickColor; i++) lipstickColors.push(i.toString());
-
-// CREATOR MAIN
-let creatorMainMenu = new Menu("Charaktererstellung", "", new Point(50, 50));
-let genderItem = new UIMenuListItem("Geschlecht", "~r~Dies setzt deine Einstellungen zur\u00fcck.", new ItemsCollection(["M\u00e4nnlich", "Weiblich"]));
-creatorMainMenu.AddItem(genderItem);
-creatorMainMenu.AddItem(new UIMenuItem("Eltern", "Eltern des Charakters."));
-creatorMainMenu.AddItem(new UIMenuItem("Gesichtsz\u00fcge", "Gesichtsz\u00fcge des Charakters."));
-creatorMainMenu.AddItem(new UIMenuItem("Aussehen", "Aussehen des Charakters."));
-creatorMainMenu.AddItem(new UIMenuItem("Haar & Farben", "Haare & Farben deines Charakters."));
-
-let angles = [];
-for (let i = -180.0; i <= 180.0; i += 5.0) angles.push(i.toFixed(1));
-let angleItem = new UIMenuListItem("Drehung", "", new ItemsCollection(angles));
-creatorMainMenu.AddItem(angleItem);
-
-let saveItem = new UIMenuItem("Erstellen", "Erstellt deinen Charakter.");
-saveItem.BackColor = new Color(13, 71, 161);
-saveItem.HighlightedBackColor = new Color(25, 118, 210);
-creatorMainMenu.AddItem(saveItem);
-
-//let cancelItem = new UIMenuItem("Abbrechen", "Setzt alle \u00c4nderungen zur\u00fcck.");
-//cancelItem.BackColor = new Color(213, 0, 0);
-//cancelItem.HighlightedBackColor = new Color(229, 57, 53);
-//creatorMainMenu.AddItem(cancelItem);
-
-creatorMainMenu.ListChange.on((item, listIndex) => {
- if (item == genderItem) {
- currentGender = listIndex;
- mp.events.callRemote("creator_GenderChange", listIndex);
-
- setTimeout(() => {
- localPlayer.clearTasksImmediately();
- applyCreatorOutfit();
- angleItem.Index = 0;
- resetParentsMenu(true);
- resetFeaturesMenu(true);
- resetAppearanceMenu(true);
-
- creatorHairMenu.Clear();
- fillHairMenu();
- creatorHairMenu.RefreshIndex();
- }, 200);
- } else if (item == angleItem) {
- localPlayer.setHeading(parseFloat(angleItem.SelectedValue));
- localPlayer.clearTasksImmediately();
- }
-});
-
-creatorMainMenu.ItemSelect.on((item, index) => {
- switch (index) {
- case 1:
- creatorMainMenu.Visible = false;
- creatorParentsMenu.Visible = true;
- break;
-
- case 2:
- creatorMainMenu.Visible = false;
- creatorFeaturesMenu.Visible = true;
- break;
-
- case 3:
- creatorMainMenu.Visible = false;
- creatorAppearanceMenu.Visible = true;
- break;
-
- case 4:
- creatorMainMenu.Visible = false;
- creatorHairMenu.Visible = true;
- break;
-
- case 6:
- let parentData = {
- Father: Data.fathers[fatherItem.Index],
- Mother: Data.mothers[motherItem.Index],
- Similarity: similarityItem.Index * 0.01,
- SkinSimilarity: skinSimilarityItem.Index * 0.01
- };
-
- let featureData = [];
- for (let i = 0; i < featureItems.length; i++) featureData.push(parseFloat(featureItems[i].SelectedValue));
-
- let appearanceData = [];
- for (let i = 0; i < appearanceItems.length; i++) appearanceData.push({Value: ((appearanceItems[i].Index == 0) ? 255 : appearanceItems[i].Index - 1), Opacity: appearanceOpacityItems[i].Index * 0.01});
-
- let hairAndColors = [
- Data.hairList[currentGender][hairItem.Index].ID,
- hairColorItem.Index,
- hairHighlightItem.Index,
- eyebrowColorItem.Index,
- beardColorItem.Index,
- eyeColorItem.Index,
- blushColorItem.Index,
- lipstickColorItem.Index,
- chestHairColorItem.Index
- ];
- for (let i = 0; i < creatorMenus.length; i++) creatorMenus[i].Visible = false;
- mp.gui.chat.show(true);
- mp.game.ui.displayRadar(true);
- mp.game.ui.displayHud(true);
- localPlayer.freezePosition(false);
- localPlayer.setDefaultComponentVariation();
- localPlayer.setComponentVariation(2, Data.hairList[currentGender][hairItem.Index].ID, 0, 2);
- mp.game.cam.renderScriptCams(false, false, 0, true, false);
- mp.events.callRemote("creatorSave", currentGender, JSON.stringify(parentData), JSON.stringify(featureData), JSON.stringify(appearanceData), JSON.stringify(hairAndColors));
- break;
-
- case 7:
- mp.events.callRemote("creator_Leave");
- break;
- }
-});
-
-creatorMainMenu.MenuClose.on(() => {
- mp.events.callRemote("creator_Leave");
-});
-
-creatorMainMenu.Visible = false;
-creatorMenus.push(creatorMainMenu);
-// CREATOR MAIN END
-
-// CREATOR PARENTS
-let similarities = [];
-for (let i = 0; i <= 100; i++) similarities.push(i + "%");
-
-let creatorParentsMenu = new Menu("Eltern", "", new Point(50, 50));
-let fatherItem = new UIMenuListItem("Vater", "Dem Charakter sein Vadda.", new ItemsCollection(Data.fatherNames));
-let motherItem = new UIMenuListItem("Mutter", "Dem Charakter seine Mudda.", new ItemsCollection(Data.motherNames));
-let similarityItem = new UIMenuListItem("\u00c4hnlichkeit", "\u00c4hnlichkeit zu den Eltern.\n(niedriger = feminin, h\u00f6her = maskulin)", new ItemsCollection(similarities));
-let skinSimilarityItem = new UIMenuListItem("Hautfarbe", "Hautfarben \u00c4hnlichkeit zu den Eltern.\n(niedriger = Mutter, h\u00f6her = Vater)", new ItemsCollection(similarities));
-creatorParentsMenu.AddItem(fatherItem);
-creatorParentsMenu.AddItem(motherItem);
-creatorParentsMenu.AddItem(similarityItem);
-creatorParentsMenu.AddItem(skinSimilarityItem);
-creatorParentsMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4llige Eltern."));
-creatorParentsMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt die Eltern zur\u00fcck. :'("));
-
-creatorParentsMenu.ItemSelect.on((item, index) => {
- switch (item.Text) {
- case "Zuf\u00e4llig":
- fatherItem.Index = getRandomInt(0, Data.fathers.length - 1);
- motherItem.Index = getRandomInt(0, Data.mothers.length - 1);
- similarityItem.Index = getRandomInt(0, 100);
- skinSimilarityItem.Index = getRandomInt(0, 100);
- updateParents();
- break;
-
- case "Zur\u00fccksetzen":
- resetParentsMenu();
- break;
- }
-});
-
-creatorParentsMenu.ListChange.on((item, listIndex) => {
- updateParents();
-});
-
-creatorParentsMenu.ParentMenu = creatorMainMenu;
-creatorParentsMenu.Visible = false;
-creatorMenus.push(creatorParentsMenu);
-// CREATOR PARENTS END
-
-// CREATOR FEATURES
-let featureItems = [];
-let features = [];
-for (let i = -1.0; i <= 1.01; i += 0.01) features.push(i.toFixed(2));
-
-let creatorFeaturesMenu = new Menu("Gesichtsz\u00fcge", "", new Point(50, 50));
-
-for (let i = 0; i < Data.featureNames.length; i++) {
- let tempFeatureItem = new UIMenuListItem(Data.featureNames[i], "", new ItemsCollection(features));
- tempFeatureItem.Index = 100;
- featureItems.push(tempFeatureItem);
- creatorFeaturesMenu.AddItem(tempFeatureItem);
-}
-
-creatorFeaturesMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4llige Gesichtsz\u00fcge."));
-creatorFeaturesMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt Gesichtsz\u00fcge zur\u00fcck."));
-
-creatorFeaturesMenu.ItemSelect.on((item, index) => {
- switch (item.Text) {
- case "Zuf\u00e4llig":
- for (let i = 0; i < Data.featureNames.length; i++) {
- featureItems[i].Index = getRandomInt(0, 200);
- updateFaceFeature(i);
- }
- break;
-
- case "Zur\u00fccksetzen":
- resetFeaturesMenu();
- break;
- }
-});
-
-creatorFeaturesMenu.ListChange.on((item, listIndex) => {
- updateFaceFeature(featureItems.indexOf(item));
-});
-
-creatorFeaturesMenu.ParentMenu = creatorMainMenu;
-creatorFeaturesMenu.Visible = false;
-creatorMenus.push(creatorFeaturesMenu);
-// CREATOR FEATURES END
-
-// CREATOR APPEARANCE
-let appearanceItems = [];
-let appearanceOpacityItems = [];
-let opacities = [];
-for (let i = 0; i <= 100; i++) opacities.push(i + "%");
-
-let creatorAppearanceMenu = new Menu("Aussehen", "", new Point(50, 50));
-
-for (let i = 0; i < Data.appearanceNames.length; i++) {
- let items = [];
- for (let j = 0, max = mp.game.ped.getNumHeadOverlayValues(i); j <= max; j++) items.push((Data.appearanceItemNames[i][j] === undefined) ? j.toString() : Data.appearanceItemNames[i][j]);
-
- let tempAppearanceItem = new UIMenuListItem(Data.appearanceNames[i], "", new ItemsCollection(items));
- appearanceItems.push(tempAppearanceItem);
- creatorAppearanceMenu.AddItem(tempAppearanceItem);
-
- let tempAppearanceOpacityItem = new UIMenuListItem(Data.appearanceNames[i] + " Transparenz", "", new ItemsCollection(opacities));
- tempAppearanceOpacityItem.Index = 100;
- appearanceOpacityItems.push(tempAppearanceOpacityItem);
- creatorAppearanceMenu.AddItem(tempAppearanceOpacityItem);
-}
-
-creatorAppearanceMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4lliges Aussehen."));
-creatorAppearanceMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt das Aussehen zur\u00fcck."));
-
-creatorAppearanceMenu.ItemSelect.on((item, index) => {
- switch (item.Text) {
- case "Zuf\u00e4llig":
- for (let i = 0; i < Data.appearanceNames.length; i++) {
- appearanceItems[i].Index = getRandomInt(0, mp.game.ped.getNumHeadOverlayValues(i) - 1);
- appearanceOpacityItems[i].Index = getRandomInt(0, 100);
- updateAppearance(i);
- }
- break;
-
- case "Zur\u00fccksetzen":
- resetAppearanceMenu();
- break;
- }
-});
-
-creatorAppearanceMenu.ListChange.on((item, listIndex) => {
- let idx = (creatorAppearanceMenu.CurrentSelection % 2 == 0) ? (creatorAppearanceMenu.CurrentSelection / 2) : Math.floor(creatorAppearanceMenu.CurrentSelection / 2);
- updateAppearance(idx);
-});
-
-creatorAppearanceMenu.ParentMenu = creatorMainMenu;
-creatorAppearanceMenu.Visible = false;
-creatorMenus.push(creatorAppearanceMenu);
-// CREATOR APPEARANCE END
-
-// CREATOR HAIR & COLORS
-let hairItem;
-let hairColorItem;
-let hairHighlightItem;
-let eyebrowColorItem;
-let beardColorItem;
-let eyeColorItem;
-let blushColorItem;
-let lipstickColorItem;
-let chestHairColorItem;
-
-creatorHairMenu = new Menu("Haar & Farben", "", new Point(50, 50));
-fillHairMenu();
-
-creatorHairMenu.ItemSelect.on((item, index) => {
- switch (item.Text) {
- case "Zuf\u00e4llig":
- hairItem.Index = getRandomInt(0, Data.hairList[currentGender].length - 1);
- hairColorItem.Index = getRandomInt(0, Data.maxHairColor);
- hairHighlightItem.Index = getRandomInt(0, Data.maxHairColor);
- eyebrowColorItem.Index = getRandomInt(0, Data.maxHairColor);
- beardColorItem.Index = getRandomInt(0, Data.maxHairColor);
- eyeColorItem.Index = getRandomInt(0, Data.maxEyeColor);
- blushColorItem.Index = getRandomInt(0, Data.maxBlushColor);
- lipstickColorItem.Index = getRandomInt(0, Data.maxLipstickColor);
- chestHairColorItem.Index = getRandomInt(0, Data.maxHairColor);
- updateHairAndColors();
- break;
-
- case "Zur\u00fccksetzen":
- resetHairAndColorsMenu();
- break;
- }
-});
-
-creatorHairMenu.ListChange.on((item, listIndex) => {
- if (item == hairItem) {
- let hairStyle = Data.hairList[currentGender][listIndex];
- localPlayer.setComponentVariation(2, hairStyle.ID, 0, 2);
- } else {
- switch (creatorHairMenu.CurrentSelection) {
- case 1: // hair color
- localPlayer.setHairColor(listIndex, hairHighlightItem.Index);
- break;
-
- case 2: // hair highlight color
- localPlayer.setHairColor(hairColorItem.Index, listIndex);
- break;
-
- case 3: // eyebrow color
- localPlayer.setHeadOverlayColor(2, 1, listIndex, 0);
- break;
-
- case 4: // facial hair color
- localPlayer.setHeadOverlayColor(1, 1, listIndex, 0);
- break;
-
- case 5: // eye color
- localPlayer.setEyeColor(listIndex);
- break;
-
- case 6: // blush color
- localPlayer.setHeadOverlayColor(5, 2, listIndex, 0);
- break;
-
- case 7: // lipstick color
- localPlayer.setHeadOverlayColor(8, 2, listIndex, 0);
- break;
-
- case 8: // chest hair color
- localPlayer.setHeadOverlayColor(10, 1, listIndex, 0);
- break;
- }
- }
-});
-
-creatorHairMenu.ParentMenu = creatorMainMenu;
-creatorHairMenu.Visible = false;
-creatorMenus.push(creatorHairMenu);
-// CREATOR HAIR & COLORS END
-
-// EVENTS
-mp.events.add("toggleCreator", (active, charData) => {
- if (creatorCamera === undefined) {
- creatorCamera = mp.cameras.new("creatorCamera", creatorCoords.camera, new mp.Vector3(0, 0, 0), 45);
- creatorCamera.pointAtCoord(creatorCoords.cameraLookAt);
- creatorCamera.setActive(true);
-
- creatorMainMenu.Visible = true;
- mp.gui.chat.show(false);
- mp.game.ui.displayRadar(false);
- mp.game.ui.displayHud(false);
- localPlayer.clearTasksImmediately();
- localPlayer.freezePosition(true);
- mp.game.cam.renderScriptCams(true, false, 0, true, false);
- }
-});
-
-mp.events.add("sendToServer", (characterData) => {
- mp.events.callRemote("creatorSave", characterData);
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/CharCreator/main.ts b/ReallifeGamemode.Client/CharCreator/main.ts
new file mode 100644
index 00000000..042cd33f
--- /dev/null
+++ b/ReallifeGamemode.Client/CharCreator/main.ts
@@ -0,0 +1,572 @@
+ // shitcode will be better in the future
+ // , \u00dc, \u00fc
+ // , \u00c4, \u00e4
+ // , \u00d6, \u00f6
+ // \u00df
+
+
+ import * as NativeUI from 'NativeUI';
+ import * as Data from './data';
+
+ 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;
+
+ const creatorCoords = {
+ camera: new mp.Vector3(402.8664, -997.5515, -98.5),
+ cameraLookAt: new mp.Vector3(402.8664, -996.4108, -98.5)
+ };
+
+ const localPlayer = mp.players.local;
+
+export default function charCreator() {
+
+ var creatorHairMenu;
+
+ function getRandomInt(min, max) {
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+ }
+
+ function colorForOverlayIdx(index) {
+ let color;
+
+ switch (index) {
+ case 1:
+ color = beardColorItem.Index;
+ break;
+
+ case 2:
+ color = eyebrowColorItem.Index;
+ break;
+
+ case 5:
+ color = blushColorItem.Index;
+ break;
+
+ case 8:
+ color = lipstickColorItem.Index;
+ break;
+
+ case 10:
+ color = chestHairColorItem.Index;
+ break;
+
+ default:
+ color = 0;
+ }
+
+ return color;
+ }
+
+ function updateParents() {
+ localPlayer.setHeadBlendData(
+ // shape
+ Data.mothers[motherItem.Index],
+ Data.fathers[fatherItem.Index],
+ 0,
+
+ // skin
+ Data.mothers[motherItem.Index],
+ Data.fathers[fatherItem.Index],
+ 0,
+
+ // mixes
+ similarityItem.Index * 0.01,
+ skinSimilarityItem.Index * 0.01,
+ 0.0,
+
+ false
+ );
+ }
+
+ function updateFaceFeature(index) {
+ localPlayer.setFaceFeature(index, parseFloat(featureItems[index].SelectedValue));
+ }
+
+ function updateAppearance(index) {
+ let overlayID = (appearanceItems[index].Index === 0) ? 255 : appearanceItems[index].Index - 1;
+ localPlayer.setHeadOverlay(index, overlayID, appearanceOpacityItems[index].Index * 0.01, colorForOverlayIdx(index), 0);
+ }
+
+ function updateHairAndColors() {
+ localPlayer.setComponentVariation(2, Data.hairList[currentGender][hairItem.Index].ID, 0, 2);
+ localPlayer.setHairColor(hairColorItem.Index, hairHighlightItem.Index);
+ localPlayer.setEyeColor(eyeColorItem.Index);
+ localPlayer.setHeadOverlayColor(1, 1, beardColorItem.Index, 0);
+ localPlayer.setHeadOverlayColor(2, 1, eyebrowColorItem.Index, 0);
+ localPlayer.setHeadOverlayColor(5, 2, blushColorItem.Index, 0);
+ localPlayer.setHeadOverlayColor(8, 2, lipstickColorItem.Index, 0);
+ localPlayer.setHeadOverlayColor(10, 1, chestHairColorItem.Index, 0);
+ }
+
+ function applyCreatorOutfit() {
+ if (currentGender === 0) {
+ localPlayer.setDefaultComponentVariation();
+ localPlayer.setComponentVariation(3, 15, 0, 2);
+ localPlayer.setComponentVariation(4, 21, 0, 2);
+ localPlayer.setComponentVariation(6, 34, 0, 2);
+ localPlayer.setComponentVariation(8, 15, 0, 2);
+ localPlayer.setComponentVariation(11, 15, 0, 2);
+ } else {
+ localPlayer.setDefaultComponentVariation();
+ localPlayer.setComponentVariation(3, 15, 0, 2);
+ localPlayer.setComponentVariation(4, 10, 0, 2);
+ localPlayer.setComponentVariation(6, 35, 0, 2);
+ localPlayer.setComponentVariation(8, 15, 0, 2);
+ localPlayer.setComponentVariation(11, 15, 0, 2);
+ }
+ }
+
+ function fillHairMenu() {
+ hairItem = new UIMenuListItem("Haar", "Deine Haare", new ItemsCollection(Data.hairList[currentGender].map(h => h.Name)));
+ creatorHairMenu.AddItem(hairItem);
+
+ hairColorItem = new UIMenuListItem("Haarfarbe", "Deine Haarfarbe", new ItemsCollection(hairColors));
+ creatorHairMenu.AddItem(hairColorItem);
+
+ hairHighlightItem = new UIMenuListItem("Haarstr\u00e4hnen", "Farbe deiner Haarstr\u00e4hnen", new ItemsCollection(hairColors));
+ creatorHairMenu.AddItem(hairHighlightItem);
+
+ eyebrowColorItem = new UIMenuListItem("Augenbrauen Farbe", "Farbe deiner Augenbrauen", new ItemsCollection(hairColors));
+ creatorHairMenu.AddItem(eyebrowColorItem);
+
+ beardColorItem = new UIMenuListItem("Farbe der Gesichtsbehaarung", "Farbe deiner Gesichtsbehaarung", new ItemsCollection(hairColors));
+ creatorHairMenu.AddItem(beardColorItem);
+
+ eyeColorItem = new UIMenuListItem("Augenfarbe", "Farbe deiner Augen", new ItemsCollection(Data.eyeColors));
+ creatorHairMenu.AddItem(eyeColorItem);
+
+ blushColorItem = new UIMenuListItem("Rouge", "Farbe des Rouges.", new ItemsCollection(blushColors));
+ creatorHairMenu.AddItem(blushColorItem);
+
+ lipstickColorItem = new UIMenuListItem("Lippenstift Farbe", "Farbe deines Lippenstifts.", new ItemsCollection(lipstickColors));
+ creatorHairMenu.AddItem(lipstickColorItem);
+
+ chestHairColorItem = new UIMenuListItem("Farbe der Brustbehaarung", "Farbe deiner Brustbehaarung", new ItemsCollection(hairColors));
+ creatorHairMenu.AddItem(chestHairColorItem);
+
+ creatorHairMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4lliges Haar & Farben"));
+ creatorHairMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Zur\u00fccksetzen von Haar & Farben"));
+ }
+
+ function resetParentsMenu(refresh = false) {
+ fatherItem.Index = 0;
+ motherItem.Index = 0;
+ similarityItem.Index = (currentGender === 0) ? 100 : 0;
+ skinSimilarityItem.Index = (currentGender === 0) ? 100 : 0;
+
+ updateParents();
+ if (refresh) creatorParentsMenu.RefreshIndex();
+ }
+
+ function resetFeaturesMenu(refresh = false) {
+ for (let i = 0; i < Data.featureNames.length; i++) {
+ featureItems[i].Index = 100;
+ updateFaceFeature(i);
+ }
+
+ if (refresh) creatorFeaturesMenu.RefreshIndex();
+ }
+
+ function resetAppearanceMenu(refresh = false) {
+ for (let i = 0; i < Data.appearanceNames.length; i++) {
+ appearanceItems[i].Index = 0;
+ appearanceOpacityItems[i].Index = 100;
+ updateAppearance(i);
+ }
+
+ if (refresh) creatorAppearanceMenu.RefreshIndex();
+ }
+
+ function resetHairAndColorsMenu(refresh = false) {
+ hairItem.Index = 0;
+ hairColorItem.Index = 0;
+ hairHighlightItem.Index = 0;
+ eyebrowColorItem.Index = 0;
+ beardColorItem.Index = 0;
+ eyeColorItem.Index = 0;
+ blushColorItem.Index = 0;
+ lipstickColorItem.Index = 0;
+ chestHairColorItem.Index = 0;
+ updateHairAndColors();
+
+ if (refresh) creatorHairMenu.RefreshIndex();
+ }
+
+ let currentGender = 0;
+ let creatorMenus: NativeUI.Menu[] = [];
+ let creatorCamera;
+
+ // color arrays
+ let hairColors = [];
+ for (let i = 0; i < Data.maxHairColor; i++) hairColors.push(i.toString());
+
+ let blushColors = [];
+ for (let i = 0; i < Data.maxBlushColor; i++) blushColors.push(i.toString());
+
+ let lipstickColors = [];
+ for (let i = 0; i < Data.maxLipstickColor; i++) lipstickColors.push(i.toString());
+
+ // CREATOR MAIN
+ let creatorMainMenu = new Menu("Charaktererstellung", "", new Point(50, 50), null, null);
+ let genderItem = new UIMenuListItem("Geschlecht", "~r~Dies setzt deine Einstellungen zur\u00fcck.", new ItemsCollection(["M\u00e4nnlich", "Weiblich"]));
+ creatorMainMenu.AddItem(genderItem);
+ creatorMainMenu.AddItem(new UIMenuItem("Eltern", "Eltern des Charakters."));
+ creatorMainMenu.AddItem(new UIMenuItem("Gesichtsz\u00fcge", "Gesichtsz\u00fcge des Charakters."));
+ creatorMainMenu.AddItem(new UIMenuItem("Aussehen", "Aussehen des Charakters."));
+ creatorMainMenu.AddItem(new UIMenuItem("Haar & Farben", "Haare & Farben deines Charakters."));
+
+ let angles = [];
+ for (let i = -180.0; i <= 180.0; i += 5.0) angles.push(i.toFixed(1));
+ let angleItem = new UIMenuListItem("Drehung", "", new ItemsCollection(angles));
+ creatorMainMenu.AddItem(angleItem);
+
+ let saveItem = new UIMenuItem("Erstellen", "Erstellt deinen Charakter.");
+ saveItem.BackColor = new Color(13, 71, 161);
+ saveItem.HighlightedBackColor = new Color(25, 118, 210);
+ creatorMainMenu.AddItem(saveItem);
+
+ //let cancelItem = new UIMenuItem("Abbrechen", "Setzt alle \u00c4nderungen zur\u00fcck.");
+ //cancelItem.BackColor = new Color(213, 0, 0);
+ //cancelItem.HighlightedBackColor = new Color(229, 57, 53);
+ //creatorMainMenu.AddItem(cancelItem);
+
+ creatorMainMenu.ListChange.on((item, listIndex) => {
+ if (item === genderItem) {
+ currentGender = listIndex;
+ mp.events.callRemote("creator_GenderChange", listIndex);
+
+ setTimeout(() => {
+ localPlayer.clearTasksImmediately();
+ applyCreatorOutfit();
+ angleItem.Index = 0;
+ resetParentsMenu(true);
+ resetFeaturesMenu(true);
+ resetAppearanceMenu(true);
+
+ creatorHairMenu.Clear();
+ fillHairMenu();
+ creatorHairMenu.RefreshIndex();
+ }, 200);
+ } else if (item === angleItem) {
+ localPlayer.setHeading(parseFloat(angleItem.SelectedValue));
+ localPlayer.clearTasksImmediately();
+ }
+ });
+
+ creatorMainMenu.ItemSelect.on((item, index) => {
+ switch (index) {
+ case 1:
+ creatorMainMenu.Visible = false;
+ creatorParentsMenu.Visible = true;
+ break;
+
+ case 2:
+ creatorMainMenu.Visible = false;
+ creatorFeaturesMenu.Visible = true;
+ break;
+
+ case 3:
+ creatorMainMenu.Visible = false;
+ creatorAppearanceMenu.Visible = true;
+ break;
+
+ case 4:
+ creatorMainMenu.Visible = false;
+ creatorHairMenu.Visible = true;
+ break;
+
+ case 6:
+ let parentData = {
+ Father: Data.fathers[fatherItem.Index],
+ Mother: Data.mothers[motherItem.Index],
+ Similarity: similarityItem.Index * 0.01,
+ SkinSimilarity: skinSimilarityItem.Index * 0.01
+ };
+
+ let featureData = [];
+ for (let i = 0; i < featureItems.length; i++) featureData.push(parseFloat(featureItems[i].SelectedValue));
+
+ let appearanceData = [];
+ for (let i = 0; i < appearanceItems.length; i++) appearanceData.push({ Value: ((appearanceItems[i].Index === 0) ? 255 : appearanceItems[i].Index - 1), Opacity: appearanceOpacityItems[i].Index * 0.01 });
+
+ let hairAndColors = [
+ Data.hairList[currentGender][hairItem.Index].ID,
+ hairColorItem.Index,
+ hairHighlightItem.Index,
+ eyebrowColorItem.Index,
+ beardColorItem.Index,
+ eyeColorItem.Index,
+ blushColorItem.Index,
+ lipstickColorItem.Index,
+ chestHairColorItem.Index
+ ];
+ for (let i = 0; i < creatorMenus.length; i++) creatorMenus[i].Visible = false;
+ mp.gui.chat.show(true);
+ mp.game.ui.displayRadar(true);
+ mp.game.ui.displayHud(true);
+ localPlayer.freezePosition(false);
+ localPlayer.setDefaultComponentVariation();
+ localPlayer.setComponentVariation(2, Data.hairList[currentGender][hairItem.Index].ID, 0, 2);
+ mp.game.cam.renderScriptCams(false, false, 0, true, false);
+ mp.events.callRemote("creatorSave", currentGender, JSON.stringify(parentData), JSON.stringify(featureData), JSON.stringify(appearanceData), JSON.stringify(hairAndColors));
+ break;
+
+ case 7:
+ mp.events.callRemote("creator_Leave");
+ break;
+ }
+ });
+
+ creatorMainMenu.MenuClose.on(() => {
+ mp.events.callRemote("creator_Leave");
+ });
+
+ creatorMainMenu.Visible = false;
+ creatorMenus.push(creatorMainMenu);
+ // CREATOR MAIN END
+
+ // CREATOR PARENTS
+ let similarities = [];
+ for (let i = 0; i <= 100; i++) similarities.push(i + "%");
+
+ let creatorParentsMenu = new Menu("Eltern", "", new Point(50, 50), null, null);
+ let fatherItem = new UIMenuListItem("Vater", "Dem Charakter sein Vadda.", new ItemsCollection(Data.fatherNames));
+ let motherItem = new UIMenuListItem("Mutter", "Dem Charakter seine Mudda.", new ItemsCollection(Data.motherNames));
+ let similarityItem = new UIMenuListItem("\u00c4hnlichkeit", "\u00c4hnlichkeit zu den Eltern.\n(niedriger = feminin, h\u00f6her = maskulin)", new ItemsCollection(similarities));
+ let skinSimilarityItem = new UIMenuListItem("Hautfarbe", "Hautfarben \u00c4hnlichkeit zu den Eltern.\n(niedriger = Mutter, h\u00f6her = Vater)", new ItemsCollection(similarities));
+ creatorParentsMenu.AddItem(fatherItem);
+ creatorParentsMenu.AddItem(motherItem);
+ creatorParentsMenu.AddItem(similarityItem);
+ creatorParentsMenu.AddItem(skinSimilarityItem);
+ creatorParentsMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4llige Eltern."));
+ creatorParentsMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt die Eltern zur\u00fcck. :'("));
+
+ creatorParentsMenu.ItemSelect.on((item, index) => {
+ switch (item.Text) {
+ case "Zuf\u00e4llig":
+ fatherItem.Index = getRandomInt(0, Data.fathers.length - 1);
+ motherItem.Index = getRandomInt(0, Data.mothers.length - 1);
+ similarityItem.Index = getRandomInt(0, 100);
+ skinSimilarityItem.Index = getRandomInt(0, 100);
+ updateParents();
+ break;
+
+ case "Zur\u00fccksetzen":
+ resetParentsMenu();
+ break;
+ }
+ });
+
+ creatorParentsMenu.ListChange.on((item, listIndex) => {
+ updateParents();
+ });
+
+ creatorParentsMenu.ParentMenu = creatorMainMenu;
+ creatorParentsMenu.Visible = false;
+ creatorMenus.push(creatorParentsMenu);
+ // CREATOR PARENTS END
+
+ // CREATOR FEATURES
+ let featureItems = [];
+ let features = [];
+ for (let i = -1.0; i <= 1.01; i += 0.01) features.push(i.toFixed(2));
+
+ let creatorFeaturesMenu = new Menu("Gesichtsz\u00fcge", "", new Point(50, 50), null, null);
+
+ for (let i = 0; i < Data.featureNames.length; i++) {
+ let tempFeatureItem = new UIMenuListItem(Data.featureNames[i], "", new ItemsCollection(features));
+ tempFeatureItem.Index = 100;
+ featureItems.push(tempFeatureItem);
+ creatorFeaturesMenu.AddItem(tempFeatureItem);
+ }
+
+ creatorFeaturesMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4llige Gesichtsz\u00fcge."));
+ creatorFeaturesMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt Gesichtsz\u00fcge zur\u00fcck."));
+
+ creatorFeaturesMenu.ItemSelect.on((item, index) => {
+ switch (item.Text) {
+ case "Zuf\u00e4llig":
+ for (let i = 0; i < Data.featureNames.length; i++) {
+ featureItems[i].Index = getRandomInt(0, 200);
+ updateFaceFeature(i);
+ }
+ break;
+
+ case "Zur\u00fccksetzen":
+ resetFeaturesMenu();
+ break;
+ }
+ });
+
+ creatorFeaturesMenu.ListChange.on((item, listIndex) => {
+ updateFaceFeature(featureItems.indexOf(item));
+ });
+
+ creatorFeaturesMenu.ParentMenu = creatorMainMenu;
+ creatorFeaturesMenu.Visible = false;
+ creatorMenus.push(creatorFeaturesMenu);
+ // CREATOR FEATURES END
+
+ // CREATOR APPEARANCE
+ let appearanceItems = [];
+ let appearanceOpacityItems = [];
+ let opacities = [];
+ for (let i = 0; i <= 100; i++) opacities.push(i + "%");
+
+ let creatorAppearanceMenu = new Menu("Aussehen", "", new Point(50, 50), null, null);
+
+ for (let i = 0; i < Data.appearanceNames.length; i++) {
+ let items = [];
+ for (let j = 0, max = mp.game.ped.getNumHeadOverlayValues(i); j <= max; j++) items.push(Data.appearanceItemNames[i][j] === undefined ? j.toString() : Data.appearanceItemNames[i][j]);
+
+ let tempAppearanceItem = new UIMenuListItem(Data.appearanceNames[i], "", new ItemsCollection(items));
+ appearanceItems.push(tempAppearanceItem);
+ creatorAppearanceMenu.AddItem(tempAppearanceItem);
+
+ let tempAppearanceOpacityItem = new UIMenuListItem(Data.appearanceNames[i] + " Transparenz", "", new ItemsCollection(opacities));
+ tempAppearanceOpacityItem.Index = 100;
+ appearanceOpacityItems.push(tempAppearanceOpacityItem);
+ creatorAppearanceMenu.AddItem(tempAppearanceOpacityItem);
+ }
+
+ creatorAppearanceMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4lliges Aussehen."));
+ creatorAppearanceMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt das Aussehen zur\u00fcck."));
+
+ creatorAppearanceMenu.ItemSelect.on((item, index) => {
+ switch (item.Text) {
+ case "Zuf\u00e4llig":
+ for (let i = 0; i < Data.appearanceNames.length; i++) {
+ appearanceItems[i].Index = getRandomInt(0, mp.game.ped.getNumHeadOverlayValues(i) - 1);
+ appearanceOpacityItems[i].Index = getRandomInt(0, 100);
+ updateAppearance(i);
+ }
+ break;
+
+ case "Zur\u00fccksetzen":
+ resetAppearanceMenu();
+ break;
+ }
+ });
+
+ creatorAppearanceMenu.ListChange.on((item, listIndex) => {
+ let idx = (creatorAppearanceMenu.CurrentSelection % 2 === 0) ? (creatorAppearanceMenu.CurrentSelection / 2) : Math.floor(creatorAppearanceMenu.CurrentSelection / 2);
+ updateAppearance(idx);
+ });
+
+ creatorAppearanceMenu.ParentMenu = creatorMainMenu;
+ creatorAppearanceMenu.Visible = false;
+ creatorMenus.push(creatorAppearanceMenu);
+ // CREATOR APPEARANCE END
+
+ // CREATOR HAIR & COLORS
+ let hairItem;
+ let hairColorItem;
+ let hairHighlightItem;
+ let eyebrowColorItem;
+ let beardColorItem;
+ let eyeColorItem;
+ let blushColorItem;
+ let lipstickColorItem;
+ let chestHairColorItem;
+
+ creatorHairMenu = new Menu("Haar & Farben", "", new Point(50, 50), null, null);
+ fillHairMenu();
+
+ creatorHairMenu.ItemSelect.on((item, index) => {
+ switch (item.Text) {
+ case "Zuf\u00e4llig":
+ hairItem.Index = getRandomInt(0, Data.hairList[currentGender].length - 1);
+ hairColorItem.Index = getRandomInt(0, Data.maxHairColor);
+ hairHighlightItem.Index = getRandomInt(0, Data.maxHairColor);
+ eyebrowColorItem.Index = getRandomInt(0, Data.maxHairColor);
+ beardColorItem.Index = getRandomInt(0, Data.maxHairColor);
+ eyeColorItem.Index = getRandomInt(0, Data.maxEyeColor);
+ blushColorItem.Index = getRandomInt(0, Data.maxBlushColor);
+ lipstickColorItem.Index = getRandomInt(0, Data.maxLipstickColor);
+ chestHairColorItem.Index = getRandomInt(0, Data.maxHairColor);
+ updateHairAndColors();
+ break;
+
+ case "Zur\u00fccksetzen":
+ resetHairAndColorsMenu();
+ break;
+ }
+ });
+
+ creatorHairMenu.ListChange.on((item, listIndex) => {
+ if (item === hairItem) {
+ let hairStyle = Data.hairList[currentGender][listIndex];
+ localPlayer.setComponentVariation(2, hairStyle.ID, 0, 2);
+ } else {
+ switch (creatorHairMenu.CurrentSelection) {
+ case 1: // hair color
+ localPlayer.setHairColor(listIndex, hairHighlightItem.Index);
+ break;
+
+ case 2: // hair highlight color
+ localPlayer.setHairColor(hairColorItem.Index, listIndex);
+ break;
+
+ case 3: // eyebrow color
+ localPlayer.setHeadOverlayColor(2, 1, listIndex, 0);
+ break;
+
+ case 4: // facial hair color
+ localPlayer.setHeadOverlayColor(1, 1, listIndex, 0);
+ break;
+
+ case 5: // eye color
+ localPlayer.setEyeColor(listIndex);
+ break;
+
+ case 6: // blush color
+ localPlayer.setHeadOverlayColor(5, 2, listIndex, 0);
+ break;
+
+ case 7: // lipstick color
+ localPlayer.setHeadOverlayColor(8, 2, listIndex, 0);
+ break;
+
+ case 8: // chest hair color
+ localPlayer.setHeadOverlayColor(10, 1, listIndex, 0);
+ break;
+ }
+ }
+ });
+
+ creatorHairMenu.ParentMenu = creatorMainMenu;
+ creatorHairMenu.Visible = false;
+ creatorMenus.push(creatorHairMenu);
+ // CREATOR HAIR & COLORS END
+
+ // EVENTS
+ mp.events.add("toggleCreator", (active, charData) => {
+ if (creatorCamera === undefined) {
+ creatorCamera = mp.cameras.new("creatorCamera", creatorCoords.camera, new mp.Vector3(0, 0, 0), 45);
+ creatorCamera.pointAtCoord(creatorCoords.cameraLookAt);
+ creatorCamera.setActive(true);
+
+ creatorMainMenu.Visible = true;
+ mp.gui.chat.show(false);
+ mp.game.ui.displayRadar(false);
+ mp.game.ui.displayHud(false);
+ localPlayer.clearTasksImmediately();
+ localPlayer.freezePosition(true);
+ mp.game.cam.renderScriptCams(true, false, 0, true, false);
+ }
+ });
+
+ mp.events.add("sendToServer", (characterData) => {
+ mp.events.callRemote("creatorSave", characterData);
+ });
+
+ creatorMenus.forEach(menu => {
+ menu.Visible = false;
+ })
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/DoorManager/doormanager.js b/ReallifeGamemode.Client/DoorManager/doormanager.js
deleted file mode 100644
index 9123a22d..00000000
--- a/ReallifeGamemode.Client/DoorManager/doormanager.js
+++ /dev/null
@@ -1,5 +0,0 @@
-mp.events.add('changeDoorState', (doorHash, x, y, z, locked, p5, p6, p7) => {
- locked === 1 ? locked = true : locked = false;
-
- mp.game.object.doorControl(doorHash, x, y, z, locked, p5, p6, p7);
-});
diff --git a/ReallifeGamemode.Client/DoorManager/doormanager.ts b/ReallifeGamemode.Client/DoorManager/doormanager.ts
new file mode 100644
index 00000000..57423d9b
--- /dev/null
+++ b/ReallifeGamemode.Client/DoorManager/doormanager.ts
@@ -0,0 +1,7 @@
+export default function doorManager() {
+ mp.events.add('changeDoorState', (doorHash, x, y, z, locked, p5, p6, p7) => {
+ locked === 1 ? locked = true : locked = false;
+
+ mp.game.object.doorControl(doorHash, x, y, z, locked, p5, p6, p7);
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/FactionManagement/main.js b/ReallifeGamemode.Client/FactionManagement/main.js
deleted file mode 100644
index 5ea48a51..00000000
--- a/ReallifeGamemode.Client/FactionManagement/main.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * @overview Life of German Reallife - Faction Manager Main (main.js)
- * @author hydrant
- * @copyright (c) 2008 - 2018 Life of German
- */
-
-var manageFactionRanksBrowser = null;
-var rankData = null;
-
-mp.events.add('manageFactionRanks', (ranks) => {
- if (manageFactionRanksBrowser !== null) return;
- manageFactionRanksBrowser = mp.browsers.new('package://assets/html/factionmanagement/ranks/index.html');
-
- mp.gui.chat.activate(false);
- rankData = JSON.parse(ranks);
-});
-
-mp.events.add('onManageFactionRanksLoaded', () => {
- if (manageFactionRanksBrowser !== null) {
-
- manageFactionRanksBrowser.execute(`loadData(` + JSON.stringify(rankData.Ranks) + `)`);
- mp.gui.cursor.show(true, true);
- }
-});
-
-mp.events.add('saveFactionRankData', function (data) {
- if (manageFactionRanksBrowser !== null) {
- manageFactionRanksBrowser.destroy();
- mp.gui.cursor.show(false, false);
- mp.gui.chat.activate(true);
-
- var obj = new Object();
- obj.FactionId = rankData.FactionId;
- obj.Ranks = JSON.parse(data);
-
- mp.events.callRemote('OnFactionRanksEdit', JSON.stringify(obj));
-
- manageFactionRanksBrowser = null;
- }
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/FactionManagement/main.ts b/ReallifeGamemode.Client/FactionManagement/main.ts
new file mode 100644
index 00000000..7b157da4
--- /dev/null
+++ b/ReallifeGamemode.Client/FactionManagement/main.ts
@@ -0,0 +1,44 @@
+/**
+ * @overview Life of German Reallife - Faction Manager Main (main.js)
+ * @author hydrant
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
+export default function factionManagement() {
+
+ var manageFactionRanksBrowser = null;
+ var rankData = null;
+
+ mp.events.add('manageFactionRanks', (ranks) => {
+ if (manageFactionRanksBrowser !== null) return;
+ manageFactionRanksBrowser = mp.browsers.new('package://assets/html/factionmanagement/ranks/index.html');
+
+ mp.gui.chat.activate(false);
+ rankData = JSON.parse(ranks);
+ });
+
+ mp.events.add('onManageFactionRanksLoaded', () => {
+ if (manageFactionRanksBrowser !== null) {
+
+ manageFactionRanksBrowser.execute(`loadData(` + JSON.stringify(rankData.Ranks) + `)`);
+ mp.gui.cursor.show(true, true);
+ }
+ });
+
+ mp.events.add('saveFactionRankData', function (data) {
+ if (manageFactionRanksBrowser !== null) {
+ manageFactionRanksBrowser.destroy();
+ mp.gui.cursor.show(false, false);
+ mp.gui.chat.activate(true);
+
+ var obj: FactionRanks = {
+ factionId: rankData.FactionId,
+ ranks: JSON.parse(data)
+ };
+
+ mp.events.callRemote('OnFactionRanksEdit', JSON.stringify(obj));
+
+ manageFactionRanksBrowser = null;
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/Inventory/inventory.js b/ReallifeGamemode.Client/Gui/Inventory/inventory.js
deleted file mode 100644
index f9283ba2..00000000
--- a/ReallifeGamemode.Client/Gui/Inventory/inventory.js
+++ /dev/null
@@ -1,1026 +0,0 @@
-const InputHelper = require("../../inputhelper");
-
-var show = false;
-var showAdmin = false;
-const { x: screenX, y: screenY } = mp.game.graphics.getScreenActiveResolution(0, 0);
-let rxC = 0.5;
-let ryC = 0.4;
-let rWidth = 0.4;
-let sX = (screenX * 0.1 / 1000);
-let sY = (screenY * 0.1 / 1000);
-let eX = sX - 0.1;
-let eY = sY - 0.1;
-let sizeMul = 0.08;
-let yMul = 1.8;
-var targetPlayerName;
-let closePos = [0.7125, 0.17]
-let tradeBoxPos = [0.7125, 0.82]
-var clickTime;
-var itemRadial = false;
-var hoverGrid;
-var radialSelect = "none";
-var clickedItem;
-let aspectRatioFactor = screenX / screenY;
-var upRColor = 222;
-var downRColor = 222;
-var leftRColor = 222;
-var rightRColor = 222;
-var radialDescription;
-var tradePartner = "Keinem";
-var tradePrize = 0;
-var tradeConfirm = false;
-var isTrading = false;
-var isTradingResult = false;
-var dragTradeItem = null;
-
-var inventoryWeight;
-var items = [[]];
-var tradeItems = [];
-var tradeResultItems = [[]];
-
-var grid = [];
-grid[0] = [0.3375, 0.205]
-grid[1] = [0.4195, 0.205]
-grid[2] = [0.5015, 0.205]
-grid[3] = [0.5835, 0.205]
-grid[4] = [0.6655, 0.205]
-grid[5] = [0.3375, 0.355]
-grid[6] = [0.4195, 0.355]
-grid[7] = [0.5015, 0.355]
-grid[8] = [0.5835, 0.355]
-grid[9] = [0.6655, 0.355]
-grid[10] = [0.3375, 0.505]
-grid[11] = [0.4195, 0.505]
-grid[12] = [0.5015, 0.505]
-grid[13] = [0.5835, 0.505]
-grid[14] = [0.6655, 0.505]
-grid[15] = [0.3375, 0.655]
-grid[16] = [0.4195, 0.655]
-grid[17] = [0.5015, 0.655]
-grid[18] = [0.5835, 0.655]
-grid[19] = [0.6655, 0.655]
-
-var tradeGrid = [];
-tradeGrid[0] = [0.3375, 0.925]
-tradeGrid[1] = [0.4195, 0.925]
-tradeGrid[2] = [0.5015, 0.925]
-tradeGrid[3] = [0.5835, 0.925]
-tradeGrid[4] = [0.6655, 0.925]
-
-var mouseLDown = false;
-var mouseRDown = false;
-var hoverItem;
-var dragItem = null;
-var oldDragSlot;
-var actFreeSlot;
-var actFreeTradeSlot;
-var bufferItem = [];
-var stackToItem;
-var stackToTradeItem;
-
-mp.events.add("showInventory", (invWeight, itemArr) => {
- if (show === false) {
- //mp.gui.chat.activate(false);
- setInterval()
- mp.gui.cursor.show(true, true);
- inventoryWeight = invWeight;
- items = itemArr;
- show = true;
- mp.game.graphics.requestStreamedTextureDict("itemimages", true);
- } else {
- mp.events.callRemote('saveInventory', JSON.stringify(items));
- mp.gui.chat.activate(true);
- mp.gui.cursor.show(false, false);
- show = false;
- mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages");
- inventoryWeight = 0;
- items = null;
- itemRadial = false;
- if (tradeItems.length === 0) {
- isTrading = false;
- }
- }
-});
-
-mp.events.add("openTradeMenu", (tradePartnerName) => {
- tradePartner = tradePartnerName;
- isTrading = true;
-});
-mp.events.add("showTradeRequest", () => {
- show = false;
-});
-mp.events.add("showInventoryToAdmin", (pName, invWeight, itemArr) => {
- if (showAdmin === false) {
- targetPlayerName = pName;
- mp.gui.chat.activate(false);
- inventoryWeight = invWeight;
- items = itemArr;
- mp.game.graphics.requestStreamedTextureDict("itemimages", true);
- setTimeout(() => mp.gui.cursor.show(true, true), 100);
- showAdmin = true;
- }
-});
-
-mp.events.add("addItem", (item) => {
- if (show) {
- items.push(JSON.parse(item));
- }
-});
-
-mp.events.add("clearTradeItems", () => {
- tradeConfirm = false;
- tradeItems.splice(0,tradeItems.length);
- tradePrize = 0;
-});
-
-mp.events.add("unlockTradeItems", () => {
- tradeConfirm = false;
-});
-
-mp.events.add("showTradeItems", (tradeResultItemArray) => {
- //for (var i = 0; i < tradeResultItemArray.length; i++) {
-
- // tradeItems.push(tradeResultItemArray[i]);
- //}
- tradeItems = JSON.parse(tradeResultItemArray);
- isTrading = true;
-});
-
-mp.events.add("removeItem", (userItemId, amount) => {
- if (show) {
- var arrIndex;
- for (var i = 0; i < items.length; i++) {
- if (items[i][5] === userItemId) {
- arrIndex = i;
- }
- }
- inventoryWeight -= parseInt(items[arrIndex][2]) * amount;
- items[arrIndex][3] -= amount;
- if (items[arrIndex][3] === 0) {
- items.splice(arrIndex, 1);
- }
- }
-});
-
-mp.events.add("render", () => {
- if (show === true) {
- var pos = mp.gui.cursor.position;
-
- mp.game.graphics.set2dLayer(1);
- //INVENTARHINTERGRUND
- mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); //inventar
- mp.game.graphics.set2dLayer(2);
-
- //INVENTARÜBERSCHRIFT
- mp.game.graphics.drawText("Inventar ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], {
- font: 7,
- color: [112, 128, 144, 254],
- scale: [0.7, 0.7],
- outline: true,
- });
-
- //SLOTS [RECHTECKE] [SLOTZAHLEN]
- var tempSlot;
- for (var slots = 0; slots < grid.length; slots++) {
- mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMul, sizeMul * yMul, 112, 128, 144, 254);
- mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - (sizeMul / 2) + 0.006, grid[slots][1] - (sizeMul / 2 * yMul)], {
- font: 7,
- color: [255, 69, 0, 254],
- scale: [0.3, 0.3],
- outline: true,
- });
- }
-
- mp.game.graphics.set2dLayer(3);
- //SPRITES + ITEMANZAHL
- for (var currentItem = 0; currentItem < items.length; currentItem++) {
- if (items[currentItem][4] !== "-1") {
- mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[parseInt(items[currentItem][4] - 1)][0], grid[parseInt(items[currentItem][4] - 1)][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
- mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[parseInt(items[currentItem][4] - 1)][0] + (sizeMul / 2) - 0.008, grid[parseInt(items[currentItem][4] - 1)][1] + 0.05], {
- font: 0,
- color: [255, 255, 255, 255],
- scale: [0.25, 0.25],
- outline: true,
- });
- }
- }
-
- mp.game.graphics.set2dLayer(4);
- //WENN MAUS ÜBER ITEM
- if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) {
- mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220);
-
- var hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]];
-
- //NAME
- mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.4, 0.4],
- outline: true,
- });
-
- //BESCHREIBUNG
- mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- });
-
- //EINZELGEWICHT
- mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- });
- }
-
- //WENN MOUSE DOWN
- if (mouseLDown && dragItem !== null || mouseRDown && dragItem !== null) {
-
- if (isMouseOverFreeSlot(pos[0], pos[1]) || isMouseOverFreeTradeSlot(pos[0], pos[1]) || isItemOverSameItem(pos[0], pos[1]) || isItemOverSameTradeItem(pos[0], pos[1])) {
- if (dragTradeItem === false) {
- mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, rWidth / 8, rWidth / 5, 0, 100, 255, 100, 255);
- } else {
- mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, rWidth / 8, rWidth / 5, 0, 100, 255, 100, 255);
- }
- } else {
- if (dragTradeItem === false) {
- mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, rWidth / 8, rWidth / 5, 0, 255, 100, 100, 255);
- } else {
- mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, rWidth / 8, rWidth / 5, 0, 255, 100, 100, 255);
- }
- }
- }
- mp.game.graphics.set2dLayer(5);
- if (itemRadial === true) {
- mp.game.graphics.drawSprite("itemimages", "radialsplit", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 0, 0, 0, 255);
- mp.game.graphics.drawSprite("itemimages", "radialup", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, upRColor, 222, upRColor);
- mp.game.graphics.drawSprite("itemimages", "radialdown", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, downRColor, 222, downRColor);
- //mp.game.graphics.drawSprite("itemimages", "radialleft", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, leftRColor, 222, leftRColor);
- //mp.game.graphics.drawSprite("itemimages", "radialright", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, rightRColor, 222, rightRColor);
- mp.game.graphics.set2dLayer(6);
- mp.game.graphics.drawSprite("itemimages", "radialdrop", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255);
- mp.game.graphics.drawSprite("itemimages", "radialuse", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255);
- }
- mp.game.graphics.set2dLayer(7);
-
- if (ifMouseSelectRadial(pos[0], pos[1])) {
- //mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY - 0.02, 0.08, 0.03, 0, 0, 0, 255);
- mp.game.graphics.drawText("~g~" + radialDescription, [pos[0] / screenX, pos[1] / screenY - 0.033], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.5, 0.5],
- outline: true,
- });
- }
- if (isTrading) {
- mp.game.graphics.set2dLayer(1);
- mp.game.graphics.drawRect(rxC, 0.925, 0.45, 0.25, 255, 255, 255, 200);
- mp.game.graphics.set2dLayer(2);
- var tempSlot2;
- for (var slots = 0; slots < tradeGrid.length; slots++) {
- mp.game.graphics.drawRect(tradeGrid[slots][0], tradeGrid[slots][1], sizeMul, sizeMul * yMul, 112, 128, 144, 254);
- mp.game.graphics.drawText(tempSlot2 = slots + 1, [tradeGrid[slots][0] - (sizeMul / 2) + 0.006, tradeGrid[slots][1] - (sizeMul / 2 * yMul)], {
- font: 7,
- color: [69, 255, 0, 254],
- scale: [0.3, 0.3],
- outline: true,
- });
- }
-
- mp.game.graphics.set2dLayer(3);
-
- //SPRITES + ITEMANZAHL
- if (tradeItems.length !== 0) {
- for (var currentItem = 0; currentItem < tradeItems.length; currentItem++) {
- if (tradeItems[currentItem][4] !== "-1") {
- mp.game.graphics.drawSprite("itemimages", tradeItems[currentItem][0].toLowerCase(), tradeGrid[parseInt(tradeItems[currentItem][4] - 1)][0], tradeGrid[parseInt(tradeItems[currentItem][4] - 1)][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
- mp.game.graphics.drawText("(~y~" + tradeItems[currentItem][3] + "~s~)", [tradeGrid[parseInt(tradeItems[currentItem][4] - 1)][0] + (sizeMul / 2) - 0.008, tradeGrid[parseInt(tradeItems[currentItem][4] - 1)][1] + 0.05], {
- font: 0,
- color: [255, 255, 255, 255],
- scale: [0.25, 0.25],
- outline: true,
- });
- if (tradeConfirm === true) {
- mp.game.graphics.drawSprite("itemimages", "lock", tradeGrid[parseInt(tradeItems[currentItem][4] - 1)][0], tradeGrid[parseInt(tradeItems[currentItem][4] - 1)][1], rWidth / 8 / 2, rWidth / 5 / 2, 0, 255, 255, 255, 255);
- }
- }
- }
- }
- //} else {
- // if (tradeResultItems.length !== 0) {
- // for (var currentItem = 0; currentItem < tradeResultItems.length; currentItem++) {
- // mp.game.graphics.drawSprite("itemimages", tradeResultItems[currentItem][0].toLowerCase(), tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0], tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
- // mp.game.graphics.drawText("(~y~" + tradeResultItems[currentItem][3] + "~s~)", [tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0] + (sizeMul / 2) - 0.008, tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1] + 0.05], {
- // font: 0,
- // color: [255, 255, 255, 255],
- // scale: [0.25, 0.25],
- // outline: true,
- // });
- // }
- // }
- //}
-
- mp.game.graphics.drawText("Handel mit ~y~" + tradePartner + " ~s~ für ~g~ " + tradePrize + "$", [rxC, 0.81], {
- font: 7,
- color: [112, 128, 144, 254],
- scale: [0.6, 0.6],
- outline: true,
- });
- mp.game.graphics.set2dLayer(4);
- if (tradeConfirm === false) {
- mp.game.graphics.drawSprite("itemimages", "box", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255);
- } else {
- mp.game.graphics.drawSprite("itemimages", "boxticked", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255);
- }
- mp.game.graphics.drawSprite("itemimages", "dollar", tradeBoxPos[0] - 0.025, tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255);
-
- if (isMouseOverTradeDollar(pos[0], pos[1])) {
- mp.game.graphics.drawText("~g~ Preis festlegen", [pos[0] / screenX, pos[1] / screenY - 0.033], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.5, 0.5],
- outline: true,
- });
- }
- if (isMouseOverTradeBox(pos[0], pos[1])) {
- mp.game.graphics.drawText("~g~Handelsanfrage absenden", [pos[0] / screenX, pos[1] / screenY - 0.033], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.5, 0.5],
- outline: true,
- });
- }
-
- mp.game.graphics.set2dLayer(5);
- if (isMouseOverTradeItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) {
- mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220);
-
- var hoverItemP = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3]];
-
- //NAME
- mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.4, 0.4],
- outline: true,
- });
-
- //BESCHREIBUNG
- mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- });
-
- //EINZELGEWICHT
- mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- });
- }
- }
-
-
-
- ////--------------------------------------------------------------DEBUG
- //mp.game.graphics.drawText(itemRadial.toString() + " ~y~" + radialSelect, [0.5, 0.05], {
- // font: 7,
- // color: [255, 0, 0, 255],
- // scale: [0.7, 0.7],
- // outline: true,
- //});
- ////KOORDINATEN
- //mp.game.graphics.drawText((pos[0] / screenX).toFixed(3) + " / " + (pos[1] / screenY).toFixed(3) + " " + tradeItems.length, [pos[0] / screenX, pos[1] / screenY - 0.02], {
- // font: 4,
- // color: [255, 255, 255, 255],
- // scale: [0.4, 0.4],
- // outline: true,
- //});
- ////----------------------------------------------------------DEBUG END
- }
- if (showAdmin === true) {
- var pos = mp.gui.cursor.position;
-
- mp.game.graphics.set2dLayer(1);
- //INVENTARHINTERGRUND
- mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200);
-
- mp.game.graphics.set2dLayer(2);
- //INVENTARÜBERSCHRIFT
- mp.game.graphics.drawText("Inventar von ~y~" + targetPlayerName + " ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], {
- font: 7,
- color: [112, 128, 144, 254],
- scale: [0.7, 0.7],
- outline: true,
- });
-
- //SLOTS [RECHTECKE] [SLOTZAHLEN]
- var tempSlot;
- for (var slots = 0; slots < grid.length; slots++) {
- mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMul, sizeMul * yMul, 112, 128, 144, 254);
- mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - (sizeMul / 2) + 0.006, grid[slots][1] - (sizeMul / 2 * yMul)], {
- font: 7,
- color: [255, 69, 0, 254],
- scale: [0.3, 0.3],
- outline: true,
- });
- }
-
- mp.game.graphics.set2dLayer(3);
- //SPRITES + ITEMANZAHL
- for (var currentItem = 0; currentItem < items.length; currentItem++) {
- if (items[currentItem][4] !== "-1") {
- mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[parseInt(items[currentItem][4] - 1)][0], grid[parseInt(items[currentItem][4] - 1)][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
- mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[parseInt(items[currentItem][4] - 1)][0] + (sizeMul / 2) - 0.008, grid[parseInt(items[currentItem][4] - 1)][1] + 0.05], {
- font: 0,
- color: [255, 255, 255, 255],
- scale: [0.25, 0.25],
- outline: true,
- });
- }
- }
-
- mp.game.graphics.set2dLayer(4);
- //WENN MAUS ÜBER ITEM
- if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) {
- mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220);
-
- var hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]];
-
- //NAME
- mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.4, 0.4],
- outline: true,
- });
-
- //BESCHREIBUNG
- mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- });
-
- //EINZELGEWICHT
- mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- });
- }
-
- if (isMouseOverX(pos[0], pos[1])) {
- mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 220, 20, 60, 255);
- } else {
- mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 255, 255, 255, 255);
- }
-
- }
-});
-
-function isMouseOverItem(cX, cY) {
-
- if (dragItem === null) {
-
- var x = cX / screenX;
- var y = cY / screenY;
- var a;
- var b;
- var c;
-
- for (var s = 0; s < 20; s++) {
- a = grid[s][0] - x;
- b = grid[s][1] - y;
- c = Math.sqrt(a * a + b * b);
-
- var invSlot = (s + 1);
-
- if (c < sizeMul / 2) {
- for (i = 0; i < items.length; i++) {
- if (parseInt(items[i][4]) === invSlot) {
- hoverItem = i;
- return true;
- }
- }
- }
- }
- } else {
- if (itemRadial === false) {
- var x = cX / screenX;
- var y = cY / screenY;
- var a;
- var b;
- var c;
-
- for (var s = 0; s < 20; s++) {
- a = grid[s][0] - x;
- b = grid[s][1] - y;
- c = Math.sqrt(a * a + b * b);
-
- var invSlot = (s + 1);
-
- if (c < sizeMul / 2) {
- for (i = 0; i < items.length; i++) {
- if (parseInt(items[i][4]) === invSlot) {
- hoverGrid = s;
- return true;
- }
- }
- }
- }
- }
- }
-}
-function isMouseOverTradeItem(cX, cY) {
-
- if (dragItem === null && isTrading) {
-
- var x = cX / screenX;
- var y = cY / screenY;
- var a;
- var b;
- var c;
-
- for (var s = 0; s < 5; s++) {
- a = tradeGrid[s][0] - x;
- b = tradeGrid[s][1] - y;
- c = Math.sqrt(a * a + b * b);
-
- var invSlot = (s + 1);
-
- if (c < sizeMul / 2) {
- for (i = 0; i < tradeItems.length; i++) {
- if (parseInt(tradeItems[i][4]) === invSlot) {
- hoverItem = i;
- return true;
- }
- }
- }
- }
- }
-}
-
-function isMouseOverFreeSlot(cX2, cY2) {
-
- var x = cX2 / screenX;
- var y = cY2 / screenY;
- var isItemOnSlot = 0;
-
- for (var s = 0; s < 20; s++) {
- var invSlot = (s + 1);
-
- if (x > grid[s][0] - sizeMul / 2 && x < grid[s][0] + sizeMul / 2 && y > grid[s][1] - sizeMul / 2 * aspectRatioFactor && y < grid[s][1] + sizeMul / 2 * aspectRatioFactor) {
- for (i = 0; i < items.length; i++) {
- if (parseInt(items[i][4]) === invSlot) {
- isItemOnSlot++;
- }
- }
- if (isItemOnSlot === 0) {
- actFreeSlot = s + 1;
- return true;
- }
- }
- }
-}
-
-function isMouseOverFreeTradeSlot(cX2, cY2) {
-
- if (tradeConfirm === false) {
- var x = cX2 / screenX;
- var y = cY2 / screenY;
- var isItemOnSlot = 0;
-
- for (var s = 0; s < 5; s++) {
- var invSlot = (s + 1);
-
- if (x > tradeGrid[s][0] - sizeMul / 2 && x < tradeGrid[s][0] + sizeMul / 2 && y > tradeGrid[s][1] - sizeMul / 2 * aspectRatioFactor && y < tradeGrid[s][1] + sizeMul / 2 * aspectRatioFactor) {
- for (i = 0; i < tradeItems.length; i++) {
- if (parseInt(tradeItems[i][4]) === invSlot) {
- isItemOnSlot++;
- }
- }
- if (isItemOnSlot === 0) {
- actFreeTradeSlot = s + 1;
- return true;
- }
- }
- }
- }
-}
-
-function isItemOverSameItem(cX2, cY2) {
-
- if (dragItem !== null && items.length > 0) {
- var x = cX2 / screenX;
- var y = cY2 / screenY;
-
- for (var s = 0; s < 20; s++) {
- var invSlot = (s + 1);
-
- if (x > grid[s][0] - sizeMul / 2 && x < grid[s][0] + sizeMul / 2 && y > grid[s][1] - sizeMul / 2 * aspectRatioFactor && y < grid[s][1] + sizeMul / 2 * aspectRatioFactor) {
-
- for (i = 0; i < items.length; i++) {
- if (dragTradeItem === false) {
- if (items[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot && items[hoverItem][4] !== items[i][4]) {
- stackToItem = i;
- return true;
- }
- } else {
- if (tradeItems[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot) {
- stackToItem = i;
- return true;
- }
- }
- }
- }
- }
- }
-}
-
-function isItemOverSameTradeItem(cX2, cY2) {
-
- if (dragItem !== null && tradeItems.length > 0) {
- var x = cX2 / screenX;
- var y = cY2 / screenY;
- for (var s = 0; s < 5; s++) {
- var invSlot = (s + 1);
-
- if (x > tradeGrid[s][0] - sizeMul / 2 && x < tradeGrid[s][0] + sizeMul / 2 && y > tradeGrid[s][1] - sizeMul / 2 * aspectRatioFactor && y < tradeGrid[s][1] + sizeMul / 2 * aspectRatioFactor) {
-
- for (i = 0; i < tradeItems.length; i++) {
- if (dragTradeItem === false) {
- if (items[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot) {
- stackToTradeItem = i;
- return true;
- }
- } else {
- if (tradeItems[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot && tradeItems[hoverItem][4] !== tradeItems[i][4]) {
- stackToTradeItem = i;
- return true;
- }
- }
- }
- }
- }
- }
-}
-
-function isMouseOverX(cX2, cY2) {
- if (showAdmin) {
- var x = cX2 / screenX;
- var y = cY2 / screenY;
-
- if (x > closePos[0] - 0.01 && x < closePos[0] + 0.01 && y > closePos[1] - 0.0175 && y < closePos[1] + 0.0175) {
- return true;
- }
- }
-}
-
-function isMouseOverTradeBox(cX2, cY2) {
- if (show && tradeConfirm === false) {
- var x = cX2 / screenX;
- var y = cY2 / screenY;
-
- if (x > tradeBoxPos[0] - 0.01 && x < tradeBoxPos[0] + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) {
- return true;
- }
- }
-}
-
-function isMouseOverTradeDollar(cX2, cY2) {
- if (show && tradeConfirm === false) {
- var x = cX2 / screenX;
- var y = cY2 / screenY;
-
- if (x > (tradeBoxPos[0] - 0.025) - 0.01 && x < (tradeBoxPos[0] - 0.025) + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) {
- return true;
- }
- }
-}
-
-function ifMouseSelectRadial(cX2, cY2) {
- if (show && itemRadial === true) {
- var x = cX2 / screenX;
- var y = cY2 / screenY;
- var a;
- var b;
- var c;
-
- //OBEN
- if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y < grid[hoverGrid][1] - 0.065 && y > grid[hoverGrid][1] - 0.2) {
- radialSelect = "up";
- radialDescription = "Wegwerfen";
- upRColor = 255;
- return true;
- }
- //UNTEN
- else if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y > grid[hoverGrid][1] + 0.065 && y < grid[hoverGrid][1] + 0.2) {
- radialSelect = "down";
- radialDescription = "Benutzen / Essen";
- downRColor = 255;
- return true;
- }
- ////LINKS
- //else if (x > grid[hoverGrid][0] - 0.2 / aspectRatioFactor && x < grid[hoverGrid][0] - 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) {
- // radialSelect = "left";
- // leftRColor = 255;
- // return true;
- //}
- ////RECHTS
- //else if (x < grid[hoverGrid][0] + 0.2 / aspectRatioFactor && x > grid[hoverGrid][0] + 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) {
- // radialSelect = "right";
- // rightRColor = 255;
- // return true;
- else {
- upRColor = 222;
- downRColor = 222;
- leftRColor = 222;
- rightRColor = 222;
- }
- }
-}
-
-mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, worldPosition, hitEntity) => {
-
- var cX = x / screenX;
- var cY = y / screenY;
-
- if (show) {
- //LINKE MAUSTASTE
- //RUNTER
- if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) {
-
- if (isTrading && isMouseOverTradeBox(x, y) && tradePrize > 0) {
- tradeConfirm = true;
- mp.events.callRemote('sendTradeItemsToPartner', JSON.stringify(tradeItems), tradePrize, tradePartner);
- }
- if (isTrading && isMouseOverTradeDollar(x, y)) {
- var tradeMoney = new InputHelper("Wie viel $ möchtest du für deine Items haben?");
- tradeMoney.show();
- tradeMoney.getValue((data) => {
- var amount = parseInt(data);
- if (isNaN(amount) || amount < 0) {
- mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!');
- return;
- }
- tradePrize = amount;
- })
- }
- mouseLDown = true;
-
- if (isMouseOverItem(x, y) && dragItem === null && itemRadial === false) {
- dragItem = hoverItem;
- oldDragSlot = items[dragItem][4];
- items[dragItem][4] = "-1";
- dragTradeItem = false;
- } else if (ifMouseSelectRadial(x, y)) {
- switch (radialSelect) {
- case "up":
- var dropInput = new InputHelper("Wie viel Items möchtest du wegwerfen?");
- dropInput.show();
- dropInput.getValue((data) => {
- var amount = parseInt(data);
- if (isNaN(amount) || amount < 1) {
- mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!');
- return;
- } else if (parseInt(amount) > parseInt(items[clickedItem][3])) {
- mp.game.graphics.notify('~r~So viele Items hast du nicht!');
- return;
- }
- mp.events.callRemote('itemInteract', "drop", items[clickedItem][5], parseInt(amount));
- });
-
- itemRadial = false;
- break;
- case "down":
- mp.events.callRemote('itemInteract', "use", items[clickedItem][5], 1);
- itemRadial = false;
- break;
- case "left":
- itemRadial = false;
- break;
- case "right":
- itemRadial = false;
- break;
- }
- } else if (isMouseOverTradeItem(x, y) && dragItem === null && itemRadial === false && tradeConfirm === false) {
- dragItem = hoverItem;
- oldDragSlot = tradeItems[dragItem][4];
- tradeItems[dragItem][4] = "-1";
- dragTradeItem = true;
- }
- }
-
- //HOCH
- if (upOrDown === "up" && leftOrRight === "left" && mouseLDown === true && itemRadial === false) {
-
- mouseLDown = false;
-
- if (dragItem !== null) {
- if (isMouseOverFreeSlot(x, y)) {
- if (dragTradeItem === false) {
- items[dragItem][4] = actFreeSlot;
- } else {
- items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], tradeItems[dragItem][3], actFreeSlot.toString(), tradeItems[dragItem][5]]);
- tradeItems.splice(dragItem, 1);
- }
- oldDragSlot = null;
- dragItem = null;
- hoverItem = null;
- } else if (isItemOverSameItem(x, y)) {
- if (dragTradeItem === false) {
- var newAmount = parseInt(items[stackToItem][3]) + parseInt(items[dragItem][3]);
- items[stackToItem][3] = newAmount.toString();
- items[dragItem][4] = "-1";
- } else {
- var newAmount = parseInt(items[stackToItem][3]) + parseInt(tradeItems[dragItem][3]);
- items[stackToItem][3] = newAmount.toString();
- tradeItems.splice(dragItem,1);
- }
- dragItem = null;
- hoverItem = null;
- } else if (isItemOverSameTradeItem(x, y)) {
- if (dragTradeItem === false) {
- var newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(items[dragItem][3]);
- tradeItems[stackToTradeItem][3] = newAmount.toString();
- items[dragItem][4] = "-1";
- } else {
- var newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(tradeItems[dragItem][3]);
- tradeItems[stackToTradeItem][3] = newAmount.toString();
- tradeItems[dragItem][4] = "-1";
- }
- dragItem = null;
- hoverItem = null;
- } else if (isMouseOverFreeTradeSlot(x, y)) {
- if (dragTradeItem === false) {
- tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], items[dragItem][3], actFreeTradeSlot.toString(), items[dragItem][5]]);
- items.splice(dragItem, 1);
- } else {
- tradeItems[dragItem][4] = actFreeTradeSlot;
- }
- oldDragSlot = null;
- dragItem = null;
- hoverItem = null;
- } else {
- if (dragTradeItem === false) {
- items[dragItem][4] = oldDragSlot;
- } else {
- tradeItems[dragItem][4] = oldDragSlot;
- }
- dragItem = null;
- hoverItem = null;
- }
- }
- }
-
- //RECHTE MAUSTASTE
- //RUNTER
- if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false && itemRadial === false) {
- clickTime = Date.now();
- mouseRDown = true;
-
- if (isMouseOverItem(x, y) && dragItem === null) {
- dragItem = hoverItem;
- oldDragSlot = items[hoverItem][4];
- bufferItem = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3], items[hoverItem][4], items[hoverItem][5]];
- items[hoverItem][3]--;
- dragTradeItem = false;
- } else if (isMouseOverTradeItem(x, y) && dragItem === null && tradeConfirm === false) {
- dragItem = hoverItem;
- oldDragSlot = tradeItems[hoverItem][4];
- bufferItem = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3], tradeItems[hoverItem][4], tradeItems[hoverItem][5]];
- tradeItems[hoverItem][3]--;
- dragTradeItem = true;
- }
- }
-
- //HOCH
- if (upOrDown === "up" && leftOrRight === "right" && mouseRDown === true && itemRadial === false) {
- mouseRDown = false;
- if (Date.now() - clickTime < 100 && isMouseOverItem(x, y)) {
- clickedItem = hoverItem;
- items[hoverItem][3]++;
- itemRadial = true;
- hoverItem = null;
- dragItem = null;
- clickTime = null;
- } else {
- if (dragItem !== null) {
- if (isMouseOverFreeSlot(x, y)) {
- if (dragTradeItem === false) {
- items.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeSlot.toString(), "-1"]);
- if (items[hoverItem][3] === 0) {
- items[hoverItem][4] = "-1";
- }
- } else {
- items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeSlot.toString(), "-1"]);
- if (tradeItems[hoverItem][3] === 0) {
- tradeItems.splice(hoverItem, 1);
- }
- }
- dragItem = null;
- hoverItem = null;
- } else if (isItemOverSameItem(x, y)) {
- items[stackToItem][3]++;
- if (dragTradeItem === false) {
- if (items[hoverItem][3] === 0) {
- items[hoverItem][4] = "-1";
- }
- } else {
- if (tradeItems[hoverItem][3] === 0) {
- tradeItems.splice(hoverItem, 1);
- }
- }
- bufferItem = null;
- dragItem = null;
- hoverItem = null;
- } else if (isItemOverSameTradeItem(x, y)) {
- tradeItems[stackToTradeItem][3]++;
- if (dragTradeItem === false) {
- if (items[hoverItem][3] === 0) {
- items[hoverItem][4] = "-1";
- }
- } else {
- if (tradeItems[hoverItem][3] === 0) {
- tradeItems[hoverItem][4] = "-1";
- }
- }
- bufferItem = null;
- dragItem = null;
- hoverItem = null;
- } else if (isMouseOverFreeTradeSlot(x, y)) {
- if (dragTradeItem === false) {
- tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]);
- if (items[hoverItem][3] === 0) {
- items[hoverItem][4] = "-1";
- }
- } else {
- tradeItems.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]);
- if (tradeItems[hoverItem][3] === 0) {
- tradeItems[hoverItem][4] = "-1";
- }
- }
- dragItem = null;
- hoverItem = null;
- } else {
- if (dragTradeItem === false) {
- items[hoverItem][3]++;
- } else {
- tradeItems[hoverItem][3]++;
- }
- bufferItem = null;
- dragItem = null;
- hoverItem = null;
- }
- }
- }
- }
- }
- if (showAdmin) {
- //LINKE MAUSTASTE
- //RUNTER
- if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) {
-
- if (isMouseOverItem(x, y)) {
- items[hoverItem][4] = "-1"
- inventoryWeight -= parseInt(items[hoverItem][2]) * parseInt(items[hoverItem][3]);
- mp.events.callRemote('removeItemAsAdmin', "stack", items[hoverItem][5], targetPlayerName);
- }
- }
-
- //RECHTE MAUSTASTE
- //RUNTER
- if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false) {
-
- if (isMouseOverItem(x, y)) {
- items[hoverItem][3]--;
- mp.events.callRemote('removeItemAsAdmin', "one", items[hoverItem][5], targetPlayerName);
- if (items[hoverItem][3] === 0) {
- items[hoverItem][4] = "-1";
- }
- inventoryWeight -= items[hoverItem][2];
- }
- }
- if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) {
-
- if (isMouseOverX(x, y)) {
- mp.gui.chat.activate(true);
- mp.gui.cursor.show(false, false);
- showAdmin = false;
- mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages");
- inventoryWeight = 0;
- items = null;
- }
- }
- }
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/Inventory/inventory.ts b/ReallifeGamemode.Client/Gui/Inventory/inventory.ts
new file mode 100644
index 00000000..1da8e792
--- /dev/null
+++ b/ReallifeGamemode.Client/Gui/Inventory/inventory.ts
@@ -0,0 +1,1061 @@
+import InputHelper from '../../inputhelper';
+
+export default function inventory() {
+
+ var show = false;
+ var showAdmin = false;
+ const { x: screenX, y: screenY } = mp.game.graphics.getScreenActiveResolution(0, 0);
+ let rxC = 0.5;
+ let ryC = 0.4;
+ let rWidth = 0.4;
+ let sX = (screenX * 0.1 / 1000);
+ let sY = (screenY * 0.1 / 1000);
+ let eX = sX - 0.1;
+ let eY = sY - 0.1;
+ let sizeMul = 0.08;
+ let yMul = 1.8;
+ var targetPlayerName;
+ let closePos = [0.7125, 0.17]
+ let tradeBoxPos = [0.7125, 0.82]
+ var clickTime;
+ var itemRadial = false;
+ var hoverGrid;
+ var radialSelect = "none";
+ var clickedItem;
+ let aspectRatioFactor = screenX / screenY;
+ var upRColor = 222;
+ var downRColor = 222;
+ var leftRColor = 222;
+ var rightRColor = 222;
+ var radialDescription;
+ var tradePartner = "Keinem";
+ var tradePrize = 0;
+ var tradeConfirm = false;
+ var isTrading = false;
+ var isTradingResult = false;
+ var dragTradeItem = null;
+
+ var inventoryWeight;
+ var items = [[]];
+ var tradeItems = [];
+ var tradeResultItems = [[]];
+
+ var grid = [];
+ grid[0] = [0.3375, 0.205]
+ grid[1] = [0.4195, 0.205]
+ grid[2] = [0.5015, 0.205]
+ grid[3] = [0.5835, 0.205]
+ grid[4] = [0.6655, 0.205]
+ grid[5] = [0.3375, 0.355]
+ grid[6] = [0.4195, 0.355]
+ grid[7] = [0.5015, 0.355]
+ grid[8] = [0.5835, 0.355]
+ grid[9] = [0.6655, 0.355]
+ grid[10] = [0.3375, 0.505]
+ grid[11] = [0.4195, 0.505]
+ grid[12] = [0.5015, 0.505]
+ grid[13] = [0.5835, 0.505]
+ grid[14] = [0.6655, 0.505]
+ grid[15] = [0.3375, 0.655]
+ grid[16] = [0.4195, 0.655]
+ grid[17] = [0.5015, 0.655]
+ grid[18] = [0.5835, 0.655]
+ grid[19] = [0.6655, 0.655]
+
+ var tradeGrid = [];
+ tradeGrid[0] = [0.3375, 0.925]
+ tradeGrid[1] = [0.4195, 0.925]
+ tradeGrid[2] = [0.5015, 0.925]
+ tradeGrid[3] = [0.5835, 0.925]
+ tradeGrid[4] = [0.6655, 0.925]
+
+ var mouseLDown = false;
+ var mouseRDown = false;
+ var hoverItem;
+ var dragItem = null;
+ var oldDragSlot;
+ var actFreeSlot;
+ var actFreeTradeSlot;
+ var bufferItem = [];
+ var stackToItem;
+ var stackToTradeItem;
+
+ mp.events.add("showInventory", (invWeight, itemArr) => {
+ if (show === false) {
+ //mp.gui.chat.activate(false);
+
+ mp.gui.cursor.show(true, true);
+ inventoryWeight = invWeight;
+ items = itemArr;
+ show = true;
+ mp.game.graphics.requestStreamedTextureDict("itemimages", true);
+ } else {
+ mp.events.callRemote('saveInventory', JSON.stringify(items));
+ mp.gui.chat.activate(true);
+ mp.gui.cursor.show(false, false);
+ show = false;
+ mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages");
+ inventoryWeight = 0;
+ items = null;
+ itemRadial = false;
+ if (tradeItems.length === 0) {
+ isTrading = false;
+ }
+ }
+ });
+
+ mp.events.add("openTradeMenu", (tradePartnerName) => {
+ tradePartner = tradePartnerName;
+ isTrading = true;
+ });
+ mp.events.add("showTradeRequest", () => {
+ show = false;
+ });
+ mp.events.add("showInventoryToAdmin", (pName, invWeight, itemArr) => {
+ if (showAdmin === false) {
+ targetPlayerName = pName;
+ mp.gui.chat.activate(false);
+ inventoryWeight = invWeight;
+ items = itemArr;
+ mp.game.graphics.requestStreamedTextureDict("itemimages", true);
+ setTimeout(() => mp.gui.cursor.show(true, true), 100);
+ showAdmin = true;
+ }
+ });
+
+ mp.events.add("addItem", (item) => {
+ if (show) {
+ items.push(JSON.parse(item));
+ }
+ });
+
+ mp.events.add("clearTradeItems", () => {
+ tradeConfirm = false;
+ tradeItems.splice(0, tradeItems.length);
+ tradePrize = 0;
+ });
+
+ mp.events.add("unlockTradeItems", () => {
+ tradeConfirm = false;
+ });
+
+ mp.events.add("showTradeItems", (tradeResultItemArray) => {
+ //for (var i = 0; i < tradeResultItemArray.length; i++) {
+
+ // tradeItems.push(tradeResultItemArray[i]);
+ //}
+ tradeItems = JSON.parse(tradeResultItemArray);
+ isTrading = true;
+ });
+
+ mp.events.add("removeItem", (userItemId, amount) => {
+ if (show) {
+ var arrIndex;
+ for (var i = 0; i < items.length; i++) {
+ if (items[i][5] === userItemId) {
+ arrIndex = i;
+ }
+ }
+ inventoryWeight -= parseInt(items[arrIndex][2]) * amount;
+ items[arrIndex][3] -= amount;
+ if (items[arrIndex][3] === 0) {
+ items.splice(arrIndex, 1);
+ }
+ }
+ });
+
+ mp.events.add("render", () => {
+ var pos;
+ if (show === true) {
+ pos = mp.gui.cursor.position;
+
+ mp.game.graphics.set2dLayer(1);
+ //INVENTARHINTERGRUND
+ mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200); //inventar
+ mp.game.graphics.set2dLayer(2);
+
+ //INVENTARÜBERSCHRIFT
+ mp.game.graphics.drawText("Inventar ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], {
+ font: 7,
+ color: [112, 128, 144, 254],
+ scale: [0.7, 0.7],
+ outline: true,
+ centre: false
+ });
+
+ //SLOTS [RECHTECKE] [SLOTZAHLEN]
+
+ var slots;
+
+ var tempSlot;
+ for (slots = 0; slots < grid.length; slots++) {
+ mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMul, sizeMul * yMul, 112, 128, 144, 254);
+ mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - (sizeMul / 2) + 0.006, grid[slots][1] - (sizeMul / 2 * yMul)], {
+ font: 7,
+ color: [255, 69, 0, 254],
+ scale: [0.3, 0.3],
+ outline: true,
+ centre: false
+ });
+ }
+
+ mp.game.graphics.set2dLayer(3);
+
+ var currentItem;
+
+ //SPRITES + ITEMANZAHL
+ for (currentItem = 0; currentItem < items.length; currentItem++) {
+ if (items[currentItem][4] !== "-1") {
+ mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[items[currentItem][4] - 1][0], grid[items[currentItem][4] - 1][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
+ mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[items[currentItem][4] - 1][0] + (sizeMul / 2) - 0.008, grid[items[currentItem][4] - 1][1] + 0.05], {
+ font: 0,
+ color: [255, 255, 255, 255],
+ scale: [0.25, 0.25],
+ outline: true,
+ centre: false
+ });
+ }
+ }
+
+ var hoverItemP;
+
+ mp.game.graphics.set2dLayer(4);
+ //WENN MAUS ÜBER ITEM
+ if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) {
+ mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220);
+
+ hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]];
+
+ //NAME
+ mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.4, 0.4],
+ outline: true,
+ centre: false
+ });
+
+ //BESCHREIBUNG
+ mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+
+ //EINZELGEWICHT
+ mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+ }
+
+ //WENN MOUSE DOWN
+ if (mouseLDown && dragItem !== null || mouseRDown && dragItem !== null) {
+
+ if (isMouseOverFreeSlot(pos[0], pos[1]) || isMouseOverFreeTradeSlot(pos[0], pos[1]) || isItemOverSameItem(pos[0], pos[1]) || isItemOverSameTradeItem(pos[0], pos[1])) {
+ if (dragTradeItem === false) {
+ mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, rWidth / 8, rWidth / 5, 0, 100, 255, 100, 255);
+ } else {
+ mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, rWidth / 8, rWidth / 5, 0, 100, 255, 100, 255);
+ }
+ } else {
+ if (dragTradeItem === false) {
+ mp.game.graphics.drawSprite("itemimages", items[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, rWidth / 8, rWidth / 5, 0, 255, 100, 100, 255);
+ } else {
+ mp.game.graphics.drawSprite("itemimages", tradeItems[dragItem][0].toLowerCase(), pos[0] / screenX, pos[1] / screenY, rWidth / 8, rWidth / 5, 0, 255, 100, 100, 255);
+ }
+ }
+ }
+ mp.game.graphics.set2dLayer(5);
+ if (itemRadial === true) {
+ mp.game.graphics.drawSprite("itemimages", "radialsplit", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 0, 0, 0, 255);
+ mp.game.graphics.drawSprite("itemimages", "radialup", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, upRColor, 222, upRColor);
+ mp.game.graphics.drawSprite("itemimages", "radialdown", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, downRColor, 222, downRColor);
+ //mp.game.graphics.drawSprite("itemimages", "radialleft", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, leftRColor, 222, leftRColor);
+ //mp.game.graphics.drawSprite("itemimages", "radialright", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 222, rightRColor, 222, rightRColor);
+ mp.game.graphics.set2dLayer(6);
+ mp.game.graphics.drawSprite("itemimages", "radialdrop", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255);
+ mp.game.graphics.drawSprite("itemimages", "radialuse", grid[hoverGrid][0], grid[hoverGrid][1], rWidth / aspectRatioFactor, rWidth, 0, 255, 255, 255, 255);
+ }
+ mp.game.graphics.set2dLayer(7);
+
+ if (ifMouseSelectRadial(pos[0], pos[1])) {
+ //mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY - 0.02, 0.08, 0.03, 0, 0, 0, 255);
+ mp.game.graphics.drawText("~g~" + radialDescription, [pos[0] / screenX, pos[1] / screenY - 0.033], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.5, 0.5],
+ outline: true,
+ centre: false
+ });
+ }
+ if (isTrading) {
+ mp.game.graphics.set2dLayer(1);
+ mp.game.graphics.drawRect(rxC, 0.925, 0.45, 0.25, 255, 255, 255, 200);
+ mp.game.graphics.set2dLayer(2);
+ var tempSlot2;
+ for (slots = 0; slots < tradeGrid.length; slots++) {
+ mp.game.graphics.drawRect(tradeGrid[slots][0], tradeGrid[slots][1], sizeMul, sizeMul * yMul, 112, 128, 144, 254);
+ mp.game.graphics.drawText(tempSlot2 = slots + 1, [tradeGrid[slots][0] - (sizeMul / 2) + 0.006, tradeGrid[slots][1] - (sizeMul / 2 * yMul)], {
+ font: 7,
+ color: [69, 255, 0, 254],
+ scale: [0.3, 0.3],
+ outline: true,
+ centre: false
+ });
+ }
+
+ mp.game.graphics.set2dLayer(3);
+
+ //SPRITES + ITEMANZAHL
+ if (tradeItems.length !== 0) {
+ for (currentItem = 0; currentItem < tradeItems.length; currentItem++) {
+ if (tradeItems[currentItem][4] !== "-1") {
+ mp.game.graphics.drawSprite("itemimages", tradeItems[currentItem][0].toLowerCase(), tradeGrid[tradeItems[currentItem][4] - 1][0], tradeGrid[tradeItems[currentItem][4] - 1][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
+ mp.game.graphics.drawText("(~y~" + tradeItems[currentItem][3] + "~s~)", [tradeGrid[tradeItems[currentItem][4] - 1][0] + (sizeMul / 2) - 0.008, tradeGrid[tradeItems[currentItem][4] - 1][1] + 0.05], {
+ font: 0,
+ color: [255, 255, 255, 255],
+ scale: [0.25, 0.25],
+ outline: true,
+ centre: false
+ });
+ if (tradeConfirm === true) {
+ mp.game.graphics.drawSprite("itemimages", "lock", tradeGrid[tradeItems[currentItem][4] - 1][0], tradeGrid[tradeItems[currentItem][4] - 1][1], rWidth / 8 / 2, rWidth / 5 / 2, 0, 255, 255, 255, 255);
+ }
+ }
+ }
+ }
+ //} else {
+ // if (tradeResultItems.length !== 0) {
+ // for (var currentItem = 0; currentItem < tradeResultItems.length; currentItem++) {
+ // mp.game.graphics.drawSprite("itemimages", tradeResultItems[currentItem][0].toLowerCase(), tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0], tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
+ // mp.game.graphics.drawText("(~y~" + tradeResultItems[currentItem][3] + "~s~)", [tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][0] + (sizeMul / 2) - 0.008, tradeGrid[parseInt(tradeResultItems[currentItem][4] - 1)][1] + 0.05], {
+ // font: 0,
+ // color: [255, 255, 255, 255],
+ // scale: [0.25, 0.25],
+ // outline: true,
+ // });
+ // }
+ // }
+ //}
+
+ mp.game.graphics.drawText("Handel mit ~y~" + tradePartner + " ~s~ für ~g~ " + tradePrize + "$", [rxC, 0.81], {
+ font: 7,
+ color: [112, 128, 144, 254],
+ scale: [0.6, 0.6],
+ outline: true,
+ centre: false
+ });
+ mp.game.graphics.set2dLayer(4);
+ if (tradeConfirm === false) {
+ mp.game.graphics.drawSprite("itemimages", "box", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255);
+ } else {
+ mp.game.graphics.drawSprite("itemimages", "boxticked", tradeBoxPos[0], tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255);
+ }
+ mp.game.graphics.drawSprite("itemimages", "dollar", tradeBoxPos[0] - 0.025, tradeBoxPos[1], 0.02, 0.035, 0, 255, 255, 255, 255);
+
+ if (isMouseOverTradeDollar(pos[0], pos[1])) {
+ mp.game.graphics.drawText("~g~ Preis festlegen", [pos[0] / screenX, pos[1] / screenY - 0.033], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.5, 0.5],
+ outline: true,
+ centre: false
+ });
+ }
+ if (isMouseOverTradeBox(pos[0], pos[1])) {
+ mp.game.graphics.drawText("~g~Handelsanfrage absenden", [pos[0] / screenX, pos[1] / screenY - 0.033], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.5, 0.5],
+ outline: true,
+ centre: false
+ });
+ }
+
+ mp.game.graphics.set2dLayer(5);
+ if (isMouseOverTradeItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) {
+ mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220);
+
+ hoverItemP = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3]];
+
+ //NAME
+ mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.4, 0.4],
+ outline: true,
+ centre: false
+ });
+
+ //BESCHREIBUNG
+ mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+
+ //EINZELGEWICHT
+ mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+ }
+ }
+
+
+
+ ////--------------------------------------------------------------DEBUG
+ //mp.game.graphics.drawText(itemRadial.toString() + " ~y~" + radialSelect, [0.5, 0.05], {
+ // font: 7,
+ // color: [255, 0, 0, 255],
+ // scale: [0.7, 0.7],
+ // outline: true,
+ //});
+ ////KOORDINATEN
+ //mp.game.graphics.drawText((pos[0] / screenX).toFixed(3) + " / " + (pos[1] / screenY).toFixed(3) + " " + tradeItems.length, [pos[0] / screenX, pos[1] / screenY - 0.02], {
+ // font: 4,
+ // color: [255, 255, 255, 255],
+ // scale: [0.4, 0.4],
+ // outline: true,
+ //});
+ ////----------------------------------------------------------DEBUG END
+ }
+ if (showAdmin === true) {
+ pos = mp.gui.cursor.position;
+
+ mp.game.graphics.set2dLayer(1);
+ //INVENTARHINTERGRUND
+ mp.game.graphics.drawRect(rxC, ryC, 0.45, 0.7, 255, 255, 255, 200);
+
+ mp.game.graphics.set2dLayer(2);
+ //INVENTARÜBERSCHRIFT
+ mp.game.graphics.drawText("Inventar von ~y~" + targetPlayerName + " ~g~" + inventoryWeight + "/40000g", [rxC, ryC - (rWidth / 1.20)], {
+ font: 7,
+ color: [112, 128, 144, 254],
+ scale: [0.7, 0.7],
+ outline: true,
+ centre: false
+ });
+
+ //SLOTS [RECHTECKE] [SLOTZAHLEN]
+ for (slots = 0; slots < grid.length; slots++) {
+ mp.game.graphics.drawRect(grid[slots][0], grid[slots][1], sizeMul, sizeMul * yMul, 112, 128, 144, 254);
+ mp.game.graphics.drawText(tempSlot = slots + 1, [grid[slots][0] - (sizeMul / 2) + 0.006, grid[slots][1] - (sizeMul / 2 * yMul)], {
+ font: 7,
+ color: [255, 69, 0, 254],
+ scale: [0.3, 0.3],
+ outline: true,
+ centre: false
+ });
+ }
+
+ mp.game.graphics.set2dLayer(3);
+ //SPRITES + ITEMANZAHL
+ for (currentItem = 0; currentItem < items.length; currentItem++) {
+ if (items[currentItem][4] !== "-1") {
+ mp.game.graphics.drawSprite("itemimages", items[currentItem][0].toLowerCase(), grid[items[currentItem][4] - 1][0], grid[items[currentItem][4] - 1][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
+ mp.game.graphics.drawText("(~y~" + items[currentItem][3] + "~s~)", [grid[items[currentItem][4] - 1][0] + (sizeMul / 2) - 0.008, grid[items[currentItem][4] - 1][1] + 0.05], {
+ font: 0,
+ color: [255, 255, 255, 255],
+ scale: [0.25, 0.25],
+ outline: true,
+ centre: false
+ });
+ }
+ }
+
+ mp.game.graphics.set2dLayer(4);
+ //WENN MAUS ÜBER ITEM
+ if (isMouseOverItem(pos[0], pos[1]) && dragItem === null && itemRadial === false) {
+ mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220);
+
+ hoverItemP = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3]];
+
+ //NAME
+ mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.4, 0.4],
+ outline: true,
+ centre: false
+ });
+
+ //BESCHREIBUNG
+ mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+
+ //EINZELGEWICHT
+ mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+ }
+
+ if (isMouseOverX(pos[0], pos[1])) {
+ mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 220, 20, 60, 255);
+ } else {
+ mp.game.graphics.drawSprite("itemimages", "x", closePos[0], closePos[1], 0.02, 0.035, 0, 255, 255, 255, 255);
+ }
+
+ }
+ });
+
+ function isMouseOverItem(cX, cY) {
+
+ var x, y, a, b, c, s, invSlot;
+
+ if (dragItem === null) {
+
+ x = cX / screenX;
+ y = cY / screenY;
+ a;
+ b;
+ c;
+
+ for (s = 0; s < 20; s++) {
+ a = grid[s][0] - x;
+ b = grid[s][1] - y;
+ c = Math.sqrt(a * a + b * b);
+
+ invSlot = (s + 1);
+
+ if (c < sizeMul / 2) {
+ for (var i = 0; i < items.length; i++) {
+ if (parseInt(items[i][4]) === invSlot) {
+ hoverItem = i;
+ return true;
+ }
+ }
+ }
+ }
+ } else {
+ if (itemRadial === false) {
+ x = cX / screenX;
+ y = cY / screenY;
+ a;
+ b;
+ c;
+
+ for (s = 0; s < 20; s++) {
+ a = grid[s][0] - x;
+ b = grid[s][1] - y;
+ c = Math.sqrt(a * a + b * b);
+
+ invSlot = (s + 1);
+
+ if (c < sizeMul / 2) {
+ for (i = 0; i < items.length; i++) {
+ if (parseInt(items[i][4]) === invSlot) {
+ hoverGrid = s;
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ function isMouseOverTradeItem(cX, cY) {
+
+ if (dragItem === null && isTrading) {
+
+ var x = cX / screenX;
+ var y = cY / screenY;
+ var a;
+ var b;
+ var c;
+
+ for (var s = 0; s < 5; s++) {
+ a = tradeGrid[s][0] - x;
+ b = tradeGrid[s][1] - y;
+ c = Math.sqrt(a * a + b * b);
+
+ var invSlot = (s + 1);
+
+ if (c < sizeMul / 2) {
+ for (var i = 0; i < tradeItems.length; i++) {
+ if (parseInt(tradeItems[i][4]) === invSlot) {
+ hoverItem = i;
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ function isMouseOverFreeSlot(cX2, cY2) {
+
+ var x = cX2 / screenX;
+ var y = cY2 / screenY;
+ var isItemOnSlot = 0;
+
+ for (var s = 0; s < 20; s++) {
+ var invSlot = (s + 1);
+
+ if (x > grid[s][0] - sizeMul / 2 && x < grid[s][0] + sizeMul / 2 && y > grid[s][1] - sizeMul / 2 * aspectRatioFactor && y < grid[s][1] + sizeMul / 2 * aspectRatioFactor) {
+ for (var i = 0; i < items.length; i++) {
+ if (parseInt(items[i][4]) === invSlot) {
+ isItemOnSlot++;
+ }
+ }
+ if (isItemOnSlot === 0) {
+ actFreeSlot = s + 1;
+ return true;
+ }
+ }
+ }
+ }
+
+ function isMouseOverFreeTradeSlot(cX2, cY2) {
+
+ if (tradeConfirm === false) {
+ var x = cX2 / screenX;
+ var y = cY2 / screenY;
+ var isItemOnSlot = 0;
+
+ for (var s = 0; s < 5; s++) {
+ var invSlot = (s + 1);
+
+ if (x > tradeGrid[s][0] - sizeMul / 2 && x < tradeGrid[s][0] + sizeMul / 2 && y > tradeGrid[s][1] - sizeMul / 2 * aspectRatioFactor && y < tradeGrid[s][1] + sizeMul / 2 * aspectRatioFactor) {
+ for (var i = 0; i < tradeItems.length; i++) {
+ if (parseInt(tradeItems[i][4]) === invSlot) {
+ isItemOnSlot++;
+ }
+ }
+ if (isItemOnSlot === 0) {
+ actFreeTradeSlot = s + 1;
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ function isItemOverSameItem(cX2, cY2) {
+
+ if (dragItem !== null && items.length > 0) {
+ var x = cX2 / screenX;
+ var y = cY2 / screenY;
+
+ for (var s = 0; s < 20; s++) {
+ var invSlot = (s + 1);
+
+ if (x > grid[s][0] - sizeMul / 2 && x < grid[s][0] + sizeMul / 2 && y > grid[s][1] - sizeMul / 2 * aspectRatioFactor && y < grid[s][1] + sizeMul / 2 * aspectRatioFactor) {
+
+ for (var i = 0; i < items.length; i++) {
+ if (dragTradeItem === false) {
+ if (items[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot && items[hoverItem][4] !== items[i][4]) {
+ stackToItem = i;
+ return true;
+ }
+ } else {
+ if (tradeItems[dragItem][0] === items[i][0] && parseInt(items[i][4]) === invSlot) {
+ stackToItem = i;
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ function isItemOverSameTradeItem(cX2, cY2) {
+
+ if (dragItem !== null && tradeItems.length > 0) {
+ var x = cX2 / screenX;
+ var y = cY2 / screenY;
+ for (var s = 0; s < 5; s++) {
+ var invSlot = (s + 1);
+
+ if (x > tradeGrid[s][0] - sizeMul / 2 && x < tradeGrid[s][0] + sizeMul / 2 && y > tradeGrid[s][1] - sizeMul / 2 * aspectRatioFactor && y < tradeGrid[s][1] + sizeMul / 2 * aspectRatioFactor) {
+
+ for (var i = 0; i < tradeItems.length; i++) {
+ if (dragTradeItem === false) {
+ if (items[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot) {
+ stackToTradeItem = i;
+ return true;
+ }
+ } else {
+ if (tradeItems[dragItem][0] === tradeItems[i][0] && parseInt(tradeItems[i][4]) === invSlot && tradeItems[hoverItem][4] !== tradeItems[i][4]) {
+ stackToTradeItem = i;
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ function isMouseOverX(cX2, cY2) {
+ if (showAdmin) {
+ var x = cX2 / screenX;
+ var y = cY2 / screenY;
+
+ if (x > closePos[0] - 0.01 && x < closePos[0] + 0.01 && y > closePos[1] - 0.0175 && y < closePos[1] + 0.0175) {
+ return true;
+ }
+ }
+ }
+
+ function isMouseOverTradeBox(cX2, cY2) {
+ if (show && tradeConfirm === false) {
+ var x = cX2 / screenX;
+ var y = cY2 / screenY;
+
+ if (x > tradeBoxPos[0] - 0.01 && x < tradeBoxPos[0] + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) {
+ return true;
+ }
+ }
+ }
+
+ function isMouseOverTradeDollar(cX2, cY2) {
+ if (show && tradeConfirm === false) {
+ var x = cX2 / screenX;
+ var y = cY2 / screenY;
+
+ if (x > (tradeBoxPos[0] - 0.025) - 0.01 && x < (tradeBoxPos[0] - 0.025) + 0.01 && y > tradeBoxPos[1] - 0.0175 && y < tradeBoxPos[1] + 0.0175) {
+ return true;
+ }
+ }
+ }
+
+ function ifMouseSelectRadial(cX2, cY2) {
+ if (show && itemRadial === true) {
+ var x = cX2 / screenX;
+ var y = cY2 / screenY;
+ var a;
+ var b;
+ var c;
+
+ //OBEN
+ if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y < grid[hoverGrid][1] - 0.065 && y > grid[hoverGrid][1] - 0.2) {
+ radialSelect = "up";
+ radialDescription = "Wegwerfen";
+ upRColor = 255;
+ return true;
+ }
+ //UNTEN
+ else if (x > grid[hoverGrid][0] - 0.0255 / aspectRatioFactor && x < grid[hoverGrid][0] + 0.0255 / aspectRatioFactor && y > grid[hoverGrid][1] + 0.065 && y < grid[hoverGrid][1] + 0.2) {
+ radialSelect = "down";
+ radialDescription = "Benutzen / Essen";
+ downRColor = 255;
+ return true;
+ }
+ ////LINKS
+ //else if (x > grid[hoverGrid][0] - 0.2 / aspectRatioFactor && x < grid[hoverGrid][0] - 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) {
+ // radialSelect = "left";
+ // leftRColor = 255;
+ // return true;
+ //}
+ ////RECHTS
+ //else if (x < grid[hoverGrid][0] + 0.2 / aspectRatioFactor && x > grid[hoverGrid][0] + 0.065 / aspectRatioFactor && y < grid[hoverGrid][1] + 0.0255 && y > grid[hoverGrid][1] - 0.0255) {
+ // radialSelect = "right";
+ // rightRColor = 255;
+ // return true;
+ else {
+ upRColor = 222;
+ downRColor = 222;
+ leftRColor = 222;
+ rightRColor = 222;
+ }
+ }
+ }
+
+ mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, worldPosition, hitEntity) => {
+
+ var cX = x / screenX;
+ var cY = y / screenY;
+
+ if (show) {
+ //LINKE MAUSTASTE
+ //RUNTER
+ if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) {
+
+ if (isTrading && isMouseOverTradeBox(x, y) && tradePrize > 0) {
+ tradeConfirm = true;
+ mp.events.callRemote('sendTradeItemsToPartner', JSON.stringify(tradeItems), tradePrize, tradePartner);
+ }
+ if (isTrading && isMouseOverTradeDollar(x, y)) {
+ var tradeMoney = new InputHelper("Wie viel $ möchtest du für deine Items haben?");
+ tradeMoney.show();
+ tradeMoney.getValue((data) => {
+ var amount = parseInt(data);
+ if (isNaN(amount) || amount < 0) {
+ mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!');
+ return;
+ }
+ tradePrize = amount;
+ });
+ }
+ mouseLDown = true;
+
+ if (isMouseOverItem(x, y) && dragItem === null && itemRadial === false) {
+ dragItem = hoverItem;
+ oldDragSlot = items[dragItem][4];
+ items[dragItem][4] = "-1";
+ dragTradeItem = false;
+ } else if (ifMouseSelectRadial(x, y)) {
+ switch (radialSelect) {
+ case "up":
+ var dropInput = new InputHelper("Wie viel Items möchtest du wegwerfen?");
+ dropInput.show();
+ dropInput.getValue((data) => {
+ var amount = parseInt(data);
+ if (isNaN(amount) || amount < 1) {
+ mp.game.graphics.notify('~r~Du musst eine Zahl größer als 0 eingeben!');
+ return;
+ } else if (amount > parseInt(items[clickedItem][3])) {
+ mp.game.graphics.notify('~r~So viele Items hast du nicht!');
+ return;
+ }
+ mp.events.callRemote('itemInteract', "drop", items[clickedItem][5], amount);
+ });
+
+ itemRadial = false;
+ break;
+ case "down":
+ mp.events.callRemote('itemInteract', "use", items[clickedItem][5], 1);
+ itemRadial = false;
+ break;
+ case "left":
+ itemRadial = false;
+ break;
+ case "right":
+ itemRadial = false;
+ break;
+ }
+ } else if (isMouseOverTradeItem(x, y) && dragItem === null && itemRadial === false && tradeConfirm === false) {
+ dragItem = hoverItem;
+ oldDragSlot = tradeItems[dragItem][4];
+ tradeItems[dragItem][4] = "-1";
+ dragTradeItem = true;
+ }
+ }
+
+ //HOCH
+ if (upOrDown === "up" && leftOrRight === "left" && mouseLDown === true && itemRadial === false) {
+
+ mouseLDown = false;
+
+ if (dragItem !== null) {
+ var newAmount;
+ if (isMouseOverFreeSlot(x, y)) {
+ if (dragTradeItem === false) {
+ items[dragItem][4] = actFreeSlot;
+ } else {
+ items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], tradeItems[dragItem][3], actFreeSlot.toString(), tradeItems[dragItem][5]]);
+ tradeItems.splice(dragItem, 1);
+ }
+ oldDragSlot = null;
+ dragItem = null;
+ hoverItem = null;
+ } else if (isItemOverSameItem(x, y)) {
+ if (dragTradeItem === false) {
+ newAmount = parseInt(items[stackToItem][3]) + parseInt(items[dragItem][3]);
+ items[stackToItem][3] = newAmount.toString();
+ items[dragItem][4] = "-1";
+ } else {
+ newAmount = parseInt(items[stackToItem][3]) + parseInt(tradeItems[dragItem][3]);
+ items[stackToItem][3] = newAmount.toString();
+ tradeItems.splice(dragItem, 1);
+ }
+ dragItem = null;
+ hoverItem = null;
+ } else if (isItemOverSameTradeItem(x, y)) {
+ if (dragTradeItem === false) {
+ newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(items[dragItem][3]);
+ tradeItems[stackToTradeItem][3] = newAmount.toString();
+ items[dragItem][4] = "-1";
+ } else {
+ newAmount = parseInt(tradeItems[stackToTradeItem][3]) + parseInt(tradeItems[dragItem][3]);
+ tradeItems[stackToTradeItem][3] = newAmount.toString();
+ tradeItems[dragItem][4] = "-1";
+ }
+ dragItem = null;
+ hoverItem = null;
+ } else if (isMouseOverFreeTradeSlot(x, y)) {
+ if (dragTradeItem === false) {
+ tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], items[dragItem][3], actFreeTradeSlot.toString(), items[dragItem][5]]);
+ items.splice(dragItem, 1);
+ } else {
+ tradeItems[dragItem][4] = actFreeTradeSlot;
+ }
+ oldDragSlot = null;
+ dragItem = null;
+ hoverItem = null;
+ } else {
+ if (dragTradeItem === false) {
+ items[dragItem][4] = oldDragSlot;
+ } else {
+ tradeItems[dragItem][4] = oldDragSlot;
+ }
+ dragItem = null;
+ hoverItem = null;
+ }
+ }
+ }
+
+ //RECHTE MAUSTASTE
+ //RUNTER
+ if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false && itemRadial === false) {
+ clickTime = Date.now();
+ mouseRDown = true;
+
+ if (isMouseOverItem(x, y) && dragItem === null) {
+ dragItem = hoverItem;
+ oldDragSlot = items[hoverItem][4];
+ bufferItem = [items[hoverItem][0], items[hoverItem][1], items[hoverItem][2], items[hoverItem][3], items[hoverItem][4], items[hoverItem][5]];
+ items[hoverItem][3]--;
+ dragTradeItem = false;
+ } else if (isMouseOverTradeItem(x, y) && dragItem === null && tradeConfirm === false) {
+ dragItem = hoverItem;
+ oldDragSlot = tradeItems[hoverItem][4];
+ bufferItem = [tradeItems[hoverItem][0], tradeItems[hoverItem][1], tradeItems[hoverItem][2], tradeItems[hoverItem][3], tradeItems[hoverItem][4], tradeItems[hoverItem][5]];
+ tradeItems[hoverItem][3]--;
+ dragTradeItem = true;
+ }
+ }
+
+ //HOCH
+ if (upOrDown === "up" && leftOrRight === "right" && mouseRDown === true && itemRadial === false) {
+ mouseRDown = false;
+ if (Date.now() - clickTime < 100 && isMouseOverItem(x, y)) {
+ clickedItem = hoverItem;
+ items[hoverItem][3]++;
+ itemRadial = true;
+ hoverItem = null;
+ dragItem = null;
+ clickTime = null;
+ } else {
+ if (dragItem !== null) {
+ if (isMouseOverFreeSlot(x, y)) {
+ if (dragTradeItem === false) {
+ items.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeSlot.toString(), "-1"]);
+ if (items[hoverItem][3] === 0) {
+ items[hoverItem][4] = "-1";
+ }
+ } else {
+ items.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeSlot.toString(), "-1"]);
+ if (tradeItems[hoverItem][3] === 0) {
+ tradeItems.splice(hoverItem, 1);
+ }
+ }
+ dragItem = null;
+ hoverItem = null;
+ } else if (isItemOverSameItem(x, y)) {
+ items[stackToItem][3]++;
+ if (dragTradeItem === false) {
+ if (items[hoverItem][3] === 0) {
+ items[hoverItem][4] = "-1";
+ }
+ } else {
+ if (tradeItems[hoverItem][3] === 0) {
+ tradeItems.splice(hoverItem, 1);
+ }
+ }
+ bufferItem = null;
+ dragItem = null;
+ hoverItem = null;
+ } else if (isItemOverSameTradeItem(x, y)) {
+ tradeItems[stackToTradeItem][3]++;
+ if (dragTradeItem === false) {
+ if (items[hoverItem][3] === 0) {
+ items[hoverItem][4] = "-1";
+ }
+ } else {
+ if (tradeItems[hoverItem][3] === 0) {
+ tradeItems[hoverItem][4] = "-1";
+ }
+ }
+ bufferItem = null;
+ dragItem = null;
+ hoverItem = null;
+ } else if (isMouseOverFreeTradeSlot(x, y)) {
+ if (dragTradeItem === false) {
+ tradeItems.push([items[dragItem][0], items[dragItem][1], items[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]);
+ if (items[hoverItem][3] === 0) {
+ items[hoverItem][4] = "-1";
+ }
+ } else {
+ tradeItems.push([tradeItems[dragItem][0], tradeItems[dragItem][1], tradeItems[dragItem][2], "1", actFreeTradeSlot.toString(), "-1"]);
+ if (tradeItems[hoverItem][3] === 0) {
+ tradeItems[hoverItem][4] = "-1";
+ }
+ }
+ dragItem = null;
+ hoverItem = null;
+ } else {
+ if (dragTradeItem === false) {
+ items[hoverItem][3]++;
+ } else {
+ tradeItems[hoverItem][3]++;
+ }
+ bufferItem = null;
+ dragItem = null;
+ hoverItem = null;
+ }
+ }
+ }
+ }
+ }
+ if (showAdmin) {
+ //LINKE MAUSTASTE
+ //RUNTER
+ if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) {
+
+ if (isMouseOverItem(x, y)) {
+ items[hoverItem][4] = "-1";
+ inventoryWeight -= parseInt(items[hoverItem][2]) * parseInt(items[hoverItem][3]);
+ mp.events.callRemote('removeItemAsAdmin', "stack", items[hoverItem][5], targetPlayerName);
+ }
+ }
+
+ //RECHTE MAUSTASTE
+ //RUNTER
+ if (upOrDown === "down" && leftOrRight === "right" && mouseLDown === false && mouseRDown === false) {
+
+ if (isMouseOverItem(x, y)) {
+ items[hoverItem][3]--;
+ mp.events.callRemote('removeItemAsAdmin', "one", items[hoverItem][5], targetPlayerName);
+ if (items[hoverItem][3] === 0) {
+ items[hoverItem][4] = "-1";
+ }
+ inventoryWeight -= items[hoverItem][2];
+ }
+ }
+ if (upOrDown === "down" && leftOrRight === "left" && mouseLDown === false && mouseRDown === false) {
+
+ if (isMouseOverX(x, y)) {
+ mp.gui.chat.activate(true);
+ mp.gui.cursor.show(false, false);
+ showAdmin = false;
+ mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("itemimages");
+ inventoryWeight = 0;
+ items = null;
+ }
+ }
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/deathscreen.js b/ReallifeGamemode.Client/Gui/deathscreen.js
deleted file mode 100644
index ebecae07..00000000
--- a/ReallifeGamemode.Client/Gui/deathscreen.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * @overview Life of German Reallife - Gui Infobox infobox.js
- * @author VegaZ
- * @copyright (c) 2008 - 2018 Life of German
- */
-
-var playerName;
-var playerId;
-var playerMoney;
-var dutyMedics = 0;
-
-var isDeath = false;
-var deathTime;
-var respawnTime;
-var deathSeconds;
-var fade;
-
-mp.game.gameplay.setFadeOutAfterDeath(false);
-
-mp.events.add("startDeathTimer", (isAdmin) => {
- if (isDeath === false) {
- isDeath = true;
- if (isAdmin) {
- mp.gui.chat.activate(true);
- }
- else {
- mp.gui.chat.activate(false);
- }
- mp.game.audio.playSoundFrontend(-1, "Bed", "WastedSounds", true);
- deathDate = new Date();
- respawnTime = Math.floor(deathDate.getTime() / 1000 + 120);
- fade = 255 - 120;
- mp.game.graphics.requestStreamedTextureDict("Mptattoos", true);
- }
-});
-
-mp.events.add("onPlayerRevived", () => {
- isDeath = false;
- mp.gui.chat.activate(true);
- mp.game.gameplay.setFadeOutAfterDeath(false);
- mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("Mptattoos");
-});
-
-mp.events.add("respawnDeathPlayer", () => {
- isDeath = false;
- mp.gui.chat.activate(true);
- mp.game.gameplay.setFadeOutAfterDeath(false);
- mp.events.callRemote('RespawnPlayerAtHospital');
- mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("Mptattoos");
-});
-
-mp.events.add("updateDutyMedics", (count) => {
- dutyMedics = count;
-});
-
-
-
-mp.events.add("render", () => {
- currentDate = new Date();
-
- if (isDeath === true) {
-
- var medicString;
- if (dutyMedics > 0) {
- medicString = "Derzeit ";
- if (dutyMedics === 1) {
- medicString += "ist ~g~" + dutyMedics + " Medic";
- } else {
- medicString = "sind ~g~" + dutyMedics + " Medics";
- }
- medicString += " ~s~im Dienst ~c~und versuchen dich wiederzubeleben...";
- } else {
- medicString = "Derzeit sind ~r~keine Medics ~s~im Dienst.";
- }
-
- deathSeconds = respawnTime - Math.floor(currentDate.getTime() / 1000);
- var alpha = fade + Math.floor(currentDate.getTime() / 1000 - deathDate.getTime() / 1000);
- if (deathSeconds >= 0) {
- mp.game.graphics.set2dLayer(2);
- mp.game.graphics.drawSprite("Mptattoos", "clearout", 0.625, 0.52, 0.1, 0.1, 0, 255, 255, 255, 236);
- mp.game.graphics.drawText("Respawn in: ~y~" + deathSeconds, [0.5, 0.5],
- {
- font: 7,
- color: [255, 255, 255, 255],
- scale: [0.8, 0.8],
- outline: true
- });
- mp.game.graphics.drawText(medicString, [0.5, 0.975],
- {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.4, 0.4],
- outline: true
- });
- mp.game.graphics.set2dLayer(1);
- mp.game.graphics.drawRect(0.5, 0.5, 1, 1, 0, 0, 0, alpha);
-
- } else {
- mp.events.call("respawnDeathPlayer");
- }
- }
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/deathscreen.ts b/ReallifeGamemode.Client/Gui/deathscreen.ts
new file mode 100644
index 00000000..cfd7c06d
--- /dev/null
+++ b/ReallifeGamemode.Client/Gui/deathscreen.ts
@@ -0,0 +1,108 @@
+/**
+ * @overview Life of German Reallife - Gui Infobox infobox.js
+ * @author VegaZ
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
+export default function deathScreen() {
+
+ var playerName;
+ var playerId;
+ var playerMoney;
+ var dutyMedics = 0;
+
+ var isDeath = false;
+ var deathTime;
+ var respawnTime;
+ var deathSeconds;
+ var fade;
+ var deathDate: Date;
+
+ mp.game.gameplay.setFadeOutAfterDeath(false);
+
+ mp.events.add("startDeathTimer", (isAdmin) => {
+ if (isDeath === false) {
+ isDeath = true;
+ if (isAdmin) {
+ mp.gui.chat.activate(true);
+ }
+ else {
+ mp.gui.chat.activate(false);
+ }
+ mp.game.audio.playSoundFrontend(-1, "Bed", "WastedSounds", true);
+ deathDate = new Date();
+ respawnTime = Math.floor(deathDate.getTime() / 1000 + 120);
+ fade = 255 - 120;
+ mp.game.graphics.requestStreamedTextureDict("Mptattoos", true);
+ }
+ });
+
+ mp.events.add("onPlayerRevived", () => {
+ isDeath = false;
+ mp.gui.chat.activate(true);
+ mp.game.gameplay.setFadeOutAfterDeath(false);
+ mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("Mptattoos");
+ });
+
+ mp.events.add("respawnDeathPlayer", () => {
+ isDeath = false;
+ mp.gui.chat.activate(true);
+ mp.game.gameplay.setFadeOutAfterDeath(false);
+ mp.events.callRemote('RespawnPlayerAtHospital');
+ mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("Mptattoos");
+ });
+
+ mp.events.add("updateDutyMedics", (count) => {
+ dutyMedics = count;
+ });
+
+
+
+ mp.events.add("render", () => {
+ var currentDate = new Date();
+
+ if (isDeath === true) {
+
+ var medicString;
+ if (dutyMedics > 0) {
+ medicString = "Derzeit ";
+ if (dutyMedics === 1) {
+ medicString += "ist ~g~" + dutyMedics + " Medic";
+ } else {
+ medicString = "sind ~g~" + dutyMedics + " Medics";
+ }
+ medicString += " ~s~im Dienst ~c~und versuchen dich wiederzubeleben...";
+ } else {
+ medicString = "Derzeit sind ~r~keine Medics ~s~im Dienst.";
+ }
+
+ deathSeconds = respawnTime - Math.floor(currentDate.getTime() / 1000);
+ var alpha = fade + Math.floor(currentDate.getTime() / 1000 - deathDate.getTime() / 1000);
+ if (deathSeconds >= 0) {
+ mp.game.graphics.set2dLayer(2);
+ mp.game.graphics.drawSprite("Mptattoos", "clearout", 0.625, 0.52, 0.1, 0.1, 0, 255, 255, 255, 236);
+ mp.game.graphics.drawText("Respawn in: ~y~" + deathSeconds, [0.5, 0.5],
+ {
+ font: 7,
+ color: [255, 255, 255, 255],
+ scale: [0.8, 0.8],
+ outline: true,
+ centre: false
+ });
+ mp.game.graphics.drawText(medicString, [0.5, 0.975],
+ {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.4, 0.4],
+ outline: true,
+ centre: false
+ });
+ mp.game.graphics.set2dLayer(1);
+ mp.game.graphics.drawRect(0.5, 0.5, 1, 1, 0, 0, 0, alpha);
+
+ } else {
+ mp.events.call("respawnDeathPlayer");
+ }
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/interiors.js b/ReallifeGamemode.Client/Gui/interiors.js
deleted file mode 100644
index 1eedd52f..00000000
--- a/ReallifeGamemode.Client/Gui/interiors.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var keyBound = false;
-var interiorId = -1;
-var enterExit = undefined;
-
-mp.events.add('InteriorManager_ClearHelpText', () => {
- mp.game.ui.clearHelp(true);
-
- enterExit = undefined;
-
- if (keyBound) {
- mp.keys.unbind(0x45, false, keyPressHandler);
- keyBound = false;
- }
-});
-
-mp.events.add('InteriorManager_ShowHelpText', (interior, intId, entEx) => {
- mp.game.ui.setTextComponentFormat('STRING');
- mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um ~b~' + interior + ' ~s~zu ' + (entEx === 0 ? 'betreten' : 'verlassen'));
- mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1);
-
- interiorId = intId;
- enterExit = entEx;
-
- mp.keys.bind(0x45, false, keyPressHandler);
- keyBound = true;
-});
-
-function keyPressHandler() {
- if (globalData.InChat) return;
- mp.events.callRemote('InteriorManager_UseTeleport', interiorId, enterExit);
-}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/interiors.ts b/ReallifeGamemode.Client/Gui/interiors.ts
new file mode 100644
index 00000000..a282cc47
--- /dev/null
+++ b/ReallifeGamemode.Client/Gui/interiors.ts
@@ -0,0 +1,34 @@
+export default function interiors(globalData: GlobalData) {
+
+ var keyBound = false;
+ var interiorId = -1;
+ var enterExit = undefined;
+
+ mp.events.add('InteriorManager_ClearHelpText', () => {
+ mp.game.ui.clearHelp(true);
+
+ enterExit = undefined;
+
+ if (keyBound) {
+ mp.keys.unbind(0x45, false, keyPressHandler);
+ keyBound = false;
+ }
+ });
+
+ mp.events.add('InteriorManager_ShowHelpText', (interior, intId, entEx) => {
+ mp.game.ui.setTextComponentFormat('STRING');
+ mp.game.ui.addTextComponentSubstringPlayerName('Drücke ~INPUT_CONTEXT~, um ~b~' + interior + ' ~s~zu ' + (entEx === 0 ? 'betreten' : 'verlassen'));
+ mp.game.ui.displayHelpTextFromStringLabel(0, true, true, -1);
+
+ interiorId = intId;
+ enterExit = entEx;
+
+ mp.keys.bind(0x45, false, keyPressHandler);
+ keyBound = true;
+ });
+
+ function keyPressHandler() {
+ if (globalData.InChat) return;
+ mp.events.callRemote('InteriorManager_UseTeleport', interiorId, enterExit);
+ }
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/nametags.js b/ReallifeGamemode.Client/Gui/nametags.js
deleted file mode 100644
index c958a611..00000000
--- a/ReallifeGamemode.Client/Gui/nametags.js
+++ /dev/null
@@ -1,57 +0,0 @@
-const maxDistance = 25 * 25;
-const width = 0.03;
-const height = 0.0065;
-const border = 0.001;
-const color = [255, 255, 255, 255];
-
-mp.nametags.enabled = false;
-
-mp.events.add('render', (nametags) => {
- const graphics = mp.game.graphics;
- const screenRes = graphics.getScreenResolution(0, 0);
-
- nametags.forEach(nametag => {
- let [player, x, y, distance] = nametag;
-
- if (distance <= maxDistance) {
- let scale = distance / maxDistance;
- if (scale < 0.6) scale = 0.6;
-
- var health = player.getHealth();
- health = health < 100 ? 0 : (health - 100) / 100;
-
- var armour = player.getArmour() / 100;
-
- y -= scale * (0.005 * (screenRes.y / 1080));
-
- mp.game.graphics.drawText(player.name + " (" + player.remoteId + ")", [x, y],
- {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.4, 0.4],
- outline: true
- });
-
- if (mp.game.player.isFreeAimingAtEntity(player.handle)) {
- let y2 = y + 0.042;
-
- if (armour > 0) {
- graphics.drawRect(x, y2, width + border * 2, 0.0085, 0, 0, 0, 200);
- graphics.drawRect(x, y2, width, height, 150, 150, 150, 255);
- graphics.drawRect(x - width / 2 * (1 - health), y2, width * health, height, 255, 255, 255, 200);
-
- x2 = x + width / 2 + border / 2;
-
- graphics.drawRect(x, y2 + height, width + border * 2, height + border * 2, 0, 0, 0, 200);
- graphics.drawRect(x, y2 + height, width, height, 41, 66, 78, 255);
- graphics.drawRect(x - width / 2 * (1 - armour), y2 + height, width * armour, height, 48, 108, 135, 200);
- }
- else {
- graphics.drawRect(x, y2, width + border * 2, height + border * 2, 0, 0, 0, 200);
- graphics.drawRect(x, y2, width, height, 150, 150, 150, 255);
- graphics.drawRect(x - width / 2 * (1 - health), y2, width * health, height, 255, 255, 255, 200);
- }
- }
- }
- });
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/nametags.ts b/ReallifeGamemode.Client/Gui/nametags.ts
new file mode 100644
index 00000000..9d5e1865
--- /dev/null
+++ b/ReallifeGamemode.Client/Gui/nametags.ts
@@ -0,0 +1,61 @@
+const maxDistance = 25 * 25;
+const width = 0.03;
+const height = 0.0065;
+const border = 0.001;
+const color = [255, 255, 255, 255];
+
+export default function customNametags() {
+
+ mp.nametags.enabled = false;
+
+ mp.events.add('render', (nametags) => {
+ const graphics = mp.game.graphics;
+ const screenRes = graphics.getScreenResolution(0, 0);
+
+ nametags.forEach(nametag => {
+ let [player, x, y, distance] = nametag;
+
+ if (distance <= maxDistance) {
+ let scale = distance / maxDistance;
+ if (scale < 0.6) scale = 0.6;
+
+ var health = player.getHealth();
+ health = health < 100 ? 0 : (health - 100) / 100;
+
+ var armour = player.getArmour() / 100;
+
+ y -= scale * (0.005 * (screenRes.y / 1080));
+
+ mp.game.graphics.drawText(player.name + " (" + player.remoteId + ")", [x, y],
+ {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.4, 0.4],
+ outline: true,
+ centre: false
+ });
+
+ if (mp.game.player.isPlayerFreeAimingAtEntity(player.handle)) {
+ let y2 = y + 0.042;
+
+ if (armour > 0) {
+ graphics.drawRect(x, y2, width + border * 2, 0.0085, 0, 0, 0, 200);
+ graphics.drawRect(x, y2, width, height, 150, 150, 150, 255);
+ graphics.drawRect(x - width / 2 * (1 - health), y2, width * health, height, 255, 255, 255, 200);
+
+ var x2 = x + width / 2 + border / 2;
+
+ graphics.drawRect(x, y2 + height, width + border * 2, height + border * 2, 0, 0, 0, 200);
+ graphics.drawRect(x, y2 + height, width, height, 41, 66, 78, 255);
+ graphics.drawRect(x - width / 2 * (1 - armour), y2 + height, width * armour, height, 48, 108, 135, 200);
+ }
+ else {
+ graphics.drawRect(x, y2, width + border * 2, height + border * 2, 0, 0, 0, 200);
+ graphics.drawRect(x, y2, width, height, 150, 150, 150, 255);
+ graphics.drawRect(x - width / 2 * (1 - health), y2, width * health, height, 255, 255, 255, 200);
+ }
+ }
+ }
+ });
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/playerlist.js b/ReallifeGamemode.Client/Gui/playerlist.js
deleted file mode 100644
index bc24759c..00000000
--- a/ReallifeGamemode.Client/Gui/playerlist.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * @overview Life of German Reallife - Gui Playerlist playerlist.js
- * @author VegaZ
- * @copyright (c) 2008 - 2018 Life of German
- */
-
-var playerlistBrowser
-var pList;
-
-mp.events.add("showPlayerlist", () => {
- if (!playerlistBrowser) {
- playerlistBrowser = mp.browsers.new('package://Gui/playerlist.html');
- mp.gui.chat.activate(false);
- mp.gui.cursor.show(true, true);
- }
-});
-
-mp.events.add("fetchPlayerList", (playersJson) => {
-
- pList = JSON.parse(playersJson);
-
- pList.forEach((player) => {
- mp.gui.chat.push(player.Id + ", " + player.Name + ", " + player.Ping);
- });
-});
-
-
-//function getTable() {
-// var table = "";
-// pList.forEach((player) => {
-// var tableRow = "
| " + player.Id + " | " + player.Name + " | " + player.Ping + " | ";
-// table = table + tableRow;
-// })
-// return document.write(table);
-//}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/playerlist.ts b/ReallifeGamemode.Client/Gui/playerlist.ts
new file mode 100644
index 00000000..e4d00a66
--- /dev/null
+++ b/ReallifeGamemode.Client/Gui/playerlist.ts
@@ -0,0 +1,37 @@
+/**
+ * @overview Life of German Reallife - Gui Playerlist playerlist.js
+ * @author VegaZ
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
+export default function playerList() {
+
+ var playerlistBrowser
+ var pList;
+
+ mp.events.add("showPlayerlist", () => {
+ if (!playerlistBrowser) {
+ playerlistBrowser = mp.browsers.new('package://Gui/playerlist.html');
+ mp.gui.chat.activate(false);
+ mp.gui.cursor.show(true, true);
+ }
+ });
+
+ mp.events.add("fetchPlayerList", (playersJson) => {
+
+ pList = JSON.parse(playersJson);
+
+ pList.forEach((player) => {
+ mp.gui.chat.push(player.Id + ", " + player.Name + ", " + player.Ping);
+ });
+ });
+}
+
+//function getTable() {
+// var table = "";
+// pList.forEach((player) => {
+// var tableRow = "
| " + player.Id + " | " + player.Name + " | " + player.Ping + " | ";
+// table = table + tableRow;
+// })
+// return document.write(table);
+//}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/vehiclemenu/main.js b/ReallifeGamemode.Client/Gui/vehiclemenu/main.js
deleted file mode 100644
index 5d28adfb..00000000
--- a/ReallifeGamemode.Client/Gui/vehiclemenu/main.js
+++ /dev/null
@@ -1,103 +0,0 @@
-let menuBrowser = null;
-
-const NativeUI = require('../../nativeui');
-const Menu = NativeUI.Menu;
-const UIMenuItem = NativeUI.UIMenuItem;
-const UIMenuListItem = NativeUI.UIMenuListItem;
-const UIMenuCheckboxItem = NativeUI.UIMenuCheckboxItem;
-const UIMenuSliderItem = NativeUI.UIMenuSliderItem;
-const BadgeStyle = NativeUI.BadgeStyle;
-const Point = NativeUI.Point;
-const ItemsCollection = NativeUI.ItemsCollection;
-const Color = NativeUI.Color;
-const ListItem = NativeUI.ListItem;
-
-mp.events.add('ToggleVehicleMenu', () => {
- if (menuBrowser !== null) {
- menuBrowser.destroy();
- menuBrowser = null;
- mp.gui.chat.show(true);
- mp.gui.cursor.show(false, false);
- mp.game.graphics.stopScreenEffect("FocusIn");
- mp.game.graphics.startScreenEffect("FocusOut", 0, false);
- return;
- }
-
- mp.game.graphics.stopScreenEffect("FocusOut");
- mp.game.graphics.startScreenEffect("FocusIn", 0, false);
- menuBrowser = mp.browsers.new("package://assets/html/vehiclemenu/index.html");
- mp.gui.chat.show(false);
- mp.gui.cursor.show(true, true);
-});
-
-mp.events.add('doAction', (action) => {
- mp.events.call('ToggleVehicleMenu');
- switch (action) {
- case 8: // Motor
- mp.events.callRemote("VehicleMenu_ToggleEngine");
- break;
- case 5: // Auf -/ Abschließen
- mp.events.callRemote("VehicleMenu_LockCar");
- break;
- case 3: // Türen
- showDoorsMenu();
- break;
- }
-});
-
-function showDoorsMenu() {
- mp.gui.chat.show(false);
-
- var doorMenu = new Menu("Türen", "Türen verwalten", new Point(50, 50));
-
- doorMenu.AddItem(new UIMenuListItem("Tür", "Welche Tür darf's sein?", new ItemsCollection([
- " Fahrertür",
- " Beifahrertür",
- "Hinten links",
- "Hinten rechts",
- "Motorhaube",
- "Kofferraum"
- ])));
-
- doorMenu.AddItem(new UIMenuItem("Alle öffnen", "Öffnet alle Türen"));
- doorMenu.AddItem(new UIMenuItem("Alle schließen", "Schließt alle Türen"));
-
- doorMenu.ItemSelect.on((item, index) => {
- if (index === 0) {
- var doorId = -1;
- switch (item.SelectedItem.DisplayText) {
- case " Fahrertür":
- doorId = 0;
- break;
- case " Beifahrertür":
- doorId = 1;
- break;
- case "Hinten links":
- doorId = 2;
- break;
- case "Hinten rechts":
- doorId = 3;
- break;
- case "Motorhaube":
- doorId = 4;
- break;
- case "Kofferraum":
- doorId = 5;
- break;
- }
- if (doorId !== -1) {
- mp.events.callRemote("VehicleMenu_ToggleSingleDoor", doorId);
- }
- } else if (index === 1) {
- mp.events.callRemote("VehicleMenu_OpenAllDoors");
- } else if (index === 2) {
- mp.events.callRemote("VehicleMenu_CloseAllDoors");
- }
- });
-
- doorMenu.MenuClose.on(() => {
- mp.gui.chat.show(true);
- });
-
- doorMenu.Open();
-}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Gui/vehiclemenu/main.ts b/ReallifeGamemode.Client/Gui/vehiclemenu/main.ts
new file mode 100644
index 00000000..eb6283b1
--- /dev/null
+++ b/ReallifeGamemode.Client/Gui/vehiclemenu/main.ts
@@ -0,0 +1,103 @@
+import * as NativeUI from 'NativeUI';
+
+const Menu = NativeUI.Menu;
+const UIMenuItem = NativeUI.UIMenuItem;
+const UIMenuListItem = NativeUI.UIMenuListItem;
+const Point = NativeUI.Point;
+const ItemsCollection = NativeUI.ItemsCollection;
+
+export default function vehicleMenu() {
+
+
+ let menuBrowser = null;
+
+ mp.events.add('ToggleVehicleMenu', () => {
+ if (menuBrowser !== null) {
+ menuBrowser.destroy();
+ menuBrowser = null;
+ mp.gui.chat.show(true);
+ mp.gui.cursor.show(false, false);
+ mp.game.graphics.stopScreenEffect("FocusIn");
+ mp.game.graphics.startScreenEffect("FocusOut", 0, false);
+ return;
+ }
+
+ mp.game.graphics.stopScreenEffect("FocusOut");
+ mp.game.graphics.startScreenEffect("FocusIn", 0, false);
+ menuBrowser = mp.browsers.new("package://assets/html/vehiclemenu/index.html");
+ mp.gui.chat.show(false);
+ mp.gui.cursor.show(true, true);
+ });
+
+ mp.events.add('doAction', (action) => {
+ mp.events.call('ToggleVehicleMenu');
+ switch (action) {
+ case 8: // Motor
+ mp.events.callRemote("VehicleMenu_ToggleEngine");
+ break;
+ case 5: // Auf -/ Abschließen
+ mp.events.callRemote("VehicleMenu_LockCar");
+ break;
+ case 3: // Türen
+ showDoorsMenu();
+ break;
+ }
+ });
+
+ function showDoorsMenu() {
+ mp.gui.chat.show(false);
+
+ var doorMenu = new Menu("Türen", "Türen verwalten", new Point(50, 50), null, null);
+
+ doorMenu.AddItem(new UIMenuListItem("Tür", "Welche Tür darf's sein?", new ItemsCollection([
+ " Fahrertür",
+ " Beifahrertür",
+ "Hinten links",
+ "Hinten rechts",
+ "Motorhaube",
+ "Kofferraum"
+ ])));
+
+ doorMenu.AddItem(new UIMenuItem("Alle öffnen", "Öffnet alle Türen"));
+ doorMenu.AddItem(new UIMenuItem("Alle schließen", "Schließt alle Türen"));
+
+ doorMenu.ItemSelect.on((item, index) => {
+ if (index === 0) {
+ var doorId = -1;
+ switch (item.SelectedItem.DisplayText) {
+ case " Fahrertür":
+ doorId = 0;
+ break;
+ case " Beifahrertür":
+ doorId = 1;
+ break;
+ case "Hinten links":
+ doorId = 2;
+ break;
+ case "Hinten rechts":
+ doorId = 3;
+ break;
+ case "Motorhaube":
+ doorId = 4;
+ break;
+ case "Kofferraum":
+ doorId = 5;
+ break;
+ }
+ if (doorId !== -1) {
+ mp.events.callRemote("VehicleMenu_ToggleSingleDoor", doorId);
+ }
+ } else if (index === 1) {
+ mp.events.callRemote("VehicleMenu_OpenAllDoors");
+ } else if (index === 2) {
+ mp.events.callRemote("VehicleMenu_CloseAllDoors");
+ }
+ });
+
+ doorMenu.MenuClose.on(() => {
+ mp.gui.chat.show(true);
+ });
+
+ doorMenu.Open();
+ }
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Interaction/factioninteraction.js b/ReallifeGamemode.Client/Interaction/factioninteraction.js
deleted file mode 100644
index 6fa9ea04..00000000
--- a/ReallifeGamemode.Client/Interaction/factioninteraction.js
+++ /dev/null
@@ -1,259 +0,0 @@
-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;
-
-const NativeUI = require("../nativeui");
-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;
-
-var factionInteractionMenu;
-var reviveTaskMenu;
-
-mp.events.add("updateFactionBlips", (type, taskList) => {
-
-});
-
-mp.events.add("showFactionInteraction", (userFactionId, isDuty, userFactionName, isFactionLeader, reviveTaskCount, healTaskCount, fireTaskCount) => {
- mp.gui.chat.activate(false);
- globalData.Interaction = true;
-
- var rP = ((reviveTaskCount === "0") ? "~r~" : "~g~");
- var hP = ((healTaskCount === "0") ? "~r~" : "~g~");
- var fP = ((fireTaskCount === "0") ? "~r~" : "~g~");
-
- factionInteractionMenu = new Menu("Fraktionsinteraktion", userFactionName, new Point(0, screenRes.y / 2));
-
- if (isFactionLeader) {
- let leaderMenu = new UIMenuItem("Leadermen\u00fc", "Verwaltung der Fraktion");
- leaderMenu.SetRightBadge(BadgeStyle.Star);
- factionInteractionMenu.AddItem(leaderMenu);
- }
- let reviveTaskMenu;
- let healTaskMenu;
- let fireTaskMenu;
- if (isDuty)
- {
- switch (userFactionId)
- {
- case 2:
- reviveTaskMenu = new UIMenuItem("Reviveauftr\u00e4ge");
- reviveTaskMenu.SetRightLabel(rP + reviveTaskCount)
- factionInteractionMenu.AddItem(reviveTaskMenu);
-
- healTaskMenu = new UIMenuItem("Healauftr\u00e4ge");
- healTaskMenu.SetRightLabel(hP + healTaskCount)
- factionInteractionMenu.AddItem(healTaskMenu);
-
- fireTaskMenu = new UIMenuItem("Feuerauftr\u00e4ge");
- fireTaskMenu.SetRightLabel(fP + fireTaskCount)
- factionInteractionMenu.AddItem(fireTaskMenu);
- break;
- }
- }
-
- 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.Interaction = false;
- break;
- case reviveTaskMenu:
- mp.events.callRemote("loadMedicTasks", 0)
- factionInteractionMenu.Visible = false;
- mp.gui.chat.activate(true);
- globalData.Interaction = false;
- break;
- }
- });
-
- factionInteractionMenu.MenuClose.on(() => {
- mp.gui.chat.activate(true);
- globalData.Interaction = false;
- });
-});
-
-
-mp.events.add("showMedicTasks", (type, taskList) => {
- tasks = JSON.parse(taskList);
- if (sorting === 0) {
- initTasks = tasks;
- }
-
- mp.events.call("sortFactionTasks", false);
-
- mp.gui.chat.activate(false);
- globalData.Interaction = true;
- switch (type) {
- case 0:
- reviveTaskMenu = new Menu("Revives", "\u00c4lteste zu erst", new Point(0, screenRes.y / 2));
- 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");
- reviveTaskMenu.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);
- reviveTaskMenu.AddItem(backItem);
-
- reviveTaskMenu.ItemSelect.on((item, index) => {
- if (item === backItem) {
- reviveTaskMenu.Visible = false;
- 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
- });
- reviveTaskMenu.Visible = false;
- mp.gui.chat.activate(true);
- globalData.Interaction = 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;
- }
- }
- });
-
- reviveTaskMenu.MenuClose.on(() => {
- reviveTaskMenu.Visible = false;
- factionInteractionMenu.Visible = true;
- });
- 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
-
- reviveTaskMenu.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");
- }
- }
- }
- reviveTaskMenu.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();
- }
- }
-});
diff --git a/ReallifeGamemode.Client/Interaction/factioninteraction.ts b/ReallifeGamemode.Client/Interaction/factioninteraction.ts
new file mode 100644
index 00000000..387d29b1
--- /dev/null
+++ b/ReallifeGamemode.Client/Interaction/factioninteraction.ts
@@ -0,0 +1,259 @@
+import * as NativeUI from 'NativeUI';
+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: GlobalData) {
+ 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 factionInteractionMenu;
+ var reviveTaskMenu;
+
+ mp.events.add("updateFactionBlips", (type, taskList) => {
+
+ });
+
+ mp.events.add("showFactionInteraction", (userFactionId, isDuty, userFactionName, isFactionLeader, reviveTaskCount, healTaskCount, fireTaskCount) => {
+ mp.gui.chat.activate(false);
+ globalData.Interaction = true;
+
+ var rP = ((reviveTaskCount === "0") ? "~r~" : "~g~");
+ var hP = ((healTaskCount === "0") ? "~r~" : "~g~");
+ var fP = ((fireTaskCount === "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);
+ }
+ let reviveTaskMenu;
+ let healTaskMenu;
+ let fireTaskMenu;
+ if (isDuty) {
+ switch (userFactionId) {
+ case 2:
+ reviveTaskMenu = new UIMenuItem("Reviveauftr\u00e4ge");
+ reviveTaskMenu.SetRightLabel(rP + reviveTaskCount)
+ factionInteractionMenu.AddItem(reviveTaskMenu);
+
+ healTaskMenu = new UIMenuItem("Healauftr\u00e4ge");
+ healTaskMenu.SetRightLabel(hP + healTaskCount)
+ factionInteractionMenu.AddItem(healTaskMenu);
+
+ fireTaskMenu = new UIMenuItem("Feuerauftr\u00e4ge");
+ fireTaskMenu.SetRightLabel(fP + fireTaskCount)
+ factionInteractionMenu.AddItem(fireTaskMenu);
+ break;
+ }
+ }
+
+ 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.Interaction = false;
+ break;
+ case reviveTaskMenu:
+ mp.events.callRemote("loadMedicTasks", 0)
+ factionInteractionMenu.Visible = false;
+ mp.gui.chat.activate(true);
+ globalData.Interaction = false;
+ break;
+ }
+ });
+
+ factionInteractionMenu.MenuClose.on(() => {
+ mp.gui.chat.activate(true);
+ globalData.Interaction = false;
+ });
+ });
+
+
+ mp.events.add("showMedicTasks", (type, taskList) => {
+ tasks = JSON.parse(taskList);
+ if (sorting === 0) {
+ initTasks = tasks;
+ }
+
+ mp.events.call("sortFactionTasks", false);
+
+ mp.gui.chat.activate(false);
+ globalData.Interaction = true;
+ switch (type) {
+ case 0:
+ reviveTaskMenu = 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");
+ reviveTaskMenu.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);
+ reviveTaskMenu.AddItem(backItem);
+
+ reviveTaskMenu.ItemSelect.on((item, index) => {
+ if (item === backItem) {
+ reviveTaskMenu.Visible = false;
+ 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
+ });
+ reviveTaskMenu.Visible = false;
+ mp.gui.chat.activate(true);
+ globalData.Interaction = 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;
+ }
+ }
+ });
+
+ reviveTaskMenu.MenuClose.on(() => {
+ reviveTaskMenu.Visible = false;
+ factionInteractionMenu.Visible = true;
+ });
+ 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
+
+ reviveTaskMenu.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");
+ }
+ }
+ }
+ reviveTaskMenu.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();
+ }
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Interaction/playerinteraction.js b/ReallifeGamemode.Client/Interaction/playerinteraction.js
deleted file mode 100644
index a363da89..00000000
--- a/ReallifeGamemode.Client/Interaction/playerinteraction.js
+++ /dev/null
@@ -1,271 +0,0 @@
-var nearbyPlayers = [];
-let screenRes = mp.game.graphics.getScreenResolution(0, 0);
-var tradeRequest;
-var tradeRequester;
-var timerBarSize = 0.5;
-var tradeTimeLeft;
-var tradeSelection = "none";
-var tradeSelectHover = "none";
-var acceptColor = 100;
-var declineColor = 100;
-
-const { x: screenX, y: screenY } = mp.game.graphics.getScreenActiveResolution(0, 0);
-let rxC = 0.5;
-let ryC = 0.4;
-let rWidth = 0.4;
-let sX = (screenX * 0.1 / 1000);
-let sY = (screenY * 0.1 / 1000);
-let eX = sX - 0.1;
-let eY = sY - 0.1;
-let sizeMul = 0.08;
-let yMul = 1.8;
-
-var receivedTradePrize;
-var receivedTradeItems = [[]];
-var receivedTradeGrid = [];
-receivedTradeGrid[0] = [0.3375, 0.5]
-receivedTradeGrid[1] = [0.4195, 0.5]
-receivedTradeGrid[2] = [0.5015, 0.5]
-receivedTradeGrid[3] = [0.5835, 0.5]
-receivedTradeGrid[4] = [0.6655, 0.5]
-
-const NativeUI = require("../nativeui");
-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;
-
-mp.events.add("showPlayerInteraction", (nearPlayerArr) => {
- mp.gui.chat.activate(false);
- nearbyPlayers = JSON.parse(nearPlayerArr);
- globalData.Interaction = true;
- let playerInteractionMenu = new Menu("Spielerinteraktion", "", new Point(0, screenRes.y / 2));
- let playerSelect = new UIMenuListItem("Mit", "~y~W\u00e4hle den Spieler aus.", new ItemsCollection(nearbyPlayers));
- playerInteractionMenu.AddItem(playerSelect);
- playerInteractionMenu.AddItem(new UIMenuItem("Handeln", "Sende dem Spieler eine Handlungsanfrage"));
-
- let cancelItem = new UIMenuItem("Schlie\u00dfen", "Schlie\u00dft die Spielerinteraktion");
- cancelItem.BackColor = new Color(213, 0, 0);
- cancelItem.HighlightedBackColor = new Color(229, 57, 53);
- playerInteractionMenu.AddItem(cancelItem);
-
- playerInteractionMenu.Visible = true;
-
- playerInteractionMenu.ItemSelect.on((item) => {
- if (item.Text === "Handeln") {
- mp.events.callRemote("openTradeInventory", playerSelect.SelectedValue);
- playerInteractionMenu.Visible = false;
- mp.gui.chat.activate(true);
- globalData.Interaction = false;
- } else if (item.Text === "Schlie\u00dfen") {
- playerInteractionMenu.Visible = false;
- mp.gui.chat.activate(true);
- globalData.Interaction = false;
- }
- });
-
- playerInteractionMenu.MenuClose.on(() => {
- mp.gui.chat.activate(true);
- globalData.Interaction = false;
- });
-});
-
-mp.events.add("showTradeRequest", (tradeRequesterName, tradeItemsArr, tradePrizeSent) => {
- receivedTradeItems = tradeItemsArr;
- receivedTradePrize = tradePrizeSent;
- mp.gui.cursor.show(true, true);
- tradeRequester = tradeRequesterName;
- tradeRequest = true;
- tradeTime = new Date().getTime();
- tradeTimeEnd = tradeTime + 30000;
-});
-
-mp.events.add("render", () => {
- if (tradeRequest) {
- var pos = mp.gui.cursor.position;
- var actualTime = new Date().getTime();
-
- tradeTimeLeft = (tradeTimeEnd - actualTime) / 1000;
-
- mp.game.graphics.set2dLayer(1);
- mp.game.graphics.drawRect(0.5, 0.5, 0.5, 0.3, 255, 255, 255, 200);
-
- mp.game.graphics.drawText("Handelsanfrage von ~y~" + tradeRequester + " ~s~ für ~g~" + receivedTradePrize + "$", [0.5, 0.5 - 0.13], {
- font: 7,
- color: [112, 128, 144, 254],
- scale: [0.7, 0.7],
- outline: true,
- });
-
- mp.game.graphics.set2dLayer(2);
- for (var slots = 0; slots < receivedTradeGrid.length; slots++) {
- mp.game.graphics.drawRect(receivedTradeGrid[slots][0], receivedTradeGrid[slots][1], sizeMul, sizeMul * yMul, 112, 128, 144, 254);
- mp.game.graphics.drawText(tempSlot2 = slots + 1, [receivedTradeGrid[slots][0] - (sizeMul / 2) + 0.006, receivedTradeGrid[slots][1] - (sizeMul / 2 * yMul)], {
- font: 7,
- color: [69, 255, 0, 254],
- scale: [0.3, 0.3],
- outline: true,
- });
- }
-
- mp.game.graphics.set2dLayer(3);
- //SPRITES + ITEMANZAHL
- if (receivedTradeItems.length !== 0) {
- for (var currentItem = 0; currentItem < receivedTradeItems.length; currentItem++) {
- if (receivedTradeItems[currentItem][4] !== "-1") {
- mp.game.graphics.drawSprite("itemimages", receivedTradeItems[currentItem][0].toLowerCase(), receivedTradeGrid[parseInt(receivedTradeItems[currentItem][4] - 1)][0], receivedTradeGrid[parseInt(receivedTradeItems[currentItem][4] - 1)][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
- mp.game.graphics.drawText("(~y~" + receivedTradeItems[currentItem][3] + "~s~)", [receivedTradeGrid[parseInt(receivedTradeItems[currentItem][4] - 1)][0] + (sizeMul / 2) - 0.008, receivedTradeGrid[parseInt(receivedTradeItems[currentItem][4] - 1)][1] + 0.05], {
- font: 0,
- color: [255, 255, 255, 255],
- scale: [0.25, 0.25],
- outline: true,
- });
- }
- }
- }
- mp.game.graphics.set2dLayer(4);
- isMouseOverButton(pos[0], pos[1]);
- mp.game.graphics.drawRect(0.5 - 0.07, 0.5 + 0.1, 0.06, 0.04, 100, acceptColor, 100, 250);
- mp.game.graphics.drawRect(0.5 + 0.07, 0.5 + 0.1, 0.06, 0.04, declineColor, 100, 100, 250);
-
- mp.game.graphics.set2dLayer(5);
- mp.game.graphics.drawText("~g~Annehmen", [0.5 - 0.07, 0.5 + 0.08], {
- font: 4,
- color: [112, 128, 144, 254],
- scale: [0.6, 0.6],
- outline: true,
- });
- mp.game.graphics.drawText("~r~Ablehnen", [0.5 + 0.07, 0.5 + 0.08], {
- font: 4,
- color: [112, 128, 144, 254],
- scale: [0.6, 0.6],
- outline: true,
- });
-
- mp.game.graphics.set2dLayer(6);
- if (isMouseOverTradeItem(pos[0], pos[1])) {
- mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220);
-
- var hoverItemP = [receivedTradeItems[hoverItem][0], receivedTradeItems[hoverItem][1], receivedTradeItems[hoverItem][2], receivedTradeItems[hoverItem][3]];
-
- //NAME
- mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.4, 0.4],
- outline: true,
- });
-
- //BESCHREIBUNG
- mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- });
-
- //EINZELGEWICHT
- mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], {
- font: 4,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- });
- }
-
- mp.game.graphics.set2dLayer(7);
-
- timerBarSize = tradeTimeLeft / 30 * 0.5;
- if (tradeTimeLeft > 0) {
- mp.game.graphics.drawText(tradeTimeLeft.toFixed(0), [0.5, 0.5 + 0.1312], {
- font: 7,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- });
- mp.game.graphics.drawRect(0.5, 0.5 + 0.1412, timerBarSize, 0.018, 255, 0, 0, 250);
- } else {
- tradeSelection = "timeup";
- mp.events.callRemote('tradeDecision', tradeSelection, JSON.stringify(receivedTradeItems), tradeRequester);
- tradeRequest = false;
- mp.gui.cursor.show(false, false);
- }
- }
-});
-function isMouseOverButton(cX, cY) {
-
- if (tradeRequest) {
- var x = cX / screenX;
- var y = cY / screenY;
-
- if (x > 0.5 - 0.07 - 0.03 && x < 0.5 - 0.07 + 0.03 && y > 0.5 + 0.1 - 0.02 && y < 0.5 + 0.1 + 0.02) {
- acceptColor = 255;
- tradeSelectHover = "accept";
- return true;
- } else if (x > 0.5 + 0.07 - 0.03 && x < 0.5 + 0.07 + 0.03 && y > 0.5 + 0.1 - 0.02 && y < 0.5 + 0.1 + 0.02) {
- declineColor = 255;
- tradeSelectHover = "decline";
- return true;
- } else {
- acceptColor = 100;
- declineColor = 100;
- return false;
- }
- }
-}
-
-function isMouseOverTradeItem(cX, cY) {
-
- if (tradeRequest) {
-
- var x = cX / screenX;
- var y = cY / screenY;
- var a;
- var b;
- var c;
-
- for (var s = 0; s < 5; s++) {
- a = receivedTradeGrid[s][0] - x;
- b = receivedTradeGrid[s][1] - y;
- c = Math.sqrt(a * a + b * b);
-
- var invSlot = (s + 1);
-
- if (c < sizeMul / 2) {
- for (i = 0; i < receivedTradeItems.length; i++) {
- if (parseInt(receivedTradeItems[i][4]) === invSlot) {
- hoverItem = i;
- return true;
- }
- }
- }
- }
- }
-}
-
-mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, worldPosition, hitEntity) => {
-
- var cX = x / screenX;
- var cY = y / screenY;
-
- if (tradeRequest) {
- //LINKE MAUSTASTE
- //RUNTER
- if (upOrDown === "down" && leftOrRight === "left") {
- if (isMouseOverButton(x, y)) {
- if (tradeSelectHover === "accept") {
- tradeSelection = "accept";
- } else if (tradeSelectHover === "decline") {
- tradeSelection = "decline";
- }
- mp.events.callRemote('tradeDecision', tradeSelection, JSON.stringify(receivedTradeItems), tradeRequester);
- tradeRequest = false;
- mp.gui.cursor.show(false, false);
- }
- }
- }
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Interaction/playerinteraction.ts b/ReallifeGamemode.Client/Interaction/playerinteraction.ts
new file mode 100644
index 00000000..30b79120
--- /dev/null
+++ b/ReallifeGamemode.Client/Interaction/playerinteraction.ts
@@ -0,0 +1,289 @@
+import * as NativeUI from 'NativeUI';
+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;
+
+const { x: screenX, y: screenY } = mp.game.graphics.getScreenActiveResolution(0, 0);
+let rxC = 0.5;
+let ryC = 0.4;
+let rWidth = 0.4;
+let sX = (screenX * 0.1 / 1000);
+let sY = (screenY * 0.1 / 1000);
+let eX = sX - 0.1;
+let eY = sY - 0.1;
+let sizeMul = 0.08;
+let yMul = 1.8;
+
+export default function playerInteraction(globalData: GlobalData) {
+
+ var nearbyPlayers = [];
+ let screenRes = mp.game.graphics.getScreenResolution(0, 0);
+ var tradeRequest;
+ var tradeRequester;
+ var timerBarSize = 0.5;
+ var tradeTimeLeft;
+ var tradeTime;
+ var tradeTimeEnd;
+ var tradeSelection = "none";
+ var tradeSelectHover = "none";
+ var acceptColor = 100;
+ var declineColor = 100;
+
+ var hoverItem;
+
+ var tempSlot2;
+
+ var receivedTradePrize;
+ var receivedTradeItems = [[]];
+ var receivedTradeGrid = [];
+ receivedTradeGrid[0] = [0.3375, 0.5]
+ receivedTradeGrid[1] = [0.4195, 0.5]
+ receivedTradeGrid[2] = [0.5015, 0.5]
+ receivedTradeGrid[3] = [0.5835, 0.5]
+ receivedTradeGrid[4] = [0.6655, 0.5]
+
+ mp.events.add("showPlayerInteraction", (nearPlayerArr) => {
+ mp.gui.chat.activate(false);
+ nearbyPlayers = JSON.parse(nearPlayerArr);
+ globalData.Interaction = true;
+ let playerInteractionMenu = new Menu("Spielerinteraktion", "", new Point(0, screenRes.y / 2), null, null);
+ let playerSelect = new UIMenuListItem("Mit", "~y~W\u00e4hle den Spieler aus.", new ItemsCollection(nearbyPlayers));
+ playerInteractionMenu.AddItem(playerSelect);
+ playerInteractionMenu.AddItem(new UIMenuItem("Handeln", "Sende dem Spieler eine Handlungsanfrage"));
+
+ let cancelItem = new UIMenuItem("Schlie\u00dfen", "Schlie\u00dft die Spielerinteraktion");
+ cancelItem.BackColor = new Color(213, 0, 0);
+ cancelItem.HighlightedBackColor = new Color(229, 57, 53);
+ playerInteractionMenu.AddItem(cancelItem);
+
+ playerInteractionMenu.Visible = true;
+
+ playerInteractionMenu.ItemSelect.on((item) => {
+ if (item.Text === "Handeln") {
+ mp.events.callRemote("openTradeInventory", playerSelect.SelectedValue);
+ playerInteractionMenu.Visible = false;
+ mp.gui.chat.activate(true);
+ globalData.Interaction = false;
+ } else if (item.Text === "Schlie\u00dfen") {
+ playerInteractionMenu.Visible = false;
+ mp.gui.chat.activate(true);
+ globalData.Interaction = false;
+ }
+ });
+
+ playerInteractionMenu.MenuClose.on(() => {
+ mp.gui.chat.activate(true);
+ globalData.Interaction = false;
+ });
+ });
+
+ mp.events.add("showTradeRequest", (tradeRequesterName, tradeItemsArr, tradePrizeSent) => {
+ receivedTradeItems = tradeItemsArr;
+ receivedTradePrize = tradePrizeSent;
+ mp.gui.cursor.show(true, true);
+ tradeRequester = tradeRequesterName;
+ tradeRequest = true;
+ tradeTime = new Date().getTime();
+ tradeTimeEnd = tradeTime + 30000;
+ });
+
+ mp.events.add("render", () => {
+ if (tradeRequest) {
+ var pos = mp.gui.cursor.position;
+ var actualTime = new Date().getTime();
+
+ tradeTimeLeft = (tradeTimeEnd - actualTime) / 1000;
+
+ mp.game.graphics.set2dLayer(1);
+ mp.game.graphics.drawRect(0.5, 0.5, 0.5, 0.3, 255, 255, 255, 200);
+
+ mp.game.graphics.drawText("Handelsanfrage von ~y~" + tradeRequester + " ~s~ für ~g~" + receivedTradePrize + "$", [0.5, 0.5 - 0.13], {
+ font: 7,
+ color: [112, 128, 144, 254],
+ scale: [0.7, 0.7],
+ outline: true,
+ centre: false
+ });
+
+ mp.game.graphics.set2dLayer(2);
+ for (var slots = 0; slots < receivedTradeGrid.length; slots++) {
+ mp.game.graphics.drawRect(receivedTradeGrid[slots][0], receivedTradeGrid[slots][1], sizeMul, sizeMul * yMul, 112, 128, 144, 254);
+ mp.game.graphics.drawText((tempSlot2 = slots + 1).toString(), [receivedTradeGrid[slots][0] - (sizeMul / 2) + 0.006, receivedTradeGrid[slots][1] - (sizeMul / 2 * yMul)], {
+ font: 7,
+ color: [69, 255, 0, 254],
+ scale: [0.3, 0.3],
+ outline: true,
+ centre: false
+ });
+ }
+
+ mp.game.graphics.set2dLayer(3);
+ //SPRITES + ITEMANZAHL
+ if (receivedTradeItems.length !== 0) {
+ for (var currentItem = 0; currentItem < receivedTradeItems.length; currentItem++) {
+ if (receivedTradeItems[currentItem][4] !== "-1") {
+ mp.game.graphics.drawSprite("itemimages", receivedTradeItems[currentItem][0].toLowerCase(), receivedTradeGrid[receivedTradeItems[currentItem][4] - 1][0], receivedTradeGrid[receivedTradeItems[currentItem][4] - 1][1], rWidth / 8, rWidth / 5, 0, 255, 255, 255, 255);
+ mp.game.graphics.drawText("(~y~" + receivedTradeItems[currentItem][3] + "~s~)", [receivedTradeGrid[receivedTradeItems[currentItem][4] - 1][0] + (sizeMul / 2) - 0.008, receivedTradeGrid[receivedTradeItems[currentItem][4] - 1][1] + 0.05], {
+ font: 0,
+ color: [255, 255, 255, 255],
+ scale: [0.25, 0.25],
+ outline: true,
+ centre: false
+ });
+ }
+ }
+ }
+ mp.game.graphics.set2dLayer(4);
+ isMouseOverButton(pos[0], pos[1]);
+ mp.game.graphics.drawRect(0.5 - 0.07, 0.5 + 0.1, 0.06, 0.04, 100, acceptColor, 100, 250);
+ mp.game.graphics.drawRect(0.5 + 0.07, 0.5 + 0.1, 0.06, 0.04, declineColor, 100, 100, 250);
+
+ mp.game.graphics.set2dLayer(5);
+ mp.game.graphics.drawText("~g~Annehmen", [0.5 - 0.07, 0.5 + 0.08], {
+ font: 4,
+ color: [112, 128, 144, 254],
+ scale: [0.6, 0.6],
+ outline: true,
+ centre: false
+ });
+ mp.game.graphics.drawText("~r~Ablehnen", [0.5 + 0.07, 0.5 + 0.08], {
+ font: 4,
+ color: [112, 128, 144, 254],
+ scale: [0.6, 0.6],
+ outline: true,
+ centre: false
+ });
+
+ mp.game.graphics.set2dLayer(6);
+ if (isMouseOverTradeItem(pos[0], pos[1])) {
+ mp.game.graphics.drawRect(pos[0] / screenX, pos[1] / screenY + 0.055, 0.14, 0.08, 0, 0, 0, 220);
+
+ var hoverItemP = [receivedTradeItems[hoverItem][0], receivedTradeItems[hoverItem][1], receivedTradeItems[hoverItem][2], receivedTradeItems[hoverItem][3]];
+
+ //NAME
+ mp.game.graphics.drawText("~g~" + hoverItemP[0], [pos[0] / screenX, pos[1] / screenY + 0.02], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.4, 0.4],
+ outline: true,
+ centre: false
+ });
+
+ //BESCHREIBUNG
+ mp.game.graphics.drawText(hoverItemP[1], [pos[0] / screenX, pos[1] / screenY + 0.04], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+
+ //EINZELGEWICHT
+ mp.game.graphics.drawText("~y~" + hoverItemP[2] + "g~s~ * " + hoverItemP[3] + "~s~ = ~y~" + hoverItemP[2] * hoverItemP[3] + "g", [pos[0] / screenX, pos[1] / screenY + 0.06], {
+ font: 4,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+ }
+
+ mp.game.graphics.set2dLayer(7);
+
+ timerBarSize = tradeTimeLeft / 30 * 0.5;
+ if (tradeTimeLeft > 0) {
+ mp.game.graphics.drawText(tradeTimeLeft.toFixed(0), [0.5, 0.5 + 0.1312], {
+ font: 7,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+ mp.game.graphics.drawRect(0.5, 0.5 + 0.1412, timerBarSize, 0.018, 255, 0, 0, 250);
+ } else {
+ tradeSelection = "timeup";
+ mp.events.callRemote('tradeDecision', tradeSelection, JSON.stringify(receivedTradeItems), tradeRequester);
+ tradeRequest = false;
+ mp.gui.cursor.show(false, false);
+ }
+ }
+ });
+ function isMouseOverButton(cX, cY) {
+
+ if (tradeRequest) {
+ var x = cX / screenX;
+ var y = cY / screenY;
+
+ if (x > 0.5 - 0.07 - 0.03 && x < 0.5 - 0.07 + 0.03 && y > 0.5 + 0.1 - 0.02 && y < 0.5 + 0.1 + 0.02) {
+ acceptColor = 255;
+ tradeSelectHover = "accept";
+ return true;
+ } else if (x > 0.5 + 0.07 - 0.03 && x < 0.5 + 0.07 + 0.03 && y > 0.5 + 0.1 - 0.02 && y < 0.5 + 0.1 + 0.02) {
+ declineColor = 255;
+ tradeSelectHover = "decline";
+ return true;
+ } else {
+ acceptColor = 100;
+ declineColor = 100;
+ return false;
+ }
+ }
+ }
+
+ function isMouseOverTradeItem(cX, cY) {
+
+ if (tradeRequest) {
+
+ var x = cX / screenX;
+ var y = cY / screenY;
+ var a;
+ var b;
+ var c;
+
+ for (var s = 0; s < 5; s++) {
+ a = receivedTradeGrid[s][0] - x;
+ b = receivedTradeGrid[s][1] - y;
+ c = Math.sqrt(a * a + b * b);
+
+ var invSlot = (s + 1);
+
+ if (c < sizeMul / 2) {
+ for (var i = 0; i < receivedTradeItems.length; i++) {
+ if (parseInt(receivedTradeItems[i][4]) === invSlot) {
+ hoverItem = i;
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ mp.events.add('click', (x, y, upOrDown, leftOrRight, relativeX, relativeY, worldPosition, hitEntity) => {
+
+ var cX = x / screenX;
+ var cY = y / screenY;
+
+ if (tradeRequest) {
+ //LINKE MAUSTASTE
+ //RUNTER
+ if (upOrDown === "down" && leftOrRight === "left") {
+ if (isMouseOverButton(x, y)) {
+ if (tradeSelectHover === "accept") {
+ tradeSelection = "accept";
+ } else if (tradeSelectHover === "decline") {
+ tradeSelection = "decline";
+ }
+ mp.events.callRemote('tradeDecision', tradeSelection, JSON.stringify(receivedTradeItems), tradeRequester);
+ tradeRequest = false;
+ mp.gui.cursor.show(false, false);
+ }
+ }
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Interaction/worldinteraction.js b/ReallifeGamemode.Client/Interaction/worldinteraction.js
deleted file mode 100644
index 92de52f2..00000000
--- a/ReallifeGamemode.Client/Interaction/worldinteraction.js
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-mp.events.add("SERVER:ShowAtmUi", (atmId, atmBalance) => {
- mp.gui.cursor.show(true, true);
- mp.gui.chat.show(false);
- mp.game.ui.displayHud(false);
- mp.game.ui.displayRadar(false);
-
- atmBrowser = mp.browsers.new("package://assets/html/atm/index.html");
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Interaction/worldinteraction.ts b/ReallifeGamemode.Client/Interaction/worldinteraction.ts
new file mode 100644
index 00000000..af17925b
--- /dev/null
+++ b/ReallifeGamemode.Client/Interaction/worldinteraction.ts
@@ -0,0 +1,12 @@
+export default function worldInteraction() {
+ var atmBrowser: BrowserMp;
+
+ mp.events.add("SERVER:ShowAtmUi", (atmId, atmBalance) => {
+ mp.gui.cursor.show(true, true);
+ mp.gui.chat.show(false);
+ mp.game.ui.displayHud(false);
+ mp.game.ui.displayRadar(false);
+
+ atmBrowser = mp.browsers.new("package://assets/html/atm/index.html");
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Player/dutycloth.js b/ReallifeGamemode.Client/Player/dutycloth.js
deleted file mode 100644
index 062fd95a..00000000
--- a/ReallifeGamemode.Client/Player/dutycloth.js
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * @overview Life of German Reallife - Player DutyClothes dutyclothes.js
- * @author VegaZ
- * @copyright (c) 2008 - 2018 Life of German
- */
-
-const NativeUI = require("../nativeui");
-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;
-
-var hats;
-var tops;
-var legs;
-var shoes;
-
-var hat = -1;
-var top;
-var leg;
-var shoe;
-
-let screenRes = mp.game.graphics.getScreenResolution(0, 0);
-
-var dutyMenu;
-let saveItem = new UIMenuItem("Speichern", "Speichert deine Dienstkleidung");
-saveItem.BackColor = new Color(13, 71, 161);
-saveItem.HighlightedBackColor = new Color(25, 118, 210);
-
-let cancelItem = new UIMenuItem("Abbrechen", "");
-cancelItem.BackColor = new Color(213, 0, 0);
-cancelItem.HighlightedBackColor = new Color(229, 57, 53);
-
-
-//Cloth Menu
-
-mp.events.add('showDutyClothMenu', (hatsArr, topsArr, legsArr, shoesArr) => {
-
- mp.gui.chat.activate(false);
- hats = hatsArr;
- tops = topsArr;
- legs = legsArr;
- shoes = shoesArr;
-
- dutyMenu = new Menu("Dienstkleidung", "Stelle deine Dienstkleidung zusammen", new Point(0, screenRes.y/2));
-
- dutyMenu.AddItem(new UIMenuListItem("Hut", "", new ItemsCollection(hats)));
- dutyMenu.AddItem(new UIMenuListItem("Top", "", new ItemsCollection(tops)));
- dutyMenu.AddItem(new UIMenuListItem("Hose", "", new ItemsCollection(legs)));
- dutyMenu.AddItem(new UIMenuListItem("Schuhe", "", new ItemsCollection(shoes)));
- dutyMenu.AddItem(saveItem);
- dutyMenu.AddItem(cancelItem);
- dutyMenu.Visible = true;
-
- dutyMenu.ListChange.on((item, index) => {
- switch (item.Text) {
- case "Hut":
- if (item.SelectedItem.DisplayText === "Keinen") {
- hat = -1;
- mp.events.callRemote("updateDutyProp", 0, -1);
- } else {
- hat = parseInt(item.SelectedItem.DisplayText);
- mp.events.callRemote("updateDutyProp", 0, hat);
- }
- break;
- case "Top":
- top = parseInt(item.SelectedItem.DisplayText);
- mp.events.callRemote("updateDutyCloth", 11, top);
- break;
- case "Hose":
- leg = parseInt(item.SelectedItem.DisplayText);
- mp.events.callRemote("updateDutyCloth", 4, leg);
- break;
- case "Schuhe":
- shoe = parseInt(item.SelectedItem.DisplayText);
- mp.events.callRemote("updateDutyCloth", 6, shoe);
- break;
- }
- });
-
- dutyMenu.ItemSelect.on((item) => {
- if (item.Text === "Speichern") {
- var slotType = [1, 0, 0, 0];
- var slotId = [0, 11, 4, 6];
- var clothId = [hat, top, leg, shoe];
- mp.events.callRemote("saveCharacterCloth", JSON.stringify(slotType), JSON.stringify(slotId), JSON.stringify(clothId));
- dutyMenu.Visible = false;
- mp.gui.chat.activate(true);
- } else if (item.Text === "Abbrechen") {
- dutyMenu.Visible = false;
- mp.gui.chat.activate(true);
- mp.events.callRemote("defaultCharacterCloth");
- }
- });
-
-
- dutyMenu.MenuClose.on(() => {
- dutyMenu.Visible = false;
- mp.gui.chat.activate(true);
- mp.events.callRemote("defaultCharacterCloth");
- });
-});
-
-
diff --git a/ReallifeGamemode.Client/Player/dutycloth.ts b/ReallifeGamemode.Client/Player/dutycloth.ts
new file mode 100644
index 00000000..8d6ce8dd
--- /dev/null
+++ b/ReallifeGamemode.Client/Player/dutycloth.ts
@@ -0,0 +1,109 @@
+/**
+ * @overview Life of German Reallife - Player DutyClothes dutyclothes.js
+ * @author VegaZ
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
+import * as NativeUI from 'NativeUI';
+
+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;
+
+let screenRes = mp.game.graphics.getScreenResolution(0, 0);
+let saveItem = new UIMenuItem("Speichern", "Speichert deine Dienstkleidung");
+saveItem.BackColor = new Color(13, 71, 161);
+saveItem.HighlightedBackColor = new Color(25, 118, 210);
+
+let cancelItem = new UIMenuItem("Abbrechen", "");
+cancelItem.BackColor = new Color(213, 0, 0);
+cancelItem.HighlightedBackColor = new Color(229, 57, 53);
+
+export default function dutyCloth() {
+
+ var dutyMenu;
+
+ var hats;
+ var tops;
+ var legs;
+ var shoes;
+
+ var hat = -1;
+ var top;
+ var leg;
+ var shoe;
+
+ //Cloth Menu
+
+ mp.events.add('showDutyClothMenu', (hatsArr, topsArr, legsArr, shoesArr) => {
+
+ mp.gui.chat.activate(false);
+ hats = hatsArr;
+ tops = topsArr;
+ legs = legsArr;
+ shoes = shoesArr;
+
+ dutyMenu = new Menu("Dienstkleidung", "Stelle deine Dienstkleidung zusammen", new Point(0, screenRes.y / 2), null, null);
+
+ dutyMenu.AddItem(new UIMenuListItem("Hut", "", new ItemsCollection(hats)));
+ dutyMenu.AddItem(new UIMenuListItem("Top", "", new ItemsCollection(tops)));
+ dutyMenu.AddItem(new UIMenuListItem("Hose", "", new ItemsCollection(legs)));
+ dutyMenu.AddItem(new UIMenuListItem("Schuhe", "", new ItemsCollection(shoes)));
+ dutyMenu.AddItem(saveItem);
+ dutyMenu.AddItem(cancelItem);
+ dutyMenu.Visible = true;
+
+ dutyMenu.ListChange.on((item, index) => {
+ switch (item.Text) {
+ case "Hut":
+ if (item.SelectedItem.DisplayText === "Keinen") {
+ hat = -1;
+ mp.events.callRemote("updateDutyProp", 0, -1);
+ } else {
+ hat = parseInt(item.SelectedItem.DisplayText);
+ mp.events.callRemote("updateDutyProp", 0, hat);
+ }
+ break;
+ case "Top":
+ top = parseInt(item.SelectedItem.DisplayText);
+ mp.events.callRemote("updateDutyCloth", 11, top);
+ break;
+ case "Hose":
+ leg = parseInt(item.SelectedItem.DisplayText);
+ mp.events.callRemote("updateDutyCloth", 4, leg);
+ break;
+ case "Schuhe":
+ shoe = parseInt(item.SelectedItem.DisplayText);
+ mp.events.callRemote("updateDutyCloth", 6, shoe);
+ break;
+ }
+ });
+
+ dutyMenu.ItemSelect.on((item) => {
+ if (item.Text === "Speichern") {
+ var slotType = [1, 0, 0, 0];
+ var slotId = [0, 11, 4, 6];
+ var clothId = [hat, top, leg, shoe];
+ mp.events.callRemote("saveCharacterCloth", JSON.stringify(slotType), JSON.stringify(slotId), JSON.stringify(clothId));
+ dutyMenu.Visible = false;
+ mp.gui.chat.activate(true);
+ } else if (item.Text === "Abbrechen") {
+ dutyMenu.Visible = false;
+ mp.gui.chat.activate(true);
+ mp.events.callRemote("defaultCharacterCloth");
+ }
+ });
+
+
+ dutyMenu.MenuClose.on(() => {
+ dutyMenu.Visible = false;
+ mp.gui.chat.activate(true);
+ mp.events.callRemote("defaultCharacterCloth");
+ });
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Player/freecam.js b/ReallifeGamemode.Client/Player/freecam.js
deleted file mode 100644
index 84028919..00000000
--- a/ReallifeGamemode.Client/Player/freecam.js
+++ /dev/null
@@ -1,132 +0,0 @@
-const controlsIds = {
- F5: 327,
- W: 32, // 232
- S: 33, // 31, 219, 233, 268, 269
- A: 34, // 234
- D: 35, // 30, 218, 235, 266, 267
- Space: 321,
- LCtrl: 326,
-};
-
-global.fly = {
- flying: false, f: 2.0, w: 2.0, h: 2.0, point_distance: 1000,
-};
-global.gameplayCam = mp.cameras.new('gameplay');
-
-mp.game.graphics.notify('~r~Fly script loaded!');
-mp.game.graphics.notify('~r~F5~w~ - enable/disable\n~r~F5+Space~w~ - disable without warping to ground\n~r~W/A/S/D/Space/LCtrl~w~ - move');
-mp.game.graphics.notify('~r~/savecam~w~ - save Camera position.');
-
-let direction = null;
-let coords = null;
-
-function pointingAt(distance) {
- const farAway = new mp.Vector3((direction.x * distance) + (coords.x), (direction.y * distance) + (coords.y), (direction.z * distance) + (coords.z));
-
- const result = mp.raycasting.testPointToPoint(coords, farAway, [1, 16]);
- if (result === undefined) {
- return 'undefined';
- }
- return result;
-}
-
-mp.events.add('render', () => {
- const controls = mp.game.controls;
- const fly = global.fly;
- direction = global.gameplayCam.getDirection();
- coords = global.gameplayCam.getCoord();
-
- coords.x = coords.x.toFixed(2);
- coords.y = coords.y.toFixed(2);
- coords.z = coords.z.toFixed(2);
-
- direction.x = direction.x.toFixed(2);
- direction.y = direction.y.toFixed(2);
- direction.z = direction.z.toFixed(2);
-
- mp.game.graphics.drawText(`Coords: ${JSON.stringify(coords)}`, [0.5, 0.005], {
- font: 0,
- color: [255, 255, 255, 185],
- scale: [0.3, 0.3],
- outline: true
- });
- mp.game.graphics.drawText(`pointAtCoord: ${JSON.stringify(pointingAt(fly.point_distance).position)}`, [0.5, 0.025], {
- font: 0,
- color: [255, 255, 255, 185],
- scale: [0.3, 0.3],
- outline: true
- });
-
- if (controls.isControlJustPressed(0, controlsIds.F5)) {
- fly.flying = !fly.flying;
-
- const player = mp.players.local;
-
- player.setInvincible(fly.flying);
- player.freezePosition(fly.flying);
- player.setAlpha(fly.flying ? 0 : 255);
-
- if (!fly.flying && !controls.isControlPressed(0, controlsIds.Space)) {
- const position = mp.players.local.position;
- position.z = mp.game.gameplay.getGroundZFor3dCoord(position.x, position.y, position.z, 0.0, false);
- mp.players.local.setCoordsNoOffset(position.x, position.y, position.z, false, false, false);
- }
-
- mp.game.graphics.notify(fly.flying ? 'Fly: ~g~Enabled' : 'Fly: ~r~Disabled');
- } else if (fly.flying) {
- let updated = false;
- const position = mp.players.local.position;
-
- if (controls.isControlPressed(0, controlsIds.W)) {
- if (fly.f < 8.0) { fly.f *= 1.025; }
-
- position.x += direction.x * fly.f;
- position.y += direction.y * fly.f;
- position.z += direction.z * fly.f;
- updated = true;
- } else if (controls.isControlPressed(0, controlsIds.S)) {
- if (fly.f < 8.0) { fly.f *= 1.025; }
-
- position.x -= direction.x * fly.f;
- position.y -= direction.y * fly.f;
- position.z -= direction.z * fly.f;
- updated = true;
- } else {
- fly.f = 2.0;
- }
-
- if (controls.isControlPressed(0, controlsIds.A)) {
- if (fly.l < 8.0) { fly.l *= 1.025; }
-
- position.x += (-direction.y) * fly.l;
- position.y += direction.x * fly.l;
- updated = true;
- } else if (controls.isControlPressed(0, controlsIds.D)) {
- if (fly.l < 8.0) { fly.l *= 1.05; }
-
- position.x -= (-direction.y) * fly.l;
- position.y -= direction.x * fly.l;
- updated = true;
- } else {
- fly.l = 2.0;
- }
-
- if (controls.isControlPressed(0, controlsIds.Space)) {
- if (fly.h < 8.0) { fly.h *= 1.025; }
-
- position.z += fly.h;
- updated = true;
- } else if (controls.isControlPressed(0, controlsIds.LCtrl)) {
- if (fly.h < 8.0) { fly.h *= 1.05; }
-
- position.z -= fly.h;
- updated = true;
- } else {
- fly.h = 2.0;
- }
-
- if (updated) {
- mp.players.local.setCoordsNoOffset(position.x, position.y, position.z, false, false, false);
- }
- }
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Player/freecam.ts b/ReallifeGamemode.Client/Player/freecam.ts
new file mode 100644
index 00000000..be83aea3
--- /dev/null
+++ b/ReallifeGamemode.Client/Player/freecam.ts
@@ -0,0 +1,134 @@
+export default function freeCam() {
+ const controlsIds = {
+ F5: 327,
+ W: 32, // 232
+ S: 33, // 31, 219, 233, 268, 269
+ A: 34, // 234
+ D: 35, // 30, 218, 235, 266, 267
+ Space: 321,
+ LCtrl: 326
+ };
+
+ var global = {
+ gameplayCam: undefined,
+ fly: undefined
+ };
+
+ global.fly = {
+ flying: false, f: 2.0, w: 2.0, h: 2.0, point_distance: 1000, l:0
+ };
+ global.gameplayCam = mp.cameras.new('gameplay');
+
+ mp.game.graphics.notify('~r~Fly script loaded!');
+ mp.game.graphics.notify('~r~F5~w~ - enable/disable\n~r~F5+Space~w~ - disable without warping to ground\n~r~W/A/S/D/Space/LCtrl~w~ - move');
+ mp.game.graphics.notify('~r~/savecam~w~ - save Camera position.');
+
+ let direction = null;
+ let coords = null;
+
+ function pointingAt(distance) {
+ const farAway = new mp.Vector3((direction.x * distance) + (coords.x), (direction.y * distance) + (coords.y), (direction.z * distance) + (coords.z));
+
+ const result = mp.raycasting.testPointToPoint(coords, farAway, 16);
+ if (result === undefined) {
+ return 'undefined';
+ }
+ return result;
+ }
+
+ mp.events.add('render', () => {
+ const controls = mp.game.controls;
+ const fly = global.fly;
+ direction = global.gameplayCam.getDirection();
+ coords = global.gameplayCam.getCoord();
+
+ coords.x = coords.x.toFixed(2);
+ coords.y = coords.y.toFixed(2);
+ coords.z = coords.z.toFixed(2);
+
+ direction.x = direction.x.toFixed(2);
+ direction.y = direction.y.toFixed(2);
+ direction.z = direction.z.toFixed(2);
+
+ mp.game.graphics.drawText(`Coords: ${JSON.stringify(coords)}`, [0.5, 0.005], {
+ font: 0,
+ color: [255, 255, 255, 185],
+ scale: [0.3, 0.3],
+ outline: true,
+ centre: false
+ });
+
+ if (controls.isControlJustPressed(0, controlsIds.F5)) {
+ fly.flying = !fly.flying;
+
+ const player = mp.players.local;
+
+ player.setInvincible(fly.flying);
+ player.freezePosition(fly.flying);
+ player.setAlpha(fly.flying ? 0 : 255);
+
+ if (!fly.flying && !controls.isControlPressed(0, controlsIds.Space)) {
+ const position = mp.players.local.position;
+ position.z = mp.game.gameplay.getGroundZFor3dCoord(position.x, position.y, position.z, 0.0, false);
+ mp.players.local.setCoordsNoOffset(position.x, position.y, position.z, 0, 0, 0);
+ }
+
+ mp.game.graphics.notify(fly.flying ? 'Fly: ~g~Enabled' : 'Fly: ~r~Disabled');
+ } else if (fly.flying) {
+ let updated = false;
+ const position = mp.players.local.position;
+
+ if (controls.isControlPressed(0, controlsIds.W)) {
+ if (fly.f < 8.0) { fly.f *= 1.025; }
+
+ position.x += direction.x * fly.f;
+ position.y += direction.y * fly.f;
+ position.z += direction.z * fly.f;
+ updated = true;
+ } else if (controls.isControlPressed(0, controlsIds.S)) {
+ if (fly.f < 8.0) { fly.f *= 1.025; }
+
+ position.x -= direction.x * fly.f;
+ position.y -= direction.y * fly.f;
+ position.z -= direction.z * fly.f;
+ updated = true;
+ } else {
+ fly.f = 2.0;
+ }
+
+ if (controls.isControlPressed(0, controlsIds.A)) {
+ if (fly.l < 8.0) { fly.l *= 1.025; }
+
+ position.x += (-direction.y) * fly.l;
+ position.y += direction.x * fly.l;
+ updated = true;
+ } else if (controls.isControlPressed(0, controlsIds.D)) {
+ if (fly.l < 8.0) { fly.l *= 1.05; }
+
+ position.x -= -direction.y * fly.l;
+ position.y -= direction.x * fly.l;
+ updated = true;
+ } else {
+ fly.l = 2.0;
+ }
+
+ if (controls.isControlPressed(0, controlsIds.Space)) {
+ if (fly.h < 8.0) { fly.h *= 1.025; }
+
+ position.z += fly.h;
+ updated = true;
+ } else if (controls.isControlPressed(0, controlsIds.LCtrl)) {
+ if (fly.h < 8.0) { fly.h *= 1.05; }
+
+ position.z -= fly.h;
+ updated = true;
+ } else {
+ fly.h = 2.0;
+ }
+
+ if (updated) {
+ mp.players.local.setCoordsNoOffset(position.x, position.y, position.z, 0, 0, 0);
+ }
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Player/keys.js b/ReallifeGamemode.Client/Player/keys.js
deleted file mode 100644
index 24a0ab5b..00000000
--- a/ReallifeGamemode.Client/Player/keys.js
+++ /dev/null
@@ -1,138 +0,0 @@
-/**
- * @overview Life of German Reallife - Player Keys keys.js
- * @author VegaZ
- * @copyright (c) 2008 - 2018 Life of German
- */
-
-//https://docs.microsoft.com/de-de/windows/desktop/inputdev/virtual-key-codes
-
-var showInventory = false;
-var showGui = true;
-var showInv = false;
-
-const player = mp.players.local;
-
-//ENTER
-mp.keys.bind(0x0D, false, function () {
- if (globalData.InChat) {
- globalData.InChat = false;
- }
-});
-
-//LEFT ARROW (Interaktion mit anderen Spielern)
-mp.keys.bind(0x25, false, function () {
- if (!globalData.InChat && !showInv && !globalData.Interaction) {
- mp.events.callRemote("keyPress:LEFT_ARROW");
- }
-});
-
-//UP ARROW (Interaktion mit Spielwelt)
-//mp.keys.bind(0x26, false, function () {
-// if (!globalData.InChat && !showInv && !globalData.Interaction) {
-// mp.events.callRemote("keyPress:UP_ARROW");
-// }
-//});
-
-//RIGHT ARROW (Fraktionsinteraktion)
-mp.keys.bind(0x27, false, function () {
- if (!globalData.InChat && !showInv && !globalData.Interaction) {
- mp.events.callRemote("keyPress:RIGHT_ARROW");
- }
-});
-
-//DOWN ARROW (Eigeninteraktion)
-mp.keys.bind(0x28, false, function () {
- if (!globalData.InChat && !showInv && !globalData.Interaction) {
- mp.events.callRemote("keyPress:DOWN_ARROW");
- }
-});
-//F7 //Unshowalles
-mp.keys.bind(0x76, false, function () {
- if (showGui === true) {
- showGui = false;
- mp.events.call("toggleUi", false);
- } else {
- showGui = true;
- mp.events.call("toggleUi", true);
- }
-});
-
-//NUM2 //Save Blips in Edit Mode
-mp.keys.bind(0x62, false, function () {
- if (!globalData.InChat) {
- mp.events.callRemote("keyPress:NUM2");
- }
-});
-
-//NUM5 //Fraktionsinteraktion (Tasks sortieren)
-//mp.keys.bind(0x65, false, function () {
-// if (!globalData.InChat && globalData.Interaction) {
-// mp.events.call("sortFactionTasks", true);
-// }
-//});
-
-//E
-mp.keys.bind(0x45, false, function () {
- if (!globalData.InChat) {
- mp.events.callRemote("keyPress:E");
- }
-});
-
-
-//I //Inventar
-mp.keys.bind(0x49, false, function () {
- if (!globalData.InChat) {
- if (showInv === false) {
- showInv = true;
- } else {
- showInv = false;
- }
- mp.events.callRemote("keyPress:I");
- }
-});
-
-//J //Spielerliste
-mp.keys.bind(0x4A, false, function () {
- if (!globalData.InChat) {
- mp.events.callRemote("keyPress:J");
- //mp.events.call("showPlayerlist");
- }
-});
-
-//K //Dienstkleidung
-mp.keys.bind(0x4B, false, function () {
- if (!globalData.InChat) {
- mp.events.callRemote("keyPress:K");
- }
-});
-
-//L //Türen auf / zuschließen
-mp.keys.bind(0x4C, false, function () {
- if (!globalData.InChat) {
- mp.events.callRemote("keyPress:L");
- }
-});
-
-//N //Motor Starten
-mp.keys.bind(0x4E, false, function () {
- if (!globalData.InChat) {
- if (!player.vehicle) return;
- if (player.vehicle.getSpeed() > 5) return;
- mp.events.callRemote("keyPress:N");
- }
-});
-
-//T
-mp.keys.bind(0x54, false, function () {
- if (!globalData.InChat) {
- globalData.InChat = true;
- }
-});
-
-//X //Anschnallen
-mp.keys.bind(0x58, false, function () {
- if (!globalData.InChat) {
- mp.events.callRemote("keyPress:X");
- }
-});
-
diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts
new file mode 100644
index 00000000..88767d5c
--- /dev/null
+++ b/ReallifeGamemode.Client/Player/keys.ts
@@ -0,0 +1,141 @@
+/**
+ * @overview Life of German Reallife - Player Keys keys.js
+ * @author VegaZ
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
+//https://docs.microsoft.com/de-de/windows/desktop/inputdev/virtual-key-codes
+
+
+const player = mp.players.local;
+
+export default function keys(globalData: GlobalData) {
+
+ var showInventory = false;
+ var showGui = true;
+ var showInv = false;
+
+ //ENTER
+ mp.keys.bind(0x0D, false, function () {
+ if (globalData.InChat) {
+ globalData.InChat = false;
+ }
+ });
+
+ //LEFT ARROW (Interaktion mit anderen Spielern)
+ mp.keys.bind(0x25, false, function () {
+ if (!globalData.InChat && !showInv && !globalData.Interaction) {
+ mp.events.callRemote("keyPress:LEFT_ARROW");
+ }
+ });
+
+ //UP ARROW (Interaktion mit Spielwelt)
+ //mp.keys.bind(0x26, false, function () {
+ // if (!globalData.InChat && !showInv && !globalData.Interaction) {
+ // mp.events.callRemote("keyPress:UP_ARROW");
+ // }
+ //});
+
+ //RIGHT ARROW (Fraktionsinteraktion)
+ mp.keys.bind(0x27, false, function () {
+ if (!globalData.InChat && !showInv && !globalData.Interaction) {
+ mp.events.callRemote("keyPress:RIGHT_ARROW");
+ }
+ });
+
+ //DOWN ARROW (Eigeninteraktion)
+ mp.keys.bind(0x28, false, function () {
+ if (!globalData.InChat && !showInv && !globalData.Interaction) {
+ mp.events.callRemote("keyPress:DOWN_ARROW");
+ }
+ });
+ //F7 //Unshowalles
+ mp.keys.bind(0x76, false, function () {
+ if (showGui === true) {
+ showGui = false;
+ mp.events.call("toggleUi", false);
+ } else {
+ showGui = true;
+ mp.events.call("toggleUi", true);
+ }
+ });
+
+ //NUM2 //Save Blips in Edit Mode
+ mp.keys.bind(0x62, false, function () {
+ if (!globalData.InChat) {
+ mp.events.callRemote("keyPress:NUM2");
+ }
+ });
+
+ //NUM5 //Fraktionsinteraktion (Tasks sortieren)
+ //mp.keys.bind(0x65, false, function () {
+ // if (!globalData.InChat && globalData.Interaction) {
+ // mp.events.call("sortFactionTasks", true);
+ // }
+ //});
+
+ //E
+ mp.keys.bind(0x45, false, function () {
+ if (!globalData.InChat) {
+ mp.events.callRemote("keyPress:E");
+ }
+ });
+
+
+ //I //Inventar
+ mp.keys.bind(0x49, false, function () {
+ if (!globalData.InChat) {
+ if (showInv === false) {
+ showInv = true;
+ } else {
+ showInv = false;
+ }
+ mp.events.callRemote("keyPress:I");
+ }
+ });
+
+ //J //Spielerliste
+ mp.keys.bind(0x4A, false, function () {
+ if (!globalData.InChat) {
+ mp.events.callRemote("keyPress:J");
+ //mp.events.call("showPlayerlist");
+ }
+ });
+
+ //K //Dienstkleidung
+ mp.keys.bind(0x4B, false, function () {
+ if (!globalData.InChat) {
+ mp.events.callRemote("keyPress:K");
+ }
+ });
+
+ //L //Türen auf / zuschließen
+ mp.keys.bind(0x4C, false, function () {
+ if (!globalData.InChat) {
+ mp.events.callRemote("keyPress:L");
+ }
+ });
+
+ //N //Motor Starten
+ mp.keys.bind(0x4E, false, function () {
+ if (!globalData.InChat) {
+ if (!player.vehicle) return;
+ if (player.vehicle.getSpeed() > 5) return;
+ mp.events.callRemote("keyPress:N");
+ }
+ });
+
+ //T
+ mp.keys.bind(0x54, false, function () {
+ if (!globalData.InChat) {
+ globalData.InChat = true;
+ }
+ });
+
+ //X //Anschnallen
+ mp.keys.bind(0x58, false, function () {
+ if (!globalData.InChat) {
+ mp.events.callRemote("keyPress:X");
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Player/quit.js b/ReallifeGamemode.Client/Player/quit.js
deleted file mode 100644
index 032cfa8a..00000000
--- a/ReallifeGamemode.Client/Player/quit.js
+++ /dev/null
@@ -1,9 +0,0 @@
-/**
- * @overview Life of German Reallife - Player Quit quit.js
- * @author hydrant
- * @copyright (c) 2008 - 2018 Life of German
- */
-
-mp.events.add('playerQuit', (player, exitType, reason) => {
- mp.game.ui.clearHelp(true);
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Player/quit.ts b/ReallifeGamemode.Client/Player/quit.ts
new file mode 100644
index 00000000..1af05121
--- /dev/null
+++ b/ReallifeGamemode.Client/Player/quit.ts
@@ -0,0 +1,10 @@
+/**
+ * @overview Life of German Reallife - Player Quit quit.js
+ * @author hydrant
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+export default function quitHandler() {
+ mp.events.add('playerQuit', (player, exitType, reason) => {
+ mp.game.ui.clearHelp(true);
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Save/main.js b/ReallifeGamemode.Client/Save/main.js
deleted file mode 100644
index e6513ee0..00000000
--- a/ReallifeGamemode.Client/Save/main.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * @overview Life of German Reallife - Save Main main.js
- * @author VegaZ
- * @copyright (c) 2008 - 2018 Life of German
- */
-var saveBrowser;
-
-mp.events.add('saveBlip', () => {
-
- saveBrowser = mp.browsers.new('package://Save/blip/save.html');
- mp.gui.chat.activate(false);
- mp.gui.cursor.show(true, true);
-});
-
-mp.events.add('saveBlipData', (blipSprite, blipName, blipScale, blipColor, blipAlpha, blipDrawDistance, blipShortRange, blipRotation, blipDimension) => {
- if (saveBrowser) {
- saveBrowser.destroy();
- }
-
- mp.events.callRemote('OnSaveBlipData', blipSprite, blipName, blipScale, blipColor, blipAlpha,
- blipDrawDistance, blipShortRange, blipRotation, blipDimension);
- mp.gui.chat.push(blipShortRange);
- mp.gui.cursor.show(false, false);
- mp.gui.chat.activate(true);
-});
-
-mp.events.add('cancelData', () => {
- if (saveBrowser) {
- saveBrowser.destroy();
- }
- mp.gui.cursor.show(false, false);
- mp.gui.chat.activate(true);
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Save/main.ts b/ReallifeGamemode.Client/Save/main.ts
new file mode 100644
index 00000000..81bdf899
--- /dev/null
+++ b/ReallifeGamemode.Client/Save/main.ts
@@ -0,0 +1,36 @@
+/**
+ * @overview Life of German Reallife - Save Main main.js
+ * @author VegaZ
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
+export default function saveData() {
+ var saveBrowser: BrowserMp;
+
+ mp.events.add('saveBlip', () => {
+
+ saveBrowser = mp.browsers.new('package://assets/html/save/blip/index.html');
+ mp.gui.chat.activate(false);
+ mp.gui.cursor.show(true, true);
+ });
+
+ mp.events.add('saveBlipData', (blipSprite, blipName, blipScale, blipColor, blipAlpha, blipDrawDistance, blipShortRange, blipRotation, blipDimension) => {
+ if (saveBrowser) {
+ saveBrowser.destroy();
+ }
+
+ mp.events.callRemote('OnSaveBlipData', blipSprite, blipName, blipScale, blipColor, blipAlpha,
+ blipDrawDistance, blipShortRange, blipRotation, blipDimension);
+ mp.gui.chat.push(blipShortRange);
+ mp.gui.cursor.show(false, false);
+ mp.gui.chat.activate(true);
+ });
+
+ mp.events.add('cancelData', () => {
+ if (saveBrowser) {
+ saveBrowser.destroy();
+ }
+ mp.gui.cursor.show(false, false);
+ mp.gui.chat.activate(true);
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Speedometer/index.js b/ReallifeGamemode.Client/Speedometer/index.js
deleted file mode 100644
index 7c8581c4..00000000
--- a/ReallifeGamemode.Client/Speedometer/index.js
+++ /dev/null
@@ -1,85 +0,0 @@
-let player = mp.players.local;
-var dictLoaded = false;
-
-var lockStatus = false;
-
-mp.events.add('render', () =>
-{
- if (player.vehicle && player.vehicle.getPedInSeat(-1) === player.handle && !globalData.HideGui) // Check if player is in vehicle and is driver
- {
- if (!dictLoaded) {
- mp.game.graphics.requestStreamedTextureDict("vehicleimages", true);
- dictLoaded = true;
- }
-
- mp.game.graphics.drawRect(0.5, 0.995, 0.35, 0.05, 0, 0, 0, 170);
-
- var { x, y } = mp.game.graphics.getScreenActiveResolution(0, 0);
-
- var engineR = 255;
- var engineG = 255;
- var engineB = 255;
-
- if (player.vehicle.getIsEngineRunning()) {
- engineR = 104;
- engineG = 212;
- engineB = 42;
- } else {
- engineR = 188;
- engineG = 25;
- engineB = 25;
- }
-
- let speed = (player.vehicle.getSpeed() * 3.6).toFixed(0);
-
- var lockSprite = "";
- var lockR = 255;
- var lockG = 255;
- var lockB = 255;
-
- if (lockStatus) {
- lockR = 104;
- lockG = 212;
- lockB = 42;
- lockSprite = "lockclosed";
- } else {
- lockSprite = "lockopen";
- lockR = 188;
- lockG = 25;
- lockB = 25;
- }
-
- mp.game.graphics.drawSprite("vehicleimages", "engine", 0.343, 0.985, 0.015, 0.015 * (x / y), 0, engineR, engineG, engineB, 255);
-
- mp.game.graphics.drawSprite("vehicleimages", lockSprite, 0.37, 0.985, 0.015, 0.015 * (x / y), 0, lockR, lockG, lockB, 255);
-
- mp.game.graphics.drawText(speed.toString() + " KM/H", [0.41, 0.973], {
- font: 0,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- centre: false
- });
-
- var drivenDistance = player.vehicle.getVariable("drivenDistance");
- var drivenDistanceStr = "0";
- if (drivenDistance) drivenDistanceStr = parseFloat(drivenDistance).toFixed(3).toString().replace(".", ",");
- mp.game.graphics.drawText(drivenDistanceStr + " KM", [0.48, 0.973], {
- font: 0,
- color: [255, 255, 255, 255],
- scale: [0.35, 0.35],
- outline: true,
- centre: false
- });
- }
- else {
- if (dictLoaded) {
- mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("vehicleimages");
- dictLoaded = false;
- }
- }
-});
-
-mp.events.add("Vehicle_setLockStatus", (status) => {
- lockStatus = status;
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Speedometer/index.ts b/ReallifeGamemode.Client/Speedometer/index.ts
new file mode 100644
index 00000000..35f44883
--- /dev/null
+++ b/ReallifeGamemode.Client/Speedometer/index.ts
@@ -0,0 +1,87 @@
+let player = mp.players.local;
+
+export default function speedometer(globalData: GlobalData) {
+ var dictLoaded = false;
+
+ var lockStatus = false;
+
+ mp.events.add('render', () => {
+ if (player.vehicle && player.vehicle.getPedInSeat(-1) === player.handle && !globalData.HideGui) // Check if player is in vehicle and is driver
+ {
+ if (!dictLoaded) {
+ mp.game.graphics.requestStreamedTextureDict("vehicleimages", true);
+ dictLoaded = true;
+ }
+
+ mp.game.graphics.drawRect(0.5, 0.995, 0.35, 0.05, 0, 0, 0, 170);
+
+ var { x, y } = mp.game.graphics.getScreenActiveResolution(0, 0);
+
+ var engineR = 255;
+ var engineG = 255;
+ var engineB = 255;
+
+ if (player.vehicle.getIsEngineRunning()) {
+ engineR = 104;
+ engineG = 212;
+ engineB = 42;
+ } else {
+ engineR = 188;
+ engineG = 25;
+ engineB = 25;
+ }
+
+ let speed = (player.vehicle.getSpeed() * 3.6).toFixed(0);
+
+ var lockSprite = "";
+ var lockR = 255;
+ var lockG = 255;
+ var lockB = 255;
+
+ if (lockStatus) {
+ lockR = 104;
+ lockG = 212;
+ lockB = 42;
+ lockSprite = "lockclosed";
+ } else {
+ lockSprite = "lockopen";
+ lockR = 188;
+ lockG = 25;
+ lockB = 25;
+ }
+
+ mp.game.graphics.drawSprite("vehicleimages", "engine", 0.343, 0.985, 0.015, 0.015 * (x / y), 0, engineR, engineG, engineB, 255);
+
+ mp.game.graphics.drawSprite("vehicleimages", lockSprite, 0.37, 0.985, 0.015, 0.015 * (x / y), 0, lockR, lockG, lockB, 255);
+
+ mp.game.graphics.drawText(speed.toString() + " KM/H", [0.41, 0.973], {
+ font: 0,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+
+ var drivenDistance = player.vehicle.getVariable("drivenDistance");
+ var drivenDistanceStr = "0";
+ if (drivenDistance) drivenDistanceStr = parseFloat(drivenDistance).toFixed(3).toString().replace(".", ",");
+ mp.game.graphics.drawText(drivenDistanceStr + " KM", [0.48, 0.973], {
+ font: 0,
+ color: [255, 255, 255, 255],
+ scale: [0.35, 0.35],
+ outline: true,
+ centre: false
+ });
+ }
+ else {
+ if (dictLoaded) {
+ mp.game.graphics.setStreamedTextureDictAsNoLongerNeeded("vehicleimages");
+ dictLoaded = false;
+ }
+ }
+ });
+
+ mp.events.add("Vehicle_setLockStatus", (status) => {
+ lockStatus = status;
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Tuning/main.js b/ReallifeGamemode.Client/Tuning/main.js
deleted file mode 100644
index 87581a3a..00000000
--- a/ReallifeGamemode.Client/Tuning/main.js
+++ /dev/null
@@ -1,570 +0,0 @@
-/**
- * @overview Life of German Reallife - Tuning tuning.js
- * @author hydrant
- * @copyright (c) 2008 - 2018 Life of German
- */
-
-var keyBound = false;
-
-var disableInput = [75, 278, 279, 280, 281, 23, 59, 60, 71, 72, 74];
-
-var carModTypes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 22, 25, 27, 28, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 46, 48, 69];
-
-var carModSlotName = [
- { Slot: 0, Name: "Spoiler" },
- { Slot: 1, Name: "Frontstoßstange"},
- { Slot: 2, Name: "Heckstoßstange"},
- { Slot: 3, Name: "Seitenschweller"},
- { Slot: 4, Name: "Auspuff"},
- { Slot: 5, Name: "Rahmen"},
- { Slot: 6, Name: "Kühlergrill"},
- { Slot: 7, Name: "Motorhaube"},
- { Slot: 8, Name: "Kotflügel"},
- { Slot: 9, Name: "Rechter Kotflügel"},
- { Slot: 10, Name: "Dach"},
- { Slot: 11, Name: "Motor" },
- { Slot: 12, Name: "Bremsen"},
- { Slot: 13, Name: "Getriebe"},
- { Slot: 14, Name: "Hupe"},
- { Slot: 15, Name: "Federung"},
- { Slot: 18, Name: "Turbo"},
- { Slot: 22, Name: "Licht"},
- { Slot: 23, Name: "Reifen" },
- { Slot: 25, Name: "Nummernschildhalter" },
- { Slot: 27, Name: "Innenausstatung" },
- { Slot: 28, Name: "Wackelkopf" },
- { Slot: 33, Name: "Lenkrad" },
- { Slot: 34, Name: "Schalthebel" },
- { Slot: 35, Name: "Schild" },
- { Slot: 38, Name: "Hydraulik" },
- { Slot: 39, Name: "Motorabdeckung" },
- { Slot: 40, Name: "Luftfilter" },
- { Slot: 46, Name: "Fenster" },
- { Slot: 48, Name: "Design" }
-];
-
-var 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"
- }
- ]
- }
-];
-
-var doorOpeners = [
- {
- Model: 3308022675,
- Doors: [
- {
- Slot: 5,
- Door: 4
- }
- ]
- }
-];
-
-var bikeModTypes = [];
-
-const NativeUI = require("../nativeui");
-const Menu = NativeUI.Menu;
-const UIMenuItem = NativeUI.UIMenuItem;
-const BadgeStyle = NativeUI.BadgeStyle;
-const Point = NativeUI.Point;
-
-var mainMenu;
-var modMenu;
-var closeMenu = false;
-
-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.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 (typeof modMenu !== "undefined" && modMenu.Visible && unbind) {
- closeMenu = true;
- modMenu.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);
- });
- }
-});
-
-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);
-
- if (typeof mainMenu !== "undefined" && mainMenu.Visible) {
- return;
- }
-
- if (typeof modMenu !== "undefined" && modMenu.Visible) {
- return;
- }
-
- 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(50, 50));
-
- if (localVehicle.getBodyHealth() !== 1000) {
-
- var repairItem = new UIMenuItem("Fahrzeug reparieren");
- mainMenu.AddItem(repairItem);
-
- mainMenu.ItemSelect.on((selectedItem, index) => {
- if (selectedItem === repairItem) {
- mp.events.callRemote("repairVehicle");
- mainMenu.Close();
- setTimeout(() => {
- mp.events.call("showTuningMenu");
- }, 500);
- }
- });
-
- mainMenu.MenuClose.on(() => {
- globalData.InTuning = false;
- mp.events.call("hideTuningInfo", false);
- });
-
- mainMenu.Open();
-
- return;
- }
-
- carModTypes.forEach((modType) => {
- if (localVehicle.getModSlotName(modType) !== "undefined") {
- var slotName = mp.game.ui.getLabelText(localVehicle.getModSlotName(modType));
-
- if (slotName === "NULL") {
- slotName = getCustomName(localVehicle.model, modType);
- if (slotName === undefined) slotName = getSlotName(modType);
- }
-
- if (slotName === "undefined") slotName = "Slot " + modType;
-
- var menuItem = new UIMenuItem(slotName);
- var num = localVehicle.getNumMods(modType);
- if (num === undefined && modType !== 18 && modType !== 22) return;
- if (num !== 0 || modType === 18 || modType === 22) mainMenu.AddItem(menuItem);
- }
- });
-
- mainMenu.Open();
-
- mainMenu.ItemSelect.on((item) => {
- var modSlot = getSlotId(item.Text);
- if (item.Text.startsWith("Slot")) {
- restStr = item.Text.substring(5);
- modSlot = parseInt(restStr);
- }
- if (modSlot === undefined) return;
-
- if (modSlot === 38) {
- localVehicle.setDoorOpen(5, false, false);
- } else if (modSlot === 39 || modSlot === 40 || modSlot === 41) {
- localVehicle.setDoorOpen(4, false, false);
- }
-
- var door = getDoor(localVehicle.model, modSlot);
- if (door !== undefined) {
- localVehicle.setDoorOpen(door, false, false);
- }
-
- var currentMod = localVehicle.getMod(modSlot);
- var oldToggleValue;
- if (modSlot === 18) {
- oldToggleValue = localVehicle.isToggleModOn(modSlot);
- currentMod = oldToggleValue ? 0 : -1;
- }
-
- if (modSlot === 22) {
- localVehicle.setLights(2);
- var hlColor = localVehicle.getVariable("headlightColor");
- if (typeof hlColor !== "number" || isNaN(hlColor) || hlColor < 0 || hlColor === 255) {
- currentMod = -1;
- } else if (hlColor === 13) currentMod = 0;
- else currentMod = hlColor + 2;
- }
-
- var currentModItem;
-
- var modNum = localVehicle.getNumMods(modSlot);
- if (modSlot === 18) modNum = 1;
- if (modSlot === 22) modNum = 14;
-
- modMenu = new Menu(item.Text, "Änderung: " + item.Text, new Point(50, 50));
-
- for (var i = -1; i < modNum; i++) {
- var modItem;
-
- if (i === -1) {
- modItem = new UIMenuItem("Serie", "");
- } else {
- var modName = getModName(localVehicle, modSlot, i);
-
- modItem = new UIMenuItem(modName, "");
- }
-
- if (i === currentMod - (modSlot === 22 ? 1 : 0)) {
- modItem.SetRightBadge(BadgeStyle.Car);
- currentModItem = modItem;
- }
-
- modMenu.AddItem(modItem);
- }
-
- modMenu.ItemSelect.on((selectedItem, index) => {
- if (currentModItem !== undefined) {
- currentModItem.SetRightBadge(BadgeStyle.None);
- }
- if (selectedItem !== undefined) {
- selectedItem.SetRightBadge(BadgeStyle.Car);
- currentModItem = selectedItem;
- }
- mp.events.callRemote("setVehicleMod", modSlot, index);
-
- if (modSlot === 18) {
- oldToggleValue = index;
- return;
- }
-
- if (modSlot === 22) {
- currentMod = index;
- return;
- }
-
- if (index === 0) index = -1;
- currentMod = index - 1;
- });
-
- modMenu.IndexChange.on((index) => {
- if (modSlot === 18) return;
- if (modSlot === 22) {
- setHeadlightsColor(localVehicle, index);
- return;
- }
- if (index === 0) index = -1;
- localVehicle.setMod(modSlot, index - 1);
- });
-
- modMenu.MenuClose.on(() => {
- if (modSlot === 38) {
- localVehicle.setDoorShut(5, false);
- } else if (modSlot === 39 || modSlot === 40 || modSlot === 41) {
- localVehicle.setDoorShut(4, false);
- }
-
- if (door !== undefined) {
- localVehicle.setDoorShut(door, false);
- }
-
- if (closeMenu) {
- closeMenu = false;
- return;
- }
-
- mainMenu.Visible = true;
- modMenu.Visible = false;
-
- if (modSlot === 18) return;
- else if (modSlot === 22) {
- localVehicle.setLights(1);
- setHeadlightsColor(localVehicle, currentMod);
- return;
- }
- localVehicle.setMod(modSlot, currentMod);
- });
-
- mainMenu.Visible = false;
- modMenu.Visible = true;
- });
-
- mainMenu.MenuClose.on(() => {
- localVehicle.setLights(0);
- globalData.InTuning = false;
- mp.events.call("hideTuningInfo", false);
- });
-
-});
-
-mp.events.add("playerLeaveVehicle", () => {
- if (keyBound) {
- mp.events.call("hideTuningInfo", true);
- }
-});
-
-function getSlotName(slot) {
- var toReturn = "undefined";
-
- carModSlotName.forEach((name) => {
- if (name.Slot === slot) toReturn = name.Name;
- });
-
- return toReturn;
-}
-
-function getSlotId(slotName) {
- var toReturn = "undefined";
-
- carModSlotName.forEach((name) => {
- if (name.Name === slotName) toReturn = name.Slot;
- });
-
- if (toReturn === "undefined") {
-
- toReturn = getCustomId(mp.players.local.vehicle.model, slotName);
-
- if (toReturn === undefined) {
- carModTypes.forEach((modType) => {
- if (mp.game.ui.getLabelText(mp.players.local.vehicle.getModSlotName(modType)) === slotName) toReturn = getSlotId(getSlotName(modType));
- });
- }
- }
-
- return toReturn;
-}
-
-function getCustomName(model, slot) {
- var toReturn = undefined;
-
- customPartNames.forEach((cpn) => {
- if (cpn.Model === model) {
- cpn.Names.forEach((names) => {
- if (names.Slot === slot) toReturn = names.Name;
- });
- }
- });
-
- return toReturn;
-}
-
-function getCustomId(model, name) {
- var toReturn = undefined;
-
- customPartNames.forEach((cpn) => {
- if (cpn.Model === model) {
- cpn.Names.forEach((names) => {
- if (names.Name === name) toReturn = names.Slot;
- });
- }
- });
-
- return toReturn;
-}
-
-function getDoor(model, slot) {
- var toReturn = undefined;
-
- doorOpeners.forEach((cpn) => {
- if (cpn.Model === model) {
- cpn.Doors.forEach((door) => {
- if (door.Slot === slot) toReturn = door.Door;
- });
- }
- });
-
- return toReturn;
-}
-
-function getModName(vehicle, slot, mod) {
- 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;
- }
- } else if (slot === 13) {
- switch (mod) {
- case 0:
- realModName = "Straßengetriebe";
- break;
- case 1:
- realModName = "Sportgetriebe";
- break;
- case 2:
- realModName = "Renngetriebe";
- break;
- }
- } 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 = "Hell-lila Licht";
- break;
- }
- }
-
- return realModName;
-}
-
-function setHeadlightsColor(vehicle, index) {
- 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);
- }
-}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Tuning/main.ts b/ReallifeGamemode.Client/Tuning/main.ts
new file mode 100644
index 00000000..82d66fe8
--- /dev/null
+++ b/ReallifeGamemode.Client/Tuning/main.ts
@@ -0,0 +1,572 @@
+/**
+ * @overview Life of German Reallife - Tuning tuning.js
+ * @author hydrant
+ * @copyright (c) 2008 - 2018 Life of German
+ */
+
+import * as NativeUI from 'NativeUI';
+const Menu = NativeUI.Menu;
+const UIMenuItem = NativeUI.UIMenuItem;
+const BadgeStyle = NativeUI.BadgeStyle;
+const Point = NativeUI.Point;
+
+export default function tuning(globalData: GlobalData) {
+ var keyBound = false;
+
+ var disableInput = [75, 278, 279, 280, 281, 23, 59, 60, 71, 72, 74];
+
+ var carModTypes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 22, 25, 27, 28, 33, 34, 35, 38, 39, 40, 41, 42, 43, 44, 46, 48, 69];
+
+ var carModSlotName = [
+ { Slot: 0, Name: "Spoiler" },
+ { Slot: 1, Name: "Frontstoßstange" },
+ { Slot: 2, Name: "Heckstoßstange" },
+ { Slot: 3, Name: "Seitenschweller" },
+ { Slot: 4, Name: "Auspuff" },
+ { Slot: 5, Name: "Rahmen" },
+ { Slot: 6, Name: "Kühlergrill" },
+ { Slot: 7, Name: "Motorhaube" },
+ { Slot: 8, Name: "Kotflügel" },
+ { Slot: 9, Name: "Rechter Kotflügel" },
+ { Slot: 10, Name: "Dach" },
+ { Slot: 11, Name: "Motor" },
+ { Slot: 12, Name: "Bremsen" },
+ { Slot: 13, Name: "Getriebe" },
+ { Slot: 14, Name: "Hupe" },
+ { Slot: 15, Name: "Federung" },
+ { Slot: 18, Name: "Turbo" },
+ { Slot: 22, Name: "Licht" },
+ { Slot: 23, Name: "Reifen" },
+ { Slot: 25, Name: "Nummernschildhalter" },
+ { Slot: 27, Name: "Innenausstatung" },
+ { Slot: 28, Name: "Wackelkopf" },
+ { Slot: 33, Name: "Lenkrad" },
+ { Slot: 34, Name: "Schalthebel" },
+ { Slot: 35, Name: "Schild" },
+ { Slot: 38, Name: "Hydraulik" },
+ { Slot: 39, Name: "Motorabdeckung" },
+ { Slot: 40, Name: "Luftfilter" },
+ { Slot: 46, Name: "Fenster" },
+ { Slot: 48, Name: "Design" }
+ ];
+
+ var 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"
+ }
+ ]
+ }
+ ];
+
+ var doorOpeners = [
+ {
+ Model: 3308022675,
+ Doors: [
+ {
+ Slot: 5,
+ Door: 4
+ }
+ ]
+ }
+ ];
+
+ var bikeModTypes = [];
+
+ var mainMenu;
+ var modMenu;
+ var closeMenu = false;
+
+ 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.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 (typeof modMenu !== "undefined" && modMenu.Visible && unbind) {
+ closeMenu = true;
+ modMenu.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);
+ });
+ }
+ });
+
+ 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, true, false);
+
+ if (typeof mainMenu !== "undefined" && mainMenu.Visible) {
+ return;
+ }
+
+ if (typeof modMenu !== "undefined" && modMenu.Visible) {
+ return;
+ }
+
+ 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(50, 50), null, null);
+
+ if (localVehicle.getBodyHealth() !== 1000) {
+
+ var repairItem = new UIMenuItem("Fahrzeug reparieren");
+ mainMenu.AddItem(repairItem);
+
+ mainMenu.ItemSelect.on((selectedItem, index) => {
+ if (selectedItem === repairItem) {
+ mp.events.callRemote("repairVehicle");
+ mainMenu.Close();
+ setTimeout(() => {
+ mp.events.call("showTuningMenu");
+ }, 500);
+ }
+ });
+
+ mainMenu.MenuClose.on(() => {
+ globalData.InTuning = false;
+ mp.events.call("hideTuningInfo", false);
+ });
+
+ mainMenu.Open();
+
+ return;
+ }
+
+ carModTypes.forEach((modType) => {
+ if (localVehicle.getModSlotName(modType) !== "undefined") {
+ var slotName = mp.game.ui.getLabelText(localVehicle.getModSlotName(modType));
+
+ if (slotName === "NULL") {
+ slotName = getCustomName(localVehicle.model, modType);
+ if (slotName === undefined) slotName = getSlotName(modType);
+ }
+
+ if (slotName === "undefined") slotName = "Slot " + modType;
+
+ var menuItem = new UIMenuItem(slotName);
+ var num = localVehicle.getNumMods(modType);
+ if (num === undefined && modType !== 18 && modType !== 22) return;
+ if (num !== 0 || modType === 18 || modType === 22) mainMenu.AddItem(menuItem);
+ }
+ });
+
+ mainMenu.Open();
+
+ mainMenu.ItemSelect.on((item) => {
+ var modSlot: number = getSlotId(item.Text);
+ if (item.Text.startsWith("Slot")) {
+ var restStr = item.Text.substring(5);
+ modSlot = parseInt(restStr);
+ }
+ if (modSlot === undefined) return;
+
+ if (modSlot === 38) {
+ localVehicle.setDoorOpen(5, false, false);
+ } else if (modSlot === 39 || modSlot === 40 || modSlot === 41) {
+ localVehicle.setDoorOpen(4, false, false);
+ }
+
+ var door = getDoor(localVehicle.model, modSlot);
+ if (door !== undefined) {
+ localVehicle.setDoorOpen(door, false, false);
+ }
+
+ var currentMod = localVehicle.getMod(modSlot);
+ var oldToggleValue;
+ if (modSlot === 18) {
+ oldToggleValue = localVehicle.isToggleModOn(modSlot);
+ currentMod = oldToggleValue ? 0 : -1;
+ }
+
+ if (modSlot === 22) {
+ localVehicle.setLights(2);
+ var hlColor = localVehicle.getVariable("headlightColor");
+ if (typeof hlColor !== "number" || isNaN(hlColor) || hlColor < 0 || hlColor === 255) {
+ currentMod = -1;
+ } else if (hlColor === 13) currentMod = 0;
+ else currentMod = hlColor + 2;
+ }
+
+ var currentModItem;
+
+ var modNum = localVehicle.getNumMods(modSlot);
+ if (modSlot === 18) modNum = 1;
+ if (modSlot === 22) modNum = 14;
+
+ modMenu = new Menu(item.Text, "Änderung: " + item.Text, new Point(50, 50), null, null);
+
+ for (var i = -1; i < modNum; i++) {
+ var modItem;
+
+ if (i === -1) {
+ modItem = new UIMenuItem("Serie", "");
+ } else {
+ var modName = getModName(localVehicle, modSlot, i);
+
+ modItem = new UIMenuItem(modName, "");
+ }
+
+ if (i === currentMod - (modSlot === 22 ? 1 : 0)) {
+ modItem.SetRightBadge(BadgeStyle.Car);
+ currentModItem = modItem;
+ }
+
+ modMenu.AddItem(modItem);
+ }
+
+ modMenu.ItemSelect.on((selectedItem, index) => {
+ if (currentModItem !== undefined) {
+ currentModItem.SetRightBadge(BadgeStyle.None);
+ }
+ if (selectedItem !== undefined) {
+ selectedItem.SetRightBadge(BadgeStyle.Car);
+ currentModItem = selectedItem;
+ }
+ mp.events.callRemote("setVehicleMod", modSlot, index);
+
+ if (modSlot === 18) {
+ oldToggleValue = index;
+ return;
+ }
+
+ if (modSlot === 22) {
+ currentMod = index;
+ return;
+ }
+
+ if (index === 0) index = -1;
+ currentMod = index - 1;
+ });
+
+ modMenu.IndexChange.on((index) => {
+ if (modSlot === 18) return;
+ if (modSlot === 22) {
+ setHeadlightsColor(localVehicle, index);
+ return;
+ }
+ if (index === 0) index = -1;
+ localVehicle.setMod(modSlot, index - 1);
+ });
+
+ modMenu.MenuClose.on(() => {
+ if (modSlot === 38) {
+ localVehicle.setDoorShut(5, false);
+ } else if (modSlot === 39 || modSlot === 40 || modSlot === 41) {
+ localVehicle.setDoorShut(4, false);
+ }
+
+ if (door !== undefined) {
+ localVehicle.setDoorShut(door, false);
+ }
+
+ if (closeMenu) {
+ closeMenu = false;
+ return;
+ }
+
+ mainMenu.Visible = true;
+ modMenu.Visible = false;
+
+ if (modSlot === 18) return;
+ else if (modSlot === 22) {
+ localVehicle.setLights(1);
+ setHeadlightsColor(localVehicle, currentMod);
+ return;
+ }
+ localVehicle.setMod(modSlot, currentMod);
+ });
+
+ mainMenu.Visible = false;
+ modMenu.Visible = true;
+ });
+
+ mainMenu.MenuClose.on(() => {
+ localVehicle.setLights(0);
+ globalData.InTuning = false;
+ mp.events.call("hideTuningInfo", false);
+ });
+
+ });
+
+ mp.events.add("playerLeaveVehicle", () => {
+ if (keyBound) {
+ mp.events.call("hideTuningInfo", true);
+ }
+ });
+
+ function getSlotName(slot) {
+ var toReturn = "undefined";
+
+ carModSlotName.forEach((name) => {
+ if (name.Slot === slot) toReturn = name.Name;
+ });
+
+ return toReturn;
+ }
+
+ function getSlotId(slotName): number {
+ var toReturn = undefined;
+
+ carModSlotName.forEach((name) => {
+ if (name.Name === slotName) toReturn = name.Slot;
+ });
+
+ if (toReturn === "undefined") {
+
+ toReturn = getCustomId(mp.players.local.vehicle.model, slotName);
+
+ if (toReturn === undefined) {
+ carModTypes.forEach((modType) => {
+ if (mp.game.ui.getLabelText(mp.players.local.vehicle.getModSlotName(modType)) === slotName) toReturn = getSlotId(getSlotName(modType));
+ });
+ }
+ }
+
+ return toReturn;
+ }
+
+ function getCustomName(model, slot) {
+ var toReturn = undefined;
+
+ customPartNames.forEach((cpn) => {
+ if (cpn.Model === model) {
+ cpn.Names.forEach((names) => {
+ if (names.Slot === slot) toReturn = names.Name;
+ });
+ }
+ });
+
+ return toReturn;
+ }
+
+ function getCustomId(model, name) {
+ var toReturn = undefined;
+
+ customPartNames.forEach((cpn) => {
+ if (cpn.Model === model) {
+ cpn.Names.forEach((names) => {
+ if (names.Name === name) toReturn = names.Slot;
+ });
+ }
+ });
+
+ return toReturn;
+ }
+
+ function getDoor(model, slot) {
+ var toReturn = undefined;
+
+ doorOpeners.forEach((cpn) => {
+ if (cpn.Model === model) {
+ cpn.Doors.forEach((door) => {
+ if (door.Slot === slot) toReturn = door.Door;
+ });
+ }
+ });
+
+ return toReturn;
+ }
+
+ function getModName(vehicle, slot, mod) {
+ 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;
+ }
+ } else if (slot === 13) {
+ switch (mod) {
+ case 0:
+ realModName = "Straßengetriebe";
+ break;
+ case 1:
+ realModName = "Sportgetriebe";
+ break;
+ case 2:
+ realModName = "Renngetriebe";
+ break;
+ }
+ } 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 = "Hell-lila Licht";
+ break;
+ }
+ }
+
+ return realModName;
+ }
+
+ function setHeadlightsColor(vehicle, index) {
+ 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);
+ }
+ }
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Tuning/sirensilence.js b/ReallifeGamemode.Client/Tuning/sirensilence.js
deleted file mode 100644
index 3d066623..00000000
--- a/ReallifeGamemode.Client/Tuning/sirensilence.js
+++ /dev/null
@@ -1,15 +0,0 @@
-mp.keys.bind(0x42, true, _ => {
- mp.events.callRemote("keyPress:B:toggleSiren");
-});
-
-mp.events.add('toggleVehicleSiren', (vehicle, state) => {
- vehicle.setSirenSound(state);
-});
-
-mp.events.add('entityStreamIn', (entity) => {
- if (entity.isAVehicle()) {
- var state = entity.getVariable("sirenSound");
- if (state === undefined) return;
- entity.setSirenSound(state);
- }
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Tuning/sirensilence.ts b/ReallifeGamemode.Client/Tuning/sirensilence.ts
new file mode 100644
index 00000000..dcde2bb9
--- /dev/null
+++ b/ReallifeGamemode.Client/Tuning/sirensilence.ts
@@ -0,0 +1,17 @@
+export default function sirenSilence() {
+ mp.keys.bind(0x42, true, _ => {
+ mp.events.callRemote("keyPress:B:toggleSiren");
+ });
+
+ mp.events.add('toggleVehicleSiren', (vehicle, state) => {
+ vehicle.setSirenSound(state);
+ });
+
+ mp.events.add('entityStreamIn', (entity) => {
+ if (entity.isAVehicle()) {
+ var state = entity.getVariable("sirenSound");
+ if (state === undefined) return;
+ entity.setSirenSound(state);
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Tuning/sync.js b/ReallifeGamemode.Client/Tuning/sync.js
deleted file mode 100644
index bda0fead..00000000
--- a/ReallifeGamemode.Client/Tuning/sync.js
+++ /dev/null
@@ -1,13 +0,0 @@
-mp.events.add('entityStreamIn', (entity) => {
- if (entity.isAVehicle()) {
- var mod18 = entity.getVariable('mod18');
-
- if (mod18 !== undefined) {
- entity.toggleMod(18, mod18);
- }
- }
-});
-
-mp.events.add('vehicleToggleMod', (veh, slot, newval) => {
- veh.toggleMod(slot, newval);
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Tuning/sync.ts b/ReallifeGamemode.Client/Tuning/sync.ts
new file mode 100644
index 00000000..f22d3cd5
--- /dev/null
+++ b/ReallifeGamemode.Client/Tuning/sync.ts
@@ -0,0 +1,15 @@
+export default function tuningSync() {
+ mp.events.add('entityStreamIn', (entity) => {
+ if (entity.isAVehicle()) {
+ var mod18 = entity.getVariable('mod18');
+
+ if (mod18 !== undefined) {
+ entity.toggleMod(18, mod18);
+ }
+ }
+ });
+
+ mp.events.add('vehicleToggleMod', (veh, slot, newval) => {
+ veh.toggleMod(slot, newval);
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Save/blip/style.css b/ReallifeGamemode.Client/assets/css/save/blip/style.css
similarity index 100%
rename from ReallifeGamemode.Client/Save/blip/style.css
rename to ReallifeGamemode.Client/assets/css/save/blip/style.css
diff --git a/ReallifeGamemode.Client/Save/blip/save.html b/ReallifeGamemode.Client/assets/html/save/blip/index.html
similarity index 92%
rename from ReallifeGamemode.Client/Save/blip/save.html
rename to ReallifeGamemode.Client/assets/html/save/blip/index.html
index aeefe3b6..52da2d5f 100644
--- a/ReallifeGamemode.Client/Save/blip/save.html
+++ b/ReallifeGamemode.Client/assets/html/save/blip/index.html
@@ -7,7 +7,7 @@
-
+
@@ -66,7 +66,7 @@
-
-
+
+
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/Save/blip/save.js b/ReallifeGamemode.Client/assets/js/save/blip/script.js
similarity index 100%
rename from ReallifeGamemode.Client/Save/blip/save.js
rename to ReallifeGamemode.Client/assets/js/save/blip/script.js
diff --git a/ReallifeGamemode.Client/coloredhlights/index.js b/ReallifeGamemode.Client/coloredhlights/index.js
deleted file mode 100644
index 8dcd352a..00000000
--- a/ReallifeGamemode.Client/coloredhlights/index.js
+++ /dev/null
@@ -1,19 +0,0 @@
-function setHeadlightsColor(vehicle, color) {
- 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);
- }
-}
-
-mp.events.add("entityStreamIn", (entity) => {
- if (entity.type === "vehicle") setHeadlightsColor(entity, parseInt(entity.getVariable("headlightColor")));
-});
-
-mp.events.addDataHandler("headlightColor", (entity, value) => {
- if (entity.type === "vehicle") setHeadlightsColor(entity, value);
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/coloredhlights/index.ts b/ReallifeGamemode.Client/coloredhlights/index.ts
new file mode 100644
index 00000000..bfafcab5
--- /dev/null
+++ b/ReallifeGamemode.Client/coloredhlights/index.ts
@@ -0,0 +1,21 @@
+export default function coloredHeadLights() {
+ function setHeadlightsColor(vehicle, color) {
+ 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);
+ }
+ }
+
+ mp.events.add("entityStreamIn", (entity) => {
+ if (entity.type === "vehicle") setHeadlightsColor(entity, parseInt(entity.getVariable("headlightColor")));
+ });
+
+ mp.events.addDataHandler("headlightColor", (entity, value) => {
+ if (entity.type === "vehicle") setHeadlightsColor(entity, value);
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/global.d.ts b/ReallifeGamemode.Client/global.d.ts
index 89d979b1..cd747289 100644
--- a/ReallifeGamemode.Client/global.d.ts
+++ b/ReallifeGamemode.Client/global.d.ts
@@ -3,4 +3,13 @@
HideGui: boolean,
Interaction: boolean,
InChat: boolean
+}
+
+declare interface FactionRanks {
+ factionId: number,
+ ranks: FactionRank[]
+}
+
+declare interface FactionRank {
+
}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts
index 9747a3e9..478a9c6e 100644
--- a/ReallifeGamemode.Client/index.ts
+++ b/ReallifeGamemode.Client/index.ts
@@ -8,54 +8,92 @@ let globalData: GlobalData = {
InTuning: false,
HideGui: false,
Interaction: false,
- InChat: false
+ InChat: false,
};
-//ALPHABETISCH SORTIERT UND ZUSAMMENGEFÜGT
+import business from './Business/main';
+business();
-//require('./Business/main.js');
-//require('./Business/cardealer.js');
+import cardealer from './Business/cardealer';
+cardealer();
-//require('./CharCreator/index.js');
+//import charCreator from './CharCreator/main';
+//charCreator();
-//require('./coloredhlights');
+import coloredHeadLights from './coloredhlights/index';
+coloredHeadLights();
-//require('./DoorManager/doormanager.js');
+import doorManager from './DoorManager/doormanager';
+doorManager();
-//require('./FactionManagement/main.js');
+import factionManagement from './FactionManagement/main';
+factionManagement();
-//require('./Gui/deathscreen.js');
+import deathScreen from './Gui/deathscreen';
+deathScreen();
import Infobox from './Gui/infobox';
Infobox(globalData);
-//require('./Gui/nametags.js');
-//require('./Gui/playerlist.js');
-//require('./Gui/Inventory/inventory.js');
-//require('./Gui/vehiclemenu/main.js');
-//require('./Gui/interiors.js');
+import nametags from './Gui/nametags';
+nametags();
-//require('./Interaction/factioninteraction.js');
-//require('./Interaction/playerinteraction.js');
+import playerList from './Gui/playerlist';
+playerList();
+
+import inventory from './Gui/Inventory/inventory';
+inventory();
+
+import vehicleMenu from './Gui/vehiclemenu/main';
+vehicleMenu();
+
+import interiors from './Gui/interiors';
+interiors(globalData);
+
+import factionInteraction from './Interaction/factioninteraction';
+factionInteraction(globalData);
+
+import playerInteraction from './Interaction/playerinteraction';
+playerInteraction(globalData);
import Login from './Login/main';
Login();
-//require('./Player/dutycloth.js');
-//require('./Player/keys.js');
-//require('./Player/quit.js');
-//require('./Player/freecam.js');
+import dutyCloth from './Player/dutycloth';
+dutyCloth();
-//require('./Save/main.js');
+import keys from './Player/keys';
+keys(globalData);
-//require('./Speedometer/index.js');
+import quitHandler from './Player/quit';
+quitHandler();
-//require('./Tuning/main.js');
-//require('./Tuning/sync.js');
-//require('./Tuning/sirensilence.js');
+import freecam from './Player/freecam';
+freecam();
-//require('./util/waypoint.js');
+import saveManager from './Save/main';
+saveManager();
-//require('./vehiclesync/vehiclesync.js');
-//require('./vehiclesync/smoothtrottle.js');
-//require('./vehiclesync/vehicleindicators.js');
\ No newline at end of file
+import speedometer from './Speedometer';
+speedometer(globalData);
+
+import tuning from './Tuning/main';
+tuning(globalData);
+
+import tuningSync from './Tuning/sync';
+tuningSync();
+
+import sirenSilence from './Tuning/sirensilence';
+sirenSilence();
+
+import waypointUtil from './util/waypoint';
+waypointUtil();
+
+import vehicleSync from './vehiclesync/vehiclesync';
+vehicleSync();
+
+import smoothThrottle from './vehiclesync/smoothtrottle';
+smoothThrottle();
+
+import vehicleIndicators from './vehiclesync/vehicleindicators';
+vehicleIndicators();
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/inputhelper/index.js b/ReallifeGamemode.Client/inputhelper/index.ts
similarity index 89%
rename from ReallifeGamemode.Client/inputhelper/index.js
rename to ReallifeGamemode.Client/inputhelper/index.ts
index 80864c02..6e3c04aa 100644
--- a/ReallifeGamemode.Client/inputhelper/index.js
+++ b/ReallifeGamemode.Client/inputhelper/index.ts
@@ -1,5 +1,10 @@
-class InputHelper {
- constructor(title) {
+export default class InputHelper {
+ title: string;
+ value: string;
+ created: boolean;
+ browser: BrowserMp;
+
+ constructor(title: string) {
this.title = title;
this.cefTitleCall = this.cefTitleCall.bind(this);
@@ -57,7 +62,7 @@
});
}
- async getValue(callback) {
+ async getValue(callback: Function) {
var getVal = await this.valueGetter();
callback(getVal);
}
diff --git a/ReallifeGamemode.Client/moneyformat/index.js b/ReallifeGamemode.Client/moneyformat/index.ts
similarity index 54%
rename from ReallifeGamemode.Client/moneyformat/index.js
rename to ReallifeGamemode.Client/moneyformat/index.ts
index e25e0cd3..d183389a 100644
--- a/ReallifeGamemode.Client/moneyformat/index.js
+++ b/ReallifeGamemode.Client/moneyformat/index.ts
@@ -1,3 +1,3 @@
-export default function (money, digits = 0) {
+export default function (money: number, digits: number = 0) {
return money.toLocaleString("de-DE", { minimumFractionDigits: digits });
};
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/nativeui/index.js b/ReallifeGamemode.Client/nativeui/index.js
deleted file mode 100644
index e2ee1192..00000000
--- a/ReallifeGamemode.Client/nativeui/index.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e){var t={};function s(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,s),n.l=!0,n.exports}s.m=e,s.c=t,s.d=function(e,t,i){s.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:i})},s.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="",s(s.s=0)}([function(e,t,s){"use strict";var i;s.r(t),function(e){e[e.None=0]="None",e[e.BronzeMedal=1]="BronzeMedal",e[e.GoldMedal=2]="GoldMedal",e[e.SilverMedal=3]="SilverMedal",e[e.Alert=4]="Alert",e[e.Crown=5]="Crown",e[e.Ammo=6]="Ammo",e[e.Armour=7]="Armour",e[e.Barber=8]="Barber",e[e.Clothes=9]="Clothes",e[e.Franklin=10]="Franklin",e[e.Bike=11]="Bike",e[e.Car=12]="Car",e[e.Gun=13]="Gun",e[e.Heart=14]="Heart",e[e.Makeup=15]="Makeup",e[e.Mask=16]="Mask",e[e.Michael=17]="Michael",e[e.Star=18]="Star",e[e.Tatoo=19]="Tatoo",e[e.Trevor=20]="Trevor",e[e.Lock=21]="Lock",e[e.Tick=22]="Tick"}(i||(i={}));var n,h=i;!function(e){e[e.ChaletLondon=0]="ChaletLondon",e[e.HouseScript=1]="HouseScript",e[e.Monospace=2]="Monospace",e[e.CharletComprimeColonge=4]="CharletComprimeColonge",e[e.Pricedown=7]="Pricedown"}(n||(n={}));var o,r=n;class a{constructor(e,t,s,i=255){this.R=e,this.G=t,this.B=s,this.A=i}}a.Empty=new a(0,0,0,0),a.Transparent=new a(0,0,0,0),a.Black=new a(0,0,0,255),a.White=new a(255,255,255,255),a.WhiteSmoke=new a(245,245,245,255);class l{constructor(e,t,s,i,n=0,h=new a(255,255,255)){this.TextureDict=e,this.TextureName=t,this.pos=s,this.size=i,this.heading=n,this.color=h,this.visible=!0}LoadTextureDictionary(){mp.game.graphics.requestStreamedTextureDict(this._textureDict,!0)}set TextureDict(e){this._textureDict=e,this.IsTextureDictionaryLoaded||this.LoadTextureDictionary()}get TextureDict(){return this._textureDict}get IsTextureDictionaryLoaded(){return mp.game.graphics.hasStreamedTextureDictLoaded(this._textureDict)}Draw(e,t,s,i,n,h,o){e=e||this.TextureDict,t=t||this.TextureName,s=s||this.pos,i=i||this.size,n=n||this.heading,h=h||this.color,(o=o||!0)&&(mp.game.graphics.hasStreamedTextureDictLoaded(e)||mp.game.graphics.requestStreamedTextureDict(e,!0));const r=1080*(mp.game.resolution.width/mp.game.resolution.height),a=this.size.Width/r,l=this.size.Height/1080,c=this.pos.X/r+.5*a,u=this.pos.Y/1080+.5*l;mp.game.graphics.drawSprite(e,t,c,u,a,l,n,h.R,h.G,h.B,h.A)}}class c{constructor(){this.handlers=[]}on(e){this.handlers.push(e)}off(e){this.handlers=this.handlers.filter(t=>t!==e)}emit(...e){this.handlers.slice(0).forEach(t=>t(...e))}expose(){return this}}class u{constructor(e,t){this.X=0,this.Y=0,this.X=e,this.Y=t}}class m{constructor(e=0,t=0){this.Width=e,this.Height=t}}class d{constructor(){this.enabled=!0}}class g extends d{constructor(e,t,s){super(),this.enabled=!0,this.pos=e,this.size=t,this.color=s}Draw(e,t,s){e||(e=new m(0,0)),t||s||(e=new u(this.pos.X+e.Width,this.pos.Y+e.Height),t=this.size,s=this.color);const i=t.Width/1280,n=t.Height/720,h=e.X/1280+.5*i,o=e.Y/720+.5*n;mp.game.graphics.drawRect(h,o,i,n,s.R,s.G,s.B,s.A)}}class f extends g{constructor(e,t,s){super(e,t,s)}Draw(e,t,s){e||(e=new m),!e||t||s||(e=new u(this.pos.X+e.Width,this.pos.Y+e.Height),t=this.size,s=this.color);const i=1080*(mp.game.resolution.width/mp.game.resolution.height),n=t.Width/i,h=t.Height/1080,o=e.X/i+.5*n,r=e.Y/1080+.5*h;mp.game.graphics.drawRect(o,r,n,h,s.R,s.G,s.B,s.A)}}class _ extends d{constructor(e,t,s,i,n,h){super(),this.caption=e,this.pos=t,this.scale=s,this.color=i||new a(255,255,255,255),this.font=n||0,this.centered=h||!1}Draw(e,t,s,i,n,h){!e||t||s||i||n||h||(t=new u(this.pos.X+e.Width,this.pos.Y+e.Height),s=this.scale,i=this.color,n=this.font,h=this.centered);const o=t.X/1280,r=t.Y/720;mp.game.ui.setTextFont(parseInt(n)),mp.game.ui.setTextScale(s,s),mp.game.ui.setTextColour(i.R,i.G,i.B,i.A),mp.game.ui.setTextCentre(h),mp.game.ui.setTextEntry("STRING"),mp.game.ui.addTextComponentSubstringPlayerName(e),mp.game.ui.drawText(o,r)}}exports=_,function(e){e[e.Left=0]="Left",e[e.Centered=1]="Centered",e[e.Right=2]="Right"}(o||(o={}));class p extends _{constructor(e,t,s,i,n,h){super(e,t,s,i||new a(255,255,255),n||0,!1),this.TextAlignment=o.Left,h&&(this.TextAlignment=h)}Draw(e,t,s,i,n,h,r,a,l){let c=e,d=h,g=h;e||(e=new m(0,0)),e&&!t&&(g=this.TextAlignment,c=this.caption,t=new u(this.pos.X+e.Width,this.pos.Y+e.Height),s=this.scale,i=this.color,n=this.font,1==d||0==d?d=this.centered:(d=void 0,r=this.DropShadow,a=this.Outline,l=this.WordWrap));const f=1080*(mp.game.resolution.width/mp.game.resolution.height),_=this.pos.X/f,p=this.pos.Y/1080;if(mp.game.ui.setTextFont(parseInt(n)),mp.game.ui.setTextScale(1,s),mp.game.ui.setTextColour(i.R,i.G,i.B,i.A),void 0!==d)mp.game.ui.setTextCentre(d);else{switch(r&&mp.game.ui.setTextDropshadow(2,0,0,0,0),a&&console.warn("not working!"),g){case o.Centered:mp.game.ui.setTextCentre(!0);break;case o.Right:mp.game.ui.setTextRightJustify(!0),mp.game.ui.setTextWrap(0,_)}if(l){const e=(this.pos.X+l.Width)/f;mp.game.ui.setTextWrap(_,e)}}mp.game.ui.setTextEntry("STRING"),mp.game.ui.addTextComponentSubstringPlayerName(c),mp.game.ui.drawText(_,p)}static AddLongString(e){for(var t=0;t":9,"?":10,"@":15,A:12,B:13,C:14,D:14,E:12,F:12,G:15,H:14,I:5,J:11,K:13,L:11,M:16,N:14,O:16,P:12,Q:15,R:13,S:12,T:11,U:13,V:12,W:18,X:11,Y:11,Z:12,"[":6,"\\":7,"]":6,"^":9,_:18,"`":8,a:11,b:12,c:11,d:12,e:12,f:5,g:13,h:11,i:4,j:4,k:10,l:4,m:18,n:11,o:12,p:12,q:12,r:7,s:9,t:5,u:11,v:10,w:14,x:9,y:10,z:9,"{":6,"|":3,"}":6};class M extends I{constructor(e,t="",s=new S([]),i=0){super(e,t),this.currOffset=0,this.collection=[],this.ScrollingEnabled=!0,this.HoldTimeBeforeScroll=200,this.OnListChanged=new c,this._index=0;this.Collection=s.getListItems(),this.Index=i,this._arrowLeft=new l("commonmenu","arrowleft",new u(110,105),new m(30,30)),this._arrowRight=new l("commonmenu","arrowright",new u(280,105),new m(30,30)),this._itemText=new p("",new u(290,104),.35,a.White,r.ChaletLondon,o.Right)}get Collection(){return this.collection}set Collection(e){if(!e)throw new Error("The collection can't be null");this.collection=e}get SelectedItem(){return this.Collection.length>0?this.Collection[this.Index]:null}get SelectedValue(){return null==this.SelectedItem?null:null==this.SelectedItem.Data?this.SelectedItem.DisplayText:this.SelectedItem.Data}get ListChanged(){return this.OnListChanged.expose()}get Index(){return null==this.Collection?-1:null!=this.Collection&&0==this.Collection.length?-1:this._index%this.Collection.length}set Index(e){if(null==this.Collection)return;if(null!=this.Collection&&0==this.Collection.length)return;this._index=1e5-1e5%this.Collection.length+e;const t=this.Collection.length>=this.Index?this.Collection[this.Index].DisplayText:" ";this.currOffset=C.MeasureString(t)}SetVerticalPosition(e){this._arrowLeft.pos=new u(300+this.Offset.X+this.Parent.WidthOffset,147+e+this.Offset.Y),this._arrowRight.pos=new u(400+this.Offset.X+this.Parent.WidthOffset,147+e+this.Offset.Y),this._itemText.pos=new u(300+this.Offset.X+this.Parent.WidthOffset,e+147+this.Offset.Y),super.SetVerticalPosition(e)}SetRightLabel(e){return this}SetRightBadge(e){return this}Draw(){super.Draw();const e=this.Collection.length>=this.Index?this.Collection[this.Index].DisplayText:" ",t=this.currOffset;this._itemText.color=this.Enabled?this.Selected?this.HighlightedForeColor:this.ForeColor:new a(163,159,148),this._itemText.caption=e,this._arrowLeft.color=this.Enabled?this.Selected?this.HighlightedForeColor:this.ForeColor:new a(163,159,148),this._arrowRight.color=this.Enabled?this.Selected?this.HighlightedForeColor:this.ForeColor:new a(163,159,148),this._arrowLeft.pos=new u(375-t+this.Offset.X+this.Parent.WidthOffset,this._arrowLeft.pos.Y),this.Selected?(this._arrowLeft.Draw(),this._arrowRight.Draw(),this._itemText.pos=new u(405+this.Offset.X+this.Parent.WidthOffset,this._itemText.pos.Y)):this._itemText.pos=new u(420+this.Offset.X+this.Parent.WidthOffset,this._itemText.pos.Y),this._itemText.Draw()}}class O extends I{get Index(){return this._index%this._items.length}set Index(e){this._index=1e8-1e8%this._items.length+e}constructor(e,t,s,i="",n=!1){super(e,i);this._items=t,this._arrowLeft=new l("commonmenutu","arrowleft",new u(0,105),new m(15,15)),this._arrowRight=new l("commonmenutu","arrowright",new u(0,105),new m(15,15)),this._rectangleBackground=new f(new u(0,0),new m(150,9),new a(4,32,57,255)),this._rectangleSlider=new f(new u(0,0),new m(75,9),new a(57,116,200,255)),this._rectangleDivider=new f(new u(0,0),new m(2.5,20),n?a.WhiteSmoke:a.Transparent),this.Index=s}SetVerticalPosition(e){this._rectangleBackground.pos=new u(250+this.Offset.X+this.Parent.WidthOffset,e+158.5+this.Offset.Y),this._rectangleSlider.pos=new u(250+this.Offset.X+this.Parent.WidthOffset,e+158.5+this.Offset.Y),this._rectangleDivider.pos=new u(323.5+this.Offset.X+this.Parent.WidthOffset,e+153+this.Offset.Y),this._arrowLeft.pos=new u(235+this.Offset.X+this.Parent.WidthOffset,155.5+e+this.Offset.Y),this._arrowRight.pos=new u(400+this.Offset.X+this.Parent.WidthOffset,155.5+e+this.Offset.Y),super.SetVerticalPosition(e)}IndexToItem(e){return this._items[e]}Draw(){super.Draw(),this._arrowLeft.color=this.Enabled?this.Selected?a.Black:a.WhiteSmoke:new a(163,159,148),this._arrowRight.color=this.Enabled?this.Selected?a.Black:a.WhiteSmoke:new a(163,159,148);let e=(this._rectangleBackground.size.Width-this._rectangleSlider.size.Width)/(this._items.length-1)*this.Index;this._rectangleSlider.pos=new u(250+this.Offset.X+e+ +this.Parent.WidthOffset,this._rectangleSlider.pos.Y),this.Selected&&(this._arrowLeft.Draw(),this._arrowRight.Draw()),this._rectangleBackground.Draw(),this._rectangleSlider.Draw(),this._rectangleDivider.Draw()}SetRightBadge(e){}SetRightLabel(e){}}class D extends g{constructor(e,t,s){super(e,t,s),this.Items=[]}addItem(e){this.Items.push(e)}Draw(e){if(!this.enabled)return;e=e||new m;const t=1080*(mp.game.resolution.width/mp.game.resolution.height),s=this.size.Width/t,i=this.size.Height/1080,n=(this.pos.X+e.Width)/t+.5*s,h=(this.pos.Y+e.Height)/1080+.5*i;for(var o of(mp.game.graphics.drawRect(n,h,s,i,this.color.R,this.color.G,this.color.B,this.color.A),this.Items))o.Draw(new m(this.pos.X+e.Width,this.pos.Y+e.Height))}}class R{static PlaySound(e,t){mp.game.audio.playSound(-1,e,t,!1,0,!0)}}s.d(t,"default",function(){return T});const b=mp.game.graphics.getScreenActiveResolution(0,0);mp.game.resolution={},mp.game.resolution.width=b.x,mp.game.resolution.height=b.y;class T{constructor(e,t,s,i,n){this.counterPretext="",this.counterOverride=void 0,this.lastUpDownNavigation=0,this.lastLeftRightNavigation=0,this._activeItem=1e3,this.extraOffset=0,this.WidthOffset=0,this.Visible=!0,this.MouseControlsEnabled=!1,this._justOpened=!0,this.safezoneOffset=new u(0,0),this.MaxItemsOnScreen=9,this._maxItem=this.MaxItemsOnScreen,this.AUDIO_LIBRARY="HUD_FRONTEND_DEFAULT_SOUNDSET",this.AUDIO_UPDOWN="NAV_UP_DOWN",this.AUDIO_LEFTRIGHT="NAV_LEFT_RIGHT",this.AUDIO_SELECT="SELECT",this.AUDIO_BACK="BACK",this.AUDIO_ERROR="ERROR",this.MenuItems=[],this.onIndexChange=new c,this.onListChange=new c,this.onSliderChange=new c,this.onSliderSelect=new c,this.onCheckboxChange=new c,this.onItemSelect=new c,this.onMenuClose=new c,this.onMenuChange=new c,this.MouseEdgeEnabled=!0,this.title=e,this.subtitle=t,this.spriteLibrary=i||"commonmenu",this.spriteName=n||"interaction_bgd",this.offset=new u(s.X,s.Y),this.Children=new Map,this._mainMenu=new D(new u(0,0),new m(700,500),new a(0,0,0,0)),this._logo=new l(this.spriteLibrary,this.spriteName,new u(0+this.offset.X,0+this.offset.Y),new m(431,107)),this._mainMenu.addItem(this._title=new p(this.title,new u(215+this.offset.X,20+this.offset.Y),1.15,new a(255,255,255),1,o.Centered)),""!==this.subtitle&&(this._mainMenu.addItem(new f(new u(0+this.offset.X,107+this.offset.Y),new m(431,37),new a(0,0,0,255))),this._mainMenu.addItem(this._subtitle=new p(this.subtitle,new u(8+this.offset.X,110+this.offset.Y),.35,new a(255,255,255),0,o.Left)),this.subtitle.startsWith("~")&&(this.counterPretext=this.subtitle.substr(0,3)),this._counterText=new p("",new u(425+this.offset.X,110+this.offset.Y),.35,new a(255,255,255),0,o.Right),this.extraOffset+=37),this._upAndDownSprite=new l("commonmenu","shop_arrows_upanddown",new u(190+this.offset.X,147+37*(this.MaxItemsOnScreen+1)+this.offset.Y-37+this.extraOffset),new m(50,50)),this._extraRectangleUp=new f(new u(0+this.offset.X,144+38*(this.MaxItemsOnScreen+1)+this.offset.Y-37+this.extraOffset),new m(431,18),new a(0,0,0,200)),this._extraRectangleDown=new f(new u(0+this.offset.X,162+38*(this.MaxItemsOnScreen+1)+this.offset.Y-37+this.extraOffset),new m(431,18),new a(0,0,0,200)),this._descriptionBar=new f(new u(this.offset.X,123),new m(431,4),a.Black),this._descriptionRectangle=new l("commonmenu","gradient_bgd",new u(this.offset.X,127),new m(431,30)),this._descriptionText=new p("Description",new u(this.offset.X+5,125),.35,new a(255,255,255,255),r.ChaletLondon,o.Left),this._background=new l("commonmenu","gradient_bgd",new u(this.offset.X,144+this.offset.Y-37+this.extraOffset),new m(290,25)),mp.events.add("render",this.render.bind(this)),console.log(`Created Native UI! ${this.title}`)}get CurrentSelection(){return this._activeItem%this.MenuItems.length}set CurrentSelection(e){this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!1,this._activeItem=1e3-1e3%this.MenuItems.length+e,this.CurrentSelection>this._maxItem?(this._maxItem=this.CurrentSelection,this._minItem=this.CurrentSelection-this.MaxItemsOnScreen):this.CurrentSelectionthis.MaxItemsOnScreen+1&&(e=this.MaxItemsOnScreen+2),this._descriptionBar.pos=new u(this.offset.X,38*e+this._descriptionBar.pos.Y),this._descriptionRectangle.pos=new u(this.offset.X,38*e+this._descriptionRectangle.pos.Y),this._descriptionText.pos=new u(this.offset.X+8,38*e+this._descriptionText.pos.Y)}SetMenuWidthOffset(e){if(this.WidthOffset=e,null!=this._logo&&(this._logo.size=new m(431+this.WidthOffset,107)),this._mainMenu.Items[0].pos=new u((this.WidthOffset+this.offset.X+431)/2,20+this.offset.Y),this._counterText&&(this._counterText.pos=new u(425+this.offset.X+e,110+this.offset.Y)),this._mainMenu.Items.length>=2){this._mainMenu.Items[1].size=new m(431+this.WidthOffset,37)}}AddItem(e){this._justOpened&&(this._justOpened=!1),e.Offset=this.offset,e.Parent=this,e.SetVerticalPosition(25*this.MenuItems.length-37+this.extraOffset),this.MenuItems.push(e),e.Description=this.FormatDescription(e.Description),this.RefreshIndex(),this.RecalculateDescriptionPosition()}RefreshIndex(){if(0==this.MenuItems.length)return this._activeItem=1e3,this._maxItem=this.MaxItemsOnScreen,void(this._minItem=0);for(let e=0;e=e.X&&s<=e.X+t.Width&&i>e.Y&&ie.Hovered).forEach(e=>e.Hovered=!1);mp.gui.cursor.visible||(mp.gui.cursor.visible=!0);let e=this.MenuItems.length-1,t=0;this.MenuItems.length>this.MaxItemsOnScreen+1&&(e=this._maxItem),this.IsMouseInBounds(new u(0,0),new m(30,1080))&&this.MouseEdgeEnabled?(mp.game.cam.setGameplayCamRelativeHeading(mp.game.cam.getGameplayCamRelativeHeading()+5),mp.game.ui.setCursorSprite(6)):this.IsMouseInBounds(new u(this.GetScreenResolutionMantainRatio().Width-30,0),new m(30,1080))&&this.MouseEdgeEnabled?(mp.game.cam.setGameplayCamRelativeHeading(mp.game.cam.getGameplayCamRelativeHeading()-5),mp.game.ui.setCursorSprite(7)):this.MouseEdgeEnabled&&mp.game.ui.setCursorSprite(1);for(let i=this._minItem;i<=e;i++){let e=this.offset.X,n=this.offset.Y+144-37+this.extraOffset+38*t,h=431+this.WidthOffset;const o=38,r=this.MenuItems[i];if(this.IsMouseInBounds(new u(e,n),new m(h,o))){if(r.Hovered=!0,mp.game.controls.isControlJustPressed(0,24)||mp.game.controls.isDisabledControlJustPressed(0,24))if(r.Selected&&r.Enabled)if(this.MenuItems[i]instanceof M&&this.IsMouseInListItemArrows(this.MenuItems[i],new u(e,n),0)>0){switch(this.IsMouseInListItemArrows(this.MenuItems[i],new u(e,n),0)){case 1:R.PlaySound(this.AUDIO_SELECT,this.AUDIO_LIBRARY),this.MenuItems[i].fireEvent(),this.onItemSelect.emit(this.MenuItems[i],i);break;case 2:var s=this.MenuItems[i];(null==s.Collection?s.Items.Count:s.Collection.Count)>0&&(s.Index++,R.PlaySound(this.AUDIO_LEFTRIGHT,this.AUDIO_LIBRARY),this.onListChange.emit(s,s.Index))}}else this.SelectItem();else r.Selected?!r.Enabled&&r.Selected&&R.PlaySound(this.AUDIO_ERROR,this.AUDIO_LIBRARY):(this.CurrentSelection=i,R.PlaySound(this.AUDIO_UPDOWN,this.AUDIO_LIBRARY),this.onIndexChange.emit(this.CurrentSelection),this.SelectItem())}else r.Hovered=!1;t++}const i=144+38*(this.MaxItemsOnScreen+1)+this.offset.Y-37+this.extraOffset+this.safezoneOffset.Y,n=this.safezoneOffset.X+this.offset.X;this.MenuItems.length<=this.MaxItemsOnScreen+1||(this.IsMouseInBounds(new u(n,i),new m(431+this.WidthOffset,18))?(this._extraRectangleUp.color=new a(30,30,30,255),(mp.game.controls.isControlJustPressed(0,24)||mp.game.controls.isDisabledControlJustPressed(0,24))&&(this.MenuItems.length>this.MaxItemsOnScreen+1?this.GoUpOverflow():this.GoUp())):this._extraRectangleUp.color=new a(0,0,0,200),this.IsMouseInBounds(new u(n,i+18),new m(431+this.WidthOffset,18))?(this._extraRectangleDown.color=new a(30,30,30,255),(mp.game.controls.isControlJustPressed(0,24)||mp.game.controls.isDisabledControlJustPressed(0,24))&&(this.MenuItems.length>this.MaxItemsOnScreen+1?this.GoDownOverflow():this.GoDown())):this._extraRectangleDown.color=new a(0,0,0,200))}ProcessControl(){this.Visible&&(this._justOpened?this._justOpened=!1:(mp.game.controls.isControlJustReleased(0,177)&&this.GoBack(),0!=this.MenuItems.length&&(mp.game.controls.isControlPressed(0,172)&&this.lastUpDownNavigation+120this.MaxItemsOnScreen+1?this.GoUpOverflow():this.GoUp()):mp.game.controls.isControlJustReleased(0,172)?this.lastUpDownNavigation=0:mp.game.controls.isControlPressed(0,173)&&this.lastUpDownNavigation+120this.MaxItemsOnScreen+1?this.GoDownOverflow():this.GoDown()):mp.game.controls.isControlJustReleased(0,173)?this.lastUpDownNavigation=0:mp.game.controls.isControlPressed(0,174)&&this.lastLeftRightNavigation+100t?(i+="\n"+e+" ",s=n+C.MeasureString(" ")):(i+=e+" ",s+=C.MeasureString(" "))}return i}GoUpOverflow(){this.MenuItems.length<=this.MaxItemsOnScreen+1||(this._activeItem%this.MenuItems.length<=this._minItem?this._activeItem%this.MenuItems.length==0?(this._minItem=this.MenuItems.length-this.MaxItemsOnScreen-1,this._maxItem=this.MenuItems.length-1,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!1,this._activeItem=1e3-1e3%this.MenuItems.length,this._activeItem+=this.MenuItems.length-1,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!0):(this._minItem--,this._maxItem--,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!1,this._activeItem--,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!0):(this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!1,this._activeItem--,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!0),R.PlaySound(this.AUDIO_UPDOWN,this.AUDIO_LIBRARY),this.onIndexChange.emit(this.CurrentSelection))}GoUp(){this.MenuItems.length>this.MaxItemsOnScreen+1||(this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!1,this._activeItem--,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!0,R.PlaySound(this.AUDIO_UPDOWN,this.AUDIO_LIBRARY),this.onIndexChange.emit(this.CurrentSelection))}GoDownOverflow(){this.MenuItems.length<=this.MaxItemsOnScreen+1||(this._activeItem%this.MenuItems.length>=this._maxItem?this._activeItem%this.MenuItems.length==this.MenuItems.length-1?(this._minItem=0,this._maxItem=this.MaxItemsOnScreen,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!1,this._activeItem=1e3-1e3%this.MenuItems.length,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!0):(this._minItem++,this._maxItem++,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!1,this._activeItem++,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!0):(this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!1,this._activeItem++,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!0),R.PlaySound(this.AUDIO_UPDOWN,this.AUDIO_LIBRARY),this.onIndexChange.emit(this.CurrentSelection))}GoDown(){this.MenuItems.length>this.MaxItemsOnScreen+1||(this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!1,this._activeItem++,this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!0,R.PlaySound(this.AUDIO_UPDOWN,this.AUDIO_LIBRARY),this.onIndexChange.emit(this.CurrentSelection))}GoBack(){R.PlaySound(this.AUDIO_BACK,this.AUDIO_LIBRARY),this.Visible=!1,null!=this.ParentMenu&&(this.ParentMenu.Visible=!0,this.ParentMenu._justOpened=!0,this.onMenuChange.emit(this.ParentMenu,!1)),this.onMenuClose.emit()}BindMenuToItem(e,t){e.ParentMenu=this,e.ParentItem=t,this.Children.set(t,e)}ReleaseMenuFromItem(e){if(!this.Children.has(e))return!1;const t=this.Children.get(e);return t.ParentItem=null,t.ParentMenu=null,this.Children.delete(e),!0}render(){if(this.Visible){if(this._justOpened&&(null==this._logo||this._logo.IsTextureDictionaryLoaded||this._logo.LoadTextureDictionary(),this._background.IsTextureDictionaryLoaded||this._background.LoadTextureDictionary(),this._descriptionRectangle.IsTextureDictionaryLoaded||this._descriptionRectangle.LoadTextureDictionary(),this._upAndDownSprite.IsTextureDictionaryLoaded||this._upAndDownSprite.LoadTextureDictionary()),this._mainMenu.Draw(),this.ProcessMouse(),this.ProcessControl(),this._background.size=this.MenuItems.length>this.MaxItemsOnScreen+1?new m(431+this.WidthOffset,38*(this.MaxItemsOnScreen+1)):new m(431+this.WidthOffset,38*this.MenuItems.length),this._background.Draw(),this.MenuItems[this._activeItem%this.MenuItems.length].Selected=!0,""!==this.MenuItems[this._activeItem%this.MenuItems.length].Description){this.RecalculateDescriptionPosition();let e=this.MenuItems[this._activeItem%this.MenuItems.length].Description;this._descriptionText.caption=e;const t=this._descriptionText.caption.split("\n").length;this._descriptionRectangle.size=new m(431+this.WidthOffset,25*t+15),this._descriptionBar.Draw(),this._descriptionRectangle.Draw(),this._descriptionText.Draw()}if(this.MenuItems.length<=this.MaxItemsOnScreen+1){let e=0;for(const t of this.MenuItems)t.SetVerticalPosition(38*e-37+this.extraOffset),t.Draw(),e++;this._counterText&&this.counterOverride&&(this._counterText.caption=this.counterPretext+this.counterOverride,this._counterText.Draw())}else{let t=0;for(let s=this._minItem;s<=this._maxItem;s++){var e=this.MenuItems[s];e.SetVerticalPosition(38*t-37+this.extraOffset),e.Draw(),t++}if(this._extraRectangleUp.size=new m(431+this.WidthOffset,18),this._extraRectangleDown.size=new m(431+this.WidthOffset,18),this._upAndDownSprite.pos=new u(190+this.offset.X+this.WidthOffset/2,147+37*(this.MaxItemsOnScreen+1)+this.offset.Y-37+this.extraOffset),this._extraRectangleUp.Draw(),this._extraRectangleDown.Draw(),this._upAndDownSprite.Draw(),this._counterText){if(this.counterOverride)this._counterText.caption=this.counterPretext+this.counterOverride;else{const e=this.CurrentSelection+1+" / "+this.MenuItems.length;this._counterText.caption=this.counterPretext+e}this._counterText.Draw()}}this._logo.Draw()}}}exports.Menu=T,exports.UIMenuItem=I,exports.UIMenuListItem=M,exports.UIMenuCheckboxItem=w,exports.UIMenuSliderItem=O,exports.BadgeStyle=h,exports.Point=u,exports.Size=m,exports.Color=a,exports.Font=r,exports.ItemsCollection=S,exports.ListItem=x}]);
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/package-lock.json b/ReallifeGamemode.Client/package-lock.json
index f4e57729..463d2349 100644
--- a/ReallifeGamemode.Client/package-lock.json
+++ b/ReallifeGamemode.Client/package-lock.json
@@ -176,8 +176,8 @@
"integrity": "sha512-vVjM0SVzgaOUpflq4GYBvCpozes8OgIIS5gVXVka+OfK3hvnkC1i93U8WiY2OtNE4XUWyyy/86Kf6e0IHTQw1Q=="
},
"@types/ragemp-c": {
- "version": "github:CocaColaBear/types-ragemp-c#22f1d92d2b1e20abcfa5ecd6178b68bf3cc48e33",
- "from": "github:CocaColaBear/types-ragemp-c#master",
+ "version": "git+https://github.com/sprayzcs/types-ragemp-c.git#cf1bca57f525e48157f1b38af2369127cb31ea51",
+ "from": "git+https://github.com/sprayzcs/types-ragemp-c.git#master",
"dev": true
},
"@webassemblyjs/ast": {
@@ -348,6 +348,10 @@
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
},
+ "NativeUI": {
+ "version": "git+https://github.com/sprayzcs/RageMP-NativeUI.git#0ca40b56d9124056ceb9ca016d209aa4e3ecfeb3",
+ "from": "git+https://github.com/sprayzcs/RageMP-NativeUI.git#master"
+ },
"acorn": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz",
diff --git a/ReallifeGamemode.Client/package.json b/ReallifeGamemode.Client/package.json
index 9cd2ec3f..14eddf24 100644
--- a/ReallifeGamemode.Client/package.json
+++ b/ReallifeGamemode.Client/package.json
@@ -2,12 +2,13 @@
"name": "reallifegamemode.client",
"version": "1.0.0",
"devDependencies": {
- "@types/ragemp-c": "github:CocaColaBear/types-ragemp-c#master",
+ "@types/ragemp-c": "git+https://github.com/sprayzcs/types-ragemp-c.git#master",
"uglifyjs-webpack-plugin": "^2.1.2"
},
"dependencies": {
"@babel/core": "^7.3.4",
"@types/node": "^11.9.5",
+ "NativeUI": "git+https://github.com/sprayzcs/RageMP-NativeUI.git#master",
"babel-loader": "^8.0.5",
"ts-loader": "^5.3.3",
"typescript": "^3.3.3333",
diff --git a/ReallifeGamemode.Client/tsconfig.json b/ReallifeGamemode.Client/tsconfig.json
index 5c8e57fd..606292d8 100644
--- a/ReallifeGamemode.Client/tsconfig.json
+++ b/ReallifeGamemode.Client/tsconfig.json
@@ -12,7 +12,11 @@
"moduleResolution": "node"
},
"include": [
- "**/*"
+ "**/*",
+ "node_modules/NativeUI/index.ts"
+ ],
+ "files": [
+ "node_modules/NativeUI/index.ts"
],
"exclude": [
"node_modules",
diff --git a/ReallifeGamemode.Client/util/waypoint.js b/ReallifeGamemode.Client/util/waypoint.js
deleted file mode 100644
index 4428a5ee..00000000
--- a/ReallifeGamemode.Client/util/waypoint.js
+++ /dev/null
@@ -1,3 +0,0 @@
-mp.events.add("SERVER:Util_setWaypoint", (x, y) => {
- mp.game.ui.setNewWaypoint(x, y);
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/util/waypoint.ts b/ReallifeGamemode.Client/util/waypoint.ts
new file mode 100644
index 00000000..f7293d13
--- /dev/null
+++ b/ReallifeGamemode.Client/util/waypoint.ts
@@ -0,0 +1,5 @@
+export default function waypointUtil() {
+ mp.events.add("SERVER:Util_setWaypoint", (x, y) => {
+ mp.game.ui.setNewWaypoint(x, y);
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/vehiclesync/smoothtrottle.js b/ReallifeGamemode.Client/vehiclesync/smoothtrottle.js
deleted file mode 100644
index fb087413..00000000
--- a/ReallifeGamemode.Client/vehiclesync/smoothtrottle.js
+++ /dev/null
@@ -1,137 +0,0 @@
-//This script will make vehicles have smoother acceleration.
-//To disable the script call an event and set "GlobalDisable" to true.
-//To disable individual sections, set "DisableAntiReverse" or "DisableSmoothThrottle" to true.
-
-//This script includes an anti-reverse brake system with automatic brake lights.
-
-//When you brake, while holding brake you will come to a complete stop and won't reverse until you
-//release the brake button and press it again.
-
-mp.events.add("SmoothThrottle_PlayerEnterVehicle", (entity, seat) =>
-{
- BrakeSystem = true;
-});
-
-mp.events.add("SmoothThrottle_PlayerExitVehicle", (entity) =>
-{
- BrakeSystem = false;
-});
-
-mp.events.add("SmoothThrottle_SetSmoothThrottle", (turnedOn) =>
-{
- DisableSmoothThrottle = !turnedOn;
-});
-
-mp.events.add("SmoothThrottle_SetAntiReverse", (turnedOn) =>
-{
- DisableAntiReverse = !turnedOn;
-});
-
-mp.events.add("SmoothThrottle_SetGlobal", (turnedOn) =>
-{
- GlobalDisable = !turnedOn;
-});
-
-let GlobalDisable = false;
-let DisableAntiReverse = false;
-let DisableSmoothThrottle = false;
-
-let BrakeSystem = false;
-let vehicleStopped = false;
-let vehicleStoppedOnOwn = false;
-let constantStart = 0.25; //starts at 0.25 and increases to 1
-let constantStep = 0.135; //You can change this for a faster throttle response (Will cause more skidding)
-
-let deltaAmount = constantStart;
-let prevTime = mp.game.invoke('0x9CD27B0045628463');
-let diffToggle = false;
-
-mp.events.add("render", () =>
-{
- if(GlobalDisable)
- return;
-
- if(BrakeSystem)
- {
- if(mp.players.local.vehicle !== null)
- {
- if(!mp.players.local.vehicle.isSeatFree(-1)) //only do this if the vehicle has a driver (doesn't have to be the player who is rendering this)
- {
- //Optimize function calls to variables (probably doesn't make a difference)
- let vehClass = mp.players.local.vehicle.getClass();
- let isControl71Pressed = mp.game.controls.isControlPressed(0, 71); //accelerate
- let isControl72Pressed = mp.game.controls.isControlPressed(0, 72); //brake
- let isControl76Pressed = mp.game.controls.isControlPressed(0, 76); //handbrake
- let speed = mp.players.local.vehicle.getSpeed();
-
- //Only do it to car classes
- if(!DisableSmoothThrottle && ((vehClass >= 0 && vehClass <= 12) || vehClass === 18 || vehClass === 19 || vehClass === 20))
- {
- if(isControl71Pressed || isControl72Pressed)
- {
- if(isControl76Pressed)
- {
- deltaAmount = 1.0; //If people are buffering their throttle up
- }
-
- mp.players.local.vehicle.setEngineTorqueMultiplier(deltaAmount);
-
- //Calculate tick time and step every 250ms
- if (mp.game.invoke('0x9CD27B0045628463') - prevTime > 250)
- {
- prevTime = mp.game.invoke('0x9CD27B0045628463');
- deltaAmount += constantStep * speed; //Curve
- if(deltaAmount > 1.0)
- {
- deltaAmount = 1.0;
- }
- }
- }
- else
- {
- deltaAmount = constantStart; //Reset when they let go of throttle
- //mp.game.controls.setControlNormal(0, 71, amount);
- }
- }
-
- //THIS IS THE BRAKE LIGHT SYSTEM WITH ANTI-REVERSE
- if(DisableAntiReverse)
- return;
-
- if(speed < 1)
- {
- vehicleStopped = true;
- }
- else
- {
- vehicleStopped = false;
- vehicleStoppedOnOwn = false;
- diffToggle = false;
- }
-
- if((!isControl72Pressed && mp.game.controls.isControlEnabled(0, 72)) && !isControl76Pressed && vehicleStopped)
- {
- vehicleStoppedOnOwn = true;
- mp.players.local.vehicle.setBrakeLights(true);
- }
-
- if(vehicleStopped && !vehicleStoppedOnOwn && !mp.players.local.vehicle.isInBurnout() && !diffToggle)
- {
- mp.players.local.vehicle.setBrakeLights(true);
- mp.game.controls.disableControlAction(0, 72, true);
- }
-
- if((isControl71Pressed && !isControl72Pressed) || isControl76Pressed)
- {
- mp.players.local.vehicle.setBrakeLights(false);
- }
-
- if(mp.game.controls.isDisabledControlJustReleased(0, 72) && vehicleStopped)
- {
- mp.game.controls.enableControlAction(0, 72, true);
- diffToggle = true;
- }
- }
- }
- }
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts b/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts
new file mode 100644
index 00000000..89795418
--- /dev/null
+++ b/ReallifeGamemode.Client/vehiclesync/smoothtrottle.ts
@@ -0,0 +1,119 @@
+//This script will make vehicles have smoother acceleration.
+//To disable the script call an event and set "GlobalDisable" to true.
+//To disable individual sections, set "DisableAntiReverse" or "DisableSmoothThrottle" to true.
+
+//This script includes an anti-reverse brake system with automatic brake lights.
+
+//When you brake, while holding brake you will come to a complete stop and won't reverse until you
+//release the brake button and press it again.
+
+export default function smoothThrottle() {
+ let GlobalDisable = false;
+ let DisableAntiReverse = false;
+ let DisableSmoothThrottle = false;
+
+ let BrakeSystem = false;
+ let vehicleStopped = false;
+ let vehicleStoppedOnOwn = false;
+ let constantStart = 0.25; //starts at 0.25 and increases to 1
+ let constantStep = 0.135; //You can change this for a faster throttle response (Will cause more skidding)
+
+ let deltaAmount = constantStart;
+ let prevTime = mp.game.invoke('0x9CD27B0045628463');
+ let diffToggle = false;
+
+ mp.events.add("SmoothThrottle_PlayerEnterVehicle", (entity, seat) => {
+ BrakeSystem = true;
+ });
+
+ mp.events.add("SmoothThrottle_PlayerExitVehicle", (entity) => {
+ BrakeSystem = false;
+ });
+
+ mp.events.add("SmoothThrottle_SetSmoothThrottle", (turnedOn) => {
+ DisableSmoothThrottle = !turnedOn;
+ });
+
+ mp.events.add("SmoothThrottle_SetAntiReverse", (turnedOn) => {
+ DisableAntiReverse = !turnedOn;
+ });
+
+ mp.events.add("SmoothThrottle_SetGlobal", (turnedOn) => {
+ GlobalDisable = !turnedOn;
+ });
+
+ mp.events.add("render", () => {
+ if (GlobalDisable)
+ return;
+
+ if (BrakeSystem) {
+ if (mp.players.local.vehicle !== null) {
+ if (!mp.players.local.vehicle.isSeatFree(-1)) //only do this if the vehicle has a driver (doesn't have to be the player who is rendering this)
+ {
+ //Optimize function calls to variables (probably doesn't make a difference)
+ let vehClass = mp.players.local.vehicle.getClass();
+ let isControl71Pressed = mp.game.controls.isControlPressed(0, 71); //accelerate
+ let isControl72Pressed = mp.game.controls.isControlPressed(0, 72); //brake
+ let isControl76Pressed = mp.game.controls.isControlPressed(0, 76); //handbrake
+ let speed = mp.players.local.vehicle.getSpeed();
+
+ //Only do it to car classes
+ if (!DisableSmoothThrottle && ((vehClass >= 0 && vehClass <= 12) || vehClass === 18 || vehClass === 19 || vehClass === 20)) {
+ if (isControl71Pressed || isControl72Pressed) {
+ if (isControl76Pressed) {
+ deltaAmount = 1.0; //If people are buffering their throttle up
+ }
+
+ mp.players.local.vehicle.setEngineTorqueMultiplier(deltaAmount);
+
+ //Calculate tick time and step every 250ms
+ if (mp.game.invoke('0x9CD27B0045628463') - prevTime > 250) {
+ prevTime = mp.game.invoke('0x9CD27B0045628463');
+ deltaAmount += constantStep * speed; //Curve
+ if (deltaAmount > 1.0) {
+ deltaAmount = 1.0;
+ }
+ }
+ }
+ else {
+ deltaAmount = constantStart; //Reset when they let go of throttle
+ //mp.game.controls.setControlNormal(0, 71, amount);
+ }
+ }
+
+ //THIS IS THE BRAKE LIGHT SYSTEM WITH ANTI-REVERSE
+ if (DisableAntiReverse)
+ return;
+
+ if (speed < 1) {
+ vehicleStopped = true;
+ }
+ else {
+ vehicleStopped = false;
+ vehicleStoppedOnOwn = false;
+ diffToggle = false;
+ }
+
+ if ((!isControl72Pressed && mp.game.controls.isControlEnabled(0, 72)) && !isControl76Pressed && vehicleStopped) {
+ vehicleStoppedOnOwn = true;
+ mp.players.local.vehicle.setBrakeLights(true);
+ }
+
+ if (vehicleStopped && !vehicleStoppedOnOwn && !mp.players.local.vehicle.isInBurnout() && !diffToggle) {
+ mp.players.local.vehicle.setBrakeLights(true);
+ mp.game.controls.disableControlAction(0, 72, true);
+ }
+
+ if ((isControl71Pressed && !isControl72Pressed) || isControl76Pressed) {
+ mp.players.local.vehicle.setBrakeLights(false);
+ }
+
+ if (mp.game.controls.isDisabledControlJustReleased(0, 72) && vehicleStopped) {
+ mp.game.controls.enableControlAction(0, 72, true);
+ diffToggle = true;
+ }
+ }
+ }
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/vehiclesync/vehicleindicators.js b/ReallifeGamemode.Client/vehiclesync/vehicleindicators.js
deleted file mode 100644
index 1bd465c0..00000000
--- a/ReallifeGamemode.Client/vehiclesync/vehicleindicators.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var player = mp.players.local;
-
-mp.keys.bind(0x64, true, function () {
- if (!player.vehicle) return;
- mp.events.callRemote("CLIENT:toggleLeftIndicator");
-});
-
-mp.keys.bind(0x66, true, function () {
- if (!player.vehicle) return;
- mp.events.callRemote("CLIENT:toggleRightIndicator");
-});
-
-mp.keys.bind(0x65, true, function () {
- if (!player.vehicle) return;
- mp.events.callRemote("CLIENT:toggleWarningIndicator");
-});
-
-mp.events.add("SERVER:setIndicatorStatus", (vehicle, left, right) => {
- var veh = mp.vehicles.atRemoteId(vehicle);
-
- veh.setIndicatorLights(0, right);
- veh.setIndicatorLights(1, left);
-});
-
-mp.events.add("entityStreamIn", entity => {
- if (entity === undefined || entity === null || !entity.isAVehicle()) return;
-
- var data = entity.getVariable("indicatorData");
- if (data) {
- entity.setIndicatorLights(0, data.Right);
- entity.setIndicatorLights(1, data.Left);
- }
-});
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/vehiclesync/vehicleindicators.ts b/ReallifeGamemode.Client/vehiclesync/vehicleindicators.ts
new file mode 100644
index 00000000..8b19fdfa
--- /dev/null
+++ b/ReallifeGamemode.Client/vehiclesync/vehicleindicators.ts
@@ -0,0 +1,36 @@
+const player = mp.players.local;
+
+export default function vehicleIndicators() {
+
+ mp.keys.bind(0x64, true, function () {
+ if (!player.vehicle) return;
+ mp.events.callRemote("CLIENT:toggleLeftIndicator");
+ });
+
+ mp.keys.bind(0x66, true, function () {
+ if (!player.vehicle) return;
+ mp.events.callRemote("CLIENT:toggleRightIndicator");
+ });
+
+ mp.keys.bind(0x65, true, function () {
+ if (!player.vehicle) return;
+ mp.events.callRemote("CLIENT:toggleWarningIndicator");
+ });
+
+ mp.events.add("SERVER:setIndicatorStatus", (vehicle, left, right) => {
+ var veh = mp.vehicles.atRemoteId(vehicle);
+
+ veh.setIndicatorLights(0, right);
+ veh.setIndicatorLights(1, left);
+ });
+
+ mp.events.add("entityStreamIn", entity => {
+ if (entity === undefined || entity === null || !entity.isAVehicle()) return;
+
+ var data = entity.getVariable("indicatorData");
+ if (data) {
+ entity.setIndicatorLights(0, data.Right);
+ entity.setIndicatorLights(1, data.Left);
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/vehiclesync/vehiclesync.js b/ReallifeGamemode.Client/vehiclesync/vehiclesync.js
deleted file mode 100644
index 65b99414..00000000
--- a/ReallifeGamemode.Client/vehiclesync/vehiclesync.js
+++ /dev/null
@@ -1,548 +0,0 @@
-//Disapproved by the entire planet
-//You don't need to worry about anything here
-
-mp.events.add("VehStream_SetEngineStatus", (veh, status) => {
- if (veh === undefined || veh === null || !veh.isAVehicle()) return;
- if (veh !== undefined) {
- if (veh.isSeatFree(-1)) //Turns engine on instantly if no driver, otherwise it will not turn on
- {
- veh.setEngineOn(status, true, false);
- veh.setUndriveable(true);
- }
- else {
- veh.setEngineOn(status, false, true);
- veh.setUndriveable(!status);
- }
- }
-});
-
-mp.events.add("VehStream_SetLockStatus", (veh, status) => {
- if (veh === undefined || veh === null || !veh.isAVehicle()) return;
- if (veh !== undefined) {
- if (status)
- veh.setDoorsLocked(2);
- else
- veh.setDoorsLocked(1);
- }
-});
-
-mp.events.add("VehStream_PlayerEnterVehicleAttempt", (entity, seat) => {
- entity = mp.vehicles.atRemoteId(entity);
- if (entity === undefined || entity === null || !entity.isAVehicle()) return;
- if (typeof entity.getVariable("VehicleSyncData") !== 'undefined') {
- var toggle = entity.getVariable("VehicleSyncData");
- entity.setEngineOn(toggle.Engine, false, true);
- entity.setUndriveable(!toggle.Engine);
- }
-});
-
-mp.events.add("VehStream_PlayerExitVehicleAttempt", (entity) => {
- if (entity === undefined || entity === null || !entity.isAVehicle()) return;
- if (entity !== undefined) {
- if (typeof entity.getVariable("VehicleSyncData") !== 'undefined') {
- var toggle = entity.getVariable("VehicleSyncData");
- entity.setEngineOn(toggle.Engine, true, false);
- entity.setUndriveable(!toggle.Engine);
- }
-
- var level = entity.getDirtLevel();
- mp.events.callRemote("VehStream_SetDirtLevel", entity, level);
- }
-});
-
-mp.events.add("VehStream_PlayerExitVehicle", (entity) => {
- entity = mp.vehicles.atRemoteId(entity);
- if (entity === undefined || entity === null || !entity.isAVehicle()) {
- return;
- }
- setTimeout(() => {
- var Status = [];
- let y = 0;
- for (y = 0; y < 8; y++) {
- if (entity.isDoorDamaged(y)) {
- Status.push(2);
- }
- else if (entity.getDoorAngleRatio(y) > 0.15) {
- Status.push(1);
- }
- else {
- Status.push(0);
- }
- }
- mp.events.callRemote("VehStream_SetDoorData", entity, Status[0], Status[1], Status[2], Status[3], Status[4], Status[5], Status[6], Status[7]);
-
- Status = [];
- if (entity.isWindowIntact(0)) {
- if (entity.getBoneIndexByName("window_rf") === -1) {
- Status.push(1);
- }
- else {
- Status.push(0);
- }
- }
- else {
- Status.push(2);
- }
- if (entity.isWindowIntact(1)) {
- if (entity.getBoneIndexByName("window_lf") === -1) {
- Status.push(1);
- }
- else {
- Status.push(0);
- }
- }
- else {
- Status.push(2);
- }
- if (entity.isWindowIntact(2)) {
- if (entity.getBoneIndexByName("window_rr") === -1) {
- Status.push(1);
- }
- else {
- Status.push(0);
- }
- }
- else {
- Status.push(2);
- }
- if (entity.isWindowIntact(3)) {
- if (entity.getBoneIndexByName("window_lr") === -1) {
- Status.push(1);
- }
- else {
- Status.push(0);
- }
- }
- else {
- Status.push(2);
- }
- mp.events.callRemote("VehStream_SetWindowData", entity, Status[0], Status[1], Status[2], Status[3]);
-
- Status = [];
- if (!entity.isTyreBurst(0, false)) {
- Status.push(0);
- }
- else if (entity.isTyreBurst(0, false)) {
- Status.push(1);
- }
- else {
- Status.push(2);
- }
-
- if (!entity.isTyreBurst(1, false)) {
- Status.push(0);
- }
- else if (entity.isTyreBurst(1, false)) {
- Status.push(1);
- }
- else {
- Status.push(2);
- }
-
- if (!entity.isTyreBurst(2, false)) {
- Status.push(0);
- }
- else if (entity.isTyreBurst(2, false)) {
- Status.push(1);
- }
- else {
- Status.push(2);
- }
-
- if (!entity.isTyreBurst(3, false)) {
- Status.push(0);
- }
- else if (entity.isTyreBurst(3, false)) {
- Status.push(1);
- }
- else {
- Status.push(2);
- }
-
- if (!entity.isTyreBurst(4, false)) {
- Status.push(0);
- }
- else if (entity.isTyreBurst(4, false)) {
- Status.push(1);
- }
- else {
- Status.push(2);
- }
-
- if (!entity.isTyreBurst(5, false)) {
- Status.push(0);
- }
- else if (entity.isTyreBurst(5, false)) {
- Status.push(1);
- }
- else {
- Status.push(2);
- }
-
- if (!entity.isTyreBurst(6, false)) {
- Status.push(0);
- }
- else if (entity.isTyreBurst(6, false)) {
- Status.push(1);
- }
- else {
- Status.push(2);
- }
-
- if (!entity.isTyreBurst(7, false)) {
- Status.push(0);
- }
- else if (entity.isTyreBurst(7, false)) {
- Status.push(1);
- }
- else {
- Status.push(2);
- }
-
- if (!entity.isTyreBurst(45, false)) {
- Status.push(0);
- }
- else if (entity.isTyreBurst(45, false)) {
- Status.push(1);
- }
- else {
- Status.push(2);
- }
-
- if (!entity.isTyreBurst(47, false)) {
- Status.push(0);
- }
- else if (entity.isTyreBurst(47, false)) {
- Status.push(1);
- }
- else {
- Status.push(2);
- }
-
- mp.events.callRemote("VehStream_SetWheelData", entity, Status[0], Status[1], Status[2], Status[3], Status[4], Status[5], Status[6], Status[7], Status[8], Status[9]);
- }, 2500);
-});
-
-mp.events.add("VehStream_PlayerEnterVehicleAttempt", (entity, seat) => {
- entity = mp.vehicles.atRemoteId(entity);
- if (entity === undefined || entity === null || !entity.isAVehicle()) return;
- setTimeout(() => {
- var Status = [];
- let y = 0;
- for (y = 0; y < 8; y++) {
- if (entity.isDoorDamaged(y)) {
- Status.push(2);
- }
- else if (entity.getDoorAngleRatio(y) > 0.15) {
- Status.push(1);
- }
- else {
- Status.push(0);
- }
- }
- //mp.events.callRemote("VehStream_SetDoorData", entity, Status[0], Status[1], Status[2], Status[3], Status[4], Status[5], Status[6], Status[7]);
-
- Status = [];
- if (entity.isWindowIntact(0)) {
- if (entity.getBoneIndexByName("window_rf") === -1) {
- Status.push(1);
- }
- else {
- Status.push(0);
- }
- }
- else {
- Status.push(2);
- }
- if (entity.isWindowIntact(1)) {
- if (entity.getBoneIndexByName("window_lf") === -1) {
- Status.push(1);
- }
- else {
- Status.push(0);
- }
- }
- else {
- Status.push(2);
- }
- if (entity.isWindowIntact(2)) {
- if (entity.getBoneIndexByName("window_rr") === -1) {
- Status.push(1);
- }
- else {
- Status.push(0);
- }
- }
- else {
- Status.push(2);
- }
- if (entity.isWindowIntact(3)) {
- if (entity.getBoneIndexByName("window_lr") === -1) {
- Status.push(1);
- }
- else {
- Status.push(0);
- }
- }
- else {
- Status.push(2);
- }
- mp.events.callRemote("VehStream_SetWindowData", entity, Status[0], Status[1], Status[2], Status[3]);
- }, 3000);
-});
-
-mp.events.add("VehStream_SetVehicleDirtLevel", (entity, dirt) => {
- if (entity === undefined || entity === null || !entity.isAVehicle()) return;
- if (entity !== undefined) {
- entity.setDirtLevel(dirt);
- }
-});
-
-mp.events.add("VehStream_SetVehicleDoorStatus_Single", (veh, door, state) => {
- if (veh === undefined || veh === null || !veh.isAVehicle()) return;
- if (veh !== undefined) {
- if (state === 0) {
- veh.setDoorShut(door, false);
- }
- else if (state === 1) {
- veh.setDoorOpen(door, false, false);
- }
- else {
- veh.setDoorBroken(door, true);
- }
- }
-});
-
-mp.events.add("VehStream_SetVehicleDoorStatus", (...args) => {
- if (args[0] !== undefined && args[0] !== null || !args[0].isAVehicle()) {
- let y = 0;
- for (y = 1; y < args.length; y++) {
- if (args[y] === 0) {
- args[0].setDoorShut(y - 1, false);
- }
- else if (args[y] === 1) {
- args[0].setDoorOpen(y - 1, false, false);
- }
- else {
- args[0].setDoorBroken(y - 1, true);
- }
- }
- }
-});
-
-mp.events.add("VehStream_SetVehicleWindowStatus_Single", (veh, windw, state) => {
- if (veh === undefined || veh === null || !veh.isAVehicle()) return;
- if (veh !== undefined) {
- if (state === 1) {
- veh.rollDownWindow(windw);
- }
- else if (state === 0) {
- veh.fixWindow(windw);
- veh.rollUpWindow(windw);
- }
- else {
- veh.smashWindow(windw);
- }
- }
-});
-
-mp.events.add("VehStream_SetVehicleWindowStatus", (...args) => {
- if (args[0] !== undefined && args[0] !== null || !args[0].isAVehicle()) {
- let y = 0;
- for (y = 1; y < 4; y++) {
- if (args[y] === 1) {
- args[0].rollDownWindow(y - 1);
- }
- else if (args[y] === 0) {
- args[0].fixWindow(y - 1);
- args[0].rollUpWindow(y - 1);
- }
- else {
- args[0].smashWindow(y - 1);
- }
- }
- }
-});
-
-mp.events.add("VehStream_SetVehicleWheelStatus_Single", (veh, wheel, state) => {
- if (veh === undefined || veh === null || !veh.isAVehicle()) return;
- if (veh !== undefined) {
- if (wheel === 9) {
- if (state === 1) {
- veh.setTyreBurst(45, false, 1000);
- }
- else if (state === 0) {
- veh.setTyreFixed(45);
- }
- else {
- veh.setTyreBurst(45, true, 1000);
- }
- }
- else if (wheel === 10) {
- if (state === 1) {
- veh.setTyreBurst(47, false, 1000);
- }
- else if (state === 0) {
- veh.setTyreFixed(47);
- }
- else {
- veh.setTyreBurst(47, true, 1000);
- }
- }
- else {
- if (state === 1) {
- veh.setTyreBurst(wheel, false, 1000);
- }
- else if (state === 0) {
- veh.setTyreFixed(wheel);
- }
- else {
- veh.setTyreBurst(wheel, true, 1000);
- }
- }
- }
-});
-
-mp.events.add("VehStream_SetVehicleWheelStatus", (...args) => {
- if (args[0] !== undefined && args[0] !== null || !args[0].isAVehicle()) {
- let y = 0;
- for (y = 1; y < args.length; y++) {
- if (y === 9) {
- if (args[y] === 1) {
- args[0].setTyreBurst(45, false, 1000);
- }
- else if (args[y] === 0) {
- args[0].setTyreFixed(45);
- }
- else {
- args[0].setTyreBurst(45, true, 1000);
- }
- }
- else if (y === 10) {
- if (args[y] === 1) {
- args[0].setTyreBurst(47, false, 1000);
- }
- else if (args[y] === 0) {
- args[0].setTyreFixed(47);
- }
- else {
- args[0].setTyreBurst(47, true, 1000);
- }
- }
- else {
- if (args[y] === 1) {
- args[0].setTyreBurst(y - 1, false, 1000);
- }
- else if (args[y] === 0) {
- args[0].setTyreFixed(y - 1);
- }
- else {
- args[0].setTyreBurst(y - 1, true, 1000);
- }
- }
- }
- }
-});
-
-//Sync data on stream in
-mp.events.add("entityStreamIn", (entity) => {
- if (entity === undefined || entity === null || !entity.isAVehicle()) return;
- if (entity.type === "vehicle") {
- let typeor = typeof entity.getVariable('VehicleSyncData');
- let actualData = entity.getVariable('VehicleSyncData');
-
- //Needed to stop vehicles from freaking out
- mp.game.streaming.requestCollisionAtCoord(entity.position.x, entity.position.y, entity.position.z);
- //mp.game.invoke('0x199640F55E0F7596', entity.position.x, entity.position.y, entity.position.z);
- entity.setLoadCollisionFlag(true);
- entity.trackVisibility();
-
- if (typeor !== 'undefined' && entity.isSeatFree(-1)) //Only if there is no driver
- {
- entity.position = actualData.Position;
- entity.rotation = actualData.Rotation;
- }
-
- //Set doors unbreakable for a moment
- let x = 0;
- for (x = 0; x < 8; x++) {
- entity.setDoorBreakable(x, false);
- }
-
- //Do it anyway
- entity.setUndriveable(true);
-
- if (typeor !== 'undefined') {
- entity.setEngineOn(actualData.Engine, true, false);
- entity.setUndriveable(true);
-
- if (actualData.Locked)
- entity.setDoorsLocked(2);
- else
- entity.setDoorsLocked(1);
-
- entity.setDirtLevel(actualData.Dirt);
-
- for (x = 0; x < 8; x++) {
- if (actualData.Door[x] === 1)
- entity.setDoorOpen(x, false, false);
- else if (actualData.Door[x] === 0)
- entity.setDoorShut(x, true);
- else
- entity.setDoorBroken(x, true);
- }
-
- for (x = 0; x < 4; x++) {
- if (actualData.Window[x] === 0) {
- entity.fixWindow(x);
- }
- else if (actualData.Window[x] === 1) {
- entity.rollDownWindow(x);
- }
- else {
- entity.smashWindow(x);
- }
- }
-
- for (x = 0; x < 8; x++) {
- if (actualData.Wheel[x] === 0) {
- entity.setTyreFixed(x);
- }
- else if (actualData.Wheel[x] === 1) {
- entity.setTyreBurst(x, false, 0);
- }
- else {
- entity.setTyreBurst(x, true, 1000);
- }
- }
-
- //For trailer mid wheels
- if (actualData.Wheel[8] === 0) {
- entity.setTyreFixed(45);
- }
- else if (actualData.Wheel[8] === 1) {
- entity.setTyreBurst(45, false, 0);
- }
- else {
- entity.setTyreBurst(45, true, 1000);
- }
-
- if (actualData.Wheel[9] === 0) {
- entity.setTyreFixed(47);
- }
- else if (actualData.Wheel[9] === 1) {
- entity.setTyreBurst(47, false, 0);
- }
- else {
- entity.setTyreBurst(47, true, 1000);
- }
- }
-
- //Make doors breakable again
- setTimeout(() => {
- for (x = 0; x < 8; x++) {
- entity.setDoorBreakable(x, true);
- }
- }, 1500);
- }
-});
diff --git a/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts b/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts
new file mode 100644
index 00000000..2236355c
--- /dev/null
+++ b/ReallifeGamemode.Client/vehiclesync/vehiclesync.ts
@@ -0,0 +1,549 @@
+//Disapproved by the entire planet
+//You don't need to worry about anything here
+export default function vehicleSync() {
+ mp.events.add("VehStream_SetEngineStatus", (veh, status) => {
+ if (veh === undefined || veh === null || !veh.isAVehicle()) return;
+ if (veh !== undefined) {
+ if (veh.isSeatFree(-1)) //Turns engine on instantly if no driver, otherwise it will not turn on
+ {
+ veh.setEngineOn(status, true, false);
+ veh.setUndriveable(true);
+ }
+ else {
+ veh.setEngineOn(status, false, true);
+ veh.setUndriveable(!status);
+ }
+ }
+ });
+
+ mp.events.add("VehStream_SetLockStatus", (veh, status) => {
+ if (veh === undefined || veh === null || !veh.isAVehicle()) return;
+ if (veh !== undefined) {
+ if (status)
+ veh.setDoorsLocked(2);
+ else
+ veh.setDoorsLocked(1);
+ }
+ });
+
+ mp.events.add("VehStream_PlayerEnterVehicleAttempt", (entity, seat) => {
+ entity = mp.vehicles.atRemoteId(entity);
+ if (entity === undefined || entity === null || !entity.isAVehicle()) return;
+ if (typeof entity.getVariable("VehicleSyncData") !== 'undefined') {
+ var toggle = entity.getVariable("VehicleSyncData");
+ entity.setEngineOn(toggle.Engine, false, true);
+ entity.setUndriveable(!toggle.Engine);
+ }
+ });
+
+ mp.events.add("VehStream_PlayerExitVehicleAttempt", (entity) => {
+ if (entity === undefined || entity === null || !entity.isAVehicle()) return;
+ if (entity !== undefined) {
+ if (typeof entity.getVariable("VehicleSyncData") !== 'undefined') {
+ var toggle = entity.getVariable("VehicleSyncData");
+ entity.setEngineOn(toggle.Engine, true, false);
+ entity.setUndriveable(!toggle.Engine);
+ }
+
+ var level = entity.getDirtLevel();
+ mp.events.callRemote("VehStream_SetDirtLevel", entity, level);
+ }
+ });
+
+ mp.events.add("VehStream_PlayerExitVehicle", (entity) => {
+ entity = mp.vehicles.atRemoteId(entity);
+ if (entity === undefined || entity === null || !entity.isAVehicle()) {
+ return;
+ }
+ setTimeout(() => {
+ var Status = [];
+ let y = 0;
+ for (y = 0; y < 8; y++) {
+ if (entity.isDoorDamaged(y)) {
+ Status.push(2);
+ }
+ else if (entity.getDoorAngleRatio(y) > 0.15) {
+ Status.push(1);
+ }
+ else {
+ Status.push(0);
+ }
+ }
+ mp.events.callRemote("VehStream_SetDoorData", entity, Status[0], Status[1], Status[2], Status[3], Status[4], Status[5], Status[6], Status[7]);
+
+ Status = [];
+ if (entity.isWindowIntact(0)) {
+ if (entity.getBoneIndexByName("window_rf") === -1) {
+ Status.push(1);
+ }
+ else {
+ Status.push(0);
+ }
+ }
+ else {
+ Status.push(2);
+ }
+ if (entity.isWindowIntact(1)) {
+ if (entity.getBoneIndexByName("window_lf") === -1) {
+ Status.push(1);
+ }
+ else {
+ Status.push(0);
+ }
+ }
+ else {
+ Status.push(2);
+ }
+ if (entity.isWindowIntact(2)) {
+ if (entity.getBoneIndexByName("window_rr") === -1) {
+ Status.push(1);
+ }
+ else {
+ Status.push(0);
+ }
+ }
+ else {
+ Status.push(2);
+ }
+ if (entity.isWindowIntact(3)) {
+ if (entity.getBoneIndexByName("window_lr") === -1) {
+ Status.push(1);
+ }
+ else {
+ Status.push(0);
+ }
+ }
+ else {
+ Status.push(2);
+ }
+ mp.events.callRemote("VehStream_SetWindowData", entity, Status[0], Status[1], Status[2], Status[3]);
+
+ Status = [];
+ if (!entity.isTyreBurst(0, false)) {
+ Status.push(0);
+ }
+ else if (entity.isTyreBurst(0, false)) {
+ Status.push(1);
+ }
+ else {
+ Status.push(2);
+ }
+
+ if (!entity.isTyreBurst(1, false)) {
+ Status.push(0);
+ }
+ else if (entity.isTyreBurst(1, false)) {
+ Status.push(1);
+ }
+ else {
+ Status.push(2);
+ }
+
+ if (!entity.isTyreBurst(2, false)) {
+ Status.push(0);
+ }
+ else if (entity.isTyreBurst(2, false)) {
+ Status.push(1);
+ }
+ else {
+ Status.push(2);
+ }
+
+ if (!entity.isTyreBurst(3, false)) {
+ Status.push(0);
+ }
+ else if (entity.isTyreBurst(3, false)) {
+ Status.push(1);
+ }
+ else {
+ Status.push(2);
+ }
+
+ if (!entity.isTyreBurst(4, false)) {
+ Status.push(0);
+ }
+ else if (entity.isTyreBurst(4, false)) {
+ Status.push(1);
+ }
+ else {
+ Status.push(2);
+ }
+
+ if (!entity.isTyreBurst(5, false)) {
+ Status.push(0);
+ }
+ else if (entity.isTyreBurst(5, false)) {
+ Status.push(1);
+ }
+ else {
+ Status.push(2);
+ }
+
+ if (!entity.isTyreBurst(6, false)) {
+ Status.push(0);
+ }
+ else if (entity.isTyreBurst(6, false)) {
+ Status.push(1);
+ }
+ else {
+ Status.push(2);
+ }
+
+ if (!entity.isTyreBurst(7, false)) {
+ Status.push(0);
+ }
+ else if (entity.isTyreBurst(7, false)) {
+ Status.push(1);
+ }
+ else {
+ Status.push(2);
+ }
+
+ if (!entity.isTyreBurst(45, false)) {
+ Status.push(0);
+ }
+ else if (entity.isTyreBurst(45, false)) {
+ Status.push(1);
+ }
+ else {
+ Status.push(2);
+ }
+
+ if (!entity.isTyreBurst(47, false)) {
+ Status.push(0);
+ }
+ else if (entity.isTyreBurst(47, false)) {
+ Status.push(1);
+ }
+ else {
+ Status.push(2);
+ }
+
+ mp.events.callRemote("VehStream_SetWheelData", entity, Status[0], Status[1], Status[2], Status[3], Status[4], Status[5], Status[6], Status[7], Status[8], Status[9]);
+ }, 2500);
+ });
+
+ mp.events.add("VehStream_PlayerEnterVehicleAttempt", (entity, seat) => {
+ entity = mp.vehicles.atRemoteId(entity);
+ if (entity === undefined || entity === null || !entity.isAVehicle()) return;
+ setTimeout(() => {
+ var Status = [];
+ let y = 0;
+ for (y = 0; y < 8; y++) {
+ if (entity.isDoorDamaged(y)) {
+ Status.push(2);
+ }
+ else if (entity.getDoorAngleRatio(y) > 0.15) {
+ Status.push(1);
+ }
+ else {
+ Status.push(0);
+ }
+ }
+ //mp.events.callRemote("VehStream_SetDoorData", entity, Status[0], Status[1], Status[2], Status[3], Status[4], Status[5], Status[6], Status[7]);
+
+ Status = [];
+ if (entity.isWindowIntact(0)) {
+ if (entity.getBoneIndexByName("window_rf") === -1) {
+ Status.push(1);
+ }
+ else {
+ Status.push(0);
+ }
+ }
+ else {
+ Status.push(2);
+ }
+ if (entity.isWindowIntact(1)) {
+ if (entity.getBoneIndexByName("window_lf") === -1) {
+ Status.push(1);
+ }
+ else {
+ Status.push(0);
+ }
+ }
+ else {
+ Status.push(2);
+ }
+ if (entity.isWindowIntact(2)) {
+ if (entity.getBoneIndexByName("window_rr") === -1) {
+ Status.push(1);
+ }
+ else {
+ Status.push(0);
+ }
+ }
+ else {
+ Status.push(2);
+ }
+ if (entity.isWindowIntact(3)) {
+ if (entity.getBoneIndexByName("window_lr") === -1) {
+ Status.push(1);
+ }
+ else {
+ Status.push(0);
+ }
+ }
+ else {
+ Status.push(2);
+ }
+ mp.events.callRemote("VehStream_SetWindowData", entity, Status[0], Status[1], Status[2], Status[3]);
+ }, 3000);
+ });
+
+ mp.events.add("VehStream_SetVehicleDirtLevel", (entity, dirt) => {
+ if (entity === undefined || entity === null || !entity.isAVehicle()) return;
+ if (entity !== undefined) {
+ entity.setDirtLevel(dirt);
+ }
+ });
+
+ mp.events.add("VehStream_SetVehicleDoorStatus_Single", (veh, door, state) => {
+ if (veh === undefined || veh === null || !veh.isAVehicle()) return;
+ if (veh !== undefined) {
+ if (state === 0) {
+ veh.setDoorShut(door, false);
+ }
+ else if (state === 1) {
+ veh.setDoorOpen(door, false, false);
+ }
+ else {
+ veh.setDoorBroken(door, true);
+ }
+ }
+ });
+
+ mp.events.add("VehStream_SetVehicleDoorStatus", (...args) => {
+ if (args[0] !== undefined && args[0] !== null || !args[0].isAVehicle()) {
+ let y = 0;
+ for (y = 1; y < args.length; y++) {
+ if (args[y] === 0) {
+ args[0].setDoorShut(y - 1, false);
+ }
+ else if (args[y] === 1) {
+ args[0].setDoorOpen(y - 1, false, false);
+ }
+ else {
+ args[0].setDoorBroken(y - 1, true);
+ }
+ }
+ }
+ });
+
+ mp.events.add("VehStream_SetVehicleWindowStatus_Single", (veh, windw, state) => {
+ if (veh === undefined || veh === null || !veh.isAVehicle()) return;
+ if (veh !== undefined) {
+ if (state === 1) {
+ veh.rollDownWindow(windw);
+ }
+ else if (state === 0) {
+ veh.fixWindow(windw);
+ veh.rollUpWindow(windw);
+ }
+ else {
+ veh.smashWindow(windw);
+ }
+ }
+ });
+
+ mp.events.add("VehStream_SetVehicleWindowStatus", (...args) => {
+ if (args[0] !== undefined && args[0] !== null || !args[0].isAVehicle()) {
+ let y = 0;
+ for (y = 1; y < 4; y++) {
+ if (args[y] === 1) {
+ args[0].rollDownWindow(y - 1);
+ }
+ else if (args[y] === 0) {
+ args[0].fixWindow(y - 1);
+ args[0].rollUpWindow(y - 1);
+ }
+ else {
+ args[0].smashWindow(y - 1);
+ }
+ }
+ }
+ });
+
+ mp.events.add("VehStream_SetVehicleWheelStatus_Single", (veh, wheel, state) => {
+ if (veh === undefined || veh === null || !veh.isAVehicle()) return;
+ if (veh !== undefined) {
+ if (wheel === 9) {
+ if (state === 1) {
+ veh.setTyreBurst(45, false, 1000);
+ }
+ else if (state === 0) {
+ veh.setTyreFixed(45);
+ }
+ else {
+ veh.setTyreBurst(45, true, 1000);
+ }
+ }
+ else if (wheel === 10) {
+ if (state === 1) {
+ veh.setTyreBurst(47, false, 1000);
+ }
+ else if (state === 0) {
+ veh.setTyreFixed(47);
+ }
+ else {
+ veh.setTyreBurst(47, true, 1000);
+ }
+ }
+ else {
+ if (state === 1) {
+ veh.setTyreBurst(wheel, false, 1000);
+ }
+ else if (state === 0) {
+ veh.setTyreFixed(wheel);
+ }
+ else {
+ veh.setTyreBurst(wheel, true, 1000);
+ }
+ }
+ }
+ });
+
+ mp.events.add("VehStream_SetVehicleWheelStatus", (...args) => {
+ if (args[0] !== undefined && args[0] !== null || !args[0].isAVehicle()) {
+ let y = 0;
+ for (y = 1; y < args.length; y++) {
+ if (y === 9) {
+ if (args[y] === 1) {
+ args[0].setTyreBurst(45, false, 1000);
+ }
+ else if (args[y] === 0) {
+ args[0].setTyreFixed(45);
+ }
+ else {
+ args[0].setTyreBurst(45, true, 1000);
+ }
+ }
+ else if (y === 10) {
+ if (args[y] === 1) {
+ args[0].setTyreBurst(47, false, 1000);
+ }
+ else if (args[y] === 0) {
+ args[0].setTyreFixed(47);
+ }
+ else {
+ args[0].setTyreBurst(47, true, 1000);
+ }
+ }
+ else {
+ if (args[y] === 1) {
+ args[0].setTyreBurst(y - 1, false, 1000);
+ }
+ else if (args[y] === 0) {
+ args[0].setTyreFixed(y - 1);
+ }
+ else {
+ args[0].setTyreBurst(y - 1, true, 1000);
+ }
+ }
+ }
+ }
+ });
+
+ //Sync data on stream in
+ mp.events.add("entityStreamIn", (entity) => {
+ if (entity === undefined || entity === null || !entity.isAVehicle()) return;
+ if (entity.type === "vehicle") {
+ let typeor = typeof entity.getVariable('VehicleSyncData');
+ let actualData = entity.getVariable('VehicleSyncData');
+
+ //Needed to stop vehicles from freaking out
+ mp.game.streaming.requestCollisionAtCoord(entity.position.x, entity.position.y, entity.position.z);
+ //mp.game.invoke('0x199640F55E0F7596', entity.position.x, entity.position.y, entity.position.z);
+ entity.setLoadCollisionFlag(true);
+ entity.trackVisibility();
+
+ if (typeor !== 'undefined' && entity.isSeatFree(-1)) //Only if there is no driver
+ {
+ entity.position = actualData.Position;
+ entity.rotation = actualData.Rotation;
+ }
+
+ //Set doors unbreakable for a moment
+ let x = 0;
+ for (x = 0; x < 8; x++) {
+ entity.setDoorBreakable(x, false);
+ }
+
+ //Do it anyway
+ entity.setUndriveable(true);
+
+ if (typeor !== 'undefined') {
+ entity.setEngineOn(actualData.Engine, true, false);
+ entity.setUndriveable(true);
+
+ if (actualData.Locked)
+ entity.setDoorsLocked(2);
+ else
+ entity.setDoorsLocked(1);
+
+ entity.setDirtLevel(actualData.Dirt);
+
+ for (x = 0; x < 8; x++) {
+ if (actualData.Door[x] === 1)
+ entity.setDoorOpen(x, false, false);
+ else if (actualData.Door[x] === 0)
+ entity.setDoorShut(x, true);
+ else
+ entity.setDoorBroken(x, true);
+ }
+
+ for (x = 0; x < 4; x++) {
+ if (actualData.Window[x] === 0) {
+ entity.fixWindow(x);
+ }
+ else if (actualData.Window[x] === 1) {
+ entity.rollDownWindow(x);
+ }
+ else {
+ entity.smashWindow(x);
+ }
+ }
+
+ for (x = 0; x < 8; x++) {
+ if (actualData.Wheel[x] === 0) {
+ entity.setTyreFixed(x);
+ }
+ else if (actualData.Wheel[x] === 1) {
+ entity.setTyreBurst(x, false, 0);
+ }
+ else {
+ entity.setTyreBurst(x, true, 1000);
+ }
+ }
+
+ //For trailer mid wheels
+ if (actualData.Wheel[8] === 0) {
+ entity.setTyreFixed(45);
+ }
+ else if (actualData.Wheel[8] === 1) {
+ entity.setTyreBurst(45, false, 0);
+ }
+ else {
+ entity.setTyreBurst(45, true, 1000);
+ }
+
+ if (actualData.Wheel[9] === 0) {
+ entity.setTyreFixed(47);
+ }
+ else if (actualData.Wheel[9] === 1) {
+ entity.setTyreBurst(47, false, 0);
+ }
+ else {
+ entity.setTyreBurst(47, true, 1000);
+ }
+ }
+
+ //Make doors breakable again
+ setTimeout(() => {
+ for (x = 0; x < 8; x++) {
+ entity.setDoorBreakable(x, true);
+ }
+ }, 1500);
+ }
+ });
+}
\ No newline at end of file
diff --git a/ReallifeGamemode.Client/webpack.config.js b/ReallifeGamemode.Client/webpack.config.js
index cbbcc35c..81f8c7cf 100644
--- a/ReallifeGamemode.Client/webpack.config.js
+++ b/ReallifeGamemode.Client/webpack.config.js
@@ -4,7 +4,7 @@ module.exports = {
mode: 'production',
entry: './index.ts',
output: {
- path: path.resolve(__dirname),
+ path: path.resolve(__dirname, '..', '..', 'client_packages'),
filename: 'index.js'
},
module: {
@@ -15,7 +15,12 @@ module.exports = {
},
{
test: /\.ts$/,
- use: { loader: 'ts-loader' }
+ use: {
+ loader: 'ts-loader',
+ options: {
+ allowTsInNodeModules: true
+ }
+ }
}
]
},
diff --git a/ReallifeGamemode.Server/Events/Login.cs b/ReallifeGamemode.Server/Events/Login.cs
index 9d0bda6a..5773d589 100644
--- a/ReallifeGamemode.Server/Events/Login.cs
+++ b/ReallifeGamemode.Server/Events/Login.cs
@@ -57,22 +57,23 @@ namespace ReallifeGamemode.Server.Events
var userItems = loginUser.UserItems.ToList().FindAll(u => u.UserId == user.Id);
player.SetData("items", userItems);
- if (user.CharacterId == null)
- {
- var currentPlayerCreatorDimension = (uint)NAPI.Data.GetWorldData("playerCreatorDimension");
- currentPlayerCreatorDimension++;
- NAPI.Data.SetWorldData("playerCreatorDimension", currentPlayerCreatorDimension);
- player.Dimension = NAPI.Data.GetWorldData("playerCreatorDimension");
- player.Position = new Vector3(402.8664, -996.4108, -99.00027);
- player.TriggerEvent("toggleCreator");
- }
- else
- {
- CharacterCreator.ApplyCharacter(player);
- UpdateCharacterCloth.LoadCharacterDefaults(player);
- NAPI.Player.SpawnPlayer(player, new Vector3(user.PositionX, user.PositionY, user.PositionZ), 0);
- player.TriggerEvent("draw", player.Name, player.Handle.Value);
- }
+ //if (user.CharacterId == null)
+ //{
+ // var currentPlayerCreatorDimension = (uint)NAPI.Data.GetWorldData("playerCreatorDimension");
+ // currentPlayerCreatorDimension++;
+ // NAPI.Data.SetWorldData("playerCreatorDimension", currentPlayerCreatorDimension);
+ // player.Dimension = NAPI.Data.GetWorldData("playerCreatorDimension");
+ // player.Position = new Vector3(402.8664, -996.4108, -99.00027);
+ // player.TriggerEvent("toggleCreator");
+ //}
+ //else
+ //{
+ CharacterCreator.ApplyCharacter(player);
+ UpdateCharacterCloth.LoadCharacterDefaults(player);
+ NAPI.Player.SpawnPlayer(player, new Vector3(user.PositionX, user.PositionY, user.PositionZ), 0);
+ //}
+
+ player.TriggerEvent("draw", player.Name, player.Handle.Value);
if (user.Dead == true)
{
if (user.IsAdmin(AdminLevel.ADMIN) == true)
diff --git a/ReallifeGamemode.Server/Events/Register.cs b/ReallifeGamemode.Server/Events/Register.cs
index b9f82854..1665df5d 100644
--- a/ReallifeGamemode.Server/Events/Register.cs
+++ b/ReallifeGamemode.Server/Events/Register.cs
@@ -45,11 +45,14 @@ namespace ReallifeGamemode.Server.Events
player.SetData("isLoggedIn", true);
player.SetData("isDead", false);
- var currentPlayerCreatorDimension = (uint) NAPI.Data.GetWorldData("playerCreatorDimension");
- currentPlayerCreatorDimension++;
- NAPI.Data.SetWorldData("playerCreatorDimension", currentPlayerCreatorDimension);
- player.Dimension = NAPI.Data.GetWorldData("playerCreatorDimension");
- player.TriggerEvent("toggleCreator");
+ //var currentPlayerCreatorDimension = (uint) NAPI.Data.GetWorldData("playerCreatorDimension");
+ //currentPlayerCreatorDimension++;
+ //NAPI.Data.SetWorldData("playerCreatorDimension", currentPlayerCreatorDimension);
+ //player.Dimension = NAPI.Data.GetWorldData("playerCreatorDimension");
+ //player.TriggerEvent("toggleCreator");
+
+ player.Position = new Vector3(user.PositionX, user.PositionY, user.PositionZ);
+
}
else if (dbContext.Users.Where(u => u.SocialClubName == player.SocialClubName).Count() >= 3)
{