diff --git a/ReallifeGamemode.Client/CharCreator/surgery.ts b/ReallifeGamemode.Client/CharCreator/surgery.ts
new file mode 100644
index 00000000..3e54f44c
--- /dev/null
+++ b/ReallifeGamemode.Client/CharCreator/surgery.ts
@@ -0,0 +1,590 @@
+import * as NativeUI from '../libs/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 Font = NativeUI.Font;
+var screenRes = mp.game.graphics.getScreenResolution(0, 0);
+
+const creatorCoords = {
+ camera: new mp.Vector3(265.6026, -1340.2378, 25.000),
+ cameraLookAt: new mp.Vector3(266.472, -1339.1357, 25.000)
+};
+
+const localPlayer = mp.players.local;
+
+export default function charSurgery(globalData: IGlobalData) {
+
+ 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;
+ let creatorMenus: NativeUI.Menu[] = [];
+ let creatorCamera: CameraMp;
+
+ // 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("Chirurg", "", new Point(0, screenRes.y / 3), 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 5:
+ 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);
+ creatorCamera.destroy(true);
+ mp.events.callRemote("SaveSurgery", currentGender, JSON.stringify(parentData), JSON.stringify(featureData), JSON.stringify(appearanceData));
+ globalData.InMenu = false;
+ globalData.InMenu = false;
+ break;
+
+ case 6:
+ leaveCreator();
+ break;
+ }
+ });
+
+ creatorMainMenu.MenuClose.on(() => {
+ leaveCreator();
+ });
+
+ function leaveCreator() {
+ mp.gui.chat.show(true);
+ mp.game.ui.displayRadar(true);
+ mp.game.ui.displayHud(true);
+ localPlayer.freezePosition(false);
+ mp.game.cam.renderScriptCams(false, false, 0, true, false);
+ creatorCamera.destroy(true);
+ mp.events.callRemote("surgeryLeave");
+ globalData.InMenu = false;
+ globalData.InMenu = false;
+ }
+
+ 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(0, screenRes.y / 3), 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(0, screenRes.y / 3), 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(0, screenRes.y / 3), 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(0, screenRes.y / 3), 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 0: // eyebrow color
+ localPlayer.setHeadOverlayColor(2, 1, listIndex, 0);
+ break;
+
+ case 1: // facial hair color
+ localPlayer.setHeadOverlayColor(1, 1, listIndex, 0);
+ break;
+
+ case 2: // eye color
+ localPlayer.setEyeColor(listIndex);
+ break;
+
+ case 3: // blush color
+ localPlayer.setHeadOverlayColor(5, 2, listIndex, 0);
+ break;
+
+ case 4: // lipstick color
+ localPlayer.setHeadOverlayColor(8, 2, listIndex, 0);
+ break;
+
+ case 5: // 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("toggleSurgery", () => {
+ if (!mp.cameras.exists(creatorCamera)) {
+ creatorCamera = mp.cameras.new("creatorCamera", creatorCoords.camera, new mp.Vector3(0, 0, 0), 45);
+ creatorCamera.pointAtCoord(creatorCoords.cameraLookAt.x, creatorCoords.cameraLookAt.y, creatorCoords.cameraLookAt.z);
+ creatorCamera.setActive(true);
+
+ globalData.InMenu = true;
+ globalData.InMenu = 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/index.ts b/ReallifeGamemode.Client/index.ts
index c2b161ab..65c42c54 100644
--- a/ReallifeGamemode.Client/index.ts
+++ b/ReallifeGamemode.Client/index.ts
@@ -268,6 +268,9 @@ antiAfk(globalData);
import ammunation from './Interaction/ammunation/ammunation';
ammunation(globalData);
+import charSurgery from './CharCreator/surgery';
+charSurgery(globalData);
+
import spawnschutz from './Player/spawnschutz';
spawnschutz();
diff --git a/ReallifeGamemode.Database/Entities/User.cs b/ReallifeGamemode.Database/Entities/User.cs
index c4b76095..197224eb 100644
--- a/ReallifeGamemode.Database/Entities/User.cs
+++ b/ReallifeGamemode.Database/Entities/User.cs
@@ -127,6 +127,8 @@ namespace ReallifeGamemode.Database.Entities
public int warn { get; set; } = 0;
+ public bool FreeSurgery { get; set; } = true;
+
[NotMapped]
public Player Player
{
diff --git a/ReallifeGamemode.Database/Migrations/20210420165544_Surgery.Designer.cs b/ReallifeGamemode.Database/Migrations/20210420165544_Surgery.Designer.cs
new file mode 100644
index 00000000..3fe278b4
--- /dev/null
+++ b/ReallifeGamemode.Database/Migrations/20210420165544_Surgery.Designer.cs
@@ -0,0 +1,2176 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using ReallifeGamemode.Database.Models;
+
+namespace ReallifeGamemode.Database.Migrations
+{
+ [DbContext(typeof(DatabaseContext))]
+ [Migration("20210420165544_Surgery")]
+ partial class Surgery
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "3.1.3")
+ .HasAnnotation("PropertyAccessMode", PropertyAccessMode.PreferFieldDuringConstruction)
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.ATM", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Active")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Balance")
+ .HasColumnType("int");
+
+ b.Property("Faulty")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("X")
+ .HasColumnType("float");
+
+ b.Property("Y")
+ .HasColumnType("float");
+
+ b.Property("Z")
+ .HasColumnType("float");
+
+ b.HasKey("Id");
+
+ b.ToTable("ATMs");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Applied")
+ .HasColumnType("int");
+
+ b.Property("BannedBy")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("Reason")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("UntilDateTime")
+ .HasColumnType("int");
+
+ b.Property("UserId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("Bans");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoute", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.HasKey("Id");
+
+ b.ToTable("BusRoutes");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("BusRouteId")
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("X")
+ .HasColumnType("float");
+
+ b.Property("Y")
+ .HasColumnType("float");
+
+ b.Property("Z")
+ .HasColumnType("float");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BusRouteId");
+
+ b.ToTable("BusRoutesPoints");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessBankAccount", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Balance")
+ .HasColumnType("int");
+
+ b.Property("BusinessId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BusinessId")
+ .IsUnique();
+
+ b.ToTable("BusinessBankAccounts");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusinessData", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("BusinessId")
+ .HasColumnType("int");
+
+ b.Property("Price")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("BusinessData");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Ageing")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("AgeingOpacity")
+ .HasColumnType("float");
+
+ b.Property("BeardColor")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Blemishes")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("BlemishesOpacity")
+ .HasColumnType("float");
+
+ b.Property("Blush")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("BlushColor")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("BlushOpacity")
+ .HasColumnType("float");
+
+ b.Property("BrowDepth")
+ .HasColumnType("float");
+
+ b.Property("BrowHeight")
+ .HasColumnType("float");
+
+ b.Property("CheekDepth")
+ .HasColumnType("float");
+
+ b.Property("CheekboneHeight")
+ .HasColumnType("float");
+
+ b.Property("CheekboneWidth")
+ .HasColumnType("float");
+
+ b.Property("ChestHair")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("ChestHairColor")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("ChestHairOpacity")
+ .HasColumnType("float");
+
+ b.Property("ChinDepth")
+ .HasColumnType("float");
+
+ b.Property("ChinHeight")
+ .HasColumnType("float");
+
+ b.Property("ChinIndent")
+ .HasColumnType("float");
+
+ b.Property("ChinWidth")
+ .HasColumnType("float");
+
+ b.Property("Complexion")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("ComplexionOpacity")
+ .HasColumnType("float");
+
+ b.Property("EyeColor")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("EyeSize")
+ .HasColumnType("float");
+
+ b.Property("EyebrowColor")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Eyebrows")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("EyebrowsOpacity")
+ .HasColumnType("float");
+
+ b.Property("FacialHair")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("FacialHairOpacity")
+ .HasColumnType("float");
+
+ b.Property("Father")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Freckles")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("FrecklesOpacity")
+ .HasColumnType("float");
+
+ b.Property("Gender")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Hair")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("HairColor")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("HairHighlightColor")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("JawShape")
+ .HasColumnType("float");
+
+ b.Property("JawWidth")
+ .HasColumnType("float");
+
+ b.Property("LipThickness")
+ .HasColumnType("float");
+
+ b.Property("Lipstick")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("LipstickColor")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("LipstickOpacity")
+ .HasColumnType("float");
+
+ b.Property("Makeup")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("MakeupOpacity")
+ .HasColumnType("float");
+
+ b.Property("Mother")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("NeckWidth")
+ .HasColumnType("float");
+
+ b.Property("NoseBottomHeight")
+ .HasColumnType("float");
+
+ b.Property("NoseBridgeDepth")
+ .HasColumnType("float");
+
+ b.Property("NoseBroken")
+ .HasColumnType("float");
+
+ b.Property("NoseTipHeight")
+ .HasColumnType("float");
+
+ b.Property("NoseTipLength")
+ .HasColumnType("float");
+
+ b.Property("NoseWidth")
+ .HasColumnType("float");
+
+ b.Property("Similarity")
+ .HasColumnType("float");
+
+ b.Property("SkinSimilarity")
+ .HasColumnType("float");
+
+ b.Property("SunDamage")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("SunDamageOpacity")
+ .HasColumnType("float");
+
+ b.Property("UserId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("Characters");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("ClothId")
+ .HasColumnType("int");
+
+ b.Property("Duty")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("SlotId")
+ .HasColumnType("int");
+
+ b.Property("SlotType")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Texture")
+ .HasColumnType("int");
+
+ b.Property("UserId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("CharacterClothes");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.ClothCombination", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Gender")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Top")
+ .HasColumnType("int");
+
+ b.Property("Torso")
+ .HasColumnType("int");
+
+ b.Property("Undershirt")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("ClothCombinations");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Category")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("FactionId")
+ .HasColumnType("int");
+
+ b.Property("Locked")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Model")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("Radius")
+ .HasColumnType("float");
+
+ b.Property("X")
+ .HasColumnType("float");
+
+ b.Property("Y")
+ .HasColumnType("float");
+
+ b.Property("Z")
+ .HasColumnType("float");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FactionId");
+
+ b.ToTable("Doors");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("ClothId")
+ .HasColumnType("int");
+
+ b.Property("FactionId")
+ .HasColumnType("int");
+
+ b.Property("Gender")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("SlotId")
+ .HasColumnType("int");
+
+ b.Property("SlotType")
+ .HasColumnType("tinyint unsigned");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FactionId");
+
+ b.ToTable("DutyClothes");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("BankAccountId")
+ .HasColumnType("int");
+
+ b.Property("GangOwned")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Name")
+ .HasColumnType("varchar(32) CHARACTER SET utf8mb4")
+ .HasMaxLength(32);
+
+ b.Property("StateOwned")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("WeaponDealTime")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BankAccountId");
+
+ b.ToTable("Factions");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionBankAccount", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Active")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Balance")
+ .HasColumnType("int");
+
+ b.Property("Bic")
+ .HasColumnType("varchar(12) CHARACTER SET utf8mb4")
+ .HasMaxLength(12);
+
+ b.Property("Iban")
+ .HasColumnType("varchar(32) CHARACTER SET utf8mb4")
+ .HasMaxLength(32);
+
+ b.HasKey("Id");
+
+ b.ToTable("FactionBankAccounts");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("FactionId")
+ .HasColumnType("int");
+
+ b.Property("Order")
+ .HasColumnType("int");
+
+ b.Property("RankName")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FactionId");
+
+ b.ToTable("FactionRanks");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Ammount")
+ .HasColumnType("int");
+
+ b.Property("FactionId")
+ .HasColumnType("int");
+
+ b.Property("Rank")
+ .HasColumnType("int");
+
+ b.Property("SlotID")
+ .HasColumnType("int");
+
+ b.Property("WeaponModel")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FactionId");
+
+ b.ToTable("FactionWeapons");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.GotoPoint", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Active")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Description")
+ .HasColumnType("varchar(32) CHARACTER SET utf8mb4")
+ .HasMaxLength(32);
+
+ b.Property("X")
+ .HasColumnType("float");
+
+ b.Property("Y")
+ .HasColumnType("float");
+
+ b.Property("Z")
+ .HasColumnType("float");
+
+ b.HasKey("Id");
+
+ b.ToTable("GotoPoints");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("BankAccountId")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BankAccountId");
+
+ b.ToTable("Groups");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupBankAccount", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Balance")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("GroupBankAccounts");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("BankAccountId")
+ .HasColumnType("int");
+
+ b.Property("CanRentIn")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("LastRentSetTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("OwnerId")
+ .HasColumnType("int");
+
+ b.Property("Price")
+ .HasColumnType("int");
+
+ b.Property("RentalFee")
+ .HasColumnType("int");
+
+ b.Property("Type")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("X")
+ .HasColumnType("float");
+
+ b.Property("Y")
+ .HasColumnType("float");
+
+ b.Property("Z")
+ .HasColumnType("float");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BankAccountId");
+
+ b.HasIndex("OwnerId");
+
+ b.ToTable("Houses");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseBankAccount", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Balance")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.ToTable("HouseBankAccounts");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("HouseId")
+ .HasColumnType("int");
+
+ b.Property("UserId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("HouseId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("HouseRentals");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Interior", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("EnterPositionStr")
+ .HasColumnName("EnterPosition")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("ExitPositionStr")
+ .HasColumnName("ExitPosition")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("Name")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.HasKey("Id");
+
+ b.ToTable("Interiors");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Location", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Description")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("Heading")
+ .HasColumnType("double");
+
+ b.Property("X")
+ .HasColumnType("double");
+
+ b.Property("Y")
+ .HasColumnType("double");
+
+ b.Property("Z")
+ .HasColumnType("double");
+
+ b.HasKey("Id");
+
+ b.ToTable("Locations");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.BankAccountTransactionHistory", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Fee")
+ .HasColumnType("int");
+
+ b.Property("MoneySent")
+ .HasColumnType("int");
+
+ b.Property("NewReceiverBalance")
+ .HasColumnType("int");
+
+ b.Property("NewSenderBalance")
+ .HasColumnType("int");
+
+ b.Property("Origin")
+ .HasColumnType("varchar(32) CHARACTER SET utf8mb4")
+ .HasMaxLength(32);
+
+ b.Property("Receiver")
+ .HasColumnType("varchar(32) CHARACTER SET utf8mb4")
+ .HasMaxLength(32);
+
+ b.Property("ReceiverBalance")
+ .HasColumnType("int");
+
+ b.Property("Sender")
+ .HasColumnType("varchar(32) CHARACTER SET utf8mb4")
+ .HasMaxLength(32);
+
+ b.Property("SenderBalance")
+ .HasColumnType("int");
+
+ b.Property("Timestamp")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("datetime(6)");
+
+ b.HasKey("Id");
+
+ b.ToTable("BankAccountTransactionLogs");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ b.Property("Discriminator")
+ .IsRequired()
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("Text")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("Time")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("datetime(6)");
+
+ b.Property("UserId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("ChatLogs");
+
+ b.HasDiscriminator("Discriminator").HasValue("ChatLogEntry");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ b.Property("Command")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("Time")
+ .HasColumnType("datetime(6)");
+
+ b.Property("UserId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("CommandLogs");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("CauseOfDeath")
+ .HasColumnType("varchar(64) CHARACTER SET utf8mb4")
+ .HasMaxLength(64);
+
+ b.Property("KillerHeading")
+ .HasColumnType("float");
+
+ b.Property("KillerId")
+ .HasColumnType("int");
+
+ b.Property("KillerPositionX")
+ .HasColumnType("float");
+
+ b.Property("KillerPositionY")
+ .HasColumnType("float");
+
+ b.Property("KillerPositionZ")
+ .HasColumnType("float");
+
+ b.Property("Timestamp")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("datetime(6)");
+
+ b.Property("VictimHeading")
+ .HasColumnType("float");
+
+ b.Property("VictimId")
+ .HasColumnType("int");
+
+ b.Property("VictimPositionX")
+ .HasColumnType("float");
+
+ b.Property("VictimPositionY")
+ .HasColumnType("float");
+
+ b.Property("VictimPositionZ")
+ .HasColumnType("float");
+
+ b.HasKey("Id");
+
+ b.HasIndex("KillerId");
+
+ b.HasIndex("VictimId");
+
+ b.ToTable("DeathLogs");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.LoginLogoutLogEntry", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ b.Property("IpAddress")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("LoginLogout")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("PlayerId")
+ .HasColumnType("bigint");
+
+ b.Property("SocialClubName")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("Time")
+ .HasColumnType("datetime(6)");
+
+ b.Property("UserId")
+ .HasColumnType("int");
+
+ b.Property("Username")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("LoginLogoutLogs");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Active")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Caption")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("Content")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("Timestamp")
+ .HasColumnType("int");
+
+ b.Property("UserId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("News");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedBlip", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Active")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Alpha")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Color")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Dimension")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("DrawDistance")
+ .HasColumnType("float");
+
+ b.Property("Name")
+ .HasColumnType("longtext CHARACTER SET utf8mb4");
+
+ b.Property("PositionX")
+ .HasColumnType("float");
+
+ b.Property("PositionY")
+ .HasColumnType("float");
+
+ b.Property("PositionZ")
+ .HasColumnType("float");
+
+ b.Property("Rotation")
+ .HasColumnType("float");
+
+ b.Property("Scale")
+ .HasColumnType("float");
+
+ b.Property("ShortRange")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("Sprite")
+ .HasColumnType("smallint");
+
+ b.HasKey("Id");
+
+ b.ToTable("Blips");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedMarker", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Active")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("ColorA")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("ColorB")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("ColorG")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("ColorR")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Dimension")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("DirectionX")
+ .HasColumnType("float");
+
+ b.Property("DirectionY")
+ .HasColumnType("float");
+
+ b.Property("DirectionZ")
+ .HasColumnType("float");
+
+ b.Property("PositionX")
+ .HasColumnType("float");
+
+ b.Property("PositionY")
+ .HasColumnType("float");
+
+ b.Property("PositionZ")
+ .HasColumnType("float");
+
+ b.Property("RotationX")
+ .HasColumnType("float");
+
+ b.Property("RotationY")
+ .HasColumnType("float");
+
+ b.Property("RotationZ")
+ .HasColumnType("float");
+
+ b.Property("Scale")
+ .HasColumnType("float");
+
+ b.Property("Type")
+ .HasColumnType("tinyint unsigned");
+
+ b.Property("Visible")
+ .HasColumnType("tinyint(1)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Markers");
+ });
+
+ modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPed", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ b.Property("Active")
+ .HasColumnType("tinyint(1)");
+
+ b.Property