Files
reallife-gamemode/ReallifeGamemode.Client/CharCreator/surgery.ts
2021-05-03 19:10:14 +02:00

534 lines
20 KiB
TypeScript

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 creatorCamera: CameraMp;
var activeSurgery: boolean = false;
var saveCharacter: PlayerCharacterData;
var characterData: PlayerCharacterData;
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
var creatorMainMenu: NativeUI.Menu;
var debugString = [0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0];
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
})
});
mp.events.add("toggleSurgery", (jsonCharacterData: string) => {
if (!mp.cameras.exists(creatorCamera)) {
activeSurgery = true;
debugString[0] = 1;
characterData = JSON.parse(jsonCharacterData);
saveCharacter = characterData;
debugString[1] = 2;
loadCharacterData();
debugString[2] = 3;
creatorCamera = mp.cameras.new("creatorCamera", creatorCoords.camera, new mp.Vector3(0, 0, 0), 45);
creatorCamera.pointAtCoord(creatorCoords.cameraLookAt.x, creatorCoords.cameraLookAt.y, creatorCoords.cameraLookAt.z);
creatorCamera.setActive(true);
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] = 4;
applyCreatorOutfit();
getCharacterMainMenu();
}
});
var loadedFeatures;
var loadedAppearance;
var loadedAppearanceOpacity;
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
];
loadedAppearance = [
characterData.Blemishes,
characterData.FacialHair,
characterData.Eyebrows,
characterData.Ageing,
characterData.Makeup,
characterData.Blush,
characterData.Complexion,
characterData.SunDamage,
characterData.Lipstick,
characterData.Freckles,
characterData.ChestHair
];
loadedAppearanceOpacity = [
characterData.BlemishesOpacity,
characterData.FacialHairOpacity,
characterData.EyebrowsOpacity,
characterData.AgeingOpacity,
characterData.MakeupOpacity,
characterData.BlushOpacity,
characterData.ComplexionOpacity,
characterData.SunDamageOpacity,
characterData.LipstickOpacity,
characterData.FrecklesOpacity,
characterData.ChestHairOpacity
];
}
//HAUPTMENÜ
function getCharacterMainMenu(): NativeUI.Menu {
creatorMainMenu = new Menu("Chirurg", "", new Point(0, screenRes.y / 3), null, null);
creatorMainMenu.Visible = false;
debugString[4] = 5;
var genderItem = new UIMenuListItem("Geschlecht", "~r~Dies setzt deine Einstellungen zurück.", new ItemsCollection(["Männlich", "Weiblich"]));
creatorMainMenu.AddItem(genderItem);
genderItem.Index = characterData.Gender == false ? 0 : 1;
debugString[5] = 6;
var parentsItem = new UIMenuItem("Eltern", "Eltern des Charakters.");
creatorMainMenu.AddItem(parentsItem);
creatorMainMenu.BindMenuToItem(getParentsMenu(creatorMainMenu), parentsItem);
debugString[6] = 7;
var featureItem = new UIMenuItem("Gesichtsmerkmale", "Gesichtsmerkmale des Charakters.")
creatorMainMenu.AddItem(featureItem);
creatorMainMenu.BindMenuToItem(getFeaturesMenu(creatorMainMenu), featureItem);
debugString[7] = 8;
var appearanceItem = new UIMenuItem("Aussehen", "Aussehen des Charakters.")
creatorMainMenu.AddItem(appearanceItem);
creatorMainMenu.BindMenuToItem(getAppearanceMenu(creatorMainMenu), appearanceItem);
debugString[8] = 9;
var hairAndColorItem = new UIMenuItem("Haar & Farben", "Haare & Farben deines Charakters.")
creatorMainMenu.AddItem(hairAndColorItem);
creatorMainMenu.BindMenuToItem(getHairAndColorMenu(creatorMainMenu), hairAndColorItem);
debugString[9] = 10;
//Charakterdrehung
var angles = [];
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("Operieren", "Der Chirurg macht die Arbeit, lehn dich zurück");
saveItem.BackColor = new Color(13, 71, 161);
saveItem.HighlightedBackColor = new Color(25, 118, 210);
creatorMainMenu.AddItem(saveItem);
creatorMainMenu.ListChange.on((item, listIndex) => {
if (item === genderItem) {
saveCharacter.Gender = <boolean>listIndex;
mp.events.callRemote("creator_GenderChange", listIndex);
setTimeout(() => {
localPlayer.clearTasksImmediately();
applyCreatorOutfit();
angleItem.Index = 0;
resetParents();
resetFeatures();
resetAppearance();
}, 200);
} else if (item === angleItem) {
localPlayer.setHeading(parseFloat(angleItem.SelectedValue));
localPlayer.clearTasksImmediately();
}
});
creatorMainMenu.MenuClose.on(() => {
leaveCreator();
});
creatorMainMenu.Visible = true;
return creatorMainMenu;
}
var fatherItem: NativeUI.UIMenuListItem;
var motherItem: NativeUI.UIMenuListItem;
var similarityItem: NativeUI.UIMenuListItem;
var skinSimilarityItem: NativeUI.UIMenuListItem;
var creatorParentsMenu: NativeUI.Menu;
//MENÜ FÜR ELTERN
function getParentsMenu(parentMenu: NativeUI.Menu): NativeUI.Menu {
var similarities = [];
for (var i = 0; i <= 100; i++) similarities.push(i + "%");
creatorParentsMenu = new Menu("Eltern", "", new Point(0, screenRes.y / 3), null, null);
creatorParentsMenu.Visible = false;
fatherItem = new UIMenuListItem("Vater", "Dem Charakter sein Vadda.", new ItemsCollection(Data.fatherNames));
creatorParentsMenu.AddItem(fatherItem);
//fatherItem.Index = characterData.Father;
motherItem = new UIMenuListItem("Mutter", "Dem Charakter seine Mudda.", new ItemsCollection(Data.motherNames));
creatorParentsMenu.AddItem(motherItem);
//motherItem.Index = characterData.Mother;
similarityItem = new UIMenuListItem("\u00c4hnlichkeit", "\u00c4hnlichkeit zu den Eltern.\n(niedriger = feminin, h\u00f6her = maskulin)", new ItemsCollection(similarities));
creatorParentsMenu.AddItem(similarityItem);
//similarityItem.Index = characterData.Similarity;
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) => {
if (item == resetItem) {
resetParents();
}
});
creatorParentsMenu.ListChange.on((item, listIndex) => {
updateParents();
});
debugString[10] = 11;
return creatorParentsMenu;
}
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 resetParents(refresh = false) {
fatherItem.Index = 0;//characterData.Father.valueOf();
motherItem.Index = 0;//characterData.Mother.valueOf();
similarityItem.Index = (characterData.Gender == false) ? 100 : 0; //characterData.Similarity.valueOf();//
skinSimilarityItem.Index = (characterData.Gender == false) ? 100 : 0;//characterData.SkinSimilarity.valueOf();
updateParents();
if (refresh) creatorParentsMenu.RefreshIndex();
}
//Menü für Gesichtsmerkmale
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;
debugString[6] = 7;
for (var i = 0; i < Data.featureNames.length; i++) {
var tempFeatureItem = new UIMenuListItem(Data.featureNames[i], "", new ItemsCollection(features));
tempFeatureItem.Index = 100;
featureItems.push(tempFeatureItem);
creatorFeaturesMenu.AddItem(tempFeatureItem);
//tempFeatureItem.Index = loadedFeatures[i];
}
var resetItem = new UIMenuItem("Zurücksetzen", "~r~Setzt Gesichtsmerkmale zurück.");
creatorFeaturesMenu.AddItem(resetItem);
creatorFeaturesMenu.ItemSelect.on((item, index) => {
switch (item) {
case resetItem:
resetFeatures();
break;
}
});
creatorFeaturesMenu.ListChange.on((item, listIndex) => {
updateFaceFeature(featureItems.indexOf(item));
});
debugString[11] = 12;
return creatorFeaturesMenu;
}
function resetFeatures() {
for (let i = 0; i < Data.featureNames.length; i++) {
featureItems[i].Index = 100;
updateFaceFeature(i);
}
}
function updateFaceFeature(index) {
localPlayer.setFaceFeature(index, parseFloat(featureItems[index].SelectedValue));
}
var appearanceItems = [];
var appearanceOpacityItems = [];
//Menü für Aussehen
function getAppearanceMenu(parentMenu: NativeUI.Menu): NativeUI.Menu {
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;
debugString[7] = 8;
for (var i = 0; i < Data.appearanceNames.length; i++) {
var items = [];
for (var j = 0, max = mp.game.ped.getNumHeadOverlayValues(i); j <= max; j++) items.push(Data.appearanceItemNames[i][j] === undefined ? j.toString() : Data.appearanceItemNames[i][j]);
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:
resetAppearance();
break;
}
});
creatorAppearanceMenu.ListChange.on((item, listIndex) => {
var idx = (creatorAppearanceMenu.CurrentSelection % 2 === 0) ? (creatorAppearanceMenu.CurrentSelection / 2) : Math.floor(creatorAppearanceMenu.CurrentSelection / 2);
updateAppearance(idx);
});
debugString[12] = 13;
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 resetAppearance(refresh = false) {
for (var i = 0; i < Data.appearanceNames.length; i++) {
appearanceItems[i].Index = loadedAppearance[i];
appearanceOpacityItems[i].Index = loadedAppearanceOpacity[i];
updateAppearance(i);
}
}
// color arrays
var hairColors = [];
for (var i = 0; i < Data.maxHairColor; i++) hairColors.push(i.toString());
var blushColors = [];
for (var i = 0; i < Data.maxBlushColor; i++) blushColors.push(i.toString());
var lipstickColors = [];
for (var i = 0; i < Data.maxLipstickColor; i++) lipstickColors.push(i.toString());
//Menü für Haar & Farben
function getHairAndColorMenu(parentMenu: NativeUI.Menu): NativeUI.Menu {
var creatorHairMenu = new Menu("Haar & Farben", "", new Point(0, screenRes.y / 3), null, null);
creatorHairMenu.Visible = false;
debugString[8] = 9;
var eyebrowColorItem = new UIMenuListItem("Augenbrauen Farbe", "Farbe deiner Augenbrauen", new ItemsCollection(hairColors));
creatorHairMenu.AddItem(eyebrowColorItem);
var beardColorItem = new UIMenuListItem("Farbe der Gesichtsbehaarung", "Farbe deiner Gesichtsbehaarung", new ItemsCollection(hairColors));
creatorHairMenu.AddItem(beardColorItem);
var eyeColorItem = new UIMenuListItem("Augenfarbe", "Farbe deiner Augen", new ItemsCollection(Data.eyeColors));
creatorHairMenu.AddItem(eyeColorItem);
var blushColorItem = new UIMenuListItem("Rouge", "Farbe des Rouges.", new ItemsCollection(blushColors));
creatorHairMenu.AddItem(blushColorItem);
var lipstickColorItem = new UIMenuListItem("Lippenstift Farbe", "Farbe deines Lippenstifts.", new ItemsCollection(lipstickColors));
creatorHairMenu.AddItem(lipstickColorItem);
var chestHairColorItem = new UIMenuListItem("Farbe der Brustbehaarung", "Farbe deiner Brustbehaarung", new ItemsCollection(hairColors));
creatorHairMenu.AddItem(chestHairColorItem);
var cancelItem = new UIMenuItem("Zurücksetzen", "~r~Zurücksetzen von Haar & Farben");
creatorHairMenu.AddItem(cancelItem);
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;
}
});
creatorHairMenu.ListChange.on((item, listIndex) => {
switch (creatorHairMenu.CurrentSelection) {
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;
}
});
debugString[13] = 14;
return creatorHairMenu;
}
function updateHairAndColors() {
localPlayer.setEyeColor(saveCharacter.EyeColor);
localPlayer.setHeadOverlayColor(1, 1, saveCharacter.BeardColor, 0);
localPlayer.setHeadOverlayColor(2, 1, saveCharacter.EyebrowColor, 0);
localPlayer.setHeadOverlayColor(5, 2, saveCharacter.BlushColor, 0);
localPlayer.setHeadOverlayColor(8, 2, saveCharacter.LipstickColor, 0);
localPlayer.setHeadOverlayColor(10, 1, saveCharacter.ChestHairColor, 0);
}
function colorForOverlayIdx(index) {
var color;
switch (index) {
case 1:
color = saveCharacter.BeardColor;
break;
case 2:
color = saveCharacter.EyebrowColor;
break;
case 5:
color = saveCharacter.BlushColor;
break;
case 8:
color = saveCharacter.LipstickColor;
break;
case 10:
color = saveCharacter.ChestHairColor;
break;
default:
color = 0;
}
return color;
}
function applyCreatorOutfit() {
if (saveCharacter.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);
}
}
function leaveCreator() {
activeSurgery = false;
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;
}
}