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