From 922acd6847be9ac67b1cec9429bc0fdba032259c Mon Sep 17 00:00:00 2001 From: VegaZ Date: Thu, 22 Apr 2021 22:24:27 +0200 Subject: [PATCH 01/20] Init commit surgery branch --- .../CharCreator/surgery.ts | 590 +++++ ReallifeGamemode.Client/index.ts | 3 + ReallifeGamemode.Database/Entities/User.cs | 2 + .../20210420165544_Surgery.Designer.cs | 2176 +++++++++++++++++ .../Migrations/20210420165544_Surgery.cs | 110 + .../DatabaseContextModelSnapshot.cs | 3 + ReallifeGamemode.Server/Events/Key.cs | 4 + .../Managers/CharacterCreator.cs | 112 + 8 files changed, 3000 insertions(+) create mode 100644 ReallifeGamemode.Client/CharCreator/surgery.ts create mode 100644 ReallifeGamemode.Database/Migrations/20210420165544_Surgery.Designer.cs create mode 100644 ReallifeGamemode.Database/Migrations/20210420165544_Surgery.cs 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("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("HashModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Peds"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedPickup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("Dimension") + .HasColumnType("tinyint unsigned"); + + b.Property("PositionX") + .HasColumnType("float") + .HasMaxLength(128); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RespawnTime") + .HasColumnType("int"); + + b.Property("RotationX") + .HasColumnType("float"); + + b.Property("RotationY") + .HasColumnType("float"); + + b.Property("RotationZ") + .HasColumnType("float"); + + b.Property("Vehicle") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Pickups"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedTextLabel", 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("DrawDistance") + .HasColumnType("float"); + + b.Property("Font") + .HasColumnType("tinyint unsigned"); + + b.Property("LOS") + .HasColumnType("tinyint(1)"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("Text") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("TextLabels"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVariable", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Variable") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ServerVariables"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ServerVehicle", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Active") + .ValueGeneratedOnAdd() + .HasColumnType("tinyint(1)") + .HasDefaultValue(true); + + b.Property("Discriminator") + .IsRequired() + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("DistanceDriven") + .HasColumnType("float"); + + b.Property("Heading") + .HasColumnType("float"); + + b.Property("Livery") + .HasColumnType("int"); + + b.Property("Locked") + .HasColumnType("tinyint(1)"); + + b.Property("Model") + .HasColumnType("int unsigned"); + + b.Property("NumberPlate") + .HasColumnType("varchar(8) CHARACTER SET utf8mb4") + .HasMaxLength(8); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("PrimaryColor") + .HasColumnType("int"); + + b.Property("SecondaryColor") + .HasColumnType("int"); + + b.Property("TankAmount") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("ServerVehicles"); + + b.HasDiscriminator("Discriminator").HasValue("ServerVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopClothe", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("int"); + + b.Property("ClotheId") + .HasColumnType("int"); + + b.Property("ComponentId") + .HasColumnType("int"); + + b.Property("Gender") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("TypeId") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("ShopClothes"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.Property("ShopId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("ShopItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.TuningGarage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.Property("Z") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("TuningGarages"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Turfs", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Color") + .HasColumnType("int"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("MaxValue") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Owner") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("Range") + .HasColumnType("float"); + + b.Property("Rotation") + .HasColumnType("float"); + + b.Property("Surplus") + .HasColumnType("tinyint(1)"); + + b.Property("Value") + .HasColumnType("int"); + + b.Property("Vector") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.Property("X") + .HasColumnType("float"); + + b.Property("Y") + .HasColumnType("float"); + + b.HasKey("Id"); + + b.ToTable("Turfs"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("AdminLevel") + .HasColumnType("int"); + + b.Property("BanId") + .HasColumnType("int"); + + b.Property("BankAccountId") + .HasColumnType("int"); + + b.Property("BusSkill") + .HasColumnType("int"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("CharacterId") + .HasColumnType("int"); + + b.Property("Dead") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseBike") + .HasColumnType("tinyint(1)"); + + b.Property("DriverLicenseVehicle") + .HasColumnType("tinyint(1)"); + + b.Property("Email") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("FactionId") + .HasColumnType("int"); + + b.Property("FactionLeader") + .HasColumnType("tinyint(1)"); + + b.Property("FactionRankId") + .HasColumnType("int"); + + b.Property("FlyingLicensePlane") + .HasColumnType("tinyint(1)"); + + b.Property("FreeSurgery") + .HasColumnType("tinyint(1)"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.Property("GroupRank") + .HasColumnType("int"); + + b.Property("Handmoney") + .HasColumnType("int"); + + b.Property("HouseId") + .HasColumnType("int"); + + b.Property("JailTime") + .HasColumnType("int"); + + b.Property("JobId") + .HasColumnType("int"); + + b.Property("LogUserId") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Password") + .HasColumnType("varchar(64) CHARACTER SET utf8mb4") + .HasMaxLength(64); + + b.Property("PaydayTimer") + .HasColumnType("int"); + + b.Property("PilotSkill") + .HasColumnType("int"); + + b.Property("PlayedMinutes") + .HasColumnType("int"); + + b.Property("Points") + .HasColumnType("int"); + + b.Property("PositionX") + .HasColumnType("float"); + + b.Property("PositionY") + .HasColumnType("float"); + + b.Property("PositionZ") + .HasColumnType("float"); + + b.Property("RegistrationDate") + .ValueGeneratedOnAdd() + .HasColumnType("datetime(6)"); + + b.Property("SocialClubName") + .HasColumnType("varchar(32) CHARACTER SET utf8mb4") + .HasMaxLength(32); + + b.Property("Wage") + .HasColumnType("int"); + + b.Property("Wanteds") + .HasColumnType("int"); + + b.Property("WeaponLicense") + .HasColumnType("tinyint(1)"); + + b.Property("failpoints") + .HasColumnType("int"); + + b.Property("otheramount") + .HasColumnType("int"); + + b.Property("trashcount") + .HasColumnType("int"); + + b.Property("warn") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("BanId"); + + b.HasIndex("BankAccountId"); + + b.HasIndex("BusinessId") + .IsUnique(); + + b.HasIndex("CharacterId"); + + b.HasIndex("FactionId"); + + b.HasIndex("FactionRankId"); + + b.HasIndex("GroupId"); + + b.HasIndex("HouseId"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserBankAccount", 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("UserBankAccounts"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("UserItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserWeapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammo") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("WeaponId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.HasIndex("WeaponId"); + + b.ToTable("UserWeapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Amount") + .HasColumnType("int"); + + b.Property("ItemId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.Property("VehicleId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("VehicleId"); + + b.ToTable("VehicleItems"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("ModId") + .HasColumnType("int"); + + b.Property("ServerVehicleId") + .HasColumnType("int"); + + b.Property("Slot") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ServerVehicleId", "Slot") + .IsUnique(); + + b.ToTable("VehicleMods"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Weapon", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Ammo") + .HasColumnType("int"); + + b.Property("AmmunationActive") + .HasColumnType("tinyint(1)"); + + b.Property("CategoryId") + .HasColumnType("int"); + + b.Property("Legal") + .HasColumnType("tinyint(1)"); + + b.Property("Price") + .HasColumnType("float"); + + b.Property("SlotID") + .HasColumnType("int"); + + b.Property("WeaponModel") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId"); + + b.ToTable("Weapons"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.WeaponCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Category") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WeaponCategories"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Whitelist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("SocialClubName") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.HasKey("Id"); + + b.ToTable("WhitelistEntries"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.DepartmentChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("DepartmentChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.FactionChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.Property("FactionId") + .HasColumnType("int"); + + b.HasIndex("FactionId"); + + b.HasDiscriminator().HasValue("FactionChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GangChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("GangChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GroupChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.HasIndex("GroupId"); + + b.HasDiscriminator().HasValue("GroupChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.LeaderChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("LeaderChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.LocalChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("LocalChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.NewsChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("NewsChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.OChatLogEntry", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry"); + + b.HasDiscriminator().HasValue("OChatLogEntry"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BuyPrice") + .HasColumnType("int"); + + b.Property("Owners") + .HasColumnType("longtext CHARACTER SET utf8mb4"); + + b.ToTable("FactionVehicles"); + + b.HasDiscriminator().HasValue("FactionVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("GroupId") + .HasColumnType("int"); + + b.HasIndex("GroupId"); + + b.HasDiscriminator().HasValue("GroupVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.JobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("JobId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("JobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobSpawnVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobSpawnVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.NoobVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("NoobVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Saves.SavedVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.HasDiscriminator().HasValue("SavedVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.SchoolVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("SchoolId") + .HasColumnType("int"); + + b.HasDiscriminator().HasValue("SchoolVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.ShopVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("BusinessId") + .HasColumnType("int"); + + b.Property("Price") + .HasColumnType("int"); + + b.ToTable("ShopVehicles"); + + b.HasDiscriminator().HasValue("ShopVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasBaseType("ReallifeGamemode.Database.Entities.ServerVehicle"); + + b.Property("Price") + .HasColumnName("UserVehicle_Price") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasIndex("UserId"); + + b.ToTable("UserVehicles"); + + b.HasDiscriminator().HasValue("UserVehicle"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Ban", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.BusRoutePoint", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.BusRoute", "BusRoute") + .WithMany("RoutePoints") + .HasForeignKey("BusRouteId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Character", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.CharacterCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Door", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.DutyCloth", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Faction", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.FactionBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionRank", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.FactionWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Group", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.GroupBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.House", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.HouseBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.HouseRental", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany("Rentals") + .HasForeignKey("HouseId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.ChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.CommandLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Death", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "Killer") + .WithMany() + .HasForeignKey("KillerId"); + + b.HasOne("ReallifeGamemode.Database.Entities.User", "Victim") + .WithMany() + .HasForeignKey("VictimId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.LoginLogoutLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.News", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.User", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Ban", "Ban") + .WithMany() + .HasForeignKey("BanId"); + + b.HasOne("ReallifeGamemode.Database.Entities.UserBankAccount", "BankAccount") + .WithMany() + .HasForeignKey("BankAccountId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Character", "Character") + .WithMany() + .HasForeignKey("CharacterId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId"); + + b.HasOne("ReallifeGamemode.Database.Entities.FactionRank", "FactionRank") + .WithMany() + .HasForeignKey("FactionRankId"); + + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + + b.HasOne("ReallifeGamemode.Database.Entities.House", "House") + .WithMany() + .HasForeignKey("HouseId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserWeapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("ReallifeGamemode.Database.Entities.Weapon", "Weapon") + .WithMany() + .HasForeignKey("WeaponId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleItem", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("VehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.VehicleMod", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.ServerVehicle", "Vehicle") + .WithMany() + .HasForeignKey("ServerVehicleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Weapon", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.WeaponCategory", "WeaponCategory") + .WithMany() + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.FactionChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Faction", "Faction") + .WithMany() + .HasForeignKey("FactionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.Logs.Chat.GroupChatLogEntry", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.GroupVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.Group", "Group") + .WithMany() + .HasForeignKey("GroupId"); + }); + + modelBuilder.Entity("ReallifeGamemode.Database.Entities.UserVehicle", b => + { + b.HasOne("ReallifeGamemode.Database.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/20210420165544_Surgery.cs b/ReallifeGamemode.Database/Migrations/20210420165544_Surgery.cs new file mode 100644 index 00000000..323d802a --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210420165544_Surgery.cs @@ -0,0 +1,110 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace ReallifeGamemode.Database.Migrations +{ + public partial class Surgery : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Users_UserId", + table: "ChatLogs"); + + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Factions_FactionId", + table: "ChatLogs"); + + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Groups_GroupId", + table: "ChatLogs"); + + migrationBuilder.AddColumn( + name: "FreeSurgery", + table: "Users", + nullable: false, + defaultValue: false); + + migrationBuilder.AlterColumn( + name: "UserId", + table: "ChatLogs", + nullable: false, + oldClrType: typeof(int), + oldType: "int", + oldNullable: true); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Users_UserId", + table: "ChatLogs", + column: "UserId", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Factions_FactionId", + table: "ChatLogs", + column: "FactionId", + principalTable: "Factions", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Groups_GroupId", + table: "ChatLogs", + column: "GroupId", + principalTable: "Groups", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Users_UserId", + table: "ChatLogs"); + + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Factions_FactionId", + table: "ChatLogs"); + + migrationBuilder.DropForeignKey( + name: "FK_ChatLogs_Groups_GroupId", + table: "ChatLogs"); + + migrationBuilder.DropColumn( + name: "FreeSurgery", + table: "Users"); + + migrationBuilder.AlterColumn( + name: "UserId", + table: "ChatLogs", + type: "int", + nullable: true, + oldClrType: typeof(int)); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Users_UserId", + table: "ChatLogs", + column: "UserId", + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Factions_FactionId", + table: "ChatLogs", + column: "FactionId", + principalTable: "Factions", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_ChatLogs_Groups_GroupId", + table: "ChatLogs", + column: "GroupId", + principalTable: "Groups", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs index fcb3068f..78a5dfaf 100644 --- a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs +++ b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs @@ -1450,6 +1450,9 @@ namespace ReallifeGamemode.Database.Migrations b.Property("FlyingLicensePlane") .HasColumnType("tinyint(1)"); + b.Property("FreeSurgery") + .HasColumnType("tinyint(1)"); + b.Property("GroupId") .HasColumnType("int"); diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 581db2c8..d77d8243 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -550,6 +550,10 @@ namespace ReallifeGamemode.Server.Events nearestAmmunationPoint.Ammunation.LoadShopNUI(player); } } + if (CharacterCreator.surgeryPoint.DistanceTo(player.Position) <= 1.5) + { + CharacterCreator.StartSurgery(player); + } if (user.FactionLeader) { player.TriggerEvent("CLIENT:StartGangwar"); diff --git a/ReallifeGamemode.Server/Managers/CharacterCreator.cs b/ReallifeGamemode.Server/Managers/CharacterCreator.cs index 6273452b..2728b5a6 100644 --- a/ReallifeGamemode.Server/Managers/CharacterCreator.cs +++ b/ReallifeGamemode.Server/Managers/CharacterCreator.cs @@ -1,6 +1,7 @@ using System.Linq; using GTANetworkAPI; using Newtonsoft.Json.Linq; +using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; using ReallifeGamemode.Server.Extensions; @@ -8,6 +9,17 @@ namespace ReallifeGamemode.Server.Managers { public class CharacterCreator : Script { + public static Vector3 surgeryPoint = new Vector3(258.581, -1345.1406, 24.5378); + + public CharacterCreator() + { + var point = surgeryPoint; + NAPI.Marker.CreateMarker(1, new Vector3(point.X, point.Y, point.Z - 2), new Vector3(point.X, point.Y, point.Z + 1), + new Vector3(0, 0, 0), 2, new Color(255, 255, 255, 50), false, 0); + NAPI.TextLabel.CreateTextLabel("Chirurg - Dr\u00fccke ~y~E", point, 7, 1, 0, new Color(255, 255, 255), false, 0); + } + + [RemoteEvent("creator_GenderChange")] public void changeGender(Player player, int gender) { @@ -409,5 +421,105 @@ namespace ReallifeGamemode.Server.Managers NAPI.Player.SetPlayerEyeColor(player, character.EyeColor); } } + public static void StartSurgery(Player player) + { + /* + var gender; + var featureData; + var parentData; + var appearanceData; + + using (var dbContext = new DatabaseContext()) + { + User user = player.GetUser(); + + var character = dbContext.Characters.SingleOrDefault(c => c.Id == user.CharacterId); + + if (character == null) return; + + float[] faceFeatures = new float[] { character.NoseWidth, character.NoseBottomHeight, character.NoseTipLength, character.NoseBridgeDepth, character.NoseTipHeight, + character.NoseBroken, character.BrowHeight, character.BrowDepth, character.CheekboneHeight, character.CheekboneWidth, + character.CheekboneWidth, character.CheekDepth, character.EyeSize, character.LipThickness, character.JawWidth, + character.JawShape, character.ChinHeight, character.ChinDepth, character.ChinWidth, character.ChinIndent, character.NeckWidth }; + }*/ + var currentPlayerCreatorDimension = (uint)NAPI.Data.GetWorldData("playerCreatorDimension"); + currentPlayerCreatorDimension++; + NAPI.Data.SetWorldData("playerCreatorDimension", currentPlayerCreatorDimension); + player.Dimension = NAPI.Data.GetWorldData("playerCreatorDimension"); + player.SafeTeleport(new Vector3(266.472, -1339.1357, 24.5378)); + player.Heading = 146.35101f; + player.TriggerEvent("toggleSurgery"); + + //player.TriggerEvent("toggleSurgery", bool gender, string parentData, string featureData, string appearanceData) + } + + [RemoteEvent("surgeryLeave")] + public static void LeaveSurgery(Player player) + { + player.Dimension = 0; + player.SafeTeleport(new Vector3(258.581, -1345.1406, 24.5378), Main.DEFAULT_SPAWN_HEADING, true); + ApplyCharacter(player); + } + [RemoteEvent("SaveSurgery")] + public static void SaveSurgery(Player player, bool gender, string parentData, string featureData, string appearanceData, string hairAndColorData) + { + player.SafeTeleport(new Vector3(258.581, -1345.1406, 24.5378), Main.DEFAULT_SPAWN_HEADING, true); + var jParentData = JObject.Parse(parentData); + var jFeatureData = JArray.Parse(featureData); + var jAppearanceData = JArray.Parse(appearanceData); + + byte father = jParentData.Value("Father"); + byte mother = jParentData.Value("Mother"); + float similarity = jParentData.Value("Similarity"); + float skinSimilarity = jParentData.Value("SkinSimilarity"); + + float noseWidth = jFeatureData.Value(0); + float noseBottomHeight = jFeatureData.Value(1); + float noseTipLength = jFeatureData.Value(2); + float noseBridgeDepth = jFeatureData.Value(3); + float noseTipHeight = jFeatureData.Value(4); + float noseBroken = jFeatureData.Value(5); + float browHeight = jFeatureData.Value(6); + float browDepth = jFeatureData.Value(7); + float cheekboneHeight = jFeatureData.Value(8); + float cheekboneWidth = jFeatureData.Value(9); + float cheekDepth = jFeatureData.Value(10); + float eyeSize = jFeatureData.Value(11); + float lipThickness = jFeatureData.Value(12); + float jawWidth = jFeatureData.Value(13); + float jawShape = jFeatureData.Value(14); + float chinHeight = jFeatureData.Value(15); + float chinDepth = jFeatureData.Value(16); + float chinWidth = jFeatureData.Value(17); + float chinIndent = jFeatureData.Value(18); + float neckWidth = jFeatureData.Value(19); + + byte blemishes = jAppearanceData[0].Value("Value"); + float blemishesOpacity = jAppearanceData[0].Value("Opacity"); + byte facialHair = jAppearanceData[1].Value("Value"); + float facialHairOpacity = jAppearanceData[1].Value("Opacity"); + byte eyebrows = jAppearanceData[2].Value("Value"); + float eyebrowsOpacity = jAppearanceData[2].Value("Opacity"); + byte ageing = jAppearanceData[3].Value("Value"); + float ageingOpacity = jAppearanceData[3].Value("Opacity"); + byte makeup = jAppearanceData[4].Value("Value"); + float makeupOpacity = jAppearanceData[4].Value("Opacity"); + byte blush = jAppearanceData[5].Value("Value"); + float blushOpacity = jAppearanceData[5].Value("Opacity"); + byte complexion = jAppearanceData[6].Value("Value"); + float complexionOpacity = jAppearanceData[6].Value("Opacity"); + byte sunDamage = jAppearanceData[7].Value("Value"); + float sunDamageOpacity = jAppearanceData[7].Value("Opacity"); + byte lipstick = jAppearanceData[8].Value("Value"); + float lipstickOpacity = jAppearanceData[8].Value("Opacity"); + byte freckles = jAppearanceData[9].Value("Value"); + float frecklesOpacity = jAppearanceData[9].Value("Opacity"); + byte chestHair = jAppearanceData[10].Value("Value"); + float chestHairOpacity = jAppearanceData[10].Value("Opacity"); + + + + ApplyCharacter(player); + } } } From 0e1df9cf22d4727d98ec23328366d43d443d7024 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Mon, 26 Apr 2021 23:02:28 +0200 Subject: [PATCH 02/20] Erweiterung Surgeon --- .../CharCreator/surgery.ts | 131 +++++++++++---- ReallifeGamemode.Client/global.d.ts | 62 +++++++ .../Managers/CharacterCreator.cs | 154 ++++++++++++++++-- 3 files changed, 297 insertions(+), 50 deletions(-) diff --git a/ReallifeGamemode.Client/CharCreator/surgery.ts b/ReallifeGamemode.Client/CharCreator/surgery.ts index 3e54f44c..e88acbaf 100644 --- a/ReallifeGamemode.Client/CharCreator/surgery.ts +++ b/ReallifeGamemode.Client/CharCreator/surgery.ts @@ -21,8 +21,8 @@ const localPlayer = mp.players.local; export default function charSurgery(globalData: IGlobalData) { - var creatorHairMenu; - + var creatorHairMenu: NativeUI.Menu; + var characterData: PlayerCharacterData; function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } @@ -129,7 +129,7 @@ export default function charSurgery(globalData: IGlobalData) { //creatorHairMenu.AddItem(hairHighlightItem); eyebrowColorItem = new UIMenuListItem("Augenbrauen Farbe", "Farbe deiner Augenbrauen", new ItemsCollection(hairColors)); - creatorHairMenu.AddItem(eyebrowColorItem) + creatorHairMenu.AddItem(eyebrowColorItem); beardColorItem = new UIMenuListItem("Farbe der Gesichtsbehaarung", "Farbe deiner Gesichtsbehaarung", new ItemsCollection(hairColors)); creatorHairMenu.AddItem(beardColorItem); @@ -151,44 +151,101 @@ export default function charSurgery(globalData: IGlobalData) { } function resetParentsMenu(refresh = false) { - fatherItem.Index = 0; - motherItem.Index = 0; - similarityItem.Index = (currentGender === 0) ? 100 : 0; - skinSimilarityItem.Index = (currentGender === 0) ? 100 : 0; + fatherItem.Index = characterData.Father; + motherItem.Index = characterData.Mother; + similarityItem.Index = characterData.Similarity;//(currentGender === 0) ? 100 : 0; + skinSimilarityItem.Index = characterData.SkinSimilarity;//(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; + featureItems[i].Index = loadedFeatures[i]; updateFaceFeature(i); } if (refresh) creatorFeaturesMenu.RefreshIndex(); } + var loadedFeatures; + var loadedAppearence; + var loadedAppearenceOpacity; + + function loadCharacterData() { + loadedFeatures = [ + characterData.NoseWidth, + characterData.NoseBottomHeight, + characterData.NoseTipLength, + characterData.NoseBridgeDepth, + characterData.NoseTipHeight, + characterData.NoseBroken, + characterData.BrowHeight, + characterData.BrowDepth, + characterData.CheekboneHeight, + characterData.CheekboneWidth, + characterData.CheekDepth, + characterData.EyeSize, + characterData.LipThickness, + characterData.JawWidth, + characterData.JawShape, + characterData.ChinHeight, + characterData.ChinDepth, + characterData.ChinWidth, + characterData.ChinIndent, + characterData.NeckWidth + ]; + loadedAppearence = [ + characterData.Blemishes, + characterData.FacialHair, + characterData.Eyebrows, + characterData.Ageing, + characterData.Makeup, + characterData.Blush, + characterData.Complexion, + characterData.SunDamage, + characterData.Lipstick, + characterData.Freckles, + characterData.ChestHair + ]; + loadedAppearenceOpacity = [ + characterData.BlemishesOpacity, + characterData.FacialHairOpacity, + characterData.EyebrowsOpacity, + characterData.AgeingOpacity, + characterData.MakeupOpacity, + characterData.BlushOpacity, + characterData.ComplexionOpacity, + characterData.SunDamageOpacity, + characterData.LipstickOpacity, + characterData.FrecklesOpacity, + characterData.ChestHairOpacity + ]; + } + + function resetAppearanceMenu(refresh = false) { for (let i = 0; i < Data.appearanceNames.length; i++) { - appearanceItems[i].Index = 0; - appearanceOpacityItems[i].Index = 100; + appearanceItems[i].Index = loadedAppearence[i]; + appearanceOpacityItems[i].Index = loadedAppearenceOpacity[i]; 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; + eyebrowColorItem.Index = characterData.EyebrowColor; + beardColorItem.Index = characterData.BeardColor; + eyeColorItem.Index = characterData.EyeColor; + blushColorItem.Index = characterData.BlushColor; + lipstickColorItem.Index = characterData.LipstickColor; + chestHairColorItem.Index = characterData.ChestHairColor; updateHairAndColors(); if (refresh) creatorHairMenu.RefreshIndex(); @@ -292,17 +349,17 @@ export default function charSurgery(globalData: IGlobalData) { 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, + 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); @@ -312,7 +369,7 @@ export default function charSurgery(globalData: IGlobalData) { 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)); + mp.events.callRemote("SaveSurgery", currentGender, JSON.stringify(parentData), JSON.stringify(featureData), JSON.stringify(appearanceData), JSON.stringify(hairAndColors)); globalData.InMenu = false; globalData.InMenu = false; break; @@ -328,6 +385,12 @@ export default function charSurgery(globalData: IGlobalData) { }); function leaveCreator() { + + //resetParentsMenu(); + //resetFeaturesMenu(); + //resetAppearanceMenu(); + //resetHairAndColorsMenu(); + mp.gui.chat.show(true); mp.game.ui.displayRadar(true); mp.game.ui.displayHud(true); @@ -480,12 +543,12 @@ export default function charSurgery(globalData: IGlobalData) { let hairItem; let hairColorItem; let hairHighlightItem; - let eyebrowColorItem; - let beardColorItem; - let eyeColorItem; - let blushColorItem; - let lipstickColorItem; - let chestHairColorItem; + let eyebrowColorItem: NativeUI.UIMenuListItem; + let beardColorItem: NativeUI.UIMenuListItem; + let eyeColorItem: NativeUI.UIMenuListItem; + let blushColorItem: NativeUI.UIMenuListItem; + let lipstickColorItem: NativeUI.UIMenuListItem; + let chestHairColorItem: NativeUI.UIMenuListItem; creatorHairMenu = new Menu("Haar & Farben", "", new Point(0, screenRes.y / 3), null, null); fillHairMenu(); @@ -557,10 +620,14 @@ export default function charSurgery(globalData: IGlobalData) { creatorHairMenu.Visible = false; creatorMenus.push(creatorHairMenu); // CREATOR HAIR & COLORS END - + + var character; // EVENTS - mp.events.add("toggleSurgery", () => { + mp.events.add("toggleSurgery", (jsonCharacterData: string) => { if (!mp.cameras.exists(creatorCamera)) { + + characterData = JSON.parse(jsonCharacterData); + loadCharacterData(); 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); diff --git a/ReallifeGamemode.Client/global.d.ts b/ReallifeGamemode.Client/global.d.ts index dfd560c5..e26e3c54 100644 --- a/ReallifeGamemode.Client/global.d.ts +++ b/ReallifeGamemode.Client/global.d.ts @@ -89,4 +89,66 @@ declare type Weapon = { declare type WeaponCategory = { Category: number; Weapons: Weapon[]; +} + +declare type PlayerCharacterData = { + Gender: boolean; + Father: number; + Mother: number; + Similarity: number; + SkinSimilarity: number; + + NoseWidth: number; + NoseBottomHeight: number; + NoseTipLength: number; + NoseBridgeDepth: number; + NoseTipHeight: number; + NoseBroken: number; + BrowHeight: number; + BrowDepth: number; + CheekboneHeight: number; + CheekboneWidth: number; + CheekDepth: number; + EyeSize: number; + LipThickness: number; + JawWidth: number; + JawShape: number; + ChinHeight: number; + ChinDepth: number; + ChinWidth: number; + ChinIndent: number; + NeckWidth: number; + + Blemishes: number; + BlemishesOpacity: number; + FacialHair: number; + FacialHairOpacity: number; + Eyebrows: number; + EyebrowsOpacity: number; + Ageing: number; + AgeingOpacity: number; + Makeup: number; + MakeupOpacity: number; + Blush: number; + BlushOpacity: number; + Complexion: number; + ComplexionOpacity: number; + SunDamage: number; + SunDamageOpacity: number; + Lipstick: number; + LipstickOpacity: number; + Freckles: number; + FrecklesOpacity: number; + ChestHair: number; + ChestHairOpacity: number; + + Hair: number; + HairColor: number; + HairHighlightColor: number; + EyebrowColor: number; + BeardColor: number; + EyeColor: number; + BlushColor: number; + LipstickColor: number; + ChestHairColor: number; } \ No newline at end of file diff --git a/ReallifeGamemode.Server/Managers/CharacterCreator.cs b/ReallifeGamemode.Server/Managers/CharacterCreator.cs index 2728b5a6..71f9c5fc 100644 --- a/ReallifeGamemode.Server/Managers/CharacterCreator.cs +++ b/ReallifeGamemode.Server/Managers/CharacterCreator.cs @@ -1,5 +1,6 @@ using System.Linq; using GTANetworkAPI; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; @@ -423,34 +424,78 @@ namespace ReallifeGamemode.Server.Managers } public static void StartSurgery(Player player) { - /* - var gender; - var featureData; - var parentData; - var appearanceData; - - using (var dbContext = new DatabaseContext()) + Character c = player.GetUser().GetCharacter(); + + var PlayerCharacterData = new { - User user = player.GetUser(); + Gender = c.Gender, + Father = c.Father, + Mother = c.Mother, + Similarity = c.Similarity, + SkinSimilarity = c.SkinSimilarity, - var character = dbContext.Characters.SingleOrDefault(c => c.Id == user.CharacterId); + NoseWidth = c.NoseWidth, + NoseBottomHeight = c.NoseBottomHeight, + NoseTipLength = c.NoseTipLength, + NoseBridgeDepth = c.NoseBridgeDepth, + NoseTipHeight = c.NoseTipHeight, + NoseBroken = c.NoseBroken, + BrowHeight = c.BrowHeight, + BrowDepth = c.BrowDepth, + CheekboneHeight = c.CheekboneHeight, + CheekboneWidth = c.CheekboneWidth, + CheekDepth = c.CheekDepth, + EyeSize = c.EyeSize, + LipThickness = c.LipThickness, + JawWidth = c.JawWidth, + JawShape = c.JawShape, + ChinHeight = c.ChinHeight, + ChinDepth = c.ChinDepth, + ChinWidth = c.ChinWidth, + ChinIndent = c.ChinIndent, + NeckWidth = c.NeckWidth, - if (character == null) return; + Blemishes = c.Blemishes, + BlemishesOpacity = c.BlemishesOpacity, + FacialHair = c.FacialHair, + FacialHairOpacity = c.FacialHairOpacity, + Eyebrows = c.Eyebrows, + EyebrowsOpacity = c.EyebrowsOpacity, + Ageing = c.Ageing, + AgeingOpacity = c.AgeingOpacity, + Makeup = c.Makeup, + MakeupOpacity = c.MakeupOpacity, + Blush = c.Blush, + BlushOpacity = c.BlushOpacity, + Complexion = c.Complexion, + ComplexionOpacity = c.ComplexionOpacity, + SunDamage = c.SunDamage, + SunDamageOpacity = c.SunDamageOpacity, + Lipstick = c.Lipstick, + LipstickOpacity = c.LipstickOpacity, + Freckles = c.Freckles, + FrecklesOpacity = c.FrecklesOpacity, + ChestHair = c.ChestHair, + ChestHairOpacity = c.ChestHairOpacity, + + Hair = c.Hair, + HairColor = c.HairColor, + HairHighlightColor = c.HairHighlightColor, + EyebrowColor = c.EyebrowColor, + BeardColor = c.BeardColor, + EyeColor = c.EyeColor, + BlushColor = c.BlushColor, + LipstickColor = c.LipstickColor, + ChestHairColor = c.ChestHairColor + }; - float[] faceFeatures = new float[] { character.NoseWidth, character.NoseBottomHeight, character.NoseTipLength, character.NoseBridgeDepth, character.NoseTipHeight, - character.NoseBroken, character.BrowHeight, character.BrowDepth, character.CheekboneHeight, character.CheekboneWidth, - character.CheekboneWidth, character.CheekDepth, character.EyeSize, character.LipThickness, character.JawWidth, - character.JawShape, character.ChinHeight, character.ChinDepth, character.ChinWidth, character.ChinIndent, character.NeckWidth }; - }*/ var currentPlayerCreatorDimension = (uint)NAPI.Data.GetWorldData("playerCreatorDimension"); currentPlayerCreatorDimension++; NAPI.Data.SetWorldData("playerCreatorDimension", currentPlayerCreatorDimension); player.Dimension = NAPI.Data.GetWorldData("playerCreatorDimension"); player.SafeTeleport(new Vector3(266.472, -1339.1357, 24.5378)); player.Heading = 146.35101f; - player.TriggerEvent("toggleSurgery"); - - //player.TriggerEvent("toggleSurgery", bool gender, string parentData, string featureData, string appearanceData) + player.TriggerEvent("toggleSurgery", JsonConvert.SerializeObject(PlayerCharacterData)); } [RemoteEvent("surgeryLeave")] @@ -467,6 +512,7 @@ namespace ReallifeGamemode.Server.Managers var jParentData = JObject.Parse(parentData); var jFeatureData = JArray.Parse(featureData); var jAppearanceData = JArray.Parse(appearanceData); + var jHairAndColorData = JArray.Parse(hairAndColorData); byte father = jParentData.Value("Father"); byte mother = jParentData.Value("Mother"); @@ -517,7 +563,79 @@ namespace ReallifeGamemode.Server.Managers byte chestHair = jAppearanceData[10].Value("Value"); float chestHairOpacity = jAppearanceData[10].Value("Opacity"); + //byte hair = jHairAndColorData.Value(0); + //byte hairColor = jHairAndColorData.Value(1); + //byte hairHighlightColor = jHairAndColorData.Value(2); + byte eyebrowColor = jHairAndColorData.Value(0); + byte beardColor = jHairAndColorData.Value(1); + byte eyeColor = jHairAndColorData.Value(2); + byte blushColor = jHairAndColorData.Value(3); + byte lipstickColor = jHairAndColorData.Value(4); + byte chestHairColor = jHairAndColorData.Value(5); + using (var saveCharacter = new DatabaseContext()) + { + var character = new Database.Entities.Character + { + UserId = player.GetUser().Id, + Gender = gender, + Father = father, + Mother = mother, + Similarity = similarity, + SkinSimilarity = skinSimilarity, + + NoseWidth = noseWidth, + NoseBottomHeight = noseBottomHeight, + NoseTipLength = noseTipLength, + NoseBridgeDepth = noseBridgeDepth, + NoseTipHeight = noseTipHeight, + NoseBroken = noseBroken, + BrowHeight = browHeight, + BrowDepth = browDepth, + CheekboneHeight = cheekboneHeight, + CheekboneWidth = cheekboneWidth, + CheekDepth = cheekDepth, + EyeSize = eyeSize, + LipThickness = lipThickness, + JawWidth = jawWidth, + JawShape = jawShape, + ChinHeight = chinHeight, + ChinDepth = chinDepth, + ChinWidth = chinWidth, + ChinIndent = chinIndent, + NeckWidth = neckWidth, + + Blemishes = blemishes, + BlemishesOpacity = blemishesOpacity, + FacialHair = facialHair, + FacialHairOpacity = facialHairOpacity, + Eyebrows = eyebrows, + EyebrowsOpacity = eyebrowsOpacity, + Ageing = ageing, + AgeingOpacity = ageingOpacity, + Makeup = makeup, + MakeupOpacity = makeupOpacity, + Blush = blush, + BlushOpacity = blushOpacity, + Complexion = complexion, + ComplexionOpacity = complexionOpacity, + SunDamage = sunDamage, + SunDamageOpacity = sunDamageOpacity, + Lipstick = lipstick, + LipstickOpacity = lipstickOpacity, + Freckles = freckles, + FrecklesOpacity = frecklesOpacity, + ChestHair = chestHair, + ChestHairOpacity = chestHairOpacity, + + EyebrowColor = eyebrowColor, + BeardColor = beardColor, + EyeColor = eyeColor, + BlushColor = blushColor, + LipstickColor = lipstickColor, + ChestHairColor = chestHairColor + }; + } ApplyCharacter(player); } From 36f2517844b505057259680082363c64d9757e2f Mon Sep 17 00:00:00 2001 From: VegaZ Date: Wed, 28 Apr 2021 21:15:04 +0200 Subject: [PATCH 03/20] =?UTF-8?q?Chirurgen=20aufger=C3=A4umt,=20buggt=20ab?= =?UTF-8?q?er=20noch=20hart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReallifeGamemode.Client/CharCreator/main.ts | 4 +- .../CharCreator/surgery.ts | 926 ++++++++---------- 2 files changed, 402 insertions(+), 528 deletions(-) diff --git a/ReallifeGamemode.Client/CharCreator/main.ts b/ReallifeGamemode.Client/CharCreator/main.ts index daee8540..bdabfdab 100644 --- a/ReallifeGamemode.Client/CharCreator/main.ts +++ b/ReallifeGamemode.Client/CharCreator/main.ts @@ -384,7 +384,7 @@ export default function charCreator(globalData: IGlobalData) { 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); + let creatorFeaturesMenu = new Menu("Gesichtsmerkmale", "", 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)); @@ -394,7 +394,7 @@ export default function charCreator(globalData: IGlobalData) { } creatorFeaturesMenu.AddItem(new UIMenuItem("Zuf\u00e4llig", "~r~Zuf\u00e4llige Gesichtsz\u00fcge.")); - creatorFeaturesMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt Gesichtsz\u00fcge zur\u00fcck.")); + creatorFeaturesMenu.AddItem(new UIMenuItem("Zur\u00fccksetzen", "~r~Setzt Gesichtsmerkmale zurück.")); creatorFeaturesMenu.ItemSelect.on((item, index) => { switch (item.Text) { diff --git a/ReallifeGamemode.Client/CharCreator/surgery.ts b/ReallifeGamemode.Client/CharCreator/surgery.ts index e88acbaf..4e20e045 100644 --- a/ReallifeGamemode.Client/CharCreator/surgery.ts +++ b/ReallifeGamemode.Client/CharCreator/surgery.ts @@ -21,158 +21,65 @@ const localPlayer = mp.players.local; export default function charSurgery(globalData: IGlobalData) { - var creatorHairMenu: NativeUI.Menu; + var creatorCamera: CameraMp; + var newCharacter: PlayerCharacterData; + + // color arrays + var hairColors = []; + for (var i = 0; i < Data.maxHairColor; i++) hairColors.push(i.toString()); + + var blushColors = []; + for (var i = 0; i < Data.maxBlushColor; i++) blushColors.push(i.toString()); + + var lipstickColors = []; + for (var i = 0; i < Data.maxLipstickColor; i++) lipstickColors.push(i.toString()); + var characterData: PlayerCharacterData; function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } - function colorForOverlayIdx(index) { - let color; + var creatorMainMenu: NativeUI.Menu; + var debugString = [0, 0, 0, 0, 0]; - switch (index) { - case 1: - color = beardColorItem.Index; - break; + mp.events.add("render", () => { + mp.game.graphics.drawText(debugString.toString(), [0.5, 0.1], + { + font: 4, + color: [255, 255, 255, 255], + scale: [0.5, 0.5], + outline: true, + centre: false + }) + }); - case 2: - color = eyebrowColorItem.Index; - break; + mp.events.add("toggleSurgery", (jsonCharacterData: string) => { + if (!mp.cameras.exists(creatorCamera)) { + debugString[0] = 1; + characterData = JSON.parse(jsonCharacterData); + debugString[1] = 1; + loadCharacterData(); + debugString[2] = 1; + 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); - case 5: - color = blushColorItem.Index; - break; - - case 8: - color = lipstickColorItem.Index; - break; - - case 10: - color = chestHairColorItem.Index; - break; - - default: - color = 0; + globalData.InMenu = true; + globalData.InMenu = 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); + debugString[3] = 1; + getCharacterMainMenu(); } - - 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 = characterData.Father; - motherItem.Index = characterData.Mother; - similarityItem.Index = characterData.Similarity;//(currentGender === 0) ? 100 : 0; - skinSimilarityItem.Index = characterData.SkinSimilarity;//(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 = loadedFeatures[i]; - updateFaceFeature(i); - } - - if (refresh) creatorFeaturesMenu.RefreshIndex(); - } + }); var loadedFeatures; - var loadedAppearence; - var loadedAppearenceOpacity; + var loadedAppearance; + var loadedAppearanceOpacity; function loadCharacterData() { loadedFeatures = [ @@ -197,7 +104,7 @@ export default function charSurgery(globalData: IGlobalData) { characterData.ChinIndent, characterData.NeckWidth ]; - loadedAppearence = [ + loadedAppearance = [ characterData.Blemishes, characterData.FacialHair, characterData.Eyebrows, @@ -210,7 +117,7 @@ export default function charSurgery(globalData: IGlobalData) { characterData.Freckles, characterData.ChestHair ]; - loadedAppearenceOpacity = [ + loadedAppearanceOpacity = [ characterData.BlemishesOpacity, characterData.FacialHairOpacity, characterData.EyebrowsOpacity, @@ -226,368 +133,302 @@ export default function charSurgery(globalData: IGlobalData) { } + function getCharacterMainMenu(): NativeUI.Menu { + + creatorMainMenu = new Menu("Chirurg", "", new Point(0, screenRes.y / 3), null, null); + creatorMainMenu.Visible = false; + + var genderItem = new UIMenuListItem("Geschlecht", "~r~Dies setzt deine Einstellungen zurück.", new ItemsCollection(["Männlich", "Weiblich"])); + creatorMainMenu.AddItem(genderItem); + genderItem.Index = characterData.Gender == false ? 0 : 1; + + var parentsItem = new UIMenuItem("Eltern", "Eltern des Charakters."); + creatorMainMenu.AddItem(parentsItem); + creatorMainMenu.BindMenuToItem(getParentsMenu(creatorMainMenu), parentsItem); + + var featureItem = new UIMenuItem("Gesichtszüge", "Gesichtszüge des Charakters.") + creatorMainMenu.AddItem(featureItem); + creatorMainMenu.BindMenuToItem(getFeaturesMenu(creatorMainMenu), featureItem); + + var appearanceItem = new UIMenuItem("Aussehen", "Aussehen des Charakters.") + creatorMainMenu.AddItem(appearanceItem); + creatorMainMenu.BindMenuToItem(getAppearanceMenu(creatorMainMenu), appearanceItem); + + var hairAndColorItem = new UIMenuItem("Haar & Farben", "Haare & Farben deines Charakters.") + creatorMainMenu.AddItem(hairAndColorItem); + creatorMainMenu.BindMenuToItem(getHairAndColorMenu(creatorMainMenu), hairAndColorItem); + + //Charakterdrehung + var angles = []; + for (var i = -180.0; i <= 180.0; i += 5.0) angles.push(i.toFixed(1)); + var angleItem = new UIMenuListItem("Drehung", "", new ItemsCollection(angles)); + creatorMainMenu.AddItem(angleItem); + + var saveItem = new UIMenuItem("Erstellen", "Erstellt deinen Charakter."); + saveItem.BackColor = new Color(13, 71, 161); + saveItem.HighlightedBackColor = new Color(25, 118, 210); + creatorMainMenu.AddItem(saveItem); + + creatorMainMenu.ListChange.on((item, listIndex) => { + if (item === genderItem) { + newCharacter.Gender = listIndex; + mp.events.callRemote("creator_GenderChange", listIndex); + + setTimeout(() => { + localPlayer.clearTasksImmediately(); + applyCreatorOutfit(); + angleItem.Index = 0; + resetParents(); + //resetParentsMenu(true); + //resetFeaturesMenu(true); + //resetAppearanceMenu(true); + }, 200); + } else if (item === angleItem) { + localPlayer.setHeading(parseFloat(angleItem.SelectedValue)); + localPlayer.clearTasksImmediately(); + } + }); + + creatorMainMenu.MenuClose.on(() => { + leaveCreator(); + }); + + return creatorMainMenu; + } + + function getParentsMenu(parentMenu: NativeUI.Menu): NativeUI.Menu { + var similarities = []; + for (var i = 0; i <= 100; i++) similarities.push(i + "%"); + + var creatorParentsMenu = new Menu("Eltern", "", new Point(0, screenRes.y / 3), null, null); + creatorParentsMenu.Visible = false; + + var fatherItem = new UIMenuListItem("Vater", "Dem Charakter sein Vadda.", new ItemsCollection(Data.fatherNames)); + creatorParentsMenu.AddItem(fatherItem); + fatherItem.Index = characterData.Father; + + var motherItem = new UIMenuListItem("Mutter", "Dem Charakter seine Mudda.", new ItemsCollection(Data.motherNames)); + creatorParentsMenu.AddItem(motherItem); + motherItem.Index = characterData.Mother; + + var similarityItem = new UIMenuListItem("\u00c4hnlichkeit", "\u00c4hnlichkeit zu den Eltern.\n(niedriger = feminin, h\u00f6her = maskulin)", new ItemsCollection(similarities)); + creatorParentsMenu.AddItem(similarityItem); + similarityItem.Index = characterData.Similarity; + + var skinSimilarityItem = new UIMenuListItem("Hautfarbe", "Hautfarben \u00c4hnlichkeit zu den Eltern.\n(niedriger = Mutter, h\u00f6her = Vater)", new ItemsCollection(similarities)); + creatorParentsMenu.AddItem(skinSimilarityItem); + skinSimilarityItem.Index = characterData.SkinSimilarity; + + var resetItem = new UIMenuItem("Zurücksetzen", "~r~Setzt die Eltern zurück. :'("); + creatorParentsMenu.AddItem(resetItem); + + creatorParentsMenu.ItemSelect.on((item, index) => { + switch (item) { + case resetItem: + fatherItem.Index = characterData.Father; + motherItem.Index = characterData.Mother; + similarityItem.Index = characterData.Similarity;//(currentGender === 0) ? 100 : 0; + skinSimilarityItem.Index = characterData.SkinSimilarity;//(currentGender === 0) ? 100 : 0; + resetParents(); + //creatorParentsMenu.RefreshIndex(); + break; + } + }); + + creatorParentsMenu.ListChange.on((item, listIndex) => { + updateParents(); + }); + + creatorParentsMenu.RefreshIndex(); + return creatorParentsMenu; + } + + function updateParents() { + localPlayer.setHeadBlendData( + // shape + Data.mothers[newCharacter.Mother], + Data.fathers[newCharacter.Father], + 0, + + // skin + Data.mothers[newCharacter.Mother], + Data.fathers[newCharacter.Father], + 0, + + // mixes + newCharacter.Similarity * 0.01, + newCharacter.SkinSimilarity * 0.01, + 0.0, + + false + ); + } + + function resetParents() { + localPlayer.setHeadBlendData( + // shape + Data.mothers[characterData.Mother], + Data.fathers[characterData.Father], + 0, + + // skin + Data.mothers[characterData.Mother], + Data.fathers[characterData.Father], + 0, + + // mixes + characterData.Similarity * 0.01, + characterData.SkinSimilarity * 0.01, + 0.0, + + false + ); + } + + var featureItems = []; + function getFeaturesMenu(parentMenu: NativeUI.Menu): NativeUI.Menu { + + var features = []; + for (var i = -1.0; i <= 1.01; i += 0.01) features.push(i.toFixed(2)); + + var creatorFeaturesMenu = new Menu("Gesichtsmerkmale", "", new Point(0, screenRes.y / 3), null, null); + creatorFeaturesMenu.Visible = false; + + for (var i = 0; i < Data.featureNames.length; i++) { + var tempFeatureItem = new UIMenuListItem(Data.featureNames[i], "", new ItemsCollection(features)); + tempFeatureItem.Index = 100; + featureItems.push(tempFeatureItem); + creatorFeaturesMenu.AddItem(tempFeatureItem); + tempFeatureItem.Index = loadedFeatures[i]; + } + + var resetItem = new UIMenuItem("Zurücksetzen", "~r~Setzt Gesichtsmerkmale zurück."); + creatorFeaturesMenu.AddItem(resetItem); + + creatorFeaturesMenu.ItemSelect.on((item, index) => { + switch (item) { + case resetItem: + for (var i = 0; i < Data.featureNames.length; i++) { + featureItems[i].Index = loadedFeatures[i]; + updateFaceFeature(i); + } + break; + } + }); + + creatorFeaturesMenu.ListChange.on((item, listIndex) => { + updateFaceFeature(featureItems.indexOf(item)); + }); + + creatorFeaturesMenu.RefreshIndex(); + return creatorFeaturesMenu; + } + + function updateFaceFeature(index) { + localPlayer.setFaceFeature(index, parseFloat(featureItems[index].SelectedValue)); + } + + var appearanceItems = []; + var appearanceOpacityItems = []; + function getAppearanceMenu(parentMenu: NativeUI.Menu): NativeUI.Menu { + + + var opacities = []; + for (var i = 0; i <= 100; i++) opacities.push(i + "%"); + + var creatorAppearanceMenu = new Menu("Aussehen", "", new Point(0, screenRes.y / 3), null, null); + creatorAppearanceMenu.Visible = false; + + for (var i = 0; i < Data.appearanceNames.length; i++) { + var items = []; + for (var j = 0, max = mp.game.ped.getNumHeadOverlayValues(i); j <= max; j++) items.push(Data.appearanceItemNames[i][j] === undefined ? j.toString() : Data.appearanceItemNames[i][j]); + + var tempAppearanceItem = new UIMenuListItem(Data.appearanceNames[i], "", new ItemsCollection(items)); + appearanceItems.push(tempAppearanceItem); + creatorAppearanceMenu.AddItem(tempAppearanceItem); + tempAppearanceItem.Index = loadedAppearance[i]; + + var tempAppearanceOpacityItem = new UIMenuListItem(Data.appearanceNames[i] + " Transparenz", "", new ItemsCollection(opacities)); + tempAppearanceOpacityItem.Index = 100; + appearanceOpacityItems.push(tempAppearanceOpacityItem); + creatorAppearanceMenu.AddItem(tempAppearanceOpacityItem); + tempAppearanceOpacityItem.Index = loadedAppearanceOpacity[i]; + } + + var resetItem = new UIMenuItem("Zurücksetzen", "~r~Setzt das Aussehen zurück."); + creatorAppearanceMenu.AddItem(resetItem); + + creatorAppearanceMenu.ItemSelect.on((item, index) => { + switch (item) { + case resetItem: + resetAppearanceMenu(); + break; + } + }); + + creatorAppearanceMenu.ListChange.on((item, listIndex) => { + var idx = (creatorAppearanceMenu.CurrentSelection % 2 === 0) ? (creatorAppearanceMenu.CurrentSelection / 2) : Math.floor(creatorAppearanceMenu.CurrentSelection / 2); + updateAppearance(idx); + }); + + return creatorAppearanceMenu; + } + + function updateAppearance(index) { + var overlayID = (appearanceItems[index].Index === 0) ? 255 : appearanceItems[index].Index - 1; + localPlayer.setHeadOverlay(index, overlayID, appearanceOpacityItems[index].Index * 0.01, colorForOverlayIdx(index), 0); + } + function resetAppearanceMenu(refresh = false) { - for (let i = 0; i < Data.appearanceNames.length; i++) { - appearanceItems[i].Index = loadedAppearence[i]; - appearanceOpacityItems[i].Index = loadedAppearenceOpacity[i]; + for (var i = 0; i < Data.appearanceNames.length; i++) { + appearanceItems[i].Index = loadedAppearance[i]; + appearanceOpacityItems[i].Index = loadedAppearanceOpacity[i]; updateAppearance(i); } - - if (refresh) creatorAppearanceMenu.RefreshIndex(); - } - - function resetHairAndColorsMenu(refresh = false) { - //hairItem.Index = 0; - //hairColorItem.Index = 0; - //hairHighlightItem.Index = 0; - eyebrowColorItem.Index = characterData.EyebrowColor; - beardColorItem.Index = characterData.BeardColor; - eyeColorItem.Index = characterData.EyeColor; - blushColorItem.Index = characterData.BlushColor; - lipstickColorItem.Index = characterData.LipstickColor; - chestHairColorItem.Index = characterData.ChestHairColor; - updateHairAndColors(); - - if (refresh) creatorHairMenu.RefreshIndex(); } - let currentGender; - let creatorMenus: NativeUI.Menu[] = []; - let creatorCamera: CameraMp; + function getHairAndColorMenu(parentMenu: NativeUI.Menu): NativeUI.Menu { - // color arrays - let hairColors = []; - for (let i = 0; i < Data.maxHairColor; i++) hairColors.push(i.toString()); + var creatorHairMenu = new Menu("Haar & Farben", "", new Point(0, screenRes.y / 3), null, null); + creatorHairMenu.Visible = false; - let blushColors = []; - for (let i = 0; i < Data.maxBlushColor; i++) blushColors.push(i.toString()); + var eyebrowColorItem = new UIMenuListItem("Augenbrauen Farbe", "Farbe deiner Augenbrauen", new ItemsCollection(hairColors)); + creatorHairMenu.AddItem(eyebrowColorItem); - let lipstickColors = []; - for (let i = 0; i < Data.maxLipstickColor; i++) lipstickColors.push(i.toString()); - + var beardColorItem = new UIMenuListItem("Farbe der Gesichtsbehaarung", "Farbe deiner Gesichtsbehaarung", new ItemsCollection(hairColors)); + creatorHairMenu.AddItem(beardColorItem); - // 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.")); + var eyeColorItem = new UIMenuListItem("Augenfarbe", "Farbe deiner Augen", new ItemsCollection(Data.eyeColors)); + creatorHairMenu.AddItem(eyeColorItem); - 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); + var blushColorItem = new UIMenuListItem("Rouge", "Farbe des Rouges.", new ItemsCollection(blushColors)); + creatorHairMenu.AddItem(blushColorItem); - 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); + var lipstickColorItem = new UIMenuListItem("Lippenstift Farbe", "Farbe deines Lippenstifts.", new ItemsCollection(lipstickColors)); + creatorHairMenu.AddItem(lipstickColorItem); - //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); + var chestHairColorItem = new UIMenuListItem("Farbe der Brustbehaarung", "Farbe deiner Brustbehaarung", new ItemsCollection(hairColors)); + creatorHairMenu.AddItem(chestHairColorItem); - creatorMainMenu.ListChange.on((item, listIndex) => { - if (item === genderItem) { - currentGender = listIndex; - mp.events.callRemote("creator_GenderChange", listIndex); + var cancelItem = new UIMenuItem("Zurücksetzen", "~r~Zurücksetzen von Haar & Farben"); + creatorHairMenu.AddItem(cancelItem); - 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), JSON.stringify(hairAndColors)); - globalData.InMenu = false; - globalData.InMenu = false; - break; - - case 6: - leaveCreator(); - break; - } - }); - - creatorMainMenu.MenuClose.on(() => { - leaveCreator(); - }); - - function leaveCreator() { - - //resetParentsMenu(); - //resetFeaturesMenu(); - //resetAppearanceMenu(); - //resetHairAndColorsMenu(); - - 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: NativeUI.UIMenuListItem; - let beardColorItem: NativeUI.UIMenuListItem; - let eyeColorItem: NativeUI.UIMenuListItem; - let blushColorItem: NativeUI.UIMenuListItem; - let lipstickColorItem: NativeUI.UIMenuListItem; - let chestHairColorItem: NativeUI.UIMenuListItem; - - 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); + creatorHairMenu.ItemSelect.on((item, index) => { + switch (item) { + case cancelItem: + eyebrowColorItem.Index = characterData.EyebrowColor; + beardColorItem.Index = characterData.BeardColor; + eyeColorItem.Index = characterData.EyeColor; + blushColorItem.Index = characterData.BlushColor; + lipstickColorItem.Index = characterData.LipstickColor; + chestHairColorItem.Index = characterData.ChestHairColor; + updateHairAndColors(); break; + } + }); - case 2: // hair highlight color - localPlayer.setHairColor(hairColorItem.Index, listIndex); - break;*/ + creatorHairMenu.ListChange.on((item, listIndex) => { + switch (creatorHairMenu.CurrentSelection) { case 0: // eyebrow color localPlayer.setHeadOverlayColor(2, 1, listIndex, 0); @@ -613,45 +454,78 @@ export default function charSurgery(globalData: IGlobalData) { localPlayer.setHeadOverlayColor(10, 1, listIndex, 0); break; } + }); + + return creatorHairMenu; + } + + function updateHairAndColors() { + localPlayer.setEyeColor(newCharacter.EyeColor); + localPlayer.setHeadOverlayColor(1, 1, newCharacter.BeardColor, 0); + localPlayer.setHeadOverlayColor(2, 1, newCharacter.EyebrowColor, 0); + localPlayer.setHeadOverlayColor(5, 2, newCharacter.BlushColor, 0); + localPlayer.setHeadOverlayColor(8, 2, newCharacter.LipstickColor, 0); + localPlayer.setHeadOverlayColor(10, 1, newCharacter.ChestHairColor, 0); + } + + function colorForOverlayIdx(index) { + var color; + + switch (index) { + case 1: + color = newCharacter.BeardColor; + break; + + case 2: + color = newCharacter.EyebrowColor; + break; + + case 5: + color = newCharacter.BlushColor; + break; + + case 8: + color = newCharacter.LipstickColor; + break; + + case 10: + color = newCharacter.ChestHairColor; + break; + + default: + color = 0; } - }); - creatorHairMenu.ParentMenu = creatorMainMenu; - creatorHairMenu.Visible = false; - creatorMenus.push(creatorHairMenu); - // CREATOR HAIR & COLORS END + return color; + } - var character; - // EVENTS - mp.events.add("toggleSurgery", (jsonCharacterData: string) => { - if (!mp.cameras.exists(creatorCamera)) { - - characterData = JSON.parse(jsonCharacterData); - loadCharacterData(); - 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); + function applyCreatorOutfit() { + if (newCharacter.Gender === false) { + 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); } - }); - - /* - mp.events.add("sendToServer", (characterData) => { - mp.events.callRemote("creatorSave", characterData); - }); - */ - - creatorMenus.forEach(menu => { - menu.Visible = false; - }) + } + + 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; + } } \ No newline at end of file From 19f081091840043e6015e33ae4074410e05a81fb Mon Sep 17 00:00:00 2001 From: VegaZ Date: Mon, 3 May 2021 19:10:14 +0200 Subject: [PATCH 04/20] Finalize Surgery --- ReallifeGamemode.Client/CharCreator/data.ts | 26 +-- ReallifeGamemode.Client/CharCreator/main.ts | 61 ++++-- .../CharCreator/surgery.ts | 203 +++++++++--------- ReallifeGamemode.Client/index.ts | 4 +- ReallifeGamemode.Server/Events/Key.cs | 24 ++- ReallifeGamemode.Server/Events/Register.cs | 2 +- .../Managers/CharacterCreator.cs | 69 ++++-- 7 files changed, 243 insertions(+), 146 deletions(-) diff --git a/ReallifeGamemode.Client/CharCreator/data.ts b/ReallifeGamemode.Client/CharCreator/data.ts index 83801bab..8d813356 100644 --- a/ReallifeGamemode.Client/CharCreator/data.ts +++ b/ReallifeGamemode.Client/CharCreator/data.ts @@ -2,32 +2,32 @@ const mothers = [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 45]; const fatherNames = ["Benjamin", "Daniel", "Joshua", "Noah", "Andrew", "Juan", "Alex", "Isaac", "Evan", "Ethan", "Vincent", "Angel", "Diego", "Adrian", "Gabriel", "Michael", "Santiago", "Kevin", "Louis", "Samuel", "Anthony", "Claude", "Niko", "John"]; const motherNames = ["Hannah", "Aubrey", "Jasmine", "Gisele", "Amelia", "Isabella", "Zoe", "Ava", "Camila", "Violet", "Sophia", "Evelyn", "Nicole", "Ashley", "Gracie", "Brianna", "Natalie", "Olivia", "Elizabeth", "Charlotte", "Emma", "Misty"]; -const featureNames = ["Nose Width", "Nose Bottom Height", "Nose Tip Length", "Nose Bridge Depth", "Nose Tip Height", "Nose Broken", "Brow Height", "Brow Depth", "Cheekbone Height", "Cheekbone Width", "Cheek Depth", "Eye Size", "Lip Thickness", "Jaw Width", "Jaw Shape", "Chin Height", "Chin Depth", "Chin Width", "Chin Indent", "Neck Width"]; -const appearanceNames = ["Blemishes", "Facial Hair", "Eyebrows", "Ageing", "Makeup", "Blush", "Complexion", "Sun Damage", "Lipstick", "Moles & Freckles", "Chest Hair"]; +const featureNames = ["Nasenbreite", "Nasenbodenhöhe", "Nasenspitzenlänge", "Nasenrückentiefe", "Nasenspitzenhöhe", "Nasenbruch", "Augenbrauenhöhe", "Augenbrauentiefe", "Wangenknochenhöhe", "Wangenknochenbreite", "Wangentiefe", "Augengröße", "Lippenvolumen", "Kieferweite", "Kieferform", "Kinnhöhe", "Kinntiefe", "Kinnweite", "Kinnbeule", "Nackenbreite"]; +const appearanceNames = ["Gesichtsmakel", "Gesichtsbehaarung", "Augenbrauen", "Alterung", "Makeup", "Errötungen", "Teint", "Sonnenschaden", "Lippenstift", "Muttermale & Sommersprossen", "Brustbehaarung"]; const appearanceItemNames = [ // blemishes - ["None", "Measles", "Pimples", "Spots", "Break Out", "Blackheads", "Build Up", "Pustules", "Zits", "Full Acne", "Acne", "Cheek Rash", "Face Rash", "Picker", "Puberty", "Eyesore", "Chin Rash", "Two Face", "T Zone", "Greasy", "Marked", "Acne Scarring", "Full Acne Scarring", "Cold Sores", "Impetigo"], + ["Keine", "Masern", "Pickel", "Flecken", "Ausbruch", "Mitesser", "Aufbau", "Pusteln", "Pickel", "Vollakne", "Akne", "Wangenausschlag", "Gesichtsausschlag", "Picker", "Pubertät", "Schandfleck", "Kinnausschlag", "Zwei Gesichter", "T Zone", "Fettig", "Gekennzeichnet", "Aknenarben", "Vollakne Narben", "Fieberbläschen", "Eiterflechte"], // facial hair - ["None", "Light Stubble", "Balbo", "Circle Beard", "Goatee", "Chin", "Chin Fuzz", "Pencil Chin Strap", "Scruffy", "Musketeer", "Mustache", "Trimmed Beard", "Stubble", "Thin Circle Beard", "Horseshoe", "Pencil and 'Chops", "Chin Strap Beard", "Balbo and Sideburns", "Mutton Chops", "Scruffy Beard", "Curly", "Curly & Deep Stranger", "Handlebar", "Faustic", "Otto & Patch", "Otto & Full Stranger", "Light Franz", "The Hampstead", "The Ambrose", "Lincoln Curtain"], + ["Keine", "Leichte Stoppeln", "Balbo", "Kreis Bart", "Spitzbart", "Kinn", "Kinn Flaum", "Pencil Chin Strap", "Scruffy", "Musketier", "Schnurrbart", "Getrimmt", "Stoppelbart", "Dünner Kreis Bart", "Hufeisen", "Koteletten", "Kinnriemen Bart", "Balbo und Koteletten", "Koteletten 2", "Schäbiger Bart", "Lockig", "Lockig", "Lenker Bart", "Faustisch", "Otto & Patch", "Otto & Full Stranger", "Light Franz", "The Hampstead", "Der Ambrosius", "Lincoln Curtain"], // eyebrows - ["None", "Balanced", "Fashion", "Cleopatra", "Quizzical", "Femme", "Seductive", "Pinched", "Chola", "Triomphe", "Carefree", "Curvaceous", "Rodent", "Double Tram", "Thin", "Penciled", "Mother Plucker", "Straight and Narrow", "Natural", "Fuzzy", "Unkempt", "Caterpillar", "Regular", "Mediterranean", "Groomed", "Bushels", "Feathered", "Prickly", "Monobrow", "Winged", "Triple Tram", "Arched Tram", "Cutouts", "Fade Away", "Solo Tram"], + ["Keine", "Ausbalanciert", "Fashion", "Kleopatra", "Fragend", "Weiblich", "Verführerisch", "Geklemmt", "Chola", "Triomphe", "Sorglos", "Kurvenreich", "Nagetier", "Double Tram", "Dünn", "Gezeichnet", "Mother Plucker", "Gerade und schmal", "Natürlich", "Flaumig", "Ungepflegt", "Raupe", "Regulär", "Mediterran", "Gepflegt", "Scheffel", "Gefiedert", "Stachelig", "Monobraue", "Geflügelt", "Triple Tram", "Arched Tram", "Ausschnitte", "Verblassen", "Solo Tram"], // ageing - ["None", "Crow's Feet", "First Signs", "Middle Aged", "Worry Lines", "Depression", "Distinguished", "Aged", "Weathered", "Wrinkled", "Sagging", "Tough Life", "Vintage", "Retired", "Junkie", "Geriatric"], + ["Keine", "Krähenfüße ", "Erste Anzeichen", "Im mittleren Alter", "Sorgenfalten", "Depression", "Ausgezeichnet", "Alt", "Verwittert", "Faltig", "Durchhängen", "Hartes Leben", "Vintage", "Im Ruhestand", "Junkie", "Geriatrisch"], // makeup - ["None", "Smoky Black", "Bronze", "Soft Gray", "Retro Glam", "Natural Look", "Cat Eyes", "Chola", "Vamp", "Vinewood Glamour", "Bubblegum", "Aqua Dream", "Pin Up", "Purple Passion", "Smoky Cat Eye", "Smoldering Ruby", "Pop Princess"], + ["Keine", "Smoky Black", "Bronze", "Soft Gray", "Retro Glam", "Natural Look", "Cat Eyes", "Chola", "Vamp", "Vinewood Glamour", "Bubblegum", "Aqua Dream", "Pin Up", "Purple Passion", "Smoky Cat Eye", "Smoldering Ruby", "Pop Princess"], // blush - ["None", "Full", "Angled", "Round", "Horizontal", "High", "Sweetheart", "Eighties"], + ["Keine", "Voll", "Abgewinkelt", "Rund", "Horizontal", "Hoch", "Sweetheart", "Achtziger Jahre"], // complexion - ["None", "Rosy Cheeks", "Stubble Rash", "Hot Flush", "Sunburn", "Bruised", "Alchoholic", "Patchy", "Totem", "Blood Vessels", "Damaged", "Pale", "Ghostly"], + ["Keine", "Rosige Wangen", "Stoppelausschlag", "Hitzewallungen", "Sonnenbrand", "Gequetscht", "AlkoholikerIn", "Lückenhaft", "Totem", "Blutgefäße", "Beschädigt", "Blass", "Gespenstisch"], // sun damage - ["None", "Uneven", "Sandpaper", "Patchy", "Rough", "Leathery", "Textured", "Coarse", "Rugged", "Creased", "Cracked", "Gritty"], + ["Keine", "Ungleichmäßig", "Sandpapier", "Lückenhaft", "Rau", "Lederig", "Strukturiert", "Grob", "Robust", "Zerknittert", "Gebrochen", "Grobkörnig"], // lipstick - ["None", "Color Matte", "Color Gloss", "Lined Matte", "Lined Gloss", "Heavy Lined Matte", "Heavy Lined Gloss", "Lined Nude Matte", "Liner Nude Gloss", "Smudged", "Geisha"], + ["Keine", "Color Matte", "Color Gloss", "Lined Matte", "Lined Gloss", "Heavy Lined Matte", "Heavy Lined Gloss", "Lined Nude Matte", "Liner Nude Gloss", "Smudged", "Geisha"], // freckles - ["None", "Cherub", "All Over", "Irregular", "Dot Dash", "Over the Bridge", "Baby Doll", "Pixie", "Sun Kissed", "Beauty Marks", "Line Up", "Modelesque", "Occasional", "Speckled", "Rain Drops", "Double Dip", "One Sided", "Pairs", "Growth"], + ["Keine", "Cherub", "All Over", "Irregular", "Dot Dash", "Over the Bridge", "Baby Doll", "Pixie", "Sun Kissed", "Beauty Marks", "Line Up", "Modelesque", "Occasional", "Speckled", "Rain Drops", "Double Dip", "One Sided", "Pairs", "Growth"], // chest hair - ["None", "Natural", "The Strip", "The Tree", "Hairy", "Grisly", "Ape", "Groomed Ape", "Bikini", "Lightning Bolt", "Reverse Lightning", "Love Heart", "Chestache", "Happy Face", "Skull", "Snail Trail", "Slug and Nips", "Hairy Arms"] + ["Keine", "Natural", "The Strip", "The Tree", "Hairy", "Grisly", "Ape", "Groomed Ape", "Bikini", "Lightning Bolt", "Reverse Lightning", "Love Heart", "Chestache", "Happy Face", "Skull", "Snail Trail", "Slug and Nips", "Hairy Arms"] ]; const hairList = [ diff --git a/ReallifeGamemode.Client/CharCreator/main.ts b/ReallifeGamemode.Client/CharCreator/main.ts index bdabfdab..66c11214 100644 --- a/ReallifeGamemode.Client/CharCreator/main.ts +++ b/ReallifeGamemode.Client/CharCreator/main.ts @@ -23,6 +23,11 @@ const creatorCoords = { cameraLookAt: new mp.Vector3(402.8664, -996.4108, -98.5) }; +const surgeryCoords = { + 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 charCreator(globalData: IGlobalData) { @@ -218,7 +223,7 @@ export default function charCreator(globalData: IGlobalData) { 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("Gesichtsmerkmale", "Gesichtsmerkmale des Charakters.")); creatorMainMenu.AddItem(new UIMenuItem("Aussehen", "Aussehen des Charakters.")); creatorMainMenu.AddItem(new UIMenuItem("Haar & Farben", "Haare & Farben deines Charakters.")); @@ -308,30 +313,29 @@ export default function charCreator(globalData: IGlobalData) { 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)); - globalData.InMenu = false; - globalData.InMenu = false; + leaveCreator(); break; case 7: - mp.events.callRemote("creator_Leave"); - globalData.InMenu = false; - globalData.InMenu = false; + if (isSurgery) mp.events.callRemote("surgeryLeave"); + leaveCreator(); break; } }); creatorMainMenu.MenuClose.on(() => { - mp.events.callRemote("creator_Leave"); - globalData.InMenu = false; - globalData.InMenu = false; + if (isSurgery) { + mp.events.callRemote("surgeryLeave"); + leaveCreator(); + } else { + creatorMainMenu.Open(); + } + }); creatorMainMenu.Visible = false; @@ -552,12 +556,21 @@ export default function charCreator(globalData: IGlobalData) { creatorMenus.push(creatorHairMenu); // CREATOR HAIR & COLORS END + var isSurgery = false; + // EVENTS - mp.events.add("toggleCreator", () => { + mp.events.add("toggleCreator", (charExists) => { if (creatorCamera === undefined) { - 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); + if (charExists) { + creatorCamera = mp.cameras.new("creatorCamera", surgeryCoords.camera, new mp.Vector3(0, 0, 0), 45); + creatorCamera.pointAtCoord(surgeryCoords.cameraLookAt.x, surgeryCoords.cameraLookAt.y, surgeryCoords.cameraLookAt.z); + creatorCamera.setActive(true); + isSurgery = true; + } else { + 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; @@ -569,14 +582,28 @@ export default function charCreator(globalData: IGlobalData) { 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; }) + + 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); + globalData.InMenu = false; + globalData.InMenu = false; + if (isSurgery) isSurgery = false; + } } \ No newline at end of file diff --git a/ReallifeGamemode.Client/CharCreator/surgery.ts b/ReallifeGamemode.Client/CharCreator/surgery.ts index 4e20e045..b9f1d2b6 100644 --- a/ReallifeGamemode.Client/CharCreator/surgery.ts +++ b/ReallifeGamemode.Client/CharCreator/surgery.ts @@ -22,25 +22,16 @@ const localPlayer = mp.players.local; export default function charSurgery(globalData: IGlobalData) { var creatorCamera: CameraMp; - var newCharacter: PlayerCharacterData; - - // color arrays - var hairColors = []; - for (var i = 0; i < Data.maxHairColor; i++) hairColors.push(i.toString()); - - var blushColors = []; - for (var i = 0; i < Data.maxBlushColor; i++) blushColors.push(i.toString()); - - var lipstickColors = []; - for (var i = 0; i < Data.maxLipstickColor; i++) lipstickColors.push(i.toString()); - + var activeSurgery: boolean = false; + var saveCharacter: PlayerCharacterData; var characterData: PlayerCharacterData; + function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } var creatorMainMenu: NativeUI.Menu; - var debugString = [0, 0, 0, 0, 0]; + var debugString = [0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0]; mp.events.add("render", () => { mp.game.graphics.drawText(debugString.toString(), [0.5, 0.1], @@ -55,11 +46,13 @@ export default function charSurgery(globalData: IGlobalData) { mp.events.add("toggleSurgery", (jsonCharacterData: string) => { if (!mp.cameras.exists(creatorCamera)) { + activeSurgery = true; debugString[0] = 1; characterData = JSON.parse(jsonCharacterData); - debugString[1] = 1; + saveCharacter = characterData; + debugString[1] = 2; loadCharacterData(); - debugString[2] = 1; + debugString[2] = 3; 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); @@ -72,7 +65,8 @@ export default function charSurgery(globalData: IGlobalData) { localPlayer.clearTasksImmediately(); localPlayer.freezePosition(true); mp.game.cam.renderScriptCams(true, false, 0, true, false); - debugString[3] = 1; + debugString[3] = 4; + applyCreatorOutfit(); getCharacterMainMenu(); } }); @@ -132,31 +126,32 @@ export default function charSurgery(globalData: IGlobalData) { ]; } - + //HAUPTMENÜ function getCharacterMainMenu(): NativeUI.Menu { creatorMainMenu = new Menu("Chirurg", "", new Point(0, screenRes.y / 3), null, null); creatorMainMenu.Visible = false; - + debugString[4] = 5; var genderItem = new UIMenuListItem("Geschlecht", "~r~Dies setzt deine Einstellungen zurück.", new ItemsCollection(["Männlich", "Weiblich"])); creatorMainMenu.AddItem(genderItem); genderItem.Index = characterData.Gender == false ? 0 : 1; - + debugString[5] = 6; var parentsItem = new UIMenuItem("Eltern", "Eltern des Charakters."); creatorMainMenu.AddItem(parentsItem); creatorMainMenu.BindMenuToItem(getParentsMenu(creatorMainMenu), parentsItem); - - var featureItem = new UIMenuItem("Gesichtszüge", "Gesichtszüge des Charakters.") + debugString[6] = 7; + var featureItem = new UIMenuItem("Gesichtsmerkmale", "Gesichtsmerkmale des Charakters.") creatorMainMenu.AddItem(featureItem); creatorMainMenu.BindMenuToItem(getFeaturesMenu(creatorMainMenu), featureItem); - + debugString[7] = 8; var appearanceItem = new UIMenuItem("Aussehen", "Aussehen des Charakters.") creatorMainMenu.AddItem(appearanceItem); creatorMainMenu.BindMenuToItem(getAppearanceMenu(creatorMainMenu), appearanceItem); - + debugString[8] = 9; var hairAndColorItem = new UIMenuItem("Haar & Farben", "Haare & Farben deines Charakters.") creatorMainMenu.AddItem(hairAndColorItem); creatorMainMenu.BindMenuToItem(getHairAndColorMenu(creatorMainMenu), hairAndColorItem); + debugString[9] = 10; //Charakterdrehung var angles = []; @@ -164,14 +159,14 @@ export default function charSurgery(globalData: IGlobalData) { var angleItem = new UIMenuListItem("Drehung", "", new ItemsCollection(angles)); creatorMainMenu.AddItem(angleItem); - var saveItem = new UIMenuItem("Erstellen", "Erstellt deinen Charakter."); + var saveItem = new UIMenuItem("Operieren", "Der Chirurg macht die Arbeit, lehn dich zurück"); saveItem.BackColor = new Color(13, 71, 161); saveItem.HighlightedBackColor = new Color(25, 118, 210); creatorMainMenu.AddItem(saveItem); creatorMainMenu.ListChange.on((item, listIndex) => { if (item === genderItem) { - newCharacter.Gender = listIndex; + saveCharacter.Gender = listIndex; mp.events.callRemote("creator_GenderChange", listIndex); setTimeout(() => { @@ -179,9 +174,9 @@ export default function charSurgery(globalData: IGlobalData) { applyCreatorOutfit(); angleItem.Index = 0; resetParents(); - //resetParentsMenu(true); - //resetFeaturesMenu(true); - //resetAppearanceMenu(true); + resetFeatures(); + resetAppearance(); + }, 200); } else if (item === angleItem) { localPlayer.setHeading(parseFloat(angleItem.SelectedValue)); @@ -192,46 +187,46 @@ export default function charSurgery(globalData: IGlobalData) { creatorMainMenu.MenuClose.on(() => { leaveCreator(); }); - + creatorMainMenu.Visible = true; return creatorMainMenu; } + var fatherItem: NativeUI.UIMenuListItem; + var motherItem: NativeUI.UIMenuListItem; + var similarityItem: NativeUI.UIMenuListItem; + var skinSimilarityItem: NativeUI.UIMenuListItem; + var creatorParentsMenu: NativeUI.Menu; + + //MENÜ FÜR ELTERN function getParentsMenu(parentMenu: NativeUI.Menu): NativeUI.Menu { var similarities = []; for (var i = 0; i <= 100; i++) similarities.push(i + "%"); - - var creatorParentsMenu = new Menu("Eltern", "", new Point(0, screenRes.y / 3), null, null); + + creatorParentsMenu = new Menu("Eltern", "", new Point(0, screenRes.y / 3), null, null); creatorParentsMenu.Visible = false; - var fatherItem = new UIMenuListItem("Vater", "Dem Charakter sein Vadda.", new ItemsCollection(Data.fatherNames)); + fatherItem = new UIMenuListItem("Vater", "Dem Charakter sein Vadda.", new ItemsCollection(Data.fatherNames)); creatorParentsMenu.AddItem(fatherItem); - fatherItem.Index = characterData.Father; + //fatherItem.Index = characterData.Father; - var motherItem = new UIMenuListItem("Mutter", "Dem Charakter seine Mudda.", new ItemsCollection(Data.motherNames)); + motherItem = new UIMenuListItem("Mutter", "Dem Charakter seine Mudda.", new ItemsCollection(Data.motherNames)); creatorParentsMenu.AddItem(motherItem); - motherItem.Index = characterData.Mother; + //motherItem.Index = characterData.Mother; - var similarityItem = new UIMenuListItem("\u00c4hnlichkeit", "\u00c4hnlichkeit zu den Eltern.\n(niedriger = feminin, h\u00f6her = maskulin)", new ItemsCollection(similarities)); + similarityItem = new UIMenuListItem("\u00c4hnlichkeit", "\u00c4hnlichkeit zu den Eltern.\n(niedriger = feminin, h\u00f6her = maskulin)", new ItemsCollection(similarities)); creatorParentsMenu.AddItem(similarityItem); - similarityItem.Index = characterData.Similarity; + //similarityItem.Index = characterData.Similarity; - var skinSimilarityItem = new UIMenuListItem("Hautfarbe", "Hautfarben \u00c4hnlichkeit zu den Eltern.\n(niedriger = Mutter, h\u00f6her = Vater)", new ItemsCollection(similarities)); + skinSimilarityItem = new UIMenuListItem("Hautfarbe", "Hautfarben \u00c4hnlichkeit zu den Eltern.\n(niedriger = Mutter, h\u00f6her = Vater)", new ItemsCollection(similarities)); creatorParentsMenu.AddItem(skinSimilarityItem); - skinSimilarityItem.Index = characterData.SkinSimilarity; + //skinSimilarityItem.Index = characterData.SkinSimilarity; var resetItem = new UIMenuItem("Zurücksetzen", "~r~Setzt die Eltern zurück. :'("); creatorParentsMenu.AddItem(resetItem); creatorParentsMenu.ItemSelect.on((item, index) => { - switch (item) { - case resetItem: - fatherItem.Index = characterData.Father; - motherItem.Index = characterData.Mother; - similarityItem.Index = characterData.Similarity;//(currentGender === 0) ? 100 : 0; - skinSimilarityItem.Index = characterData.SkinSimilarity;//(currentGender === 0) ? 100 : 0; - resetParents(); - //creatorParentsMenu.RefreshIndex(); - break; + if (item == resetItem) { + resetParents(); } }); @@ -239,52 +234,43 @@ export default function charSurgery(globalData: IGlobalData) { updateParents(); }); - creatorParentsMenu.RefreshIndex(); + debugString[10] = 11; + return creatorParentsMenu; } function updateParents() { localPlayer.setHeadBlendData( // shape - Data.mothers[newCharacter.Mother], - Data.fathers[newCharacter.Father], + Data.mothers[motherItem.Index], + Data.fathers[fatherItem.Index], 0, // skin - Data.mothers[newCharacter.Mother], - Data.fathers[newCharacter.Father], + Data.mothers[motherItem.Index], + Data.fathers[fatherItem.Index], 0, // mixes - newCharacter.Similarity * 0.01, - newCharacter.SkinSimilarity * 0.01, + similarityItem.Index * 0.01, + skinSimilarityItem.Index * 0.01, 0.0, false ); } - function resetParents() { - localPlayer.setHeadBlendData( - // shape - Data.mothers[characterData.Mother], - Data.fathers[characterData.Father], - 0, + function resetParents(refresh = false) { + fatherItem.Index = 0;//characterData.Father.valueOf(); + motherItem.Index = 0;//characterData.Mother.valueOf(); + similarityItem.Index = (characterData.Gender == false) ? 100 : 0; //characterData.Similarity.valueOf();// + skinSimilarityItem.Index = (characterData.Gender == false) ? 100 : 0;//characterData.SkinSimilarity.valueOf(); - // skin - Data.mothers[characterData.Mother], - Data.fathers[characterData.Father], - 0, - - // mixes - characterData.Similarity * 0.01, - characterData.SkinSimilarity * 0.01, - 0.0, - - false - ); + updateParents(); + if (refresh) creatorParentsMenu.RefreshIndex(); } + //Menü für Gesichtsmerkmale var featureItems = []; function getFeaturesMenu(parentMenu: NativeUI.Menu): NativeUI.Menu { @@ -293,13 +279,13 @@ export default function charSurgery(globalData: IGlobalData) { var creatorFeaturesMenu = new Menu("Gesichtsmerkmale", "", new Point(0, screenRes.y / 3), null, null); creatorFeaturesMenu.Visible = false; - + debugString[6] = 7; for (var i = 0; i < Data.featureNames.length; i++) { var tempFeatureItem = new UIMenuListItem(Data.featureNames[i], "", new ItemsCollection(features)); tempFeatureItem.Index = 100; featureItems.push(tempFeatureItem); creatorFeaturesMenu.AddItem(tempFeatureItem); - tempFeatureItem.Index = loadedFeatures[i]; + //tempFeatureItem.Index = loadedFeatures[i]; } var resetItem = new UIMenuItem("Zurücksetzen", "~r~Setzt Gesichtsmerkmale zurück."); @@ -308,10 +294,7 @@ export default function charSurgery(globalData: IGlobalData) { creatorFeaturesMenu.ItemSelect.on((item, index) => { switch (item) { case resetItem: - for (var i = 0; i < Data.featureNames.length; i++) { - featureItems[i].Index = loadedFeatures[i]; - updateFaceFeature(i); - } + resetFeatures(); break; } }); @@ -320,16 +303,24 @@ export default function charSurgery(globalData: IGlobalData) { updateFaceFeature(featureItems.indexOf(item)); }); - creatorFeaturesMenu.RefreshIndex(); + debugString[11] = 12; return creatorFeaturesMenu; } + function resetFeatures() { + for (let i = 0; i < Data.featureNames.length; i++) { + featureItems[i].Index = 100; + updateFaceFeature(i); + } + } + function updateFaceFeature(index) { localPlayer.setFaceFeature(index, parseFloat(featureItems[index].SelectedValue)); } var appearanceItems = []; var appearanceOpacityItems = []; + //Menü für Aussehen function getAppearanceMenu(parentMenu: NativeUI.Menu): NativeUI.Menu { @@ -338,7 +329,7 @@ export default function charSurgery(globalData: IGlobalData) { var creatorAppearanceMenu = new Menu("Aussehen", "", new Point(0, screenRes.y / 3), null, null); creatorAppearanceMenu.Visible = false; - + debugString[7] = 8; for (var i = 0; i < Data.appearanceNames.length; i++) { var items = []; for (var j = 0, max = mp.game.ped.getNumHeadOverlayValues(i); j <= max; j++) items.push(Data.appearanceItemNames[i][j] === undefined ? j.toString() : Data.appearanceItemNames[i][j]); @@ -346,13 +337,13 @@ export default function charSurgery(globalData: IGlobalData) { var tempAppearanceItem = new UIMenuListItem(Data.appearanceNames[i], "", new ItemsCollection(items)); appearanceItems.push(tempAppearanceItem); creatorAppearanceMenu.AddItem(tempAppearanceItem); - tempAppearanceItem.Index = loadedAppearance[i]; + //tempAppearanceItem.Index = loadedAppearance[i]; var tempAppearanceOpacityItem = new UIMenuListItem(Data.appearanceNames[i] + " Transparenz", "", new ItemsCollection(opacities)); tempAppearanceOpacityItem.Index = 100; appearanceOpacityItems.push(tempAppearanceOpacityItem); creatorAppearanceMenu.AddItem(tempAppearanceOpacityItem); - tempAppearanceOpacityItem.Index = loadedAppearanceOpacity[i]; + //tempAppearanceOpacityItem.Index = loadedAppearanceOpacity[i]; } var resetItem = new UIMenuItem("Zurücksetzen", "~r~Setzt das Aussehen zurück."); @@ -361,7 +352,7 @@ export default function charSurgery(globalData: IGlobalData) { creatorAppearanceMenu.ItemSelect.on((item, index) => { switch (item) { case resetItem: - resetAppearanceMenu(); + resetAppearance(); break; } }); @@ -370,7 +361,7 @@ export default function charSurgery(globalData: IGlobalData) { var idx = (creatorAppearanceMenu.CurrentSelection % 2 === 0) ? (creatorAppearanceMenu.CurrentSelection / 2) : Math.floor(creatorAppearanceMenu.CurrentSelection / 2); updateAppearance(idx); }); - + debugString[12] = 13; return creatorAppearanceMenu; } @@ -379,7 +370,7 @@ export default function charSurgery(globalData: IGlobalData) { localPlayer.setHeadOverlay(index, overlayID, appearanceOpacityItems[index].Index * 0.01, colorForOverlayIdx(index), 0); } - function resetAppearanceMenu(refresh = false) { + function resetAppearance(refresh = false) { for (var i = 0; i < Data.appearanceNames.length; i++) { appearanceItems[i].Index = loadedAppearance[i]; appearanceOpacityItems[i].Index = loadedAppearanceOpacity[i]; @@ -387,11 +378,22 @@ export default function charSurgery(globalData: IGlobalData) { } } + // color arrays + var hairColors = []; + for (var i = 0; i < Data.maxHairColor; i++) hairColors.push(i.toString()); + + var blushColors = []; + for (var i = 0; i < Data.maxBlushColor; i++) blushColors.push(i.toString()); + + var lipstickColors = []; + for (var i = 0; i < Data.maxLipstickColor; i++) lipstickColors.push(i.toString()); + + //Menü für Haar & Farben function getHairAndColorMenu(parentMenu: NativeUI.Menu): NativeUI.Menu { var creatorHairMenu = new Menu("Haar & Farben", "", new Point(0, screenRes.y / 3), null, null); creatorHairMenu.Visible = false; - + debugString[8] = 9; var eyebrowColorItem = new UIMenuListItem("Augenbrauen Farbe", "Farbe deiner Augenbrauen", new ItemsCollection(hairColors)); creatorHairMenu.AddItem(eyebrowColorItem); @@ -455,17 +457,17 @@ export default function charSurgery(globalData: IGlobalData) { break; } }); - + debugString[13] = 14; return creatorHairMenu; } function updateHairAndColors() { - localPlayer.setEyeColor(newCharacter.EyeColor); - localPlayer.setHeadOverlayColor(1, 1, newCharacter.BeardColor, 0); - localPlayer.setHeadOverlayColor(2, 1, newCharacter.EyebrowColor, 0); - localPlayer.setHeadOverlayColor(5, 2, newCharacter.BlushColor, 0); - localPlayer.setHeadOverlayColor(8, 2, newCharacter.LipstickColor, 0); - localPlayer.setHeadOverlayColor(10, 1, newCharacter.ChestHairColor, 0); + localPlayer.setEyeColor(saveCharacter.EyeColor); + localPlayer.setHeadOverlayColor(1, 1, saveCharacter.BeardColor, 0); + localPlayer.setHeadOverlayColor(2, 1, saveCharacter.EyebrowColor, 0); + localPlayer.setHeadOverlayColor(5, 2, saveCharacter.BlushColor, 0); + localPlayer.setHeadOverlayColor(8, 2, saveCharacter.LipstickColor, 0); + localPlayer.setHeadOverlayColor(10, 1, saveCharacter.ChestHairColor, 0); } function colorForOverlayIdx(index) { @@ -473,23 +475,23 @@ export default function charSurgery(globalData: IGlobalData) { switch (index) { case 1: - color = newCharacter.BeardColor; + color = saveCharacter.BeardColor; break; case 2: - color = newCharacter.EyebrowColor; + color = saveCharacter.EyebrowColor; break; case 5: - color = newCharacter.BlushColor; + color = saveCharacter.BlushColor; break; case 8: - color = newCharacter.LipstickColor; + color = saveCharacter.LipstickColor; break; case 10: - color = newCharacter.ChestHairColor; + color = saveCharacter.ChestHairColor; break; default: @@ -500,7 +502,7 @@ export default function charSurgery(globalData: IGlobalData) { } function applyCreatorOutfit() { - if (newCharacter.Gender === false) { + if (saveCharacter.Gender === false) { localPlayer.setDefaultComponentVariation(); localPlayer.setComponentVariation(3, 15, 0, 2); localPlayer.setComponentVariation(4, 21, 0, 2); @@ -518,6 +520,7 @@ export default function charSurgery(globalData: IGlobalData) { } function leaveCreator() { + activeSurgery = false; mp.gui.chat.show(true); mp.game.ui.displayRadar(true); mp.game.ui.displayHud(true); diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index d6ba2c51..8572b86d 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -271,8 +271,8 @@ ammunation(globalData); import handsup from './Player/handsup'; handsup(); -import charSurgery from './CharCreator/surgery'; -charSurgery(globalData); +//import charSurgery from './CharCreator/surgery'; +//charSurgery(globalData); import spawnschutz from './Player/spawnschutz'; spawnschutz(); diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 9f075e1d..b8a05068 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -552,7 +552,23 @@ namespace ReallifeGamemode.Server.Events } if (CharacterCreator.surgeryPoint.DistanceTo(player.Position) <= 1.5) { - CharacterCreator.StartSurgery(player); + var freeSurgery = player.GetUser().FreeSurgery; + if(freeSurgery == false && player.GetUser().BankAccount.Balance < 15000) + { + ChatService.ErrorMessage(player, "Du benötigst $15.000 auf dem Bankkonto um die Operation durchzuführen"); + return; + } + ChatService.SendMessage(player, "~r~ACHTUNG! Dadurch wird dein alter Charakter gelöscht. Du kannst dir hiermit einen neuen erstellen.\nBeim Wechsel des Geschlechts verlierst du ebenfalls deine gekaufte Kleidung"); + if (freeSurgery == true) + { + ChatService.SendMessage(player, "Du kannst deinen Charakter dieses mal kostenlos erstellen"); + } + else + { + ChatService.SendMessage(player, "Die Änderung des Charakters kostet ~g~$15.000"); + } + ChatService.SendMessage(player, "Du kannst die Charaktererstellung wieder verlassen und behältst deinen alten Charakter! Bitte starte mit ~g~J"); + player.SetData("charSurgery", true); } if (user.FactionLeader) { @@ -638,6 +654,12 @@ namespace ReallifeGamemode.Server.Events return; } + if(player.GetData("charSurgery") == true) + { + CharacterCreator.StartSurgery(player); + player.ResetData("charSurgery"); + } + User u = player.GetUser(); if (u.JobId == null) return; diff --git a/ReallifeGamemode.Server/Events/Register.cs b/ReallifeGamemode.Server/Events/Register.cs index c736a54f..c67bd0b8 100644 --- a/ReallifeGamemode.Server/Events/Register.cs +++ b/ReallifeGamemode.Server/Events/Register.cs @@ -79,7 +79,7 @@ namespace ReallifeGamemode.Server.Events currentPlayerCreatorDimension++; NAPI.Data.SetWorldData("playerCreatorDimension", currentPlayerCreatorDimension); player.Dimension = NAPI.Data.GetWorldData("playerCreatorDimension"); - player.TriggerEvent("toggleCreator"); + player.TriggerEvent("toggleCreator",false); player.SafeTeleport(new Vector3(402.8664, -996.4108, -99.00027)); //player.Position = new Vector3(user.PositionX, user.PositionY, user.PositionZ); diff --git a/ReallifeGamemode.Server/Managers/CharacterCreator.cs b/ReallifeGamemode.Server/Managers/CharacterCreator.cs index 71f9c5fc..3a0a2fdd 100644 --- a/ReallifeGamemode.Server/Managers/CharacterCreator.cs +++ b/ReallifeGamemode.Server/Managers/CharacterCreator.cs @@ -4,6 +4,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using ReallifeGamemode.Database.Entities; using ReallifeGamemode.Database.Models; +using ReallifeGamemode.Server.Events; using ReallifeGamemode.Server.Extensions; namespace ReallifeGamemode.Server.Managers @@ -31,6 +32,21 @@ namespace ReallifeGamemode.Server.Managers [RemoteEvent("creatorSave")] public void CreatorSave(Player player, bool gender, string parentData, string featureData, string appearanceData, string hairAndColorData) { + + var charExists = false; + var genderSwap = false; + + var cUser = player.GetUser(); + + if (cUser.CharacterId != null) + { + charExists = true; + if(cUser.Character.Gender != gender) + { + genderSwap = true; + } + } + var jParentData = JObject.Parse(parentData); var jFeatureData = JArray.Parse(featureData); var jAppearanceData = JArray.Parse(appearanceData); @@ -161,14 +177,26 @@ namespace ReallifeGamemode.Server.Managers ChestHairColor = chestHairColor }; + saveCharacter.Characters.Add(character); saveCharacter.SaveChanges(); var userId = player.GetUser().Id; - var user = saveCharacter.Users.SingleOrDefault(u => u.Id == userId); + var user = saveCharacter.Users.SingleOrDefault(u => u.Id == userId); user.CharacterId = character.Id; + if (genderSwap) + { + var charClothes = saveCharacter.CharacterClothes.Where(c => c.UserId == user.Id); + + foreach(var cloth in charClothes) + { + saveCharacter.Remove(cloth); + saveCharacter.SaveChanges(); + } + } + for (var x = 1; x <= 11; x++) { var s = 0; @@ -232,16 +260,19 @@ namespace ReallifeGamemode.Server.Managers break; }; } - var createClothes = new Database.Entities.CharacterCloth() + if (!charExists || genderSwap) { - UserId = userId, - Duty = false, - SlotType = 1, - SlotId = x, - ClothId = y, - Texture = 0 - }; - saveCharacter.CharacterClothes.Add(createClothes); + var createClothes = new Database.Entities.CharacterCloth() + { + UserId = userId, + Duty = false, + SlotType = 1, + SlotId = x, + ClothId = y, + Texture = 0 + }; + saveCharacter.CharacterClothes.Add(createClothes); + } } else { @@ -249,6 +280,12 @@ namespace ReallifeGamemode.Server.Managers } } + + if (charExists) + { + user.BankAccount.Balance -= 15000; + if(user.FreeSurgery == true) user.FreeSurgery = false; + } saveCharacter.SaveChanges(); } //HeadOverlay makeupHo = new HeadOverlay() @@ -270,6 +307,12 @@ namespace ReallifeGamemode.Server.Managers player.SafeTeleport(Main.DEFAULT_SPAWN_POSITION, Main.DEFAULT_SPAWN_HEADING, true); player.TriggerEvent("draw", player.Name, player.Handle.Value); player.Dimension = 0; + + if (charExists) + { + ApplyCharacter(player); + UpdateCharacterCloth.LoadCharacterDefaults(player); + } } /// @@ -424,6 +467,7 @@ namespace ReallifeGamemode.Server.Managers } public static void StartSurgery(Player player) { + /* Character c = player.GetUser().GetCharacter(); var PlayerCharacterData = new @@ -487,7 +531,7 @@ namespace ReallifeGamemode.Server.Managers BlushColor = c.BlushColor, LipstickColor = c.LipstickColor, ChestHairColor = c.ChestHairColor - }; + };*/ var currentPlayerCreatorDimension = (uint)NAPI.Data.GetWorldData("playerCreatorDimension"); currentPlayerCreatorDimension++; @@ -495,7 +539,7 @@ namespace ReallifeGamemode.Server.Managers player.Dimension = NAPI.Data.GetWorldData("playerCreatorDimension"); player.SafeTeleport(new Vector3(266.472, -1339.1357, 24.5378)); player.Heading = 146.35101f; - player.TriggerEvent("toggleSurgery", JsonConvert.SerializeObject(PlayerCharacterData)); + player.TriggerEvent("toggleCreator", true); } [RemoteEvent("surgeryLeave")] @@ -504,6 +548,7 @@ namespace ReallifeGamemode.Server.Managers player.Dimension = 0; player.SafeTeleport(new Vector3(258.581, -1345.1406, 24.5378), Main.DEFAULT_SPAWN_HEADING, true); ApplyCharacter(player); + UpdateCharacterCloth.LoadCharacterDefaults(player); } [RemoteEvent("SaveSurgery")] public static void SaveSurgery(Player player, bool gender, string parentData, string featureData, string appearanceData, string hairAndColorData) From e631d0259296704fd7be03e2ce61319481939e47 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Mon, 3 May 2021 21:37:39 +0200 Subject: [PATCH 05/20] Fix global.d.ts --- ReallifeGamemode.Client/global.d.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/ReallifeGamemode.Client/global.d.ts b/ReallifeGamemode.Client/global.d.ts index 49a68bad..28e23ada 100644 --- a/ReallifeGamemode.Client/global.d.ts +++ b/ReallifeGamemode.Client/global.d.ts @@ -95,7 +95,6 @@ declare type RentcarProperty = { Name: string; Price: number; } -} declare type PlayerCharacterData = { Gender: boolean; From 0206dff79325d0cfacfeb00d6cbf12cdec6e1496 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Mon, 3 May 2021 21:56:49 +0200 Subject: [PATCH 06/20] Fix Geld abziehen obwohl gratis --- ReallifeGamemode.Server/Managers/CharacterCreator.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Server/Managers/CharacterCreator.cs b/ReallifeGamemode.Server/Managers/CharacterCreator.cs index d7b62b32..958fe597 100644 --- a/ReallifeGamemode.Server/Managers/CharacterCreator.cs +++ b/ReallifeGamemode.Server/Managers/CharacterCreator.cs @@ -279,9 +279,15 @@ namespace ReallifeGamemode.Server.Managers } if (charExists) - { - user.BankAccount.Balance -= 15000; - if(user.FreeSurgery == true) user.FreeSurgery = false; + { + if (user.FreeSurgery == true) + { + user.FreeSurgery = false; + } + else + { + user.BankAccount.Balance -= 15000; + } saveCharacter.Remove(oldChar); } saveCharacter.SaveChanges(); From b75ab7bb38f8b42c2eae04fad5475a338cf15053 Mon Sep 17 00:00:00 2001 From: Fabian Date: Mon, 3 May 2021 21:58:32 +0200 Subject: [PATCH 07/20] RENTCAR FIX DANKE EMRE --- ReallifeGamemode.Client/util/rentcar.ts | 2 ++ ReallifeGamemode.Server/Events/Key.cs | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ReallifeGamemode.Client/util/rentcar.ts b/ReallifeGamemode.Client/util/rentcar.ts index 58095235..944cd635 100644 --- a/ReallifeGamemode.Client/util/rentcar.ts +++ b/ReallifeGamemode.Client/util/rentcar.ts @@ -98,5 +98,7 @@ export default function rentCar(globalData: IGlobalData) { mp.events.add('abortRentcarTimer', () => { clearInterval(payTimer); + totalBill = 0; + totalTime = 0; }); } \ No newline at end of file diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index 965ec8c9..601520f5 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -371,22 +371,22 @@ namespace ReallifeGamemode.Server.Events //Stadthalle else if (player.Position.DistanceTo(PositionManager.rentcarPoints[1].Position) <= 1.5) { - player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.stadthalleVehicleProperties), "stadthalle"); + player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.stadthalleVehicleProperties), "lamesa"); } //Knast else if (player.Position.DistanceTo(PositionManager.rentcarPoints[2].Position) <= 1.5) { - player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.knastVehicleProperties), "knast"); + player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.knastVehicleProperties), "stadthalle"); } //Paleto else if (player.Position.DistanceTo(PositionManager.rentcarPoints[3].Position) <= 1.5) { - player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.paletoVehicleProperties), "paleto"); + player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.paletoVehicleProperties), "knast"); } //Lamesa else if (player.Position.DistanceTo(PositionManager.rentcarPoints[4].Position) <= 1.5) { - player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.paletoVehicleProperties), "lamesa"); + player.TriggerEvent("showRentcarMenu", JsonConvert.SerializeObject(Rentcar.paletoVehicleProperties), "paleto"); } } From eba04fb18eb01f488b5f8ace5526546dd41abb33 Mon Sep 17 00:00:00 2001 From: VegaZ Date: Mon, 3 May 2021 22:57:26 +0200 Subject: [PATCH 08/20] Add Gesamtverdienst im Gehaltsscheck --- .../Interaction/interactionmenu.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ReallifeGamemode.Client/Interaction/interactionmenu.ts b/ReallifeGamemode.Client/Interaction/interactionmenu.ts index 0eb1b053..6bff316d 100644 --- a/ReallifeGamemode.Client/Interaction/interactionmenu.ts +++ b/ReallifeGamemode.Client/Interaction/interactionmenu.ts @@ -132,6 +132,17 @@ export default function (globalData: IGlobalData) { item.SetRightLabel(moneyFormat(Number((p.financialInterest * 100).toFixed(3))) + "%"); paycheckMenu.AddItem(item); + item = new UIMenuItem("Gesamt"); + if (p.amount >= 0) { + item.SetRightLabel("~g~+ $" + moneyFormat(Number(p.amount.toFixed(2)))); + } else { + item.SetRightLabel("~r~- $" + moneyFormat(Number(p.amount.toFixed(2)))); + } + item.BackColor = new Color(0, 0, 0); + item.HighlightedBackColor = new Color(0, 0, 0); + item.HighlightedForeColor = new Color(255, 255, 255); + paycheckMenu.AddItem(item) + menu.AddItem(paycheckItem); menu.BindMenuToItem(paycheckMenu, paycheckItem); } From f56a9340e80ad9c30a85f4ec0bbbe89db63468be Mon Sep 17 00:00:00 2001 From: VegaZ Date: Mon, 3 May 2021 23:09:09 +0200 Subject: [PATCH 09/20] =?UTF-8?q?Pay=20/=20=C3=9Cberweisung=20erst=20ab=20?= =?UTF-8?q?3=20Spielstunden?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReallifeGamemode.Server/Bank/bank.cs | 5 +++++ ReallifeGamemode.Server/Managers/InteractionManager.cs | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/ReallifeGamemode.Server/Bank/bank.cs b/ReallifeGamemode.Server/Bank/bank.cs index 145b97ce..a17e81c6 100644 --- a/ReallifeGamemode.Server/Bank/bank.cs +++ b/ReallifeGamemode.Server/Bank/bank.cs @@ -132,6 +132,11 @@ namespace ReallifeGamemode.Server.Bank using (var dbContext = new DatabaseContext()) { + if (player.GetUser().PlayedMinutes < 180) + { + player.SendNotification("~r~Du kannst Geld erst ab 3 Spielstunden vergeben"); + return; + } if (player.GetUser(dbContext) == target.GetUser(dbContext)) { player.SendNotification($"~r~Du kannst dir selber kein Geld überweisen."); diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index ce438abe..78983665 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -752,6 +752,12 @@ namespace ReallifeGamemode.Server.Managers [RemoteEvent("CLIENT:InteractionMenu_Pay")] public void InteractionMenu_Pay(Player player, string jsonNameOrId, string stringAmount) { + if (player.GetUser().PlayedMinutes < 180) + { + player.SendNotification("~r~Du kannst Geld erst ab 3 Spielstunden vergeben"); + return; + } + string nameOrId = (string)JsonConvert.DeserializeObject(jsonNameOrId); int amount; try From 752dd769134bf65fd6ab710f0ca38fe20fdb3ea8 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 May 2021 23:27:06 +0200 Subject: [PATCH 10/20] drafter police "drafterintcept" --- ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf | 3 +++ ReallifeGamemode.Server/Managers/VehicleManager.cs | 1 + 2 files changed, 4 insertions(+) create mode 100644 ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf diff --git a/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf b/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf new file mode 100644 index 00000000..096bc657 --- /dev/null +++ b/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a34587cb6472ce1b50714b75356888d000fcfc01410d969e4587e3ee69c9577 +size 106804736 diff --git a/ReallifeGamemode.Server/Managers/VehicleManager.cs b/ReallifeGamemode.Server/Managers/VehicleManager.cs index fdcfae35..d4c47e44 100644 --- a/ReallifeGamemode.Server/Managers/VehicleManager.cs +++ b/ReallifeGamemode.Server/Managers/VehicleManager.cs @@ -776,6 +776,7 @@ namespace ReallifeGamemode.Server.Managers "vicechee", //mod "sheriffcoqm", //mod "polcoquette", //mod + "drafterintcept", //mod }; private static readonly Dictionary _serverVehicles = new Dictionary(); From 6332bdba78f8375a04c4872f945dc931f0a8d1dc Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 May 2021 23:33:46 +0200 Subject: [PATCH 11/20] pdrafter fix --- ReallifeGamemode.Server/Managers/VehicleManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Managers/VehicleManager.cs b/ReallifeGamemode.Server/Managers/VehicleManager.cs index d4c47e44..2f1e4f0e 100644 --- a/ReallifeGamemode.Server/Managers/VehicleManager.cs +++ b/ReallifeGamemode.Server/Managers/VehicleManager.cs @@ -776,7 +776,7 @@ namespace ReallifeGamemode.Server.Managers "vicechee", //mod "sheriffcoqm", //mod "polcoquette", //mod - "drafterintcept", //mod + "pdrafter", //mod }; private static readonly Dictionary _serverVehicles = new Dictionary(); From 167b92d71f2e787ff4c3254dcf85cec9b0685686 Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 May 2021 23:38:24 +0200 Subject: [PATCH 12/20] pdrafter2 --- ReallifeGamemode.Server/Managers/VehicleManager.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ReallifeGamemode.Server/Managers/VehicleManager.cs b/ReallifeGamemode.Server/Managers/VehicleManager.cs index 2f1e4f0e..4468e454 100644 --- a/ReallifeGamemode.Server/Managers/VehicleManager.cs +++ b/ReallifeGamemode.Server/Managers/VehicleManager.cs @@ -777,6 +777,7 @@ namespace ReallifeGamemode.Server.Managers "sheriffcoqm", //mod "polcoquette", //mod "pdrafter", //mod + "pdrafter2", //mod }; private static readonly Dictionary _serverVehicles = new Dictionary(); From 1f4a5d6672de05f9647bc25e0ac5e57b2703158a Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 May 2021 23:41:10 +0200 Subject: [PATCH 13/20] fix pdrafter zaund --- ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf b/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf index 096bc657..ef7b39bd 100644 --- a/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf +++ b/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6a34587cb6472ce1b50714b75356888d000fcfc01410d969e4587e3ee69c9577 +oid sha256:274b9a53a9098b5d32c1a4527ccc6d09a070cd5111812ddb1b55374a9248cb4e size 106804736 From d135fe755935149c6974d9d6dd208a6ee0ebfa7c Mon Sep 17 00:00:00 2001 From: hydrant Date: Mon, 3 May 2021 23:52:17 +0200 Subject: [PATCH 14/20] pdrafter test --- ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf b/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf index ef7b39bd..166831eb 100644 --- a/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf +++ b/ReallifeGamemode.Client/dlcpacks/drafterintcept/dlc.rpf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:274b9a53a9098b5d32c1a4527ccc6d09a070cd5111812ddb1b55374a9248cb4e -size 106804736 +oid sha256:a4100176763845d0d863b7e4782dd8ba3e316a078084704c80eba2e565b1edc6 +size 106824192 From c62a9a0a88a093493b784b3e4469be21cc0fb9f7 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 4 May 2021 17:45:28 +0200 Subject: [PATCH 15/20] beifahrer fahrer waypoint --- ReallifeGamemode.Client/util/waypoint.ts | 21 ++++++++++- ReallifeGamemode.Server/Events/Waypoint.cs | 43 ++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 ReallifeGamemode.Server/Events/Waypoint.cs diff --git a/ReallifeGamemode.Client/util/waypoint.ts b/ReallifeGamemode.Client/util/waypoint.ts index f7293d13..8ac5d28a 100644 --- a/ReallifeGamemode.Client/util/waypoint.ts +++ b/ReallifeGamemode.Client/util/waypoint.ts @@ -1,5 +1,24 @@ export default function waypointUtil() { - mp.events.add("SERVER:Util_setWaypoint", (x, y) => { + + let x_saved: number; + let y_saved: number; + let z_saved: number; + + mp.events.add("SERVER:Util_setWaypoint", (x, y, z) => { mp.game.ui.setNewWaypoint(x, y); }); + + mp.events.add("playerCreateWaypoint", (position) => { + x_saved = position.x; + y_saved = position.y; + z_saved = position.z; + mp.events.callRemote("SERVER:waypointToDriver", position.x, position.y); + }); + + mp.events.add("gotoWaypoint", () => { + mp.gui.chat.push("xyz: " + x_saved + " " + y_saved + " " + z_saved); + mp.players.local.position = new mp.Vector3(x_saved, y_saved, z_saved); + + //coord.z = mp.game.gameplay.getGroundZFor3dCoord(coord.x, coord.y, i * 50, 0, false); // try calcualte Z + }); } \ No newline at end of file diff --git a/ReallifeGamemode.Server/Events/Waypoint.cs b/ReallifeGamemode.Server/Events/Waypoint.cs new file mode 100644 index 00000000..ed2ccfa0 --- /dev/null +++ b/ReallifeGamemode.Server/Events/Waypoint.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Text; +using GTANetworkAPI; +using ReallifeGamemode.Database.Entities; +using ReallifeGamemode.Server.Services; +using ReallifeGamemode.Services; + +namespace ReallifeGamemode.Server.Events +{ + class Waypoint : Script + { + [RemoteEvent("SERVER:waypointToDriver")] + public void setWaypointToDriver(Player player, float x, float y) + { + if (!player.IsInVehicle) + { + return; + } + + if (player.VehicleSeat == 0) + { + return; + } + ChatService.Broadcast("a"); + + Entity entity = NAPI.Vehicle.GetVehicleDriver(player.Vehicle); + Player target = PlayerService.GetPlayerByNameOrId(entity.Value.ToString()); + + + ChatService.Broadcast("b"); + + if (target == null) + { + return; + } + + ChatService.Broadcast("c"); + + target.TriggerEvent("SERVER:Util_setWaypoint", x, y); + } + } +} From e8e23ad34298d39991b12b6c19a0b45976565e57 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 4 May 2021 17:53:22 +0200 Subject: [PATCH 16/20] chatmeldungen raus mit die viecher --- ReallifeGamemode.Client/util/waypoint.ts | 2 -- ReallifeGamemode.Server/Events/Waypoint.cs | 6 ------ 2 files changed, 8 deletions(-) diff --git a/ReallifeGamemode.Client/util/waypoint.ts b/ReallifeGamemode.Client/util/waypoint.ts index 8ac5d28a..a2438e4b 100644 --- a/ReallifeGamemode.Client/util/waypoint.ts +++ b/ReallifeGamemode.Client/util/waypoint.ts @@ -18,7 +18,5 @@ mp.events.add("gotoWaypoint", () => { mp.gui.chat.push("xyz: " + x_saved + " " + y_saved + " " + z_saved); mp.players.local.position = new mp.Vector3(x_saved, y_saved, z_saved); - - //coord.z = mp.game.gameplay.getGroundZFor3dCoord(coord.x, coord.y, i * 50, 0, false); // try calcualte Z }); } \ No newline at end of file diff --git a/ReallifeGamemode.Server/Events/Waypoint.cs b/ReallifeGamemode.Server/Events/Waypoint.cs index ed2ccfa0..92e968a3 100644 --- a/ReallifeGamemode.Server/Events/Waypoint.cs +++ b/ReallifeGamemode.Server/Events/Waypoint.cs @@ -22,21 +22,15 @@ namespace ReallifeGamemode.Server.Events { return; } - ChatService.Broadcast("a"); Entity entity = NAPI.Vehicle.GetVehicleDriver(player.Vehicle); Player target = PlayerService.GetPlayerByNameOrId(entity.Value.ToString()); - - ChatService.Broadcast("b"); - if (target == null) { return; } - ChatService.Broadcast("c"); - target.TriggerEvent("SERVER:Util_setWaypoint", x, y); } } From c404a97296e07a30b3bdd4eb84ce002066014480 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 4 May 2021 17:55:24 +0200 Subject: [PATCH 17/20] notification hihihihi --- ReallifeGamemode.Server/Events/Waypoint.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Server/Events/Waypoint.cs b/ReallifeGamemode.Server/Events/Waypoint.cs index 92e968a3..5e6a6697 100644 --- a/ReallifeGamemode.Server/Events/Waypoint.cs +++ b/ReallifeGamemode.Server/Events/Waypoint.cs @@ -24,14 +24,15 @@ namespace ReallifeGamemode.Server.Events } Entity entity = NAPI.Vehicle.GetVehicleDriver(player.Vehicle); - Player target = PlayerService.GetPlayerByNameOrId(entity.Value.ToString()); + Player driver = PlayerService.GetPlayerByNameOrId(entity.Value.ToString()); - if (target == null) + if (driver == null) { return; } - target.TriggerEvent("SERVER:Util_setWaypoint", x, y); + driver.TriggerEvent("SERVER:Util_setWaypoint", x, y); + driver.SendNotification(player.Name + " hat die einen Waypoint gesetzt"); } } } From bb0516e1f00738e277ac0896968470e88f812675 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 4 May 2021 17:57:03 +0200 Subject: [PATCH 18/20] rechtschreibung --- ReallifeGamemode.Server/Events/Waypoint.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Events/Waypoint.cs b/ReallifeGamemode.Server/Events/Waypoint.cs index 5e6a6697..6821d37a 100644 --- a/ReallifeGamemode.Server/Events/Waypoint.cs +++ b/ReallifeGamemode.Server/Events/Waypoint.cs @@ -32,7 +32,7 @@ namespace ReallifeGamemode.Server.Events } driver.TriggerEvent("SERVER:Util_setWaypoint", x, y); - driver.SendNotification(player.Name + " hat die einen Waypoint gesetzt"); + driver.SendNotification(player.Name + " hat dir einen Waypoint gesetzt"); } } } From 60f1cc864d03d26a19c50997f3a8244caacc2a06 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 4 May 2021 19:19:24 +0200 Subject: [PATCH 19/20] notification waypoint --- ReallifeGamemode.Client/util/waypoint.ts | 7 ++++--- ReallifeGamemode.Server/Events/Waypoint.cs | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ReallifeGamemode.Client/util/waypoint.ts b/ReallifeGamemode.Client/util/waypoint.ts index a2438e4b..b8c5b06c 100644 --- a/ReallifeGamemode.Client/util/waypoint.ts +++ b/ReallifeGamemode.Client/util/waypoint.ts @@ -3,6 +3,7 @@ let x_saved: number; let y_saved: number; let z_saved: number; + let waypointSet: boolean; mp.events.add("SERVER:Util_setWaypoint", (x, y, z) => { mp.game.ui.setNewWaypoint(x, y); @@ -12,11 +13,11 @@ x_saved = position.x; y_saved = position.y; z_saved = position.z; + waypointSet = true; mp.events.callRemote("SERVER:waypointToDriver", position.x, position.y); }); - mp.events.add("gotoWaypoint", () => { - mp.gui.chat.push("xyz: " + x_saved + " " + y_saved + " " + z_saved); - mp.players.local.position = new mp.Vector3(x_saved, y_saved, z_saved); + mp.events.add("playerRemoveWaypoint", () => { + waypointSet = false; }); } \ No newline at end of file diff --git a/ReallifeGamemode.Server/Events/Waypoint.cs b/ReallifeGamemode.Server/Events/Waypoint.cs index 6821d37a..a8a0cf07 100644 --- a/ReallifeGamemode.Server/Events/Waypoint.cs +++ b/ReallifeGamemode.Server/Events/Waypoint.cs @@ -26,13 +26,14 @@ namespace ReallifeGamemode.Server.Events Entity entity = NAPI.Vehicle.GetVehicleDriver(player.Vehicle); Player driver = PlayerService.GetPlayerByNameOrId(entity.Value.ToString()); - if (driver == null) + if (driver == null || entity == null) { return; } driver.TriggerEvent("SERVER:Util_setWaypoint", x, y); - driver.SendNotification(player.Name + " hat dir einen Waypoint gesetzt"); + driver.SendNotification(player.Name + " hat dir eine Markierung auf der Karte gesetzt"); + player.SendNotification("Du hast " + driver.Name + " eine Markierung auf der Karte gesetzt"); } } } From 460f98c1c80903ba16c1766ac0b42ac2719812fb Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 4 May 2021 19:38:36 +0200 Subject: [PATCH 20/20] aunshow tsupport dies das --- ReallifeGamemode.Server/Commands/AdminCommands.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 01f7d261..4b42c94f 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -314,6 +314,12 @@ namespace ReallifeGamemode.Server.Commands player.TriggerEvent("toggleTSupportMode", false); player.SetData("SAdminduty", false); ChatService.SendMessage(player, "!{#ee4d2e}** " + "Du befindest dich nicht mehr im T-Support"); + + if (user.GetData("adminUnshow") == true) + { + user.SetData("adminUnshow", false); + player.TriggerEvent("toggleAdminUnshowMode", false); + } } user.SetBlipAndNametagColor(); }