From 922acd6847be9ac67b1cec9429bc0fdba032259c Mon Sep 17 00:00:00 2001 From: VegaZ Date: Thu, 22 Apr 2021 22:24:27 +0200 Subject: [PATCH 001/167] 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 002/167] 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 4e2e1a46ebe3ce8cfb528a0a07458cbf132c583c Mon Sep 17 00:00:00 2001 From: hydrant Date: Tue, 27 Apr 2021 13:52:49 +0200 Subject: [PATCH 003/167] Revert "remove garbage" This reverts commit fa0be13bb23077ac0610b453f81e3656f23bc768 --- ReallifeGamemode.Server/Events/Death.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index baeede9d..c41bbb90 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -71,6 +71,11 @@ namespace ReallifeGamemode.Server.Events if (killerUser != null) { NAPI.Util.ConsoleOutput($"OnPlayerDeath - Player {player.Name} died - Killer GetUser is not null"); + killerId = killerUser.Id; + killerPosX = killer.Position.X; + killerPosY = killer.Position.Y; + killerPosZ = killer.Position.Z; + killerHeading = killer.Heading; var playerInGangwar = player.HasData("inGangWar"); var killerInGangwar = killer.HasData("inGangWar"); From b93766726cb7921d6a7779d8bef07fa148bb2b4a Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 27 Apr 2021 15:44:42 +0200 Subject: [PATCH 004/167] jailout punkte, besser testen den lachs --- ReallifeGamemode.Server/Events/Death.cs | 2 +- ReallifeGamemode.Server/Events/Login.cs | 2 +- ReallifeGamemode.Server/Finance/Economy.cs | 2 +- ReallifeGamemode.Server/Wanted/Jail.cs | 13 ++++++------- ReallifeGamemode.Server/Wanted/JailInLocations.cs | 12 ++++++++++++ 5 files changed, 21 insertions(+), 10 deletions(-) create mode 100644 ReallifeGamemode.Server/Wanted/JailInLocations.cs diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index c41bbb90..21c12c75 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -148,7 +148,7 @@ namespace ReallifeGamemode.Server.Events if (copNearby) { user.SetJailTime(true, dbContext); - Jail.Check_PutBehindBars(user, "cell"); + Jail.Check_PutBehindBars(user, JailInLocations.InCell); ChatService.HQMessage(user.Name + " wurde ins Gefängnis eingeliefert."); } else diff --git a/ReallifeGamemode.Server/Events/Login.cs b/ReallifeGamemode.Server/Events/Login.cs index 639baff4..cef95c6c 100644 --- a/ReallifeGamemode.Server/Events/Login.cs +++ b/ReallifeGamemode.Server/Events/Login.cs @@ -164,7 +164,7 @@ namespace ReallifeGamemode.Server.Events } else { - Jail.Check_PutBehindBars(user, "cell"); + Jail.Check_PutBehindBars(user, JailInLocations.InCell); } player.Dimension = 0; diff --git a/ReallifeGamemode.Server/Finance/Economy.cs b/ReallifeGamemode.Server/Finance/Economy.cs index 4bf28832..456f25af 100644 --- a/ReallifeGamemode.Server/Finance/Economy.cs +++ b/ReallifeGamemode.Server/Finance/Economy.cs @@ -200,7 +200,7 @@ namespace ReallifeGamemode.Server.Finance if (putInJail != 0 && minusJail) { - Jail.Check_PutBehindBars(u, "cell"); + Jail.Check_PutBehindBars(u, JailInLocations.InCell); } } diff --git a/ReallifeGamemode.Server/Wanted/Jail.cs b/ReallifeGamemode.Server/Wanted/Jail.cs index 0db1d8dc..6af59153 100644 --- a/ReallifeGamemode.Server/Wanted/Jail.cs +++ b/ReallifeGamemode.Server/Wanted/Jail.cs @@ -29,8 +29,7 @@ namespace ReallifeGamemode.Server.Wanted new Vector3(1651.512, 2570.2249, 45.564907) }; - //positionInJail: ENTWEDER "cell" ODER "outside", TODO: enum oder sowas - public static void Check_PutBehindBars(User user, String positionInJail) + public static void Check_PutBehindBars(User user, JailInLocations positionInJail) { user.SetBlipAndNametagColor(); Player player = user.Player; @@ -45,14 +44,14 @@ namespace ReallifeGamemode.Server.Wanted Vector3 position = null; - if (positionInJail == "cell") + if (positionInJail == JailInLocations.InCell) { Random rnd = new Random(); int rndInt = rnd.Next(1, 3); position = prisonCells[rndInt]; } - else if (positionInJail == "outside") + else if (positionInJail == JailInLocations.Outside) { position = new Vector3(1691.42, 2562.77, 45.56); } @@ -115,7 +114,7 @@ namespace ReallifeGamemode.Server.Wanted user.AnnouncePlayerJailedIn(); dbContext.SaveChanges(); //HERE: Freilauf - Check_PutBehindBars(user, "outside"); + Check_PutBehindBars(user, JailInLocations.Outside); break; } } @@ -179,7 +178,7 @@ namespace ReallifeGamemode.Server.Wanted dbContext.SaveChanges(); } player.SafeSetHealth(100); - player.SafeTeleport(new Vector3(427.879, -984.65, 30.71)); + player.SafeTeleport(JailOut_Point); ChatService.HQMessage("Beamter " + cop.Name + " hat " + user.Name + " aus dem Knast entlassen."); ChatService.SendMessage(player, "!{#8181E9}Der Beamte " + cop.Name + " hat dich aus dem Knast entlassen"); @@ -199,7 +198,7 @@ namespace ReallifeGamemode.Server.Wanted dbContext.SaveChanges(); target.SafeSetHealth(100); - target.SafeTeleport(new Vector3(427.879, -984.65, 30.71)); + target.SafeTeleport(JailOut_Point); ChatService.HQMessage(" Admin " + admin.Name + " hat " + user.Name + " aus dem Knast entlassen."); ChatService.SendMessage(target, "!{#8181E9}Admin " + admin.Name + " hat dich aus dem Knast entlassen"); diff --git a/ReallifeGamemode.Server/Wanted/JailInLocations.cs b/ReallifeGamemode.Server/Wanted/JailInLocations.cs new file mode 100644 index 00000000..b988c9db --- /dev/null +++ b/ReallifeGamemode.Server/Wanted/JailInLocations.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ReallifeGamemode.Server.Wanted +{ + public enum JailInLocations + { + Outside, + InCell + } +} From 7aa23f0c3c23e16464e13e3a210962c3ab2b79e3 Mon Sep 17 00:00:00 2001 From: Luke Date: Tue, 27 Apr 2021 13:48:15 +0000 Subject: [PATCH 005/167] GW-Meldung fix --- ReallifeGamemode.Server/Gangwar/Turf.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Server/Gangwar/Turf.cs b/ReallifeGamemode.Server/Gangwar/Turf.cs index 9d6e011e..09f85b64 100644 --- a/ReallifeGamemode.Server/Gangwar/Turf.cs +++ b/ReallifeGamemode.Server/Gangwar/Turf.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -279,7 +279,7 @@ namespace ReallifeGamemode.Server.Gangwar } else if (getOwner() != FactionName) { - takeOverMessage = $"~y~[GANGWAR] ~w~Die {getAttacker()} konnten das Gebiet ~g~{getName()} ~w~ der {getAttacker()} erfolgreich erobern."; + takeOverMessage = $"~y~[GANGWAR] ~w~Die {getAttacker()} konnten das Gebiet ~g~{getName()} ~w~ der {getOwner()} erfolgreich erobern."; //ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte das Gebiet ~r~" + getName() + "~w~ nicht verteidigen.", ownerFaction); //ChatService.BroadcastFaction("~y~[GANGWAR] ~w~Deine Fraktion konnte erfolgreich das Gebiet ~g~" + getName() + "~w~ erobern.", attackerFaction); foreach (var o in owners) From 902ec55b7a6ce9644d80215e7c954cfbf6646ac6 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 27 Apr 2021 18:38:42 +0200 Subject: [PATCH 006/167] test spawnschutz --- ReallifeGamemode.Client/Player/spawnschutz.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/ReallifeGamemode.Client/Player/spawnschutz.ts b/ReallifeGamemode.Client/Player/spawnschutz.ts index 848d7c93..43b7b011 100644 --- a/ReallifeGamemode.Client/Player/spawnschutz.ts +++ b/ReallifeGamemode.Client/Player/spawnschutz.ts @@ -16,6 +16,7 @@ export default function spawnschutz() { }); mp.events.add("triggerSpawnschutzTimer", () => { + mp.events.call("abortSpawnschutz"); spawnschutzTimer = setTimeout(() => { mp.events.call("toggleSpawnschutz", false); spawnschutzEnabled = false; From d05f63fcab98d4c241bac57c8729442cd3094023 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 27 Apr 2021 18:41:54 +0200 Subject: [PATCH 007/167] test spawnschutz --- ReallifeGamemode.Client/Player/spawnschutz.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Player/spawnschutz.ts b/ReallifeGamemode.Client/Player/spawnschutz.ts index 43b7b011..320a135a 100644 --- a/ReallifeGamemode.Client/Player/spawnschutz.ts +++ b/ReallifeGamemode.Client/Player/spawnschutz.ts @@ -16,7 +16,7 @@ export default function spawnschutz() { }); mp.events.add("triggerSpawnschutzTimer", () => { - mp.events.call("abortSpawnschutz"); + clearInterval(spawnschutzTimer); spawnschutzTimer = setTimeout(() => { mp.events.call("toggleSpawnschutz", false); spawnschutzEnabled = false; From 50f29aef28c287af7eeeea8abbc577a15939e35e Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 27 Apr 2021 18:51:53 +0200 Subject: [PATCH 008/167] befehl spawnschutz zapzerap --- .../Commands/AdminCommands.cs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index d312239c..9216e766 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -545,6 +545,27 @@ namespace ReallifeGamemode.Server.Commands #region Admin + [Command("remspawnschutz", "~m~Benutzung: ~s~/rmss [Target]")] + public void CmdAdminRmss(Player player, String targetname) + { + if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) + { + ChatService.NotAuthorized(player); + return; + } + + Player target = PlayerService.GetPlayerByNameOrId(targetname); + + if (target == null || !target.IsLoggedIn()) + { + ChatService.PlayerNotFound(player); + return; + } + + target.TriggerEvent("abortSpawnschutz"); + + } + [Command("countdown", "~m~Benutzung: ~s~/countdown [Zeit] [Text]", GreedyArg = true)] public void CmdAdminCountdown(Player player, string timer_string, string text) { From 4a46a5b316d4db8ac3046563466f919f2fa6e3fd Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 27 Apr 2021 19:37:33 +0200 Subject: [PATCH 009/167] =?UTF-8?q?fahrschule=20bl=C3=B6der=20checkpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs b/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs index fe51c527..590bbf7e 100644 --- a/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs +++ b/ReallifeGamemode.Server/DrivingSchool/DrivingSchool.cs @@ -71,7 +71,7 @@ namespace ReallifeGamemode.Server.DrivingSchool new Vector3(-255.55, -1419.48, 32.75), new Vector3(-369.08, -1415.37, 29.68), new Vector3(-114.48, -1251.43, 37.59), - new Vector3(59.22, -1261.71, 29.84), + new Vector3(70.312744, -1250.7972, 29.84), new Vector3(39.12, -1165.28, 29.87), new Vector3(-307.52, -1200.85, 37.79), new Vector3(-441.79, -1251.67, 46.37), From 974bfd13d7a480310ec51c7ec942248cee87263c Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 27 Apr 2021 21:49:09 +0200 Subject: [PATCH 010/167] test afk hit --- ReallifeGamemode.Client/Player/antiafk.ts | 2 +- ReallifeGamemode.Client/index.ts | 2 +- ReallifeGamemode.Client/util/weapondamage.ts | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Client/Player/antiafk.ts b/ReallifeGamemode.Client/Player/antiafk.ts index 229cd705..ccc1fbf9 100644 --- a/ReallifeGamemode.Client/Player/antiafk.ts +++ b/ReallifeGamemode.Client/Player/antiafk.ts @@ -30,7 +30,7 @@ } } - if (afkCounter >= 60) { + if (afkCounter >= 0) { afkStatus = true; globalData.IsAfk = afkStatus; setServerAfkStatus(afkStatus); diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index decabaff..b78ad73a 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -208,7 +208,7 @@ import PilotRouteList from './Jobs/PilotRouteSelect'; PilotRouteList(globalData); import weapondamageUtil from './util/weapondamage'; -weapondamageUtil(); +weapondamageUtil(globalData); import soundUtil from './util/sound'; soundUtil(); diff --git a/ReallifeGamemode.Client/util/weapondamage.ts b/ReallifeGamemode.Client/util/weapondamage.ts index c631b268..b7391a36 100644 --- a/ReallifeGamemode.Client/util/weapondamage.ts +++ b/ReallifeGamemode.Client/util/weapondamage.ts @@ -18,7 +18,7 @@ function isTargetInPolygon(pos): boolean { return false; } -export default function weapondamageUtil() { +export default function weapondamageUtil(globalData: IGlobalData) { let blockInput = false; mp.players.local.setSuffersCriticalHits(false); @@ -31,6 +31,10 @@ export default function weapondamageUtil() { if ((isTargetInPolygon(sourceEntity.position) || isInAnyNoDMPolygon) && getWantedCount() === 0) { return true; } + if (globalData.IsAfk == true) { + mp.gui.chat.push("afkhit"); + return true; + } if (spawnschutzEnabled && getWantedCount() === 0) { return true; From 3ec82703923cce43f0ef1461740f50c514bf9ae3 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 27 Apr 2021 21:53:44 +0200 Subject: [PATCH 011/167] afk hits --- ReallifeGamemode.Client/Player/antiafk.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Player/antiafk.ts b/ReallifeGamemode.Client/Player/antiafk.ts index ccc1fbf9..229cd705 100644 --- a/ReallifeGamemode.Client/Player/antiafk.ts +++ b/ReallifeGamemode.Client/Player/antiafk.ts @@ -30,7 +30,7 @@ } } - if (afkCounter >= 0) { + if (afkCounter >= 60) { afkStatus = true; globalData.IsAfk = afkStatus; setServerAfkStatus(afkStatus); From 2338cc2c4b996a79ffedcb6c23cc5f6e303b3793 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 27 Apr 2021 21:54:49 +0200 Subject: [PATCH 012/167] afk hits mit wanteds --- ReallifeGamemode.Client/util/weapondamage.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/util/weapondamage.ts b/ReallifeGamemode.Client/util/weapondamage.ts index b7391a36..49f3bc55 100644 --- a/ReallifeGamemode.Client/util/weapondamage.ts +++ b/ReallifeGamemode.Client/util/weapondamage.ts @@ -31,8 +31,8 @@ export default function weapondamageUtil(globalData: IGlobalData) { if ((isTargetInPolygon(sourceEntity.position) || isInAnyNoDMPolygon) && getWantedCount() === 0) { return true; } - if (globalData.IsAfk == true) { - mp.gui.chat.push("afkhit"); + + if (globalData.IsAfk == true && getWantedCount() === 0) { return true; } From 9840b4c52c3346612bf554665db49ef33e64f8f4 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 27 Apr 2021 21:58:56 +0200 Subject: [PATCH 013/167] remss chat messages --- ReallifeGamemode.Client/Player/antiafk.ts | 2 +- ReallifeGamemode.Server/Commands/AdminCommands.cs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/Player/antiafk.ts b/ReallifeGamemode.Client/Player/antiafk.ts index 229cd705..2b3aa6c2 100644 --- a/ReallifeGamemode.Client/Player/antiafk.ts +++ b/ReallifeGamemode.Client/Player/antiafk.ts @@ -30,7 +30,7 @@ } } - if (afkCounter >= 60) { + if (afkCounter >= 2) { afkStatus = true; globalData.IsAfk = afkStatus; setServerAfkStatus(afkStatus); diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 9216e766..7c35178a 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -545,7 +545,7 @@ namespace ReallifeGamemode.Server.Commands #region Admin - [Command("remspawnschutz", "~m~Benutzung: ~s~/rmss [Target]")] + [Command("remspawnschutz", "~m~Benutzung: ~s~/rmss [Target]", Alias = "rmss")] public void CmdAdminRmss(Player player, String targetname) { if (!player.GetUser()?.IsAdmin(AdminLevel.ADMIN) ?? true) @@ -562,6 +562,8 @@ namespace ReallifeGamemode.Server.Commands return; } + target.SendChatMessage(player.Name + " hat deinen Spawnschutz entfernt"); + player.SendChatMessage("Du hast den Spawnschutz von " + target.Name + " entfernt"); target.TriggerEvent("abortSpawnschutz"); } From b48e76ba45b7a6bd2bff32682598e05f4beac916 Mon Sep 17 00:00:00 2001 From: Fabian Date: Tue, 27 Apr 2021 22:08:00 +0200 Subject: [PATCH 014/167] afk time reseted --- ReallifeGamemode.Client/Player/antiafk.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Player/antiafk.ts b/ReallifeGamemode.Client/Player/antiafk.ts index 2b3aa6c2..229cd705 100644 --- a/ReallifeGamemode.Client/Player/antiafk.ts +++ b/ReallifeGamemode.Client/Player/antiafk.ts @@ -30,7 +30,7 @@ } } - if (afkCounter >= 2) { + if (afkCounter >= 60) { afkStatus = true; globalData.IsAfk = afkStatus; setServerAfkStatus(afkStatus); From 38a47c32c216106c7d29a2cfc927305e49c4f05e Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 27 Apr 2021 23:07:44 +0200 Subject: [PATCH 015/167] Escape Wanteds done Client Side. --- ReallifeGamemode.Client/Gui/blips.ts | 34 +++++++- ReallifeGamemode.Client/Player/antiafk.ts | 7 +- ReallifeGamemode.Server/Util/ThreadTimers.cs | 2 - .../Wanted/WantedEscapeTimer.cs | 85 +++---------------- 4 files changed, 48 insertions(+), 80 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/blips.ts b/ReallifeGamemode.Client/Gui/blips.ts index 85b9e1ae..ba6b8446 100644 --- a/ReallifeGamemode.Client/Gui/blips.ts +++ b/ReallifeGamemode.Client/Gui/blips.ts @@ -1,6 +1,13 @@ -export default function playerBlips() { +import { afkStatus } from '../Player/antiafk'; +import { getWantedCount } from './wanteds'; + +export default function playerBlips() { var playerBlipMap: Map; var ready = false; + var escapeTimer = null; + + const PD_BLIP = 38; + const FIB_BLIP = 63; setInterval(() => { if (!ready) return; @@ -9,7 +16,7 @@ mp.players.forEachInStreamRange( (player) => { if (mp.players.local == player) - return; + return; if (!playerBlipMap.has(player)) { let pBlip = mp.blips.new(1, player.position, { @@ -43,8 +50,29 @@ pBlip.setColour(isNaN(color) ? 0 : color); pBlip.setPosition(player.position.x, player.position.y, player.position.z); + + if ((color == PD_BLIP || color == FIB_BLIP || afkStatus)) { + if (escapeTimer) { + mp.events.call("SERVER:SetWantedFlash", false); + clearInterval(escapeTimer); + escapeTimer = null; + } + return; + } + + if (!escapeTimer && !afkStatus && getWantedCount() > 0) { + mp.events.call("SERVER:SetWantedFlash", true); + escapeTimer = setInterval(() => { + if (getWantedCount() == 0) { + clearInterval(escapeTimer); + escapeTimer = null; + return; + } + + mp.events.callRemote("CLIENT:EscapeWanted"); + }, 300000); //120000 -> 2 min , 300000 -> 5min + } } - }); }, 50); diff --git a/ReallifeGamemode.Client/Player/antiafk.ts b/ReallifeGamemode.Client/Player/antiafk.ts index 229cd705..c231d5f3 100644 --- a/ReallifeGamemode.Client/Player/antiafk.ts +++ b/ReallifeGamemode.Client/Player/antiafk.ts @@ -1,13 +1,12 @@ -export default function antiAfk(globalData: IGlobalData) { +export let afkStatus: boolean = false; + +export default function antiAfk(globalData: IGlobalData) { let lastPosition: Vector3Mp = mp.players.local.position; let afkCounter: number = 0; - let afkStatus: boolean = false; - setInterval(checkAfkPosition, 1000 * 10); function checkAfkPosition() { - if (!globalData.LoggedIn) { return; } diff --git a/ReallifeGamemode.Server/Util/ThreadTimers.cs b/ReallifeGamemode.Server/Util/ThreadTimers.cs index 5d205ae6..e86fe5b5 100644 --- a/ReallifeGamemode.Server/Util/ThreadTimers.cs +++ b/ReallifeGamemode.Server/Util/ThreadTimers.cs @@ -62,7 +62,6 @@ namespace ReallifeGamemode.Server.Util }); } - private static void Timer60000_Elapsed(object sender, ElapsedEventArgs e) { NAPI.Task.Run(() => @@ -79,7 +78,6 @@ namespace ReallifeGamemode.Server.Util { NAPI.Task.Run(() => { - WantedEscapeTimer.Timer_Elapsed(); Jail.JailIn_Elapsed(); Gangwar.Gangwar.Value_TimerElapsed(); }); diff --git a/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs b/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs index 7f6fe6ea..ffbac518 100644 --- a/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs +++ b/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs @@ -13,82 +13,25 @@ using ReallifeGamemode.Server.Services; namespace ReallifeGamemode.Server.Wanted { - public class WantedEscapeTimer + public class WantedEscapeTimer : Script { - private const int WantedEscapeTime = 300000; - - public static Dictionary waTimer { get; set; } = new Dictionary(); //zeit in ms - /* - public static void WantedTimer() - { - //System.Timers.Timer timer = new System.Timers.Timer(2500); - //timer.Start(); - //timer.Elapsed += Timer_Elapsed; - } - */ - - public static void ResetWantedTimeToElapse(User user) - { - waTimer[user.Id] = WantedEscapeTime; - } - - public static void Timer_Elapsed() + [RemoteEvent("CLIENT:EscapeWanted")] + public void WantedEscape(Player player) { using var dbContext = new DatabaseContext(); - foreach (var player in NAPI.Pools.GetAllPlayers()) + User user = player.GetUser(dbContext); + + if (user.Wanteds <= 0) + return; + + player.SendChatMessage("~y~Du hast erfolgreich einen Wanted abgetaucht."); + user.Wanteds -= 1; + if (user.Wanteds == 0) { - User user = player.GetUser(dbContext); - if (user != null && user.Wanteds > 0) - { - if (!waTimer.ContainsKey(user.Id)) - ResetWantedTimeToElapse(user); - - bool isNearCop = false; - foreach (var playerCop in NAPI.Pools.GetAllPlayers()) - { - if (!playerCop.IsLoggedIn()) continue; - - User cop = playerCop.GetUser(); - if (cop != null && (cop.FactionId == 1 || cop.FactionId == 3)) - { - if (cop.GetData("duty") && playerCop.Position.DistanceTo2D(player.Position) <= 500) - { - //Schriftzug 'abgetaucht' zerstören :( - isNearCop = true; - break; - } - //Hier abgetaucht schriftzug einfügen :) - } - } - - if (!waTimer.ContainsKey(user.Id)) - waTimer[user.Id] = 300000; - - if (waTimer[user.Id] <= 0) - { - ResetWantedTimeToElapse(user); - player.SendChatMessage("~y~Du hast erfolgreich einen Wanted abgetaucht."); - user.Wanteds -= 1; - if (user.Wanteds == 0) - { - ChatService.HQMessage(player.Name + " konnte solange abtauchen, sodass er nicht mehr gesucht wird."); - user.SetBlipAndNametagColor(); - } - dbContext.SaveChanges(); - waTimer[user.Id] = WantedEscapeTime; - } - else if (!isNearCop && !player.IsAfk()) - { - player.TriggerEvent("SERVER:SetWantedFlash", true); - waTimer[user.Id] -= 2500; - } - else if (isNearCop) - { - player.TriggerEvent("SERVER:SetWantedFlash", false); - ResetWantedTimeToElapse(user); - } - } + ChatService.HQMessage(player.Name + " konnte solange abtauchen, sodass er nicht mehr gesucht wird."); + user.SetBlipAndNametagColor(); } + dbContext.SaveChanges(); } } } From c26d477557ef75ae72afa4c0888cc52b7e2a97de Mon Sep 17 00:00:00 2001 From: kookroach Date: Tue, 27 Apr 2021 23:24:11 +0200 Subject: [PATCH 016/167] Big Map --- ReallifeGamemode.Client/Gui/bigmap.ts | 53 +++++++++++++++++++++++++++ ReallifeGamemode.Client/index.ts | 4 +- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 ReallifeGamemode.Client/Gui/bigmap.ts diff --git a/ReallifeGamemode.Client/Gui/bigmap.ts b/ReallifeGamemode.Client/Gui/bigmap.ts new file mode 100644 index 00000000..1e99ec5f --- /dev/null +++ b/ReallifeGamemode.Client/Gui/bigmap.ts @@ -0,0 +1,53 @@ +export default function bigmap() { + var bigmap = { status: 0, timer: null }; + + bigmap.status = 0; + bigmap.timer = null; + + mp.game.ui.setRadarZoom(1.0); + mp.game.ui.setRadarBigmapEnabled(false, false); + + mp.events.add("render", () => { + mp.game.controls.disableControlAction(0, 48, true); + if (mp.game.controls.isDisabledControlJustPressed(0, 48)) { + if (bigmap.status === 0) { + mp.game.ui.setRadarZoom(0.0); + bigmap.status = 1; + + bigmap.timer = setTimeout(() => { + mp.game.ui.setRadarBigmapEnabled(false, true); + mp.game.ui.setRadarZoom(1.0); + + bigmap.status = 0; + bigmap.timer = null; + }, 10000); + } else if (bigmap.status === 1) { + if (bigmap.timer != null) { + clearTimeout(bigmap.timer); + bigmap.timer = null; + } + + mp.game.ui.setRadarBigmapEnabled(true, false); + mp.game.ui.setRadarZoom(0.0); + bigmap.status = 2; + + bigmap.timer = setTimeout(() => { + mp.game.ui.setRadarBigmapEnabled(false, true); + mp.game.ui.setRadarZoom(1.0); + + bigmap.status = 0; + bigmap.timer = null; + }, 10000); + } else { + if (bigmap.timer != null) { + clearTimeout(bigmap.timer); + bigmap.timer = null; + } + + mp.game.ui.setRadarBigmapEnabled(false, false); + mp.game.ui.setRadarZoom(1.0); + bigmap.status = 0; + } + } + }); +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index b78ad73a..72f41def 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -274,6 +274,8 @@ handsup(); import spawnschutz from './Player/spawnschutz'; spawnschutz(); +import bigmap from './Gui/bigmap'; +bigmap(); require('./Gui/policedepartment'); require('./Gui/helptext'); @@ -287,4 +289,4 @@ interface VehicleData { export { VehicleData -} +} \ No newline at end of file From 4403f0c23859feac3f1b4712942a80ce2bbd6bf7 Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 28 Apr 2021 00:39:55 +0200 Subject: [PATCH 017/167] push --- ReallifeGamemode.Client/Gui/blips.ts | 28 ++++++++--------- ReallifeGamemode.Client/Gui/notification.ts | 31 +++++++++++++++++++ ReallifeGamemode.Client/index.ts | 3 ++ .../Extensions/ClientExtension.cs | 5 ++- .../Wanted/WantedEscapeTimer.cs | 4 +-- 5 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 ReallifeGamemode.Client/Gui/notification.ts diff --git a/ReallifeGamemode.Client/Gui/blips.ts b/ReallifeGamemode.Client/Gui/blips.ts index ba6b8446..d02df572 100644 --- a/ReallifeGamemode.Client/Gui/blips.ts +++ b/ReallifeGamemode.Client/Gui/blips.ts @@ -16,7 +16,7 @@ export default function playerBlips() { mp.players.forEachInStreamRange( (player) => { if (mp.players.local == player) - return; + return; if (!playerBlipMap.has(player)) { let pBlip = mp.blips.new(1, player.position, { @@ -59,21 +59,21 @@ export default function playerBlips() { } return; } - - if (!escapeTimer && !afkStatus && getWantedCount() > 0) { - mp.events.call("SERVER:SetWantedFlash", true); - escapeTimer = setInterval(() => { - if (getWantedCount() == 0) { - clearInterval(escapeTimer); - escapeTimer = null; - return; - } - - mp.events.callRemote("CLIENT:EscapeWanted"); - }, 300000); //120000 -> 2 min , 300000 -> 5min - } } }); + + if (!escapeTimer && !afkStatus && getWantedCount() > 0) { + mp.events.call("SERVER:SetWantedFlash", true); + escapeTimer = setInterval(() => { + if (getWantedCount() == 0) { + clearInterval(escapeTimer); + escapeTimer = null; + return; + } + + mp.events.callRemote("CLIENT:EscapeWanted"); + }, 5000); //120000 -> 2 min , 300000 -> 5min + } }, 50); mp.events.add("playerReady", () => { diff --git a/ReallifeGamemode.Client/Gui/notification.ts b/ReallifeGamemode.Client/Gui/notification.ts new file mode 100644 index 00000000..486c603c --- /dev/null +++ b/ReallifeGamemode.Client/Gui/notification.ts @@ -0,0 +1,31 @@ +export default function notification() { + const _SET_NOTIFICATION_COLOR_NEXT = "0x39BBF623FC803EAC"; + const _SET_NOTIFICATION_BACKGROUND_COLOR = "0x92F0DA1E27DB96DC"; + + mp.events.add("BN_Show", (message, flashing = false, textColor = -1, bgColor = -1, flashColor = [77, 77, 77, 200]) => { + if (textColor > -1) mp.game.invoke(_SET_NOTIFICATION_COLOR_NEXT, textColor); + if (bgColor > -1) mp.game.invoke(_SET_NOTIFICATION_BACKGROUND_COLOR, bgColor); + if (flashing) mp.game.ui.setNotificationFlashColor(flashColor[0], flashColor[1], flashColor[2], flashColor[3]); + + mp.game.gxt.set("BNOTIF_LONG_TEXT_ENTRY", `~a~${message}`); + mp.game.ui.setNotificationTextEntry("BNOTIF_LONG_TEXT_ENTRY"); + mp.game.ui.addTextComponentSubstringPlayerName(""); // needed for text color to work + mp.game.ui.drawNotification(flashing, true); + }); + + mp.events.add("BN_ShowWithPicture", (title, sender, message, notifPic, icon = 0, flashing = false, textColor = -1, bgColor = -1, flashColor = [77, 77, 77, 200]) => { + if (textColor > -1) mp.game.invoke(_SET_NOTIFICATION_COLOR_NEXT, textColor); + if (bgColor > -1) mp.game.invoke(_SET_NOTIFICATION_BACKGROUND_COLOR, bgColor); + if (flashing) mp.game.ui.setNotificationFlashColor(flashColor[0], flashColor[1], flashColor[2], flashColor[3]); + + mp.game.gxt.set("BNOTIF_LONG_TEXT_ENTRY_IMG", `~a~${message}`); + mp.game.ui.setNotificationTextEntry("BNOTIF_LONG_TEXT_ENTRY_IMG"); + mp.game.ui.addTextComponentSubstringPlayerName(""); // needed for text color to work + mp.game.ui.setNotificationMessage(notifPic, notifPic, flashing, icon, title, sender); + }); + + const notifications = { + show: (message, flashing = false, textColor = -1, bgColor = -1, flashColor = [77, 77, 77, 200]) => mp.events.call("BN_Show", message, flashing, textColor, bgColor, flashColor), + showWithPicture: (title, sender, message, notifPic, icon = 0, flashing = false, textColor = -1, bgColor = -1, flashColor = [77, 77, 77, 200]) => mp.events.call("BN_ShowWithPicture", title, sender, message, notifPic, icon, flashing, textColor, bgColor, flashColor) + }; +} \ No newline at end of file diff --git a/ReallifeGamemode.Client/index.ts b/ReallifeGamemode.Client/index.ts index 72f41def..1d47c140 100644 --- a/ReallifeGamemode.Client/index.ts +++ b/ReallifeGamemode.Client/index.ts @@ -277,6 +277,9 @@ spawnschutz(); import bigmap from './Gui/bigmap'; bigmap(); +import notification from './Gui/notification'; +notification(); + require('./Gui/policedepartment'); require('./Gui/helptext'); require('./admin/spectate'); diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 56f0d4f7..3d66bfc3 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -103,7 +103,7 @@ namespace ReallifeGamemode.Server.Extensions int factionMoney = user.Wanteds * 6; var executiveFactions = dbContext.Factions.Include(f => f.BankAccount).Where(f => f.Id == 1 || f.Id == 3); - foreach(var faction in executiveFactions) + foreach (var faction in executiveFactions) { faction.BankAccount.Balance += factionMoney; } @@ -224,8 +224,7 @@ namespace ReallifeGamemode.Server.Extensions dbUser.SetBlipAndNametagColor(); dbContext.SaveChanges(); } - ChatService.SendMessage(user.Player, "!{#FF614A}Du hast ein Verbrechen begangen: " + reason + "" + (cop != null ? " | Gemeldet von: " + cop.Name + "." : "")); - ChatService.SendMessage(user.Player, " !{#FFFF00}Fahndungslevel:~s~ " + newWanteds); + user.Player.TriggerEvent("BN_ShowWithPicture", "Straftat", cop != null ? "Officer " + cop.Name + "" : "LSPD", "Du hast ein Verbrechen begangen: " + reason + ".'\n' Fahndungslevel: " + newWanteds, "DIA_POLICE", 1, true, 15); foreach (var copPlayer in NAPI.Pools.GetAllPlayers()) { diff --git a/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs b/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs index ffbac518..32985165 100644 --- a/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs +++ b/ReallifeGamemode.Server/Wanted/WantedEscapeTimer.cs @@ -21,10 +21,10 @@ namespace ReallifeGamemode.Server.Wanted using var dbContext = new DatabaseContext(); User user = player.GetUser(dbContext); - if (user.Wanteds <= 0) + if (user.Wanteds <= 0) return; - player.SendChatMessage("~y~Du hast erfolgreich einen Wanted abgetaucht."); + player.TriggerEvent("BN_ShowWithPicture", "Abgetaucht", "Lester", "Du hast erfolgreich ein Wanted ~y~abgetaucht", "CHAR_LESTER", 1, true); user.Wanteds -= 1; if (user.Wanteds == 0) { From fac04cf8b8fb9d6f226da8934aa6293718dc664a Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 28 Apr 2021 00:40:28 +0200 Subject: [PATCH 018/167] fix timer --- ReallifeGamemode.Client/Gui/blips.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Gui/blips.ts b/ReallifeGamemode.Client/Gui/blips.ts index d02df572..a648181b 100644 --- a/ReallifeGamemode.Client/Gui/blips.ts +++ b/ReallifeGamemode.Client/Gui/blips.ts @@ -72,7 +72,7 @@ export default function playerBlips() { } mp.events.callRemote("CLIENT:EscapeWanted"); - }, 5000); //120000 -> 2 min , 300000 -> 5min + }, 300000); //120000 -> 2 min , 300000 -> 5min } }, 50); From b5621e38c3f30775bc56a2c43f6a2148390abbcf Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 28 Apr 2021 00:52:04 +0200 Subject: [PATCH 019/167] try fix --- ReallifeGamemode.Client/Gui/notification.ts | 1 + ReallifeGamemode.Server/Extensions/ClientExtension.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Gui/notification.ts b/ReallifeGamemode.Client/Gui/notification.ts index 486c603c..50b50780 100644 --- a/ReallifeGamemode.Client/Gui/notification.ts +++ b/ReallifeGamemode.Client/Gui/notification.ts @@ -17,6 +17,7 @@ export default function notification() { if (textColor > -1) mp.game.invoke(_SET_NOTIFICATION_COLOR_NEXT, textColor); if (bgColor > -1) mp.game.invoke(_SET_NOTIFICATION_BACKGROUND_COLOR, bgColor); if (flashing) mp.game.ui.setNotificationFlashColor(flashColor[0], flashColor[1], flashColor[2], flashColor[3]); + mp.game.graphics.requestStreamedTextureDict(notifPic, true); mp.game.gxt.set("BNOTIF_LONG_TEXT_ENTRY_IMG", `~a~${message}`); mp.game.ui.setNotificationTextEntry("BNOTIF_LONG_TEXT_ENTRY_IMG"); diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 3d66bfc3..38e66284 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -224,7 +224,7 @@ namespace ReallifeGamemode.Server.Extensions dbUser.SetBlipAndNametagColor(); dbContext.SaveChanges(); } - user.Player.TriggerEvent("BN_ShowWithPicture", "Straftat", cop != null ? "Officer " + cop.Name + "" : "LSPD", "Du hast ein Verbrechen begangen: " + reason + ".'\n' Fahndungslevel: " + newWanteds, "DIA_POLICE", 1, true, 15); + user.Player.TriggerEvent("BN_ShowWithPicture", "Straftat", cop != null ? "Officer " + cop.Name + "" : "LSPD", "Du hast ein Verbrechen begangen: " + reason + ".'\n' Fahndungslevel: " + newWanteds, "DIA_POLICE", 1, true, 6); foreach (var copPlayer in NAPI.Pools.GetAllPlayers()) { From d9078e5ceb747f84fbff16d480ad24714d5adf5d Mon Sep 17 00:00:00 2001 From: kookroach Date: Wed, 28 Apr 2021 02:06:17 +0200 Subject: [PATCH 020/167] fix message --- ReallifeGamemode.Server/Extensions/ClientExtension.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Extensions/ClientExtension.cs b/ReallifeGamemode.Server/Extensions/ClientExtension.cs index 38e66284..eb4de67e 100644 --- a/ReallifeGamemode.Server/Extensions/ClientExtension.cs +++ b/ReallifeGamemode.Server/Extensions/ClientExtension.cs @@ -224,7 +224,7 @@ namespace ReallifeGamemode.Server.Extensions dbUser.SetBlipAndNametagColor(); dbContext.SaveChanges(); } - user.Player.TriggerEvent("BN_ShowWithPicture", "Straftat", cop != null ? "Officer " + cop.Name + "" : "LSPD", "Du hast ein Verbrechen begangen: " + reason + ".'\n' Fahndungslevel: " + newWanteds, "DIA_POLICE", 1, true, 6); + user.Player.TriggerEvent("BN_ShowWithPicture", "Straftat", cop != null ? "Officer " + cop.Name + "" : "LSPD", "Du hast ein Verbrechen begangen: " + reason + " (" + newWanteds + ")", "DIA_POLICE", 1, true, 6); foreach (var copPlayer in NAPI.Pools.GetAllPlayers()) { From 0cc701755549950cb6b9bc939ff4d9b6fe33778f Mon Sep 17 00:00:00 2001 From: Alex_qp Date: Wed, 28 Apr 2021 21:00:08 +0200 Subject: [PATCH 021/167] catch FormatException in pay --- .../Managers/InteractionManager.cs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ReallifeGamemode.Server/Managers/InteractionManager.cs b/ReallifeGamemode.Server/Managers/InteractionManager.cs index 926dd56f..ce438abe 100644 --- a/ReallifeGamemode.Server/Managers/InteractionManager.cs +++ b/ReallifeGamemode.Server/Managers/InteractionManager.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using Newtonsoft.Json; @@ -753,7 +753,16 @@ namespace ReallifeGamemode.Server.Managers public void InteractionMenu_Pay(Player player, string jsonNameOrId, string stringAmount) { string nameOrId = (string)JsonConvert.DeserializeObject(jsonNameOrId); - int amount = Int32.Parse(stringAmount); + int amount; + try + { + amount = Int32.Parse(stringAmount); + } + catch + { + player.SendNotification("~r~" + stringAmount + " ist kein gültiger Betrag."); + return; + } Player target = PlayerService.GetPlayerByNameOrId(nameOrId); List nearbyPlayers = NAPI.Player.GetPlayersInRadiusOfPlayer(3, player); @@ -769,7 +778,7 @@ namespace ReallifeGamemode.Server.Managers } else if (!nearbyPlayers.Contains(target)) { - player.SendNotification("~r~Dieser Spieler befindet sich nicht in deiner nähe!"); + player.SendNotification("~r~Dieser Spieler befindet sich nicht in deiner Nähe!"); } else if (player.GetUser().Handmoney < amount) { From 36f2517844b505057259680082363c64d9757e2f Mon Sep 17 00:00:00 2001 From: VegaZ Date: Wed, 28 Apr 2021 21:15:04 +0200 Subject: [PATCH 022/167] =?UTF-8?q?Chirurgen=20aufger=C3=A4umt,=20buggt=20?= =?UTF-8?q?aber=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 d48022b02e3e97d6894491a55302c32a7acb5809 Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 28 Apr 2021 20:55:28 +0000 Subject: [PATCH 023/167] =?UTF-8?q?weiter=20zur=C3=BCck=20in=20die=20verga?= =?UTF-8?q?ngenheit=20(chat)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReallifeGamemode.Client/assets/js/chat/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/assets/js/chat/main.js b/ReallifeGamemode.Client/assets/js/chat/main.js index 61037421..4fa78a5c 100644 --- a/ReallifeGamemode.Client/assets/js/chat/main.js +++ b/ReallifeGamemode.Client/assets/js/chat/main.js @@ -1,7 +1,7 @@ let chat = { size: 0, - history_limit: 50, + history_limit: 150, container: null, input: null, enabled: false, From 53874659452b40f69636cfca7ca82c3b5ea37ad8 Mon Sep 17 00:00:00 2001 From: hydrant Date: Thu, 29 Apr 2021 12:44:12 +0200 Subject: [PATCH 024/167] bigmap nicht wenn chat auf ist --- ReallifeGamemode.Client/Gui/bigmap.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ReallifeGamemode.Client/Gui/bigmap.ts b/ReallifeGamemode.Client/Gui/bigmap.ts index 1e99ec5f..4fd5e4c9 100644 --- a/ReallifeGamemode.Client/Gui/bigmap.ts +++ b/ReallifeGamemode.Client/Gui/bigmap.ts @@ -1,3 +1,5 @@ +import { GlobalData } from ".."; + export default function bigmap() { var bigmap = { status: 0, timer: null }; @@ -9,7 +11,7 @@ export default function bigmap() { mp.events.add("render", () => { mp.game.controls.disableControlAction(0, 48, true); - if (mp.game.controls.isDisabledControlJustPressed(0, 48)) { + if (mp.game.controls.isDisabledControlJustPressed(0, 48) && !GlobalData.InChat) { if (bigmap.status === 0) { mp.game.ui.setRadarZoom(0.0); bigmap.status = 1; From 07c6da70310e576be38813c6e4c101eafc6bf7e2 Mon Sep 17 00:00:00 2001 From: hydrant Date: Thu, 29 Apr 2021 15:10:06 +0200 Subject: [PATCH 025/167] [BUG-93][BUG-49] Tuning Preise angepasst und Fehler behoben --- ReallifeGamemode.Client/Tuning/main.ts | 41 ++++++++---- .../Managers/TuningManager.cs | 65 +++++++++++++++++-- 2 files changed, 88 insertions(+), 18 deletions(-) diff --git a/ReallifeGamemode.Client/Tuning/main.ts b/ReallifeGamemode.Client/Tuning/main.ts index 9da9b31b..c825708f 100644 --- a/ReallifeGamemode.Client/Tuning/main.ts +++ b/ReallifeGamemode.Client/Tuning/main.ts @@ -26,7 +26,7 @@ export default function tuning(globalData: IGlobalData) { const carModSlotName = [ { Slot: 0, Name: "Spoiler", Price: 1000 }, - { Slot: 1, Name: "Frontstoßstange", Price: 1500}, + { Slot: 1, Name: "Frontstoßstange", Price: 1500 }, { Slot: 2, Name: "Heckstoßstange", Price: 1500 }, { Slot: 3, Name: "Seitenschweller", Price: 1500 }, { Slot: 4, Name: "Auspuff", Price: 500 }, @@ -36,12 +36,12 @@ export default function tuning(globalData: IGlobalData) { { Slot: 8, Name: "Extra 1", Price: 2000 }, { Slot: 9, Name: "Extra 2", Price: 2000 }, { Slot: 10, Name: "Dach", Price: 1500 }, - { Slot: 11, Name: "Motor", Price: 50000 }, - { Slot: 12, Name: "Bremsen", Price: 30000 }, - { Slot: 13, Name: "Getriebe", Price: 15000 }, + { Slot: 11, Name: "Motor", BasePercentage: 20, PriceIncreasePerLevel: 7.5 }, + { Slot: 12, Name: "Bremsen", BasePercentage: 5, PriceIncreasePerLevel: 2.5 }, + { Slot: 13, Name: "Getriebe", BasePercentage: 10, PriceIncreasePerLevel: 2.5 }, { Slot: 14, Name: "Hupe", Price: 500 }, { Slot: 15, Name: "Federung", Price: 2000 }, - { Slot: 18, Name: "Turbo", Price: 40000 }, + { Slot: 18, Name: "Turbo", BasePercentage: 45, PriceIncreasePerLevel: 0 }, { Slot: 22, Name: "Licht", Price: 500 }, { Slot: 23, Name: "Reifen", Price: 1000 }, { Slot: -1, Name: "Lackierung", Price: 1000 }, @@ -165,7 +165,7 @@ export default function tuning(globalData: IGlobalData) { var currentActiveModItem = new Array(); var currentSelectedItem: VehicleModMenuItem = null; - mp.events.add("showTuningMenu", (noMoney) => { + mp.events.add("showTuningMenu", (noMoney, basePrice) => { mp.events.call("hideTuningInfo", false); mp.gui.chat.show(false); @@ -226,9 +226,6 @@ export default function tuning(globalData: IGlobalData) { } } - var price = noMoney? 0 : getModSlotPrice(modType); - - if (mod === null) { mod = localVehicle.getMod(modType); } @@ -248,6 +245,7 @@ export default function tuning(globalData: IGlobalData) { currentMod[modType] = mod; for (var x = -1; x < modNum; x++) { + var price = noMoney ? 0 : getModSlotPrice(modType, basePrice, x); var modText = ""; if (x === -1) { modText = "Serie"; @@ -265,7 +263,7 @@ export default function tuning(globalData: IGlobalData) { modMenu.CurrentSelection = x; } else { - item.SetRightLabel("$"+ moneyformat(price)); + item.SetRightLabel("$" + moneyformat(price)); } } @@ -304,7 +302,7 @@ export default function tuning(globalData: IGlobalData) { }); }); - + mainMenu.ItemSelect.on((item: NativeUI.UIMenuItem, index: number) => { if (item === repairItem) { @@ -315,7 +313,9 @@ export default function tuning(globalData: IGlobalData) { mainMenu.Visible = true; mainMenu.MenuClose.on(() => { - localVehicle.setLights(0); + if (localVehicle && mp.vehicles.exists(localVehicle)) { + localVehicle.setLights(0); + } globalData.InTuning = false; globalData.InMenu = false; mp.events.call("hideTuningInfo", false); @@ -456,8 +456,21 @@ export default function tuning(globalData: IGlobalData) { return realModName; } - function getModSlotPrice(modType: number): number { - return carModSlotName.filter(x => x.Slot == modType)[0].Price; + function getModSlotPrice(modType: number, basePrice: number, modIndex?: number): number { + if (modIndex === -1) { + return 0; + } + + let price = 0; + let priceInfo = carModSlotName.filter(x => x.Slot == modType)[0]; + + if (priceInfo.BasePercentage) { + price = ((priceInfo.BasePercentage + priceInfo.PriceIncreasePerLevel * modIndex) / 100) * basePrice; + } else { + price = priceInfo.Price; + } + + return price; } function setHeadlightsColor(vehicle, index) { diff --git a/ReallifeGamemode.Server/Managers/TuningManager.cs b/ReallifeGamemode.Server/Managers/TuningManager.cs index 9a4d9cc9..3799c5eb 100644 --- a/ReallifeGamemode.Server/Managers/TuningManager.cs +++ b/ReallifeGamemode.Server/Managers/TuningManager.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using ReallifeGamemode.Database.Entities; @@ -35,7 +36,7 @@ namespace ReallifeGamemode.Server.Managers colShape.OnEntityEnterColShape += (cs, c) => { using var dbContext = new DatabaseContext(); - if (c.IsInVehicle && c.VehicleSeat == 0) + if (c.IsInVehicle && c.VehicleSeat == 0 && IsPlayerAllowedToTuneVehicle(c, c.Vehicle, dbContext)) { c.TriggerEvent("showTuningInfo"); } @@ -43,12 +44,42 @@ namespace ReallifeGamemode.Server.Managers colShape.OnEntityExitColShape += (cs, c) => { - c.TriggerEvent("hideTuningInfo", true); + if(c.IsInVehicle) + { + c.TriggerEvent("hideTuningInfo", true); + } }; tuningGarages.Add(colShape); } + private static bool IsPlayerAllowedToTuneVehicle(Player c, Vehicle vehicle, DatabaseContext dbContext) + { + User user = c.GetUser(); + if(user == null) + { + return false; + } + + ServerVehicle serverVehicle = vehicle.GetServerVehicle(dbContext); + if(serverVehicle == null) + { + return false; + } + + if(serverVehicle is UserVehicle userVehicle && userVehicle.UserId == user.Id) + { + return true; + } + + if(serverVehicle is FactionVehicle factionVehicle && factionVehicle.GetOwners().Contains(user.FactionId ?? 0)) + { + return true; + } + + return false; + } + public static void ApplyTuningToServerVehicle(ServerVehicle sVeh) { Vehicle veh = VehicleManager.GetVehicleFromServerVehicle(sVeh); @@ -81,7 +112,33 @@ namespace ReallifeGamemode.Server.Managers { if (!player.IsInVehicle) return; - player.TriggerEvent("showTuningMenu"); + player.TriggerEvent("showTuningMenu", false, GetVehicleBasePrice(player.Vehicle)); + } + + private int GetVehicleBasePrice(Vehicle vehicle) + { + if(vehicle == null) + { + return 0; + } + + ServerVehicle serverVehicle = vehicle.GetServerVehicle(); + if(serverVehicle == null) + { + return 0; + } + + if(serverVehicle is UserVehicle userVehicle) + { + return userVehicle.Price ?? 0; + } + + if(serverVehicle is FactionVehicle factionVehicle) + { + return factionVehicle.BuyPrice; + } + + return 0; } [RemoteEvent("repairVehicle")] From 1a6e22823c5cf88770b63da4b9fdef6fbbb455eb Mon Sep 17 00:00:00 2001 From: hydrant Date: Thu, 29 Apr 2021 17:09:53 +0200 Subject: [PATCH 026/167] =?UTF-8?q?[BUG-94]=20T=C3=BCren=20immer=20=C3=B6f?= =?UTF-8?q?fnen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReallifeGamemode.Database/Entities/Door.cs | 1 + ...29134927_AddDoorAlwaysOpenFlag.Designer.cs | 2180 +++++++++++++++++ .../20210429134927_AddDoorAlwaysOpenFlag.cs | 23 + .../DatabaseContextModelSnapshot.cs | 3 + .../Managers/DoorManager.cs | 11 +- 5 files changed, 2215 insertions(+), 3 deletions(-) create mode 100644 ReallifeGamemode.Database/Migrations/20210429134927_AddDoorAlwaysOpenFlag.Designer.cs create mode 100644 ReallifeGamemode.Database/Migrations/20210429134927_AddDoorAlwaysOpenFlag.cs diff --git a/ReallifeGamemode.Database/Entities/Door.cs b/ReallifeGamemode.Database/Entities/Door.cs index 19eb04c4..ab26cf4a 100644 --- a/ReallifeGamemode.Database/Entities/Door.cs +++ b/ReallifeGamemode.Database/Entities/Door.cs @@ -22,6 +22,7 @@ namespace ReallifeGamemode.Database.Entities public float Y { get; set; } public float Z { get; set; } public float Radius { get; set; } + public bool AlwaysOpen { get; set; } [NotMapped] public Vector3 Position => new Vector3(X, Y, Z); diff --git a/ReallifeGamemode.Database/Migrations/20210429134927_AddDoorAlwaysOpenFlag.Designer.cs b/ReallifeGamemode.Database/Migrations/20210429134927_AddDoorAlwaysOpenFlag.Designer.cs new file mode 100644 index 00000000..14f87b5b --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210429134927_AddDoorAlwaysOpenFlag.Designer.cs @@ -0,0 +1,2180 @@ +// +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("20210429134927_AddDoorAlwaysOpenFlag")] + partial class AddDoorAlwaysOpenFlag + { + 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("AlwaysOpen") + .HasColumnType("tinyint(1)"); + + 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("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("BusinessId") + .HasColumnName("UserVehicle_BusinessId") + .HasColumnType("int"); + + 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/20210429134927_AddDoorAlwaysOpenFlag.cs b/ReallifeGamemode.Database/Migrations/20210429134927_AddDoorAlwaysOpenFlag.cs new file mode 100644 index 00000000..eb390066 --- /dev/null +++ b/ReallifeGamemode.Database/Migrations/20210429134927_AddDoorAlwaysOpenFlag.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace ReallifeGamemode.Database.Migrations +{ + public partial class AddDoorAlwaysOpenFlag : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "AlwaysOpen", + table: "Doors", + nullable: false, + defaultValue: false); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "AlwaysOpen", + table: "Doors"); + } + } +} diff --git a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs index fcb3068f..31a73d51 100644 --- a/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs +++ b/ReallifeGamemode.Database/Migrations/DatabaseContextModelSnapshot.cs @@ -398,6 +398,9 @@ namespace ReallifeGamemode.Database.Migrations .ValueGeneratedOnAdd() .HasColumnType("int"); + b.Property("AlwaysOpen") + .HasColumnType("tinyint(1)"); + b.Property("Category") .HasColumnType("longtext CHARACTER SET utf8mb4"); diff --git a/ReallifeGamemode.Server/Managers/DoorManager.cs b/ReallifeGamemode.Server/Managers/DoorManager.cs index c5a6e223..61431ca5 100644 --- a/ReallifeGamemode.Server/Managers/DoorManager.cs +++ b/ReallifeGamemode.Server/Managers/DoorManager.cs @@ -24,7 +24,7 @@ namespace ReallifeGamemode.Server.Managers { foreach (Door door in dbContext.Doors) { - _doorColShapes[door.Id] = NAPI.ColShape.CreateSphereColShape(door.Position, 30f); + _doorColShapes[door.Id] = NAPI.ColShape.CreateSphereColShape(door.Position, door.AlwaysOpen ? 200f : 30f); } } } @@ -63,7 +63,7 @@ namespace ReallifeGamemode.Server.Managers player.SendNotification(notStr, true); - NAPI.Pools.GetAllPlayers().ForEach(p => p.TriggerEvent("changeDoorState", d.Model, d.X, d.Y, d.Z, (d.Locked ? 1 : 0), 0.0f, 0.0f, 0.0f)); + NAPI.Pools.GetAllPlayers().ForEach(p => UpdateDoorState(p, d)); } } dbContext.SaveChanges(); @@ -80,9 +80,14 @@ namespace ReallifeGamemode.Server.Managers using (var dbContext = new DatabaseContext()) { Door door = dbContext.Doors.Where(d => d.Id == doorId).First(); - player.TriggerEvent("changeDoorState", door.Model, door.X, door.Y, door.Z, (door.Locked ? 1 : 0), 0.0f, 0.0f, 0.0f); + UpdateDoorState(player, door); } } } + + private static void UpdateDoorState(Player player, Door door) + { + player.TriggerEvent("changeDoorState", door.Model, door.X, door.Y, door.Z, (door.Locked || door.AlwaysOpen ? 1 : 0), 0.0f, 0.0f, door.AlwaysOpen ? 1.0f : 0.0f); + } } } From e517b4ac81c3b3dfa19a5a03e0d88213807d2638 Mon Sep 17 00:00:00 2001 From: Luke Date: Thu, 29 Apr 2021 15:25:24 +0000 Subject: [PATCH 027/167] =?UTF-8?q?Leerzeichen=20bei=20/takeweapon=20hinzu?= =?UTF-8?q?gef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReallifeGamemode.Server/Commands/AdminCommands.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Server/Commands/AdminCommands.cs b/ReallifeGamemode.Server/Commands/AdminCommands.cs index 7c35178a..d86f8c57 100644 --- a/ReallifeGamemode.Server/Commands/AdminCommands.cs +++ b/ReallifeGamemode.Server/Commands/AdminCommands.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; @@ -1182,7 +1182,7 @@ namespace ReallifeGamemode.Server.Commands return; } target.RemoveAllWeapons(); - ChatService.SendMessage(target, "~b~Deine Waffen wurden dir von " + player.Name + "(Admin) abgenommen"); + ChatService.SendMessage(target, "~b~Deine Waffen wurden dir von " + player.Name + " (Admin) abgenommen"); ChatService.SendMessage(player, "~b~Dem Spieler " + target.Name + " wurden erfolgreich alle Waffen abgenommen "); } From 3bf0f82abb911d7e6dbf1c7164fa0be5c0aab526 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 29 Apr 2021 18:57:46 +0200 Subject: [PATCH 028/167] TEST: gangwar kill message --- ReallifeGamemode.Client/Gui/infobox.ts | 23 ++++++++++++++++++- .../Commands/UserCommands.cs | 2 +- ReallifeGamemode.Server/Events/Death.cs | 6 +++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/infobox.ts b/ReallifeGamemode.Client/Gui/infobox.ts index cf1ba033..ac006e26 100644 --- a/ReallifeGamemode.Client/Gui/infobox.ts +++ b/ReallifeGamemode.Client/Gui/infobox.ts @@ -56,6 +56,9 @@ export default function (globalData: IGlobalData): void { var playerId; var playerMoney = "5000"; + var gangwarMessage = ""; + var gangwarMessageTimer; + mp.events.add("draw", (pName, pId) => { playerName = pName; playerId = pId; @@ -94,6 +97,15 @@ export default function (globalData: IGlobalData): void { spawnschutz = toggle; }); + mp.events.add("setGangwarKillMessage", (msg) => { + gangwarMessage = msg; + + clearInterval(gangwarMessageTimer); + gangwarMessageTimer = setTimeout(() => { + gangwarMessage = ""; + }, 5000); + }); + mp.events.add("jailTime", (time) => { jailTime = JSON.parse(time); }); @@ -307,9 +319,18 @@ export default function (globalData: IGlobalData): void { centre: false }) mp.game.graphics.drawRect(0.0, 0.555, 0.3, 0.11, 0, 0, 0, 70) - } + mp.game.graphics.drawText(gangwarMessage, [0.08, 0.68], + { + font: 4, + color: [255, 255, 255, 255], + scale: [0.5, 0.5], + outline: true, + centre: false + }) + } } + if (editMode === true) { mp.game.graphics.drawText("~r~EDIT-MODE AKTIV", [0.5, 0], { diff --git a/ReallifeGamemode.Server/Commands/UserCommands.cs b/ReallifeGamemode.Server/Commands/UserCommands.cs index f9718c59..cf5d581b 100644 --- a/ReallifeGamemode.Server/Commands/UserCommands.cs +++ b/ReallifeGamemode.Server/Commands/UserCommands.cs @@ -16,7 +16,7 @@ using ReallifeGamemode.Services; namespace ReallifeGamemode.Server.Commands { internal class UserCommands : Script - { + { [Command("eventport", "~m~eventport")] public void CmdUserEventport(Player player, String option = "") { diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index 21c12c75..0829b426 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -79,6 +79,12 @@ namespace ReallifeGamemode.Server.Events var playerInGangwar = player.HasData("inGangWar"); var killerInGangwar = killer.HasData("inGangWar"); + + if (playerInGangwar && killerInGangwar) + { + killer.TriggerEvent("setGangwarKillMessage", "Du hast ~r~" + player.Name + " getötet"); + } + NAPI.Util.ConsoleOutput($"OnPlayerDeath - Player {player.Name} died - PlayerInGangwar = {playerInGangwar}, KillerInGangwar = {killerInGangwar}"); if (playerInGangwar && killerInGangwar) { From 6537e0551cf619e44a54a49e9a9190c41ad3458b Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 29 Apr 2021 19:24:36 +0200 Subject: [PATCH 029/167] Test: gangwar kill mstg --- ReallifeGamemode.Client/Gui/infobox.ts | 21 --------------------- ReallifeGamemode.Client/util/Gangwar.ts | 10 ++++++++++ ReallifeGamemode.Server/Events/Death.cs | 5 ----- ReallifeGamemode.Server/Gangwar/Gangwar.cs | 5 +++-- ReallifeGamemode.Server/Gangwar/Turf.cs | 9 ++++++--- 5 files changed, 19 insertions(+), 31 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/infobox.ts b/ReallifeGamemode.Client/Gui/infobox.ts index ac006e26..72dc766e 100644 --- a/ReallifeGamemode.Client/Gui/infobox.ts +++ b/ReallifeGamemode.Client/Gui/infobox.ts @@ -56,9 +56,6 @@ export default function (globalData: IGlobalData): void { var playerId; var playerMoney = "5000"; - var gangwarMessage = ""; - var gangwarMessageTimer; - mp.events.add("draw", (pName, pId) => { playerName = pName; playerId = pId; @@ -97,15 +94,6 @@ export default function (globalData: IGlobalData): void { spawnschutz = toggle; }); - mp.events.add("setGangwarKillMessage", (msg) => { - gangwarMessage = msg; - - clearInterval(gangwarMessageTimer); - gangwarMessageTimer = setTimeout(() => { - gangwarMessage = ""; - }, 5000); - }); - mp.events.add("jailTime", (time) => { jailTime = JSON.parse(time); }); @@ -319,15 +307,6 @@ export default function (globalData: IGlobalData): void { centre: false }) mp.game.graphics.drawRect(0.0, 0.555, 0.3, 0.11, 0, 0, 0, 70) - - mp.game.graphics.drawText(gangwarMessage, [0.08, 0.68], - { - font: 4, - color: [255, 255, 255, 255], - scale: [0.5, 0.5], - outline: true, - centre: false - }) } } diff --git a/ReallifeGamemode.Client/util/Gangwar.ts b/ReallifeGamemode.Client/util/Gangwar.ts index f9136552..3fdc949c 100644 --- a/ReallifeGamemode.Client/util/Gangwar.ts +++ b/ReallifeGamemode.Client/util/Gangwar.ts @@ -1,4 +1,6 @@ export default function gangwarHandle(globalData: IGlobalData) { + var gangwarKillCounter = 0; + function inside(point, vs) { let x = point[0], y = point[1]; @@ -625,4 +627,12 @@ //turf.render(); } }); + + mp.events.add("gangWarKillNotification", (deathPlayername) => { + mp.events.call("BN_Show", "GANGWAR: Du hast ~r~" + deathPlayername + " ~w~getötet. Kills: " + ++gangwarKillCounter); + }); + + mp.events.add("resetKillcounter", () => { + gangwarKillCounter = 0; + }); } \ No newline at end of file diff --git a/ReallifeGamemode.Server/Events/Death.cs b/ReallifeGamemode.Server/Events/Death.cs index 0829b426..965733cf 100644 --- a/ReallifeGamemode.Server/Events/Death.cs +++ b/ReallifeGamemode.Server/Events/Death.cs @@ -80,11 +80,6 @@ namespace ReallifeGamemode.Server.Events var playerInGangwar = player.HasData("inGangWar"); var killerInGangwar = killer.HasData("inGangWar"); - if (playerInGangwar && killerInGangwar) - { - killer.TriggerEvent("setGangwarKillMessage", "Du hast ~r~" + player.Name + " getötet"); - } - NAPI.Util.ConsoleOutput($"OnPlayerDeath - Player {player.Name} died - PlayerInGangwar = {playerInGangwar}, KillerInGangwar = {killerInGangwar}"); if (playerInGangwar && killerInGangwar) { diff --git a/ReallifeGamemode.Server/Gangwar/Gangwar.cs b/ReallifeGamemode.Server/Gangwar/Gangwar.cs index 56d7f42d..c2252bef 100644 --- a/ReallifeGamemode.Server/Gangwar/Gangwar.cs +++ b/ReallifeGamemode.Server/Gangwar/Gangwar.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using GTANetworkAPI; using Newtonsoft.Json; @@ -56,7 +56,8 @@ namespace ReallifeGamemode.Server.Gangwar if (killerInsideTurf && victimInsideTurf) { - NAPI.Util.ConsoleOutput($"GangwarKill - Victim {victim.Name} - Killer and Victim are in Turf area"); + NAPI.Util.ConsoleOutput($"GangwarKill - Victim {victim.Name} - Killer and Victim are in Turf area"); + killer.TriggerEvent("gangWarKillNotification", victim.Name); foreach (var turf in getTurfs()) { if (turf.getId() == victim.GetData("inGangWar")) diff --git a/ReallifeGamemode.Server/Gangwar/Turf.cs b/ReallifeGamemode.Server/Gangwar/Turf.cs index 09f85b64..423b3c3a 100644 --- a/ReallifeGamemode.Server/Gangwar/Turf.cs +++ b/ReallifeGamemode.Server/Gangwar/Turf.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -31,6 +31,8 @@ namespace ReallifeGamemode.Server.Gangwar public Player[] playerInGangwar { get; set; } public int timerCount; + private const int GANGWAR_TOTAL_TIME = 900; + public Turf(int TurfID, string TurfName, int color, string Owner, int value, int maxValue, bool surplus) { this.TurfID = TurfID; @@ -142,7 +144,7 @@ namespace ReallifeGamemode.Server.Gangwar continue; } - gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score, 900 - timerCount); + gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score, GANGWAR_TOTAL_TIME - timerCount); } /*if (this.Att_Score >= 200) { @@ -153,7 +155,7 @@ namespace ReallifeGamemode.Server.Gangwar this.takeOver(this.Owner); }*/ timerCount += 1; - if (timerCount >= 900) //change to 900 (seconds) before release for testing reasons change to whatever you like + if (timerCount >= GANGWAR_TOTAL_TIME) { if (this.Att_Score > this.Def_Score) { @@ -312,6 +314,7 @@ namespace ReallifeGamemode.Server.Gangwar c.TriggerEvent("CLIENT:setAttackBlip", false, TurfID); c.ResetData("inGangWar"); c.ResetData("GotInsideOfTurf"); + c.TriggerEvent("resetKillcounter"); } this.playerInGangwar = null; this.status = "conquered"; From 550d2a9ef9f46c5bc41c88e4752d77c52f54732b Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 29 Apr 2021 19:27:18 +0200 Subject: [PATCH 030/167] zu testzwecken gw timer runtergesetzt --- ReallifeGamemode.Server/Gangwar/Turf.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Gangwar/Turf.cs b/ReallifeGamemode.Server/Gangwar/Turf.cs index 423b3c3a..d7406dcf 100644 --- a/ReallifeGamemode.Server/Gangwar/Turf.cs +++ b/ReallifeGamemode.Server/Gangwar/Turf.cs @@ -31,7 +31,7 @@ namespace ReallifeGamemode.Server.Gangwar public Player[] playerInGangwar { get; set; } public int timerCount; - private const int GANGWAR_TOTAL_TIME = 900; + private const int GANGWAR_TOTAL_TIME = 30; public Turf(int TurfID, string TurfName, int color, string Owner, int value, int maxValue, bool surplus) { From 9afb37f20075d2284b64e5ca9a6f2d10928880d3 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 29 Apr 2021 19:37:13 +0200 Subject: [PATCH 031/167] zum testen: gangwar --- ReallifeGamemode.Client/util/Gangwar.ts | 2 +- ReallifeGamemode.Server/Gangwar/Gangwar.cs | 1 + ReallifeGamemode.Server/Gangwar/Turf.cs | 6 ++---- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/ReallifeGamemode.Client/util/Gangwar.ts b/ReallifeGamemode.Client/util/Gangwar.ts index 3fdc949c..a7b94ac8 100644 --- a/ReallifeGamemode.Client/util/Gangwar.ts +++ b/ReallifeGamemode.Client/util/Gangwar.ts @@ -629,7 +629,7 @@ }); mp.events.add("gangWarKillNotification", (deathPlayername) => { - mp.events.call("BN_Show", "GANGWAR: Du hast ~r~" + deathPlayername + " ~w~getötet. Kills: " + ++gangwarKillCounter); + mp.events.call("BN_Show", "~y~GANGWAR~w~: Du hast ~r~" + deathPlayername + " ~w~getötet. Kills: " + ++gangwarKillCounter); }); mp.events.add("resetKillcounter", () => { diff --git a/ReallifeGamemode.Server/Gangwar/Gangwar.cs b/ReallifeGamemode.Server/Gangwar/Gangwar.cs index c2252bef..326a4919 100644 --- a/ReallifeGamemode.Server/Gangwar/Gangwar.cs +++ b/ReallifeGamemode.Server/Gangwar/Gangwar.cs @@ -13,6 +13,7 @@ namespace ReallifeGamemode.Server.Gangwar { public static Turf[] _loadedTurfs; private static List turfs; + public const int GANGWAR_TOTAL_TIME = 90; public static void loadTurfs() { diff --git a/ReallifeGamemode.Server/Gangwar/Turf.cs b/ReallifeGamemode.Server/Gangwar/Turf.cs index d7406dcf..3cd1d52b 100644 --- a/ReallifeGamemode.Server/Gangwar/Turf.cs +++ b/ReallifeGamemode.Server/Gangwar/Turf.cs @@ -31,8 +31,6 @@ namespace ReallifeGamemode.Server.Gangwar public Player[] playerInGangwar { get; set; } public int timerCount; - private const int GANGWAR_TOTAL_TIME = 30; - public Turf(int TurfID, string TurfName, int color, string Owner, int value, int maxValue, bool surplus) { this.TurfID = TurfID; @@ -144,7 +142,7 @@ namespace ReallifeGamemode.Server.Gangwar continue; } - gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score, GANGWAR_TOTAL_TIME - timerCount); + gangwarPlayer.TriggerEvent("GangwarScore", this.Attacker, this.Owner, this.Att_Score, this.Def_Score, Gangwar.GANGWAR_TOTAL_TIME - timerCount); } /*if (this.Att_Score >= 200) { @@ -155,7 +153,7 @@ namespace ReallifeGamemode.Server.Gangwar this.takeOver(this.Owner); }*/ timerCount += 1; - if (timerCount >= GANGWAR_TOTAL_TIME) + if (timerCount >= Gangwar.GANGWAR_TOTAL_TIME) { if (this.Att_Score > this.Def_Score) { From 8ccb9b93c0d912c0350cbe5235af409453238363 Mon Sep 17 00:00:00 2001 From: Fabian Date: Thu, 29 Apr 2021 19:42:06 +0200 Subject: [PATCH 032/167] =?UTF-8?q?gangwartimer=20erh=C3=B6ht,=20das=20din?= =?UTF-8?q?g=20l=C3=A4uft?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReallifeGamemode.Server/Gangwar/Gangwar.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReallifeGamemode.Server/Gangwar/Gangwar.cs b/ReallifeGamemode.Server/Gangwar/Gangwar.cs index 326a4919..8d6ac346 100644 --- a/ReallifeGamemode.Server/Gangwar/Gangwar.cs +++ b/ReallifeGamemode.Server/Gangwar/Gangwar.cs @@ -13,7 +13,7 @@ namespace ReallifeGamemode.Server.Gangwar { public static Turf[] _loadedTurfs; private static List turfs; - public const int GANGWAR_TOTAL_TIME = 90; + public const int GANGWAR_TOTAL_TIME = 900; public static void loadTurfs() { From 8da4cc41cdbdd6e33e03602fc791a631a69ea5b1 Mon Sep 17 00:00:00 2001 From: "michael.reiswich" Date: Thu, 29 Apr 2021 23:59:27 +0200 Subject: [PATCH 033/167] add mal healatms --- ReallifeGamemode.Client/dlcpacks/heal/dlc.rpf | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 ReallifeGamemode.Client/dlcpacks/heal/dlc.rpf diff --git a/ReallifeGamemode.Client/dlcpacks/heal/dlc.rpf b/ReallifeGamemode.Client/dlcpacks/heal/dlc.rpf new file mode 100644 index 00000000..7ba23ab4 --- /dev/null +++ b/ReallifeGamemode.Client/dlcpacks/heal/dlc.rpf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb41e0f12df5bc1a1d0425d0b01f0918a18d27d6e10fec95145cd5d4633a29cd +size 38912 From 2192063008d7e5117707e13e4988ac449b5fd535 Mon Sep 17 00:00:00 2001 From: hydrant Date: Thu, 29 Apr 2021 22:32:08 +0200 Subject: [PATCH 034/167] =?UTF-8?q?DeathLogs=20standardm=C3=A4=C3=9Fig=20a?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReallifeGamemode.Server/Events/Login.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/ReallifeGamemode.Server/Events/Login.cs b/ReallifeGamemode.Server/Events/Login.cs index cef95c6c..6bba950a 100644 --- a/ReallifeGamemode.Server/Events/Login.cs +++ b/ReallifeGamemode.Server/Events/Login.cs @@ -82,6 +82,7 @@ namespace ReallifeGamemode.Server.Events player.SetData("Adminduty", false); player.TriggerEvent("SERVER:SET_HANDMONEY", user.Handmoney, 0); player.TriggerEvent("headshotoff"); + player.SetData("togdeath", true); Gangwar.Gangwar.loadPlayer(player); if (user.FactionLeader) { From 7bebdcd039fd36aebceace0727ae3eb11cf11977 Mon Sep 17 00:00:00 2001 From: "michael.reiswich" Date: Sat, 1 May 2021 17:37:36 +0200 Subject: [PATCH 035/167] add vagos base --- ReallifeGamemode.Client/dlcpacks/vagos/dlc.rpf | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 ReallifeGamemode.Client/dlcpacks/vagos/dlc.rpf diff --git a/ReallifeGamemode.Client/dlcpacks/vagos/dlc.rpf b/ReallifeGamemode.Client/dlcpacks/vagos/dlc.rpf new file mode 100644 index 00000000..d5d31aa5 --- /dev/null +++ b/ReallifeGamemode.Client/dlcpacks/vagos/dlc.rpf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e881ff859b49942bfa942525cb5acac5bd5a123c3febbbec28da3b84acc266b6 +size 98816 From f932e5fe2e099b43e5bfb3a4237eb0e076e4f11e Mon Sep 17 00:00:00 2001 From: hydrant Date: Sun, 2 May 2021 01:19:57 +0200 Subject: [PATCH 036/167] login nachrichten --- ReallifeGamemode.Server/Util/GlobalHelper.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ReallifeGamemode.Server/Util/GlobalHelper.cs b/ReallifeGamemode.Server/Util/GlobalHelper.cs index 8fcd8b3a..3cc9ffca 100644 --- a/ReallifeGamemode.Server/Util/GlobalHelper.cs +++ b/ReallifeGamemode.Server/Util/GlobalHelper.cs @@ -14,6 +14,9 @@ namespace ReallifeGamemode.Server.Util { ".MichaPlays.", "Der echte Ballas Leader ist online (MichaPlays)" }, { "iCroniX", "Life of Malle - Eimer für Alle - Alle für Malle - Böllern! (CroniX)" }, { "balboistderbeste", "Hurra! Hurra! Der Balbo ist jetzt da! (balbo)" }, + { "AirMake", "The fresh breeze of the stone ist back. (AirMake)" }, + { "raviatex", "I'll remember you all in therapy. (aviate)" }, + { "datgame__", "KOPF ENTWICKLUNG!! (hydrant)" } }; public static DateTime CountdownUntil { get; internal set; } From 7ccb58094941db2703d3debbffc8352ff3947cb6 Mon Sep 17 00:00:00 2001 From: Siga Date: Sun, 2 May 2021 02:01:50 +0000 Subject: [PATCH 037/167] Login messages --- ReallifeGamemode.Server/Util/GlobalHelper.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ReallifeGamemode.Server/Util/GlobalHelper.cs b/ReallifeGamemode.Server/Util/GlobalHelper.cs index 3cc9ffca..91c3e025 100644 --- a/ReallifeGamemode.Server/Util/GlobalHelper.cs +++ b/ReallifeGamemode.Server/Util/GlobalHelper.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using GTANetworkAPI; @@ -16,7 +16,8 @@ namespace ReallifeGamemode.Server.Util { "balboistderbeste", "Hurra! Hurra! Der Balbo ist jetzt da! (balbo)" }, { "AirMake", "The fresh breeze of the stone ist back. (AirMake)" }, { "raviatex", "I'll remember you all in therapy. (aviate)" }, - { "datgame__", "KOPF ENTWICKLUNG!! (hydrant)" } + { "datgame__", "KOPF ENTWICKLUNG!! (hydrant)" }, + { "Roachkook", "2head Entwickler ist wieder online (kookroach)" } }; public static DateTime CountdownUntil { get; internal set; } From 81c82f215a7184cb93c7f229a5ebe71575a8767d Mon Sep 17 00:00:00 2001 From: kookroach Date: Sun, 2 May 2021 06:13:53 +0200 Subject: [PATCH 038/167] Disable some Interactions while player is in vehicle or dead. Change Keybind X to Z. --- ReallifeGamemode.Server/Events/Key.cs | 35 ++++++++++++--------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index f15ad483..b5522c9f 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -34,7 +34,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:NUM2")] public void KeyPressNUM2(Player player) { - if (!player.IsLoggedIn()) return; + if (!player.IsLoggedIn() || player.GetData("isDead")) return; if (player.GetData("editmode") == true && player.GetUser().IsAdmin(AdminLevel.HEADADMIN) == true) { var saveMode = player.GetData("quicksavemode"); @@ -91,7 +91,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:RIGHT_ARROW")] public void KeyPressRightArrow(Player player) { - if (!player.IsLoggedIn()) return; + if (!player.IsLoggedIn() || player.GetData("isDead")) return; User user = player.GetUser(); if (!player.IsDuty()) @@ -116,10 +116,10 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:M")] public void KeyPressM(Player player) { + if (!player.IsLoggedIn() || player.GetData("isDead")) return; using var dbContext = new DatabaseContext(); User u = player.GetUser(dbContext); if (u == null) return; - if (player.GetData("isDead")) return; var vehicles = dbContext.UserVehicles.Where(veh => veh.UserId == u.Id).OrderBy(veh => veh.Id).Select(v => new { @@ -135,7 +135,6 @@ namespace ReallifeGamemode.Server.Events Price = f.BuyPrice }); - Paycheck paycheck = null; if (Economy.Paychecks.ContainsKey(u.Id)) paycheck = Economy.Paychecks[u.Id]; @@ -210,7 +209,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:E")] public void KeyPressE(Player player) { - if (!player.IsLoggedIn()) return; + if (!player.IsLoggedIn() || player.GetData("isDead") || player.IsInVehicle) return; var user = player.GetUser(); if (player.HasData("nearATM")) @@ -219,12 +218,9 @@ namespace ReallifeGamemode.Server.Events return; } - if (!player.IsInVehicle) + if (GroundItem.PickUpGroundItem(player)) { - if (GroundItem.PickUpGroundItem(player)) - { - return; - } + return; } DutyPoint nearestDuty = PositionManager.DutyPoints.Find(d => d.Position.DistanceTo(player.Position) <= 1.5 && d.FactionId == user.FactionId); @@ -466,9 +462,7 @@ namespace ReallifeGamemode.Server.Events }); } - player.TriggerEvent("showWeaponMenu", primarys.ToArray(), secondarys.ToArray(), melees.ToArray(), specials.ToArray(), armor.ToArray(), JsonConvert.SerializeObject(timer.ToArray()), JsonConvert.SerializeObject(amountInfos)); - } } if (nearestJailReleasePoint != null) @@ -608,17 +602,18 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:I")] public void KeyPressI(Player player) { - if (!player.IsLoggedIn()) return; + if (!player.IsLoggedIn() || player.GetData("isDead")) return; if (player.GetData("isDead")) return; player.TriggerEvent("inventoryShow"); InventoryManager.SetBackpackItems(player); + } [RemoteEvent("keyPress:J")] public void KeyPressJ(Player player) { - if (!player.IsLoggedIn()) return; + if (!player.IsLoggedIn() || player.GetData("isDead")) return; if (player.GetData("healDecision") == true) { player.ResetData("healDecision"); @@ -626,11 +621,11 @@ namespace ReallifeGamemode.Server.Events return; } - if(player.GetData("SellVehicleDecision") == true && player.HasData("VehicleToSell")) + if (player.GetData("SellVehicleDecision") == true && player.HasData("VehicleToSell")) { InteractionManager.SellServerVehicle(player, player.GetData("VehicleToSell")); player.ResetData("SellVehicleDecision"); - player.ResetData("VehicleToSell"); + player.ResetData("VehicleToSell"); return; } @@ -714,7 +709,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:K")] public void KeyPressK(Player player) { - if (!player.IsLoggedIn()) return; + if (!player.IsLoggedIn() || player.GetData("isDead")) return; var user = player.GetUser(); if (user == null) { @@ -774,14 +769,14 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:L")] public void KeyPressL(Player player) { - if (!player.IsLoggedIn()) return; + if (!player.IsLoggedIn() || player.GetData("isDead")) return; DoorManager.ChangeDoorState(player); } [RemoteEvent("keyPress:N")] public void KeyPressN(Player player) { - if (!player.IsLoggedIn()) return; + if (!player.IsLoggedIn() || player.GetData("isDead")) return; if (player.GetData("healDecision") == true) { @@ -875,7 +870,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:X")] public void KeyPressX(Player player) { - if (!player.IsLoggedIn()) return; + if (!player.IsLoggedIn() || player.GetData("isDead")) return; if (!player.IsInVehicle) { From 6d675018dc5dc30f8380360e2901c037620030ed Mon Sep 17 00:00:00 2001 From: kookroach Date: Sun, 2 May 2021 06:15:50 +0200 Subject: [PATCH 039/167] Disable some interactions while player is in vehicle or dead. Change keybind mapping from X to Z due to interference with game functions. --- ReallifeGamemode.Client/Player/keys.ts | 6 +++--- ReallifeGamemode.Server/Events/Key.cs | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ReallifeGamemode.Client/Player/keys.ts b/ReallifeGamemode.Client/Player/keys.ts index 92ffe3e0..406d79b9 100644 --- a/ReallifeGamemode.Client/Player/keys.ts +++ b/ReallifeGamemode.Client/Player/keys.ts @@ -122,10 +122,10 @@ export default function keys(globalData: IGlobalData) { } }); - //X // Fahrzeug Verwaltung - Menü - mp.keys.bind(0x58, false, function () { + //Z // Fahrzeug Verwaltung - Menü + KeyBinder.bind(0x5A, false, function () { if (!globalData.InChat && !globalData.InMenu && !globalData.InTuning) { - mp.events.callRemote("keyPress:X"); + mp.events.callRemote("keyPress:Z"); } }); diff --git a/ReallifeGamemode.Server/Events/Key.cs b/ReallifeGamemode.Server/Events/Key.cs index b5522c9f..5079b3ee 100644 --- a/ReallifeGamemode.Server/Events/Key.cs +++ b/ReallifeGamemode.Server/Events/Key.cs @@ -116,7 +116,7 @@ namespace ReallifeGamemode.Server.Events [RemoteEvent("keyPress:M")] public void KeyPressM(Player player) { - if (!player.IsLoggedIn() || player.GetData("isDead")) return; + if (!player.IsLoggedIn()) return; using var dbContext = new DatabaseContext(); User u = player.GetUser(dbContext); if (u == null) return; @@ -607,7 +607,6 @@ namespace ReallifeGamemode.Server.Events player.TriggerEvent("inventoryShow"); InventoryManager.SetBackpackItems(player); - } [RemoteEvent("keyPress:J")] @@ -867,7 +866,7 @@ namespace ReallifeGamemode.Server.Events VehicleStreaming.SetEngineState(v, !state); } - [RemoteEvent("keyPress:X")] + [RemoteEvent("keyPress:Z")] public void KeyPressX(Player player) { if (!player.IsLoggedIn() || player.GetData("isDead")) return; From 4bd5e5aa493e74734717417c1d12787c72ca9164 Mon Sep 17 00:00:00 2001 From: kookroach Date: Sun, 2 May 2021 06:19:15 +0200 Subject: [PATCH 040/167] Inventory and onlinelist now pre load on login and open without delay on keybind press. --- ReallifeGamemode.Client/Gui/playerlist.ts | 29 ++-- .../assets/css/onlinelist/style.css | 8 ++ .../assets/html/inventory/inventory.html | 133 ++++++++++-------- .../assets/html/onlinelist/index.html | 79 ++++++----- .../assets/js/onlinelist/script.js | 16 ++- .../inventory/inventory.ts | 83 +++-------- ReallifeGamemode.Server/Events/Login.cs | 3 + .../Managers/InventoryManager.cs | 4 +- 8 files changed, 181 insertions(+), 174 deletions(-) diff --git a/ReallifeGamemode.Client/Gui/playerlist.ts b/ReallifeGamemode.Client/Gui/playerlist.ts index 1d176cba..d714cf2b 100644 --- a/ReallifeGamemode.Client/Gui/playerlist.ts +++ b/ReallifeGamemode.Client/Gui/playerlist.ts @@ -5,30 +5,39 @@ */ export default function playerList(globalData: IGlobalData): void { - var playerlistBrowser: BrowserMp = null; - var pList; + var pList = []; + var loaded = false; var factionPlayersMap: Map = new Map(); const factionIds = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; - mp.events.add("showPlayerlist", (playersJson) => { + mp.events.add("loadPlayerListCEF", () => { if (playerlistBrowser !== null) { playerlistBrowser.destroy(); - playerlistBrowser = null; - globalData.InMenu = false; - mp.gui.cursor.show(false, false); - mp.gui.chat.activate(true); } - else if (!globalData.InMenu) { + playerlistBrowser = mp.browsers.new('package://assets/html/onlinelist/index.html'); + }); + + mp.events.add("showPlayerlist", (playersJson) => { + if (!globalData.InMenu && !loaded) { globalData.InMenu = true; - playerlistBrowser = mp.browsers.new('package://assets/html/onlinelist/index.html'); + loaded = true; mp.gui.chat.activate(false); mp.gui.cursor.show(true, true); pList = JSON.parse(playersJson); + playerlistBrowser.execute(`showPlayerList()`); + } else if (loaded) { + globalData.InMenu = false; + loaded = false; + mp.gui.cursor.show(false, false); + mp.gui.chat.activate(true); + playerlistBrowser.execute(`closePlayerList()`); } }); mp.events.add("CEF:PlayerList_Loaded", () => { + playerlistBrowser.execute(`clear_row()`); + factionIds.forEach(f => { factionPlayersMap.set(f, 0); }); @@ -54,4 +63,4 @@ export default function playerList(globalData: IGlobalData): void { // table = table + tableRow; // }) // return document.write(table); -//} +//} \ No newline at end of file diff --git a/ReallifeGamemode.Client/assets/css/onlinelist/style.css b/ReallifeGamemode.Client/assets/css/onlinelist/style.css index 9daec4a7..f4793000 100644 --- a/ReallifeGamemode.Client/assets/css/onlinelist/style.css +++ b/ReallifeGamemode.Client/assets/css/onlinelist/style.css @@ -8,7 +8,13 @@ html { -ms-user-select: none; user-select: none; } +.show { + display: show !important; +} +.hidden { + display: none !important; +} html, body { margin: unset; } @@ -209,4 +215,6 @@ ol.inline.stats { ol.inline.stats abbr { text-decoration: none; } + + /*# sourceMappingURL=style.css.map */ diff --git a/ReallifeGamemode.Client/assets/html/inventory/inventory.html b/ReallifeGamemode.Client/assets/html/inventory/inventory.html index 5e537caf..23e0cc6f 100644 --- a/ReallifeGamemode.Client/assets/html/inventory/inventory.html +++ b/ReallifeGamemode.Client/assets/html/inventory/inventory.html @@ -10,76 +10,78 @@ -
-
+